@layer legacy {
/* The old export determines layout bounds only, never product identity. */
[data-related-index],
[data-related-product],
[data-content-index],
[data-service-index],
[data-related-products-container],
[data-related-artwork-replaced],
[data-related-section-empty] {
  visibility: hidden !important;
  pointer-events: none !important;
}

.landing-related-products {
  --related-accent: #d08cff;
  --related-border: #78469b;
  --related-surface: #301340;
  --related-shade: #160a25;
  --related-text: #faf0ff;
  position: absolute;
  z-index: 25;
  box-sizing: border-box;
  margin: 0;
  padding: var(--related-gap, 6px);
  border: 1px solid var(--related-border);
  border-radius: var(--related-radius, 10px);
  background: linear-gradient(145deg, var(--related-surface), var(--related-shade));
  color: var(--related-text);
  overflow: auto;
  overscroll-behavior: contain;
  scrollbar-width: thin;
  scrollbar-color: var(--related-accent) var(--related-shade);
  -webkit-overflow-scrolling: touch;
  line-height: 1.35;
  isolation: isolate;
}

.landing-related-products[hidden] { display: none !important; }
.landing-related-products.is-horizontal { overflow-y: hidden; }

.landing-related-list {
  display: grid;
  grid-template-columns: repeat(var(--related-columns, 2), minmax(0, 1fr));
  grid-auto-rows: var(--related-row, 72px);
  gap: var(--related-gap, 6px);
}

.landing-related-products.is-horizontal .landing-related-list {
  grid-auto-flow: column;
  grid-template-columns: none;
  grid-auto-columns: var(--related-card-width, 160px);
}

.landing-related-products .landing-related-card {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .4em;
  min-width: 0;
  min-height: 0;
  box-sizing: border-box;
  padding: .45em .6em;
  border: 1px solid var(--related-border);
  border-radius: calc(var(--related-radius, 10px) * .75);
  background: linear-gradient(120deg, var(--related-surface), var(--related-shade));
  color: var(--related-text);
  font-family: inherit;
  font-size: var(--related-font, 16px);
  font-weight: 700;
  line-height: 1.35;
  text-align: center;
  text-decoration: none;
  white-space: normal;
  cursor: pointer;
  overflow-wrap: anywhere;
  scroll-margin: var(--related-gap, 6px);
}

.landing-related-products .landing-related-card:hover {
  border-color: var(--related-accent);
  filter: brightness(1.12);
}

.landing-related-products .landing-related-card:focus-visible {
  outline: 2px solid var(--related-accent);
  outline-offset: -3px;
}

.landing-related-name {
  min-width: 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.landing-related-image {
  display: block;
  flex: 0 0 auto;
  width: 1.8em;
  height: 1.8em;
  object-fit: cover;
  border-radius: .4em;
}

.landing-related-arrow {
  flex: 0 0 auto;
  color: var(--related-accent);
  font-size: .9em;
}

/* 主从契约 keeps its original six text-free neon shells and template geometry.
   There is no surrounding generic card frame or horizontal carousel. */
.landing-related-products--contract {
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  overflow-x: hidden;
  overflow-y: auto;
  scrollbar-width: none;
}

.landing-related-products--contract::-webkit-scrollbar { display: none; }

.landing-related-products--contract .landing-related-list {
  position: relative;
  display: block;
  width: 100%;
}

.landing-related-products--contract .landing-related-contract-card {
  position: absolute;
  display: block;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  color: #fff;
  font-family: inherit;
  font-size: 45px;
  text-align: center;
  line-height: 1.2;
  isolation: isolate;
}

.contract-related-shell {
  position: absolute;
  inset: 0;
  display: block;
  overflow: hidden;
  pointer-events: none;
}

.contract-related-shell > img {
  position: absolute;
  top: -60px;
  left: calc(var(--contract-slice) * -312.5px);
  width: 1875px;
  height: 341px;
  max-width: none;
}

.landing-related-contract-card .landing-related-name {
  position: absolute;
  top: 45px;
  left: 7%;
  width: 86%;
  display: block;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  font-weight: 700;
  line-height: 54px;
  -webkit-line-clamp: unset;
  -webkit-text-stroke: 2px #e400ff;
  paint-order: stroke fill;
}

.contract-related-caption {
  position: absolute;
  top: 135px;
  right: 7%;
  left: 7%;
  display: block;
  color: #fef5fe;
  font-size: 28px;
  font-weight: 400;
  line-height: 34px;
  white-space: nowrap;
}

.landing-related-contract-card .landing-related-image {
  position: absolute;
  left: 77%;
  top: 25%;
  width: 17%;
  height: 30%;
  object-fit: contain;
  border-radius: 0;
}

.landing-related-contract-card.has-product-image .landing-related-name {
  left: 8%;
  width: 62%;
  text-align: left;
}

.landing-related-products--contract .landing-related-card:focus-visible { outline-color: #fff; }

.artboard-mobile .landing-related-contract-card { font-size: 20px; }

.artboard-mobile .contract-related-shell > img {
  top: -23px;
  left: calc(var(--contract-slice) * -121.25px);
  width: 728px;
  height: 132.35px;
}

.artboard-mobile .landing-related-contract-card .landing-related-name {
  top: 21px;
  line-height: 21px;
  -webkit-text-stroke-width: 1px;
}

.artboard-mobile .contract-related-caption {
  top: 56px;
  font-size: 12px;
  line-height: 13px;
}


}

/* Flow variant: compact original neon entries. Cards share available width
   before wrapping when their readable content cannot fit. */
.landing-related-products--flow {
  position: static;
  width: 96%;
  margin: 0 auto;
  overflow: visible;
  isolation: isolate;
  --product-gap: max(4px, .5vw);
  --product-width: max(104px, calc((100% - 5 * var(--product-gap)) / 6));
}
.landing-related-products--flow .landing-related-list {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: flex-start;
  gap: var(--product-gap);
  height: auto;
}
.landing-related-products--flow .landing-related-contract-card {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0,1fr);
  flex: 0 1 var(--product-width);
  min-width: 0;
  min-height: 44px;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
  font-size: max(.875rem, 2.66vw);
}
.landing-related-products--flow .landing-related-contract-card.has-long-name {
  flex-basis: max(208px, calc((100% - 2 * var(--product-gap)) / 3));
}
/* The sprite's original visible window is x=index*312.5, y=60..286.
   Three local crop windows retain the proportional rounded ends and extend
   only y=130..200 (the decorative straight middle), so no original bottom
   edge can cross a long title. Absolute positioning is only sprite cropping. */
.landing-related-products--flow .contract-related-shell {
  position: relative;
  inset: auto;
  grid-area: 1 / 1;
  width: 100%;
  aspect-ratio: 312.5 / 226;
  align-self: stretch;
  display: grid;
  grid-template-rows: auto minmax(0,1fr) auto;
  overflow: visible;
  opacity: 1;
}
.landing-related-products--flow .contract-related-shell > span {
  position: relative;
  display: block;
  overflow: clip;
}
.landing-related-products--flow .contract-related-shell-top { aspect-ratio: 312.5 / 70; }
.landing-related-products--flow .contract-related-shell-bottom { aspect-ratio: 312.5 / 86; }
.landing-related-products--flow .contract-related-shell img {
  position: absolute;
  width: 600%;
  max-width: none;
  height: auto;
  top: 0;
  left: calc(var(--contract-slice) * -100%);
}
.landing-related-products--flow .contract-related-shell-top img { margin-top: -19.2%; }
.landing-related-products--flow .contract-related-shell-bottom img { margin-top: -64%; }
.landing-related-products--flow .contract-related-shell-middle img { top: -185.714286%; height: 487.142857%; }
.landing-related-products--flow .contract-related-content {
  grid-area: 1 / 1;
  z-index: 1;
  min-width: 0;
  align-self: center;
  display: grid;
  justify-items: center;
  align-content: center;
  gap: max(3px,.5vw);
  padding: max(10px,1.8vw) max(6px,.9vw);
}
.landing-related-products--flow .landing-related-name,
.landing-related-products--flow .contract-related-caption,
.landing-related-products--flow .landing-related-image {
  position: relative;
  top: auto; left: auto; right: auto;
  width: auto; max-width: 100%; height: auto;
}
.landing-related-products--flow .landing-related-name {
  display: block;
  overflow: visible;
  white-space: normal;
  overflow-wrap: anywhere;
  text-overflow: clip;
  line-height: 1.3;
  -webkit-text-stroke: .65px #e400ff;
  paint-order: stroke fill;
  text-shadow: 0 0 3px #ce27f5;
  text-align: center;
}
.landing-related-products--flow .contract-related-caption {
  font-size: max(.75rem,1.6vw);
  line-height: 1.4;
  white-space: normal;
  overflow-wrap: anywhere;
}
.landing-related-products--flow .landing-related-image { width: max(32px,3vw); aspect-ratio: 1; object-fit: contain; }
.landing-related-products--flow .has-product-image .landing-related-name { width: auto; text-align: center; }
@media (min-width: 901px) {
  /* Share the row's available width before wrapping. The design's six-entry
     width is a maximum, not a fixed column count: seven ordinary API entries
     fit together. A readable minimum leaves room for a five-character title
     and its padding; extra/long entries wrap only when space is insufficient. */
  .landing-related-products--flow .landing-related-contract-card {
    font-size: max(16px,2.34vw);
    flex: 1 1 max(120px,5.8em);
    max-width: var(--product-width);
  }
  .landing-related-products--flow .landing-related-contract-card.has-long-name {
    flex-basis: max(208px,calc((100% - 2 * var(--product-gap)) / 3));
    max-width: max(208px,calc((100% - 2 * var(--product-gap)) / 3));
  }
  .landing-related-products--flow .contract-related-caption { font-size: max(12px,1.46vw); }
}
@media (max-width: 900px) {
  /* Show the ordinary seven-entry API response together in the viewport.
     Transparent edges in the original sprite supply the visual card gap.
     Text keeps its minimum size; extreme widths, more items or enlarged
     copy can grow another flow row instead of clipping entries off-screen. */
  .artboard-mobile .landing-related-products--flow {
    width: 98.666667%;
    overflow: visible;
    --product-gap: 0px;
    --product-width: max(50px,calc(100% / 6));
  }
  .artboard-mobile .landing-related-products--flow .landing-related-list {
    flex-wrap: wrap;
    justify-content: center;
    align-items: stretch;
  }
  .artboard-mobile .landing-related-products--flow .landing-related-contract-card {
    flex: 1 1 calc(100% / 7);
    min-width: 0;
    max-width: var(--product-width);
    grid-template-columns: minmax(0,1fr);
    font-size: max(10px,2.666667vw);
  }
  .artboard-mobile .landing-related-products--flow .landing-related-contract-card.has-long-name {
    flex-basis: 32vw;
    max-width: 64vw;
  }
  .artboard-mobile .landing-related-products--flow .contract-related-content {
    min-width: 0;
    gap: max(2px,.266667vw);
    padding: max(4px,1.066667vw) 0;
  }
  /* A ratio on the decorative grid itself transfers its text-driven height
     back into the card's intrinsic minimum width. A percentage spacer keeps
     the original minimum height without making decoration widen the row. */
  .artboard-mobile .landing-related-products--flow .contract-related-shell { aspect-ratio: auto; }
  .artboard-mobile .landing-related-products--flow .contract-related-shell::before {
    content: '';
    grid-area: 1 / 1 / 4 / 2;
    padding-top: 72.32%;
    pointer-events: none;
  }
  .artboard-mobile .landing-related-products--flow .contract-related-shell-top { grid-area: 1 / 1; }
  .artboard-mobile .landing-related-products--flow .contract-related-shell-middle { grid-area: 2 / 1; }
  .artboard-mobile .landing-related-products--flow .contract-related-shell-bottom { grid-area: 3 / 1; }
  .artboard-mobile .landing-related-products--flow .landing-related-name {
    min-width: 0;
    white-space: normal;
    overflow-wrap: anywhere;
  }
  .artboard-mobile .landing-related-products--flow .contract-related-caption {
    font-size: max(10px,1.6vw);
    white-space: normal;
    overflow-wrap: anywhere;
  }
  /* Keep focus inside each neon frame, including cards at the page edge. */
  .artboard-mobile .landing-related-products--flow .landing-related-card:focus-visible { outline-offset: -4px; }
}
@media (max-width: 358px) {
  /* H5 keeps all API products in source order on one visible row. At extreme
     widths the cards, decoration and copy scale down together instead of
     switching to a separate stacked layout. */
  .artboard-mobile .landing-related-products--flow { width: 98.666667%; }
  .artboard-mobile .landing-related-products--flow .landing-related-list {
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: stretch;
  }
  .artboard-mobile .landing-related-products--flow .landing-related-contract-card,
  .artboard-mobile .landing-related-products--flow .landing-related-contract-card.has-long-name {
    width: auto;
    max-width: none;
    flex: 1 1 0;
    font-size: max(4px,2vw);
  }
  .artboard-mobile .landing-related-products--flow .contract-related-content {
    gap: 1px;
    padding: 2px 0;
  }
  .artboard-mobile .landing-related-products--flow .landing-related-name,
  .artboard-mobile .landing-related-products--flow .contract-related-caption {
    white-space: nowrap;
    overflow-wrap: normal;
  }
  /* Long API names and enlarged captions may wrap inside their own card.
     Ordinary product names keep the compact single-line H5 row above. */
  .artboard-mobile .landing-related-products--flow .has-long-name .landing-related-name,
  .artboard-mobile .landing-related-products--flow .contract-related-caption {
    white-space: normal;
    overflow-wrap: anywhere;
  }
  .artboard-mobile .landing-related-products--flow .contract-related-caption { font-size: max(4px,1.8vw); }
  .artboard-mobile .landing-related-products--flow .landing-related-image { width: min(14px,40%); max-width: 40%; }
}
@media (max-width: 259px) {
  .artboard-mobile .landing-related-products--flow { width: 94vw; }
  .artboard-mobile .landing-related-products--flow .landing-related-list {
    flex-direction: column;
    align-items: center;
  }
  .artboard-mobile .landing-related-products--flow .landing-related-contract-card,
  .artboard-mobile .landing-related-products--flow .landing-related-contract-card.has-long-name {
    width: 50vw;
    max-width: 50vw;
    flex: 0 0 auto;
    font-size: max(12px,4vw);
  }
  .artboard-mobile .landing-related-products--flow .contract-related-content {
    gap: max(2px,.266667vw);
    padding: max(4px,1.066667vw) 0;
  }
  .artboard-mobile .landing-related-products--flow .landing-related-name,
  .artboard-mobile .landing-related-products--flow .contract-related-caption {
    white-space: normal;
    overflow-wrap: anywhere;
  }
  .artboard-mobile .landing-related-products--flow .contract-related-shell img { left: 0; }
  .artboard-mobile .landing-related-products--flow .contract-related-caption { font-size: max(12px,3.2vw); }
  .artboard-mobile .landing-related-products--flow .landing-related-image { width: max(32px,3vw); }
}
