/* ==========================================================================
   Jay Shree Ashapura - product pages

   Loaded only on product pages. Every rule is namespaced under .jsa-page and
   every custom class carries a jsa- prefix, so nothing here can collide with
   the Litho theme's style.css / responsive.css.

   Font size and font weight are NOT set here. They come from the theme's own
   utilities in the markup - .text-extra-small / .text-small / .text-medium /
   .text-extra-medium / .text-large / .text-extra-large, and .font-weight-400
   through .font-weight-700. The only exceptions are the two display headings
   and the icon glyph, which have no matching utility; each is commented.
   ========================================================================== */

.jsa-page {
    /* Palette taken from the machines themselves, not from Litho's demo green. */
    --jsa-blue: #1b4f8c;
    --jsa-blue-deep: #12203a;
    --jsa-amber: #ec5902;
    --jsa-ash: #c9cfd6;
    --jsa-ash-pale: #eef1f4;
    --jsa-ink: #232323;
    --jsa-body: #828282;
    --jsa-rule: #dde2e8;
    --jsa-mono: ui-monospace, "Cascadia Mono", "SF Mono", Consolas, "Liberation Mono", monospace;
}

/* Spec data reads as instrument output, not prose. */
.bg-light-theme {
    background-color: #f2f8ff;
}

.jsa-page .jsa-eyebrow {
    color: #ec5902;
    font-family: Poppins, sans-serif;
        margin-bottom: 8px;
}

/* ---------- hero ---------- */
.jsa-hero {
    background-color: var(--jsa-blue-deep);
    background-position: center right;
    background-size: cover;
    background-repeat: no-repeat;
    position: relative;
    overflow: hidden;
}

.jsa-hero::before {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(100deg, rgb(10 10 10 / 78%) 0%, rgb(16 16 16 / 80%) 42%, rgb(14 14 14 / 60%) 100%);
    pointer-events: none;
}

.jsa-hero > .container {
    position: relative;
    z-index: 1;
}

/* Display size: no theme text utility goes this large. */
.jsa-hero h1 {
    color: #fff;
    font-size: 46px;
    line-height: 1.15;
    margin: 0;
}

.jsa-hero .jsa-eyebrow {
    color: var(--jsa-amber);
}

.jsa-hero p {
    color: rgba(255, 255, 255, .78);
}

.jsa-range {
    display: flex;
    flex-wrap: wrap;
    border-top: 1px solid rgba(255, 255, 255, .18);
    padding-top: 26px;
}

.jsa-range > div {
    flex: 1 1 auto;
    padding-right: 44px;
}

.jsa-range-label {
    color: rgba(255, 255, 255, .55);
    margin-bottom: 6px;
}

.jsa-range-value {
    color: #fff;
}

/* ---------- breadcrumb ---------- */
.jsa-crumb {
    color: rgba(255, 255, 255, .6);
    margin-bottom: 22px;
}

.jsa-crumb a {
    color: rgba(255, 255, 255, .6);
}

.jsa-crumb a:hover,
.jsa-crumb a:focus {
    color: var(--jsa-amber);
}

.jsa-crumb span[aria-current] {
    color: #fff;
}

.jsa-crumb i {
    font-style: normal;
    padding: 0 8px;
    opacity: .45;
}

/* ---------- overview, directly under the banner ---------- */
/* Display size: falls between the theme's h2 and h3, no utility matches. */

.jsa-intro p {
    margin-bottom: 20px;
}

.jsa-intro p:last-child {
    margin-bottom: 0;
}

/* ---------- capability band ---------- */
.jsa-cap {
    border-top: 1px solid var(--jsa-rule);
    padding: 26px 22px 26px 0;
    height: 100%;
}

.jsa-cap-figure {
    color: var(--jsa-blue);
    margin-bottom: 8px;
}

.jsa-cap-title {
    margin-bottom: 10px;
}

.jsa-cap p {
    color: var(--jsa-body);
}

/* ---------- mould plate ----------
   Brick glyphs at the true 9:4 face ratio, laid out at the machine's real
   cavity count, so the picture is the specification. */
.jsa-mould {
    --b: 30px;
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    width: calc(var(--b) * 6 + 20px);
    justify-content: center;
    padding: 8px;
    border: 1px dashed var(--jsa-ash);
    border-radius: 15px;
}

.jsa-brick {
    width: var(--b);
    height: calc(var(--b) * 4 / 9);
    background: linear-gradient(180deg, #b9c1ca 0%, #97a2ae 100%);
    border-radius: 15px;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, .55);
}

/* ---------- model figure ----------
   Sits above its own detail block now, so it is not sticky. Fixed panel shape
   with object-fit:contain: the five photographs run from 0.75 to 2.00 aspect,
   and a fixed panel stops the layout jumping as tabs are switched. */
.jsa-figure {
    border: 1px solid var(--jsa-rule);
    padding: 10px;
    background: #e1eaf5;
}

.jsa-figure > img {
    width: 100%;
    /* height: 420px; */
    object-fit: contain;
    display: block;
}

.jsa-figure figcaption {
    color: var(--jsa-body);
    padding: 12px 4px 2px;
    text-align: center;
}

.jsa-figure-plate {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 16px;
    aspect-ratio: 4 / 3;
    background: var(--jsa-blue-deep);
}

