/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/* ===== Shared building blocks ============================================ */
.section {
  padding-block: clamp(3.5rem, 2rem + 7vw, 7rem);
  border-top: 1px solid var(--odl-border);
}
.sectionSubtle {
  background: var(--odl-bg-subtle);
}

.sectionHead {
  max-width: 46rem;
  margin-bottom: var(--odl-space-7);
}
.sectionTitle {
  font-size: var(--odl-text-2xl);
  line-height: var(--odl-leading-snug);
  font-weight: 650;
  color: var(--odl-fg-strong);
  margin: var(--odl-space-4) 0 0;
}
.sectionLede {
  font-size: var(--odl-text-md);
  line-height: var(--odl-leading-normal);
  color: var(--odl-fg-muted);
  margin: var(--odl-space-3) 0 0;
  max-width: 40rem;
}
.termItalic {
  font-style: italic;
}

/* Buttons --------------------------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--odl-space-2);
  height: 2.875rem;
  padding-inline: var(--odl-space-5);
  border-radius: var(--odl-radius-md);
  border: 1px solid transparent;
  font-size: var(--odl-text-sm);
  font-weight: 600;
  letter-spacing: -0.005em;
  text-decoration: none;
  cursor: pointer;
  transition: background-color var(--odl-dur) var(--odl-ease),
    border-color var(--odl-dur) var(--odl-ease),
    color var(--odl-dur) var(--odl-ease), transform var(--odl-dur-fast)
      var(--odl-ease);
}
.btn:hover {
  text-decoration: none;
}
.btn:active {
  transform: translateY(1px);
}
.btnPrimary {
  background: var(--odl-action-bg);
  color: var(--odl-action-fg);
}
.btnPrimary:hover {
  background: var(--odl-action-bg-hover);
  color: var(--odl-action-fg);
}
.btnSecondary {
  background: var(--odl-surface);
  color: var(--odl-fg-strong);
  border-color: var(--odl-border-strong);
}
.btnSecondary:hover {
  color: var(--odl-fg-strong);
  border-color: var(--odl-fg-strong);
  background: var(--odl-surface-2);
}
.btnArrow {
  transition: transform var(--odl-dur) var(--odl-ease-out);
}
.btn:hover .btnArrow {
  transform: translateX(3px);
}

/* ===== Hero ============================================================== */
.hero {
  position: relative;
  overflow: visible;
  background: var(--odl-bg);
  padding-top: clamp(1.75rem, 1rem + 2.4vw, 3rem);
  padding-bottom: clamp(3rem, 2rem + 5vw, 5.5rem);
}
.heroGrid {
  position: absolute;
  inset: 0;
  -webkit-mask-image: radial-gradient(
    120% 90% at 70% 0%,
    #000 0%,
    transparent 72%
  );
  mask-image: radial-gradient(120% 90% at 70% 0%, #000 0%, transparent 72%);
  pointer-events: none;
}
.heroInner {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  gap: clamp(2rem, 1rem + 4vw, 4.5rem);
  align-items: start;
}
.heroTitle {
  font-size: var(--odl-text-display);
  line-height: var(--odl-leading-tight);
  font-weight: 700;
  letter-spacing: var(--odl-tracking-tight);
  color: var(--odl-fg-strong);
  margin: var(--odl-space-5) 0 0;
}
.heroTitleAccent {
  color: var(--odl-accent);
}
.heroLede {
  font-size: var(--odl-text-md);
  line-height: var(--odl-leading-normal);
  color: var(--odl-fg-muted);
  margin: var(--odl-space-5) 0 0;
  max-width: 34rem;
}
.heroActions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--odl-space-3);
  margin-top: var(--odl-space-6);
}
.heroStats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--odl-space-4);
  margin-top: var(--odl-space-8);
  border-top: 1px solid var(--odl-border);
  padding-top: var(--odl-space-5);
}
.heroStat {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.heroStatValue {
  font-family: var(--odl-font-mono);
  font-size: var(--odl-text-xl);
  font-weight: 600;
  color: var(--odl-fg-strong);
  font-variant-numeric: tabular-nums;
}
.heroStatLabel {
  font-size: var(--odl-text-xs);
  color: var(--odl-fg-subtle);
}
.heroAside {
  padding-top: var(--odl-space-5);
}

/* ===== Used-by wall ===================================================== */
.logoWall {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(12.5rem, 1fr));
  gap: var(--odl-space-3);
}
.logoWallItem {
  display: flex;
}
.logoItem {
  flex: 1;
  display: flex;
  align-items: center;
  gap: var(--odl-space-3);
  padding: var(--odl-space-4);
  background: var(--odl-surface);
  border: 1px solid var(--odl-border);
  border-radius: var(--odl-radius-md);
  text-decoration: none;
  filter: grayscale(1);
  opacity: 0.72;
  transition: opacity var(--odl-dur) var(--odl-ease),
    filter var(--odl-dur) var(--odl-ease),
    background-color var(--odl-dur) var(--odl-ease);
}
.logoItem:hover {
  background: var(--odl-surface-2);
  filter: grayscale(0);
  opacity: 1;
  text-decoration: none;
}
.logoMark {
  width: 28px;
  height: 28px;
  object-fit: contain;
  border-radius: var(--odl-radius-sm);
  flex: none;
}
.logoName {
  font-family: var(--odl-font-mono);
  font-size: var(--odl-text-sm);
  font-weight: 500;
  color: var(--odl-fg-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.actionLogo {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--odl-space-4);
  border: 1px dashed var(--odl-border);
  border-radius: var(--odl-radius-md);
  font-family: var(--odl-font-mono);
  font-size: var(--odl-text-xs);
  letter-spacing: 0.04em;
  color: var(--odl-fg-subtle);
  text-decoration: none;
  white-space: nowrap;
  transition: color var(--odl-dur) var(--odl-ease),
    border-color var(--odl-dur) var(--odl-ease);
}
.actionLogo:hover {
  color: var(--odl-accent);
  border-color: var(--odl-accent);
  text-decoration: none;
}

/* ===== Value props ====================================================== */
.valueGrid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1px;
  background: var(--odl-border);
  border: 1px solid var(--odl-border);
  border-radius: var(--odl-radius-lg);
  overflow: hidden;
}
.valueCard {
  background: var(--odl-surface);
  padding: clamp(1.5rem, 1rem + 2vw, 2.5rem);
  display: flex;
  flex-direction: column;
  gap: var(--odl-space-3);
}
.valueIndex {
  font-family: var(--odl-font-mono);
  font-size: var(--odl-text-xs);
  font-weight: 500;
  letter-spacing: var(--odl-tracking-label);
  color: var(--odl-accent);
}
.valueCardTitle {
  font-size: var(--odl-text-lg);
  font-weight: 650;
  color: var(--odl-fg-strong);
  margin: 0;
  letter-spacing: var(--odl-tracking-tight);
}
.valueCardBody {
  font-size: var(--odl-text-base);
  line-height: var(--odl-leading-normal);
  color: var(--odl-fg-muted);
  margin: 0;
}

