@charset "UTF-8";
/* YuanFeng V52.83 generated CSS bundle; source modules retained. */

/* ---- source: assets/css/motion-nav-v52.2.css ---- */
/* YuanFeng V52.1 — sequential full page hand-off.
   V51.3's outgoing motion is preserved. The incoming page now waits until the outgoing page
   has completed, then performs one complete matching entrance instead of flashing in. */
:root{--yf-pk-ease:cubic-bezier(.65,0,.15,1);--yf-v520-out:.80s;--yf-v520-white:.08s;--yf-v520-in:.80s;}

::view-transition-old(root),::view-transition-new(root){transform-origin:center bottom;}
/* V52.1 — the hand-off midpoint is a clean white canvas, never a frozen tilted frame. */
html[data-yf-vt-mode="full"],html[data-yf-vt-mode="full"] body{background:#fff!important;}
::view-transition-group(root),::view-transition-image-pair(root){background:#fff!important;}


/* Main-navigation transitions are intentionally sequential:
   1) complete exit all the way to a clean white canvas; 2) keep only 80ms of blank white; 3) begin the complete incoming motion. */
html[data-yf-vt-mode="full"][data-yf-vt-dir="forward"]::view-transition-old(root){
  animation:yf-v520-pk-old-forward var(--yf-v520-out) var(--yf-pk-ease) both!important;
}
html[data-yf-vt-mode="full"][data-yf-vt-dir="forward"]::view-transition-new(root){
  animation:yf-v520-pk-new-forward var(--yf-v520-in) var(--yf-pk-ease) calc(var(--yf-v520-out) + var(--yf-v520-white)) both!important;
}
html[data-yf-vt-mode="full"][data-yf-vt-dir="back"]::view-transition-old(root){
  animation:yf-v520-pk-old-back var(--yf-v520-out) var(--yf-pk-ease) both!important;
}
html[data-yf-vt-mode="full"][data-yf-vt-dir="back"]::view-transition-new(root){
  animation:yf-v520-pk-new-back var(--yf-v520-in) var(--yf-pk-ease) calc(var(--yf-v520-out) + var(--yf-v520-white)) both!important;
}

/* Keep the exact V51.3 outgoing shape the user approved. */
@keyframes yf-v520-pk-old-forward{
  0%{transform:translateX(0) rotate(0) scale(1);opacity:1}
  36%{transform:translateX(-5%) rotate(-1deg) scale(.86);opacity:.85}
  86%{transform:translateX(-46%) rotate(-4.5deg) scale(.82);opacity:.28}
  100%{transform:translateX(-54%) rotate(-5deg) scale(.79);opacity:0}
}
@keyframes yf-v520-pk-old-back{
  0%{transform:translateX(0) rotate(0) scale(1);opacity:1}
  36%{transform:translateX(5%) rotate(1deg) scale(.86);opacity:.85}
  86%{transform:translateX(46%) rotate(4.5deg) scale(.82);opacity:.28}
  100%{transform:translateX(54%) rotate(5deg) scale(.79);opacity:0}
}
/* Full incoming counterpart. During the delay, animation-fill-mode:both keeps the new page
   fixed at its first off-screen frame, eliminating the V51.3 instantaneous flash. */
@keyframes yf-v520-pk-new-forward{
  0%{transform:translateX(100vw) rotate(5deg) scale(.85);opacity:0}
  8%{transform:translateX(92vw) rotate(4.6deg) scale(.86);opacity:1}
  100%{transform:translateX(0) rotate(0) scale(1);opacity:1}
}
@keyframes yf-v520-pk-new-back{
  0%{transform:translateX(-100vw) rotate(-5deg) scale(.85);opacity:0}
  8%{transform:translateX(-92vw) rotate(-4.6deg) scale(.86);opacity:1}
  100%{transform:translateX(0) rotate(0) scale(1);opacity:1}
}

/* file:// and browsers without cross-document View Transitions.
   The preflight script installs this state before first paint, so the destination cannot flash. */
html.yf-v520-fallback-arrival,html.yf-v520-fallback-running,
html.yf-v520-fallback-arrival body,html.yf-v520-fallback-running body{overflow-x:hidden!important;}
html.yf-v520-fallback-arrival[data-yf-vt-mode="full"] .main > :not(.menuList):not(.menuBg):not(.topMenu):not(#topShow){
  visibility:hidden;
  transform-origin:center bottom;
  will-change:transform,opacity;
  backface-visibility:hidden;
}
html.yf-v520-fallback-arrival[data-yf-vt-mode="full"][data-yf-vt-dir="forward"] .main > :not(.menuList):not(.menuBg):not(.topMenu):not(#topShow){
  transform:translateX(100vw) rotate(5deg) scale(.85);
}
html.yf-v520-fallback-arrival[data-yf-vt-mode="full"][data-yf-vt-dir="back"] .main > :not(.menuList):not(.menuBg):not(.topMenu):not(#topShow){
  transform:translateX(-100vw) rotate(-5deg) scale(.85);
}
.yf-v520-fallback-node{transform-origin:center bottom!important;will-change:transform,opacity!important;backface-visibility:hidden;}



/* V52.1 — transition viewport lock.
   During every page hand-off the document is non-scrollable and the browser scrollbar is
   suppressed on both the outgoing and incoming document. This prevents a grey scrollbar
   from becoming part of a tilted View Transition snapshot. */
html.yf-vt-lock,
html.yf-vt-lock body{
  scroll-behavior:auto!important;
  overflow:hidden!important;
  overscroll-behavior:none!important;
  scrollbar-width:none!important;
  -ms-overflow-style:none!important;
}
html.yf-vt-lock::-webkit-scrollbar,
html.yf-vt-lock body::-webkit-scrollbar{
  width:0!important;
  height:0!important;
  display:none!important;
}

/* Right-side drawers/search overlays are interface chrome, never transition artwork.
   display:none is intentional here (stronger than visibility:hidden) so no one-pixel red/grey
   edge can be captured when the root plane rotates. */
html.yf-vt-lock .menuBg,
html.yf-vt-lock .menuList,
html.yf-vt-lock .searchWin,
html.yf-vt-lock .winbg{
  display:none!important;
  visibility:hidden!important;
  opacity:0!important;
  pointer-events:none!important;
  view-transition-name:none!important;
}

/* Never let the root snapshots paint outside the visual viewport. */
::view-transition-group(root),
::view-transition-image-pair(root),
::view-transition-old(root),
::view-transition-new(root){
  overflow:clip!important;
  clip-path:inset(0)!important;
}

/* Accessibility controls are never transition artwork. */
.yf-skip-link{view-transition-name:none!important;}

@media(prefers-reduced-motion:reduce){
  html[data-yf-vt-mode="full"]::view-transition-old(root),
  html[data-yf-vt-mode="full"]::view-transition-new(root){animation-duration:.01ms!important;animation-delay:0ms!important;}
  html.yf-v520-fallback-arrival[data-yf-vt-mode="full"] .main > :not(.menuList):not(.menuBg):not(.topMenu):not(#topShow){visibility:visible;transform:none;}
}


/* V52.1 — transition polish requested after V51.4 acceptance. */
/* The legacy right-side menu overlay (.menuBg / .menuList) lives fixed at the viewport edge.
   When the root snapshot tilts, that fixed edge can become a visible red/grey blade in the
   middle of the transition. It is UI chrome, not page artwork, so remove it only while a
   navigation hand-off is being captured/played. */
html.yf-vt-lock .menuBg,
html.yf-vt-lock .menuList{
  display:none!important;
  visibility:hidden!important;
  opacity:0!important;
  pointer-events:none!important;
}

/* V50 gave the active 1px main/sub-nav markers their own shared View Transition snapshots.
   During the larger V51.4 tilt those tiny vertical markers can be stretched/interpolated into
   a long red/grey line. For full transitions let each marker stay inside its own nav snapshot
   instead of becoming an independent transition layer. */
html[data-yf-vt-mode="full"] .topMenu .mLinks .mLinksDiv div>a.hover p span,
html[data-yf-vt-mode="full"] .subMenu .tabs a.hover p span{
  view-transition-name:none!important;
}

/* Secondary navigation now participates in the same full hand-off when its links are clicked.
   No separate visual treatment is needed: .subMenu remains part of the page canvas and follows
   the same exit / white-clear / entrance motion as the content below it. */

/* Bring project listings and the news landing content closer to the large heading.
   On desktop the visual gap from the glyph bottom to the first content is ~92–96px:
   heading bottom padding (~58px) + project shell top padding (34px), or 58px + 36px for news. */
.yf-section-heading + .projectsData{
  margin-top:0!important;
}
.yf-section-heading + .newsData{
  margin-top:36px!important;
}
@media(max-width:900px){
  .yf-section-heading + .projectsData{margin-top:0!important;}
  .yf-section-heading + .newsData{margin-top:24px!important;}
}


/* V52.1 — desktop navigation refinement.
   The red right-side drawer belongs to the compact/mobile UI only. Desktop keeps the full
   top navigation and uses a restrained language popover instead of opening the red drawer. */
@media (min-width:751px){
  .menuOpen{display:none!important;}
  .menuList,.menuBg{display:none!important;visibility:hidden!important;pointer-events:none!important;}
  .topMenu .topMenuDiv .mBtn{width:auto!important;min-width:112px;}
  .topMenu .topMenuDiv .mBtn>div>ul{gap:0;align-items:center;}
}
.yf-desktop-lang-menu{
  position:fixed;
  z-index:2147483200;
  min-width:138px;
  padding:8px;
  border:1px solid rgba(0,0,0,.10);
  border-radius:10px;
  background:rgba(255,255,255,.97);
  box-shadow:0 12px 34px rgba(0,0,0,.12);
  backdrop-filter:blur(12px);
  -webkit-backdrop-filter:blur(12px);
  opacity:0;
  visibility:hidden;
  transform:translate3d(0,-6px,0);
  transition:opacity .18s ease,transform .18s ease,visibility 0s linear .18s;
  pointer-events:none;
}
.yf-desktop-lang-menu.is-open{
  opacity:1;
  visibility:visible;
  transform:translate3d(0,0,0);
  transition-delay:0s;
  pointer-events:auto;
}
.yf-desktop-lang-option{
  display:block;
  width:100%;
  border:0;
  border-radius:7px;
  background:transparent;
  padding:9px 12px;
  text-align:left;
  font:inherit;
  font-size:13px;
  line-height:1.25;
  color:#222;
  cursor:pointer;
}
.yf-desktop-lang-option:hover,.yf-desktop-lang-option[aria-current="true"]{background:#f3f3f3;}
@media (max-width:750px){.yf-desktop-lang-menu{display:none!important;}}


/* The product queue already owns the physics; this class is only a lightweight marker while
   the V52 arrival impulse is decaying naturally through its existing friction model. */
[data-depth-queue].yf-arrival-spin{will-change:contents;}

/* ---- source: assets/css/page-transitions-v52.63.css ---- */
/* V52.63 — deterministic JS page-transition engine with first-paint secondary-nav handoff lock. Main + secondary navigation are locked above the moving page canvas.
   Native Cross-Document View Transition is intentionally NOT opted in. YuanFeng title animations below stay unchanged. */
:root{--yf-paul-ease:cubic-bezier(.625,.05,0,1);--yf-paul-duration:.82s;}
html,body{background:#fff;}
html.yf-vt-lock,html.yf-vt-lock body{overflow-x:hidden;}

/* Hold YuanFeng's own editorial/title motion until the page hand-off is complete. */
html.yf-page-enter-block .yf-case-card,
html.yf-page-enter-block .yf-v37-reveal,
html.yf-page-enter-block .yf-reveal,
html.yf-page-enter-block .yf-section-heading-inner,
html.yf-page-enter-block .yf-products-intro .yf-title-line-inner,
html.yf-page-enter-block .yf-products-intro .yf-title-support{animation:none!important;transition:none!important;}
html.yf-page-enter-block .yf-section-heading-inner,
html.yf-page-enter-block .yf-products-intro .yf-title-line-inner,
html.yf-page-enter-block .yf-products-intro .yf-title-support{opacity:0!important;}
html.yf-page-enter-block [data-delighter],html.yf-page-enter-block .delighter{animation-play-state:paused!important;}

/* One fallback viewport = one page canvas, matching the reference module instead of animating every child separately. */
html.yf-v520-fallback-arrival,html.yf-v520-fallback-running,
html.yf-v520-fallback-arrival body,html.yf-v520-fallback-running body{overflow-x:hidden!important;}
html.yf-v520-fallback-arrival[data-yf-vt-mode="full"] .main>:not(.menuList):not(.menuBg):not(.topMenu):not(.subMenu){visibility:hidden!important;}
.yf-vt-fallback-viewport{position:fixed;inset:0;width:100vw;height:100vh;height:100dvh;overflow:hidden;perspective:100em;z-index:2147482500;pointer-events:none;transform-origin:center bottom;will-change:transform,opacity;background:#fff;}
.yf-vt-fallback-page{position:absolute;left:0;top:0;width:100%;min-height:100%;transform-origin:center bottom;will-change:transform,opacity;backface-visibility:hidden;}
.yf-vt-fallback-viewport.is-enter{z-index:2147482501;}
body.yf-vt-fallback-active .topMenu{z-index:2147483002!important;}
body.yf-vt-fallback-active .subMenu{z-index:2147483001!important;}
html.yf-v520-fallback-arrival .subMenu,
html.yf-v520-fallback-running .subMenu,
body.yf-vt-fallback-active .subMenu{visibility:visible!important;opacity:1!important;transform:none!important;will-change:auto!important;}
/* V52.63: target-document secondary navigation must not paint by itself while the page canvas is still hidden.
   The runtime reveals it in the same paint that the incoming viewport becomes ready, removing the brief top-left submenu flash. */
html.yf-v520-fallback-arrival:not(.yf-vt-subnav-ready) .subMenu{
  visibility:hidden!important;
  opacity:0!important;
  pointer-events:none!important;
}
html.yf-v520-fallback-arrival.yf-vt-subnav-ready .subMenu{
  visibility:visible!important;
  opacity:1!important;
  pointer-events:auto!important;
}

@media(prefers-reduced-motion:reduce){
  html.yf-v520-fallback-arrival[data-yf-vt-mode="full"] .main>:not(.menuList):not(.menuBg):not(.topMenu):not(.subMenu){visibility:visible!important;}
  .yf-vt-fallback-viewport,.yf-vt-fallback-page{animation:none!important;transition:none!important;transform:none!important;opacity:1!important;}
}

/* Case/news page headings. Two safeguards are intentional:
   1) extra clearance after the fixed main + secondary navigation stack;
   2) extra top room inside the clipped line so tight font metrics never shave glyph tops. */
.yf-section-heading{
  position:relative;
  z-index:3;
  margin-top:126px;
  padding:clamp(38px,4.8vw,76px) clamp(30px,6vw,108px) clamp(30px,4vw,58px);
  background:#fff;
  opacity:1;
  scroll-margin-top:126px;
}
.yf-section-heading :is(h1,h2.yf-h1-demoted,h3.yf-h1-demoted){
  margin:0;
  font-weight:800;
  font-size:clamp(58px,7.2vw,118px);
  line-height:.98;
  letter-spacing:-.055em;
  color:#292525;
}
.yf-section-heading-line{
  display:block;
  overflow:hidden;
  padding-top:.10em;
  padding-bottom:.08em;
  margin-top:-.10em;
}
.yf-section-heading-inner{display:block;transform:translate3d(0,112%,0) skewY(4deg);transform-origin:left bottom;opacity:.001;will-change:transform,opacity;}
.yf-section-heading.yf-heading-motion-ready .yf-section-heading-inner{animation:yf-v50-heading-rise .60s cubic-bezier(.16,1,.3,1) both;}
@keyframes yf-v50-heading-rise{0%{transform:translate3d(0,112%,0) skewY(4deg);opacity:.001}100%{transform:translate3d(0,0,0) skewY(0);opacity:1}}

/* Products title keeps the same clipped-rise language. */
.yf-products-intro :is(h1,h2.yf-h1-demoted,h3.yf-h1-demoted)>span{display:block;overflow:hidden;line-height:.96;padding-top:.05em;padding-bottom:.05em;margin-top:-.05em;}
.yf-products-intro :is(h1,h2.yf-h1-demoted,h3.yf-h1-demoted)>span>.yf-title-line-inner{display:block;transform:translate3d(0,110%,0) skewY(4deg);transform-origin:left bottom;opacity:.001;will-change:transform,opacity;}
.yf-products-intro .yf-products-rule,
.yf-products-intro h2,
.yf-products-intro>p{opacity:0;transform:translate3d(0,18px,0);}
.yf-products-intro.yf-title-motion-ready :is(h1,h2.yf-h1-demoted,h3.yf-h1-demoted)>span>.yf-title-line-inner{animation:yf-v50-title-rise .58s cubic-bezier(.16,1,.3,1) both;}
.yf-products-intro.yf-title-motion-ready :is(h1,h2.yf-h1-demoted,h3.yf-h1-demoted)>span:nth-child(2)>.yf-title-line-inner{animation-delay:.06s;}
.yf-products-intro.yf-title-motion-ready .yf-products-rule{animation:yf-v50-rule-in .44s cubic-bezier(.16,1,.3,1) .15s both;}
.yf-products-intro.yf-title-motion-ready h2{animation:yf-v50-support-in .46s cubic-bezier(.16,1,.3,1) .19s both;}
.yf-products-intro.yf-title-motion-ready>p{animation:yf-v50-support-in .48s cubic-bezier(.16,1,.3,1) .24s both;}
@keyframes yf-v50-title-rise{0%{transform:translate3d(0,110%,0) skewY(4deg);opacity:.001}100%{transform:translate3d(0,0,0) skewY(0);opacity:1}}
@keyframes yf-v50-rule-in{0%{opacity:0;transform:scaleX(.08);transform-origin:left center}100%{opacity:1;transform:scaleX(1);transform-origin:left center}}
@keyframes yf-v50-support-in{0%{opacity:0;transform:translate3d(0,18px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}

/* User-supplied fault-tolerant optics SVG. */
.pageCont li img[src$="fault-tolerant-optics.svg"]{display:block;width:100%;height:auto;max-width:none;}

@media(max-width:900px){
  .yf-section-heading{margin-top:116px;scroll-margin-top:116px;padding:34px 20px 28px;}
  .yf-section-heading :is(h1,h2.yf-h1-demoted,h3.yf-h1-demoted){font-size:clamp(48px,15vw,82px);line-height:1;}
  .yf-section-heading-line{padding-top:.11em;margin-top:-.11em;}
}

@media(prefers-reduced-motion:reduce){
  ::view-transition-old(root),::view-transition-new(root),
  ::view-transition-old(yf-top-nav),::view-transition-new(yf-top-nav),
  ::view-transition-group(yf-nav-marker),::view-transition-group(yf-subnav-marker){animation-duration:.01ms!important;animation-iteration-count:1!important;}
  .yf-vt-fallback-panel{transition-duration:.01ms!important;}
  .yf-section-heading-inner,.yf-products-intro :is(h1,h2.yf-h1-demoted,h3.yf-h1-demoted)>span>.yf-title-line-inner,.yf-products-intro .yf-products-rule,.yf-products-intro h2,.yf-products-intro>p{animation:none!important;transition:none!important;transform:none!important;opacity:1!important;}
}