.jsa-figure-plate .jsa-mould {
    --b: 42px;
    border-color: rgba(255, 255, 255, .35);
}

.jsa-figure-plate small {
    color: rgba(255, 255, 255, .6);
}

.jsa-plate-code {
    color: var(--jsa-blue);
}
.jsa-plate-name {
    font-size: 30px;
    line-height: 1.2;
    text-transform: uppercase;
}
/* ---------- per-model specification ---------- */
.jsa-spec {
    width: 100%;
    border-collapse: collapse;
    border: 1px solid var(--jsa-rule);
}

.jsa-spec th,
.jsa-spec td {
    font-family: Poppins, sans-serif;
    padding: 13px 25px;
    text-align: left;
    vertical-align: top;
    border-bottom: 1px solid var(--jsa-rule);
}

.jsa-spec tr:last-child th,
.jsa-spec tr:last-child td {
    border-bottom: 0;
}

.jsa-spec th {
    background: #e1eaf5;
}

.jsa-spec td {
    color: var(--jsa-body);
}

/* ---------- products this machine makes ---------- */
.jsa-prod {
    border-radius: 15px;
    background: #fff;
    height: 100%;
}

.jsa-prod:hover,
.jsa-prod:focus-within {
    /* border-color: var(--jsa-blue); */
    box-shadow: 0 10px 30px rgba(18, 32, 58, .09);
}

.jsa-prod-fig {
    background: var(--jsa-ash-pale);
    border-bottom: 1px solid var(--jsa-rule);
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
}

.jsa-prod-fig img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.jsa-prod-body {
    padding: 22px 24px 24px;
}

.jsa-prod-body h4 {
    margin: 0 0 8px;
    line-height: 1.4;
}

.jsa-prod-body p {
    color: var(--jsa-body);
    margin: 0;
}

.jsa-prod-size {
    color: var(--jsa-blue);
    margin-top: 12px;
}