/* ===== Services ========================================================= */
.serviceGroups {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1px;
  background: var(--odl-border);
  border: 1px solid var(--odl-border);
  border-radius: var(--odl-radius-lg);
  overflow: hidden;
}
.serviceGroup {
  background: var(--odl-surface);
  padding: clamp(1.25rem, 1rem + 1vw, 1.75rem);
}
.serviceGroupTitle {
  display: flex;
  align-items: center;
  gap: var(--odl-space-3);
  font-family: var(--odl-font-mono);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: var(--odl-tracking-label);
  text-transform: uppercase;
  color: var(--odl-fg-subtle);
  margin-bottom: var(--odl-space-4);
}
.serviceGroupTitle::before {
  content: "";
  width: 0.875rem;
  height: 0.375rem;
  background: var(--odl-accent);
  flex: none;
}
.serviceChips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--odl-space-2);
}
.serviceChip {
  display: inline-flex;
  align-items: center;
  gap: var(--odl-space-2);
  padding: 0.3rem 0.6rem;
  border: 1px solid var(--odl-border);
  border-radius: var(--odl-radius-sm);
  background: var(--odl-bg);
  font-family: var(--odl-font-mono);
  font-size: var(--odl-text-xs);
  color: var(--odl-fg);
  text-decoration: none;
  transition: border-color var(--odl-dur) var(--odl-ease),
    background-color var(--odl-dur) var(--odl-ease);
}
.serviceChip:hover {
  border-color: var(--odl-accent);
  background: var(--odl-surface-2);
  color: var(--odl-fg);
  text-decoration: none;
}
.serviceChipIcon {
  width: 15px;
  height: 15px;
  object-fit: contain;
}
.servicesFoot {
  margin-top: var(--odl-space-6);
  display: flex;
  align-items: center;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: var(--odl-space-3);
}

