/**
 * Buddypress Front Posts — bfp.css  v1.0.6
 * Author: Americary LLC
 */

/* ═══════════════════════════════════════════════════════════════════════════
   RESERVATIONS NAV TAB — icon via CSS ::before (FA6 solid sign-hanging f4d9)
   Works across all BP themes — no HTML injection or JS needed.
   BP Nouveau wraps each nav item in <li id="{slug}-personal-li">
   BP Legacy uses <li id="{slug}-tab">
   ═══════════════════════════════════════════════════════════════════════════ */

#reservations-personal-li > a::before,
#reservations-tab > a::before,
li.current-tab[id*="reservations"] > a::before {
    font-family: "Font Awesome 6 Free", "FontAwesome";
    font-weight: 900;
    content: '\f4d9';   /* fa-sign-hanging */
    margin-right: 6px;
    display: inline-block;
    font-style: normal;
    font-variant: normal;
    text-rendering: auto;
    -webkit-font-smoothing: antialiased;
}

/* ═══════════════════════════════════════════════════════════════════════════
   SEARCH BAR — full-width input with inset icon on right
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-search-bar {
    margin-bottom: 40px;
}

.bfp-search-form {
    margin: 0;
    padding: 0;
}

/* Wrapper is position:relative so the icon button can be placed inside */
.bfp-search-wrap {
    position: relative;
    display: block;
}

.bfp-search-input {
    width: 100%;
    padding: 10px 44px 10px 14px; /* right padding reserves space for the icon */
    border: solid 1px #527293 !important;
    border-radius: 6px;
    font-size: 14px;
    color: #0f172a;
    background: #ffffff;
    transition: border-color 0.18s, box-shadow 0.18s;
    box-sizing: border-box;
    font-family: inherit;
}

.bfp-search-input:focus {
    outline: none;
    border-color: #6366f1;
    box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12);
}

.bfp-search-input::placeholder {
    color: #94a3b8;
}

/* Icon-only submit button — floats inside the right edge of the input */
#bfp-search-icon-btn,
.bfp-search-icon-btn {
    position: absolute !important;
    top: 50% !important;
    right: 12px !important;
    transform: translateY( -50% ) !important;
    background: #ffffff !important;
    border: none !important;
    padding: 2px !important;
    margin: 0 !important;
    margin-top: 3px !important;
    cursor: pointer !important;
    color: #94a3b8 !important;
    font-size: 15px !important;
    line-height: 1 !important;
    transition: color 0.15s !important;
    display: flex !important;
    align-items: center !important;
    box-shadow: none !important;
}

#bfp-search-icon-btn:hover {
    color: #6366f1 !important;
    background: #ffffff !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   BUTTONS
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 16px;
    border-radius: 5px;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    border: none;
    text-decoration: none !important;
    transition: background 0.18s, color 0.18s, box-shadow 0.18s;
    line-height: 1.4;
    white-space: nowrap;
}

.bfp-btn-primary {
    background: #6366f1;
    color: inherit;
}
.bfp-btn-primary:hover,
.bfp-btn-primary:focus {
    background: #4f46e5;
    color: inherit;
}
.bfp-btn-primary:disabled {
    opacity: 0.65;
    cursor: not-allowed;
}

.bfp-btn-reset {
    background: transparent;
    color: #64748b !important;
    border: 1px solid #cbd5e1;
    padding: 8px 10px;
    flex-shrink: 0;
}
.bfp-btn-reset:hover {
    background: #f1f5f9;
    color: #1e293b !important;
    border-color: #94a3b8;
}


/* ═══════════════════════════════════════════════════════════════════════════
   POST CARDS LIST  — no border box, no padding box
   Items separated by a thin bottom line + vertical gap only.
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-posts-list {
    display: flex;
    flex-direction: column;
    margin-bottom: -40px;
}

.bfp-post-card {
    display: flex;
    gap: 18px;
    padding: 0;
    background: #fff;
    border: none;
    border-radius: 0;
    box-shadow: none;
    align-items: flex-start;
    margin-bottom: 10px;
}

/* Separator between cards — clean flush list, no border line */
.bfp-post-card + .bfp-post-card {
    padding-top: 18px;
    margin-top: 4px;
}

.bfp-post-card:last-child {
    margin-bottom: 0;
}

.bfp-post-thumb {
    flex-shrink: 0;
    display: block;
    width: 130px;
    height: 95px;
    border-radius: 8px;
    overflow: hidden;
    background: #f3f3f3;
}

.bfp-post-thumb img {
    width: 130px;
    height: 95px;
    object-fit: cover;
    display: block;
    border-radius: 8px;
    transition: transform 0.25s;
}

.bfp-post-thumb:hover img {
    transform: scale(1.04);
}

.bfp-post-body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin-top: -20px;
}

.bfp-post-title {
    margin: 15px 0 0 0 !important;
    font-size: 17px;
    font-weight: 700;
    line-height: 1.35;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    color: #a40000 !important;
}

.bfp-post-title a {
    color: #a40000 !important;
    text-decoration: none;
    transition: color .2s;
}

.bfp-post-title a:hover {
    color: #d5a04e !important;
}

.bfp-status-badge {
    display: inline-block;
    padding: 2px 8px;
    border-radius: 20px;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.03em;
    vertical-align: middle;
}

.bfp-badge-pending {
    background: #fef3c7;
    color: #92400e;
    border: 1px solid #fde68a;
}

.bfp-post-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    align-items: center;
    font-size: 15px;
    color: #999;
    margin: 0;
}

.bfp-post-meta span {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}

.bfp-post-meta i {
    font-size: 13px;
    opacity: 0.8;
}

.bfp-meta-cats {
    display: none !important;
}

.bfp-post-excerpt {
    margin: -1px 0 0 0;
    font-size: 16px;
    color: #666;
    line-height: 1.6;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.bfp-post-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: -10px;
    align-items: center;
}

.bfp-action-btn {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px;
    border-radius: 4px;
    font-size: 17px;
    font-weight: 500;
    cursor: pointer;
    border: none;
    text-decoration: none !important;
    background: transparent !important;
    box-shadow: none !important;
    transition: background 0.15s, color 0.15s;
    line-height: 1.5;
    vertical-align: middle;
    /* Reset any theme button styles that may target <button> elements */
    -webkit-appearance: none;
    appearance: none;
    font-family: inherit;
    letter-spacing: inherit;
    text-transform: none;
    margin: 0;
    outline: none;
}

.bfp-action-btn i {
    display: none !important;
}

.bfp-action-btn:disabled {
    opacity: 0.55;
    cursor: not-allowed;
}

.bfp-btn-view   { color: #059669; }
.bfp-btn-edit   { color: #2563eb; }

/* Target button element directly — themes override generic .class selectors on <button> */
button.bfp-btn-delete,
.bfp-btn-delete {
    color: #3a67ad !important;
    background: transparent !important;
    background-color: transparent !important;
    border: none !important;
    box-shadow: none !important;
    margin: 0 !important;
    padding: 4px 10px !important;
    line-height: 1.5 !important;
    font-size: 17px !important;
    font-weight: 500 !important;
    vertical-align: middle !important;
    display: inline-flex !important;
    align-items: center !important;
}

.bfp-btn-view:hover   { background: transparent !important; color: #508ed0 !important; }
.bfp-btn-edit:hover   { background: transparent !important; color: #508ed0 !important; }
button.bfp-btn-delete:hover,
.bfp-btn-delete:hover { background: transparent !important; color: #508ed0 !important; }


/* ═══════════════════════════════════════════════════════════════════════════
   SECTION TITLE
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-section-title {
    font-size: 17px;
    font-weight: 700;
    color: #0f172a;
    margin: 0 0 18px;
    padding-bottom: 12px;
    border-bottom: 2px solid #e2e8f0;
}

/* Edit Post title — no bottom border needed */
.bfp-new-post-wrap .bfp-section-title {
    border-bottom: none;
    padding-bottom: 0;
}


/* ═══════════════════════════════════════════════════════════════════════════
   PENDING NOTICE
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-pending-notice {
    background: #fffbeb;
    border: 1px solid #fcd34d;
    color: #78350f;
    border-radius: 6px;
    padding: 10px 14px;
    font-size: 13px;
    margin-bottom: 20px;
    display: flex;
    align-items: center;
    gap: 8px;
}

.bfp-pending-notice::before {
    content: "\f071";
    font-family: "Font Awesome 6 Free";
    font-weight: 900;
    font-size: 13px;
    flex-shrink: 0;
}


/* ═══════════════════════════════════════════════════════════════════════════
   NEW POST FORM
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-new-post-wrap {
    max-width: 780px;
}

.bfp-form-group {
    margin-bottom: 18px;
}

.bfp-form-group > label {
    display: block;
    font-size: 15px;
    font-weight: 900;
    color: #374151;
    margin-bottom: 6px;
}

.bfp-required {
    color: #6795bd;
    margin-left: 4px;
    font-weight: 400;
}

.bfp-input,
.bfp-textarea,
.bfp-new-post-wrap .bfp-select {
    width: 100%;
    padding: 9px 13px;
    border: solid 1px #527293 !important;
    border-radius: 6px;
    font-size: 14px;
    color: #0f172a;
    background: #ffffff;
    transition: border-color 0.18s, box-shadow 0.18s;
    box-sizing: border-box;
    font-family: inherit;
}

/* Verdana on all dropdowns — select box + options + wp_dropdown_categories output */
.bfp-new-post-wrap .bfp-select,
.bfp-new-post-wrap .bfp-select option,
.bfp-new-post-wrap select#bfp-post-category,
.bfp-new-post-wrap select#bfp-post-category option,
.bfp-new-post-wrap select#bfp-post-location,
.bfp-new-post-wrap select#bfp-post-location option,
.bfp-new-post-wrap select#bfp-post-ctype,
.bfp-new-post-wrap select#bfp-post-ctype option {
    font-family: Verdana, Geneva, Tahoma, sans-serif !important;
}

.bfp-new-post-wrap .bfp-select.bfp-field-error,
.bfp-new-post-wrap select.bfp-field-error,
.bfp-input.bfp-field-error,
.bfp-textarea.bfp-field-error {
    border-color: #ef4444;
    box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.12);
}

.bfp-input:focus,
.bfp-textarea:focus,
.bfp-new-post-wrap .bfp-select:focus {
    outline: none;
    border-color: #6366f1;
    box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12);
}

.bfp-textarea {
    resize: vertical;
    min-height: 220px;
    line-height: 1.65;
}


/* ═══════════════════════════════════════════════════════════════════════════
   CHECKBOX MULTI-SELECT DROPDOWN
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-cb-dropdown {
    position: relative;
    width: 100%;
    flex: 1;
    border: solid 1px #527293;
    border-radius: 6px !important;
}

div#bfp-post-category-wrap.bfp-cb-dropdown,
div#bfp-post-location-wrap.bfp-cb-dropdown,
div#bfp-post-ctype-wrap.bfp-cb-dropdown {
    border: solid 1px #527293 !important;
    border-radius: 7px;
}

.bfp-cb-dropdown.bfp-field-error .bfp-cb-trigger {
    border-color: #ef4444 !important;
    box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.12) !important;
}

/* High-specificity selector beats GeneratePress button resets */
.bfp-new-post-wrap .bfp-cb-trigger,
.bfp-new-post-wrap .bfp-cb-trigger:link,
.bfp-new-post-wrap .bfp-cb-trigger:visited {
    width: 100% !important;
    display: flex !important;
    align-items: center !important;
    justify-content: space-between !important;
    padding: 9px 13px !important;
    border: solid 1px #527293 !important;
    border-radius: 6px !important;
    background: #ffffff !important;
    background-color: #ffffff !important;
    font-size: 13px !important;
    color: #0f172a !important;
    cursor: pointer !important;
    text-align: left !important;
    box-sizing: border-box !important;
    font-family: Verdana, Geneva, Tahoma, sans-serif !important;
    line-height: 1.4 !important;
    text-decoration: none !important;
    box-shadow: none !important;
    margin: 0 !important;
    outline: none !important;
}

/* Hover — subtle indigo border, keep white bg */
.bfp-new-post-wrap .bfp-cb-trigger:hover {
    background: #ffffff !important;
    background-color: #ffffff !important;
    border-color: #6366f1 !important;
    box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12) !important;
    color: #0f172a !important;
    outline: none !important;
}

/* Focus — same indigo ring, explicitly kill any green from theme */
.bfp-new-post-wrap .bfp-cb-trigger:focus,
.bfp-new-post-wrap .bfp-cb-trigger:focus-visible,
.bfp-new-post-wrap .bfp-cb-trigger:focus-within {
    background: #ffffff !important;
    background-color: #ffffff !important;
    border-color: #6366f1 !important;
    box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12) !important;
    color: #0f172a !important;
    outline: none !important;
    outline-offset: 0 !important;
}