/* Drawn stand-ins, used only where no photograph of the product exists yet. */
.jsa-glyph {
    width: 96px;
    height: 58px;
    position: relative;
    background: linear-gradient(180deg, #b9c1ca 0%, #97a2ae 100%);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, .55);
    border-radius: 15px;
}

.jsa-glyph-hollow::before,
.jsa-glyph-hollow::after {
    content: "";
    position: absolute;
    top: 22%;
    bottom: 22%;
    width: 24%;
    background: var(--jsa-ash-pale);
    box-shadow: inset 0 0 0 1px rgba(18, 32, 58, .18);
    border-radius: 15px;
}

.jsa-glyph-hollow::before { left: 14%; }
.jsa-glyph-hollow::after  { right: 14%; }

.jsa-glyph-re {
    width: 86px;
    height: 66px;
    clip-path: polygon(0 0, 46% 0, 46% 58%, 100% 58%, 100% 100%, 0 100%);
    border-radius: 0;
}

/* ---------- why buyers ask for a fly ash brick ---------- */
.jsa-why-box {
    background: #e1eaf5;
    /* border: 1px solid var(--jsa-rule); */
    border-radius: 15px;
    padding: 34px 30px;
    height: 100%;
    transition: border-color .25s, box-shadow .25s, transform .25s;
}

.jsa-why-box:hover,
.jsa-why-box:focus-within {
    border-color: var(--jsa-blue);
    box-shadow: 0 12px 32px rgba(18, 32, 58, .1);
    transform: translateY(-3px);
}

/* Icon glyph, not text: sized here because no text utility applies. */
.jsa-why-icon {
    width: 58px;
    height: 58px;
    border-radius: 50%;
    background: var(--jsa-blue);
    color: var(--jsa-ash-pale);
    font-size: 24px;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 24px;
    transition: background-color .25s, color .25s;
}

.jsa-why-box:hover .jsa-why-icon {
    background: #ccdfeb;
    color: var(--jsa-blue);
}

.jsa-why-box h4 {
    margin: 0 0 12px;
}

.jsa-why-box p {
    color: var(--jsa-body);
    margin: 0;
}

/* ---------- smaller / semi automatic models ----------
   Horizontal card: photo panel left, detail right. The four photographs are
   portrait, landscape and square, so the panel is a fixed shape and the image
   is contained inside it rather than cropped to fill. */
.jsa-alt {
    display: flex;
    align-items: stretch;
    background: #e1eaf5;
    border: 1px solid var(--jsa-rule);
    border-radius: 15px;
    height: 100%;
    overflow: hidden;
    transition: border-color .25s, box-shadow .25s;
}

.jsa-alt:hover,
.jsa-alt:focus-within {
    /* border-color: var(--jsa-blue); */
    box-shadow: 0 14px 34px rgba(18, 32, 58, .1);
}

.jsa-alt-fig {
    flex: 0 0 40%;
    max-width: 40%;
    background: linear-gradient(160deg, #e9eff7 0%, #f2f8ff 100%);
    border-right: 1px solid var(--jsa-rule);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 24px;
}

.jsa-alt-fig img {
    max-width: 100%;
    max-height: 230px;
    width: auto;
    height: auto;
    object-fit: contain;
    display: block;
    mix-blend-mode: multiply;
}

.jsa-alt-body {
    flex: 1 1 auto;
    padding: 28px 30px;
    min-width: 0;
}

.jsa-alt-body h4 {
    margin: 3px 0 12px;
    line-height: 1.4;
}

.jsa-alt-body p {
    color: var(--jsa-body);
    margin: 0;
}

.jsa-alt-spec {
    display: flex;
    flex-wrap: wrap;
    margin-top: 20px;
    padding-top: 18px;
    border-top: 1px solid var(--jsa-rule);
}

.jsa-alt-spec > div {
    flex: 1 1 50%;
    min-width: 120px;
    padding: 6px 14px 6px 0;
}

.jsa-alt-spec-label {
    color: var(--jsa-body);
    margin-bottom: 3px;
}


/* ---------- vertical model tabs ----------
   Own implementation rather than Litho's .tab-style-04, which is padded and
   bordered for a horizontal strip. Bootstrap's tab plugin still drives it, so
   .nav on the container and .nav-link on each control must stay; these rules
   are two classes deep to beat Bootstrap's own .nav-link. */
/* The theme sets `section { overflow: hidden }`, and any overflow other than
   visible on an ancestor silently disables position:sticky below it. This
   section has nothing to clip, so opt it back out. Without this line the
   sticky menu below does nothing at all. */
.jsa-page #models {
    overflow: visible;
}

.jsa-vtabs {
    border-top: 1px solid var(--jsa-rule);
    /* Holds position while the photograph and spec table scroll past. Works
       only because the parent .row has no align-items utility, so the column
       stretches to full row height and gives the menu room to travel. */
    position: sticky;
    top: 100px;
}

.jsa-vtabs .jsa-vtab {
    position: relative;
    display: block;
    padding: 18px 20px 18px 22px;
    border-bottom: 1px solid var(--jsa-rule);
    font-family: Poppins, sans-serif;
    color: var(--jsa-ink);
    background: #e1eaf5;
    transition: background-color .25s, color .25s, padding-left .25s;
}

/* Accent bar on the left edge, drawn only when the tab is current. */
.jsa-vtabs .jsa-vtab::before {
    content: "";
    position: absolute;
    left: 0;
    top: -1px;
    bottom: -1px;
    width: 3px;
    background: var(--jsa-blue);
    transform: scaleY(0);
    transition: transform .25s;
}

/* .jsa-vtabs .jsa-vtab:hover,
.jsa-vtabs .jsa-vtab:focus {
    background: var(--jsa-ash-pale);
    color: var(--jsa-ink);
    padding-left: 26px;
} */
.jsa-vtabs .jsa-vtab:hover,
.jsa-vtabs .jsa-vtab:focus,
.jsa-vtabs .jsa-vtab.active {
    background: var(--jsa-blue);
    color: #fff;
    padding-left: 26px;
}

.jsa-vtabs .jsa-vtab.active::before {
    transform: scaleY(1);
    background: var(--jsa-amber);
}

.jsa-vtab-code {
    color: inherit;
}

.jsa-vtab-cav {
    color: var(--jsa-body);
    margin-top: 6px;
}

.jsa-vtabs .jsa-vtab.active .jsa-vtab-cav {
    color: rgba(255, 255, 255, .72);
}

/* ---------- model detail, under the photograph ---------- */
.jsa-model-detail {
    padding-top: 34px;
}

/* ---------- quality floor ---------- */
.jsa-page a:focus-visible,
.jsa-page button:focus-visible {
    outline: 2px solid var(--jsa-amber);
    outline-offset: 3px;
}

.jsa-page [id] {
    scroll-margin-top: 80px;
}

@media (max-width: 991px) {
    /* Columns stack here: a sticky menu would pin above its own panel. */
    .jsa-vtabs { position: static; }
    .jsa-hero h1 { font-size: 34px; }
    .jsa-intro h2 { font-size: 24px; }
    .jsa-mould { --b: 26px; }
    .jsa-range > div { flex-basis: 50%; padding-right: 16px; }
}

@media (max-width: 767px) {
    /* Stack the horizontal card rather than squeeze it into two thin columns. */
    .jsa-alt { flex-direction: column; }
    .jsa-alt-fig {
        flex: 0 0 auto;
        max-width: 100%;
        border-right: 0;
        border-bottom: 1px solid var(--jsa-rule);
        padding: 30px;
    }
    .jsa-alt-fig img { max-height: 200px; }
    .jsa-alt-body { padding: 24px 26px 28px; }
}

@media (max-width: 575px) {
    .jsa-hero h1 { font-size: 28px; }
    .jsa-mould { --b: 24px; }
    .jsa-range > div { flex-basis: 100%; padding: 20px 0; }
    .jsa-alt-spec > div { flex-basis: 100%; }
}

@media (prefers-reduced-motion: reduce) {
    .jsa-why-box,
    .jsa-why-box:hover,
    .jsa-why-box:focus-within {
        transition: none;
        transform: none;
    }
}

@media (max-width: 767px) {
    /* Menu above the panel on small screens: a 3-column list would be unreadable. */
    .jsa-vtabs .jsa-vtab { padding: 14px 18px; }
    .jsa-figure > img { height: 260px; }
    .jsa-model-detail { padding-top: 26px; }
}

/* Paver cavities are near-square, unlike the 9:4 face of a brick. */
.jsa-mould-paver .jsa-brick {
    height: calc(var(--b) * 0.78);
}

/* ==========================================================================
   Accessories catalogue grid
   Dense product listing, one card per coded mould. Additive only: these
   classes are used solely by the accessories page.
   ========================================================================== */

/* ---------- sticky category bar ----------
   .jsa-acc-wrap is a plain div, not a section, and it spans the bar plus every
   category section. That matters twice over: a sticky element only sticks while
   its own parent is in view, so the bar must share a parent with the sections it
   navigates; and the theme's `section { overflow: hidden }` would otherwise sit
   in the ancestor chain and disable sticky altogether. */
.jsa-acc-wrap {
    position: relative;
}

.jsa-acc-bar {
    position: sticky;
    top: 0px;
    z-index: 999;                    /* below the theme navbar's 1030 */
    background: #fff;
    border-bottom: 1px solid var(--jsa-rule);
    box-shadow: 0 2px 14px rgba(18, 32, 58, .06);
}

.jsa-acc-bar ul {
    display: flex;
    align-items: stretch;
    list-style: none;
    margin: 0;
    padding: 0;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: thin;
    -webkit-overflow-scrolling: touch;
}

.jsa-acc-bar li {
    flex: 1 0 auto;
}

.jsa-acc-bar a {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    white-space: nowrap;
    padding: 20px 24px;
    color: var(--jsa-body);
    border-bottom: 3px solid transparent;
    transition: color .2s, background-color .2s, border-color .2s;
}

.jsa-acc-bar a:hover,
.jsa-acc-bar a:focus {
    color: var(--jsa-blue);
    background: var(--jsa-ash-pale);
    border-bottom-color: var(--jsa-blue);
}

.jsa-acc-tally {
    display: inline-block;
    min-width: 26px;
    padding: 2px 7px;
    border-radius: 20px;
    background: var(--jsa-ash-pale);
    color: var(--jsa-blue);
    font-family: var(--jsa-mono);
    text-align: center;
    transition: background-color .2s, color .2s;
}

.jsa-acc-bar a:hover .jsa-acc-tally,
.jsa-acc-bar a:focus .jsa-acc-tally {
    background: var(--jsa-blue);
    color: #fff;
}

/* Clear the sticky bar and the theme's fixed navbar on anchor jumps. */
.jsa-acc-sec {
    scroll-margin-top: 150px;
}

@media (max-width: 991px) {
    .jsa-acc-bar a { padding: 15px 18px; }
    .jsa-acc-sec { scroll-margin-top: 120px; }
}

.jsa-acc-head {
    border-bottom: 2px solid var(--jsa-blue);
    padding-bottom: 14px;
    margin-bottom: 40px;
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
}

.jsa-acc-count {
    font-family: var(--jsa-mono);
    color: var(--jsa-body);
}
/* ---------- one continuous grid per category ----------
   auto-fill keeps tiles a readable size whether a category has six patterns or
   seventy nine, so every section reads as one run rather than many sub-grids. */
.jsa-acc-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
    gap: 14px;
}

