/* PLAB Team Showcase 1.1.12 — Curo-inspired editorial composition */
.plab-ts{--plab-ts-bg:#f7f8ed;--plab-ts-ink:#1c2820;background:var(--plab-ts-bg);color:var(--plab-ts-ink);width:100%;min-width:0;overflow:hidden;isolation:isolate;font-family:inherit}
.plab-ts,.plab-ts *{box-sizing:border-box}
.plab-ts-inner{width:100%;max-width:1920px;margin:auto;display:grid;grid-template-columns:minmax(0,39%) minmax(0,61%);min-height:clamp(620px,53vw,890px);position:relative}
.plab-ts-copy{position:relative;padding:clamp(48px,6.2vw,116px) 1.5rem 3.75rem clamp(32px,5.4vw,108px);z-index:2;align-self:stretch;display:flex;flex-direction:column;align-items:flex-start}
.plab-ts-eyebrow{font-size:clamp(11px,.82vw,14px);letter-spacing:.025em;font-weight:500;line-height:1.3;text-transform:uppercase;margin:0 0 auto;padding-bottom:clamp(38px,6vw,116px)}
.plab-ts-name{font-size:clamp(42px,4.5vw,91px);line-height:.99;letter-spacing:-.052em;font-weight:450;margin:0 0 17px;color:inherit;overflow-wrap:normal}
.plab-ts-role{font-size:clamp(15px,1.06vw,19px);margin:0 0 clamp(20px,2vw,40px);font-weight:550}
.plab-ts-bio{font-size:clamp(14px,.96vw,17px);line-height:1.65;max-width:47ch;white-space:pre-line;margin:0 0 22px}
.plab-ts-contact{font-size:clamp(12px,.82vw,15px);display:flex;flex-wrap:wrap;gap:7px;margin:0 0 17px}.plab-ts-contact[hidden]{display:none}.plab-ts-contact a,.plab-ts-link{color:inherit;text-decoration:none;border-bottom:1px solid currentColor;text-underline-offset:3px}
.plab-ts-link-wrap{margin:0 0 38px;min-height:20px}.plab-ts-link{font-size:13px}.plab-ts-link[hidden]{display:none}.plab-ts-count{font-size:12px;letter-spacing:.12em;opacity:.75;margin-top:auto}
.plab-ts-name,.plab-ts-role,.plab-ts-bio,.plab-ts-link-wrap{transition:opacity .24s ease}
.plab-ts-stage{height:clamp(620px,53vw,890px);position:relative;min-width:0;overflow:hidden;touch-action:pan-y}
.plab-ts-images{position:absolute;inset:clamp(128px,10vw,182px) 0 42px 0;overflow:visible;pointer-events:none}
.plab-ts-portrait{position:absolute;top:0;left:0;overflow:hidden;background:#dce1d8;will-change:transform,opacity;backface-visibility:hidden;transform-origin:center center;pointer-events:none}
.plab-ts-portrait img{display:block;width:100%;height:100%;object-fit:cover;object-position:center;backface-visibility:hidden}.plab-ts-portrait.no-photo{background:linear-gradient(125deg,#cfd6ce,#e8ebe3)}
.plab-ts-controls{position:absolute;right:clamp(32px,6vw,116px);top:clamp(52px,5.6vw,100px);z-index:15;display:flex;gap:8px}
.plab-ts-controls button{appearance:none;background:transparent;color:inherit;border:1px solid currentColor;border-radius:0;display:grid;place-items:center;width:48px;height:48px;font-size:23px;font-weight:400;cursor:pointer;line-height:1;transition:background .2s,color .2s;padding:0}.plab-ts-controls button:hover{background:var(--plab-ts-ink);color:var(--plab-ts-bg)}.plab-ts-controls button:focus-visible{outline:2px solid currentColor;outline-offset:3px}.plab-ts-controls button:disabled{opacity:.3;cursor:not-allowed}
.plab-ts-rail{height:1px;width:calc(100% - clamp(64px,10.8vw,216px));margin:0 auto 26px;background:color-mix(in srgb,var(--plab-ts-ink) 18%,transparent);position:relative}.plab-ts-rail-progress{display:block;background:var(--plab-ts-ink);height:100%;width:0;transition:width .85s cubic-bezier(.22,1,.36,1)}
@media(max-width:980px){.plab-ts-inner{grid-template-columns:40% 60%;min-height:570px}.plab-ts-stage{height:570px}.plab-ts-copy{padding:52px 12px 30px 32px}.plab-ts-name{font-size:clamp(35px,4.8vw,56px)}.plab-ts-eyebrow{padding-bottom:35px}.plab-ts-images{inset:120px 0 34px}.plab-ts-controls{top:47px;right:36px}.plab-ts-bio{font-size:13px}}
@media(max-width:679px){.plab-ts-inner{display:flex;flex-direction:column;min-height:0}.plab-ts-copy{padding:36px 7vw 8px;min-height:0}.plab-ts-eyebrow{padding-bottom:25px}.plab-ts-name{font-size:clamp(38px,9.2vw,65px)}.plab-ts-role{margin-bottom:15px}.plab-ts-bio{max-width:60ch;min-height:0;margin-bottom:15px;font-size:14px}.plab-ts-link-wrap{margin-bottom:9px}.plab-ts-count{margin-top:6px}.plab-ts-stage{height:clamp(370px,116vw,630px);width:100%;overflow:hidden}.plab-ts-images{inset:70px 0 18px}.plab-ts-controls{right:7vw;top:7px}.plab-ts-controls button{width:40px;height:40px;font-size:20px}.plab-ts-rail{margin-bottom:15px}}
@media(prefers-reduced-motion:reduce){.plab-ts-portrait,.plab-ts-rail-progress,.plab-ts-name,.plab-ts-role,.plab-ts-bio,.plab-ts-link-wrap{transition:none!important}}

/* v1.0.5: mask belongs to a fixed-size portrait viewport, not the moving track. */
.plab-ts-mask-layer{pointer-events:none!important;contain:paint;isolation:isolate;transform-origin:center center;}
.plab-ts-mask-layer img{will-change:transform;}
.plab-ts-mask-in{z-index:52!important;}
.plab-ts-mask-out{z-index:51!important;}
@media(prefers-reduced-motion:reduce){.plab-ts-mask-layer img{will-change:auto;}}
/* v1.0.6 moving portrait panels: each panel is an animated clipping window. */
.plab-ts-images{overflow:visible;isolation:isolate}
.plab-ts-panel{position:absolute;overflow:hidden;transform:none!important;transition:none!important;transform-origin:top left;contain:paint;will-change:left,width,top,height;}
.plab-ts-panel img{position:absolute;max-width:none!important;min-width:0;object-fit:cover;object-position:center;will-change:left,width;pointer-events:none;}
@media(prefers-reduced-motion:reduce){.plab-ts-panel,.plab-ts-panel img{will-change:auto}}

/* v1.0.7 fixed masks: no position/width animations on the windows. */
.plab-ts-images{overflow:visible;isolation:isolate}
.plab-ts-fixed-mask{position:absolute;overflow:hidden;pointer-events:none;contain:paint;background:#dce1d8;transform:none!important;transition:none!important;}
.plab-ts-inner-strip{position:absolute;left:0;top:0;height:100%;width:300%;display:flex;will-change:transform;transform:translate3d(-33.333333%,0,0);}
.plab-ts-image-cell{flex:0 0 33.333333%;width:33.333333%;height:100%;position:relative;overflow:hidden;}
.plab-ts-image-cell img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center;display:block;max-width:none!important;}
.plab-ts-image-missing{background:linear-gradient(125deg,#cfd6ce,#e8ebe3)}
@media(prefers-reduced-motion:reduce){.plab-ts-inner-strip{will-change:auto}}
/* v1.1.0 configurable display - fixed mask animation unchanged */
.plab-ts-inner{max-width:var(--plab-ts-max,1920px);grid-template-columns:minmax(0,var(--plab-ts-copy-width,39%)) minmax(0,1fr)}
.plab-ts-copy{text-align:var(--plab-ts-text-align,left)}
.plab-ts-eyebrow{font-size:var(--plab-ts-head-size,13px)}.plab-ts-name{font-size:var(--plab-ts-name-size,clamp(42px,4.5vw,91px))}.plab-ts-role{font-size:var(--plab-ts-role-size,clamp(15px,1.06vw,19px))}.plab-ts-bio{font-size:var(--plab-ts-bio-size,clamp(14px,.96vw,17px))}
.plab-ts[data-ts-align=center] .plab-ts-copy{align-items:center}.plab-ts[data-ts-align=right] .plab-ts-copy{align-items:flex-end}
.plab-ts-stage{height:var(--plab-ts-stage-height,clamp(620px,53vw,890px))}
.plab-ts-controls button{width:var(--plab-ts-nav-size,48px);height:var(--plab-ts-nav-size,48px)}.plab-ts[data-ts-nav-location=left] .plab-ts-controls{right:auto;left:clamp(32px,6vw,116px)}
.plab-ts[data-ts-nav-style=minimal] .plab-ts-controls button{border:0}.plab-ts[data-ts-nav-style=filled] .plab-ts-controls button{background:var(--plab-ts-ink);color:var(--plab-ts-bg)}
.plab-ts-rail{height:var(--plab-ts-progress-height,2px)}.plab-ts-progress-segments,.plab-ts-progress-dots{background:transparent;display:flex;gap:8px;height:8px}.plab-ts-progress-segment{flex:1;background:color-mix(in srgb,var(--plab-ts-ink) 20%,transparent);height:var(--plab-ts-progress-height,2px);border-radius:9px}.plab-ts-progress-segment.is-active{background:var(--plab-ts-ink)}.plab-ts-progress-dots .plab-ts-progress-segment{flex:0 0 8px;width:8px;height:8px;border-radius:50%}
.plab-ts [hidden]{display:none!important}
@media(max-width:980px){.plab-ts-inner{grid-template-columns:minmax(0,var(--plab-ts-copy-width,40%)) minmax(0,1fr)}}
@media(max-width:679px){.plab-ts-inner{display:flex;flex-direction:column}.plab-ts-stage{height:var(--plab-ts-stage-height,clamp(370px,116vw,630px))}}

/* v1.1.1 corrective audit: preserve 1.0.7 internal mask translations. */
.plab-ts{background:color-mix(in srgb,var(--plab-ts-bg) var(--plab-ts-bg-opacity,100%),transparent)}
.plab-ts-qualifications{margin:0 0 12px;font-size:var(--plab-ts-role-size,clamp(13px,1vw,17px));opacity:.8}
/* Portrait tablets and mobile follow the reference: stationary portrait window first, biography beneath. */
@media (max-width:980px) and (orientation:portrait), (max-width:679px){
 .plab-ts-inner{display:flex!important;flex-direction:column!important;min-height:0}
 .plab-ts-stage{order:1;width:100%;height:clamp(370px,94vw,700px);touch-action:pan-y;overflow:hidden}
 .plab-ts-copy{order:2;width:100%;min-height:0;padding:18px 6vw 32px;display:flex;align-items:flex-start}
 .plab-ts-eyebrow{order:-1;padding:0;margin:0 0 14px}
 .plab-ts-name{font-size:clamp(30px,5.3vw,52px);margin:0 0 8px}
 .plab-ts-bio{max-width:65ch;font-size:clamp(13px,2.2vw,16px)}
 .plab-ts-images{inset:12px 0 5px}
 .plab-ts-controls{display:none!important}
 .plab-ts-count{margin:6px 0}
}
@media(max-width:679px){.plab-ts-stage{height:clamp(330px,115vw,590px)}.plab-ts-copy{padding:18px 5vw 30px}}

/* v1.1.2: reference composition. Windows stay fixed; image strips slide internally. */
@media(min-width:981px), (min-width:680px) and (orientation:landscape){
 .plab-ts-inner{display:block;min-height:0;position:relative;isolation:isolate}
 .plab-ts-stage{width:100%;height:var(--plab-ts-stage-height,clamp(470px,44vw,760px));overflow:hidden}
 .plab-ts-images{inset:12px 0 12px;overflow:visible}
 .plab-ts-copy{position:absolute;left:0;top:0;z-index:5;width:40%;height:40%;min-height:0;padding:clamp(20px,2.8vw,58px) clamp(20px,3vw,62px);pointer-events:none;display:flex;flex-direction:column;align-items:flex-start}
 .plab-ts-copy a{pointer-events:auto}
 .plab-ts-eyebrow{margin:0 0 12px;padding:0}
 .plab-ts-name{font-size:clamp(26px,2.8vw,55px);margin-bottom:12px}
 .plab-ts-role{margin-bottom:12px}
 .plab-ts-bio{font-size:clamp(12px,.95vw,16px);line-height:1.5;margin-bottom:12px}
 .plab-ts-count{margin-top:8px}
 .plab-ts-controls{top:20px;right:3vw}
 .plab-ts[data-ts-desktop-layout=left] .plab-ts-copy{left:auto;right:0;width:47%;}
 .plab-ts[data-ts-desktop-layout=left] .plab-ts-controls{left:3vw;right:auto}
}
.plab-ts-image-cell img{object-position:var(--plab-ts-crop-x,50%) var(--plab-ts-crop-y,50%)}
@media (max-width:980px) and (orientation:portrait), (max-width:679px){
 .plab-ts-inner{display:flex!important;flex-direction:column!important}
 .plab-ts-stage{order:1;height:var(--plab-ts-tablet-stage,clamp(400px,74vw,720px))}
 .plab-ts-copy{order:2;position:relative;left:auto;right:auto;width:100%;height:auto;pointer-events:auto}
 .plab-ts-images{inset:0;overflow:visible}
 .plab-ts-controls{display:none!important}
}
@media(max-width:679px){.plab-ts-stage{height:var(--plab-ts-mobile-stage,clamp(340px,112vw,620px))}}

/* v1.1.3: responsive reference polish and collision protection. */
@media (min-width:981px), (min-width:680px) and (orientation:landscape){
 .plab-ts-inner{position:relative}
 .plab-ts-copy{width:40%;height:auto;max-height:78%;overflow:hidden;padding:clamp(12px,1.8vw,32px) clamp(16px,2vw,42px);gap:0;justify-content:flex-start}
 .plab-ts-eyebrow{margin:0 0 12px;padding:0}
 .plab-ts-name{font-size:clamp(22px,2.4vw,46px);line-height:1.08}
 .plab-ts-role{font-size:clamp(12px,1vw,18px);margin-bottom:clamp(8px,1vw,20px)}
 .plab-ts-bio{font-size:clamp(11px,.86vw,16px);line-height:1.42;margin-bottom:12px;overflow-wrap:anywhere}
 .plab-ts-contact{font-size:clamp(10px,.8vw,14px);margin-bottom:8px}
 .plab-ts-link-wrap{margin-bottom:8px}
 .plab-ts-controls{right:3%;top:3%;z-index:80;gap:6px}
 .plab-ts[data-ts-desktop-layout=left] .plab-ts-copy{right:0;left:auto;width:40%}
 .plab-ts[data-ts-desktop-layout=left] .plab-ts-controls{left:1%;right:auto}
 .plab-ts-rail{position:relative}
}
@media (max-width:980px) and (orientation:portrait), (max-width:679px){
 .plab-ts-stage{overflow:hidden!important;touch-action:pan-y}
 .plab-ts-images{inset:0!important;overflow:visible}
 .plab-ts-copy{padding-top:clamp(20px,3.4vw,36px)!important;gap:0}
 .plab-ts-fixed-mask{overflow:hidden}
 .plab-ts-controls{display:none!important}
}

/* v1.1.4 geometry lock: no member-specific size recalculation. */
.plab-ts-fixed-mask{overflow:hidden!important;flex-shrink:0;contain:layout paint;}
.plab-ts-image-cell img{object-fit:var(--plab-ts-image-fit,cover)!important;object-position:var(--plab-ts-crop-x,50%) var(--plab-ts-crop-y,50%)!important;}
/* Content never bleeds over the stationary preview row. */
@media (min-width:981px), (min-width:680px) and (orientation:landscape){
 .plab-ts-copy{max-height:var(--plab-ts-copy-max-height,54%);overflow:auto;overscroll-behavior:contain;}
}

/* v1.1.5 — unified fixed-mask proportions, accessible copy, responsive width overrides.
 * Mask geometry is only calculated on layout/viewport changes; images animate inside masks.
 */
@media (min-width:981px), (min-width:680px) and (orientation:landscape){
 .plab-ts-stage{height:var(--plab-ts-stage-height,clamp(480px,60vw,940px))}
 .plab-ts-copy{overflow:hidden!important;overflow-y:hidden!important;overscroll-behavior:auto;box-sizing:border-box;max-height:none;justify-content:flex-start;}
 .plab-ts-name{margin-bottom:var(--plab-ts-gap-name,12px)!important}
 .plab-ts-qualifications{margin-bottom:var(--plab-ts-gap-qual,8px)!important}
 .plab-ts-role{margin-bottom:var(--plab-ts-gap-role,14px)!important}
 .plab-ts-bio{margin-bottom:var(--plab-ts-gap-bio,12px)!important}
 .plab-ts-contact{margin-bottom:var(--plab-ts-gap-contact,10px)!important}
 .plab-ts-bio{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--plab-ts-bio-lines,7);line-clamp:var(--plab-ts-bio-lines,7);overflow:hidden;white-space:normal;}
 .plab-ts-controls{z-index:90}
}
@media (max-width:980px) and (orientation:portrait){
 .plab-ts-inner{width:var(--plab-ts-tablet-width,100%)!important;max-width:var(--plab-ts-tablet-max,none)!important;margin-inline:auto!important}
 .plab-ts-stage{height:var(--plab-ts-tablet-stage,auto)!important;aspect-ratio:1/1.12;}
 .plab-ts-copy{height:auto!important;max-height:none!important;overflow:visible!important;padding-top:clamp(18px,3vw,34px)!important}
}
@media (max-width:679px){
 .plab-ts-inner{width:var(--plab-ts-mobile-width,100%)!important;max-width:var(--plab-ts-mobile-max,none)!important;margin-inline:auto!important}
 .plab-ts-stage{height:var(--plab-ts-mobile-stage,auto)!important;aspect-ratio:1/1.14;}
 .plab-ts-copy{height:auto!important;max-height:none!important;overflow:visible!important;padding-top:clamp(18px,4vw,34px)!important}
}

/* v1.1.11 — one portrait-first design for tablet portrait and mobile.
 * The actual WordPress-rendered cards are the slider; native horizontal
 * scroll-snap is always usable, even without JS or during a Divi reflow.
 * Never hide the cards behind a data-ts-ready flag. Desktop fixed masks above
 * are left untouched. */
.plab-ts{max-width:100%;min-width:0}
.plab-ts .plab-ts-inner,.plab-ts .plab-ts-stage{min-width:0;max-width:100%}
.plab-ts .plab-ts-controls{transform:translate(var(--plab-ts-nav-offset-x,0px),var(--plab-ts-nav-offset-y,0px))}
.plab-ts-mobile-slider{display:none}
@media (max-width:1199px) and (orientation:portrait), (max-width:679px){
 .plab-ts{width:100%!important;max-width:100%!important;overflow:hidden!important}
 .plab-ts .plab-ts-inner{display:block!important;width:var(--plab-ts-tablet-width,100%)!important;max-width:var(--plab-ts-tablet-max,none)!important;margin-inline:auto!important;min-height:0!important;height:auto!important;position:relative!important;}
 .plab-ts .plab-ts-stage{display:block!important;position:relative!important;width:100%!important;min-height:0!important;height:auto!important;max-height:none!important;aspect-ratio:auto!important;overflow:hidden!important;touch-action:auto!important;}
 .plab-ts .plab-ts-copy,.plab-ts .plab-ts-images,.plab-ts .plab-ts-controls,.plab-ts .plab-ts-static-fallback{display:none!important;}
 .plab-ts .plab-ts-mobile-slider{display:block!important;position:relative!important;width:100%!important;height:auto!important;max-height:none!important;min-width:0!important;overflow:visible!important;}
 .plab-ts .plab-ts-mobile-heading{font-size:var(--plab-ts-head-size,13px);line-height:1.4;margin:0 0 14px;padding:18px 0 0;font-weight:500;}
 .plab-ts .plab-ts-mobile-viewport{display:block!important;position:relative!important;width:100%!important;min-width:0!important;height:auto!important;max-height:none!important;overflow-x:auto!important;overflow-y:hidden!important;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;overscroll-behavior-y:auto;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y;scrollbar-width:none;}
 .plab-ts .plab-ts-mobile-viewport::-webkit-scrollbar{display:none}
 .plab-ts .plab-ts-mobile-track{display:flex!important;align-items:stretch!important;position:relative!important;width:100%!important;min-width:0!important;max-width:none!important;gap:var(--plab-ts-tablet-card-gap,12px)!important;transform:none!important;transition:none!important;will-change:auto!important;}
 .plab-ts .plab-ts-mobile-card{display:block!important;position:relative!important;box-sizing:border-box!important;flex:0 0 var(--plab-ts-tablet-card-base,calc(100% - var(--plab-ts-tablet-peek,17%) - var(--plab-ts-tablet-card-gap,12px)))!important;width:var(--plab-ts-tablet-card-base,calc(100% - var(--plab-ts-tablet-peek,17%) - var(--plab-ts-tablet-card-gap,12px)))!important;min-width:0!important;max-width:none!important;height:auto!important;scroll-snap-align:start;opacity:var(--plab-ts-tablet-preview-opacity,.35);transition:none!important;contain:none!important;backface-visibility:visible!important;overflow:visible!important;}
 .plab-ts .plab-ts-mobile-card.is-current{opacity:1;pointer-events:auto}
 .plab-ts .plab-ts-mobile-photo{display:block!important;position:relative!important;width:100%!important;height:auto!important;aspect-ratio:var(--plab-ts-aspect,.75)!important;max-height:none!important;overflow:hidden!important;background:#dce1d8;}
 .plab-ts .plab-ts-mobile-photo img{display:block!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;max-width:none!important;object-fit:var(--plab-ts-image-fit,cover)!important;object-position:var(--plab-ts-crop-x,50%) var(--plab-ts-crop-y,50%)!important;}
 .plab-ts .plab-ts-mobile-info{position:relative!important;display:block!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;overflow-wrap:anywhere;padding:var(--plab-ts-tablet-photo-text-gap,16px) 0 22px!important;text-align:var(--plab-ts-text-align,left);}
 .plab-ts .plab-ts-mobile-name{font-size:var(--plab-ts-name-size,clamp(22px,4.4vw,34px));font-weight:500;line-height:1.12;letter-spacing:-.035em;margin:0 0 var(--plab-ts-gap-name,12px);}
 .plab-ts .plab-ts-mobile-qualifications{font-size:var(--plab-ts-role-size,14px);margin:0 0 var(--plab-ts-gap-qual,8px);}
 .plab-ts .plab-ts-mobile-role{font-size:var(--plab-ts-role-size,14px);margin:0 0 var(--plab-ts-gap-role,14px);}
 .plab-ts .plab-ts-mobile-bio{font-size:var(--plab-ts-bio-size,14px);line-height:1.5;margin:0 0 var(--plab-ts-gap-bio,12px);white-space:normal;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--plab-ts-bio-mobile-lines,10);line-clamp:var(--plab-ts-bio-mobile-lines,10);overflow:hidden;}
 .plab-ts .plab-ts-mobile-contact{display:flex;flex-direction:column;gap:4px;font-size:13px;margin:0 0 var(--plab-ts-gap-contact,10px);}
 .plab-ts .plab-ts-mobile-contact a,.plab-ts .plab-ts-mobile-link{color:inherit;text-decoration:underline;text-underline-offset:3px;overflow-wrap:anywhere;}
 .plab-ts .plab-ts-mobile-link{display:inline-block;font-size:13px;margin:0 0 10px;}
 .plab-ts .plab-ts-mobile-index{font-size:12px;opacity:.75;margin:8px 0 0;}
 .plab-ts .plab-ts-rail{margin-top:8px;margin-bottom:15px;}
 .plab-ts[data-ts-single="1"] .plab-ts-mobile-card{flex-basis:100%!important;width:100%!important}
}
@media (max-width:679px){
 .plab-ts .plab-ts-inner{width:var(--plab-ts-mobile-width,100%)!important;max-width:var(--plab-ts-mobile-max,none)!important;}
 .plab-ts .plab-ts-mobile-track{gap:var(--plab-ts-phone-card-gap,12px)!important;}
 .plab-ts .plab-ts-mobile-card{flex-basis:var(--plab-ts-phone-card-base,calc(100% - var(--plab-ts-phone-peek,17%) - var(--plab-ts-phone-card-gap,12px)))!important;width:var(--plab-ts-phone-card-base,calc(100% - var(--plab-ts-phone-peek,17%) - var(--plab-ts-phone-card-gap,12px)))!important;opacity:var(--plab-ts-phone-preview-opacity,.35);}
 .plab-ts .plab-ts-mobile-card.is-current{opacity:1;}
 .plab-ts .plab-ts-mobile-photo{max-height:none!important;}
 .plab-ts .plab-ts-mobile-info{padding-top:var(--plab-ts-phone-photo-text-gap,14px)!important;}
 .plab-ts[data-ts-single="1"] .plab-ts-mobile-card{flex-basis:100%!important;width:100%!important}
}
@media(prefers-reduced-motion:reduce){.plab-ts .plab-ts-mobile-viewport{scroll-behavior:auto!important}}

/* v1.1.12: desktop ghost portrait was a server-rendered fallback behind the JS masks.
   Keep it before JS starts, but remove it as soon as fixed masks are ready. */
.plab-ts .plab-ts-static-fallback{position:absolute;top:9%;left:42%;width:36%;height:80%;overflow:hidden;pointer-events:none;z-index:0;background:#dce1d8;}
.plab-ts .plab-ts-static-fallback img{width:100%;height:100%;max-width:none;display:block;object-fit:var(--plab-ts-image-fit,cover);object-position:var(--plab-ts-crop-x,50%) var(--plab-ts-crop-y,50%);}
.plab-ts[data-ts-ready="1"] .plab-ts-static-fallback{display:none!important;}
/* v1.1.12: one drag surface for tablet portrait and phone.
   `pan-y` lets the entire page scroll vertically; horizontal motion is
   handled on the portrait viewport by the pointer swipe controller. */
@media (max-width:1199px) and (orientation:portrait), (max-width:679px){
 /* Native iOS/Android scroll decides horizontal gallery vs vertical page
    scroll itself. pan-y blocked horizontal touch scroll on real devices. */
 .plab-ts .plab-ts-mobile-viewport{touch-action:auto!important;scroll-snap-type:x mandatory;cursor:grab;}
 /* Once enhanced, let vertical page scroll stay native and leave horizontal
    touch movement to the axis-locked carousel controller. Without JS, the
    carousel remains scrollable natively as before. */
 .plab-ts[data-ts-portrait-ready="1"] .plab-ts-mobile-viewport{touch-action:pan-y pinch-zoom!important;}
 .plab-ts .plab-ts-mobile-viewport.plab-ts-is-dragging{cursor:grabbing;scroll-snap-type:none!important;user-select:none;-webkit-user-select:none;}
 .plab-ts .plab-ts-mobile-photo img{user-select:none;-webkit-user-select:none;pointer-events:none;}
}

/* v1.1.13 — configurable desktop/landscape navigation. SVG icons inherit Arrow colour. */
.plab-ts .plab-ts-controls{gap:var(--plab-ts-button-gap,8px)}
.plab-ts .plab-ts-controls button{
  position:relative;isolation:isolate;overflow:hidden;
  border:var(--plab-ts-button-border-width,1px) solid var(--plab-ts-button-border,currentColor)!important;
  border-radius:var(--plab-ts-button-radius,0px)!important;
  background:transparent!important;color:var(--plab-ts-button-icon,currentColor)!important;
  transition:color .22s ease,border-color .22s ease,transform .22s ease!important;
}
.plab-ts .plab-ts-controls button::before{
  content:"";position:absolute;inset:0;z-index:-1;
  background:var(--plab-ts-button-bg,#f7f8ed);opacity:var(--plab-ts-button-bg-opacity,1);
  transition:background .22s ease,opacity .22s ease;
}
.plab-ts .plab-ts-controls button:hover:not(:disabled){
  color:var(--plab-ts-button-hover-icon,currentColor)!important;
  border-color:var(--plab-ts-button-hover-border,currentColor)!important;
}
.plab-ts .plab-ts-controls button:hover:not(:disabled)::before{background:var(--plab-ts-button-hover-bg,#1c2820);opacity:1;}
.plab-ts[data-ts-nav-style=minimal] .plab-ts-controls button{border-width:0!important;}
.plab-ts .plab-ts-controls svg.plab-ts-nav-icon,
.plab-ts .plab-ts-controls img.plab-ts-custom-icon{
 display:block;width:min(var(--plab-ts-button-icon-size,22px),calc(var(--plab-ts-nav-size,48px) - 8px));
 height:min(var(--plab-ts-button-icon-size,22px),calc(var(--plab-ts-nav-size,48px) - 8px));
 flex-shrink:0;pointer-events:none;
}
.plab-ts .plab-ts-controls svg.plab-ts-nav-icon{stroke-width:var(--plab-ts-button-stroke,2);}
.plab-ts .plab-ts-controls img.plab-ts-custom-icon{object-fit:contain;}
@media(prefers-reduced-motion:reduce){.plab-ts .plab-ts-controls button,.plab-ts .plab-ts-controls button::before{transition:none!important}}

/* v1.1.14: remove unwanted large focus rectangle from the focusable
   showcase root / portrait scroll viewport. These elements need to remain
   focusable for keyboard controls, but must not look like the navigation
   buttons' configurable border has been applied to the whole carousel. */
.plab-ts:focus,
.plab-ts:focus-visible,
.plab-ts .plab-ts-mobile-viewport:focus,
.plab-ts .plab-ts-mobile-viewport:focus-visible{
  outline:none!important;
  box-shadow:none!important;
}
/* Retain a visible keyboard-focus cue without outlining the carousel box. */
.plab-ts:focus-visible .plab-ts-controls > button:first-child{
  outline:2px solid currentColor;
  outline-offset:3px;
}
.plab-ts .plab-ts-mobile-viewport:focus-visible .plab-ts-mobile-card.is-current .plab-ts-mobile-name{
  text-decoration:underline;
  text-underline-offset:5px;
  text-decoration-thickness:2px;
}
/* Navigation borders only belong to the Previous and Next BUTTON elements.
   Do not add a border, outline or shadow to a container or portrait slot. */


/* v1.1.15 — borderless Team Showcase frame across desktop, tablet and phone.
 * Distinguish the overall slider frame from its Previous/Next BUTTONS.
 * Divi and other front-end styles may put a border/outline/shadow on
 * a focused module, inner stage or scrolling viewport. None of these
 * surfaces are intended to have a visible perimeter in this design.
 * Keep these rules scoped to this plugin; DO NOT target nav buttons,
 * portrait masks, progress indicators or links. */
section.plab-ts,
section.plab-ts > .plab-ts-inner,
section.plab-ts .plab-ts-stage,
section.plab-ts .plab-ts-mobile-slider,
section.plab-ts .plab-ts-mobile-viewport,
section.plab-ts:focus-within,
section.plab-ts > .plab-ts-inner:focus-within,
section.plab-ts .plab-ts-stage:focus-within,
section.plab-ts .plab-ts-mobile-viewport:focus-within{
  border:none!important;
  outline:none!important;
  box-shadow:none!important;
}

/* v1.1.46 — Global navigation X/Y offsets always apply on landscape screens.
 * v1.1.16 replaced them with 0px compact/large responsive values at widths
 * <1200px and >=1600px, making the main Builder controls appear nonfunctional.
 * Add each responsive adjustment to the base (rather than replacing it).
 * The unchanged 0/0 defaults retain the original v1.1.41 button geometry.
 * Portrait/tablet-phone mode continues hiding these controls. */
.plab-ts .plab-ts-controls{
  transform:translate(
    calc(var(--plab-ts-nav-offset-x,0px) + var(--plab-ts-nav-render-x,0px)),
    calc(var(--plab-ts-nav-offset-y,0px) + var(--plab-ts-nav-render-y,0px))
  );
}
.plab-ts .plab-ts-controls button{
  width:var(--plab-ts-button-render-size,var(--plab-ts-nav-size,48px));
  height:var(--plab-ts-button-render-size,var(--plab-ts-nav-size,48px));
}
.plab-ts .plab-ts-controls svg.plab-ts-nav-icon,
.plab-ts .plab-ts-controls img.plab-ts-custom-icon{
  width:min(var(--plab-ts-button-render-icon-size,var(--plab-ts-button-icon-size,22px)),calc(var(--plab-ts-button-render-size,var(--plab-ts-nav-size,48px)) - 8px));
  height:min(var(--plab-ts-button-render-icon-size,var(--plab-ts-button-icon-size,22px)),calc(var(--plab-ts-button-render-size,var(--plab-ts-nav-size,48px)) - 8px));
}
@media (min-width:680px) and (max-width:1199px){
  .plab-ts{
    --plab-ts-button-render-size:var(--plab-ts-nav-compact-size,40px);
    --plab-ts-button-render-icon-size:var(--plab-ts-nav-compact-icon,19px);
    --plab-ts-nav-render-x:var(--plab-ts-nav-compact-x,0px);
    --plab-ts-nav-render-y:var(--plab-ts-nav-compact-y,0px);
  }
}
@media (min-width:1600px){
  .plab-ts{
    --plab-ts-button-render-size:var(--plab-ts-nav-large-size,52px);
    --plab-ts-button-render-icon-size:var(--plab-ts-nav-large-icon,24px);
    --plab-ts-nav-render-x:var(--plab-ts-nav-large-x,0px);
    --plab-ts-nav-render-y:var(--plab-ts-nav-large-y,0px);
  }
}
/* The mask stays stationary across transitions. Zoom applies ONLY to the
 * active portrait's image behind that mask, not to preview windows. */
.plab-ts .plab-ts-fixed-mask.plab-ts-is-main-mask .plab-ts-image-cell img{
  transform:scale(var(--plab-ts-main-photo-zoom,1));
  transform-origin:var(--plab-ts-crop-x,50%) var(--plab-ts-crop-y,50%);
}


/* v1.1.17/v1.1.20 — fluid typography. The root must retain its intrinsic
   width in Divi flex Code Modules, so cqi measures the sized inner showcase. */
.plab-ts{container-type:normal;}
.plab-ts-inner{container-type:inline-size;}
.plab-ts .plab-ts-eyebrow,
.plab-ts .plab-ts-mobile-heading{
 font-size:var(--plab-ts-font-heading,clamp(11px,calc(11px + .30cqi),13px))!important;
}
.plab-ts .plab-ts-name,
.plab-ts .plab-ts-mobile-name{
 font-size:var(--plab-ts-font-name,clamp(23px,calc(23px + 2.6cqi),52px))!important;
}
.plab-ts .plab-ts-qualifications,
.plab-ts .plab-ts-mobile-qualifications{
 font-size:var(--plab-ts-font-qual,clamp(12px,calc(12px + .40cqi),17px))!important;
}
.plab-ts .plab-ts-role,
.plab-ts .plab-ts-mobile-role{
 font-size:var(--plab-ts-font-role,clamp(12px,calc(12px + .52cqi),19px))!important;
}
.plab-ts .plab-ts-bio,
.plab-ts .plab-ts-mobile-bio{
 font-size:var(--plab-ts-font-bio,clamp(12px,calc(12px + .40cqi),17px))!important;
}
.plab-ts .plab-ts-contact,
.plab-ts .plab-ts-mobile-contact,
.plab-ts .plab-ts-contact a,
.plab-ts .plab-ts-mobile-contact a{
 font-size:var(--plab-ts-font-contact,clamp(11px,calc(11px + .32cqi),15px))!important;
}
.plab-ts .plab-ts-link,
.plab-ts .plab-ts-mobile-link{
 font-size:var(--plab-ts-font-link,clamp(11px,calc(11px + .32cqi),15px))!important;
}
.plab-ts .plab-ts-count,
.plab-ts .plab-ts-mobile-index{
 font-size:var(--plab-ts-font-index,clamp(10px,calc(10px + .26cqi),13px))!important;
}
/* Keep text alignment consistent on portrait cards as well as desktop. */
.plab-ts .plab-ts-copy,
.plab-ts .plab-ts-mobile-info,
.plab-ts .plab-ts-mobile-heading{text-align:var(--plab-ts-text-align,left)!important;}


/* v1.1.19 regression correction: desktop-only text spacing.
   IMPORTANT: portrait-mode styling matches v1.1.17 byte-for-byte to avoid
   changing the previously functional tablet/mobile cards. */
@media (min-width:981px), (min-width:680px) and (orientation:landscape) {
  .plab-ts .plab-ts-copy > .plab-ts-eyebrow,
  .plab-ts .plab-ts-copy > .plab-ts-name,
  .plab-ts .plab-ts-copy > .plab-ts-qualifications,
  .plab-ts .plab-ts-copy > .plab-ts-role,
  .plab-ts .plab-ts-copy > .plab-ts-bio,
  .plab-ts .plab-ts-copy > .plab-ts-contact,
  .plab-ts .plab-ts-copy > .plab-ts-link-wrap,
  .plab-ts .plab-ts-copy > .plab-ts-count {
    box-sizing:border-box;
    min-height:0;
    flex-shrink:0;
    padding-block:0!important;
    margin-top:0!important;
  }
  .plab-ts .plab-ts-copy > .plab-ts-name {margin-bottom:var(--plab-ts-gap-name,12px)!important;}
  .plab-ts .plab-ts-copy > .plab-ts-qualifications {margin-bottom:var(--plab-ts-gap-qual,8px)!important;}
  .plab-ts .plab-ts-copy > .plab-ts-role {margin-bottom:var(--plab-ts-gap-role,14px)!important;}
  .plab-ts .plab-ts-copy > .plab-ts-bio {margin-bottom:var(--plab-ts-gap-bio,12px)!important;}
  .plab-ts .plab-ts-copy > .plab-ts-contact {margin-bottom:var(--plab-ts-gap-contact,10px)!important;}
  .plab-ts .plab-ts-copy > .plab-ts-link-wrap {margin-bottom:0!important;}
  .plab-ts .plab-ts-copy > .plab-ts-bio {
    min-width:0; max-width:47ch; width:100%; flex:0 0 auto!important;
    display:-webkit-box; -webkit-box-orient:vertical;
    -webkit-line-clamp:var(--plab-ts-bio-lines,8);
    line-clamp:var(--plab-ts-bio-lines,8);
    overflow:hidden;
  }
  .plab-ts .plab-ts-copy > .plab-ts-contact {min-width:0;max-width:100%;flex:0 0 auto!important;}
}
/* Keep wrapping long contact URLs without altering the portrait slider. */
.plab-ts .plab-ts-contact a,
.plab-ts .plab-ts-mobile-contact a,
.plab-ts .plab-ts-link,
.plab-ts .plab-ts-mobile-link {overflow-wrap:anywhere;word-break:break-word;}


/* v1.1.20 — Divi mobile Code Module intrinsic-width fix.
 * Inline-size containment on the outer .plab-ts collapsed its intrinsic width
 * to zero when an auto-sized Divi Code Module was inside a flex column.
 * The size-query container lives on the already-sized inner stage instead.
 * The :has() selector is scoped to Code Modules that contain THIS shortcode.
 */
@media (max-width:1199px) and (orientation:portrait), (max-width:679px) {
  .et_pb_code:has(.et_pb_code_inner > .plab-ts) {
    width:100%!important;
    min-width:0!important;
    max-width:100%!important;
    align-self:stretch!important;
  }
  .et_pb_code_inner:has(> .plab-ts) {
    display:block;
    width:100%!important;
    min-width:0!important;
    max-width:100%!important;
  }
  .plab-ts {
    display:block;
    width:100%!important;
    max-width:100%!important;
    min-width:0!important;
  }
}

/* v1.1.21 — No permanent promotion of several full-width, triple-image
   desktop strips while the page is being scrolled. WAAPI promotes the
   transform while a carousel transition actually runs. */
.plab-ts .plab-ts-inner-strip{will-change:auto;}

/* v1.1.23 — real-phone WebKit flick stability. The script owns slide settling
   on phones, not WebKit's scroll-snap and scroll momentum at the same time.
   Tablet portrait remains on its confirmed v1.1.22 rules. */
@media (max-width:679px){
 .plab-ts[data-ts-portrait-ready="1"] .plab-ts-mobile-viewport{
   scroll-snap-type:none!important;scroll-behavior:auto!important;
   overscroll-behavior-x:none;touch-action:pan-y pinch-zoom!important;
 }
}

/* v1.1.24: phone-only transform track, controlled by one requestAnimationFrame
 * timeline instead of mixed WebKit scroll-snap + JS scrollLeft. On tablet
 * portrait the v1.1.22 native-scroll controller is retained unchanged. */
@media (max-width:679px){
 .plab-ts[data-ts-portrait-ready="1"] .plab-ts-mobile-viewport{
  overflow-x:hidden!important;overflow-y:hidden!important;
  scroll-snap-type:none!important;scroll-behavior:auto!important;
  touch-action:pan-y pinch-zoom!important;
 }
 .plab-ts[data-ts-portrait-ready="1"] .plab-ts-mobile-track{
  transform:translate3d(0,0,0);transition:none!important;
  will-change:transform!important;
 }
 .plab-ts[data-ts-portrait-ready="1"] .plab-ts-mobile-card{
  scroll-snap-align:none!important;
 }
}

/* v1.1.25 — offscreen circular-card recycling must not trigger viewport scroll anchoring. */
@media (max-width:679px){
 .plab-ts[data-ts-portrait-ready="1"] .plab-ts-mobile-viewport,
 .plab-ts[data-ts-portrait-ready="1"] .plab-ts-mobile-track{overflow-anchor:none!important;}
}


/* v1.1.29 — device-scoped typography & authoritative spacing.
 * Root inline variables hold saved settings. Active variables are defined on
 * the sized inner container, so viewport overrides are not defeated by inline
 * declarations on the root .plab-ts element. No slider/animation CSS changed.
 */
.plab-ts .plab-ts-inner{
 --plab-ts-render-font-heading:var(--plab-ts-font-heading);
 --plab-ts-render-font-name:var(--plab-ts-font-name);
 --plab-ts-render-font-qual:var(--plab-ts-font-qual);
 --plab-ts-render-font-role:var(--plab-ts-font-role);
 --plab-ts-render-font-bio:var(--plab-ts-font-bio);
 --plab-ts-render-font-contact:var(--plab-ts-font-contact);
 --plab-ts-render-font-link:var(--plab-ts-font-link);
 --plab-ts-render-font-index:var(--plab-ts-font-index);
 --plab-ts-render-gap-name:var(--plab-ts-gap-name,12px);
 --plab-ts-render-gap-qual:var(--plab-ts-gap-qual,8px);
 --plab-ts-render-gap-role:var(--plab-ts-gap-role,14px);
 --plab-ts-render-gap-bio:var(--plab-ts-gap-bio,12px);
 --plab-ts-render-gap-contact:var(--plab-ts-gap-contact,10px);
 --plab-ts-render-align:var(--plab-ts-text-align,left);
}
@media (max-width:1199px) and (orientation:portrait), (max-width:679px){
 .plab-ts .plab-ts-inner{
  --plab-ts-render-font-heading:var(--plab-ts-tablet-font-heading);
  --plab-ts-render-font-name:var(--plab-ts-tablet-font-name);
  --plab-ts-render-font-qual:var(--plab-ts-tablet-font-qual);
  --plab-ts-render-font-role:var(--plab-ts-tablet-font-role);
  --plab-ts-render-font-bio:var(--plab-ts-tablet-font-bio);
  --plab-ts-render-font-contact:var(--plab-ts-tablet-font-contact);
  --plab-ts-render-font-link:var(--plab-ts-tablet-font-link);
  --plab-ts-render-font-index:var(--plab-ts-tablet-font-index);
  --plab-ts-render-gap-name:var(--plab-ts-tablet-gap-name);
  --plab-ts-render-gap-qual:var(--plab-ts-tablet-gap-qual);
  --plab-ts-render-gap-role:var(--plab-ts-tablet-gap-role);
  --plab-ts-render-gap-bio:var(--plab-ts-tablet-gap-bio);
  --plab-ts-render-gap-contact:var(--plab-ts-tablet-gap-contact);
  --plab-ts-render-gap-heading:var(--plab-ts-tablet-gap-heading,14px);
  --plab-ts-render-gap-link:var(--plab-ts-tablet-gap-link,10px);
  --plab-ts-render-gap-index:var(--plab-ts-tablet-gap-index,8px);
  --plab-ts-render-align:var(--plab-ts-tablet-text-align,var(--plab-ts-text-align,left));
 }
}
@media (max-width:679px){
 .plab-ts .plab-ts-inner{
  --plab-ts-render-font-heading:var(--plab-ts-mobile-font-heading);
  --plab-ts-render-font-name:var(--plab-ts-mobile-font-name);
  --plab-ts-render-font-qual:var(--plab-ts-mobile-font-qual);
  --plab-ts-render-font-role:var(--plab-ts-mobile-font-role);
  --plab-ts-render-font-bio:var(--plab-ts-mobile-font-bio);
  --plab-ts-render-font-contact:var(--plab-ts-mobile-font-contact);
  --plab-ts-render-font-link:var(--plab-ts-mobile-font-link);
  --plab-ts-render-font-index:var(--plab-ts-mobile-font-index);
  --plab-ts-render-gap-name:var(--plab-ts-mobile-gap-name);
  --plab-ts-render-gap-qual:var(--plab-ts-mobile-gap-qual);
  --plab-ts-render-gap-role:var(--plab-ts-mobile-gap-role);
  --plab-ts-render-gap-bio:var(--plab-ts-mobile-gap-bio);
  --plab-ts-render-gap-contact:var(--plab-ts-mobile-gap-contact);
  --plab-ts-render-gap-heading:var(--plab-ts-mobile-gap-heading,14px);
  --plab-ts-render-gap-link:var(--plab-ts-mobile-gap-link,10px);
  --plab-ts-render-gap-index:var(--plab-ts-mobile-gap-index,8px);
  --plab-ts-render-align:var(--plab-ts-mobile-text-align,var(--plab-ts-text-align,left));
 }
}
/* All eight font controls bind to the active viewport. These rules take
 * precedence over Divi defaults without adding styles outside this plugin. */
.plab-ts .plab-ts-eyebrow,.plab-ts .plab-ts-mobile-heading {font-size:var(--plab-ts-render-font-heading)!important}
.plab-ts .plab-ts-name,.plab-ts .plab-ts-mobile-name {font-size:var(--plab-ts-render-font-name)!important}
.plab-ts .plab-ts-qualifications,.plab-ts .plab-ts-mobile-qualifications {font-size:var(--plab-ts-render-font-qual)!important}
.plab-ts .plab-ts-role,.plab-ts .plab-ts-mobile-role {font-size:var(--plab-ts-render-font-role)!important}
.plab-ts .plab-ts-bio,.plab-ts .plab-ts-mobile-bio {font-size:var(--plab-ts-render-font-bio)!important}
.plab-ts .plab-ts-contact,.plab-ts .plab-ts-mobile-contact,.plab-ts .plab-ts-contact a,.plab-ts .plab-ts-mobile-contact a {font-size:var(--plab-ts-render-font-contact)!important}
.plab-ts .plab-ts-link,.plab-ts .plab-ts-mobile-link {font-size:var(--plab-ts-render-font-link)!important}
.plab-ts .plab-ts-count,.plab-ts .plab-ts-mobile-index {font-size:var(--plab-ts-render-font-index)!important}
/* Set an actual margin on the element, not a gap on a hidden/wrapper node.
 * Divi's aggressive paragraph padding/margin rules must never win. */
.plab-ts .plab-ts-copy > .plab-ts-name,.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-name {margin-bottom:var(--plab-ts-render-gap-name,12px)!important}
.plab-ts .plab-ts-copy > .plab-ts-qualifications,.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-qualifications {margin-bottom:var(--plab-ts-render-gap-qual,8px)!important}
.plab-ts .plab-ts-copy > .plab-ts-role,.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-role {margin-bottom:var(--plab-ts-render-gap-role,14px)!important}
.plab-ts .plab-ts-copy > .plab-ts-bio,.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-bio {margin-bottom:var(--plab-ts-render-gap-bio,12px)!important}
.plab-ts .plab-ts-copy > .plab-ts-contact,.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-contact {margin-bottom:var(--plab-ts-render-gap-contact,10px)!important}
.plab-ts .plab-ts-copy > .plab-ts-name,.plab-ts .plab-ts-copy > .plab-ts-qualifications,
.plab-ts .plab-ts-copy > .plab-ts-role,.plab-ts .plab-ts-copy > .plab-ts-bio,
.plab-ts .plab-ts-copy > .plab-ts-contact,.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-name,
.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-qualifications,.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-role,
.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-bio,.plab-ts .plab-ts-mobile-info > .plab-ts-mobile-contact{
 padding-top:0!important;padding-bottom:0!important;margin-top:0!important;
}
/* Portrait-only extra spacing; the desktop heading and index intentionally
 * stay anchored in the original editorial layout. */
@media (max-width:1199px) and (orientation:portrait), (max-width:679px){
 .plab-ts .plab-ts-mobile-heading{margin:0 0 var(--plab-ts-render-gap-heading,14px)!important;padding-bottom:0!important}
 .plab-ts .plab-ts-mobile-info > .plab-ts-mobile-link{margin:0 0 var(--plab-ts-render-gap-link,10px)!important}
 .plab-ts .plab-ts-mobile-info > .plab-ts-mobile-index{margin:var(--plab-ts-render-gap-index,8px) 0 0!important}
}
.plab-ts .plab-ts-copy,.plab-ts .plab-ts-mobile-info,.plab-ts .plab-ts-mobile-heading{text-align:var(--plab-ts-render-align,left)!important}

/* Divi's theme p/h2 spacing can be declared !important and has more class
 * specificity than generic .plab-ts field rules. Keep these high-specificity
 * overrides limited to the five configurable field gaps. */
section.plab-ts .plab-ts-inner .plab-ts-copy > h2.plab-ts-name,
section.plab-ts .plab-ts-inner .plab-ts-mobile-info > h2.plab-ts-mobile-name{margin:0 0 var(--plab-ts-render-gap-name,12px)!important;padding-block:0!important}
section.plab-ts .plab-ts-inner .plab-ts-copy > p.plab-ts-qualifications,
section.plab-ts .plab-ts-inner .plab-ts-mobile-info > p.plab-ts-mobile-qualifications{margin:0 0 var(--plab-ts-render-gap-qual,8px)!important;padding-block:0!important}
section.plab-ts .plab-ts-inner .plab-ts-copy > p.plab-ts-role,
section.plab-ts .plab-ts-inner .plab-ts-mobile-info > p.plab-ts-mobile-role{margin:0 0 var(--plab-ts-render-gap-role,14px)!important;padding-block:0!important}
section.plab-ts .plab-ts-inner .plab-ts-copy > p.plab-ts-bio,
section.plab-ts .plab-ts-inner .plab-ts-mobile-info > p.plab-ts-mobile-bio{margin:0 0 var(--plab-ts-render-gap-bio,12px)!important;padding-block:0!important}
section.plab-ts .plab-ts-inner .plab-ts-copy > p.plab-ts-contact,
section.plab-ts .plab-ts-inner .plab-ts-mobile-info > div.plab-ts-mobile-contact{margin:0 0 var(--plab-ts-render-gap-contact,10px)!important;padding-block:0!important}
@media (max-width:1199px) and (orientation:portrait), (max-width:679px){
 section.plab-ts .plab-ts-inner .plab-ts-mobile-slider > p.plab-ts-mobile-heading{margin:0 0 var(--plab-ts-render-gap-heading,14px)!important;padding-bottom:0!important}
 section.plab-ts .plab-ts-inner .plab-ts-mobile-info > a.plab-ts-mobile-link{margin:0 0 var(--plab-ts-render-gap-link,10px)!important}
 section.plab-ts .plab-ts-inner .plab-ts-mobile-info > p.plab-ts-mobile-index{margin:var(--plab-ts-render-gap-index,8px) 0 0!important;padding-block:0!important}
}

/* v1.1.31 — Portrait photo height control: slider-card frame, not the legacy
 * fixed-mask stage. 0 is represented by "none" and preserves natural aspect.
 * A positive cap changes the frame height, cropping under object-fit:cover.
 * Do not add transforms or alter card width/track offset: those belong to
 * the already working portrait swipe and infinite-loop engines. */
@media (min-width:680px) and (max-width:1199px) and (orientation:portrait){
 .plab-ts .plab-ts-mobile-photo{max-height:var(--plab-ts-tablet-photo-cap,none)!important;}
}
@media (max-width:679px){
 .plab-ts .plab-ts-mobile-photo{max-height:var(--plab-ts-mobile-photo-cap,none)!important;}
}

/* v1.1.42 — Explicit two-way desktop/landscape content placement.
 * Earlier CSS used a hard-coded 40% content width even though the Builder
 * exposes Profile Text Column (%), making saved compositions look unchanged
 * or overlap. Keep the portrait/tablet-phone card system untouched. */
@media (min-width:981px), (min-width:680px) and (orientation:landscape){
 .plab-ts[data-ts-desktop-layout="right"] .plab-ts-copy{
  left:0;right:auto;width:var(--plab-ts-copy-width,39%);
 }
 .plab-ts[data-ts-desktop-layout="left"] .plab-ts-copy{
  left:auto;right:0;width:var(--plab-ts-copy-width,39%);
 }
}

/* v1.1.43 — Explicit nav alignment and profile composition.
 * v1.1.41's mirrored layout CSS forced the nav to left even when Top Right
 * was selected, and v1.1.42 had left this untouched. Respect the Navigation
 * setting; optionally follow the portrait side. Keep all offsets functional.
 * Profile width follows the Builder across both mirrored arrangements.
 * Portrait cards on tablet portrait/mobile are never affected. */
@media (min-width:981px), (min-width:680px) and (orientation:landscape){
 .plab-ts[data-ts-desktop-layout="right"] .plab-ts-copy{
   left:0;right:auto;width:var(--plab-ts-copy-width,39%);
 }
 .plab-ts[data-ts-desktop-layout="left"] .plab-ts-copy{
   right:0;left:auto;width:var(--plab-ts-copy-width,39%);
 }
 .plab-ts[data-ts-nav-location="right"] .plab-ts-controls,
 .plab-ts[data-ts-nav-location="auto"][data-ts-desktop-layout="right"] .plab-ts-controls{
   right:3%;left:auto;
 }
 .plab-ts[data-ts-nav-location="left"] .plab-ts-controls,
 .plab-ts[data-ts-nav-location="auto"][data-ts-desktop-layout="left"] .plab-ts-controls{
   left:3%;right:auto;
 }
}

/* v1.1.44: v1.1.41 reference navigation belongs at the showcase EDGE, not
 * over the active photograph. Keep automatic mirror behaviour but use the
 * original mirrored 1% nav inset, and preserve explicit Top Left/Right. */
@media (min-width:981px), (min-width:680px) and (orientation:landscape){
 .plab-ts[data-ts-nav-location="auto"][data-ts-desktop-layout="left"] .plab-ts-controls{
  left:1%;right:auto;
 }
}

/* v1.1.45 — Profile X offset without recalculating the original portrait/nav geometry.
 * The copy remains in its measured column; moving it visually does not
 * enlarge that column, shift navigation or reposition preview masks. */
@media (min-width:981px), (min-width:680px) and (orientation:landscape){
 .plab-ts .plab-ts-copy{transform:translateX(var(--plab-ts-copy-offset-x,0px));}
}

/* v1.1.45 — GPU subpixel seam fix for the desktop stationary-mask strip.
 * The three moving image cells previously met at fractional 33.333333%
 * boundaries. Chrome/graphics compositing could reveal a ~1px transparent
 * hairline during the leftward slide (but not always on rightward slides).
 * Overscan each CELL 2px past its successor's start and let the successor
 * paint over the overlap. The strip's original width, 0/−1/−2-cell
 * animation endpoints, image order and outer mask geometry are unchanged.
 * Applies only to fixed-mask DESKTOP image strips, not tablet/phone cards. */
.plab-ts .plab-ts-fixed-mask > .plab-ts-inner-strip > .plab-ts-image-cell{
 position:absolute;
 top:0;
 height:100%;
 flex:none;
 width:calc(33.333333333% + 2px);
}
.plab-ts .plab-ts-fixed-mask > .plab-ts-inner-strip > .plab-ts-image-cell:nth-child(1){left:0;}
.plab-ts .plab-ts-fixed-mask > .plab-ts-inner-strip > .plab-ts-image-cell:nth-child(2){left:33.333333333%;}
.plab-ts .plab-ts-fixed-mask > .plab-ts-inner-strip > .plab-ts-image-cell:nth-child(3){left:66.666666667%;}

/* v1.1.49 — Tablet portrait stage clipping correction.
 * v1.1.47 accidentally matched ALL viewports >=981px, including tablet
 * portrait 981–1199px. Its high-specificity !important fixed height won over
 * the portrait card carousel's height:auto rule, clipping profile information
 * under the image and bringing the footer up over the biography.
 * Desktop fixed-stage height must apply ONLY outside the PHP/JS portrait-card
 * mode: >=1200px regardless of orientation, or >=680px in landscape.
 * At 680–1199px portrait the stage stays auto-sized by its slider cards. */
@media (min-width:1200px), (min-width:680px) and (orientation:landscape){
 section.plab-ts .plab-ts-stage{
  height:var(--plab-ts-stage-height,clamp(480px,60vw,940px))!important;
 }
}

/* v1.1.51: Entrance preparation is JS-armed only. No JS = readable content.
 * Do NOT transform .plab-ts-fixed-mask or the portrait swipe track. */
.plab-ts[data-ts-entrance-pending="1"] > .plab-ts-inner,
.plab-ts[data-ts-entrance-pending="1"] > .plab-ts-rail{visibility:hidden}
.plab-ts .plab-ts-reveal-surface{position:absolute;inset:0;width:100%;height:100%;overflow:hidden;pointer-events:none;contain:paint;transform-origin:center center;backface-visibility:hidden}
@media(prefers-reduced-motion:reduce){.plab-ts[data-ts-entrance-pending="1"] > .plab-ts-inner,.plab-ts[data-ts-entrance-pending="1"] > .plab-ts-rail{visibility:visible}}

/* v1.1.52 — Temporary coloured entrance masks, clipped by ORIGINAL photo bounds.
 * No transforms on fixed masks, desktop strips, tablet/mobile cards or swipe track. */
.plab-ts .plab-ts-color-mask-layer,
.plab-ts .plab-ts-color-mask-feather{position:absolute;inset:0;display:block;box-sizing:border-box;pointer-events:none!important;z-index:4;will-change:clip-path,transform;}
.plab-ts .plab-ts-color-mask-feather{inset:auto;z-index:5;}
.plab-ts .plab-ts-mobile-photo>.plab-ts-color-mask-layer,
.plab-ts .plab-ts-mobile-photo>.plab-ts-color-mask-feather{z-index:4;}
.plab-ts .plab-ts-mobile-photo>.plab-ts-color-mask-feather{z-index:5;}
@media(prefers-reduced-motion:reduce){.plab-ts .plab-ts-color-mask-layer,.plab-ts .plab-ts-color-mask-feather{display:none!important}}