/* Active — kill the theme green completely */
.bfp-new-post-wrap .bfp-cb-trigger:active {
    background: #ffffff !important;
    background-color: #ffffff !important;
    border-color: #527293 !important;
    box-shadow: none !important;
    color: #0f172a !important;
    outline: none !important;
}

.bfp-cb-label {
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-family: Verdana, Geneva, Tahoma, sans-serif !important;
    font-size: 13px !important;
    color: #64748b !important;
    text-decoration: none !important;
    pointer-events: none;
}

.bfp-cb-caret {
    font-size: 10px !important;
    color: #94a3b8 !important;
    margin-left: 8px;
    flex-shrink: 0;
    transition: transform 0.18s;
    pointer-events: none;
}

.bfp-cb-caret.bfp-caret-open {
    transform: rotate(180deg);
}

.bfp-cb-panel {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    right: 0;
    background: #ffffff;
    border: 1px solid #cbd5e1;
    border-radius: 6px;
    box-shadow: 0 4px 16px rgba(0,0,0,0.10);
    z-index: 9999;
    max-height: 220px;
    overflow-y: auto;
    padding: 6px 0;
}

.bfp-cb-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 7px 14px;
    font-size: 13px;
    color: #1e293b !important;
    cursor: pointer;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
    transition: background 0.12s;
    line-height: 1.4;
    text-decoration: none !important;
    background: transparent !important;
}

.bfp-cb-item:hover {
    background: #f1f5f9 !important;
}

.bfp-cb-check {
    width: 15px;
    height: 15px;
    flex-shrink: 0;
    cursor: pointer;
    accent-color: #dce7f9;
}

/* Tighten gap between label and field inside taxonomy columns */
.bfp-form-col .bfp-form-group > label {
    margin-bottom: 4px;
}

.bfp-form-col .bfp-form-group {
    margin-bottom: 14px;
}


/* ═══════════════════════════════════════════════════════════════════════════
   QUILL RICH TEXT EDITOR — scoped so theme styles don't bleed in
   ═══════════════════════════════════════════════════════════════════════════ */

/* Container sizing and border to match other inputs */
.bfp-quill-editor {
    border: 1px solid #cbd5e1;
    border-radius: 6px;
    overflow: hidden;
    background: #ffffff;
    transition: border-color 0.18s, box-shadow 0.18s;
}

/* The .ql-editor div is the actual typing area — resizable directly */
.bfp-quill-editor .ql-container {
    border-bottom-left-radius: 6px;
    border-bottom-right-radius: 6px;
    overflow: hidden;
}

.bfp-quill-editor.bfp-field-error {
    border-color: #ef4444 !important;
    box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.12) !important;
}

/* Override Quill's own border — we wrap it ourselves */
.bfp-quill-editor .ql-toolbar.ql-snow {
    border: none !important;
    border-bottom: 1px solid #e2e8f0 !important;
    padding: 8px 12px !important;
    background: #f8fafc !important;
    border-radius: 0 !important;
}

.ql-toolbar.ql-snow {
    border: 1px solid #ccc;
    box-sizing: border-box;
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
    padding: 8px;
    background: #eceff359;
    background-clip: border-box;
}

.bfp-quill-editor .ql-container.ql-snow {
    border: none !important;
    min-height: 240px;
    font-family: inherit !important;
    font-size: 16px !important;
}

.bfp-quill-editor .ql-editor {
    min-height: 240px;
    padding: 12px 14px !important;
    line-height: 1.7 !important;
    color: #0f172a !important;
    font-size: 16px !important;
    resize: vertical !important;
    overflow-y: auto !important;
}

.bfp-quill-editor .ql-editor.ql-blank::before {
    color: #94a3b8 !important;
    font-style: normal !important;
    left: 14px !important;
}

/* Toolbar button colours */
.bfp-quill-editor .ql-toolbar button:hover .ql-stroke,
.bfp-quill-editor .ql-toolbar button.ql-active .ql-stroke {
    stroke: #6366f1 !important;
}

.bfp-quill-editor .ql-toolbar button:hover .ql-fill,
.bfp-quill-editor .ql-toolbar button.ql-active .ql-fill {
    fill: #6366f1 !important;
}

.bfp-quill-editor .ql-toolbar .ql-picker-label:hover,
.bfp-quill-editor .ql-toolbar .ql-picker-item:hover {
    color: #6366f1 !important;
}

/* Focus ring on the editor area */
.bfp-quill-editor:focus-within {
    border-color: #6366f1;
    box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12);
}

/* ── Quill toolbar custom overrides ── */

.ql-snow .ql-picker.ql-header {
    width: 150px;
    margin-top: 20px;
    margin-right: 15px;
}

.ql-snow .ql-picker {
    color: #444;
    display: inline-block;
    float: left;
    font-size: 14px;
    font-weight: 500;
    height: 24px;
    position: relative;
    vertical-align: middle;
    border: solid 1px #ccc;
    border-radius: 7px;
    background: #fff;
}

.ql-toolbar.ql-snow .ql-formats {
    margin-right: 0px;
    margin-top: -18px;
}

.ql-snow .ql-stroke {
    fill: none;
    stroke: #444;
    stroke-linecap: round;
    stroke-linejoin: round;
    stroke-width: 3;
}

span.ql-formats button.ql-bold {
    padding: 2px !important;
    background: #fff0;
}

/* Hide clean button */
span.ql-formats button.ql-clean {
    display: none !important;
}

/* ── Image align toolbar (float left / center / float right) ── */
.bfp-img-toolbar {
    position: absolute;
    display: flex;
    gap: 2px;
    background: #ffffff;
    border: 1px solid #d1dbe5;
    border-radius: 5px;
    padding: 3px 5px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.12);
    z-index: 999;
    pointer-events: all;
}

.bfp-img-toolbar button {
    background: none;
    border: 1px solid transparent;
    border-radius: 3px;
    cursor: pointer;
    padding: 4px 7px;
    font-size: 15px;
    color: #334155;
    line-height: 1;
    transition: background 0.12s, border-color 0.12s;
}

.bfp-img-toolbar button:hover,
.bfp-img-toolbar button.active {
    background: #f1f5f9;
    border-color: #94a3b8;
    color: #0f172a;
}

/* ── Image resize handles ── */
.bfp-img-wrap {
    position: relative;
    display: inline-block;
    max-width: 100%;
}

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

.bfp-resize-handle {
    position: absolute;
    width: 10px;
    height: 10px;
    background: #ffffff;
    border: 2px solid #6366f1;
    border-radius: 2px;
    z-index: 1000;
}

.bfp-resize-handle.nw { top: -5px;  left: -5px;  cursor: nw-resize; }
.bfp-resize-handle.ne { top: -5px;  right: -5px; cursor: ne-resize; }
.bfp-resize-handle.sw { bottom: -5px; left: -5px;  cursor: sw-resize; }
.bfp-resize-handle.se { bottom: -5px; right: -5px; cursor: se-resize; }

/* Images in Quill editor — make them block-selectable */
.bfp-quill-editor .ql-editor img {
    cursor: pointer;
    max-width: 100%;
}

.bfp-quill-editor .ql-editor img.bfp-img-selected {
    outline: 2px solid #6366f1;
    outline-offset: 2px;
}

/* Alignment helpers applied to images */
.bfp-quill-editor .ql-editor img.bfp-align-left  { float: left;  margin: 0 14px 8px 0; }
.bfp-quill-editor .ql-editor img.bfp-align-center { display: block; margin: 0 auto 8px; float: none; }
.bfp-quill-editor .ql-editor img.bfp-align-right { float: right; margin: 0 0 8px 14px; }



.bfp-form-row {
    display: flex;
    gap: 16px;
    flex-wrap: wrap;
}

.bfp-form-col {
    flex: 1;
    min-width: 155px;
}

/* ═══════════════════════════════════════════════════════════════════════════
   PAYMENT TYPE + RESERVATION PERIOD ROW (since 2.0)
   ═══════════════════════════════════════════════════════════════════════════

   One horizontal flex row carrying two side-by-side dropdowns, slotted
   between the Amount block and the Location block on the new-post /
   edit-post form.

   The two .bfp-payment-period-col children flex evenly so the row stays
   balanced regardless of which option label is longest. On narrow
   viewports the flex-wrap drops the second column under the first —
   same break behaviour the .bfp-form-row taxonomy filters use, so the
   form has a consistent responsive rhythm.

   The selects themselves inherit .bfp-select styling from the global
   input/select rule block higher in this file (border, focus ring,
   font, padding) — the only thing we set here is the layout shell.
   ─────────────────────────────────────────────────────────────────────────── */
.bfp-payment-period-row {
    display: flex;
    gap: 16px;
    flex-wrap: wrap;
    align-items: stretch;
}

.bfp-payment-period-col {
    flex: 1 1 0;
    min-width: 155px;
}

.bfp-payment-period-col .bfp-select {
    width: 100%;
}


/* ═══════════════════════════════════════════════════════════════════════════
   FEATURED IMAGE PICKER
   ═══════════════════════════════════════════════════════════════════════════ */

/* ═══════════════════════════════════════════════════════════════════════════
   FEATURED IMAGE PICKER
   ═══════════════════════════════════════════════════════════════════════════ */

/* AVIF notice block */
.bfp-feat-notice {
    margin-bottom: 14px;
    padding: 14px 16px;
    background: #f8fafc;
    border: 1px solid #e2e8f0;
    border-radius: 7px;
}

.bfp-feat-notice-title {
    font-size: 15px;
    font-weight: 700;
    color: #0f172a;
    margin: 0 0 8px;
}

.bfp-feat-notice-body {
    font-size: 13px;
    color: #475569;
    line-height: 1.6;
    margin: 0 0 6px;
}

.bfp-feat-notice-body:last-child {
    margin-bottom: 0;
}

.bfp-feat-notice-body a {
    color: #6366f1;
    text-decoration: underline;
}

.bfp-feat-notice-body a:hover {
    color: #4f46e5;
}

.bfp-feat-preview {
    position: relative;
    margin-bottom: 10px;
    border-radius: 8px;
    overflow: visible;
    width: 160px;
    height: 110px;
    background: #f1f5f9;
    border: 1px solid #e2e8f0;
}

.bfp-feat-preview img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    border-radius: 8px;
    overflow: hidden;
}

/* Orange X circle — top-right corner of preview image */
.bfp-feat-remove-circle {
    position: absolute !important;
    top: -10px !important;
    right: -10px !important;
    width: 24px !important;
    height: 24px !important;
    border-radius: 50% !important;
    background: #f97316 !important;
    background-color: #f97316 !important;
    border: 2px solid #ffffff !important;
    color: #ffffff !important;
    cursor: pointer !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    font-size: 11px !important;
    line-height: 1 !important;
    padding: 0 !important;
    margin: 0 !important;
    box-shadow: 0 1px 4px rgba(0,0,0,0.18) !important;
    transition: background 0.15s !important;
    z-index: 10;
}