.jsa-acc-tile {
    margin: 0;
    border: 1px solid var(--jsa-rule);
    border-radius: 3px;
    background: #fff;
    overflow: hidden;
    transition: border-color .2s, box-shadow .2s, transform .2s;
}

.jsa-acc-tile:hover {
    border-color: var(--jsa-blue);
    box-shadow: 0 10px 22px rgba(18, 32, 58, .12);
    transform: translateY(-2px);
}

/* On the moulds page each tile links to its own full view, so the image sits
   inside an anchor. Block layout keeps the tile geometry unchanged. */
.jsa-acc-tile a {
    display: block;
    cursor: zoom-in;
}

.jsa-acc-tile a:focus-visible {
    outline: 2px solid var(--jsa-amber);
    outline-offset: -2px;
}

.jsa-acc-tile img {
    display: block;
    width: 100%;
    aspect-ratio: 1 / 1;
    object-fit: contain;
    padding: 10px;
    background: linear-gradient(160deg, #fbfcfd 0%, var(--jsa-ash-pale) 100%);
    mix-blend-mode: multiply;
}

.jsa-acc-tile figcaption {
    border-top: 1px solid var(--jsa-rule);
    padding: 8px 6px;
    text-align: center;
    color: var(--jsa-blue);
    font-family: var(--jsa-mono);
    letter-spacing: 0.5px;
}

.jsa-acc-tile figcaption span {
    color: var(--jsa-body);
}

/* Code-level figures, kept out of the grid so the grid stays continuous. */
.jsa-acc-specs {
    width: 100%;
    border-collapse: collapse;
    border: 1px solid var(--jsa-rule);
    background: #fff;
}

.jsa-acc-specs th,
.jsa-acc-specs td {
    padding: 10px 16px;
    text-align: left;
    vertical-align: top;
    border-bottom: 1px solid var(--jsa-rule);
}

.jsa-acc-specs tr:last-child th,
.jsa-acc-specs tr:last-child td {
    border-bottom: 0;
}

.jsa-acc-specs thead th {
    background: var(--jsa-blue-deep);
    color: #fff;
    font-family: var(--jsa-mono);
    letter-spacing: 1px;
    white-space: nowrap;
}

.jsa-acc-specs tbody th {
    font-family: var(--jsa-mono);
    color: var(--jsa-blue);
    white-space: nowrap;
    width: 1%;
}

.jsa-acc-specs tbody tr:hover td {
    background: #fafbfc;
}

.jsa-acc-specwrap {
    overflow-x: auto;
    margin-top: 46px;
}

@media (max-width: 575px) {
    .jsa-acc-grid { grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: 10px; }
    .jsa-acc-specs { min-width: 520px; }
}

@media (prefers-reduced-motion: reduce) {
    .jsa-acc-tile,
    .jsa-acc-tile:hover { transition: none; transform: none; }
}

/* ==========================================================================
   AEW + Premium Series page

   Three model cards over one comparison table. Everything here either extends
   a class the other product pages already use (.jsa-range, .jsa-spec) or is
   new and prefixed jsa-compare- / jsa-list.
   ========================================================================== */

/* .jsa-range is written for the hero, where it sits white-on-dark. Inside a
   white model card the same markup needs the colours put back. */
.jsa-range-inline {
    border-top: 0;
    border-bottom: 1px solid var(--jsa-rule);
    padding-top: 0;
    padding-bottom: 18px;
    margin-bottom: 20px;
    gap: 28px;
}

.jsa-range-inline > div {
    flex: 0 1 auto;
    padding-right: 0;
}

.jsa-range-inline .jsa-range-label {
    color: var(--jsa-body);
}

.jsa-range-inline .jsa-range-value {
    color: var(--jsa-blue);
}

/* Headline output inside a card, where the full spec table is too heavy. */
.jsa-spec-tight th,
.jsa-spec-tight td {
    padding: 7px 12px;
}

.jsa-spec-tight th {
    width: 46%;
}

/* ---------- capacity comparison ---------- */

/* The table has to stay wide enough to read, so it scrolls in its own box
   rather than squeezing the columns or forcing the page to scroll sideways. */
.jsa-compare-wrap {
    overflow-x: auto;
    background: #fff;
    border-radius: 15px;
}

.jsa-compare {
    min-width: 720px;
    background: #fff;
}

.jsa-compare thead th {
    background: var(--jsa-blue-deep);
    color: #fff;
    white-space: nowrap;
}

.jsa-compare thead th:first-child {
    width: 30%;
}

.jsa-compare tbody th {
    background: #e1eaf5;
    width: 30%;
}

.jsa-compare tbody td {
    white-space: nowrap;
}

.jsa-compare tbody tr:hover td {
    background: #fafbfc;
}

.jsa-compare-size {
    color: var(--jsa-body);
    margin-top: 3px;
}

.jsa-compare-hour {
    color: var(--jsa-body);
    font-family: var(--jsa-mono);
    margin-top: 2px;
}

/* ---------- optional systems ---------- */
.jsa-list {
    list-style: none;
    padding: 0;
    margin: 16px 0 0;
}

.jsa-list li {
    position: relative;
    padding-left: 22px;
    margin-bottom: 8px;
    color: var(--jsa-body);
}

.jsa-list li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 8px;
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--jsa-amber);
}

