/* =====================================================================
   Beyond Journey - Holiday package listing
   ---------------------------------------------------------------------
   Scoped entirely under .bjl. The site template reuses .trend-item,
   .team-list and .our-team on 40+ other pages, so nothing here may be
   written unscoped.

   WHAT THIS BORROWS, AND WHY

   TourRadar and MakeMyTrip both list packages as wide horizontal rows
   rather than a grid of cards, and that is not a style choice. A flight
   or a hotel can be judged from four numbers; a package needs its route,
   its night split, its inclusions and its price visible at once, and a
   240px grid cell cannot hold that without turning into a stack of
   coloured chips. So: rows.

     from MakeMyTrip   the city-wise night split ("2N Munnar - 1N Alleppey"),
                       the inclusion strip, and filters carrying live counts
     from TourRadar    a per-day price so trips of different lengths can be
                       compared honestly, and rating shown with its sample
                       size rather than as a bare star

   WHAT IT DELIBERATELY DOES NOT BORROW

   Both sites paper their cards in red urgency badges - "3 seats left",
   "Deal of the day", "Save 42%". That is a discount-aggregator language
   and it is what made an earlier version of this page read as cheap. Here
   there is one accent colour and it appears on exactly two things: the
   primary button, and the active state of a control. A saving is shown by
   a struck-through price, which says the same thing without shouting.

   TYPE: package names are set in the display serif because they are the
   editorial object on the page. Everything else - labels, filters, prices,
   counts - is UI and stays in the sans face. Prices use tabular figures so
   they line up in a column.
   ===================================================================== */

/* ---------------------------------------------------------------------
   SITE-LOCAL, NOT IN THE REFERENCE COPY OF THIS FILE - keep on re-copy.
   The reference sets the base type in css/style.css (body 16px / 1.6),
   and every component below sizes its line-height from that base. This
   site's copy of style.css predates that change (15px / 1.5), so the
   listing pages set the base themselves, on the body class they carry.
   --------------------------------------------------------------------- */
body.bjl-solo-sticky {
  font-size: 16px;
  line-height: 1.6;
}
/* likewise the template's h2 line-height (1.25 in the reference, 1.2 here),
   which the rail's "Filters" heading inherits */
body.bjl-solo-sticky h2 {
  line-height: 1.25;
}

.bjl {
  /* brand */
  --bjl-navy: #17233e;
  --bjl-orange: #f5761a;
  --bjl-orange-600: #d9600d;      /* 4.6:1 on white - safe for text */
  --bjl-orange-50: #fdf4ec;

  /* neutrals - warm, not grey. A cool grey ground reads as an admin panel. */
  --bjl-ink: #17233e;
  --bjl-muted: #5a6377;
  --bjl-faint: #8b93a5;
  --bjl-line: #e6e3dc;
  --bjl-line-soft: #f1efe9;
  --bjl-surface: #ffffff;
  --bjl-paper: #faf8f5;

  --bjl-ok: #1a7f4b;

  --bjl-s1: 4px;  --bjl-s2: 8px;  --bjl-s3: 12px; --bjl-s4: 16px;
  --bjl-s5: 24px; --bjl-s6: 32px; --bjl-s7: 44px;

  --bjl-r: 10px;
  --bjl-ease: cubic-bezier(.4, 0, .2, 1);

  /* The site's own stack, as css/style.css declares it and as the package
     pages load it. This file previously asked for Playfair and Manrope,
     which those pages do not load - so every heading fell back to Georgia,
     a far wider serif that pushed lines into each other. */
  --bjl-display: 'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif;
  --bjl-ui: 'Poppins', 'Segoe UI', system-ui, -apple-system, sans-serif;

  font-family: var(--bjl-ui);
  color: var(--bjl-ink);
}

/* style.css sets `section { padding: 4.5rem 0 5rem }` globally, which drops
   a blank band inside anything we use as a panel. :where() carries zero
   specificity, so this cancels it without having to be out-specified later. */
.bjl :where(section, aside) { padding: 0; margin: 0; }

/* No top padding: the navy band sits flush under the site header, so the
   page opens as two clean blocks instead of white / cream gap / navy. */
.bjl-page { background: var(--bjl-paper); padding: 0 0 var(--bjl-s7); min-height: 70vh; }
.bjl :focus-visible { outline: 2px solid var(--bjl-orange); outline-offset: 2px; border-radius: 6px; }
.bjl-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* Prices sit in a column and in struck-through pairs; proportional figures
   make both ragged. */
.bjl-price, .bjl-row__aside, .bjl-facet__count { font-variant-numeric: tabular-nums lining-nums; }

/* ---------------------------------------------------------------
   Breadcrumb + page head
   --------------------------------------------------------------- */
.bjl-crumb { font-size: 12.5px; color: var(--bjl-faint); margin-bottom: var(--bjl-s4); }
.bjl-crumb ol { display: flex; flex-wrap: wrap; gap: var(--bjl-s2); list-style: none; margin: 0; padding: 0; }
.bjl-crumb a { color: var(--bjl-faint); }
.bjl-crumb a:hover { color: var(--bjl-orange-600); }
.bjl-crumb li + li::before { content: "/"; margin-right: var(--bjl-s2); opacity: .55; }
.bjl-crumb [aria-current="page"] { color: var(--bjl-muted); }

/* ---------------------------------------------------------------
   Banner + search panel
   ---------------------------------------------------------------
   The photograph under the navy scrim carries the page identity; the
   panel under the title actually searches - it filters this page in
   place rather than bouncing back to the holiday hub.
   --------------------------------------------------------------- */
.bjl-hero {
  position: relative; overflow: hidden;
  background: var(--bjl-navy);
  /* Slim identity band. The extra bottom padding is the measured seat for
     the widget that straddles its lower edge - the composition every
     holiday site uses, kept SHORT so the widget still sits high. */
  padding: 18px 0 58px;
}
.bjl-hero__bg {
  position: absolute; inset: 0;
  background-size: cover; background-position: center;
}
.bjl-hero__bg::after {
  content: ""; position: absolute; inset: 0;
  /* near-opaque: at 130px tall the photograph is texture, not a picture,
     and any more of it reads as noise behind the type */
  background: linear-gradient(180deg, rgba(16, 26, 46, .9) 0%, rgba(23, 35, 62, .84) 100%);
}
.bjl-hero .container { position: relative; z-index: 1; }

