{"id":44140,"date":"2026-06-30T13:42:18","date_gmt":"2026-06-30T05:42:18","guid":{"rendered":"https:\/\/www.felicitysolar.com\/?post_type=solution&#038;p=44140"},"modified":"2026-06-30T16:19:31","modified_gmt":"2026-06-30T08:19:31","slug":"flb-series-flexible-residential-energy-storage-solution","status":"publish","type":"solution","link":"https:\/\/www.felicitysolar.com\/my\/solution\/flb-series-flexible-residential-energy-storage-solution\/","title":{"rendered":"FLB Series &#8211; Flexible Residential Energy Storage Solution"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"44140\" class=\"elementor elementor-44140\" data-elementor-settings=\"{&quot;ha_cmc_init_switcher&quot;:&quot;no&quot;}\" data-elementor-post-type=\"solution\">\n\t\t\t\t<div class=\"elementor-element elementor-element-50b5b436 e-con-full e-flex e-con e-parent\" data-id=\"50b5b436\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7067e693 elementor-widget elementor-widget-html\" data-id=\"7067e693\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n    :root {\n      --bg: #f5f5f5;\n      --surface: #ffffff;\n      --ink: #111111;\n      --muted: #666666;\n      --line: #e1e1e1;\n      --orange: #ef692c;\n      --max: 1200px;\n      --wide: 1440px;\n      --radius: 24px;\n      font-family: \"Aptos\", \"Segoe UI\", Arial, sans-serif;\n      color: var(--ink);\n      background: var(--bg);\n    }\n\n    * { box-sizing: border-box; }\n    html { scroll-behavior: smooth; }\n    body { margin: 0; background: var(--bg); }\n    img, video { display: block; max-width: 100%; }\n    a { color: inherit; text-decoration: none; }\n\n    .flb-page {\n      overflow: visible;\n      background: var(--bg);\n    }\n\n    .flb-section {\n      position: relative;\n      padding: 88px 32px;\n    }\n\n    .flb-wrap {\n      width: min(var(--max), 100%);\n      margin: 0 auto;\n    }\n\n    .flb-wide {\n      width: min(var(--wide), 100%);\n      margin: 0 auto;\n    }\n\n    h1, h2, h3, p { margin-top: 0; }\n\n    .kicker {\n      margin: 0 0 14px;\n      color: var(--orange);\n      font-size: 12px;\n      font-weight: 800;\n      letter-spacing: 0.12em;\n      text-transform: uppercase;\n    }\n\n    .hero-title {\n      margin-bottom: 16px;\n      max-width: 620px;\n      color: #fff;\n      font-size: clamp(48px, 6vw, 76px);\n      line-height: 0.96;\n      letter-spacing: 0;\n      text-wrap: balance;\n    }\n\n    .section-title {\n      margin-bottom: 16px;\n      max-width: 760px;\n      font-size: clamp(34px, 4.2vw, 56px);\n      line-height: 1.04;\n      letter-spacing: 0;\n      text-wrap: balance;\n    }\n\n    .section-subtitle {\n      margin-bottom: 12px;\n      max-width: 680px;\n      font-size: clamp(20px, 2vw, 28px);\n      line-height: 1.24;\n      font-weight: 760;\n      letter-spacing: 0;\n      text-wrap: balance;\n    }\n\n    .body {\n      max-width: 620px;\n      margin-bottom: 0;\n      color: var(--muted);\n      font-size: clamp(17px, 1.25vw, 20px);\n      line-height: 1.5;\n    }\n\n    .body.light {\n      color: rgba(255, 255, 255, 0.76);\n    }\n\n    .btn-row {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 12px;\n      margin-top: 30px;\n    }\n\n    .btn {\n      display: inline-flex;\n      align-items: center;\n      gap: 10px;\n      min-height: 46px;\n      padding: 0 22px;\n      border: 1px solid #111;\n      border-radius: 999px;\n      background: #111;\n      color: #fff;\n      font-size: 15px;\n      font-weight: 760;\n      transition: transform 220ms ease, background 220ms ease, color 220ms ease;\n    }\n\n    .btn.secondary {\n      background: transparent;\n      color: #fff;\n      border-color: rgba(255, 255, 255, 0.7);\n    }\n\n    .btn.dark-secondary {\n      background: transparent;\n      color: #111;\n      border-color: #111;\n    }\n\n    .btn span {\n      transition: transform 220ms ease;\n    }\n\n    .btn:hover {\n      transform: translateY(-2px);\n    }\n\n    .btn:hover span {\n      transform: translateX(4px);\n    }\n\n    .hero {\n      min-height: 100vh;\n      display: grid;\n      align-items: center;\n      padding: 0 32px;\n      background:\n        linear-gradient(90deg, rgba(0, 0, 0, 0.62) 0%, rgba(0, 0, 0, 0.34) 42%, rgba(0, 0, 0, 0.03) 76%),\n        url(\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Hero-Slider-scaled.webp\") center \/ cover no-repeat;\n    }\n\n    .hero .flb-wrap {\n      padding: 128px 0 92px;\n    }\n\n    .hero .kicker {\n      color: rgba(255, 255, 255, 0.78);\n    }\n\n    .intro-grid {\n      display: grid;\n      grid-template-columns: 0.8fr 1.2fr;\n      gap: 56px;\n      align-items: start;\n    }\n\n    .card-grid {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 16px;\n      margin-top: 34px;\n    }\n\n    .card {\n      padding: 26px;\n      border: 1px solid var(--line);\n      border-radius: var(--radius);\n      background: var(--surface);\n      transition: transform 260ms ease, border-color 260ms ease;\n    }\n\n    .card:hover {\n      transform: translateY(-3px);\n      border-color: rgba(239, 105, 44, 0.42);\n    }\n\n    .card h3 {\n      margin-bottom: 10px;\n      font-size: 21px;\n      line-height: 1.22;\n    }\n\n    .card p {\n      margin: 0;\n      color: var(--muted);\n      font-size: 15px;\n      line-height: 1.52;\n    }\n\n    .split {\n      display: grid;\n      grid-template-columns: minmax(0, 0.92fr) minmax(0, 1.08fr);\n      gap: 34px;\n      align-items: center;\n    }\n\n    .panel {\n      padding: clamp(28px, 4vw, 54px);\n      border-radius: 34px;\n      background: #eeeeee;\n    }\n\n    .media {\n      overflow: hidden;\n      border-radius: 28px;\n      background: #e8e8e8;\n    }\n\n    .media img {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n      transition: transform 520ms ease;\n    }\n\n    .media:hover img {\n      transform: scale(1.03);\n    }\n\n    .chips {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n      margin-top: 26px;\n    }\n\n    .chip {\n      padding: 9px 13px;\n      border-radius: 999px;\n      background: #fff;\n      border: 1px solid var(--line);\n      font-size: 14px;\n      font-weight: 720;\n    }\n\n    .full-image {\n      position: relative;\n      min-height: 620px;\n      overflow: hidden;\n      border-radius: 34px;\n      background: #ddd;\n    }\n\n    .full-image img {\n      position: absolute;\n      inset: 0;\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n    }\n\n    .full-image::after,\n    .ip65-image::after {\n      content: \"\";\n      position: absolute;\n      inset: 0;\n      background: linear-gradient(to top, rgba(0, 0, 0, 0.58), rgba(0, 0, 0, 0.02) 58%);\n    }\n\n    .image-caption {\n      position: absolute;\n      left: clamp(24px, 5vw, 64px);\n      right: clamp(24px, 5vw, 64px);\n      bottom: clamp(24px, 5vw, 58px);\n      z-index: 1;\n      color: #fff;\n    }\n\n    .image-caption .section-title,\n    .image-caption .section-subtitle {\n      color: #fff;\n    }\n\n    .ip65-image {\n      position: relative;\n      min-height: 720px;\n      overflow: hidden;\n      border-radius: 34px;\n      background: #d8d8d8;\n    }\n\n    .ip65-image img {\n      position: absolute;\n      inset: 0;\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n    }\n\n    .ip65-image::after {\n      background:\n        linear-gradient(to top, rgba(0, 0, 0, 0.58), rgba(0, 0, 0, 0.02) 58%),\n        linear-gradient(90deg, rgba(0, 0, 0, 0.38), rgba(0, 0, 0, 0) 56%);\n      pointer-events: none;\n    }\n\n    .ip65-caption {\n      position: absolute;\n      left: clamp(24px, 5vw, 64px);\n      bottom: clamp(24px, 5vw, 58px);\n      z-index: 1;\n      width: min(460px, calc(100% - 48px));\n      color: #fff;\n    }\n\n    .ip65-caption .kicker,\n    .ip65-caption .section-title,\n    .ip65-caption .body {\n      color: inherit;\n    }\n\n    .video-scroll {\n      position: relative;\n      height: 350vh;\n      background: #050505;\n      color: #fff;\n      overflow: visible;\n    }\n\n    .video-sticky {\n      position: sticky;\n      position: -webkit-sticky;\n      top: 0;\n      height: 100vh;\n      min-height: 100vh;\n      overflow: hidden;\n      background: #050505;\n    }\n\n    .video-sticky.is-pinned {\n      position: fixed;\n      inset: 0;\n      z-index: 10;\n      width: 100%;\n      height: 100vh;\n    }\n\n    .video-sticky.is-after {\n      position: absolute;\n      inset: auto 0 0 0;\n      width: 100%;\n      height: 100vh;\n    }\n\n    .video-sticky video {\n      position: absolute;\n      inset: 0;\n      width: 100%;\n      height: 100%;\n      min-height: 100vh;\n      object-fit: cover;\n    }\n\n    .video-sticky::after {\n      content: \"\";\n      position: absolute;\n      inset: 0;\n      background: linear-gradient(to top, rgba(0, 0, 0, 0.56), rgba(0, 0, 0, 0.05));\n      pointer-events: none;\n    }\n\n    .video-copy {\n      position: absolute;\n      left: clamp(22px, 6vw, 86px);\n      bottom: clamp(34px, 8vh, 92px);\n      z-index: 2;\n      width: min(720px, calc(100% - 44px));\n    }\n\n    .video-label {\n      display: none;\n      margin-bottom: 0;\n      color: rgba(255, 255, 255, 0.72);\n      font-size: 12px;\n      font-weight: 800;\n      letter-spacing: 0.12em;\n      text-transform: uppercase;\n    }\n\n    .video-segment,\n    .video-intro {\n      position: absolute;\n      bottom: 28px;\n      left: 0;\n      width: 100%;\n      opacity: 0;\n      transform: translateY(16px);\n      transition: opacity 460ms ease, transform 460ms ease;\n      pointer-events: none;\n    }\n\n    .video-intro {\n      position: relative;\n      bottom: auto;\n    }\n\n    .video-segment.is-active,\n    .video-intro.is-active {\n      opacity: var(--segment-opacity, 1);\n      transform: translateY(0);\n    }\n\n    .video-segment h2 {\n      margin-bottom: 14px;\n      max-width: 680px;\n      color: #ffffff;\n      font-size: clamp(36px, 3.8vw, 54px);\n      line-height: 1.08;\n      font-weight: 720;\n      letter-spacing: 0;\n      text-wrap: balance;\n    }\n\n    .video-segment h3 {\n      margin-bottom: 14px;\n      color: var(--orange);\n      font-size: clamp(20px, 1.8vw, 25px);\n      line-height: 1.32;\n      font-weight: 700;\n    }\n\n    .video-segment p,\n    .video-intro p {\n      margin: 0;\n      color: rgba(255, 255, 255, 0.78);\n      font-size: clamp(17px, 1.25vw, 20px);\n      line-height: 1.48;\n    }\n\n    .video-progress {\n      position: absolute;\n      left: clamp(22px, 6vw, 86px);\n      right: clamp(22px, 6vw, 86px);\n      bottom: 26px;\n      z-index: 2;\n      height: 2px;\n      background: rgba(255, 255, 255, 0.26);\n    }\n\n    .video-progress span {\n      display: block;\n      width: calc(var(--video-progress, 0) * 100%);\n      height: 100%;\n      background: var(--orange);\n    }\n\n    .compact-list {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 12px;\n      margin-top: 26px;\n    }\n\n    .feature-image-section {\n      display: grid;\n      gap: 28px;\n    }\n\n    .feature-heading {\n      display: grid;\n      grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);\n      gap: 42px;\n      align-items: end;\n    }\n\n    .feature-heading .body {\n      margin-left: auto;\n    }\n\n    .plain-image {\n      min-height: 720px;\n      overflow: hidden;\n      border-radius: 34px;\n      background: #e8e8e8;\n    }\n\n    .plain-image img {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n    }\n\n    .heat-showcase,\n    .award-showcase {\n      position: relative;\n      min-height: 700px;\n      overflow: hidden;\n      border-radius: 34px;\n      background: #e8e8e8;\n    }\n\n    .heat-showcase img,\n    .award-showcase img {\n      position: absolute;\n      inset: 0;\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n    }\n\n    .heat-copy {\n      position: absolute;\n      z-index: 1;\n      right: clamp(24px, 5vw, 70px);\n      top: 50%;\n      width: min(360px, calc(100% - 48px));\n      transform: translateY(-50%);\n      padding: 28px;\n      border-radius: 24px;\n      background: rgba(255, 255, 255, 0.82);\n      backdrop-filter: blur(14px);\n    }\n\n    .award-showcase::after {\n      content: \"\";\n      position: absolute;\n      inset: 0;\n      background: linear-gradient(90deg, rgba(255, 255, 255, 0.76), rgba(255, 255, 255, 0.06) 54%);\n      pointer-events: none;\n    }\n\n    .award-copy {\n      position: absolute;\n      z-index: 1;\n      left: clamp(24px, 5vw, 70px);\n      bottom: clamp(28px, 5vw, 64px);\n      width: min(390px, calc(100% - 48px));\n    }\n\n    .story-carousel {\n      overflow: hidden;\n    }\n\n    .carousel-head {\n      display: flex;\n      justify-content: space-between;\n      gap: 24px;\n      align-items: end;\n      margin-bottom: 26px;\n    }\n\n    .carousel-dots {\n      display: flex;\n      gap: 10px;\n      align-items: center;\n      padding-bottom: 8px;\n    }\n\n    .carousel-dot {\n      width: 12px;\n      height: 12px;\n      padding: 0;\n      border: 1px solid rgba(17, 17, 17, 0.32);\n      border-radius: 999px;\n      background: transparent;\n      cursor: pointer;\n      transition: width 220ms ease, background 220ms ease, border-color 220ms ease;\n    }\n\n    .carousel-dot.is-active {\n      width: 34px;\n      background: var(--orange);\n      border-color: var(--orange);\n    }\n\n    .carousel-window {\n      width: 100%;\n      overflow: visible;\n      cursor: grab;\n      touch-action: pan-y;\n      user-select: none;\n    }\n\n    .carousel-window.is-dragging {\n      cursor: grabbing;\n    }\n\n    .carousel-track {\n      display: flex;\n      gap: 24px;\n      transition: transform 620ms cubic-bezier(0.22, 1, 0.36, 1);\n      will-change: transform;\n    }\n\n    .carousel-window.is-dragging .carousel-track {\n      transition: none;\n    }\n\n    .carousel-slide {\n      position: relative;\n      flex: 0 0 calc(70% - 12px);\n      min-height: 660px;\n      overflow: hidden;\n      border-radius: 34px;\n      background: #e8e8e8;\n      opacity: 0;\n      transform: scale(0.985);\n      transition: opacity 520ms ease, transform 520ms ease;\n    }\n\n    .carousel-slide.is-active {\n      opacity: 1;\n      transform: scale(1);\n    }\n\n    .carousel-slide.is-next {\n      opacity: 0.42;\n      transform: scale(0.985);\n    }\n\n    .carousel-slide img {\n      position: absolute;\n      inset: 0;\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n    }\n\n    .carousel-slide::after {\n      content: \"\";\n      position: absolute;\n      inset: 0;\n      background: linear-gradient(to top, rgba(0, 0, 0, 0.58), rgba(0, 0, 0, 0.02) 58%);\n      pointer-events: none;\n    }\n\n    .carousel-slide.light-copy::after {\n      background: linear-gradient(90deg, rgba(255, 255, 255, 0.78), rgba(255, 255, 255, 0.08) 58%);\n    }\n\n    .carousel-copy {\n      position: absolute;\n      z-index: 1;\n      left: clamp(24px, 5vw, 64px);\n      bottom: clamp(26px, 5vw, 58px);\n      width: min(430px, calc(100% - 48px));\n      color: #fff;\n    }\n\n    .carousel-slide.light-copy .carousel-copy {\n      color: #111;\n      bottom: clamp(28px, 5vw, 64px);\n    }\n\n    .carousel-copy .kicker,\n    .carousel-copy .section-subtitle,\n    .carousel-copy .body {\n      color: inherit;\n    }\n\n    .carousel-copy .body {\n      opacity: 0.76;\n    }\n\n    .compact-list span {\n      padding: 15px 16px;\n      border-radius: 18px;\n      background: #fff;\n      border: 1px solid var(--line);\n      font-weight: 720;\n    }\n\n    .fuse-panel {\n      display: grid;\n      grid-template-columns: minmax(0, 0.95fr) minmax(360px, 1.05fr);\n      gap: clamp(34px, 5vw, 86px);\n      align-items: center;\n      padding: clamp(34px, 5vw, 70px);\n      border-radius: 34px;\n      background: var(--bg);\n      color: var(--ink);\n    }\n\n    .fuse-panel .kicker {\n      color: var(--orange);\n    }\n\n    .fuse-panel .section-title {\n      color: var(--ink);\n    }\n\n    .fuse-panel .body {\n      color: var(--muted);\n    }\n\n    .fuse-accent-line {\n      width: 74px;\n      height: 3px;\n      margin-top: 30px;\n      border-radius: 999px;\n      background: var(--orange);\n    }\n\n    .fuse-steps {\n      display: grid;\n      gap: 0;\n      border-top: 1px solid var(--line);\n    }\n\n    .fuse-step {\n      display: grid;\n      grid-template-columns: 54px minmax(0, 1fr);\n      gap: 22px;\n      align-items: start;\n      padding: 24px 0;\n      border-bottom: 1px solid var(--line);\n    }\n\n    .fuse-step strong {\n      color: rgba(17, 17, 17, 0.28);\n      font-size: 26px;\n      line-height: 1;\n    }\n\n    .fuse-step h3 {\n      margin-bottom: 8px;\n      color: var(--ink);\n      font-size: 22px;\n      line-height: 1.22;\n    }\n\n    .fuse-step p {\n      margin: 0;\n      color: var(--muted);\n      font-size: clamp(17px, 1.25vw, 20px);\n      line-height: 1.5;\n    }\n\n    .heating-visual {\n      position: relative;\n      min-height: 470px;\n      height: 470px;\n      overflow: visible;\n    }\n\n    .heating-scene {\n      position: relative;\n      overflow: hidden;\n      border-radius: 28px;\n      background: #dfe3e7;\n      height: 100%;\n      min-height: 0;\n    }\n\n    .heating-scene img {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n    }\n\n    .heating-detail {\n      position: absolute;\n      z-index: 2;\n      left: -34px;\n      top: 32px;\n      width: 190px;\n      overflow: hidden;\n      border: 1px solid rgba(255, 255, 255, 0.18);\n      border-radius: 22px;\n      background: #171717;\n      box-shadow: 0 18px 48px rgba(0, 0, 0, 0.24);\n    }\n\n    .heating-detail::after {\n      content: \"\";\n      position: absolute;\n      inset: 0;\n      background: linear-gradient(to top, rgba(0, 0, 0, 0.48), rgba(0, 0, 0, 0));\n      pointer-events: none;\n    }\n\n    .heating-detail img {\n      width: 100%;\n      aspect-ratio: 1 \/ 1;\n      object-fit: cover;\n    }\n\n    .heating-detail span {\n      position: absolute;\n      z-index: 1;\n      left: 12px;\n      right: 12px;\n      bottom: 10px;\n      color: rgba(255, 255, 255, 0.84);\n      font-size: 10px;\n      font-weight: 740;\n      letter-spacing: 0.04em;\n      text-transform: uppercase;\n    }\n\n    .cta {\n      padding: 0;\n    }\n\n    .cta-panel {\n      position: relative;\n      min-height: 520px;\n      display: grid;\n      align-items: center;\n      overflow: hidden;\n      border-radius: 0;\n      background:\n        linear-gradient(90deg, rgba(0, 0, 0, 0.72) 0%, rgba(0, 0, 0, 0.43) 42%, rgba(0, 0, 0, 0.03) 78%),\n        url(\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Hero-Slider-scaled.webp\") 64% center \/ cover no-repeat;\n      color: #fff;\n    }\n\n    .cta-content {\n      width: min(var(--max), 100%);\n      margin: 0 auto;\n      padding: clamp(34px, 6vw, 78px);\n    }\n\n    .cta .section-title {\n      color: #fff;\n    }\n\n    .reveal {\n      opacity: 0;\n      transform: translateY(22px);\n      transition: opacity 620ms ease, transform 620ms ease;\n    }\n\n    .reveal.is-visible {\n      opacity: 1;\n      transform: translateY(0);\n    }\n\n    @media (max-width: 1024px) {\n      .flb-section { padding: 72px 26px; }\n      .hero { min-height: 82vh; background-position: 62% center; }\n      .intro-grid,\n      .split,\n      .feature-heading {\n        grid-template-columns: 1fr;\n      }\n      .feature-heading .body {\n        margin-left: 0;\n      }\n      .card-grid,\n      .compact-list,\n      .fuse-panel {\n        grid-template-columns: 1fr;\n      }\n      .full-image {\n        min-height: 540px;\n      }\n      .plain-image,\n      .ip65-image,\n      .heat-showcase,\n      .award-showcase {\n        min-height: 580px;\n      }\n      .heating-visual {\n        min-height: 440px;\n        height: 440px;\n      }\n      .heating-scene {\n        min-height: 0;\n      }\n      .heating-detail {\n        left: 22px;\n        top: 22px;\n      }\n      .carousel-slide {\n        flex-basis: calc(78% - 12px);\n        min-height: 560px;\n      }\n      .carousel-head {\n        align-items: start;\n      }\n      .cta-panel {\n        background-position: 68% center;\n      }\n      .heat-copy {\n        top: auto;\n        right: 24px;\n        bottom: 24px;\n        transform: none;\n      }\n    }\n\n    @media (max-width: 767px) {\n      .flb-section { padding: 54px 18px; }\n      .hero {\n        min-height: 76vh;\n        padding: 0 20px;\n        background-position: 66% center;\n      }\n      .hero .flb-wrap {\n        padding: 90px 0 64px;\n      }\n      .hero-title {\n        font-size: clamp(38px, 12vw, 50px);\n      }\n      .section-title {\n        font-size: clamp(30px, 9vw, 40px);\n      }\n      .section-subtitle {\n        font-size: 20px;\n      }\n      .body {\n        font-size: 16px;\n      }\n      .panel {\n        border-radius: 26px;\n        padding: 24px;\n      }\n      .fuse-panel {\n        border-radius: 26px;\n        padding: 28px 22px;\n      }\n      .fuse-step {\n        grid-template-columns: 42px minmax(0, 1fr);\n        gap: 14px;\n      }\n      .fuse-step strong {\n        font-size: 20px;\n      }\n      .media,\n      .full-image,\n      .plain-image,\n      .ip65-image,\n      .heat-showcase,\n      .award-showcase {\n        border-radius: 24px;\n      }\n      .full-image {\n        min-height: 460px;\n      }\n      .plain-image,\n      .ip65-image,\n      .heat-showcase,\n      .award-showcase {\n        min-height: 430px;\n      }\n      .ip65-caption {\n        left: 20px;\n        bottom: 22px;\n        width: calc(100% - 40px);\n      }\n      .heating-visual {\n        min-height: 380px;\n        height: 380px;\n      }\n      .heating-scene {\n        min-height: 0;\n        border-radius: 24px;\n      }\n      .heating-detail {\n        left: 14px;\n        top: 14px;\n        width: 136px;\n        border-radius: 16px;\n      }\n      .heating-detail span {\n        font-size: 9px;\n      }\n      .carousel-head {\n        display: grid;\n        gap: 16px;\n      }\n      .carousel-dots {\n        padding-bottom: 0;\n      }\n      .carousel-track {\n        gap: 16px;\n      }\n      .carousel-slide {\n        flex-basis: 100%;\n        min-height: 460px;\n        border-radius: 24px;\n      }\n      .carousel-slide.is-next {\n        opacity: 0;\n      }\n      .carousel-copy {\n        left: 20px;\n        right: 20px;\n        bottom: 22px;\n        width: auto;\n      }\n      .heat-copy,\n      .award-copy {\n        position: relative;\n        inset: auto;\n        width: auto;\n        margin: 18px;\n        transform: none;\n      }\n      .heat-showcase,\n      .award-showcase {\n        display: grid;\n        align-items: end;\n      }\n      .heat-showcase img,\n      .award-showcase img {\n        position: absolute;\n      }\n      .award-showcase::after {\n        background: linear-gradient(to top, rgba(255, 255, 255, 0.82), rgba(255, 255, 255, 0.02) 58%);\n      }\n      .video-scroll {\n        height: auto;\n      }\n      .video-sticky,\n      .video-sticky.is-pinned,\n      .video-sticky.is-after {\n        position: relative;\n        inset: auto;\n        height: auto;\n        min-height: auto;\n      }\n      .video-sticky video {\n        position: relative;\n        height: auto;\n        min-height: auto;\n        aspect-ratio: 4 \/ 5;\n      }\n      .video-copy {\n        position: relative;\n        inset: auto;\n        width: auto;\n        padding: 24px 20px 56px;\n        background: #050505;\n      }\n      .video-segment,\n      .video-intro {\n        position: relative;\n        bottom: auto;\n        opacity: 1;\n        transform: none;\n        margin-top: 22px;\n      }\n      .video-segment h2 {\n        font-size: clamp(30px, 8vw, 38px);\n      }\n      .video-progress {\n        left: 20px;\n        right: 20px;\n        bottom: 24px;\n      }\n      .cta-panel {\n        min-height: 460px;\n        background:\n          linear-gradient(90deg, rgba(0, 0, 0, 0.72) 0%, rgba(0, 0, 0, 0.48) 46%, rgba(0, 0, 0, 0.10) 100%),\n          url(\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Hero-Slider-scaled.webp\") 72% center \/ cover no-repeat;\n      }\n    }\n  \n\/* Elementor import reset *\/\n.flb-json-section,\n.flb-json-global-styles,\n.flb-json-interactions {\n  padding: 0 !important;\n  margin: 0 !important;\n}\n.flb-json-section > .e-con-inner,\n.flb-json-global-styles > .e-con-inner,\n.flb-json-interactions > .e-con-inner {\n  padding: 0 !important;\n  margin: 0 !important;\n  max-width: none !important;\n}\n.flb-json-section .elementor-widget-html,\n.flb-json-global-styles .elementor-widget-html,\n.flb-json-interactions .elementor-widget-html {\n  margin: 0 !important;\n}\n.flb-json-section .elementor-widget-container,\n.flb-json-global-styles .elementor-widget-container,\n.flb-json-interactions .elementor-widget-container {\n  margin: 0 !important;\n}\n.flb-json-fullwidth {\n  width: 100vw !important;\n  max-width: 100vw !important;\n  margin-left: calc(50% - 50vw) !important;\n  margin-right: calc(50% - 50vw) !important;\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n.flb-json-fullwidth > .e-con-inner {\n  width: 100% !important;\n  max-width: none !important;\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-33651ba4 e-con-full e-flex e-con e-parent\" data-id=\"33651ba4\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;_ha_eqh_enable&quot;:false}\">\n\t\t<div class=\"elementor-element elementor-element-1b445261 e-con-full e-flex e-con e-child\" data-id=\"1b445261\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a06981b elementor-widget elementor-widget-heading\" data-id=\"7a06981b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">FLB SERIES<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4006f35 elementor-widget elementor-widget-heading\" data-id=\"4006f35\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Flexible Residential Energy Storage Solution<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8e672c8 elementor-widget elementor-widget-text-editor\" data-id=\"8e672c8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Built for safer backup, smart monitoring, and expandable home energy storage.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-52717f7d e-con-full e-flex e-con e-child\" data-id=\"52717f7d\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3baec819 elementor-widget elementor-widget-button\" data-id=\"3baec819\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#elementor-action%3Aaction%3Dpopup%3Aopen%26settings%3DeyJpZCI6IjI0MzUwIiwidG9nZ2xlIjpmYWxzZX0%3D\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Get in touch &gt;<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4d8815ca elementor-widget elementor-widget-button\" data-id=\"4d8815ca\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/www.felicitysolar.com\/my\/flb-series\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">View Product &gt;<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3a9053a8 e-con-full e-flex e-con e-parent\" data-id=\"3a9053a8\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-777664a5 elementor-widget elementor-widget-html\" data-id=\"777664a5\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"flb-section\">\n      <div class=\"flb-wrap\">\n        <div class=\"intro-grid reveal\">\n          <p class=\"kicker\">Benefits<\/p>\n          <div>\n            <h2 class=\"section-title\">Safer, smarter, and easier to expand.<\/h2>\n            <p class=\"body\">FLB Series combines built-in protection, smart monitoring, and scalable capacity for residential energy systems.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"card-grid\">\n          <article class=\"card reveal\"><h3>Built-in BMS Protection<\/h3><p>Smart battery management for safer operation.<\/p><\/article>\n          <article class=\"card reveal\"><h3>Breaker & Fuse Protection<\/h3><p>Multiple layers for everyday reliability.<\/p><\/article>\n          <article class=\"card reveal\"><h3>Max. 32 in Parallel<\/h3><p>Flexible expansion for growing home needs.<\/p><\/article>\n        <\/div>\n      <\/div>\n    <\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-646be53b e-con-full e-flex e-con e-parent\" data-id=\"646be53b\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-66aded9d elementor-widget elementor-widget-html\" data-id=\"66aded9d\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"flb-section\">\n      <div class=\"flb-wide panel split reveal\">\n        <div>\n          <p class=\"kicker\">Protection Architecture<\/p>\n          <h2 class=\"section-title\">Engineered for safer home energy storage.<\/h2>\n          <div class=\"chips\">\n            <span class=\"chip\">Built-in BMS<\/span>\n            <span class=\"chip\">Circuit Breaker<\/span>\n            <span class=\"chip\">Fuse<\/span>\n            <span class=\"chip\">CCS Technology<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"media\"><img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Built-in-BMS-scaled.webp\" alt=\"FLB protection architecture detail\"><\/div>\n      <\/div>\n    <\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-52c4631e e-con-full e-flex e-con e-parent\" data-id=\"52c4631e\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-49c961c4 elementor-widget elementor-widget-html\" data-id=\"49c961c4\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section id=\"video\" class=\"flb-smooth-video-scroll\" data-flb-smooth-video-section>\r\n  <style>\r\n    .flb-smooth-video-scroll {\r\n      position: relative;\r\n      height: 350vh;\r\n      background: #050505;\r\n      color: #fff;\r\n      overflow: visible;\r\n    }\r\n\r\n    .flb-smooth-video-sticky {\r\n      position: sticky;\r\n      position: -webkit-sticky;\r\n      top: 0;\r\n      height: 100vh;\r\n      min-height: 100vh;\r\n      overflow: hidden;\r\n      background: #050505;\r\n    }\r\n\r\n    .flb-smooth-video-sticky.is-pinned {\r\n      position: fixed;\r\n      inset: 0;\r\n      z-index: 20;\r\n      width: 100%;\r\n      height: 100vh;\r\n    }\r\n\r\n    .flb-smooth-video-sticky.is-after {\r\n      position: absolute;\r\n      inset: auto 0 0 0;\r\n      width: 100%;\r\n      height: 100vh;\r\n    }\r\n\r\n    .flb-smooth-video-sticky video {\r\n      position: absolute;\r\n      inset: 0;\r\n      width: 100%;\r\n      height: 100%;\r\n      min-height: 100vh;\r\n      object-fit: cover;\r\n      background: #050505;\r\n    }\r\n\r\n    .flb-smooth-video-sticky::after {\r\n      content: \"\";\r\n      position: absolute;\r\n      inset: 0;\r\n      background: linear-gradient(to top, rgba(0,0,0,.58), rgba(0,0,0,.06));\r\n      pointer-events: none;\r\n    }\r\n\r\n    .flb-smooth-video-copy {\r\n      position: absolute;\r\n      left: clamp(22px, 6vw, 86px);\r\n      bottom: clamp(34px, 8vh, 92px);\r\n      z-index: 2;\r\n      width: min(760px, calc(100% - 44px));\r\n    }\r\n\r\n    .flb-smooth-video-intro,\r\n    .flb-smooth-video-segment {\r\n      position: absolute;\r\n      left: 0;\r\n      bottom: 28px;\r\n      width: 100%;\r\n      opacity: 0;\r\n      transform: translateY(14px);\r\n      transition: opacity .42s ease, transform .42s ease;\r\n      pointer-events: none;\r\n    }\r\n\r\n    .flb-smooth-video-intro {\r\n      position: relative;\r\n      bottom: auto;\r\n    }\r\n\r\n    .flb-smooth-video-intro.is-active,\r\n    .flb-smooth-video-segment.is-active {\r\n      opacity: var(--segment-opacity, 1);\r\n      transform: translateY(0);\r\n    }\r\n\r\n    .flb-smooth-video-segment h2 {\r\n      margin: 0 0 14px;\r\n      max-width: 760px;\r\n      color: #fff !important;\r\n      font-size: clamp(36px, 3.7vw, 54px);\r\n      line-height: 1.08;\r\n      font-weight: 720;\r\n      letter-spacing: 0;\r\n      text-wrap: balance;\r\n    }\r\n\r\n    .flb-smooth-video-segment h3 {\r\n      margin: 0 0 14px;\r\n      color: #ef692c;\r\n      font-size: clamp(20px, 1.8vw, 25px);\r\n      line-height: 1.32;\r\n      font-weight: 700;\r\n      text-wrap: balance;\r\n    }\r\n\r\n    .flb-smooth-video-segment p,\r\n    .flb-smooth-video-intro p {\r\n      margin: 0;\r\n      max-width: 620px;\r\n      color: rgba(255,255,255,.8);\r\n      font-size: clamp(17px, 1.25vw, 20px);\r\n      line-height: 1.48;\r\n    }\r\n\r\n    .flb-smooth-video-progress {\r\n      position: absolute;\r\n      left: clamp(22px, 6vw, 86px);\r\n      right: clamp(22px, 6vw, 86px);\r\n      bottom: 26px;\r\n      z-index: 2;\r\n      height: 2px;\r\n      background: rgba(255,255,255,.26);\r\n    }\r\n\r\n    .flb-smooth-video-progress span {\r\n      display: block;\r\n      width: calc(var(--video-progress, 0) * 100%);\r\n      height: 100%;\r\n      background: #ef692c;\r\n    }\r\n\r\n    @media (max-width: 767px) {\r\n      .flb-smooth-video-scroll {\r\n        height: auto;\r\n      }\r\n\r\n      .flb-smooth-video-sticky,\r\n      .flb-smooth-video-sticky.is-pinned,\r\n      .flb-smooth-video-sticky.is-after {\r\n        position: relative;\r\n        inset: auto;\r\n        height: auto;\r\n        min-height: auto;\r\n      }\r\n\r\n      .flb-smooth-video-sticky video {\r\n        position: relative;\r\n        height: auto;\r\n        min-height: auto;\r\n        aspect-ratio: 4 \/ 5;\r\n      }\r\n\r\n      .flb-smooth-video-copy {\r\n        position: relative;\r\n        inset: auto;\r\n        width: auto;\r\n        padding: 24px 20px 56px;\r\n        background: #050505;\r\n      }\r\n\r\n      .flb-smooth-video-intro,\r\n      .flb-smooth-video-segment {\r\n        position: relative;\r\n        bottom: auto;\r\n        opacity: 1;\r\n        transform: none;\r\n        margin-top: 22px;\r\n      }\r\n\r\n      .flb-smooth-video-segment h2 {\r\n        font-size: clamp(30px, 8vw, 38px);\r\n      }\r\n\r\n      .flb-smooth-video-progress {\r\n        left: 20px;\r\n        right: 20px;\r\n        bottom: 24px;\r\n      }\r\n    }\r\n  <\/style>\r\n\r\n  <div class=\"flb-smooth-video-sticky\">\r\n    <video\r\n      data-flb-smooth-video\r\n muted\r\n playsinline\r\n preload=\"auto\"\r\n      poster=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Hero-Slider-scaled.webp\"\r\n      src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/FLB-multiple-fuction-video.mp4\">\r\n    <\/video>\r\n\r\n    <div class=\"flb-smooth-video-copy\">\r\n      <div class=\"flb-smooth-video-intro is-active\" data-flb-smooth-video-intro>\r\n        <p>Scroll to look inside the FLB battery architecture.<\/p>\r\n      <\/div>\r\n      <div data-flb-smooth-video-copy><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"flb-smooth-video-progress\" aria-hidden=\"true\"><span><\/span><\/div>\r\n  <\/div>\r\n\r\n  <script>\r\n    (function () {\r\n      const section = document.querySelector(\"[data-flb-smooth-video-section]\");\r\n      if (!section || section.dataset.smoothVideoReady === \"true\") return;\r\n      section.dataset.smoothVideoReady = \"true\";\r\n\r\n      const sticky = section.querySelector(\".flb-smooth-video-sticky\");\r\n      const video = section.querySelector(\"[data-flb-smooth-video]\");\r\n      const copyRoot = section.querySelector(\"[data-flb-smooth-video-copy]\");\r\n      const intro = section.querySelector(\"[data-flb-smooth-video-intro]\");\r\n\r\n      const startTime = 0;\r\n      const endTime = 12.13;\r\n      const transitionBuffer = 0.35;\r\n\r\n      let metadataReady = false;\r\n      let targetTime = 0;\r\n      let smoothTime = 0.01;\r\n      let lastSeekTime = 0.01;\r\n      let lastSeekStamp = 0;\r\n      let activeIndex = -1;\r\n\r\n      const segments = [\r\n        {\r\n          start: 1.00,\r\n          end: 4.00,\r\n          title: \"Inside Every FLB Battery\",\r\n          subtitle: \"Built for Safety and Stability\",\r\n          desc: \"Internal details support smart protection and dependable residential storage.\"\r\n        },\r\n        {\r\n          start: 5.00,\r\n          end: 6.20,\r\n          title: \"Aerosol Fire Extinguishing System\",\r\n          subtitle: \"Instant Response\",\r\n          desc: \"Integrated fire protection adds another layer of safety.\"\r\n        },\r\n        {\r\n          start: 7.13,\r\n          end: 9.24,\r\n          title: \"Built-in Heating Module\",\r\n          subtitle: \"For Cold Environments\",\r\n          desc: \"Supports operation in low-temperature conditions.\"\r\n        },\r\n        {\r\n          start: 10.00,\r\n          end: 12.13,\r\n          title: \"Long-Lasting Storage\",\r\n          subtitle: \"8000+ Cycles\",\r\n          desc: \"Reliable performance for long-term residential use.\"\r\n        }\r\n      ];\r\n\r\n      function escapeHtml(value) {\r\n        return String(value).replace(\/[&<>\"']\/g, function (char) {\r\n          return {\r\n            \"&\": \"&amp;\",\r\n            \"<\": \"&lt;\",\r\n            \">\": \"&gt;\",\r\n            '\"': \"&quot;\",\r\n            \"'\": \"&#039;\"\r\n          }[char];\r\n        });\r\n      }\r\n\r\n      const segmentNodes = segments.map(function (segment) {\r\n        const node = document.createElement(\"article\");\r\n        node.className = \"flb-smooth-video-segment\";\r\n        node.innerHTML =\r\n          \"<h2>\" + escapeHtml(segment.title) + \"<\/h2>\" +\r\n          \"<h3>\" + escapeHtml(segment.subtitle) + \"<\/h3>\" +\r\n          \"<p>\" + escapeHtml(segment.desc) + \"<\/p>\";\r\n        copyRoot.appendChild(node);\r\n        return node;\r\n      });\r\n\r\n      function clamp(value, min, max) {\r\n        return Math.min(Math.max(value, min), max);\r\n      }\r\n\r\n      function isMobile() {\r\n        return window.matchMedia(\"(max-width: 767px)\").matches;\r\n      }\r\n\r\n      function getProgress() {\r\n        if (isMobile()) return 0;\r\n        const rect = section.getBoundingClientRect();\r\n        const scrollable = Math.max(1, section.offsetHeight - window.innerHeight);\r\n        return clamp(-rect.top \/ scrollable, 0, 1);\r\n      }\r\n\r\n      function updatePin() {\r\n        if (isMobile()) {\r\n          sticky.classList.remove(\"is-pinned\", \"is-after\");\r\n          return;\r\n        }\r\n\r\n        const rect = section.getBoundingClientRect();\r\n        const pinEnd = section.offsetHeight - window.innerHeight;\r\n\r\n        if (rect.top > 0) {\r\n          sticky.classList.remove(\"is-pinned\", \"is-after\");\r\n        } else if (-rect.top >= pinEnd) {\r\n          sticky.classList.remove(\"is-pinned\");\r\n          sticky.classList.add(\"is-after\");\r\n        } else {\r\n          sticky.classList.add(\"is-pinned\");\r\n          sticky.classList.remove(\"is-after\");\r\n        }\r\n      }\r\n\r\n      function getTextState(time) {\r\n        if (time < segments[0].start - transitionBuffer) {\r\n          return { index: -1, opacity: 1 };\r\n        }\r\n\r\n        let nearestIndex = 0;\r\n        let nearestDistance = Infinity;\r\n\r\n        segments.forEach(function (segment, index) {\r\n          const distance =\r\n            time < segment.start ? segment.start - time :\r\n            time > segment.end ? time - segment.end :\r\n            0;\r\n\r\n          if (distance < nearestDistance) {\r\n            nearestDistance = distance;\r\n            nearestIndex = index;\r\n          }\r\n        });\r\n\r\n        const segment = segments[nearestIndex];\r\n        let opacity = 1;\r\n\r\n        if (time < segment.start) {\r\n          opacity = clamp(1 - ((segment.start - time) \/ transitionBuffer), 0.2, 1);\r\n        }\r\n\r\n        if (time > segment.end) {\r\n          opacity = clamp(1 - ((time - segment.end) \/ transitionBuffer), 0.2, 1);\r\n        }\r\n\r\n        return { index: nearestIndex, opacity };\r\n      }\r\n\r\n      function updateText(time) {\r\n        const state = getTextState(time);\r\n\r\n        intro.classList.toggle(\"is-active\", state.index === -1);\r\n\r\n        segmentNodes.forEach(function (node, index) {\r\n          const isActive = index === state.index;\r\n          node.classList.toggle(\"is-active\", isActive);\r\n          if (isActive) {\r\n            node.style.setProperty(\"--segment-opacity\", state.opacity.toFixed(3));\r\n          }\r\n        });\r\n\r\n        activeIndex = state.index;\r\n      }\r\n\r\n      function safeSeek(time, now) {\r\n        if (!metadataReady || isMobile()) return;\r\n\r\n        const nextTime = clamp(time, startTime, endTime);\r\n        const seekDistance = Math.abs(nextTime - lastSeekTime);\r\n        const seekInterval = now - lastSeekStamp;\r\n\r\n        if (seekDistance < 0.03 && seekInterval < 90) return;\r\n        if (video.seeking && seekDistance < 0.2) return;\r\n\r\n        try {\r\n          video.currentTime = nextTime;\r\n          lastSeekTime = nextTime;\r\n          lastSeekStamp = now;\r\n        } catch (error) {}\r\n      }\r\n\r\n      function tick(now) {\r\n        updatePin();\r\n\r\n        const progress = getProgress();\r\n        section.style.setProperty(\"--video-progress\", progress.toFixed(4));\r\n\r\n        targetTime = startTime + progress * (endTime - startTime);\r\n\r\n        smoothTime += (targetTime - smoothTime) * 0.18;\r\n        if (Math.abs(targetTime - smoothTime) < 0.004) {\r\n          smoothTime = targetTime;\r\n        }\r\n\r\n        safeSeek(smoothTime, now);\r\n        updateText(smoothTime);\r\n\r\n        requestAnimationFrame(tick);\r\n      }\r\n\r\n      video.addEventListener(\"loadedmetadata\", function () {\r\n        metadataReady = true;\r\n        try {\r\n          video.currentTime = 0.01;\r\n          lastSeekTime = 0.01;\r\n          smoothTime = 0.01;\r\n        } catch (error) {}\r\n      }, { once: true });\r\n\r\n      video.addEventListener(\"canplay\", function () {\r\n        video.pause();\r\n      });\r\n\r\n      video.addEventListener(\"error\", function () {\r\n        console.warn(\"FLB smooth video failed to load:\", video.currentSrc || video.src);\r\n      });\r\n\r\n      if (video.readyState >= 1) {\r\n        metadataReady = true;\r\n      }\r\n\r\n      video.toggleAttribute(\"controls\", isMobile());\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        video.toggleAttribute(\"controls\", isMobile());\r\n      }, { passive: true });\r\n\r\n      requestAnimationFrame(tick);\r\n    })();\r\n  <\/script>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-711bd8ae e-con-full e-flex e-con e-parent\" data-id=\"711bd8ae\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5f516180 elementor-widget elementor-widget-html\" data-id=\"5f516180\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"flb-section\">\n      <div class=\"flb-wide heat-showcase reveal\">\n        <img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Full-Body-Heat-Dissipation-scaled.webp\" alt=\"Full-body heat dissipation\">\n        <div class=\"heat-copy\">\n          <p class=\"kicker\">Heat Dissipation<\/p>\n          <h2 class=\"section-subtitle\">The enclosure works as a heat sink.<\/h2>\n          <p class=\"body\">The BMS board is closely integrated with the top enclosure, helping the whole body support stable heat dissipation.<\/p>\n        <\/div>\n      <\/div>\n    <\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2e4380f8 e-con-full e-flex e-con e-parent\" data-id=\"2e4380f8\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3e97c8a1 elementor-widget elementor-widget-html\" data-id=\"3e97c8a1\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"flb-section\">\n      <div class=\"flb-wide feature-image-section reveal\">\n        <div class=\"ip65-image\">\n          <img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/IP65-Outdoor-Ready-Design-scaled.webp\" alt=\"IP65 outdoor-ready design\">\n          <div class=\"ip65-caption\">\n            <p class=\"kicker\">IP65 Outdoor-Ready Design<\/p>\n            <h2 class=\"section-title\">Reliable in outdoor and semi-outdoor spaces.<\/h2>\n            <p class=\"body\">Dust-proof, water resistant, and built for flexible installation environments.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-46fec5ca e-con-full e-flex e-con e-parent\" data-id=\"46fec5ca\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-692877e5 elementor-widget elementor-widget-html\" data-id=\"692877e5\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"flb-section\">\n      <div class=\"flb-wide panel split reveal\">\n        <div>\n          <p class=\"kicker\">Cold-Climate Solution<\/p>\n          <h2 class=\"section-title\">Built-in heating for low temperatures.<\/h2>\n          <p class=\"body\">Models with the \"-H\" suffix support reliable operation in cold environments.<\/p>\n          <div class=\"chips\">\n  <a class=\"chip\" href=\"https:\/\/www.felicitysolar.com\/product\/flb48314tg1-h\/\" target=\"_blank\" rel=\"noopener\">\n    FLB48314TG1-H\n  <\/a>\n  <a class=\"chip\" href=\"https:\/\/www.felicitysolar.com\/product\/ivgm8klp1g1\/\" target=\"_blank\" rel=\"noopener\">\n    IVGM8KP1G1\n  <\/a>\n<\/div>\n        <\/div>\n        <div class=\"heating-visual\">\n          <div class=\"heating-scene\">\n            <img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Cold-Climate-High-Power-Storage-Solution-scaled.webp\" alt=\"Cold-climate high-power storage solution\">\n          <\/div>\n          <div class=\"heating-detail\">\n            <img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Built-in-Heating-Module.webp\" alt=\"Built-in heating module internal structure\">\n            <span>Internal heating module<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a4d82cb e-con-full e-flex e-con e-parent\" data-id=\"a4d82cb\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-49771ef7 elementor-widget elementor-widget-html\" data-id=\"49771ef7\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"flb-section\">\n      <div class=\"flb-wrap split\">\n        <div class=\"reveal\">\n          <p class=\"kicker\">Smart Monitoring<\/p>\n          <h2 class=\"section-title\">Built-in WiFi \/ Bluetooth.<\/h2>\n          <p class=\"body\">Monitor battery status through the FSolar APP, anytime and anywhere.<\/p>\n          <div class=\"compact-list\">\n            <span>Battery Status<\/span>\n            <span>Remote Monitoring<\/span>\n            <span>Energy Management<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"media reveal\"><img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Build-in-WiFiBluetooth.webp\" alt=\"Built-in WiFi and Bluetooth\"><\/div>\n      <\/div>\n    <\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ef040c3 e-con-full e-flex e-con e-parent\" data-id=\"ef040c3\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b51fab9 elementor-widget elementor-widget-html\" data-id=\"b51fab9\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"flb-section story-carousel\" data-story-carousel>\n      <div class=\"flb-wide reveal\">\n        <div class=\"carousel-head\">\n          <div>\n            <p class=\"kicker\">Product Highlights<\/p>\n            <h2 class=\"section-title\">Performance, design, and market readiness.<\/h2>\n          <\/div>\n          <div class=\"carousel-dots\" aria-label=\"Switch product highlight\">\n            <button class=\"carousel-dot is-active\" type=\"button\" aria-label=\"Show long-lasting energy storage\" data-slide-dot=\"0\"><\/button>\n            <button class=\"carousel-dot\" type=\"button\" aria-label=\"Show award-winning design\" data-slide-dot=\"1\"><\/button>\n            <button class=\"carousel-dot\" type=\"button\" aria-label=\"Show Australia configuration\" data-slide-dot=\"2\"><\/button>\n          <\/div>\n        <\/div>\n        <div class=\"carousel-window\">\n          <div class=\"carousel-track\" data-carousel-track>\n            <article class=\"carousel-slide is-active\">\n              <img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Long-Lasting-Energy-Storage.webp\" alt=\"8000 cycles for long-lasting energy storage\">\n              <div class=\"carousel-copy\">\n                <h3 class=\"section-subtitle\">Cycles for reliable long-term performance.<\/h3>\n                <p class=\"body\">Designed for dependable residential use over years of operation.<\/p>\n              <\/div>\n            <\/article>\n            <article class=\"carousel-slide is-next light-copy\">\n              <img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Award-Winning-Design-scaled.webp\" alt=\"Award-winning FLB design\">\n              <div class=\"carousel-copy\">\n                <h3 class=\"section-subtitle\">Recognized product design.<\/h3>\n                <p class=\"body\">Clean residential appearance with practical storage performance.<\/p>\n              <\/div>\n            <\/article>\n            <article class=\"carousel-slide\">\n              <img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Patented-External-Fuse-Design.webp\" alt=\"Australia-ready FLB configuration\">\n              <div class=\"carousel-copy\">\n                <h3 class=\"section-subtitle\">Customized for Australia.<\/h3>\n                <p class=\"body\">Configuration options support local residential energy storage requirements.<\/p>\n              <\/div>\n            <\/article>\n            <article class=\"carousel-slide is-clone\" aria-hidden=\"true\">\n              <img decoding=\"async\" src=\"https:\/\/www.felicitysolar.com\/wp-content\/uploads\/2026\/06\/Long-Lasting-Energy-Storage.webp\" alt=\"\">\n              <div class=\"carousel-copy\">\n                <h3 class=\"section-subtitle\">Cycles for reliable long-term performance.<\/h3>\n                <p class=\"body\">Designed for dependable residential use over years of operation.<\/p>\n              <\/div>\n            <\/article>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4a0b0778 e-con-full e-flex e-con e-parent\" data-id=\"4a0b0778\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ec35f1a elementor-widget elementor-widget-html\" data-id=\"ec35f1a\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section class=\"flb-section\">\n      <div class=\"flb-wide fuse-panel reveal\">\n        <div>\n          <p class=\"kicker\">External Fuse<\/p>\n          <h2 class=\"section-title\">Maintenance made simpler.<\/h2>\n          <p class=\"body\">The patented external fuse design helps make access and replacement easier.<\/p>\n          <div class=\"fuse-accent-line\" aria-hidden=\"true\"><\/div>\n        <\/div>\n        <div class=\"fuse-steps\">\n          <article class=\"fuse-step\">\n            <strong>01<\/strong>\n            <div>\n              <h3>Easy Access<\/h3>\n              <p>External placement supports a clearer service workflow.<\/p>\n            <\/div>\n          <\/article>\n          <article class=\"fuse-step\">\n            <strong>02<\/strong>\n            <div>\n              <h3>Quick Replacement<\/h3>\n              <p>Fuse replacement can be handled with less disassembly.<\/p>\n            <\/div>\n          <\/article>\n          <article class=\"fuse-step\">\n            <strong>03<\/strong>\n            <div>\n              <h3>Lower Effort<\/h3>\n              <p>Designed to reduce maintenance complexity over long-term use.<\/p>\n            <\/div>\n          <\/article>\n        <\/div>\n      <\/div>\n    <\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-34101b91 e-con-full e-flex e-con e-parent\" data-id=\"34101b91\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4bce6b7c elementor-widget elementor-widget-html\" data-id=\"4bce6b7c\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<section id=\"contact\" class=\"flb-section cta\">\r\n  <div class=\"cta-panel reveal\">\r\n    <div class=\"cta-content\">\r\n      <p class=\"kicker\">FLB Series<\/p>\r\n      <h2 class=\"section-title\">Build a smarter home energy system.<\/h2>\r\n      <p class=\"body light\">Explore scalable, safe, and intelligent residential energy storage solutions.<\/p>\r\n      <div class=\"btn-row\">\r\n        <a class=\"btn secondary\" href=\"https:\/\/www.felicitysolar.com\/flb-series\/\">\r\n          View All FLB <span>><\/span>\r\n        <\/a>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-33e6426f e-con-full e-flex e-con e-parent\" data-id=\"33e6426f\" data-element_type=\"container\" data-settings=\"{&quot;_ha_eqh_enable&quot;:false}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-47f1f680 elementor-widget elementor-widget-html\" data-id=\"47f1f680\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\n    (function () {\n      const revealObserver = new IntersectionObserver((entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            entry.target.classList.add(\"is-visible\");\n            revealObserver.unobserve(entry.target);\n          }\n        });\n      }, { threshold: 0.14 });\n\n      document.querySelectorAll(\".reveal\").forEach((node, index) => {\n        node.style.transitionDelay = `${Math.min(index % 3, 2) * 70}ms`;\n        revealObserver.observe(node);\n      });\n\n      document.querySelectorAll(\"[data-story-carousel]\").forEach((carousel) => {\n        const viewport = carousel.querySelector(\".carousel-window\");\n        const track = carousel.querySelector(\"[data-carousel-track]\");\n        const slides = Array.from(carousel.querySelectorAll(\".carousel-slide\"));\n        const realSlides = slides.filter((slide) => !slide.classList.contains(\"is-clone\"));\n        const dots = Array.from(carousel.querySelectorAll(\"[data-slide-dot]\"));\n        let activeIndex = 0;\n        let baseOffset = 0;\n        let dragStartX = 0;\n        let dragDeltaX = 0;\n        let isDragging = false;\n\n        function offsetForSlide(slide) {\n          return slide.offsetLeft;\n        }\n\n        function applyTrackOffset(offset) {\n          const maxOffset = slides[slides.length - 1].offsetLeft;\n          const safeOffset = Math.min(Math.max(offset, 0), maxOffset);\n          track.style.transform = `translateX(${-safeOffset}px)`;\n        }\n\n        function updateCarousel(index) {\n          activeIndex = (index + realSlides.length) % realSlides.length;\n          const activeSlide = realSlides[activeIndex];\n          baseOffset = offsetForSlide(activeSlide);\n          applyTrackOffset(baseOffset);\n\n          slides.forEach((slide) => {\n            slide.classList.remove(\"is-active\", \"is-next\");\n          });\n\n          activeSlide.classList.add(\"is-active\");\n          slides[activeIndex + 1].classList.add(\"is-next\");\n\n          dots.forEach((dot, dotIndex) => {\n            dot.classList.toggle(\"is-active\", dotIndex === activeIndex);\n          });\n        }\n\n        function pointerX(event) {\n          return event.touches ? event.touches[0].clientX : event.clientX;\n        }\n\n        function startDrag(event) {\n          if (event.target.closest(\"[data-slide-dot]\")) return;\n          if (!event.touches) event.preventDefault();\n          isDragging = true;\n          dragStartX = pointerX(event);\n          dragDeltaX = 0;\n          viewport.classList.add(\"is-dragging\");\n        }\n\n        function moveDrag(event) {\n          if (!isDragging) return;\n          if (!event.touches) event.preventDefault();\n          dragDeltaX = pointerX(event) - dragStartX;\n          applyTrackOffset(baseOffset - dragDeltaX);\n        }\n\n        function endDrag() {\n          if (!isDragging) return;\n          isDragging = false;\n          viewport.classList.remove(\"is-dragging\");\n\n          const threshold = Math.min(160, Math.max(72, viewport.offsetWidth * 0.08));\n          if (dragDeltaX <= -threshold) {\n            updateCarousel(activeIndex + 1);\n          } else if (dragDeltaX >= threshold) {\n            updateCarousel(activeIndex - 1);\n          } else {\n            updateCarousel(activeIndex);\n          }\n        }\n\n        dots.forEach((dot) => {\n          dot.addEventListener(\"click\", () => {\n            updateCarousel(Number(dot.dataset.slideDot || 0));\n          });\n        });\n\n        viewport.addEventListener(\"mousedown\", startDrag);\n        window.addEventListener(\"mousemove\", moveDrag);\n        window.addEventListener(\"mouseup\", endDrag);\n        viewport.addEventListener(\"touchstart\", startDrag, { passive: true });\n        viewport.addEventListener(\"touchmove\", moveDrag, { passive: true });\n        viewport.addEventListener(\"touchend\", endDrag);\n        viewport.addEventListener(\"touchcancel\", endDrag);\n        viewport.addEventListener(\"dragstart\", (event) => event.preventDefault());\n        window.addEventListener(\"resize\", () => updateCarousel(activeIndex), { passive: true });\n        updateCarousel(0);\n      });\n\n      const videoSection = document.querySelector(\"[data-flb-video-section]\");\n      if (!videoSection) return;\n\n      const video = videoSection.querySelector(\"[data-flb-video]\");\n      const videoSticky = videoSection.querySelector(\".video-sticky\");\n      const copyRoot = videoSection.querySelector(\"[data-video-copy]\");\n      const intro = videoSection.querySelector(\"[data-video-intro]\");\n      const startTime = 0;\n      const endTime = 12.13;\n      const transitionBuffer = 0.35;\n      let currentTime = 0;\n      let targetTime = 0;\n      let activeIndex = -1;\n      let metadataReady = false;\n\n      const segments = [\n        { start: 1.00, end: 4.00, title: \"Inside Every FLB Battery\", subtitle: \"Built for Safety and Stability\", desc: \"Internal details support smart protection and dependable residential storage.\" },\n        { start: 5.00, end: 6.20, title: \"Aerosol Fire Extinguishing System\", subtitle: \"Instant Response\", desc: \"Integrated fire protection adds another layer of safety.\" },\n        { start: 7.13, end: 9.24, title: \"Built-in Heating Module\", subtitle: \"For Cold Environments\", desc: \"Supports operation in low-temperature conditions.\" },\n        { start: 10.00, end: 12.13, title: \"Long-Lasting Storage\", subtitle: \"8000+ Cycles\", desc: \"Reliable performance for long-term residential use.\" }\n      ];\n\n      function escapeHtml(value) {\n        return String(value).replace(\/[&<>\"']\/g, (char) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#039;\" }[char]));\n      }\n\n      const nodes = segments.map((segment) => {\n        const article = document.createElement(\"article\");\n        article.className = \"video-segment\";\n        article.innerHTML = `<h2>${escapeHtml(segment.title)}<\/h2><h3>${escapeHtml(segment.subtitle)}<\/h3><p>${escapeHtml(segment.desc)}<\/p>`;\n        copyRoot.appendChild(article);\n        return article;\n      });\n\n      function clamp(value, min, max) {\n        return Math.min(Math.max(value, min), max);\n      }\n\n      function scrollProgress() {\n        if (window.matchMedia(\"(max-width: 767px)\").matches) return 0;\n        const rect = videoSection.getBoundingClientRect();\n        const scrollable = Math.max(1, videoSection.offsetHeight - window.innerHeight);\n        return clamp(-rect.top \/ scrollable, 0, 1);\n      }\n\n      function updatePinnedState() {\n        if (window.matchMedia(\"(max-width: 767px)\").matches) {\n          videoSticky.classList.remove(\"is-pinned\", \"is-after\");\n          return;\n        }\n\n        const rect = videoSection.getBoundingClientRect();\n        const pinEnd = videoSection.offsetHeight - window.innerHeight;\n\n        if (rect.top > 0) {\n          videoSticky.classList.remove(\"is-pinned\", \"is-after\");\n        } else if (-rect.top >= pinEnd) {\n          videoSticky.classList.remove(\"is-pinned\");\n          videoSticky.classList.add(\"is-after\");\n        } else {\n          videoSticky.classList.add(\"is-pinned\");\n          videoSticky.classList.remove(\"is-after\");\n        }\n      }\n\n      function stateFor(time) {\n        if (time < segments[0].start - transitionBuffer) return { index: -1, opacity: 1 };\n        let nearest = 0;\n        let distance = Infinity;\n        segments.forEach((segment, index) => {\n          const d = time < segment.start ? segment.start - time : time > segment.end ? time - segment.end : 0;\n          if (d < distance) {\n            distance = d;\n            nearest = index;\n          }\n        });\n        const segment = segments[nearest];\n        let opacity = 1;\n        if (time < segment.start) opacity = clamp(1 - ((segment.start - time) \/ transitionBuffer), 0.18, 1);\n        if (time > segment.end) opacity = clamp(1 - ((time - segment.end) \/ transitionBuffer), 0.18, 1);\n        return { index: nearest, opacity };\n      }\n\n      function applyText(time) {\n        const state = stateFor(time);\n        if (state.index !== activeIndex) activeIndex = state.index;\n        intro.classList.toggle(\"is-active\", state.index === -1);\n        nodes.forEach((node, index) => {\n          node.classList.toggle(\"is-active\", index === state.index);\n          if (index === state.index) node.style.setProperty(\"--segment-opacity\", state.opacity.toFixed(3));\n        });\n      }\n\n      function responsiveMode() {\n        const mobile = window.matchMedia(\"(max-width: 767px)\").matches;\n        video.toggleAttribute(\"controls\", mobile);\n      }\n\n      function tick() {\n        updatePinnedState();\n        const progress = scrollProgress();\n        targetTime = startTime + progress * (endTime - startTime);\n        videoSection.style.setProperty(\"--video-progress\", progress.toFixed(4));\n\n        if (metadataReady && !window.matchMedia(\"(max-width: 767px)\").matches) {\n          currentTime += (targetTime - currentTime) * 0.12;\n          if (Math.abs(targetTime - currentTime) < 0.004) currentTime = targetTime;\n          try { video.currentTime = clamp(currentTime, startTime, endTime); } catch (error) {}\n          applyText(currentTime);\n        } else {\n          applyText(targetTime);\n        }\n\n        requestAnimationFrame(tick);\n      }\n\n      video.addEventListener(\"loadedmetadata\", () => {\n        metadataReady = true;\n        try { video.currentTime = 0.01; } catch (error) {}\n      }, { once: true });\n      video.addEventListener(\"canplay\", () => video.pause());\n      if (video.readyState >= 1) metadataReady = true;\n      responsiveMode();\n      window.addEventListener(\"resize\", responsiveMode, { passive: true });\n      requestAnimationFrame(tick);\n    })();\n  <\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"featured_media":44130,"template":"elementor_header_footer","meta":{"_acf_changed":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"default","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}}},"solution-categorie":[610],"class_list":["post-44140","solution","type-solution","status-publish","has-post-thumbnail","hentry","solution-categorie-residential-energy-storage-solution"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.felicitysolar.com\/my\/wp-json\/wp\/v2\/solution\/44140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.felicitysolar.com\/my\/wp-json\/wp\/v2\/solution"}],"about":[{"href":"https:\/\/www.felicitysolar.com\/my\/wp-json\/wp\/v2\/types\/solution"}],"version-history":[{"count":11,"href":"https:\/\/www.felicitysolar.com\/my\/wp-json\/wp\/v2\/solution\/44140\/revisions"}],"predecessor-version":[{"id":44400,"href":"https:\/\/www.felicitysolar.com\/my\/wp-json\/wp\/v2\/solution\/44140\/revisions\/44400"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.felicitysolar.com\/my\/wp-json\/wp\/v2\/media\/44130"}],"wp:attachment":[{"href":"https:\/\/www.felicitysolar.com\/my\/wp-json\/wp\/v2\/media?parent=44140"}],"wp:term":[{"taxonomy":"solution-categorie","embeddable":true,"href":"https:\/\/www.felicitysolar.com\/my\/wp-json\/wp\/v2\/solution-categorie?post=44140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}