.jsa-list li:last-child {
    margin-bottom: 0;
}

@media (max-width: 575px) {
    .jsa-range-inline { gap: 20px; }
}

/* ==========================================================================
   Machine detail pages

   Coloured breadcrumb band, an uncropped machine preview, the technical
   specification table, product renders shown whole, and video embeds.
   ========================================================================== */

/* Page header. Solid colour rather than a photograph, at a medium height. The
   theme header is fixed and floats over this, so the top padding clears it. */
.jsa-crumb-band {
    background: var(--jsa-blue-deep);
    display: flex;
    align-items: center;
    padding: 180px 0 60px;
}

.jsa-crumb-band h1 {
    color: #fff;
    font-size: 52px;
    line-height: 1.15;
    margin: 0 0 18px;
}

.jsa-crumb-band .jsa-eyebrow {
    color: var(--jsa-amber);
}

.jsa-crumb-trail a,
.jsa-crumb-trail span {
    color: rgba(255, 255, 255, .68);
    text-decoration: none;
}

.jsa-crumb-trail a:hover,
.jsa-crumb-trail a:focus {
    color: #fff;
}

.jsa-crumb-trail i {
    color: rgba(255, 255, 255, .32);
    font-style: normal;
    padding: 0 10px;
}

@media (max-width: 991px) {
    .jsa-crumb-band { min-height: 300px; padding: 130px 0 50px; }
    .jsa-crumb-band h1 { font-size: 40px; }
}

@media (max-width: 575px) {
    .jsa-crumb-band { min-height: 250px; padding: 115px 0 40px; }
    .jsa-crumb-band h1 { font-size: 30px; }
}

/* ---------- machine preview ---------- */

/* The machine photograph is shown whole. No fixed aspect ratio and no cover
   crop, so nothing is cut off whatever the source proportions are. */