.bjl-hero .bjl-crumb { margin-bottom: 8px; }
.bjl-crumb--light, .bjl-crumb--light a { color: rgba(255, 255, 255, .65); }
.bjl-crumb--light a:hover { color: #fff; }
.bjl-crumb--light [aria-current="page"] { color: rgba(255, 255, 255, .9); }

.bjl-hero h1 {
  font-family: var(--bjl-display);
  font-size: 23px; font-weight: 700; line-height: 1.18; letter-spacing: -.025em;
  margin: 0 0 4px; color: #fff; text-transform: none;
}
/* One line of context - count, length range, entry price - answering "is
   this worth my time" before any scrolling. */
.bjl-hero__meta { font-size: 13px; color: rgba(255, 255, 255, .78); margin: 0; }
.bjl-hero__meta strong { color: #fff; font-weight: 700; }
.bjl-hero__meta .sep { opacity: .5; margin: 0 8px; }

/* ---------------------------------------------------------------
   The one sticky thing on this page
   ---------------------------------------------------------------
   The user's model, and it is the right one: the search widget follows
   you, nothing else does. So the site header is returned to normal flow
   HERE ONLY (it stays sticky on every other page), the filter rail
   scrolls with the page, and the widget dock pins at the very top.
   --------------------------------------------------------------- */
/* `relative`, not `static`. Static was the bug behind "the blue strip
   opens behind the search panel and gets cut": z-index only applies to a
   POSITIONED element, so `position: static` silently threw away the
   header's z-index:1000, and a positioned element paints above a
   non-positioned one whatever the numbers say - so .bjl-dock (sticky,
   z-index 900) covered the header and clipped every open mega panel.
   `relative` with no offsets keeps the header in normal flow, so it still
   scrolls away and the widget is still the only sticky thing on the page,
   but its z-index counts again. */
body.bjl-solo-sticky .main_header_area {
  position: relative;
  /* `top: -65px` on the base rule is there to slide the strip out of view as
     the sticky header pins. Under `sticky` it only applies once you scroll;
     under `relative` it applies at once, and it pulled the whole header up by
     exactly the strip's height - which is why the blue strip vanished from
     this page. It has to be cancelled explicitly. */
  top: auto;
  z-index: 1000;
}

.bjl-dock {
  position: sticky; top: 0;
  /* under the mega-menu panels (1000+) and any modal, above everything
     on the page itself */
  z-index: 900;
  /* pulls the widget up onto the band's seat - the two numbers are a
     matched pair with the band's 58px bottom padding */
  margin-top: -44px;
}
.bjl-dock.is-stuck { padding: 7px 0; }
/* Once pinned, the widget needs a ground behind it or page content shows
   in the side gutters as it scrolls past. Frosted paper, full width. */
.bjl-dock.is-stuck {
  background: rgba(250, 248, 245, .94);
  -webkit-backdrop-filter: blur(7px); backdrop-filter: blur(7px);
  border-bottom: 1px solid var(--bjl-line);
}
.bjl-dock.is-stuck .bjl-panel {
  box-shadow: 0 6px 20px -12px rgba(11, 17, 32, .3);
}

/* ---------------------------------------------------------------
   The widget itself
   ---------------------------------------------------------------
   One white bar, fields divided by hairlines, in the anatomy every
   holiday site trains people on: icon, small caps label, bold value with
   its own chevron. The selects are real <select>s dressed up - no
   custom dropdown JS to get wrong.
   --------------------------------------------------------------- */
.bjl-panel {
  display: flex; align-items: stretch; gap: 0;
  background: var(--bjl-surface);
  border: 1px solid var(--bjl-line);
  border-radius: 14px; padding: 5px;
  box-shadow: 0 3px 12px -6px rgba(11, 17, 32, .18);
}
.bjl-panel__field {
  flex: 1 1 0; min-width: 0;
  display: flex; align-items: center; gap: 11px;
  padding: 7px 13px; border-radius: 9px;
  transition: background .18s var(--bjl-ease);
}
.bjl-panel__field:hover, .bjl-panel__field:focus-within { background: var(--bjl-paper); }
.bjl-panel__field + .bjl-panel__field { border-left: 1px solid var(--bjl-line-soft); }

.bjl-panel__ico { color: var(--bjl-orange); font-size: 15px; flex: 0 0 auto; }
.bjl-panel__ctl { min-width: 0; flex: 1; text-align: left; }

/* ---------------------------------------------------------------
   Custom dropdowns
   ---------------------------------------------------------------
   Native <select> popups cannot be styled, and next to a designed page
   they read as someone else's UI. Each cell is therefore one full-bleed
   <button> - a tap anywhere on the cell opens OUR panel: a styled list
   with the current choice ticked, or steppers for travellers. On phones
   the same panel rises as a bottom sheet under a scrim, which is the
   pattern every travel app trains people on.
   --------------------------------------------------------------- */
.bjl-dd { position: relative; padding: 0; }
.bjl-dd__btn {
  display: flex; align-items: center; gap: 11px;
  width: 100%; height: 100%; padding: 7px 13px;
  border: 0; border-radius: 9px; background: transparent;
  font-family: inherit; cursor: pointer; text-align: left;
}
.bjl-dd__label {
  display: block; font-size: 9.5px; font-weight: 700;
  letter-spacing: .11em; text-transform: uppercase;
  color: var(--bjl-faint); margin: 0 0 1px;
}
.bjl-dd__value {
  display: block; font-size: 15.5px; font-weight: 700; color: var(--bjl-ink);
  line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.bjl-dd__chev { font-size: 9px; color: var(--bjl-faint); flex: 0 0 auto; transition: transform .2s var(--bjl-ease); }
.bjl-dd.is-open .bjl-dd__chev { transform: rotate(180deg); }
.bjl-dd.is-open > .bjl-dd__btn { background: var(--bjl-paper); }

.bjl-dd__pop {
  position: absolute; top: calc(100% + 10px); left: 0; z-index: 60;
  min-width: 250px; max-height: 340px; overflow-y: auto;
  background: var(--bjl-surface);
  border: 1px solid var(--bjl-line); border-radius: 12px;
  box-shadow: 0 10px 34px -10px rgba(11, 17, 32, .35);
  padding: 6px;
}
/* the travellers panel sits at the row's right edge; opening left would
   push it off-screen */
.bjl-dd__pop--right { left: auto; right: 0; }

.bjl-dd__list { display: flex; flex-direction: column; gap: 2px; }

/* On desktop the sheet header is unnecessary chrome - closing is a click
   anywhere outside. It exists for the phone sheet. */
.bjl-dd__sheethead { display: none; }

.bjl-dd__opt {
  display: flex; align-items: center; gap: 10px;
  width: 100%; padding: 10px 12px; border: 0; border-radius: 8px;
  background: transparent; font-family: inherit; cursor: pointer; text-align: left;
  font-size: 13.5px; color: var(--bjl-ink);
  transition: background .15s var(--bjl-ease);
}
.bjl-dd__opt:hover, .bjl-dd__opt:focus-visible { background: var(--bjl-paper); }
.bjl-dd__opt small { margin-left: auto; font-size: 11.5px; color: var(--bjl-faint); }
.bjl-dd__opt .tick { margin-left: auto; color: var(--bjl-orange-600); font-size: 11px; }
.bjl-dd__opt small + .tick, .bjl-dd__opt .tick + small { margin-left: 8px; }
.bjl-dd__opt[aria-selected="true"] {
  background: var(--bjl-orange-50); font-weight: 700; color: var(--bjl-orange-600);
}

/* travellers rows: label left, round steppers right */
.bjl-dd__row {
  display: flex; align-items: center; justify-content: space-between; gap: var(--bjl-s4);
  padding: 11px 10px;
}
.bjl-dd__row + .bjl-dd__row { border-top: 1px solid var(--bjl-line-soft); }
.bjl-dd__rowtxt strong { display: block; font-size: 13.5px; }
.bjl-dd__rowtxt small { display: block; font-size: 11px; color: var(--bjl-faint); }
.bjl-dd__step { display: inline-flex; align-items: center; gap: 12px; }
.bjl-dd__step b { min-width: 18px; text-align: center; font-size: 14px; }
.bjl-dd__step button {
  width: 30px; height: 30px; border-radius: 50%; cursor: pointer;
  border: 1px solid var(--bjl-line); background: var(--bjl-surface);
  color: var(--bjl-ink); font-size: 15px; line-height: 1; font-family: inherit;
  transition: border-color .15s var(--bjl-ease), color .15s var(--bjl-ease);
}
.bjl-dd__step button:hover:not([disabled]) { border-color: var(--bjl-orange); color: var(--bjl-orange-600); }
.bjl-dd__step button[disabled] { opacity: .35; cursor: not-allowed; }
.bjl-dd__done { width: calc(100% - 12px); margin: 8px 6px 4px; }

/* one shared scrim behind the phone sheet */
.bjl-dd-scrim {
  /* BELOW the dock (900) on purpose: the widget and its open panel stay
     bright while the rest of the page dims - the spotlight effect - and
     that holds by arithmetic, not by paint-order luck. */
  position: fixed; inset: 0; z-index: 890;
  background: rgba(16, 26, 46, .48);
  opacity: 0; pointer-events: none; transition: opacity .2s var(--bjl-ease);
}
.bjl-dd-scrim.is-on { opacity: 1; pointer-events: auto; }

.bjl-panel__go {
  flex: 0 0 auto; align-self: center;
  margin-left: 7px; padding: 11px 24px; font-size: 14px; border-radius: 10px;
}

@media (max-width: 1199px) {
  .bjl-dd__btn { padding: 7px 9px; gap: 8px; }
  .bjl-panel__go { padding: 11px 18px; }
}

/* ---- phone: the panel becomes a bottom sheet ---- */
@media (max-width: 767px) {
  .bjl-dd__pop, .bjl-dd__pop--right {
    position: fixed; left: 0; right: 0; bottom: 0; top: auto; z-index: 950;
    min-width: 0; max-height: 70vh;
    /* restated: a translucent sheet over content is unreadable, and this
     must not depend on inheriting the base rule */
    background: var(--bjl-surface);
    border-radius: 16px 16px 0 0; border: 0;
    box-shadow: 0 -10px 40px -10px rgba(11, 17, 32, .5);
    padding: 0 10px calc(10px + env(safe-area-inset-bottom, 0px));
  }
  .bjl-dd__sheethead {
    display: flex; align-items: center; justify-content: space-between;
    position: sticky; top: 0; background: var(--bjl-surface);
    padding: 14px 6px 10px; margin-bottom: 4px;
    border-bottom: 1px solid var(--bjl-line-soft);
    font-size: 15px;
  }
  .bjl-dd__close {
    width: 30px; height: 30px; border: 0; border-radius: 50%;
    background: var(--bjl-paper); color: var(--bjl-muted);
    cursor: pointer; font-size: 13px;
  }
  .bjl-dd__opt { padding: 13px 12px; font-size: 15px; }
}

@media (max-width: 991px) {
  /* pinning a wrapped multi-row widget would eat half a phone screen */
  .bjl-dock { position: static; margin-top: 0; padding: 12px 0 0; }
  /* and with no straddle, the band does not need its seat */
  .bjl-hero { padding-bottom: 20px; }
  .bjl-panel { flex-wrap: wrap; gap: 4px; }
  .bjl-panel__field { flex: 1 1 46%; }
  .bjl-panel__field + .bjl-panel__field { border-left: 0; }
  .bjl-panel__field--trav { flex: 1 1 100%; }
  .bjl-panel__go { flex: 1 1 100%; margin-left: 0; }
}
@media (max-width: 767px) {
  .bjl-hero h1 { font-size: 24px; }
}

/* ---------------------------------------------------------------
   Shell
   --------------------------------------------------------------- */
.bjl-shell {
  display: grid; grid-template-columns: 248px 1fr; gap: var(--bjl-s6); align-items: start;
  margin-top: 26px;
}

/* ---------------------------------------------------------------
   Filter rail
   ---------------------------------------------------------------
   Boxed white panel, the way MakeMyTrip draws its rail - the box is what
   makes the filters read as one instrument rather than loose text
   floating beside the results. Gets its own scrollbar so a long
   destination list scrolls inside the rail, not the page.
   --------------------------------------------------------------- */
.bjl-filters {
  /* Deliberately NOT sticky - on this page only the search widget follows
     the scroll. The rail is an ordinary boxed panel that moves with the
     page. */
  background: var(--bjl-surface);
  border: 1px solid var(--bjl-line); border-radius: 12px;
  padding: var(--bjl-s4) var(--bjl-s4) var(--bjl-s2);
}
.bjl-filters__top {
  display: flex; align-items: baseline; gap: var(--bjl-s2);
  padding-bottom: var(--bjl-s3); border-bottom: 1px solid var(--bjl-line);
}
.bjl-filters__top h2 {
  font-family: var(--bjl-ui);
  font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .12em;
  margin: 0; color: var(--bjl-ink);
}
.bjl-facetgroup { padding: var(--bjl-s5) 0; border-bottom: 1px solid var(--bjl-line-soft); }
.bjl-facetgroup:last-child { border-bottom: 0; }
.bjl-facetgroup > h3 {
  font-family: var(--bjl-ui);
  font-size: 12.5px; font-weight: 700; margin: 0 0 var(--bjl-s3); color: var(--bjl-ink);
  text-transform: none; letter-spacing: -.01em;
}

.bjl-facet {
  display: flex; align-items: center; gap: 10px; cursor: pointer;
  padding: 5px 0; font-size: 13.5px; color: var(--bjl-muted);
  transition: color .18s var(--bjl-ease);
}
.bjl-facet:hover { color: var(--bjl-ink); }
.bjl-facet input { accent-color: var(--bjl-orange); width: 15px; height: 15px; cursor: pointer; flex: 0 0 auto; }
.bjl-facet__label { flex: 1; min-width: 0; }
.bjl-facet__count { font-size: 12px; color: var(--bjl-faint); }
.bjl-facet.is-empty { opacity: .42; cursor: not-allowed; }

.bjl-range { width: 100%; accent-color: var(--bjl-orange); margin: var(--bjl-s2) 0 0; }
.bjl-range-out { display: flex; justify-content: space-between; font-size: 12.5px; color: var(--bjl-muted); margin-top: 6px; }
.bjl-range-out strong { color: var(--bjl-ink); font-weight: 700; }

.bjl-linkbtn {
  background: none; border: 0; padding: 0; cursor: pointer; font-family: inherit;
  font-size: 12.5px; font-weight: 700; color: var(--bjl-orange-600);
}
.bjl-linkbtn:hover { text-decoration: underline; text-underline-offset: 2px; }

/* ---------------------------------------------------------------
   Sort bar + applied filters
   --------------------------------------------------------------- */
.bjl-sortbar {
  display: flex; align-items: center; flex-wrap: wrap; gap: var(--bjl-s2);
  padding-bottom: var(--bjl-s4); margin-bottom: var(--bjl-s4);
  border-bottom: 1px solid var(--bjl-line);
}
.bjl-sortbar__count { font-size: 13.5px; color: var(--bjl-muted); margin: 0 auto 0 0; }
.bjl-sortbar__count strong { color: var(--bjl-ink); font-weight: 700; }
.bjl-sortbar__label { font-size: 12.5px; color: var(--bjl-faint); }

.bjl-sort {
  padding: 6px 13px; border-radius: 999px; cursor: pointer; font-family: inherit;
  border: 1px solid var(--bjl-line); background: transparent;
  font-size: 12.5px; font-weight: 700; color: var(--bjl-muted);
  transition: color .18s var(--bjl-ease), border-color .18s var(--bjl-ease), background .18s var(--bjl-ease);
}
.bjl-sort:hover { color: var(--bjl-ink); border-color: var(--bjl-faint); }
.bjl-sort.is-active { background: var(--bjl-navy); border-color: var(--bjl-navy); color: #fff; }

.bjl-applied { display: flex; flex-wrap: wrap; gap: var(--bjl-s2); margin-bottom: var(--bjl-s4); }
.bjl-applied:empty { display: none; }
.bjl-pill {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 5px 8px 5px 12px; border-radius: 999px;
  background: var(--bjl-orange-50); border: 1px solid rgba(245, 118, 26, .3);
  font-size: 12.5px; font-weight: 700; color: var(--bjl-orange-600);
}
.bjl-pill button {
  border: 0; background: none; color: inherit; cursor: pointer;
  font-size: 15px; line-height: 1; padding: 0 1px;
}
/* ---------------------------------------------------------------
   Result card - two per row
   ---------------------------------------------------------------
   The MakeMyTrip anatomy, restacked vertically at the user's request:
   photo on top, details under it, price and action as the card footer -
   and two cards to a row, so a screen compares four trips at once
   instead of scrolling one full-width row at a time.

   Everything the wide row carried survives the restack: the carousel
   and save heart on the photo, the rating pill beside the name, the
   duration/destination chips, the night-split drawn as connected dots,
   the inclusion strip, and the dashed rule that separates "what this
   trip is" from "what it costs".
   --------------------------------------------------------------- */
.bjl #bjlResults {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
  align-items: stretch;
}

.bjl-row {
  position: relative;
  display: flex; flex-direction: column;
  padding: 10px;
  background: var(--bjl-surface);
  border: 1px solid var(--bjl-line);
  border-radius: 12px;
  transition: border-color .2s var(--bjl-ease), box-shadow .2s var(--bjl-ease);
}
.bjl-row:hover {
  border-color: #d8d3c8;
  box-shadow: 0 2px 4px rgba(23, 35, 62, .04), 0 14px 30px -16px rgba(23, 35, 62, .32);
}

/* ---- photo ---- */
.bjl-row__media {
  position: relative; overflow: hidden; flex: 0 0 auto;
  border-radius: 8px;
  background: var(--bjl-line-soft);
  /* wider than the old side-photo: this is now the card's whole top */
  aspect-ratio: 16 / 9;
}
.bjl-row__media img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform .6s var(--bjl-ease);
}
.bjl-row:hover .bjl-row__media img { transform: scale(1.04); }
.bjl-row__flag {
  position: absolute; top: 8px; left: 8px; z-index: 3;
  padding: 4px 9px; border-radius: 5px;
  background: rgba(23, 35, 62, .84); color: #fff;
  font-size: 9.5px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
}

/* ---- body ---- */
.bjl-row__main {
  display: flex; flex-direction: column; min-width: 0; flex: 1;
  padding: 12px 4px 0;
}

.bjl-row__top { display: flex; align-items: flex-start; gap: var(--bjl-s3); }
.bjl-row__main h3 {
  font-family: var(--bjl-ui);
  font-size: 15px; font-weight: 700; line-height: 1.32; letter-spacing: -.02em;
  margin: 0; text-transform: none; flex: 1 1 auto; min-width: 0;
}
.bjl-row__main h3 a { color: var(--bjl-ink); }
.bjl-row:hover h3 a { color: var(--bjl-orange-600); }

/* Rating as a filled pill - green because it is a verdict, not an accent. */
.bjl-rate {
  flex: 0 0 auto; display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 8px; border-radius: 5px;
  background: var(--bjl-ok); color: #fff;
  font-size: 11.5px; font-weight: 700;
}
.bjl-rate i { font-size: 9px; }
.bjl-rate small { font-weight: 400; opacity: .85; font-size: 10.5px; }

.bjl-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.bjl-chip {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 9px; border-radius: 5px;
  background: var(--bjl-paper); border: 1px solid var(--bjl-line);
  font-size: 11.5px; color: var(--bjl-muted); white-space: nowrap;
}
.bjl-chip i { color: var(--bjl-orange); font-size: 10px; }

/* ---- the route as dots on a line ----
   The connector is drawn on the list item itself, so it can never fall
   out of step with the number of stops. */
.bjl-stops {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: 8px 0; margin: 11px 0 0; padding: 0; list-style: none;
}
.bjl-stops li {
  position: relative; display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; color: var(--bjl-muted); padding-left: 14px;
}
.bjl-stops li::before {
  content: ""; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--bjl-surface); border: 2px solid var(--bjl-orange);
}
.bjl-stops li + li { margin-left: 20px; }
.bjl-stops li + li::after {
  content: ""; position: absolute; left: -20px; top: 50%;
  width: 20px; height: 1px; background: var(--bjl-line);
}
.bjl-stops b { color: var(--bjl-ink); font-weight: 700; }

/* ---- inclusions ---- */
.bjl-incl {
  display: flex; flex-wrap: wrap; gap: 6px var(--bjl-s3);
  margin: auto 0 0; padding: 11px 0 0; list-style: none;
  border-top: 1px dashed var(--bjl-line);
}
.bjl-incl li { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; color: var(--bjl-muted); }
.bjl-incl i { color: var(--bjl-ok); font-size: 10px; width: 12px; text-align: center; }

/* ---- footer: price left, action right ---- */
.bjl-row__aside {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--bjl-s3);
  margin: 11px 4px 0; padding: 12px 0 2px;
  border-top: 1px dashed var(--bjl-line);
}
.bjl-price { min-width: 0; }
.bjl-price del { font-size: 12px; color: var(--bjl-faint); margin-right: 6px; }
.bjl-price strong {
  font-size: 19px; font-weight: 700;
  color: var(--bjl-ink); line-height: 1.15; letter-spacing: -.02em;
}
.bjl-price span { display: block; font-size: 10.5px; color: var(--bjl-faint); margin-top: 1px; }
.bjl-price__total { display: block; font-size: 10.5px; color: var(--bjl-muted); margin-top: 3px; }
.bjl-price__total b { color: var(--bjl-ink); font-weight: 700; }
.bjl-perday { display: block; font-size: 10.5px; color: var(--bjl-muted); margin-top: 3px; }
.bjl-perday b { color: var(--bjl-ink); font-weight: 700; }

