/* Core-PHP compatibility additions layered on top of the supplied source CSS. */
.brand__logo{display:block;width:auto;height:auto;max-width:148px;max-height:31px;object-fit:contain}
:root[data-over-film] .brand__logo{filter:drop-shadow(0 1px 3px rgba(0,0,0,.45))}
.nav__mobile-top,.nav__mobile-cta,.nav-backdrop,.nav-close{display:none!important}
.icon--scheme svg,.dock svg{width:1.1rem;height:1.1rem}
.status-badge{display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:var(--primary-soft);color:var(--primary);font-size:.76rem;font-weight:600;padding:.42rem .75rem;white-space:nowrap}
.alert{margin:1.25rem 0;padding:.95rem 1.2rem;border-radius:var(--radius);font-size:.96rem;background:var(--surface);box-shadow:inset 0 0 0 1px var(--accent)}
.alert.error{box-shadow:inset 0 0 0 1px var(--object-paint)}
.blog-shell{display:grid;grid-template-columns:minmax(0,1fr) minmax(14rem,18rem);gap:clamp(2rem,5vw,4rem);align-items:start}
.blog-posts{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,19rem),1fr));gap:1.25rem;min-width:0}
.blog-sidebar{position:sticky;top:6rem;display:grid;gap:1.25rem;min-width:0}
.blog-sidebar .panelbox{padding:1.35rem}
.track-card{margin-top:2rem;padding:clamp(1.5rem,3vw,2.25rem);background:var(--surface);border-radius:var(--radius-lg);box-shadow:inset 0 1px 0 color-mix(in oklab,var(--text) 7%,transparent),0 12px 38px -26px rgba(0,0,0,.32)}
.track-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem;margin-top:1.35rem}
.track-summary>div{padding-top:.8rem;border-top:1px solid var(--line);min-width:0}.track-summary small{display:block;color:var(--muted);font-size:.8rem}.track-summary b{display:block;margin-top:.2rem;overflow-wrap:anywhere;font-weight:500}
.timeline{position:relative;margin-top:2rem;padding-left:2rem}.timeline::before{content:"";position:absolute;left:.35rem;top:.5rem;bottom:.5rem;width:1px;background:var(--line)}
.event{position:relative;padding:0 0 1.6rem .65rem}.event:last-child{padding-bottom:0}.event::before{content:"";position:absolute;left:-1.95rem;top:.35rem;width:.65rem;height:.65rem;border-radius:50%;background:var(--primary);box-shadow:0 0 0 4px var(--bg)}
.event h4{font-size:1.02rem;margin-bottom:.2rem}.event p{font-size:.92rem;color:var(--muted)}.event time{display:block;margin-top:.35rem;font-size:.8rem;color:var(--muted)}.event .location{font-size:.84rem;color:var(--primary);margin-bottom:.2rem}
.film__video{position:absolute;inset:0;z-index:0;width:100%;height:100%;object-fit:cover;display:none;background:#0b0d11}
.film[data-media="video"] .film__video{display:block}.film[data-media="video"] .film__canvas{visibility:hidden}
.film__canvas{z-index:0}
/* The source's player writes these values directly. Keep them compositor friendly. */
.film__copy{will-change:opacity,transform}.film__copy>*{will-change:opacity,transform}
@media(max-width:900px){
  .blog-shell{grid-template-columns:1fr}.blog-sidebar{position:static;order:-1}
  .head__in .brand{min-width:0}.brand__logo{max-width:132px;max-height:28px}
}
@media(max-width:640px){.track-summary{grid-template-columns:1fr}.brand__logo{max-width:118px;max-height:25px}}
.rv[data-shown],.rv.revealed{opacity:1;transform:none}


/* v7 — one shared public chrome on every public page. The header/footer no
   longer change treatment when the homepage film starts/stops or on Blog pages. */
.public-shell .head{isolation:isolate}
.public-shell .head__in,
:root[data-over-film] .public-shell .head__in,
:root[data-scrolled] .public-shell .head__in{
  background:color-mix(in oklab,var(--surface) 76%,transparent)!important;
  -webkit-backdrop-filter:blur(30px) saturate(185%)!important;
  backdrop-filter:blur(30px) saturate(185%)!important;
  box-shadow:inset 0 1px 0 color-mix(in oklab,#fff 36%,transparent),inset 0 -1px 0 color-mix(in oklab,#000 10%,transparent),inset 0 0 0 1px color-mix(in oklab,var(--text) 9%,transparent),0 10px 34px -18px rgba(0,0,0,.34)!important;
}
.public-shell .foot{
  background:var(--surface)!important;
  color:var(--text);
  border-top:1px solid var(--line);
  isolation:isolate;
}
.public-shell .foot__in{width:100%}
.public-shell .foot__grid{align-items:start}
.public-shell .foot h3,.public-shell .foot a,.public-shell .foot span{font-family:var(--font-body)}

/* Progressive homepage film: show an immediately decodable first-frame poster,
   then fade it away only after the canvas/video has a real frame. */
.film__poster{position:absolute;inset:0;z-index:0;display:block;width:100%;height:100%;overflow:hidden;background:#0b0d11;pointer-events:none}
.film__poster img{width:100%;height:100%;object-fit:cover;object-position:center;transform:scale(1.012);transition:opacity .55s ease,transform 1.1s cubic-bezier(.22,.68,.24,1)}
.film__canvas{z-index:1!important}
.film__video{z-index:1!important}
.film[data-ready] .film__poster img{opacity:0;transform:scale(1.025)}
.film[data-poster-ready] .film__stage::after,.film[data-ready] .film__stage::after{opacity:0}
.film:not([data-poster-ready]):not([data-ready]) .film__stage::after{opacity:1}
@media(max-width:900px){.film__poster img{object-position:center center}}
@media(prefers-reduced-motion:reduce){.film__poster img{transition:none!important;transform:none!important}}

/* v8 — use exactly one floating contact icon. The source CSS already draws the
   WhatsApp/telephone marks with masks; older inline/pseudo fallbacks caused the
   double-icon effect reported on mobile and desktop. */
.public-shell .dock a::after{content:none!important;display:none!important}
.public-shell .dock a svg{display:none!important}
.public-shell .dock a::before{display:block!important}
.public-shell .dock a.is-wa::before,.public-shell .dock a.is-tel::before{content:""!important}

/* Dynamic uploaded branding in public/admin/client chrome. */
.portal-side .brand__logo{display:block;max-width:150px;max-height:34px;width:auto;height:auto;object-fit:contain}
.portal-side .brand__name{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