.jsa-preview-fig {
    /* background: #fff; */
    border: 1px solid var(--jsa-rule);
    border-radius: 15px;
    padding: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.jsa-preview-fig img {
    max-width: 100%;
    border-radius: 15px;
    height: auto;
    display: block;
}

.jsa-stat-row {
    display: flex;
    flex-wrap: wrap;
    gap: 50px;
    border-top: 1px solid var(--jsa-rule);
    padding-top: 24px;
    margin-top: 24px;
}

/* Basic Information beside the preview photo. In a narrow side column the
   horizontal stat row cramps long values like "35 HP / 26 kW", so this variant
   stacks them into a divided list that fills the column instead. */
.jsa-stat-card {
    display: block;
    background: #e1eaf5;
    border: 1px solid var(--jsa-rule);
    border-radius: 15px;
    padding: 6px 24px;
    margin-top: 18px;
}

.jsa-stat-card > div {
    padding: 18px 0;
    border-bottom: 1px solid var(--jsa-rule);
}

.jsa-stat-card > div:last-child {
    border-bottom: 0;
}

.jsa-stat-card .jsa-stat-label {
    color: var(--jsa-body);
    margin-bottom: 4px;
}

.jsa-stat-card .jsa-stat-value {
    color: var(--jsa-blue);
    line-height: 1.25;
}

.jsa-stat-label {
    color: var(--jsa-body);
    margin-bottom: 6px;
}

.jsa-stat-value {
    color: var(--jsa-blue);
}

/* ---------- technical specification ---------- */
.jsa-tech-wrap {
    overflow-x: auto;
    background: #fff;
    border-radius: 15px;
}

.jsa-tech {
    min-width: 560px;
    background: #fff;
    border: 0;
}

.jsa-tech thead th {
    background: var(--jsa-blue-deep);
    color: #fff;
}

.jsa-tech tbody th {
    background: #e1eaf5;
}

.jsa-tech tbody tr:hover td {
    background: #fafbfc;
}

/* Product renders are studio shots on a white ground and several are tall
   portraits, so they are fitted whole instead of cropped to fill. */
.jsa-fig-contain {
    background: #fff;
    border-bottom: 1px solid var(--jsa-rule);
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
    padding: 14px;
    /* Renders are never upscaled, so a few low-resolution source files sit at
       their own small size. The floor keeps the grid even regardless. */
    min-height: 280px;
}

.jsa-fig-contain img {
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
    object-fit: contain;
    display: block;
}

/* Size / stroke / capacity rows under each render. */
.jsa-out-spec {
    width: 100%;
    border-collapse: collapse;
    margin-top: 14px;
}

.jsa-out-spec th,
.jsa-out-spec td {
    font-family: Poppins, sans-serif;
    padding: 7px 0;
    text-align: left;
    vertical-align: top;
    border-bottom: 1px solid var(--jsa-rule);
}

.jsa-out-spec tr:last-child th,
.jsa-out-spec tr:last-child td {
    border-bottom: 0;
}

.jsa-out-spec th {
    width: 42%;
    color: var(--jsa-ink);
}

.jsa-out-spec td {
    color: var(--jsa-body);
    font-family: var(--jsa-mono);
}

/* ---------- video ---------- */
.jsa-video {
    position: relative;
    aspect-ratio: 16 / 9;
    background: var(--jsa-blue-deep);
    border-radius: 15px;
    overflow: hidden;
}

.jsa-video iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
}

.jsa-video-label {
    margin-top: 14px;
}

/* ---------- listing cards linking through to a detail page ---------- */

/* .jsa-prod-fig is an <a> on listing pages. It already sets display:flex and
   overflow:hidden, so it only needs the anchor defaults stripped. */
a.jsa-prod-fig {
    text-decoration: none;
    cursor: pointer;
}

a.jsa-prod-fig img {
    transition: transform .45s ease;
}

a.jsa-prod-fig:hover img,
.jsa-prod:hover a.jsa-prod-fig img {
    transform: scale(1.04);
}

/* Model name links through as well. Colour comes from the heading it sits in,
   so the link only takes over on hover and focus. */
.jsa-prod-link {
    color: inherit;
    text-decoration: none;
    transition: color .3s ease;
}

.jsa-prod-link:hover,
.jsa-prod-link:focus {
    color: var(--jsa-amber);
}

@media (prefers-reduced-motion: reduce) {
    a.jsa-prod-fig img,
    a.jsa-prod-fig:hover img,
    .jsa-prod:hover a.jsa-prod-fig img { transition: none; transform: none; }
}

/* ---------- preview carousel ----------
   Used where a machine has several site photographs. Markup is the Litho
   theme's own Swiper, which main.js picks up from [data-slider-options], so
   no extra script is loaded - these rules only fit it to the white panel. */
.jsa-preview-slider {
    width: 100%;
    border-radius: 10px;
    overflow: hidden;
}

.jsa-preview-slider .swiper-slide img {
    width: 100%;
    height: auto;
    display: block;
}

/* Pagination sits over the photo, so it needs its own contrast. */
.jsa-preview-slider .swiper-pagination {
    bottom: 14px;
}

.jsa-preview-slider .swiper-pagination-bullet {
    background: #fff;
    opacity: .55;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .35);
}

.jsa-preview-slider .swiper-pagination-bullet-active {
    background: var(--jsa-amber);
    opacity: 1;
}

.jsa-preview-slider .swiper-button-next,
.jsa-preview-slider .swiper-button-prev {
    width: 44px;
    height: 44px;
    background: rgba(255, 255, 255, .9);
    color: var(--jsa-blue-deep);
    transition: background .3s ease, color .3s ease;
}