.bjl-row__actions { flex: 0 0 auto; display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
.bjl-row__customise {
  font-size: 11.5px; font-weight: 700; color: var(--bjl-orange-600);
  position: relative; z-index: 2;
}
.bjl-row__customise:hover { text-decoration: underline; text-underline-offset: 2px; }

/* ---- responsive ---- */
@media (max-width: 1199px) {
  .bjl #bjlResults { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 700px) {
  .bjl #bjlResults { grid-template-columns: 1fr; }
}
@media (max-width: 400px) {
  .bjl-row__aside { flex-wrap: wrap; }
  .bjl-row__actions { align-items: stretch; width: 100%; }
  .bjl-row__actions .bjl-btn { width: 100%; }
}

/* The whole card is one hit area; the button stays the real target on top. */
.bjl-row__link::after { content: ""; position: absolute; inset: 0; z-index: 1; }
.bjl-row .bjl-btn { position: relative; z-index: 2; }

/* ---------------------------------------------------------------
   Buttons
   ---------------------------------------------------------------
   One accent colour, and it appears on exactly two things: the primary
   action and the active state of a control. Everything else is a quiet
   outline, so the eye is not asked to choose between five orange things.
   --------------------------------------------------------------- */
.bjl-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  padding: 10px var(--bjl-s4); border: 0; border-radius: 7px;
  background: var(--bjl-orange); color: #fff !important;
  font-family: inherit; font-size: 13px; font-weight: 700; cursor: pointer;
  text-align: center; white-space: nowrap;
  transition: background .18s var(--bjl-ease);
}
.bjl-btn:hover { background: var(--bjl-orange-600); color: #fff !important; }
.bjl-btn--quiet {
  background: transparent; color: var(--bjl-muted) !important;
  border: 1px solid var(--bjl-line);
}
.bjl-btn--quiet:hover {
  background: var(--bjl-paper); color: var(--bjl-ink) !important; border-color: var(--bjl-faint);
}

/* The small kicker line above a compact card title. The result rows no
   longer use one - their facts moved into chips - but the compact card
   still needs it. */
.bjl-kicker {
  font-size: 10.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: var(--bjl-faint); margin: 0 0 6px;
}
.bjl-kicker .sep { opacity: .5; margin: 0 6px; }

/* ---------------------------------------------------------------
   Compact card - the "you may also like" strip on the detail page
   ---------------------------------------------------------------
   A row would be wrong here: these are a sidelong glance at the end of a
   page, not the thing being compared. So the same information, minus the
   night split, the blurb and the inclusion strip.
   --------------------------------------------------------------- */
/* 260px, not 224px. The foot row carries a price and a button side by
   side, and below about 270px of card those two cannot share a line - the
   row wraps and the button drops under the price. Raising the floor drops
   a column earlier instead, which keeps the cards readable and the foot on
   one line at every width down to a phone. Used only by the detail page's
   "you may also like" strip. */
.bjl-cards { display: grid; gap: var(--bjl-s4); grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }

.bjl-card {
  position: relative; display: flex; flex-direction: column; overflow: hidden;
  background: var(--bjl-surface);
  border: 1px solid var(--bjl-line); border-radius: var(--bjl-r);
  transition: border-color .2s var(--bjl-ease), box-shadow .2s var(--bjl-ease);
}
.bjl-card:hover {
  border-color: #d8d3c8;
  box-shadow: 0 2px 4px rgba(23, 35, 62, .04), 0 12px 28px -14px rgba(23, 35, 62, .3);
}
.bjl-card__media { aspect-ratio: 3 / 2; overflow: hidden; background: var(--bjl-line-soft); }
.bjl-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .6s var(--bjl-ease); }
.bjl-card:hover .bjl-card__media img { transform: scale(1.04); }