.bfp-feat-remove-circle:hover {
    background: #ea580c !important;
    background-color: #ea580c !important;
}

.bfp-feat-controls {
    display: flex;
    align-items: center;
    gap: 8px;
}

.bfp-btn-media {
    background: #f1f5f9;
    color: #334155 !important;
    border: 1.5px dashed #94a3b8;
}
.bfp-btn-media:hover {
    background: #e2e8f0;
    border-color: #64748b;
    color: #0f172a !important;
}

.bfp-btn-remove-img {
    background: transparent;
    color: #ef4444 !important;
    border: 1px solid #fca5a5;
}
.bfp-btn-remove-img:hover {
    background: #fef2f2;
    border-color: #ef4444;
}

/* Custom file input — visually hidden, triggered by button */
.bfp-file-input-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
    overflow: hidden;
}

/* Upload progress bar */
.bfp-upload-progress {
    margin-top: 8px;
    height: 4px;
    background: #e2e8f0;
    border-radius: 4px;
    overflow: hidden;
    display: none;
}

.bfp-upload-progress-bar {
    height: 100%;
    background: #6366f1;
    width: 0%;
    transition: width 0.3s ease;
    border-radius: 4px;
}


/* ═══════════════════════════════════════════════════════════════════════════
   FORM ACTIONS + MESSAGES
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-form-actions {
    display: flex;
    align-items: center;
    gap: 14px;
    margin-top: 6px;
}

.bfp-form-message {
    padding: 12px 16px;
    border-radius: 6px;
    margin-bottom: 20px;
    font-size: 14px;
    font-weight: 500;
    display: none;
}

.bfp-form-message.bfp-success {
    background: #f0fdf4;
    color: #14532d;
    border: 1px solid #86efac;
}

.bfp-form-message.bfp-error {
    background: #fef2f2;
    color: #7f1d1d;
    border: 1px solid #fca5a5;
}

/* Cancel button */
.bfp-btn-cancel {
    background: transparent;
    color: #64748b !important;
    border: 1px solid #cbd5e1;
}
.bfp-btn-cancel:hover {
    background: #f1f5f9;
    color: #1e293b !important;
    border-color: #94a3b8;
}


/* ═══════════════════════════════════════════════════════════════════════════
   CONFIRMATION MODALS — Delete post + Cancel draft
   White-transparent overlay, white box, light border, soft shadow.
   All buttons use one unified style — no color coding.
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(255, 255, 255, 0.55);
    backdrop-filter: blur(2px);
    -webkit-backdrop-filter: blur(2px);
    z-index: 99999;
    display: flex;
    align-items: center;
    justify-content: center;
}

.bfp-modal-box {
    background: #ffffff;
    border: 1px solid #d1dbe5;
    border-radius: 10px;
    padding: 30px 28px 26px;
    max-width: 340px;
    width: 90%;
    box-shadow: 0 4px 24px rgba(60, 80, 110, 0.13), 0 1px 4px rgba(60, 80, 110, 0.07);
    text-align: center;
}

.bfp-modal-msg {
    font-size: 15px;
    font-weight: 600;
    color: #1e293b;
    margin: 0 0 22px;
    line-height: 1.5;
}

.bfp-modal-actions {
    display: flex;
    gap: 10px;
    justify-content: center;
}

/* ── Unified modal button — same style for every action ── */
.bfp-btn-danger,
.bfp-btn-ghost {
    background: #ffffff;
    color: #334155 !important;
    border: 1px solid #c4cdd8;
    font-size: 13px;
    font-weight: 600;
    padding: 7px 18px;
    border-radius: 5px;
    cursor: pointer;
    transition: background 0.15s, border-color 0.15s, color 0.15s;
    text-decoration: none !important;
    display: inline-flex;
    align-items: center;
    gap: 5px;
    line-height: 1.4;
}

.bfp-btn-danger:hover,
.bfp-btn-ghost:hover {
    background: #f1f5f9;
    border-color: #94a3b8;
    color: #0f172a !important;
}


/* ═══════════════════════════════════════════════════════════════════════════
   EMPTY STATE
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-no-posts {
    text-align: center;
    padding: 48px 24px;
    color: #94a3b8;
    font-size: 14px;
    background: #f8fafc;
    border: 1.5px dashed #e2e8f0;
    border-radius: 10px;
    margin: 0;
}


/* ═══════════════════════════════════════════════════════════════════════════
   SPINNER
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-spinner {
    display: inline-block;
    width: 18px;
    height: 18px;
    border: 2px solid #e2e8f0;
    border-top-color: #6366f1;
    border-radius: 50%;
    animation: bfp-spin 0.65s linear infinite;
    vertical-align: middle;
}

@keyframes bfp-spin {
    to { transform: rotate(360deg); }
}


/* ═══════════════════════════════════════════════════════════════════════════
   PAGINATION
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-pagination {
    margin-top: 28px;
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
    gap: 4px;
}

.bfp-pagination .page-numbers {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 34px;
    height: 34px;
    padding: 0 10px;
    border: 1px solid #e2e8f0;
    border-radius: 5px;
    color: #374151;
    text-decoration: none;
    font-size: 13px;
    font-weight: 500;
    transition: all 0.15s;
}

.bfp-pagination .page-numbers.current,
.bfp-pagination .page-numbers:hover {
    background: #6366f1;
    color: #ffffff;
    border-color: #6366f1;
}


/* ═══════════════════════════════════════════════════════════════════════════
   RESPONSIVE
   ═══════════════════════════════════════════════════════════════════════════ */

@media ( max-width: 640px ) {

    .bfp-post-card {
        flex-direction: column;
    }

    .bfp-post-thumb,
    .bfp-post-thumb img {
        width: 100%;
        height: 180px;
        border-radius: 8px;
    }

    .bfp-form-row {
        flex-direction: column;
        gap: 0;
    }

    .bfp-form-col {
        min-width: 100%;
    }

    /* Halve the gap between stacked taxonomy dropdowns in column layout */
    .bfp-form-row .bfp-form-group {
        margin-bottom: 9px;
    }
}


/* Hide the edit-post subnav item — it's a routing-only tab, not a nav link */
#bfp-edit-post-tab,
li#bfp-edit-post-tab {
    display: none !important;
}

/* Back link on edit form */
.bfp-edit-back {
    margin: 0 0 18px;
    font-size: 13px;
}

.bfp-edit-back a {
    color: #6366f1;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    gap: 5px;
}

.bfp-edit-back a:hover {
    text-decoration: underline;
}


/* ═══════════════════════════════════════════════════════════════════════════
   YOUR PLAN BADGE — injected as <li class="bfp-plan-badge"> after New Post
   ═══════════════════════════════════════════════════════════════════════════ */

li.bfp-plan-badge {
    pointer-events: none;
    cursor: default;
    list-style: none;
    display: inline-flex !important;
    align-items: center;
}

li.bfp-plan-badge .bfp-plan-label {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    padding: 3px 10px;
    border-radius: 20px;
    background: #f1f5f9;
    color: #475569;
    border: 1px solid #e2e8f0;
    white-space: nowrap;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Reservation Filter — post editor (front-end form)
───────────────────────────────────────────────────────────────────────────── */

.bfp-reservation-filter {
    margin-bottom: 20px;
}

.bfp-reservation-filter-label {
    display: block;
    font-size: 13px;
    font-weight: 600;
    color: #0f172a;
    margin-bottom: 10px;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
}

.bfp-reservation-filter-row {
    display: flex;
    flex-direction: row;
    align-items: center;
    gap: 12px;
    flex-wrap: nowrap;
}

.bfp-res-radio-label {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 13px;
    color: #334155;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
    cursor: pointer;
    white-space: nowrap;
}

.bfp-res-radio-label input[type="radio"] {
    margin: 0;
    accent-color: #527293;
    width: 15px;
    height: 15px;
    cursor: pointer;
    flex-shrink: 0;
}

.bfp-res-or {
    font-size: 12px;
    color: #94a3b8;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
}

.bfp-res-qty-input {
    width: 140px;
    padding: 7px 10px;
    border: solid 1px #527293 !important;
    border-radius: 6px;
    font-size: 13px;
    color: #0f172a;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
    background: #ffffff;
    box-sizing: border-box;
    -moz-appearance: textfield;
}

.bfp-res-qty-input::-webkit-outer-spin-button,
.bfp-res-qty-input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.bfp-res-qty-input:focus {
    outline: none;
    border-color: #2563eb;
    box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.15);
}

/* ─────────────────────────────────────────────────────────────────────────────
   Reservation Widget — single post front-end display
───────────────────────────────────────────────────────────────────────────── */

.bfp-reservation-widget {
    width: 100%;
    max-width: 100%;
    box-sizing: border-box;
    overflow: hidden;
    background-color: #f1f5f9;
    border-radius: 8px;
    padding: 14px 18px;
    margin-top: 24px;
}

/* Row: label + select + button — single horizontal line */
.bfp-res-widget-row {
    display: flex;
    flex-direction: row;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;       /* wraps gracefully on very narrow containers */
    width: 100%;
    box-sizing: border-box;
}

.bfp-res-widget-label {
    font-size: 14px;
    font-weight: 600;
    color: #334155;
    white-space: nowrap;
    flex-shrink: 0;
}

.bfp-res-widget-select {
    padding: 7px 10px;
    border: 1px solid #cbd5e1;
    border-radius: 6px;
    font-size: 13px;
    color: #0f172a;
    background: #ffffff;
    cursor: pointer;
    width: 80px;
    flex-shrink: 0;
    box-sizing: border-box;
}

.bfp-res-widget-select:focus {
    outline: none;
    border-color: #527293;
    box-shadow: 0 0 0 2px rgba(82, 114, 147, 0.15);
}

/* Reserve Now button */
.bfp-res-reserve-btn {
    padding: 8px 18px;
    background-color: #527293;
    color: #ffffff;
    border: none;
    border-radius: 25px;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    transition: background-color 0.18s ease;
    white-space: nowrap;
    flex-shrink: 0;
}

.bfp-res-reserve-btn:hover {
    background-color: #3d5a77;
    color: #fff;
}

.bfp-res-reserve-btn:disabled {
    background-color: #94a3b8;
    cursor: not-allowed;
}

/* Live availability counter */
.bfp-res-counter {
    font-size: 15px;
    font-weight: 700;
    color: #5e904c;
    white-space: nowrap;
    flex-shrink: 0;
    margin-left: 4px;
}

/* Disclaimer note */
.bfp-res-widget-note {
    margin: 10px 0 0 0;
    font-size: 12px;
    color: #64748b;
    font-style: italic;
    line-height: 1.5;
}

/* Cancelled state — note text */
.bfp-res-cancelled-note {
    color: #1f3452;
    font-size: 13px;
}

/* Cancelled state — muted label */
.bfp-res-label-muted {
    color: #94a3b8;
}

/* Already-reserved state */
.bfp-res-already-text {
    font-size: 14px;
    color: #334155;
    line-height: 1.6;
    margin: 0 0 14px 0;
}

.bfp-res-cancel-btn {
    padding: 8px 18px;
    background-color: #cf8181;
    color: #ffffff;
    border: none;
    border-radius: 25px;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    transition: background-color 0.18s ease;
    white-space: nowrap;
}

.bfp-res-cancel-btn:hover {
    background-color: #bb6e6e;
    color: #fff;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Reservation Popup Modals
───────────────────────────────────────────────────────────────────────────── */

/* Semi-transparent white overlay covering full viewport */
.bfp-res-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(255, 255, 255, 0.82);
    z-index: 999999;
    display: flex;
    align-items: center;
    justify-content: center;
}