.jsa-preview-slider .swiper-button-next:hover,
.jsa-preview-slider .swiper-button-prev:hover {
    background: var(--jsa-amber);
    color: #fff;
}

.jsa-preview-slider .swiper-button-next::after,
.jsa-preview-slider .swiper-button-prev::after {
    content: none;
}

/* ---------- photo gallery ----------
   Site and product photographs vary in aspect, so they are cropped to a common
   tile rather than fitted: these are scene shots, not cut-out renders. */
.jsa-shot {
    margin: 0;
    /* An <a> on lightbox galleries, so it needs to lay out as a block and
       carry its own position for the zoom badge. */
    display: block;
    position: relative;
    cursor: zoom-in;
    aspect-ratio: 3 / 3;
    background: var(--jsa-ash-pale);
    border: 1px solid var(--jsa-rule);
    border-radius: 15px;
    overflow: hidden;
}

/* Lightbox affordance: a magnifier badge fades in on hover so it reads as
   openable. Decorative only - the anchor itself is what gets announced. */
.jsa-shot::after {
    content: "\e611";                       /* themify ti-zoom-in */
    font-family: themify;
    position: absolute;
    right: 12px;
    bottom: 12px;
    width: 34px;
    height: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: rgba(255, 255, 255, .92);
    color: var(--jsa-blue-deep);
    font-size: 14px;
    opacity: 0;
    transform: translateY(6px);
    transition: opacity .3s ease, transform .3s ease;
    pointer-events: none;
}

.jsa-shot:hover::after,
.jsa-shot:focus-visible::after {
    opacity: 1;
    transform: translateY(0);
}

.jsa-shot:focus-visible {
    outline: 2px solid var(--jsa-amber);
    outline-offset: 2px;
}

.jsa-shot img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: transform .45s ease;
}

.jsa-shot:hover img {
    transform: scale(1.05);
}

@media (prefers-reduced-motion: reduce) {
    .jsa-shot img, .jsa-shot:hover img { transition: none; transform: none; }
}

/* ==========================================================================
   Catalogue download modal

   Used on the E-Catalogue page, which does not sit inside .jsa-page, so these
   rules carry literal palette values rather than the custom properties.
   ========================================================================== */
.jsa-dl .modal-content {
    border: 0;
    border-radius: 16px;
    overflow: hidden;
    box-shadow: 0 24px 60px rgba(18, 32, 58, .28);
}

.jsa-dl .modal-header {
    background: #12203a;
    border-bottom: 0;
    padding: 30px 34px 26px;
    display: block;
    position: relative;
}

.jsa-dl-eyebrow {
    color: #ec5902;
    font-family: Poppins, sans-serif;
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 1px;
    text-transform: uppercase;
    display: block;
    margin-bottom: 8px;
}

.jsa-dl .modal-title {
    color: #fff;
    font-size: 26px;
    line-height: 1.2;
    margin: 0;
}

.jsa-dl-sub {
    color: rgba(255, 255, 255, .7);
    font-size: 14px;
    margin: 10px 0 0;
}

/* Close sits on the dark band, so it needs inverting. */
.jsa-dl .btn-close {
    position: absolute;
    top: 22px;
    right: 24px;
    filter: invert(1) grayscale(1) brightness(2);
    opacity: .6;
    transition: opacity .2s ease;
}

.jsa-dl .btn-close:hover { opacity: 1; }

.jsa-dl .modal-body {
    padding: 30px 34px 34px;
    background: #fff;
}

.jsa-dl-field { margin-bottom: 20px; }

.jsa-dl-field label {
    display: block;
    font-family: Poppins, sans-serif;
    font-size: 13px;
    font-weight: 500;
    color: #232323;
    margin-bottom: 8px;
}