.bjl-card__body { display: flex; flex-direction: column; flex: 1; padding: var(--bjl-s4); }
.bjl-card__body h3 {
  font-family: var(--bjl-display);
  font-size: 15.5px; font-weight: 700; line-height: 1.3; letter-spacing: -.02em;
  margin: 0; text-transform: none;
}
.bjl-card__body h3 a { color: var(--bjl-ink); }
.bjl-card:hover h3 a { color: var(--bjl-orange-600); }

/* Wraps rather than clips. The grid goes down to 224px columns, and at
   that width the price and the button cannot share a line - flex would
   otherwise squeeze the price, which has no ellipsis and would simply
   spill its digits. Wrapped, the button drops under the price and stays
   right-aligned; on every normal card width they stay on one row. */
.bjl-card__foot {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 8px 10px;
  margin-top: auto; padding-top: var(--bjl-s3);
}
.bjl-card__foot .bjl-price strong { font-size: 18px; }
/* Small, and in the foot row with the price. Full width on its own row it
   outweighed the photograph and the price together - the cheapest way to
   make a compact card look like an advert. `flex: 0 0 auto` keeps it at
   its own width and lets the price column take the squeeze, because the
   price already wraps to two lines and the button cannot. */
.bjl-card__cta {
  flex: 0 0 auto; margin-left: auto;   /* stays right when the row wraps */
  padding: 6px 11px; font-size: 11.5px; border-radius: 6px;
}