/* Popup box */
.bfp-res-popup {
    position: relative;
    background: #ffffff;
    border-radius: 12px;
    padding: 16px 20px 25px;
    max-width: 420px;
    width: 90%;
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.14);
    box-sizing: border-box;
}

/* Message text inside popup */
.bfp-res-popup-msg {
    font-size: 16px;
    font-weight: 600;
    color: #0f172a;
    text-align: center;
    margin: 0 0 18px 0;
    line-height: 1.5;
}

/* Action buttons row */
.bfp-res-popup-actions {
    display: flex;
    flex-direction: row;
    justify-content: center;
    gap: 12px;
    flex-wrap: wrap;
}

/* Shared popup button base */
.bfp-res-popup-btn {
    padding: 9px 24px;
    border-radius: 6px;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    border: none;
    transition: background-color 0.15s ease;
    white-space: nowrap;
}

.bfp-res-popup-btn-primary {
    background-color: #527293;
    color: #ffffff;
    border-radius: 25px;
}

.bfp-res-popup-btn-primary:hover {
    background-color: #3d5a77;
    color: #fff;
}

.bfp-res-popup-btn-ghost {
    background-color: #f1f5f9;
    color: #334155;
    border-radius: 25px;
}

.bfp-res-popup-btn-ghost:hover {
    background-color: #e2e8f0;
}

.bfp-res-popup-btn-danger {
    background-color: #db7777;
    color: #ffffff;
    border-radius: 25px;
}

.bfp-res-popup-btn-danger:hover {
    background-color: #b74d4d;
    color: #fff;
}

/* X close icon — top-right of popup */
.bfp-res-popup-close {
    position: absolute;
    top: 14px;
    right: 16px;
    background: none;
    border: none;
    font-size: 22px;
    line-height: 1;
    color: #94a3b8;
    cursor: pointer;
    padding: 0;
    transition: color 0.15s ease;
}

.bfp-res-popup-close:hover {
    color: #475569;
}

/* Guest login/register popup — message text */
.bfp-res-popup-msg-guest {
    font-weight: 400;
    font-size: 15px;
    color: #334155;
    line-height: 1.6;
    /* 1.18.8: 15px of top padding so the message text clears the X
       close icon at top:14px / right:16px. The reserve confirmation
       modal has no close icon (cancel/confirm buttons handle dismiss),
       so its .bfp-res-popup-msg sibling stays at the popup's normal
       top padding. The guest modal — and the reservation cancellation
       modal which also carries an X — needs the dodge. */
    padding-top: 15px;
}

/* Register / Login links inside guest popup */
.bfp-res-auth-link {
    color: #527293;
    font-weight: 700;
    text-decoration: underline;
}

.bfp-res-auth-link:hover {
    color: #3d5a77;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Reservations tab — post card stats lines
───────────────────────────────────────────────────────────────────────────── */

.bfp-res-card-qty,
.bfp-res-card-stats {
    font-size: 13px;
    color: #527293;
    font-weight: 600;
    margin: 6px 0 0 0;
}

/* Reserving-users avatar row */
.bfp-res-avatars {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 10px;
    align-items: center;
}

/* "Reservation Holders" label — above avatar row */
.bfp-res-holders-label {
    font-size: 12px;
    font-weight: 700;
    color: #527293;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin: 0 0 6px 0;
}

/* Live holders count — orange, inline after label */
.bfp-res-holders-count {
    color: #ea580c;
    font-weight: 700;
    font-size: 13px;
    margin-left: 5px;
}

/* Holders section below the grey widget box on single post */
.bfp-reserve-holders-section {
    margin-top: 12px;
}

.bfp-reserve-holders-section .bfp-res-holders-label {
    margin-bottom: 8px;
}

.bfp-res-avatar-link {
    display: inline-block;
    border-radius: 50%;
    overflow: hidden;
    width: 50px;
    height: 50px;
    flex-shrink: 0;
    transition: transform 0.15s ease, box-shadow 0.15s ease;
    box-shadow: 0 0 0 2px #e2e8f0;
}

.bfp-res-avatar-link:hover {
    transform: scale(1.08);
    box-shadow: 0 0 0 2px #527293;
}

.bfp-res-avatar-link .bfp-res-avatar,
.bfp-res-avatar-link img {
    width: 50px !important;
    height: 50px !important;
    border-radius: 50% !important;
    object-fit: cover;
    display: block;
    margin: 0 !important;
}

/* Non-clickable avatar — guests and non-privileged users */
.bfp-res-avatar-noclick {
    cursor: default;
    display: inline-block;
    border-radius: 50%;
    overflow: hidden;
    width: 50px;
    height: 50px;
    flex-shrink: 0;
    box-shadow: 0 0 0 2px #e2e8f0;
    opacity: 0.85;
}

.bfp-res-avatar-noclick:hover {
    transform: none;
    box-shadow: 0 0 0 2px #e2e8f0;
}

/* ─────────────────────────────────────────────────────────────────────
 * Custom overrides — added per client request
 * ───────────────────────────────────────────────────────────────────── */

/* Hide the legacy "Your Subscription: <role>" plan badge if any cached
 * markup still renders it from a previous JS version. The injecting JS
 * itself is now a no-op, this is belt-and-braces. */
.bfp-plan-badge,
.bfp-plan-label {
    display: none !important;
}

/* Hide the Quill rich-editor toolbar on the New Post / Edit Post form
 * so only the bare multi-line editing area is visible. The toolbar
 * remains in the DOM (Quill needs it for its internal references) —
 * we just remove it visually and reclaim the space. */
.bfp-quill-editor .ql-toolbar,
.bfp-quill-editor .ql-toolbar.ql-snow,
.ql-toolbar.ql-snow {
    display: none !important;
    height: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    border: 0 !important;
}

/* With the toolbar hidden, the editor container should keep its top
 * border so it doesn't look like a floating box. */
.bfp-quill-editor .ql-container,
.bfp-quill-editor .ql-container.ql-snow {
    border-top: 1px solid #d1d5db !important;
    border-top-left-radius: 8px !important;
    border-top-right-radius: 8px !important;
}

/* Auto-inserted featured image at the top of submitted posts.
 * Belt-and-braces alignleft styling so the image floats left and the
 * post body text wraps around it even if a theme strips core WP
 * alignment classes. */
.bfp-auto-featured-wrap {
    margin: 0 0 1em 0;
}
img.bfp-auto-featured,
.bfp-auto-featured-wrap img.alignleft {
    float: left;
    margin: 0 1.25em 0.75em 0;
    max-width: 35%;
    height: auto;
}

/* Clear the float at the end of the post content so the page layout
 * isn't dragged by the floated image. */
.entry-content::after,
.post-content::after,
.single-post .entry-content::after {
    content: "";
    display: block;
    clear: both;
}

/* ─────────────────────────────────────────────────────────────────────
 * Date and Time tag — form field on New Post / Edit Post screens
 * ───────────────────────────────────────────────────────────────────── */

.bfp-reservation-datetime {
    margin-top: 14px;
}

/* Wrapper row — no border, no padding, no background. The visual border
 * lives on the input itself per request, so the field is flush with the
 * label above and there are no nested boxes wasting vertical space. */
.bfp-datetime-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 0;
    background: transparent;
    border: 0;
    border-radius: 0;
}

.bfp-datetime-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: #527293;
    flex: 0 0 auto;
}

/* Border applied directly to the input per spec */
.bfp-datetime-input {
    flex: 1 1 auto;
    border: solid 1px #527293 !important;
    outline: none;
    background: #ffffff;
    border-radius: 6px;
    font-size: 14px;
    color: #0f172a;
    padding: 8px 12px;
    min-width: 0;
}

.bfp-datetime-input:focus {
    border-color: #527293 !important;
    box-shadow: 0 0 0 3px rgba( 82, 114, 147, 0.18 );
}

.bfp-datetime-input::placeholder {
    color: #94a3b8;
    font-style: italic;
    opacity: 1;
}

/* ─────────────────────────────────────────────────────────────────────
 * Dual datetime picker (since 1.8.0) — "Starting Time" / "Ending Time"
 * link-style buttons that open flatpickr popups. Lives inside the same
 * .bfp-datetime-row wrapper as the legacy single-input layout so the
 * surrounding label + icon spacing stays identical.
 *
 * Layout: strict horizontal flex line — [calendar icon][Starting Time
 * button][Ending Time button][× clear]. No wrapping; on narrow screens
 * the buttons shrink/ellipsis rather than stack, so the user's
 * "everything in one row" requirement holds at every viewport.
 * ───────────────────────────────────────────────────────────────────── */

.bfp-datetime-row--dual {
    flex-wrap: nowrap;
}

.bfp-datetime-pickers {
    display: flex;
    flex-wrap: nowrap;
    align-items: center;
    gap: 14px;
    flex: 1 1 auto;
    min-width: 0;
    margin-top: -15px;
}

/* Visually hide the flatpickr-bound text inputs. They MUST remain in
 * the form (with their name=… attributes intact) so the AJAX payload
 * still carries the canonical "Y-m-d H:i" value, but they must not
 * paint — the visible UI is the button to the left. We avoid
 * `display:none` and `visibility:hidden` because some flatpickr
 * versions refuse to position the popup against a non-rendered anchor
 * (it shouldn't matter here since we set `positionElement` explicitly,
 * but defence in depth). The clip-rect pattern keeps the input layout-
 * neutral, unfocusable, and screen-reader-quiet. */
.bfp-datetime-hidden-field {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
    pointer-events: none !important;
    opacity: 0 !important;
}

/* The two clickable triggers. Styled as inline text-links (no button
 * chrome) per the spec — calendar icon comes from the shared row icon
 * to the left, so the link itself is purely textual. */
.bfp-datetime-link {
    background: transparent;
    border: 0;
    padding: 4px 2px;
    margin: 0;
    font: inherit;
    font-size: 14px;
    color: #527293;
    cursor: pointer;
    text-decoration: underline;
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
    line-height: 1.3;
    white-space: nowrap;
    transition: color 120ms ease;
}

.bfp-datetime-link:hover,
.bfp-datetime-link:focus-visible {
    color: #0f172a;
    outline: none;
}

.bfp-datetime-link:focus-visible {
    box-shadow: 0 0 0 3px rgba( 82, 114, 147, 0.18 );
    border-radius: 4px;
}

/* Once a value has been picked, the link reads as a confirmed value —
 * heavier weight, no underline, slightly darker text. The calendar
 * icon to the left is the affordance that it's still clickable. */
.bfp-datetime-link--set {
    color: #0f172a;
    text-decoration: none;
    font-weight: 600;
}