.jsa-dl-field label span { color: #ec5902; }

.jsa-dl-field input {
    width: 100%;
    height: 52px;
    padding: 0 16px;
    font-family: Poppins, sans-serif;
    font-size: 15px;
    color: #232323;
    background: #f7f9fb;
    border: 1px solid #dde2e8;
    border-radius: 8px;
    transition: border-color .2s ease, box-shadow .2s ease, background .2s ease;
}

.jsa-dl-field input::placeholder { color: #a6aeb8; }

.jsa-dl-field input:focus {
    outline: 0;
    background: #fff;
    border-color: #ec5902;
    box-shadow: 0 0 0 3px rgba(236, 89, 2, .14);
}

/* Only flags a field once the browser has judged it, not while still typing. */
.jsa-dl-field input:user-invalid {
    border-color: #d64545;
    box-shadow: 0 0 0 3px rgba(214, 69, 69, .12);
}

.jsa-dl-submit {
    width: 100%;
    height: 54px;
    border: 0;
    border-radius: 8px;
    background: #ec5902;
    color: #fff;
    font-family: Poppins, sans-serif;
    font-size: 15px;
    font-weight: 500;
    letter-spacing: .4px;
    cursor: pointer;
    transition: background .25s ease, transform .2s ease;
}

.jsa-dl-submit:hover { background: #12203a; }
.jsa-dl-submit:active { transform: translateY(1px); }

.jsa-dl-submit:focus-visible {
    outline: 2px solid #12203a;
    outline-offset: 2px;
}

.jsa-dl-note {
    font-family: Poppins, sans-serif;
    font-size: 12px;
    color: #828282;
    text-align: center;
    margin: 16px 0 0;
}

@media (max-width: 575px) {
    .jsa-dl .modal-header { padding: 24px 22px 20px; }
    .jsa-dl .modal-body { padding: 24px 22px 26px; }
    .jsa-dl .modal-title { font-size: 21px; }
}

@media (prefers-reduced-motion: reduce) {
    .jsa-dl-field input,
    .jsa-dl-submit { transition: none; }
}

/* ==========================================================================
   Photo gallery page

   Masonry via CSS columns: each photo keeps its own proportions instead of
   being cropped to a tile, which matters here because the set mixes wide
   production-line shots with tall portrait frames. No JS layout needed, and
   lazy loading works as normal. Lightbox is the theme's Magnific Popup via
   .lightbox-gallery on the container.
   ========================================================================== */
.jsa-gallery {
    column-count: 4;
    column-gap: 18px;
}

.jsa-gal-item {
    display: block;
    position: relative;
    break-inside: avoid;
    margin: 0 0 18px;
    border-radius: 12px;
    overflow: hidden;
    background: var(--jsa-ash-pale);
    border: 1px solid var(--jsa-rule);
    cursor: zoom-in;
}

.jsa-gal-item img {
    display: block;
    width: 100%;
    height: auto;
    transition: transform .45s ease;
}

.jsa-gal-item:hover img { transform: scale(1.04); }

.jsa-gal-item::after {
    content: "\e611";                       /* themify ti-zoom-in */
    font-family: themify;
    position: absolute;
    right: 12px;
    bottom: 12px;
    width: 34px;
    height: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: rgba(255, 255, 255, .92);
    color: var(--jsa-blue-deep);
    font-size: 14px;
    opacity: 0;
    transform: translateY(6px);
    transition: opacity .3s ease, transform .3s ease;
    pointer-events: none;
}

.jsa-gal-item:hover::after,
.jsa-gal-item:focus-visible::after {
    opacity: 1;
    transform: translateY(0);
}

.jsa-gal-item:focus-visible {
    outline: 2px solid var(--jsa-amber);
    outline-offset: 2px;
}

.jsa-gal-count {
    color: var(--jsa-body);
}

@media (max-width: 1199px) { .jsa-gallery { column-count: 3; } }
@media (max-width: 767px)  { .jsa-gallery { column-count: 2; column-gap: 12px; } .jsa-gal-item { margin-bottom: 12px; } }

@media (prefers-reduced-motion: reduce) {
    .jsa-gal-item img, .jsa-gal-item:hover img, .jsa-gal-item::after { transition: none; transform: none; }
}

/* ==========================================================================
   Video gallery page

   Thumbnail cards fed live from the YouTube channel. Each thumbnail opens the
   video in the theme's Magnific Popup iframe lightbox (.popup-youtube), so no
   player is embedded until one is asked for.
   ========================================================================== */
.jsa-video-card {
    background: #fff;
    border: 1px solid var(--jsa-rule);
    border-radius: 15px;
    overflow: hidden;
    height: 100%;
    transition: box-shadow .3s ease, transform .3s ease;
}

.jsa-video-card:hover,
.jsa-video-card:focus-within {
    box-shadow: 0 12px 32px rgba(18, 32, 58, .12);
    transform: translateY(-3px);
}

.jsa-video-thumb {
    display: block;
    position: relative;
    aspect-ratio: 16 / 9;
    background: var(--jsa-blue-deep);
    overflow: hidden;
}

/* YouTube's hqdefault is 4:3 with black bars; cover-fit to 16:9 trims them. */
.jsa-video-thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: transform .45s ease;
}

.jsa-video-thumb:hover img { transform: scale(1.05); }

.jsa-video-play {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 64px;
    height: 64px;
    margin: -32px 0 0 -32px;
    border-radius: 50%;
    background: rgba(255, 255, 255, .94);
    color: var(--jsa-amber);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 24px;
    padding-left: 4px;                       /* optically centre the triangle */
    box-shadow: 0 6px 20px rgba(0, 0, 0, .28);
    transition: background .25s ease, color .25s ease, transform .25s ease;
}

.jsa-video-thumb:hover .jsa-video-play {
    background: var(--jsa-amber);
    color: #fff;
    transform: scale(1.08);
}

.jsa-video-thumb:focus-visible {
    outline: 2px solid var(--jsa-amber);
    outline-offset: 2px;
}

.jsa-video-body {
    padding: 18px 20px 20px;
}

.jsa-video-body h3 {
    line-height: 1.45;
    /* Titles from YouTube run long with hashtags; keep cards even. */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.jsa-video-date {
    color: var(--jsa-body);
    margin-top: 8px;
}

@media (prefers-reduced-motion: reduce) {
    .jsa-video-card, .jsa-video-thumb img, .jsa-video-play { transition: none; transform: none; }
}

/* Load More on the video gallery. The "shown of total" sits inside the
   button so the count and the action read as one control. */
.jsa-video-more-count {
    display: block;
    margin-top: 4px;
    opacity: .75;
    letter-spacing: .5px;
}