/* "per adult" gets its own line on the compact card. Two rules further up
   this file turn it inline for the wide listing row, where the price reads
   as one sentence - here that made the price column ~175px wide, and with
   the button beside it the pair no longer fitted a 280px card, so the row
   wrapped and the button fell underneath. Stacked, the price is ~110px and
   the two sit on one line as intended. */
.bjl-card__foot .bjl-price span {
  display: block; margin-left: 0; margin-top: 1px;
}
.bjl-card__cta i { font-size: 9px; transition: transform .28s var(--bjl-ease); }
.bjl-card:hover .bjl-card__cta i { transform: translateX(4px); }

/* ---------------------------------------------------------------
   Empty state
   --------------------------------------------------------------- */
.bjl-empty {
  text-align: center; padding: var(--bjl-s7) var(--bjl-s5);
  background: var(--bjl-surface); border: 1px solid var(--bjl-line); border-radius: var(--bjl-r);
}
.bjl-empty h3 { font-family: var(--bjl-display); font-size: 20px; font-weight: 700; margin: 0 0 var(--bjl-s2); text-transform: none; }
.bjl-empty p { font-size: 13.5px; color: var(--bjl-muted); max-width: 420px; margin: 0 auto var(--bjl-s5); }
.bjl-empty__actions { display: flex; gap: var(--bjl-s3); justify-content: center; flex-wrap: wrap; }
.bjl-empty .bjl-btn { width: auto; padding: 10px var(--bjl-s5); }

/* ---------------------------------------------------------------
   Responsive
   --------------------------------------------------------------- */
.bjl-filterbtn { display: none; }


@media (max-width: 991px) {
  .bjl-shell { grid-template-columns: 1fr; }
  .bjl-filters {
    position: fixed; inset: 0; z-index: 1050; overflow-y: auto;
    background: var(--bjl-surface); padding: var(--bjl-s5);
    /* the boxed-panel look is for the desktop rail; as a full-screen
       drawer the border and radius would just draw a frame inside the
       viewport edge */
    border: 0; border-radius: 0; max-height: none;
    transform: translateX(-100%); transition: transform .28s var(--bjl-ease);
  }
  .bjl-filters.is-open { transform: none; }
  .bjl-filterbtn { display: inline-flex; }
  .bjl-filters__close { display: inline-flex; margin-left: auto; }
}

.bjl-filters__close { display: none; }


/* ---------------------------------------------------------------
   Photo carousel + save heart
   ---------------------------------------------------------------
   Each package carries four photographs; the card should not spend them.
   Images are stacked in the DOM and toggled - no JSON in attributes, no
   library. Arrows surface on hover (always visible on touch, where there
   is no hover to reveal them).
   --------------------------------------------------------------- */
.bjl-row__media img { display: none; }
.bjl-row__media img.is-on { display: block; }

.bjl-car__btn {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 3;
  width: 28px; height: 28px; border-radius: 50%; border: 0; cursor: pointer;
  background: rgba(255, 255, 255, .92); color: var(--bjl-ink);
  font-size: 11px; display: flex; align-items: center; justify-content: center;
  box-shadow: 0 1px 4px rgba(23, 35, 62, .25);
  opacity: 0; transition: opacity .18s var(--bjl-ease);
}
.bjl-car__btn--prev { left: 8px; }
.bjl-car__btn--next { right: 8px; }
.bjl-row__media:hover .bjl-car__btn,
.bjl-car__btn:focus-visible { opacity: 1; }
@media (hover: none) { .bjl-car__btn { opacity: 1; } }