/* ===== Bindings ========================================================= */
.bindingGrid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(118px, 1fr));
  gap: 1px;
  background: var(--odl-border);
  border: 1px solid var(--odl-border);
  border-radius: var(--odl-radius-lg);
  overflow: hidden;
}
.bindingCard {
  background: var(--odl-surface);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--odl-space-3);
  padding: var(--odl-space-5) var(--odl-space-3);
  text-decoration: none;
  transition: background-color var(--odl-dur) var(--odl-ease);
}
.bindingCard:hover {
  background: var(--odl-surface-2);
  text-decoration: none;
}
.bindingIcon {
  width: 30px;
  height: 30px;
  object-fit: contain;
}
.bindingName {
  font-family: var(--odl-font-mono);
  font-size: var(--odl-text-xs);
  color: var(--odl-fg-muted);
  transition: color var(--odl-dur) var(--odl-ease);
}
.bindingCard:hover .bindingName {
  color: var(--odl-fg);
}

/* ===== Final CTA ======================================================== */
.finalCta {
  background: var(--odl-surface);
  border: 1px solid var(--odl-border);
  border-radius: var(--odl-radius-lg);
  box-shadow: var(--odl-shadow-sm);
  padding: clamp(2.5rem, 1.5rem + 5vw, 5rem);
  text-align: center;
}
.finalCtaInner {
  position: relative;
}
.finalCtaTitle {
  font-size: clamp(2rem, 1.3rem + 3vw, 3.25rem);
  font-weight: 700;
  letter-spacing: var(--odl-tracking-tight);
  margin: var(--odl-space-4) 0 0;
  color: var(--odl-fg-strong);
}
.finalCtaLede {
  font-size: var(--odl-text-md);
  color: var(--odl-fg-muted);
  margin: var(--odl-space-4) auto 0;
  max-width: 34rem;
}
.finalCtaActions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--odl-space-3);
  justify-content: center;
  margin-top: var(--odl-space-6);
}
.finalEyebrow {
  justify-content: center;
}
.finalCenter {
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* ===== Reveal-on-scroll — pure CSS, progressive enhancement ============= */
/* Content is never hidden without support: browsers lacking scroll-driven
   animations (or users who prefer reduced motion) simply see it immediately. */
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    .reveal {
      animation: odlReveal linear both;
      animation-timeline: view();
      animation-range: entry 2% cover 18%;
    }
  }
}
@keyframes odlReveal {
  from {
    opacity: 0;
    transform: translateY(18px);
  }
  to {
    opacity: 1;
    transform: none;
  }
}

/* ===== Responsive ======================================================= */
@media (max-width: 996px) {
  .heroInner {
    grid-template-columns: 1fr;
  }
  .serviceGroups {
    grid-template-columns: repeat(2, 1fr);
  }
  .heroAside {
    order: 2;
    padding-top: 0;
  }
}

@media (max-width: 640px) {
  .heroGrid {
    -webkit-mask-image: linear-gradient(
      180deg,
      #000 0%,
      #000 calc(100% - 5rem),
      transparent 100%
    );
    mask-image: linear-gradient(
      180deg,
      #000 0%,
      #000 calc(100% - 5rem),
      transparent 100%
    );
  }
  .valueGrid,
  .serviceGroups {
    grid-template-columns: 1fr;
  }
  .section {
    padding-block: 3.25rem;
  }
  .sectionHead {
    margin-bottom: var(--odl-space-5);
  }
  .heroStats {
    grid-template-columns: repeat(2, 1fr);
    gap: var(--odl-space-5) var(--odl-space-4);
  }
  .heroActions .btn {
    flex: 1 1 12rem;
    min-width: 0;
  }
  .finalCtaActions {
    align-items: stretch;
    flex-direction: column;
  }
  .finalCtaActions .btn {
    width: 100%;
  }
}