.bfp-datetime-link--set:hover,
.bfp-datetime-link--set:focus-visible {
    color: #527293;
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* Optional clear-all affordance. Only visible once at least one value
 * is set (the .bfp-datetime-clear--hidden class is toggled by JS). */
.bfp-datetime-clear {
    background: transparent;
    border: 0;
    padding: 4px 6px;
    margin: 0;
    color: #94a3b8;
    cursor: pointer;
    font-size: 14px;
    line-height: 1;
    border-radius: 4px;
    transition: color 120ms ease, background 120ms ease;
}

.bfp-datetime-clear:hover,
.bfp-datetime-clear:focus-visible {
    color: #b91c1c;
    background: #fef2f2;
    outline: none;
}

.bfp-datetime-clear--hidden {
    display: none !important;
}

/* ─────────────────────────────────────────────────────────────────────
 * Price input (since 1.9.0) — sits directly below the Date and Time
 * row. Visual treatment matches the existing inputs in the form
 * (#527293 border, 6px radius, 14px text) so the row reads as part of
 * the same form family. The "$" prefix is rendered as a static span
 * inside the same bordered box so it can never get out of sync with
 * what the user typed.
 * ───────────────────────────────────────────────────────────────────── */

.bfp-price-group {
    margin-top: 14px;
}

.bfp-price-input-wrap {
    display: flex;
    align-items: stretch;
    border: solid 1px #527293;
    border-radius: 6px;
    background: #ffffff;
    background-clip: border-box;
    overflow: hidden;
    border-radius: 25px !important;
}

.bfp-price-input-wrap:focus-within {
    box-shadow: 0 0 0 3px rgba( 82, 114, 147, 0.18 );
}

.bfp-price-currency {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 12px;
    background: #f1f6fb;
    color: #527293;
    font-weight: 700;
    font-size: 15px;
    line-height: 1;
    border-right: 1px solid #d3dee9;
    flex: 0 0 auto;
    user-select: none;
}

.bfp-price-input {
    flex: 1 1 auto;
    border: 0 !important;
    outline: none;
    background: transparent;
    font-size: 14px;
    color: #0f172a;
    padding: 6px 12px 10px;
    min-width: 0;
}

.bfp-price-input:focus {
    box-shadow: none !important;
    outline: none !important;
}

.bfp-price-input::placeholder {
    color: #94a3b8;
    font-style: normal;
    opacity: 1;
}

/* ─────────────────────────────────────────────────────────────────────
 * Address input (since 1.10.0) — free-text street address shown
 * directly under the Amount field. Visual treatment mirrors the price
 * input so the two read as a matched pair: same #527293 border, same
 * focus ring, same 25px pill radius. The location-pin chip on the left
 * occupies the same slot the "$" chip does above.
 * ───────────────────────────────────────────────────────────────────── */

.bfp-address-group {
    margin-top: 14px;
}

.bfp-address-input-wrap {
    display: flex;
    align-items: stretch;
    border: solid 1px #527293;
    border-radius: 25px !important;
    background: #ffffff;
    background-clip: border-box;
    overflow: hidden;
}

.bfp-address-input-wrap:focus-within {
    box-shadow: 0 0 0 3px rgba( 82, 114, 147, 0.18 );
}

.bfp-address-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 12px;
    background: #f1f6fb;
    color: #527293;
    font-size: 14px;
    border-right: 1px solid #d3dee9;
    flex: 0 0 auto;
    user-select: none;
}

.bfp-address-input {
    flex: 1 1 auto;
    border: 0 !important;
    outline: none;
    background: transparent;
    font-size: 14px;
    color: #0f172a;
    padding: 6px 12px 10px;
    min-width: 0;
}

.bfp-address-input:focus {
    box-shadow: none !important;
    outline: none !important;
}

.bfp-address-input::placeholder {
    color: #94a3b8;
    font-style: normal;
    opacity: 1;
}

/* On very narrow viewports, allow long button labels to ellipsis rather
 * than stack — the user's spec requires a single horizontal row. The
 * popup picker doesn't need viewport width and remains usable. */
@media ( max-width: 520px ) {
    .bfp-datetime-link {
        min-width: 0;
        overflow: hidden;
        text-overflow: ellipsis;
    }
}

/* Flatpickr theme tweaks — align the calendar accent colour with the
 * plugin's #527293 palette so the popup feels native to the form. */
.flatpickr-day.selected,
.flatpickr-day.startRange,
.flatpickr-day.endRange,
.flatpickr-day.selected:focus,
.flatpickr-day.startRange:focus,
.flatpickr-day.endRange:focus,
.flatpickr-day.selected:hover,
.flatpickr-day.startRange:hover,
.flatpickr-day.endRange:hover {
    background: #527293;
    border-color: #527293;
}

.flatpickr-day.today {
    border-color: #527293;
}
.flatpickr-day.today:hover {
    background: #527293;
    border-color: #527293;
    color: #fff;
}

/* ─────────────────────────────────────────────────────────────────────
 * Date and Time tag — front-end render as an INDEPENDENT block on the
 * single-post page (sits outside the reservation widget container).
 * ───────────────────────────────────────────────────────────────────── */

/* Wrapper for the dual tags introduced in 1.8.0. Lays the Starting Time
 * and Ending Time pills out as a flex row that wraps to two lines on
 * narrow screens. The wrap also exists when only one tag is rendered
 * (and for legacy single-meta posts) so the surrounding margin behaves
 * identically across all three render paths. */
.bfp-res-datetime-wrap {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin: 0 0 14px 0;
}

/* When wrapped, the .bfp-res-datetime-block's own bottom margin would
 * double up against the wrap's; zero it out inside the wrap. */
.bfp-res-datetime-wrap .bfp-res-datetime-block {
    margin: 0;
}

/* Price tag wrap (since 1.9.0). Sits directly under the datetime wrap
 * on single posts. Same flex layout so a future multi-price scheme
 * (per-tier pricing, etc.) won't require restructuring. */
.bfp-res-price-wrap {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin: 0 0 14px 0;
}

.bfp-res-price-wrap .bfp-res-datetime-block {
    margin: 0;
}

/* Slight color tweak so price reads as price, not as time — the green
 * matches the .bfp-res-counter style and signals "value/amount". */
.bfp-res-price-block {
    color: #5e904c;
    border-color: #5e904c;
    font-weight: 700;
}

.bfp-res-price-block .bfp-res-datetime-icon {
    color: #5e904c;
}

/* Address tag wrap (since 1.10.0). Same layout as the price wrap, sat
 * directly underneath. Keeps the default border colour (#527293) since
 * the address is a neutral-information tag rather than monetary. */
.bfp-res-address-wrap {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin: 0 0 14px 0;
}

.bfp-res-address-wrap .bfp-res-datetime-block {
    margin: 0;
}

.bfp-res-address-block {
    color: #0f172a;
    border-color: #527293;
    font-weight: 500;
}

.bfp-res-address-block .bfp-res-datetime-icon {
    color: #527293;
}

.bfp-res-datetime-block {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 6px 12px;
    margin: 0 0 14px 0;
    background: #ffffff;
    border: 1px solid #527293;
    border-radius: 999px;
    font-size: 14px;
    color: #0f172a;
    font-weight: 500;
}

.bfp-res-datetime-icon {
    display: inline-flex;
    color: #527293;
    flex: 0 0 auto;
}

.bfp-res-datetime-text {
    line-height: 1.2;
}

/* ═══════════════════════════════════════════════════════════════════════════
   ROLE-BASED TAXONOMY LIMITS
   ─ Greyed-out checkboxes once a per-user cap is reached.
   ─ Notice block above the Category/Location/Post Type row.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Greyed-out checkbox & label when the dropdown is at its cap. The class is
   applied by initCheckboxDropdowns() in bfp.js and removed as soon as the
   user un-checks something else. `pointer-events:none` is the actual
   interaction blocker; the colour shift is the visual cue. We keep the
   custom look (no native `disabled` attr) so the styling doesn't fall back
   to whatever the theme/UA renders for disabled inputs. */
.bfp-cb-item.bfp-cb-disabled {
    color: #cbd5e1 !important;
    cursor: not-allowed !important;
    opacity: 0.65;
    pointer-events: none;
}

.bfp-cb-item.bfp-cb-disabled:hover {
    /* Override the .bfp-cb-item:hover rule above so capped rows don't
       light up on mouseover — they should feel inert. */
    background: transparent !important;
}

.bfp-cb-check.bfp-cb-disabled {
    accent-color: #cbd5e1;
    cursor: not-allowed !important;
    opacity: 0.5;
    pointer-events: none;
}

/* ── Notice block under the Title input, above the 3-dropdown row.
      Soft blue card that echoes the form's existing #527293 border colour,
      readable on light backgrounds and unobtrusive. The patron variant
      (no caps apply to this user) is slightly warmer. */
.bfp-post-limits-notice {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    margin: 14px 0 10px 0;
    padding: 11px 14px;
    background: #f1f6fb;
    background-clip: border-box;
    border: 1px solid #cdd9e8;
    border-left-width: 1px;
    border-left-style: solid;
    border-left-color: rgb(205, 217, 232);
    border-left: 3px solid #527293;
    border-radius: 6px;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
    font-size: 13px;
    line-height: 1.5;
    color: #334155;
    box-sizing: border-box;
}

.bfp-post-limits-notice--patron {
    background: #fff9ec;
    border-color: #f5e4b8;
    border-left-color: #d4a017;
    color: #5b4708;
}

.bfp-post-limits-notice__icon {
    flex-shrink: 0;
    margin-top: 2px;
    font-size: 14px;
    color: #527293;
}

.bfp-post-limits-notice--patron .bfp-post-limits-notice__icon {
    color: #d4a017;
}

.bfp-post-limits-notice__text {
    margin: 0;
    padding: 0;
    flex: 1;
}

.bfp-post-limits-notice__text strong {
    color: #0f172a;
    font-weight: 600;
}

.bfp-post-limits-notice--patron .bfp-post-limits-notice__text strong {
    color: #5b4708;
}

/* ═══════════════════════════════════════════════════════════════════════════
   QUILL TOOLBAR ↔ CONTAINER BORDER (adjacent-sibling override)
   ─ When the toolbar is followed directly by the editor container, treat the
     pair as one rounded card with the project's #527293 accent border.
   ═══════════════════════════════════════════════════════════════════════════ */
.ql-toolbar.ql-snow + .ql-container.ql-snow {
    border: solid 1px #527293 !important;
    border-radius: 7px !important;
}

/* ─────────────────────────────────────────────────────────────────────────
 * Single-post Leaflet / OpenStreetMap map (since 1.14.0)
 *
 * Sits directly beneath the address (Location) tag. Visual language matches
 * the existing reservation tags: same #527293 slate-blue accent, same
 * rounded corners (scaled up from the pill radius to a card radius), same
 * 14px bottom rhythm. The map is full-width of the content column and uses a
 * 16:9 aspect box so it reflows cleanly on mobile without layout shift.
 * ───────────────────────────────────────────────────────────────────────── */
.bfp-res-map-wrap {
    margin: 0 0 14px 0;
}

.bfp-res-map {
    width: 100%;
    aspect-ratio: 16 / 9;
    min-height: 240px;
    border: 1px solid #527293;
    border-radius: 14px;
    overflow: hidden;            /* clip Leaflet tiles to the rounded corners */
    background: #e8eef3;          /* slate-tinted placeholder before tiles load */
    z-index: 0;                   /* keep Leaflet panes below site headers/menus */
}

/* Fallback for older browsers without aspect-ratio support. */
@supports not (aspect-ratio: 16 / 9) {
    .bfp-res-map {
        height: 0;
        padding-bottom: 56.25%;
        position: relative;
    }
    .bfp-res-map .leaflet-pane,
    .bfp-res-map .leaflet-control-container {
        position: absolute;
        top: 0;
        left: 0;
    }
}

/* Round Leaflet's own container to honour the wrapper radius. */
.bfp-res-map .leaflet-container {
    border-radius: 14px;
    font: inherit;               /* keep map UI text in the theme font */
}

/* Tighten Leaflet's attribution so it reads as a quiet caption. */
.bfp-res-map .leaflet-control-attribution {
    font-size: 11px;
    background: rgba(255, 255, 255, 0.82);
}