.bjl-car__dots {
  position: absolute; bottom: 8px; left: 0; right: 0; z-index: 3;
  display: flex; justify-content: center; gap: 5px; pointer-events: none;
}
.bjl-car__dots i {
  width: 6px; height: 6px; border-radius: 50%;
  background: rgba(255, 255, 255, .55);
  box-shadow: 0 0 2px rgba(23, 35, 62, .4);
}
.bjl-car__dots i.is-on { background: #fff; }

/* Save-for-later. Solid heart both ways - the bundled FontAwesome build is
   not guaranteed to carry the outline pack - so the state is told by
   colour: grey means not saved, orange means saved. */
.bjl-heart {
  position: absolute; top: 8px; right: 8px; z-index: 3;
  width: 30px; height: 30px; border-radius: 50%; border: 0; cursor: pointer;
  background: rgba(255, 255, 255, .92);
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 1px 4px rgba(23, 35, 62, .25);
  color: #b6bdc9; font-size: 13px;
  transition: color .18s var(--bjl-ease), transform .18s var(--bjl-ease);
}
.bjl-heart:hover { transform: scale(1.08); }
.bjl-heart.is-on { color: var(--bjl-orange); }

/* "₹90,896 total for 2 adults, incl. tax" - shown only when the traveller
   count actually came from the search, never from an invented default. */
.bjl-price__total { display: block; font-size: 11px; color: var(--bjl-muted); margin-top: 5px; }
.bjl-price__total b { color: var(--bjl-ink); font-weight: 700; }

@media (prefers-reduced-motion: reduce) {
  .bjl *, .bjl *::before, .bjl *::after {
    animation-duration: .01ms !important; transition-duration: .01ms !important;
  }
}

/* ---------------------------------------------------------------
   Hardening (append-only overrides; the cascade wins by order)
   --------------------------------------------------------------- */

/* Card footer: at 3-across between 1200 and 1379px a card is ~269px, and
   "was + now + button" on one line cannot fit - the price slid under the
   button. The struck price now sits on its own small line above the real
   one (as MakeMyTrip does), which fits every price in the dataset. */
.bjl-price del { display: block; margin: 0 0 1px; }
.bjl-row__aside { flex-wrap: wrap; row-gap: 6px; }
.bjl-row__actions { margin-left: auto; }
@media (min-width: 1200px) and (max-width: 1379px) {
  .bjl-price strong { font-size: 17px; }
  .bjl-row__actions .bjl-btn { padding: 9px 13px; }
}

@media (max-width: 767px) {
  /* backdrop-filter makes the stuck dock the containing block for
     position:fixed descendants, so the bottom sheet would pin itself to
     the dock strip instead of the screen. On phones the dock keeps a
     solid paper ground instead of the frosted blur. */
  .bjl-dock.is-stuck {
    -webkit-backdrop-filter: none; backdrop-filter: none;
    background: rgba(250, 248, 245, .97);
  }
  /* the page must not keep scrolling under an open bottom sheet */
  body.bjl-dd-lock { overflow: hidden; }
}

/* ---- standalone card grid (group-departure pages) ----
   Pages like australia-group-departure.html draw the same result card
   without the listing shell (no rail, no search dock). */
.bjl-band { background: var(--bjl-paper); padding: 34px 0 64px; }
.bjl-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
@media (max-width: 1199px) { .bjl-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 700px) { .bjl-grid { grid-template-columns: 1fr; } }

.bjl-secthead { margin: 0 0 20px; max-width: 660px; }
.bjl-secthead h2 {
  font-family: var(--bjl-display); font-size: 26px; font-weight: 700;
  color: var(--bjl-ink); margin: 5px 0 8px;
  text-transform: none; letter-spacing: -.02em;
}
.bjl-secthead__sub { font-size: 13.5px; color: var(--bjl-muted); margin: 0; line-height: 1.65; }

/* "From" over a fixed-departure fare - the price is a floor, not a quote */
.bjl-price__from {
  display: block; font-size: 10px; font-weight: 700;
  letter-spacing: .09em; text-transform: uppercase; color: var(--bjl-faint);
}

/* a filtered-out card: [hidden] loses to .bjl-row's display:flex, so the
   group-departure script toggles this class instead */
.bjl-row.is-off { display: none; }

/* card: "see departure dates" under the actions, and the seniors badge */
.bjl-row__dates {
  font-size: 11.5px; font-weight: 700; color: var(--bjl-muted);
  position: relative; z-index: 2;
}
.bjl-row__dates:hover { color: var(--bjl-orange-600); text-decoration: underline; text-underline-offset: 2px; }
.bjl-chip--senior { background: var(--bjl-orange-50); border-color: transparent; color: var(--bjl-orange-600); font-weight: 700; }
.bjl-chip--senior i { color: var(--bjl-orange-600); }
/* the callback action is a <button> now - keep it reading like the link
   styling it inherits */
button.bjl-row__customise { border: 0; background: none; padding: 0; font-family: inherit; cursor: pointer; }

/* "build it for me" band under the results */
.bjl-custom {
  display: flex; flex-wrap: wrap; align-items: center; gap: 14px 22px;
  margin-top: var(--bjl-s4); padding: 18px 20px;
  background: var(--bjl-surface); border: 1px dashed var(--bjl-line); border-radius: var(--bjl-r);
}
.bjl-custom__txt { flex: 1 1 320px; min-width: 0; }
.bjl-custom strong { display: block; font-size: 14.5px; font-weight: 700; color: var(--bjl-ink); margin-bottom: 2px; }
.bjl-custom span { font-size: 12.5px; line-height: 1.55; color: var(--bjl-muted); }
.bjl-custom .bjl-btn { flex: 0 0 auto; }

/* =====================================================================
   Search panel v2 - every cell reads question / answer / context
   ===================================================================== */
.bjl-dd__sub {
  display: block; margin-top: 1px;
  font-size: 10.5px; line-height: 1.35; color: var(--bjl-faint);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.bjl-dd__value { line-height: 1.25; }
.bjl-panel__field { min-width: 0; }
.bjl-panel__ctl { min-width: 0; }

/* the date cell's popup is a form, not a list */
.bjl-dd__pad { padding: 4px 6px 6px; }
.bjl-dd__flabel {
  display: block; margin: 0 0 5px;
  font-size: 11.5px; font-weight: 700; color: var(--bjl-ink);
}
.bjl-panel .bjl-dd__date {
  width: 100%; height: auto; margin: 0;
  padding: 9px 11px; border: 1px solid var(--bjl-line); border-radius: 8px;
  background: var(--bjl-surface); color: var(--bjl-ink);
  font-family: inherit; font-size: 13px; box-shadow: none;
}
.bjl-panel .bjl-dd__date:focus { outline: none; border-color: var(--bjl-orange); }
.bjl-dd__hint { margin: 8px 0 0; font-size: 11px; line-height: 1.5; color: var(--bjl-faint); }
.bjl-dd__actions {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin-top: 10px;
}
.bjl-dd__actions .bjl-dd__done { margin: 0; }

/* =====================================================================
   Filter rail v2 - collapsible groups, short lists
   ===================================================================== */
details.bjl-facetgroup { border-bottom: 1px solid var(--bjl-line-soft); padding: 0; }
details.bjl-facetgroup:last-child { border-bottom: 0; }
details.bjl-facetgroup > summary {
  display: flex; align-items: center; gap: 8px;
  padding: 13px 2px; cursor: pointer; list-style: none;
  font-size: 12.5px; font-weight: 700; color: var(--bjl-ink);
}
details.bjl-facetgroup > summary::-webkit-details-marker { display: none; }
details.bjl-facetgroup > summary i {
  margin-left: auto; font-size: 10px; color: var(--bjl-faint);
  transition: transform .2s var(--bjl-ease);
}
details.bjl-facetgroup[open] > summary i { transform: rotate(180deg); }
details.bjl-facetgroup > summary:hover { color: var(--bjl-orange-600); }
.bjl-facetgroup__body { padding: 0 2px 14px; }

/* the tail of a long facet list, revealed by "show all" */
.bjl-facet.is-extra { display: none; }
.bjl-facetgroup__body.is-all .bjl-facet.is-extra { display: flex; }
.bjl-more {
  margin-top: 6px; padding: 0; border: 0; background: none;
  font-family: inherit; font-size: 12px; font-weight: 700;
  color: var(--bjl-orange-600); cursor: pointer;
}
.bjl-more:hover { text-decoration: underline; text-underline-offset: 2px; }

/* =====================================================================
   Card v2 - small labels so nothing has to be guessed at
   ===================================================================== */
.bjl-lbl {
  display: block; margin: 0 0 4px;
  font-size: 9.5px; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--bjl-faint);
}
.bjl-stops { margin-bottom: 10px; }
.bjl-incl { margin-top: auto; }
/* the per-day figure is a comparison aid, not a price - say so */
.bjl-perday { font-size: 10.5px; }

@media (max-width: 991px) {
  /* on a phone the panel stacks, so each cell can breathe */
  .bjl-dd__sub { white-space: normal; }
}

/* dropdown option: label over context, tick right */
.bjl-dd__opt { align-items: flex-start; gap: 10px; }
.bjl-dd__opttxt { min-width: 0; flex: 1 1 auto; }
.bjl-dd__opttxt b { display: block; font-weight: inherit; line-height: 1.3; }
.bjl-dd__opt .bjl-dd__opttxt small {
  display: block; margin: 1px 0 0 0;
  font-size: 11px; line-height: 1.4; color: var(--bjl-faint);
  white-space: normal;
}
.bjl-dd__opt[aria-selected="true"] .bjl-dd__opttxt small { color: var(--bjl-orange-600); opacity: .8; }
.bjl-dd__opt .tick { margin-left: 0; flex: 0 0 auto; margin-top: 3px; }
.bjl-dd__actions .bjl-linkbtn { white-space: nowrap; }

/* =====================================================================
   Travel-date calendar (search panel)
   ===================================================================== */
.bjl-cal { width: 268px; max-width: 100%; }
.bjl-cal__nav {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  margin: 0 0 9px;
}
.bjl-cal__nav strong { font-size: 13.5px; color: var(--bjl-ink); }
.bjl-cal__nav button {
  width: 28px; height: 28px; border: 1px solid var(--bjl-line); border-radius: 7px;
  background: var(--bjl-surface); color: var(--bjl-ink); cursor: pointer; font-size: 10px;
}
.bjl-cal__nav button:hover:not(:disabled) { border-color: var(--bjl-orange); color: var(--bjl-orange-600); }
.bjl-cal__nav button:disabled { opacity: .32; cursor: not-allowed; }

.bjl-cal__dow { display: grid; grid-template-columns: repeat(7, 1fr); margin: 0 0 3px; }
.bjl-cal__dow span {
  text-align: center; padding: 3px 0;
  font-size: 9.5px; font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; color: var(--bjl-faint);
}
.bjl-cal__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.bjl-cal__pad { min-height: 34px; }
.bjl-cal__day {
  position: relative; min-height: 34px;
  border: 1px solid transparent; border-radius: 8px;
  background: transparent; color: var(--bjl-ink);
  font-family: inherit; font-size: 12.5px; cursor: pointer;
  font-variant-numeric: tabular-nums;
  transition: background .15s var(--bjl-ease), border-color .15s var(--bjl-ease);
}
.bjl-cal__day:hover:not(:disabled) { background: var(--bjl-paper); border-color: var(--bjl-line); }
.bjl-cal__day.is-today { font-weight: 700; box-shadow: inset 0 0 0 1px var(--bjl-line); }
.bjl-cal__day.is-sel {
  background: var(--bjl-orange); border-color: var(--bjl-orange);
  color: #fff; font-weight: 700;
}
.bjl-cal__day.is-past { color: var(--bjl-faint); opacity: .4; cursor: not-allowed; }
/* a dot marks a day a fixed group departure actually leaves on */
.bjl-cal__day.has-dep::after {
  content: ""; position: absolute; left: 50%; bottom: 4px; transform: translateX(-50%);
  width: 4px; height: 4px; border-radius: 50%; background: var(--bjl-ok);
}
.bjl-cal__day.is-sel.has-dep::after { background: #fff; }
.bjl-cal__key {
  display: flex; align-items: center; gap: 6px;
  margin: 9px 0 0; font-size: 10.5px; color: var(--bjl-faint);
}
.bjl-cal__key i { width: 5px; height: 5px; border-radius: 50%; background: var(--bjl-ok); }

/* =====================================================================
   Card v3 - same information, roughly 140px less of it
   =====================================================================
   The card was running near 600px tall at three across, so a row and a
   half filled a laptop screen. Everything below trims height without
   dropping a fact: the two section labels moved inline, the per-day
   figure went to the detail page, and the actions became one row. */
.bjl-row__media { aspect-ratio: 16 / 10; }
.bjl-row__main { padding: 13px 14px 0; }
.bjl-row__top { margin-bottom: 7px; }
.bjl-row__top h3 { font-size: 15.5px; line-height: 1.3; }
.bjl-chips { gap: 5px; margin-bottom: 8px; }
.bjl-chip { padding: 3px 8px; font-size: 10.5px; }

/* label and content on one line, the label as a lead-in rather than a row */
.bjl-line {
  display: flex; align-items: baseline; gap: 8px;
  margin: 0 0 7px; min-width: 0;
}
.bjl-line .bjl-lbl {
  flex: 0 0 auto; margin: 0;
  font-size: 9px; letter-spacing: .09em; color: var(--bjl-faint);
}
.bjl-line .bjl-stops, .bjl-line .bjl-incl { margin: 0; padding: 0; border: 0; flex: 1 1 auto; min-width: 0; }
.bjl-line--incl { border-top: 1px dashed var(--bjl-line); padding-top: 8px; margin-bottom: 0; }
.bjl-line .bjl-stops li { font-size: 11px; padding-right: 11px; }
.bjl-line .bjl-incl li { font-size: 10.5px; }
.bjl-line .bjl-incl { display: flex; flex-wrap: wrap; gap: 3px 11px; }

.bjl-row__aside {
  display: block; margin: 10px 14px 0; padding: 10px 0 0;
}
.bjl-price strong { font-size: 17px; }
.bjl-price del { display: inline; margin-right: 6px; }
.bjl-price span { display: inline; }
.bjl-row__dates {
  display: block; margin-top: 5px;
  font-size: 11px; font-weight: 700; color: var(--bjl-muted);
}

/* two equal buttons, side by side */
.bjl-row__actions {
  display: grid; grid-template-columns: 1fr 1fr; gap: 7px;
  margin: 11px 14px 14px; padding: 0;
  flex-direction: row; align-items: stretch;
}
.bjl-row__actions .bjl-btn {
  width: auto; padding: 9px 8px; font-size: 12.5px; text-align: center;
  display: flex; align-items: center; justify-content: center;
}
.bjl-btn--quiet {
  background: transparent; color: var(--bjl-ink);
  border: 1px solid var(--bjl-line); font-weight: 700;
}
.bjl-btn--quiet:hover {
  background: var(--bjl-orange-50); color: var(--bjl-orange-600);
  border-color: var(--bjl-orange);
}

@media (max-width: 400px) {
  .bjl-row__actions { grid-template-columns: 1fr; }
}

/* price line reads as one sentence, so the unit needs its own space */
.bjl-price span { margin-left: 5px; font-size: 10.5px; }
.bjl-price__from { display: inline-block; margin-right: 5px; }

/* the calendar needs more room than a six-item list does */
.bjl-dd[data-dd="date"] .bjl-dd__pop { max-height: min(78vh, 470px); }

/* =====================================================================
   Card v4 - the rows line up
   =====================================================================
   The grid already stretched every card in a row to the same height, but
   nothing inside was pinned, so the same block sat at a different height
   in each card: a two-line title pushed everything down, a one-stop route
   left a gap where a three-stop one did not, and the price landed
   wherever the content ended. Reading across a row was work.

   Now every section owns a fixed slot - title two lines, chips one, route
   one, covers one - and the footer is pushed to the bottom. Every card in
   a row shows its price and its buttons on the same line. */
.bjl-row__main { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }

/* two lines, always: a one-line title reserves the second so its
   neighbours do not sit lower */
.bjl-row__top { align-items: flex-start; min-height: 42px; }
.bjl-row__top h3 {
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}

/* one row of chips; a fourth chip scrolls out of sight rather than
   wrapping and shoving the card taller than its neighbours */
.bjl-chips {
  flex-wrap: nowrap; overflow: hidden;
  min-height: 22px;
}
.bjl-chip { flex: 0 0 auto; white-space: nowrap; }

/* route and covers: one line each, capped in bj-package-card.js */
.bjl-line { flex-wrap: nowrap; overflow: hidden; min-height: 20px; }
.bjl-line .bjl-stops, .bjl-line .bjl-incl { flex-wrap: nowrap; overflow: hidden; }
.bjl-line .bjl-stops li, .bjl-line .bjl-incl li { flex: 0 0 auto; white-space: nowrap; }
.bjl-stops__more { color: var(--bjl-orange-600); font-weight: 700; padding-left: 4px; }
.bjl-stops__more::before, .bjl-stops__more::after { display: none !important; }

/* the footer leaves the flow of the body and sits on the floor */
.bjl-row__aside { margin-top: auto; }
.bjl-incl { margin-top: 0; }

/* =====================================================================
   The rail follows the results instead of leaving a dead column
   ===================================================================== */
@media (min-width: 992px) {
  .bjl-filters {
    position: sticky;
    /* clear of the sticky search dock */
    top: 104px;
    max-height: calc(100vh - 124px);
    overflow-y: auto;
    scrollbar-width: thin;
  }
}

/* nothing should ever be clipped mid-word: with the destination chip gone
   and the route and covers capped, one line is enough for all of them */
.bjl-chips { overflow: visible; }
.bjl-line, .bjl-line .bjl-stops, .bjl-line .bjl-incl { overflow: visible; }

/* Between 1200 and 1379 a three-across card is only ~260px wide, and the
   route and the covers list both spill onto a second line - the rows stay
   aligned, but the inner spacing goes ragged. Tighten the two lines and
   drop the third covers item; the full list is on the detail page. */
@media (min-width: 1200px) and (max-width: 1379px) {
  .bjl-line .bjl-incl li:nth-child(n+3) { display: none; }
  .bjl-line .bjl-stops li { font-size: 10.5px; padding-right: 8px; }
  .bjl-line .bjl-stops li b { font-size: 10.5px; }
  .bjl-line .bjl-incl li { font-size: 10px; }
  .bjl-line .bjl-lbl { font-size: 8.5px; letter-spacing: .06em; }
  .bjl-row__actions .bjl-btn { font-size: 11.5px; padding: 9px 4px; }
  .bjl-price strong { font-size: 16px; }
}

/* Three across needs about 300px of content width per card; below 1380
   the third column squeezed the route into an ellipsis and the covers
   list down to two items. Two comfortable cards beat three cramped ones,
   so the third column waits for the room it needs - and the narrow-band
   patches above are no longer reached. */
@media (max-width: 1379px) {
  .bjl #bjlResults { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .bjl-line .bjl-incl li:nth-child(n+3) { display: inline-flex; }
  .bjl-line .bjl-stops li { font-size: 11px; padding-right: 11px; }
  .bjl-line .bjl-stops li b { font-size: 11px; }
  .bjl-line .bjl-incl li { font-size: 10.5px; }
  .bjl-line .bjl-lbl { font-size: 9px; letter-spacing: .09em; }
  .bjl-row__actions .bjl-btn { font-size: 12.5px; padding: 9px 8px; }
  .bjl-price strong { font-size: 17px; }
}
@media (max-width: 700px) {
  .bjl #bjlResults { grid-template-columns: minmax(0, 1fr); }
}

/* =====================================================================
   Filter rail: count badge, and the controls that close a session
   ===================================================================== */
.bjl-filters__n {
  display: inline-grid; place-items: center;
  min-width: 18px; height: 18px; margin-left: 7px; padding: 0 5px;
  border-radius: 999px; background: var(--bjl-orange); color: #fff;
  font-size: 10.5px; font-weight: 700; vertical-align: 1px;
}
.bjl-filters__foot {
  display: grid; grid-template-columns: 1fr 1fr; gap: 7px;
  margin-top: 14px; padding-top: 14px;
  border-top: 1px solid var(--bjl-line);
}
.bjl-filters__foot .bjl-btn {
  padding: 9px 6px; font-size: 12px;
  display: flex; align-items: center; justify-content: center; gap: 6px;
}
.bjl-filters__foot .bjl-btn i { font-size: 10px; }

/* =====================================================================
   End of the results
   ===================================================================== */
.bjl-end { margin-top: var(--bjl-s5); }
.bjl-end[hidden] { display: none; }
.bjl-end__count {
  margin: 0 0 var(--bjl-s4); padding-top: var(--bjl-s4);
  border-top: 1px solid var(--bjl-line);
  text-align: center; font-size: 12.5px; color: var(--bjl-faint);
}
.bjl-end__count strong { color: var(--bjl-ink); }
.bjl-end__count .bjl-linkbtn { font-size: 12.5px; }

.bjl-end__help {
  display: flex; flex-wrap: wrap; align-items: center; gap: 14px 24px;
  padding: 20px 22px; border-radius: var(--bjl-r);
  background: var(--bjl-navy);
}
.bjl-end__txt { flex: 1 1 300px; min-width: 0; }
.bjl-end__txt strong {
  display: block; font-family: var(--bjl-display);
  font-size: 16px; font-weight: 700; color: #fff; margin-bottom: 3px;
}
.bjl-end__txt span { font-size: 13px; line-height: 1.6; color: rgba(255, 255, 255, .74); }
.bjl-end__act { display: flex; flex-wrap: wrap; gap: 8px; flex: 0 0 auto; }
.bjl-end__act .bjl-btn { padding: 10px 18px; font-size: 13px; }
.bjl-end__act .bjl-btn--quiet {
  background: transparent; color: #fff; border-color: rgba(255, 255, 255, .3);
}
.bjl-end__act .bjl-btn--quiet:hover {
  background: rgba(255, 255, 255, .1); color: #fff; border-color: rgba(255, 255, 255, .5);
}

@media (max-width: 575px) {
  .bjl-end__help { padding: 18px; }
  .bjl-end__act { width: 100%; }
  .bjl-end__act .bjl-btn { flex: 1 1 0; }
}

/* WhatsApp is a channel, not a generic secondary action - a ghost button
   on navy read as disabled. Its own green removes the ambiguity. */
.bjl-btn--wa {
  background: #25d366; color: #fff; border: 0; font-weight: 700;
  display: inline-flex; align-items: center; justify-content: center;
}
.bjl-btn--wa:hover { background: #1eb658; color: #fff; }

/* =====================================================================
   Card v3 - nothing truncated, no lead-in labels, rating in the chip row
   ---------------------------------------------------------------------
   Every stop of the route and every inclusion is shown; the lines wrap
   rather than cut off with "+3". The green rating pill sits in the same
   row as the duration and sharing chips. Names run to two lines and
   reserve those two lines, so a one-line name does not pull its chips
   up out of step with the card beside it. The footers still meet: the
   cards stretch to the tallest in their row and the inclusions sit on
   margin-top:auto.
   ===================================================================== */
.bjl-row__main h3 {
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; min-height: calc(1.3em * 2);
}
.bjl-chips { flex-wrap: wrap; overflow: visible; min-height: 0; }
.bjl-chips .bjl-rate { order: -1; padding: 3px 8px; font-size: 10.5px; }
.bjl-line { flex-wrap: wrap; overflow: visible; min-height: 0; }
.bjl-line .bjl-stops, .bjl-line .bjl-incl { flex-wrap: wrap; overflow: visible; }
.bjl-line .bjl-stops { gap: 6px 0; }
.bjl-line .bjl-stops li + li { margin-left: 18px; }
.bjl-line .bjl-stops li + li::after { left: -18px; width: 18px; }
.bjl-lbl { display: none; }

/* a package listed before its fare */
.bjl-price__por { font-size: 15px; letter-spacing: 0; }
.bjl-row__aside .bjl-price__por + span { display: block; }