@media (max-width: 600px) {
    .bfp-res-map {
        min-height: 200px;
        border-radius: 12px;
    }
    .bfp-res-map .leaflet-container {
        border-radius: 12px;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   1.15.0 — Content word-count gate, processing caption, map height
   ───────────────────────────────────────────────────────────────────────────
   All rules added in 1.15.0 live in one block so the changeset is easy to
   audit and easy to roll back. Earlier rules above are untouched.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Content label hint — "(at least 50 words, please)".
   Shares .bfp-required so it inherits the same slate-blue tone used by the
   "(required)" markers on the Category / Location / Post Type labels. The
   override here is just the weight reset, so it doesn't read as bolder
   than the surrounding pill markers. */
.bfp-content-hint {
    font-weight: 400;
}

/* Live word counter beneath the Quill editor — mirrors the classic
   WP post-editor counter. Flush-right under the editor body. Subtle
   green tint once the threshold is met so the author has a clear
   non-verbal "you're good" signal in addition to the form unlocking. */
.bfp-content-wordcount {
    text-align: right;
    font-size: 12px;
    color: #64748b;
    margin: 4px 4px 0 0;
    line-height: 1.4;
    user-select: none;
    font-variant-numeric: tabular-nums;
    transition: color 0.2s ease;
}
.bfp-content-wordcount.bfp-wc-met {
    color: #15803d;
}

/* Lockable section gating everything beneath Content until the body
   reaches MIN_CONTENT_WORDS.

   HISTORY: 1.15.0–2.1 dimmed the section in place (opacity 0.45 +
   grayscale + pointer-events:none) so it stayed visible but inert.
   As of 2.1.1 the locked section is collapsed out of layout instead
   (see the block immediately below) — same gate, stronger effect.

   Selector stays scoped under .bfp-new-post-wrap (since 1.15.1) so its
   specificity (0,3,0) beats stray theme rules like
   `.bfp-form-group { opacity: 1 }` (0,1,0) or BuddyPress core widget
   styles; a few themes were observed winning on source order alone
   without that scoping. */
/* ── Below-content gate — full collapse (updated 2.1.1) ───────────────────
   Behaviour change (per request): while the body sits under
   MIN_CONTENT_WORDS, every element beneath the Content editor — the
   reservation filter, the date/time pickers, the Amount/Offer/Free row,
   the featured-image uploader AND the Submit / Cancel actions — is
   removed from the layout entirely rather than merely greyed out. With
   the section gone the `.bfp-new-post-wrap` container collapses so its
   bottom edge now sits right under the live word-counter instead of
   under the (previously dimmed) Submit Post button.

   Why `display:none` rather than `visibility:hidden` / `height:0`:
     • It reclaims the vertical space — the wrap genuinely shrinks, which
       is the requested "div ends after the multiline field" effect.
     • It takes every hidden field out of the keyboard tab order, so a
       keyboard / screen-reader user can no longer land on controls that
       are not yet meant to be usable. That is a strict accessibility
       improvement over the old pointer-events-only lock (which left the
       greyed inputs focusable).
     • A half-finished post can't be submitted while the gate is engaged,
       because the Submit button simply isn't in the DOM tree's render
       path. Server-side validation in ajax_new_post()/ajax_update_post()
       is still the real boundary; this remains the UX surface only.

   The instant the word count reaches the threshold the JS in bfp.js
   (bfpRefreshWordCount → $section.toggleClass('bfp-locked', …)) drops the
   class; the section then reveals with a short fade-and-rise so the
   container visibly grows into place instead of popping. */
/* ── Below-content gate — accordion height roll (updated 2.1.2) ───────────
   The locked section is collapsed to zero height and the unlock is a slow,
   smooth "accordion" that rolls the section open to its real content height
   over ~2.5s.

   Technique — CSS Grid 0fr → 1fr:
     The section is a single-row grid whose one child (.bfp-below-content-inner)
     carries `overflow:hidden; min-height:0`. Transitioning the track from
     `0fr` (locked) to `1fr` (unlocked) animates the row to the child's
     *natural* height — no magic max-height guess, so the roll lasts the full
     2.5s no matter how tall the section's content happens to be. This is why
     the inner wrapper was added in the markup.

   Collapsed state keeps the two properties that made 2.1.1 correct:
     • zero height (0fr + min-height:0 + overflow:hidden) → the wrap ends
       right under the word-counter;
     • visibility:hidden → the hidden fields and Submit button leave the
       keyboard tab order. visibility flips back to visible with no delay on
       expand (so content is readable as it rolls down) and is delayed until
       AFTER the roll-up finishes on collapse, so nothing blinks out early.

   Server-side validation in ajax_new_post()/ajax_update_post() is still the
   real submission boundary; this stays a pure UX surface. */
.bfp-new-post-wrap .bfp-below-content-section {
    display: grid;
    grid-template-rows: 1fr;
    opacity: 1;
    visibility: visible;
    transition:
        grid-template-rows 2.5s cubic-bezier(0.22, 1, 0.36, 1),
        opacity 1.6s ease,
        visibility 0s;
}
.bfp-new-post-wrap .bfp-below-content-section.bfp-locked {
    display: grid !important;     /* override the legacy display:none path */
    grid-template-rows: 0fr;
    opacity: 0;
    visibility: hidden;
    /* Hold visibility until the 2.5s roll-up has finished. */
    transition:
        grid-template-rows 2.5s cubic-bezier(0.22, 1, 0.36, 1),
        opacity 1.6s ease,
        visibility 0s linear 2.5s;
}
.bfp-new-post-wrap .bfp-below-content-inner {
    overflow: hidden;
    min-height: 0;
}
/* Respect users who ask the OS to minimise motion — snap open/closed. */
@media (prefers-reduced-motion: reduce) {
    .bfp-new-post-wrap .bfp-below-content-section,
    .bfp-new-post-wrap .bfp-below-content-section.bfp-locked {
        transition: none;
    }
}

/* "Image is Processing…" caption directly under the upload progress bar.
   Italic + muted slate so it reads as ancillary status, not as a hard
   error message. Visibility is JS-driven (toggle on bfp_upload_image
   start; toggle off on AJAX complete). */
.bfp-upload-processing {
    margin-top: 6px;
    font-size: 12px;
    color: #64748b;
    line-height: 1.4;
    font-style: italic;
}

/* Wide-screen height tuning for the single-post Leaflet map.
   ─────────────────────────────────────────────────────────────────
   The default 16:9 aspect-ratio (defined in the base .bfp-res-map
   block above) reads well on mobile — narrow columns benefit from
   the taller proportions — so the existing @media (max-width: 600px)
   block at the top of this CSS section is left completely alone.
   On wide screens (601px+) the 16:9 ratio yields a map that's a
   touch too tall for the surrounding post body; squat the ratio
   slightly to reclaim roughly 40px of vertical space on typical
   content column widths (~780px → -41px; ~830px → -43px; ~1000px
   → -52px). aspect-ratio is widely supported in all evergreen
   browsers, and the @supports fallback further above already covers
   the legacy padding-bottom trick if needed. */
@media (min-width: 601px) {
    .bfp-res-map {
        aspect-ratio: 1.94 / 1;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   1.16.0 — Title gate, Price/Offer/Free picker, visitor-side offer input
   ───────────────────────────────────────────────────────────────────────────
   All rules added in 1.16.0 live in this single block so the changeset
   stays easy to audit and easy to roll back. Earlier blocks above are
   untouched.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Title gate ─────────────────────────────────────────────────────────
   Mirror of .bfp-below-content-section.bfp-locked from 1.15.0/1.15.1.
   Same visual grammar — opacity 0.45, light grayscale, pointer-events
   off — so the two progressive gates feel like one coherent UX even
   though they engage independently. Specificity intentionally scoped
   under .bfp-new-post-wrap (0,3,0) to win against stray theme rules
   targeting .bfp-form-group. */
.bfp-new-post-wrap .bfp-below-title-section {
    transition: opacity 0.22s ease, filter 0.22s ease;
}
.bfp-new-post-wrap .bfp-below-title-section.bfp-locked {
    opacity: 0.45;
    filter: grayscale(0.4);
    pointer-events: none;
    user-select: none;
}
.bfp-new-post-wrap .bfp-below-title-section.bfp-locked .bfp-form-group,
.bfp-new-post-wrap .bfp-below-title-section.bfp-locked .bfp-form-actions {
    pointer-events: none;
}

/* Nested-lock suppression. When BOTH gates are engaged (title under 20
   chars AND content under 50 words — i.e. a freshly-opened form), the
   outer .bfp-below-title-section's opacity 0.45 already greys everything
   inside it, INCLUDING the .bfp-below-content-section. Letting that
   inner section also apply opacity 0.45 would compound to 0.2025 —
   washed out enough to look broken. So we neutralise the inner lock's
   visual effects while the outer is engaged; pointer-events: none
   still inherits cleanly through both. */
.bfp-new-post-wrap .bfp-below-title-section.bfp-locked .bfp-below-content-section.bfp-locked {
    opacity: 1;
    filter: none;
}

/* ── Price / Offer / Free picker — author side ──────────────────────────
   Three-element flex row:
       [ Amount $___ ]    ( ) Offer    ( ) FREE
   The Amount field carries `flex: 0 1 200px` instead of stretching to
   100% — that's the "reduced width" the author asked for in the spec.
   At narrow viewports (<480px) the row wraps to two lines: Amount on
   row 1, the two radios on row 2. Mobile is the only place the spec
   reads as "must fit" hard enough to justify wrapping. */
.bfp-price-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
    margin-top: 4px;
}
.bfp-price-row .bfp-price-input-wrap {
    flex: 0 1 200px;
    min-width: 140px;
}
/* Amount field reads as inactive when the picker has Offer or FREE
   selected. The native [disabled] attribute already blocks input; this
   rule adds the visual cue. */
.bfp-price-row .bfp-price-input:disabled {
    background: #f1f5f9;
    color: #94a3b8;
    cursor: not-allowed;
}
.bfp-price-row[data-price-type="offer"] .bfp-price-input-wrap,
.bfp-price-row[data-price-type="free"]  .bfp-price-input-wrap {
    opacity: 0.55;
}

/* Radio options — pill labels with subtle hover lift. Native radio
   button is hidden via .bfp-price-option's flex layout but kept in the
   tab order via opacity:0 + same-position absolute, NOT display:none —
   keyboard accessibility matters. */
.bfp-price-option {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 14px;
    border: 1px solid #cbd5e1;
    border-radius: 999px;
    background: #ffffff;
    color: #475569;
    font-size: 14px;
    font-weight: 500;
    cursor: pointer;
    transition: background 0.18s ease, border-color 0.18s ease, color 0.18s ease;
    user-select: none;
}
.bfp-price-option:hover {
    background: #f1f6fb;
    border-color: #527293;
}
.bfp-price-option input[type="radio"] {
    margin: 0;
    accent-color: #527293;
    cursor: pointer;
}
/* Checked-state pill: filled slate background, white text — clear
   selection signal that doesn't depend on the native radio glyph. */
.bfp-price-option input[type="radio"]:checked + span {
    color: #0f172a;
    font-weight: 700;
}
.bfp-price-row .bfp-price-option:has(input[type="radio"]:checked) {
    background: #e2efff;
    border-color: #527293;
}

/* ── Visitor-side offer input + FREE label ──────────────────────────────
   Rendered inside the existing .bfp-res-price-block bordered pill.
   `--offer` variant gets the small editable input; `--free` variant
   gets a louder accent so the word FREE is unmistakable. */
.bfp-res-price-block--offer,
.bfp-res-price-block--free {
    /* Override the default text-only block — these variants need a
       little extra horizontal breathing room around the input/label. */
    gap: 8px;
}
.bfp-res-price-text--free {
    font-weight: 800;
    letter-spacing: 0.5px;
    color: #15803d;
}
.bfp-res-price-text--offer {
    font-weight: 700;
    color: #0f172a;
}

/* The visitor's offer input — narrow, inline, matched to the price
   tag's visual style. Same currency-chip + bordered-pill treatment as
   the author-side Amount field so the two read as a matched set. */
.bfp-res-offer-input-wrap {
    display: inline-flex;
    align-items: stretch;
    border: solid 1px #527293;
    border-radius: 999px;
    background: #ffffff;
    overflow: hidden;
    margin-left: 4px;
    transition: box-shadow 0.18s ease;
}
.bfp-res-offer-input-wrap:focus-within {
    box-shadow: 0 0 0 3px rgba( 82, 114, 147, 0.18 );
}
.bfp-res-offer-currency {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 8px;
    background: #f1f6fb;
    color: #527293;
    font-weight: 700;
    font-size: 13px;
    line-height: 1;
    border-right: 1px solid #d3dee9;
    user-select: none;
}
.bfp-res-offer-input {
    flex: 0 1 90px;
    width: 90px;
    /* 1.18.5: explicit themed border on the bare offer input. The
       outer .bfp-res-offer-input-wrap pill provides the surrounding
       chrome, but a couple of theme stylesheets aggressively zero
       out input borders inside .bp-* contexts — the !important here
       overrides those so the input keeps a visible edge in all
       themes. Same #527293 used by the chip / pill wrap so the
       three elements still read as a single coloured atom. */
    border: solid 1px #527293 !important;
    outline: none;
    background: transparent;
    font-size: 13px;
    color: #0f172a;
    padding: 4px 8px;
    min-width: 0;
}
.bfp-res-offer-input:focus {
    box-shadow: none;
    outline: none;
}
.bfp-res-offer-input::placeholder {
    color: #94a3b8;
    font-style: italic;
    opacity: 1;
}

/* Mobile (≤600px) wrap: when the price-tag pill would otherwise overflow,
   stack the input on a second line under the "Offer" label so neither
   element gets squished. */
@media (max-width: 600px) {
    .bfp-res-price-block--offer {
        flex-wrap: wrap;
    }
    .bfp-res-offer-input-wrap {
        margin-left: 0;
        flex-basis: 100%;
    }
    .bfp-res-offer-input {
        flex: 1 1 auto;
        width: 100%;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   1.17.0 — Radio chip on Amount field, offer-minimum accordion,
   visitor-side Reserve-button gating
   ───────────────────────────────────────────────────────────────────────────
   All rules added in 1.17.0 live in this block so the changeset stays
   auditable and easily revertible. Earlier blocks above are untouched.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Radio chip on the Amount input ─────────────────────────────────────
   The left-side chip used to be a plain "$" tag styled by .bfp-price-currency.
   In 1.17.0 it's wrapped in a <label> + radio so all three price-type
   options (Price / Offer / FREE) are mutually-exclusive radios in one
   group. The "$" mark stays alongside the radio so the chip still reads
   visually as "the currency input"; the radio dot tells you whether
   it's the active option.
   ───────────────────────────────────────────────────────────────────────── */
.bfp-price-currency--radio {
    cursor: pointer;
    gap: 6px;
    /* Slightly less horizontal padding to make room for the radio glyph
       without forcing the chip wider than the Offer / FREE pills. */
    padding: 0 10px;
    transition: background 0.18s ease;
}
.bfp-price-currency--radio:hover {
    background: #e2efff;
}
.bfp-price-currency--radio input[type="radio"] {
    margin: 0;
    accent-color: #527293;
    cursor: pointer;
    /* Slightly smaller than default so the radio + $ fit in the chip
       without dominating it. Browsers honour accent-color even when
       transform-scaled. */
    transform: scale( 0.95 );
}
.bfp-price-currency-mark {
    display: inline-block;
    font-weight: 700;
    color: #527293;
    line-height: 1;
    user-select: none;
}

/* ── Offer-minimum accordion ────────────────────────────────────────────
   Slide-down panel that reveals the "Accept offers not lower than"
   input when the author selects the Offer radio. Closes back to
   zero height when the picker returns to Price or FREE.

   max-height transition over a generous 240px upper bound is enough
   for the single label + input the panel actually contains. opacity
   and margin-top cross-fade in/out alongside so the open animation
   reads as one motion rather than three. overflow:hidden clips the
   content while max-height is shrinking, otherwise the input would
   visibly poke out below the collapsed chrome.
   ───────────────────────────────────────────────────────────────────────── */
.bfp-offer-min-accordion {
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    margin-top: 0;
    transition: max-height 0.32s ease,
                opacity 0.22s ease,
                margin-top 0.22s ease;
}
.bfp-offer-min-accordion--open {
    max-height: 240px;
    opacity: 1;
    margin-top: 14px;
}
.bfp-offer-min-inner {
    /* Inner wrapper so we can apply a subtle left border accent that
       indicates this is a sub-control of the Amount field, not a
       fully independent form-group. Mirrors the .bfp-content-hint
       slate tone used elsewhere. */
    padding-left: 12px;
    border-left: 3px solid #cbd5e1;
}
.bfp-offer-min-label {
    display: block;
    font-size: 13px;
    font-weight: 600;
    color: #475569;
    margin-bottom: 6px;
    line-height: 1.4;
}
/* The offer-min input reuses .bfp-price-input-wrap visuals; just
   constrain its width so it doesn't span the full row (this is a
   secondary control, it should read as smaller than the main
   Amount field). */
.bfp-offer-min-accordion .bfp-price-input-wrap {
    max-width: 220px;
}

/* ── Visitor-side Reserve-button gating ─────────────────────────────────
   The native [disabled] attribute already greys the button and blocks
   clicks. .bfp-btn--gated is an additional hook for when we want a
   distinct visual treatment for "gated by offer" vs the existing
   "gated by no-availability" disabled state — at present we use the
   same muted tone for both, but keeping the hook in place lets us
   diverge cheaply if UX feedback says we should.
   ───────────────────────────────────────────────────────────────────────── */
.bfp-res-reserve-btn[disabled],
.bfp-res-reserve-btn.bfp-btn--gated {
    cursor: not-allowed;
    opacity: 0.55;
}
.bfp-res-reserve-btn[disabled]:hover,
.bfp-res-reserve-btn.bfp-btn--gated:hover {
    /* Suppress any hover lift the active state defines elsewhere — a
       disabled button should not telegraph interactivity. */
    transform: none;
    box-shadow: none;
}

/* ── Offer-minimum hint pill on single-post ─────────────────────────────
   When the post has a minimum floor, we render a small "Minimum: $12.50"
   chip next to the offer input so visitors know the bar before they
   start typing. Styled understated — slate-grey, italic, smaller font
   — so it reads as context, not a primary control.
   ───────────────────────────────────────────────────────────────────────── */
.bfp-res-offer-min-hint {
    margin-left: 6px;
    font-size: 12px;
    font-style: italic;
    color: #64748b;
    line-height: 1.4;
    white-space: nowrap;
    align-self: center;
}
@media (max-width: 600px) {
    .bfp-res-offer-min-hint {
        margin-left: 0;
        margin-top: 4px;
        flex-basis: 100%;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   1.18.0 — AJAX subtab loading hint
   ───────────────────────────────────────────────────────────────────────────
   Minimal visual feedback during the brief AJAX subtab swap. The
   transition keeps the swap from feeling like an abrupt content flash;
   pointer-events stays interactive so a rapid second click can still
   abort/replace the in-flight load.
   ═══════════════════════════════════════════════════════════════════════════ */
.bfp-subtab-content {
    transition: opacity 0.18s ease;
}
.bfp-subtab-content.bfp-subtab-loading {
    opacity: 0.55;
}

/* Reservations-tab-only bottom spacing (since 2.1)
   ───────────────────────────────────────────────────────────────────────────
   The Reservations BP profile tab (both "Made" and "My posts" sub-tabs)
   needs breathing room beneath its card list — without this the last card
   sits flush against the BP profile footer / next widget. Scoping by the
   data-parent="reservations" attribute keeps Journal and single-post
   contexts unaffected; same wrapper class but a different parent value, so
   the attribute selector targets exactly the two Reservations templates
   (tpl_reservations_made() + tpl_reservations_my_posts()) without leaking
   into Journal or anywhere else .bfp-subtab-content is reused.

   AJAX subtab swap interaction: bfpLoadSubtab() in bfp.js replaces the
   ENTIRE wrapper element (replaceWith, not .html()), and each tpl_*
   render outputs its own wrapper with the correct data-parent baked in.
   So swapping Reservations → Journal → Reservations re-emits a fresh
   wrapper each time with whatever data-parent the destination tab uses,
   and this rule matches/unmatches naturally without any JS coordination. */
.bfp-subtab-content[data-parent="reservations"] {
    margin-bottom: 60px;
}

/* ═══════════════════════════════════════════════════════════════════════════
   1.18.1 — Inline price inside the reservation widget row
   ───────────────────────────────────────────────────────────────────────────
   Replaces the standalone bordered "$X.XX" / "Offer" / "FREE" pill that
   used to sit ABOVE the grey-blue reservation widget. The price now lives
   INSIDE the .bfp-res-widget-row, positioned directly before the
   "Reserve Now" button. No pill border, no SVG $ icon — just text, so it
   reads as a value next to the action that commits it.
   The 'price' variant carries data-unit-price; bfp.js multiplies it by
   the dropdown qty on change and rewrites the text in place.
   ═══════════════════════════════════════════════════════════════════════════ */

.bfp-res-inline-price {
    /* Pure text. Keeps the green/value cue from the legacy pill so the
       amount still reads as a price, just without the chrome around it. */
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 15px;
    font-weight: 700;
    color: #5e904c;
    white-space: nowrap;
    flex-shrink: 0;
    line-height: 1.2;
    /* No border, no background, no padding. The label/select to the left
       and the Reserve Now button to the right already provide enough
       visual rhythm; adding a frame here would re-create the pill we
       just removed. */
}

/* 'FREE' gets the same darker green the legacy pill used for the FREE
   state, so it still reads as unmistakably zero-cost even without the
   bordered pill. */
.bfp-res-inline-price--free {
    color: #15803d;
    font-weight: 800;
    letter-spacing: 0.5px;
}

/* 'Offer' mode — bare label + currency chip + input. We re-use the
   existing .bfp-res-offer-input for the typing field (so the offer-gate
   JS keeps working unchanged) but strip the rounded-pill chrome via the
   --inline modifier below. The label and currency chip sit alongside as
   plain inline atoms.

   1.18.6: returned to the simple inline-flex layout. The status pill
   that briefly lived inside this wrapper in 1.18.5 has been moved
   OUTSIDE the row entirely (see .bfp-res-offer-status below), so this
   wrapper no longer needs flex-wrap or position: relative. */
.bfp-res-inline-price--offer {
    /* Neutral dark-slate so the label doesn't compete visually with the
       Reserve button. Visitor still sees the input is the interactive
       part because it has its own border. */
    color: #0f172a;
    font-weight: 600;
    gap: 4px;
}
.bfp-res-inline-price-label {
    color: #0f172a;
    font-weight: 600;
}
.bfp-res-inline-price-currency {
    color: #5e904c;
    font-weight: 700;
    user-select: none;
}

/* Bare input variant for the offer-mode inline placement. Keeps a
   functional border so the field is obviously editable, but drops the
   pill-wrap chrome since the surrounding row already provides the
   visual grouping. 1.18.5: border colour bumped to the theme blue
   (#527293) to match the standalone .bfp-res-offer-input — both
   surfaces now read as the same coloured atom.

   1.18.7: text-align: right so the typed value flushes against the
   input's right edge, visually anchoring it next to the Reserve Now
   button (the standard currency-input convention — banking apps,
   POS terminals, and invoice editors all right-align amounts). The
   previous left-align left a perceptible whitespace gap between the
   typed value and the input's right border, which read as "large
   gap before Reserve Now" even though the row's flex gap was
   identical to the other inter-atom gaps. Padding tightened from
   6px 8px to 6px 6px for the same reason — every removed pixel
   between value and button strengthens the visual rhythm. */
.bfp-res-offer-input--inline {
    /* 1.18.9: width bumped 70 → 90 (+20px) for more comfortable
       typing room. Pairs with the 150px max-width clamp on the
       parent wrapper above — label + chip + 90px input fits with
       no trailing slack. */
    width: 90px;
    flex: 0 0 90px;
    padding: 6px 6px;
    border: 1px solid #527293;
    border-radius: 6px;
    background: #ffffff;
    font-size: 13px;
    color: #0f172a;
    text-align: right;
    outline: none;
    box-sizing: border-box;
    transition: border-color 0.18s ease, box-shadow 0.18s ease;
    /* 1.18.7: explicit margin: 0 to neutralise any theme stylesheet
       that adds margin-right to form inputs inside post content. A
       few themes (GeneratePress's WooCommerce add-on, Astra in some
       configurations) inject margin: 0 0 1em on form controls, which
       would silently push the Reserve Now button further to the right. */
    margin: 0 !important;
}
.bfp-res-offer-input--inline:focus {
    border-color: #527293;
    box-shadow: 0 0 0 2px rgba( 82, 114, 147, 0.15 );
}
.bfp-res-offer-input--inline::placeholder {
    color: #94a3b8;
    font-style: italic;
    opacity: 1;
}

/* Mobile (≤600px): the row already wraps thanks to flex-wrap on
   .bfp-res-widget-row, but the offer-mode atom can get crowded next to
   the select and button. Let it claim the full row width so the input
   stays usable on narrow screens. */
@media ( max-width: 600px ) {
    .bfp-res-inline-price--offer {
        flex-basis: 100%;
        justify-content: flex-start;
    }
    .bfp-res-offer-input--inline {
        flex: 1 1 auto;
        width: auto;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   1.18.2 — Mobile: hide Reserve label so the widget row stays on ONE line
   ───────────────────────────────────────────────────────────────────────────
   Below 786px the row [label → select → price → Reserve Now → counter] no
   longer fits horizontally and the "N left" counter wraps onto a second
   line. The label is the longest atom AND the most redundant on this
   surface — the surrounding context (a qty dropdown next to a button
   that says "Reserve Now") makes the row's purpose self-evident — so
   dropping it from the visual flow on narrow screens reclaims enough
   room to keep the remaining four atoms together.

   Implementation note: kept as a CSS-only rule (no PHP / no JS) so the
   same treatment applies whether the breakpoint is crossed by a real
   phone, a desktop window resize, or browser zoom. The label stays in
   the DOM (display:none, not removed server-side) so any later a11y
   refactor that wires the <label> to the <select> via for=/id= still
   has the node to attach to.

   Breakpoint: 785.98px = Bootstrap convention for "strictly less than
   786px", avoiding fractional-pixel edges at the boundary. Adjust to
   767.98px if 768 was the intended tablet boundary.

   Selector covers both the default-state label and the cancelled-state
   label (which carries an additional .bfp-res-label-muted modifier);
   both share .bfp-res-widget-label so a single rule reaches them.
   The already-reserved state has no label at all, so it's unaffected.
   ═══════════════════════════════════════════════════════════════════════════ */
@media ( max-width: 785.98px ) {
    .bfp-res-widget-label {
        display: none;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   1.18.3 — Author lockout on reservation widget + offer-input validity states
   ───────────────────────────────────────────────────────────────────────────
   Two related additions that share a common goal: stop authors from
   reserving their own posts (with a visually obvious masked state),
   and tighten the offer-gate's visual feedback so visitors see at a
   glance whether their typed amount passes the auto-acceptance bar
   the author set.

   AUTHOR LOCKOUT
   ──────────────
   When the viewing user is the post's own author, render_reservation_inner()
   emits the row with class bfp-res-widget-row--author-locked instead of
   the regular bfp-res-widget-row. All interactive controls in that
   branch carry the `disabled` attribute already (CSS belt-and-suspenders
   below in case downstream code adds a control without it), and an
   author note explains the masked state. The opacity-mask + pointer-
   events: none on the row makes it visually obvious the controls are
   for preview, not interaction.

   OFFER-INPUT VALIDITY STATES
   ───────────────────────────
   The visitor-side offer-gate JS now toggles two modifier classes on
   the input itself to communicate format / minimum-floor status:
     – bfp-res-offer-input--valid    → green border, "good to go"
     – bfp-res-offer-input--invalid  → red border, "fix me"
   A live status pill (.bfp-res-offer-status) appears next to / under
   the input with a short message ("Below minimum ($99.99)", "Enter
   amount as $0,000.00", "✓ Looks good"). The static "Minimum: $X.XX"
   hint pill rendered server-side remains untouched — it's the pre-
   input expectation; the live status is the post-input verdict.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Author lockout: opacity mask + no pointer events ──────────────────── */
.bfp-res-widget-row--author-locked {
    /* Visual cue: dim the whole row but keep it readable so the
       author can preview the layout. 0.55 matches the [disabled]
       opacity used elsewhere on .bfp-res-reserve-btn for consistency. */
    opacity: 0.55;
    /* Click-through prevention: even if a downstream theme or
       browser quirk leaves a button visually pressable, this
       rule blocks the click from doing anything. */
    pointer-events: none;
    /* The native cursor on the row itself reverts to default; we
       set not-allowed on the descendant controls below so a hovering
       author hand sees the "no" sign over the actual interactive
       atoms. */
    user-select: none;
}
.bfp-res-widget-row--author-locked .bfp-res-widget-select,
.bfp-res-widget-row--author-locked .bfp-res-reserve-btn,
.bfp-res-widget-row--author-locked .bfp-res-offer-input,
.bfp-res-widget-row--author-locked .bfp-res-offer-input--inline {
    cursor: not-allowed;
}

/* The author note that sits below the masked row. Same visual
   grammar as .bfp-res-widget-note (the visitor's "Please reserve only
   what You truly need..." nudge) so the two read as siblings, but a
   little darker tone so the author registers that this is informational
   about THEM, not a generic visitor message. */
.bfp-res-author-note {
    margin-top: 6px;
    padding: 8px 12px;
    border-radius: 6px;
    background: #fef3c7;       /* amber-100 — gentle "heads up" tone   */
    border: 1px solid #fde68a; /* amber-200                            */
    color: #78350f;            /* amber-900 — accessible on amber-100  */
    font-size: 12.5px;
    font-style: italic;
    line-height: 1.5;
}

/* ── Offer-input validity states: green / red border ───────────────────── */
/* The currency-chip + input wrapper used by the standalone price tag
   (pill chrome, no reservation widget) — colours the OUTER pill so the
   chip + input read as a single coloured atom. */
.bfp-res-offer-input-wrap:has( .bfp-res-offer-input--valid ) {
    border-color: #15803d;
    box-shadow: 0 0 0 2px rgba( 21, 128, 61, 0.15 );
}
.bfp-res-offer-input-wrap:has( .bfp-res-offer-input--invalid ) {
    border-color: #b91c1c;
    box-shadow: 0 0 0 2px rgba( 185, 28, 28, 0.15 );
}
/* The inline input used inside the reservation row — no pill wrap to
   tint, so we colour the input's own border. Wins over the default
   .bfp-res-offer-input--inline border thanks to specificity. */
.bfp-res-offer-input--inline.bfp-res-offer-input--valid {
    border-color: #15803d;
    box-shadow: 0 0 0 2px rgba( 21, 128, 61, 0.15 );
}
.bfp-res-offer-input--inline.bfp-res-offer-input--invalid {
    border-color: #b91c1c;
    box-shadow: 0 0 0 2px rgba( 185, 28, 28, 0.15 );
}
/* Fallback for browsers that don't support :has() yet (Firefox pre-121,
   etc.) — colour the input itself when the modifier is present. The
   pill wrap stays its default colour in that case, which is fine — the
   inner field's coloured border still telegraphs the state. */
.bfp-res-offer-input.bfp-res-offer-input--valid {
    outline: 1px solid #15803d;
    outline-offset: -1px;
}
.bfp-res-offer-input.bfp-res-offer-input--invalid {
    outline: 1px solid #b91c1c;
    outline-offset: -1px;
}

/* ── Live status pill below the entire row ─────────────────────────────── */
/* Three states share a common pill shape; the ok / bad modifiers tint
   the colour. Hidden via display:none until the JS has something to
   say (no aria-live on empty content) so the row doesn't visibly grow
   on first paint.

   1.18.6: positioned as a SIBLING of .bfp-res-widget-row, on its own
   horizontal line below the row. The single <div> here serves both
   purposes: display:block claims its own line, width:fit-content
   shrinks the box to the message text so the rounded-pill chrome hugs
   the words instead of stretching full-width. fit-content has wide
   browser support (Chrome 46+, Firefox 94+, Safari 11+); the
   max-content fallback line keeps Safari < 14 happy. */
.bfp-res-offer-status {
    display: block;
    width: -moz-max-content;
    width: -webkit-max-content;
    width: max-content;
    max-width: 100%;
    margin: 6px 0 0 0;
    padding: 2px 10px;
    border-radius: 999px;
    font-size: 12px;
    font-weight: 600;
    line-height: 1.5;
    transition: background-color 0.18s ease, color 0.18s ease;
    text-align: left;
    box-sizing: border-box;
}
.bfp-res-offer-status--ok {
    background: #dcfce7; /* green-100 */
    color: #15803d;      /* green-700 */
}
.bfp-res-offer-status--bad {
    background: #fee2e2; /* red-100   */
    color: #b91c1c;      /* red-700   */
}

/* ═══════════════════════════════════════════════════════════════════════════
   1.18.7 → 1.18.8 — Explicit 12px gap between offer wrapper and Reserve Now
   ───────────────────────────────────────────────────────────────────────────
   The row's flex `gap: 10px` is the same between every pair of adjacent
   atoms (label↔select, select↔offer, offer↔button, button↔counter), so
   strictly speaking there's no real "extra" gap after the offer wrapper —
   but visually the offer↔button distance reads larger than the others
   because the input's typed value (or placeholder) sits inside the
   input's right padding, so the value-to-button perceptive distance
   picks up the padding on top of the row gap.

   1.18.8: explicit margin override pins the offer→button spacing to
   exactly 12px (the user-specified target). Implementation: row `gap`
   contributes 10px between the offer wrapper and the next flex child;
   `margin-left: 2px` on the immediately-after-offer button adds the
   remaining 2px to land at exactly 12px edge-to-edge. `!important`
   trumps any theme stylesheet that might reset button margins for
   buttons inside post content.

   Companion rule below forces `margin-right: 0` on the offer wrapper
   itself, neutralising any theme rule that injects post-content
   horizontal margins on inline-flex spans.

   The "invisible div footprint" the user suspected does NOT exist in
   the current renders — the offer-status pill (1.18.6+) is rendered
   as a SIBLING of .bfp-res-widget-row, not inside it, so it cannot
   contribute horizontal space to the row. The perceived gap was the
   value-to-button perceptive distance described above plus, possibly,
   a stale cached older bundle where the pill DID briefly live inside
   the row (1.18.3 and 1.18.5). The version bump + filemtime cache
   buster takes care of the latter; this rule pins the former.
   ═══════════════════════════════════════════════════════════════════════════ */
.bfp-res-widget-row .bfp-res-inline-price--offer + .bfp-res-reserve-btn {
    margin-left: 2px !important;
}

.bfp-res-widget-row > .bfp-res-inline-price--offer {
    margin-right: 0 !important;
    /* 1.18.9: explicit max-width clamp so the offer wrapper doesn't
       leave a trailing "pseudo gap" on its right edge in themes that
       give inline-flex elements an extra flex-shrink-derived width.
       150px comfortably fits the "Offer:" label + "$" chip + the 90px
       input below, with no room for stray slack. */
    max-width: 150px;
}

/* Defensive: clear any margin a theme might be injecting between flex
   children inside the row. Some block-editor themes (Twenty Twenty-Four,
   recent Astra builds) set `margin-block: 1em` on direct children of
   post content; the row sits inside post content via the_content
   filter, so its flex children inherit. The explicit 0 below blocks
   that override without affecting the row's own gap. */
.bfp-res-widget-row > .bfp-res-widget-label,
.bfp-res-widget-row > .bfp-res-widget-select,
.bfp-res-widget-row > .bfp-res-inline-price,
.bfp-res-widget-row > .bfp-res-reserve-btn,
.bfp-res-widget-row > .bfp-res-counter {
    margin-block: 0;
    margin-top: 0;
    margin-bottom: 0;
}
