{"id":952,"date":"2023-02-17T15:51:42","date_gmt":"2023-02-17T15:51:42","guid":{"rendered":"https:\/\/library.startertemplatecloud.com\/g19\/?page_id=952"},"modified":"2026-07-16T23:13:09","modified_gmt":"2026-07-17T03:13:09","slug":"home","status":"publish","type":"page","link":"https:\/\/9biotx.com\/fr\/","title":{"rendered":"Home"},"content":{"rendered":"\n\n\n\n\n<div class=\"wp-block-nk-awb nk-awb nk-awb-fullheight nk-awb-content-valign-center youtubebg ninebio-awb-section has-var-global-palette-1-background-color has-background\"><div class=\"nk-awb-wrap\" style=\"background:var(--global-palette1)\" data-awb-type=\"yt_vm_video\" data-awb-video=\"https:\/\/www.youtube.com\/watch?v=hGNZ8FqQ8C4?rel=0&amp;controls=0&amp;showinfo=0\" data-awb-video-always-play=\"true\" data-awb-video-mobile=\"true\"><div class=\"nk-awb-overlay\" style=\"background: linear-gradient(98deg,rgb(14,20,40) 0%,rgba(14,20,41,0.36) 100%);\"><\/div><div class=\"nk-awb-inner\"><\/div><\/div><div class=\"nk-awb-wrap-content is-layout-constrained wp-block-nk-awb-is-layout-constrained\">\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading952_f8bb75-11, .wp-block-kadence-advancedheading.kt-adv-heading952_f8bb75-11[data-kb-block=\"kb-adv-heading952_f8bb75-11\"]{max-width:861px;font-size:var(--global-kb-font-size-xxl, 4rem);line-height:1.05em;font-style:normal;color:#ffffff;}.wp-block-kadence-advancedheading.kt-adv-heading952_f8bb75-11 mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading952_f8bb75-11[data-kb-block=\"kb-adv-heading952_f8bb75-11\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading952_f8bb75-11 img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading952_f8bb75-11[data-kb-block=\"kb-adv-heading952_f8bb75-11\"] img.kb-inline-image{width:150px;vertical-align:baseline;}@media all and (max-width: 767px){.wp-block-kadence-advancedheading.kt-adv-heading952_f8bb75-11, .wp-block-kadence-advancedheading.kt-adv-heading952_f8bb75-11[data-kb-block=\"kb-adv-heading952_f8bb75-11\"]{font-size:var(--global-kb-font-size-lg, 2rem);}}<\/style>\n<h1 class=\"kt-adv-heading952_f8bb75-11 hero-typed-1-fr wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading952_f8bb75-11\"><em>Nous d\u00e9veloppons des prot\u00e9ines afin de transformer la complexit\u00e9 biologique en traitements de nouvelle g\u00e9n\u00e9ration.<\/em><\/h1>\n\n\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading952_dac9c3-ef, .wp-block-kadence-advancedheading.kt-adv-heading952_dac9c3-ef[data-kb-block=\"kb-adv-heading952_dac9c3-ef\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading952_dac9c3-ef mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading952_dac9c3-ef[data-kb-block=\"kb-adv-heading952_dac9c3-ef\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading952_dac9c3-ef img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading952_dac9c3-ef[data-kb-block=\"kb-adv-heading952_dac9c3-ef\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h6 class=\"kt-adv-heading952_dac9c3-ef hero-typed-2-fr wp-block-kadence-advancedheading has-theme-palette-2-color has-text-color\" data-kb-block=\"kb-adv-heading952_dac9c3-ef\"><a href=\"https:\/\/9bio.ca\/#how\">en savoir plus &gt;<\/a><\/h6>\n\n\n\n<!-- Scroll hint indicator -->\n      <div id=\"scrlToExpl\" class=\"scroll-indicator\">\n        <span>Scroll to explore<\/span>\n        <div class=\"mouse-icon\">\n          <div class=\"mouse-wheel\"><\/div>\n        <\/div>\n      <\/div>\n\n\n\n<style data-wp-block-html=\"css\">\n.ninebio-awb-section {\n    position: relative !important;\n    overflow: hidden !important;\n    isolation: isolate !important;\n    background-color: #0E1428 !important;\n  }\n\n  .ninebio-awb-section > *:not(.ninebio-awb-background),\n  .ninebio-awb-section .wp-block-group__inner-container > *:not(.ninebio-awb-background),\n  .ninebio-awb-section .wp-block-cover__inner-container > *:not(.ninebio-awb-background),\n  .ninebio-awb-section .elementor-widget-wrap > *:not(.ninebio-awb-background) {\n    position: relative !important;\n    z-index: 2 !important;\n  }\n\n  .ninebio-awb-background,\n  .ninebio-awb-background * {\n    box-sizing: border-box;\n  }\n\n  .ninebio-awb-background {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    min-height: 420px;\n    overflow: hidden !important;\n    pointer-events: none !important;\n    z-index: 0 !important;\n    background:\n      radial-gradient(circle at 68% 38%, rgba(90, 145, 255, 0.18), transparent 36%),\n      radial-gradient(circle at 23% 68%, rgba(170, 120, 255, 0.14), transparent 34%),\n      linear-gradient(145deg, #070B18, #0E1428 48%, #111B36) !important;\n  }\n\n  .ninebio-awb-background canvas {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    display: block !important;\n    z-index: 1 !important;\n  }\n\n  .ninebio-awb-orb {\n    position: absolute;\n    width: min(42vw, 620px);\n    aspect-ratio: 1;\n    border-radius: 50%;\n    filter: blur(52px);\n    opacity: 0.42;\n    mix-blend-mode: screen;\n    pointer-events: none;\n    z-index: 0;\n  }\n\n  .ninebio-awb-orb.one {\n    left: -8%;\n    top: 18%;\n    background: rgba(111, 231, 255, 0.18);\n  }\n\n  .ninebio-awb-orb.two {\n    right: -10%;\n    bottom: -8%;\n    background: rgba(170, 120, 255, 0.16);\n  }\n\n  .ninebio-awb-vignette {\n    position: absolute;\n    inset: -10%;\n    background:\n      radial-gradient(circle at center, transparent 36%, rgba(0, 0, 0, 0.34) 82%),\n      linear-gradient(90deg, rgba(7, 11, 24, 0.68), transparent 28%, transparent 72%, rgba(7, 11, 24, 0.55));\n    pointer-events: none;\n    z-index: 3;\n  }\n\n  .ninebio-awb-grain {\n    position: absolute;\n    inset: 0;\n    opacity: 0.08;\n    z-index: 4;\n    pointer-events: none;\n    background-image:\n      linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px),\n      linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px);\n    background-size: 44px 44px;\n    mask-image: radial-gradient(circle at center, black, transparent 82%);\n  }\n\n\n    #scrlToExpl {\n        position: absolute !important;\n        bottom: 20px !important;\n        left: 50% !important;\n        transform: translateX(-50%) !important;\n        z-index: 3 !important;\n    }\n<\/style>\n\n<script data-wp-block-html=\"js\">\n(() => {\n        function initNineBioAwb() {\n            const root = document.getElementById(\"ninebioAwbBackground\");\n            const canvas = document.getElementById(\"ninebioAwbCanvas\");\n            if (!root || !canvas || root.dataset.initialized === \"true\") return;\n            root.dataset.initialized = \"true\";\n\n            let section = root.closest(\".ninebio-awb-section\");\n            if (!section) {\n                section = root.closest(\".wp-block-cover, .wp-block-group, section, .elementor-section, .elementor-container, .container, .row\") || root.parentElement;\n                if (section) section.classList.add(\"ninebio-awb-section\");\n            }\n\n            const scrlToExpl = document.getElementById(\"scrlToExpl\");\n\n            if (section) {\n                if (root.parentElement !== section) {\n                    section.prepend(root);\n                }\n\n                const scrlToExpl = document.getElementById(\"scrlToExpl\");\n                if (scrlToExpl) {\n                    section.appendChild(scrlToExpl);\n                }\n            }\n\n            const ctx = canvas.getContext(\"2d\", { alpha: true });\n\n\n\nconst ANTIBODY_ICON_SRC = \"\/wp-content\/uploads\/2026\/07\/antibody-home-1.png\";\n            const antibodyImage = new Image();\n            antibodyImage.src = ANTIBODY_ICON_SRC;\n\n            const antibodyTintCanvas = document.createElement(\"canvas\");\n            const antibodyTintCtx = antibodyTintCanvas.getContext(\"2d\");\n            const prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n            let width = 0;\n            let height = 0;\n            let dpr = 1;\n            let particles = [];\n            let strands = [];\n            let antibodies = [];\n            let time = 0;\n            let rafId;\n\n            const mouse = { nx: 0, ny: 0, active: false };\n            const clamp = (value, min, max) => Math.min(Math.max(value, min), max);\n            const rand = (min, max) => min + Math.random() * (max - min);\n            const lerp = (a, b, t) => a + (b - a) * t;\n\n            function resize() {\n                const rect = root.getBoundingClientRect();\n                width = Math.max(1, rect.width);\n                height = Math.max(1, rect.height);\n                dpr = clamp(window.devicePixelRatio || 1, 1, 2);\n                canvas.width = Math.floor(width * dpr);\n                canvas.height = Math.floor(height * dpr);\n                canvas.style.width = `${width}px`;\n                canvas.style.height = `${height}px`;\n                ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n                createScene();\n            }\n\n            function createScene() {\n                const area = width * height;\n                const particleCount = prefersReducedMotion ? 45 : clamp(Math.floor(area \/ 14500), 60, 150);\n                const strandCount = prefersReducedMotion ? 3 : clamp(Math.floor(width \/ 250), 4, 8);\n                const antibodyCount = prefersReducedMotion ? 4 : clamp(Math.floor(width \/ 230), 5, 9);\n\n                particles = Array.from({ length: particleCount }, () => ({\n                    x: rand(0, width), y: rand(0, height), r: rand(0.8, 2.4),\n                    vx: rand(-0.08, 0.08), vy: rand(-0.06, 0.06), pulse: rand(0, Math.PI * 2),\n                    hue: Math.random() > 0.68 ? \"cyan\" : \"blue\", depth: rand(0.2, 1)\n                }));\n\n                strands = Array.from({ length: strandCount }, () => ({\n                    x: rand(width * 0.08, width * 0.92), y: rand(height * 0.08, height * 0.86),\n                    length: rand(width * 0.20, width * 0.42), amp: rand(16, 42), phase: rand(0, Math.PI * 2),\n                    speed: rand(0.00022, 0.00052), tilt: rand(-0.65, 0.65), alpha: rand(0.08, 0.18),\n                    nodes: Math.floor(rand(7, 12)), depth: rand(0.35, 1)\n                }));\n\n                antibodies = Array.from({ length: antibodyCount }, () => ({\n                    x: rand(-width * 0.25, width * 1.08), y: rand(height * 0.18, height * 0.82),\n                    size: rand(14, 24), speed: rand(0.10, 0.26), phase: rand(0, Math.PI * 2),\n                    alpha: rand(0.26, 0.58), targetBias: Math.random() > 0.55, depth: rand(0.4, 1),\n                    vx: rand(-0.2, 0.2), vy: rand(-0.15, 0.15)\n                }));\n            }\n\n            function color(name, alpha) {\n                if (name === \"cyan\") return `rgba(111, 231, 255, ${alpha})`;\n                if (name === \"violet\") return `rgba(170, 120, 255, ${alpha})`;\n                if (name === \"accent\") return `rgba(94, 232, 196, ${alpha})`;\n                return `rgba(90, 145, 255, ${alpha})`;\n            }\n\n            function drawBackgroundGlow() {\n                const glow1X = width * 0.66 + mouse.nx * 40;\n                const glow1Y = height * 0.42 + mouse.ny * 34;\n                const glow2X = width * 0.34 - mouse.nx * 34;\n                const glow2Y = height * 0.72 - mouse.ny * 28;\n                const g1 = ctx.createRadialGradient(glow1X, glow1Y, 0, glow1X, glow1Y, Math.max(width, height) * 0.58);\n                g1.addColorStop(0, \"rgba(80, 150, 255, 0.15)\");\n                g1.addColorStop(0.48, \"rgba(80, 150, 255, 0.05)\");\n                g1.addColorStop(1, \"rgba(80, 150, 255, 0)\");\n                ctx.fillStyle = g1;\n                ctx.fillRect(0, 0, width, height);\n\n                const g2 = ctx.createRadialGradient(glow2X, glow2Y, 0, glow2X, glow2Y, Math.max(width, height) * 0.5);\n                g2.addColorStop(0, \"rgba(94, 232, 196, 0.08)\");\n                g2.addColorStop(0.5, \"rgba(94, 232, 196, 0.03)\");\n                g2.addColorStop(1, \"rgba(94, 232, 196, 0)\");\n                ctx.fillStyle = g2;\n                ctx.fillRect(0, 0, width, height);\n            }\n\n            function drawParticles(delta) {\n                const maxDist = Math.min(145, width * 0.12);\n                for (const p of particles) {\n                    if (!prefersReducedMotion) {\n                        p.x += p.vx * delta * 0.055;\n                        p.y += p.vy * delta * 0.055;\n                        p.x += Math.sin(time * 0.00033 + p.pulse) * 0.018 * delta;\n                        p.y += Math.cos(time * 0.00029 + p.pulse) * 0.014 * delta;\n                    }\n                    if (p.x < -20) p.x = width + 20;\n                    if (p.x > width + 20) p.x = -20;\n                    if (p.y < -20) p.y = height + 20;\n                    if (p.y > height + 20) p.y = -20;\n                }\n\n                ctx.lineWidth = 1;\n                for (let i = 0; i < particles.length; i++) {\n                    const a = particles[i];\n                    const ax = a.x + mouse.nx * 18 * a.depth;\n                    const ay = a.y + mouse.ny * 14 * a.depth;\n                    for (let j = i + 1; j < particles.length; j++) {\n                        const b = particles[j];\n                        const bx = b.x + mouse.nx * 18 * b.depth;\n                        const by = b.y + mouse.ny * 14 * b.depth;\n                        const dist = Math.hypot(ax - bx, ay - by);\n                        if (dist < maxDist) {\n                            const alpha = (1 - dist \/ maxDist) * 0.10;\n                            ctx.strokeStyle = `rgba(128, 210, 255, ${alpha})`;\n                            ctx.beginPath();\n                            ctx.moveTo(ax, ay);\n                            ctx.lineTo(bx, by);\n                            ctx.stroke();\n                        }\n                    }\n                }\n\n                for (const p of particles) {\n                    const drawX = p.x + mouse.nx * 18 * p.depth;\n                    const drawY = p.y + mouse.ny * 14 * p.depth;\n                    const pulse = 0.65 + Math.sin(time * 0.0012 + p.pulse) * 0.35;\n                    ctx.fillStyle = color(p.hue, 0.18 + pulse * 0.24);\n                    ctx.beginPath();\n                    ctx.arc(drawX, drawY, p.r + pulse * 0.5, 0, Math.PI * 2);\n                    ctx.fill();\n                    ctx.fillStyle = color(\"cyan\", 0.05 * pulse);\n                    ctx.beginPath();\n                    ctx.arc(drawX, drawY, (p.r + 1.5) * 4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n\n            function drawStrands() {\n                for (const strand of strands) {\n                    const pointsA = [];\n                    const pointsB = [];\n                    const angle = strand.tilt;\n                    const cos = Math.cos(angle);\n                    const sin = Math.sin(angle);\n                    const centerX = strand.x + Math.sin(time * strand.speed + strand.phase) * 24 + mouse.nx * 20 * strand.depth;\n                    const centerY = strand.y + Math.cos(time * strand.speed * 0.8 + strand.phase) * 18 + mouse.ny * 18 * strand.depth;\n                    for (let i = 0; i < strand.nodes; i++) {\n                        const t = i \/ (strand.nodes - 1);\n                        const localX = (t - 0.5) * strand.length;\n                        const wave = Math.sin(t * Math.PI * 4 + time * 0.001 + strand.phase) * strand.amp;\n                        pointsA.push([centerX + localX * cos - wave * sin, centerY + localX * sin + wave * cos]);\n                        pointsB.push([centerX + localX * cos + wave * sin, centerY + localX * sin - wave * cos]);\n                    }\n\n                    ctx.lineWidth = 1.2;\n                    ctx.strokeStyle = `rgba(111, 231, 255, ${strand.alpha})`;\n                    ctx.beginPath();\n                    pointsA.forEach(([x, y], i) => i ? ctx.lineTo(x, y) : ctx.moveTo(x, y));\n                    ctx.stroke();\n\n                    ctx.strokeStyle = `rgba(170, 120, 255, ${strand.alpha * 0.8})`;\n                    ctx.beginPath();\n                    pointsB.forEach(([x, y], i) => i ? ctx.lineTo(x, y) : ctx.moveTo(x, y));\n                    ctx.stroke();\n\n                    for (let i = 0; i < strand.nodes; i++) {\n                        const [x1, y1] = pointsA[i];\n                        const [x2, y2] = pointsB[i];\n                        if (i % 2 === 0) {\n                            ctx.strokeStyle = `rgba(255, 255, 255, ${strand.alpha * 0.5})`;\n                            ctx.beginPath();\n                            ctx.moveTo(x1, y1);\n                            ctx.lineTo(x2, y2);\n                            ctx.stroke();\n                        }\n                        ctx.fillStyle = `rgba(255, 255, 255, ${strand.alpha * 1.45})`;\n                        ctx.beginPath();\n                        ctx.arc(x1, y1, 2.1, 0, Math.PI * 2);\n                        ctx.arc(x2, y2, 2.1, 0, Math.PI * 2);\n                        ctx.fill();\n                    }\n                }\n            }\n\n            function drawAntibody(x, y, size, rotation, alpha) {\n                if (!antibodyImage.complete) return;\n                const drawSize = size * 2.35;\n                const imageSize = 512;\n                antibodyTintCanvas.width = imageSize;\n                antibodyTintCanvas.height = imageSize;\n                antibodyTintCtx.clearRect(0, 0, imageSize, imageSize);\n                antibodyTintCtx.drawImage(antibodyImage, 0, 0, imageSize, imageSize);\n                antibodyTintCtx.globalCompositeOperation = \"source-in\";\n                antibodyTintCtx.fillStyle = \"rgb(208, 214, 224)\";\n                antibodyTintCtx.fillRect(0, 0, imageSize, imageSize);\n                antibodyTintCtx.globalCompositeOperation = \"source-over\";\n\n                ctx.save();\n                ctx.translate(x, y);\n                ctx.rotate(rotation);\n                ctx.shadowColor = `rgba(111, 231, 255, ${alpha * 0.10})`;\n                ctx.shadowBlur = size * 0.42;\n                ctx.globalAlpha = alpha * 0.84;\n                ctx.drawImage(antibodyTintCanvas, -drawSize \/ 2, -drawSize \/ 2, drawSize, drawSize);\n                ctx.shadowBlur = 0;\n                ctx.globalAlpha = alpha * 0.32;\n                ctx.drawImage(antibodyTintCanvas, -drawSize * 0.485, -drawSize * 0.485, drawSize * 0.97, drawSize * 0.97);\n                ctx.restore();\n            }\n\n            function drawAntibodies(delta) {\n                const focusX = width * 0.64 + mouse.nx * 18;\n                const focusY = height * 0.52 + mouse.ny * 18;\n                const influenceRadius = Math.min(width, height) * 0.28;\n                const maxSpeed = 1.6;\n\n                for (const ab of antibodies) {\n                    if (!prefersReducedMotion) {\n                        ab.vx += Math.cos(time * 0.0007 + ab.phase) * 0.0025;\n                        ab.vy += Math.sin(time * 0.0009 + ab.phase) * 0.0022;\n\n                        ab.vx *= 0.965;\n                        ab.vy *= 0.965;\n                        const speed = Math.hypot(ab.vx, ab.vy);\n                        if (speed > maxSpeed) {\n                            ab.vx = (ab.vx \/ speed) * maxSpeed;\n                            ab.vy = (ab.vy \/ speed) * maxSpeed;\n                        }\n\n                        ab.x += ab.vx * delta * 0.12 + ab.speed * delta * 0.03;\n                        ab.y += ab.vy * delta * 0.12;\n                    }\n\n                    if (ab.x > width + 90) { ab.x = -90; ab.y = rand(height * 0.18, height * 0.82); }\n                    if (ab.x < -100) ab.x = width + 60;\n                    if (ab.y < -70) ab.y = height + 50;\n                    if (ab.y > height + 70) ab.y = -50;\n\n                    const drawX = ab.x + mouse.nx * 14 * ab.depth;\n                    const drawY = ab.y + mouse.ny * 10 * ab.depth;\n                    const rotation = Math.atan2(ab.vy + Math.sin(time * 0.0008 + ab.phase) * 0.2, ab.vx + 0.15) + Math.PI \/ 2;\n                    drawAntibody(drawX, drawY, ab.size, rotation, ab.alpha);\n                }\n\n                const zonePulse = 0.5 + Math.sin(time * 0.0018) * 0.5;\n                const zoneRadius = Math.min(width, height) * (0.075 + zonePulse * 0.012);\n                const grad = ctx.createRadialGradient(focusX, focusY, 0, focusX, focusY, zoneRadius * 2.3);\n                grad.addColorStop(0, \"rgba(94, 232, 196, 0.14)\");\n                grad.addColorStop(0.42, \"rgba(111, 231, 255, 0.08)\");\n                grad.addColorStop(1, \"rgba(111, 231, 255, 0)\");\n                ctx.fillStyle = grad;\n                ctx.beginPath();\n                ctx.arc(focusX, focusY, zoneRadius * 2.3, 0, Math.PI * 2);\n                ctx.fill();\n                ctx.strokeStyle = `rgba(94, 232, 196, ${0.10 + zonePulse * 0.06})`;\n                ctx.lineWidth = 1;\n                ctx.beginPath();\n                ctx.arc(focusX, focusY, zoneRadius, 0, Math.PI * 2);\n                ctx.stroke();\n            }\n\n            let previous = performance.now();\n            function render(now) {\n                const delta = Math.min(48, now - previous);\n                previous = now;\n                time = now;\n                ctx.clearRect(0, 0, width, height);\n                drawBackgroundGlow();\n                drawStrands();\n                drawParticles(delta);\n                drawAntibodies(delta);\n                if (!prefersReducedMotion) rafId = requestAnimationFrame(render);\n            }\n\n            const resizeObserver = new ResizeObserver(resize);\n            resizeObserver.observe(root);\n                        window.addEventListener(\"resize\", resize, { passive: true });\n            resize();\n            render(performance.now());\n\n            document.addEventListener(\"visibilitychange\", () => {\n                if (document.hidden) {\n                    cancelAnimationFrame(rafId);\n                } else if (!prefersReducedMotion) {\n                    previous = performance.now();\n                    rafId = requestAnimationFrame(render);\n                }\n            });\n        }\n\n        if (document.readyState === \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", initNineBioAwb);\n        } else {\n            initNineBioAwb();\n        }\n    })();\n<\/script>\n\n<div class=\"ninebio-awb-background\" id=\"ninebioAwbBackground\" aria-hidden=\"true\">\n  <canvas id=\"ninebioAwbCanvas\"><\/canvas>\n  <div class=\"ninebio-awb-orb one\"><\/div>\n  <div class=\"ninebio-awb-orb two\"><\/div>\n  <div class=\"ninebio-awb-vignette\"><\/div>\n  <div class=\"ninebio-awb-grain\"><\/div>\n<\/div>\n<\/div><\/div>\n\n\n<style>.kb-row-layout-wrap.wp-block-kadence-rowlayout.kb-row-layout-id952_71990a-23{margin-top:0px;margin-bottom:0px;}.kb-row-layout-id952_71990a-23 > .kt-row-column-wrap{align-content:center;}:where(.kb-row-layout-id952_71990a-23 > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:center;}.kb-row-layout-id952_71990a-23 > .kt-row-column-wrap{column-gap:var(--global-kb-gap-none, 0rem );row-gap:var(--global-kb-gap-md, 2rem);max-width:var( --global-content-width, 1200px );padding-left:var(--global-content-edge-padding);padding-right:var(--global-content-edge-padding);padding-top:var(--global-kb-spacing-lg, 3rem);padding-bottom:40px;grid-template-columns:minmax(0, 1fr);}.kb-row-layout-id952_71990a-23 > .kt-row-layout-overlay{opacity:0.30;mix-blend-mode:normal;}@media all and (max-width: 1024px){.kb-row-layout-id952_71990a-23 > .kt-row-column-wrap{column-gap:var(--global-kb-gap-none, 0rem );row-gap:var(--global-kb-gap-none, 0rem );padding-top:var(--global-kb-spacing-xl, 4rem);grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){.kb-row-layout-id952_71990a-23 > .kt-row-column-wrap{row-gap:var(--global-kb-gap-md, 2rem);padding-top:var(--global-kb-spacing-xl, 4rem);padding-right:0px;padding-left:0px;grid-template-columns:minmax(0, 1fr);}}<\/style><div class=\"kb-row-layout-wrap kb-row-layout-id952_71990a-23 alignfull has-theme-palette6-background-color kt-row-has-bg wp-block-kadence-rowlayout\"><div class=\"kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-middle kt-inner-column-height-full kb-theme-content-width\">\n<style>.kadence-column952_3e5dbb-c1 > .kt-inside-inner-col,.kadence-column952_3e5dbb-c1 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column952_3e5dbb-c1 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column952_3e5dbb-c1 > .kt-inside-inner-col{flex-direction:column;}.kadence-column952_3e5dbb-c1 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column952_3e5dbb-c1 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column952_3e5dbb-c1{position:relative;}@media all and (max-width: 1024px){.kadence-column952_3e5dbb-c1 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column952_3e5dbb-c1 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column952_3e5dbb-c1\"><div class=\"kt-inside-inner-col\"><style>.kadence-column952_d3dc8c-f7 > .kt-inside-inner-col,.kadence-column952_d3dc8c-f7 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column952_d3dc8c-f7 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column952_d3dc8c-f7 > .kt-inside-inner-col{flex-direction:column;}.kadence-column952_d3dc8c-f7 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column952_d3dc8c-f7 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column952_d3dc8c-f7{position:relative;}@media all and (max-width: 1024px){.kadence-column952_d3dc8c-f7 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column952_d3dc8c-f7 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column952_d3dc8c-f7\"><div class=\"kt-inside-inner-col\">\n<!-- Google Fonts -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@300;400;500;600;700&amp;family=Outfit:wght@300;400;500;600;700;800&amp;display=swap\" rel=\"stylesheet\">\n\n<style>\n    \/* Reset and Base Styles *\/\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n\n    :root {\n      --bg-primary: #02060d;\n      --bg-secondary: #05101a;\n      --bg-tertiary: #0a192f;\n\n      --text-primary: #f8fafc;\n      --text-secondary: #cbd5e1;\n      --text-accent: #FF5E00;\n      \/* Bright Orange *\/\n      --text-accent-alt: #FF8C00;\n      \/* Lighter Orange *\/\n\n      --gradient-primary: linear-gradient(135deg, #FF5E00 0%, #FF8C00 100%);\n      --glow-color: rgba(255, 94, 0, 0.3);\n    }\n\n    body {\n      font-family: 'Inter', sans-serif;\n      background-color: var(--bg-primary);\n      color: var(--text-primary);\n      min-height: 100vh;\n      overflow-x: hidden;\n      line-height: 1.6;\n    }\n\n    \/* Gradients and Glows *\/\n    .bg-grid {\n      position: fixed;\n      inset: 0;\n      background-image:\n        linear-gradient(rgba(255, 94, 0, 0.02) 1px, transparent 1px),\n        linear-gradient(90deg, rgba(255, 94, 0, 0.02) 1px, transparent 1px);\n      background-size: 50px 50px;\n      pointer-events: none;\n      z-index: 0;\n    }\n\n    .bg-glow {\n      position: fixed;\n      top: -20%;\n      right: -10%;\n      width: 60vw;\n      height: 60vw;\n      background: radial-gradient(circle, rgba(255, 94, 0, 0.06) 0%, transparent 60%);\n      border-radius: 50%;\n      pointer-events: none;\n      z-index: 0;\n    }\n\n    .bg-glow-2 {\n      position: fixed;\n      bottom: -20%;\n      left: -10%;\n      width: 50vw;\n      height: 50vw;\n      background: radial-gradient(circle, rgba(255, 140, 0, 0.04) 0%, transparent 60%);\n      border-radius: 50%;\n      pointer-events: none;\n      z-index: 0;\n    }\n\n    \/* Animation Section Styles *\/\n    .scroll-animation-page {\n      position: relative;\n      z-index: 2;\n      width: 100%;\n    }\n\n    .pinned-section {\n      width: 100%;\n      \/*min-height: 100vh;*\/\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      padding: 120px 24px;\n      position: relative;\n    }\n\n    .section-main-title {\n      font-family: 'Outfit', sans-serif;\n      font-size: clamp(2rem, 3.5vw, 3rem);\n      margin-bottom: 50px !important;\n      text-align: center;\n      width: 100%;\n      font-weight: 800;\n      letter-spacing: -0.02em;\n    }\n\n    .gradient-text {\n      background: var(--gradient-primary);\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n      background-clip: text;\n      color: transparent;\n      display: inline-block;\n    }\n\n    .pinned-container {\n      display: flex;\n      max-width: 1200px;\n      width: 100%;\n      margin: 0 auto;\n      gap: 60px;\n      align-items: center;\n      justify-content: space-between;\n    }\n\n    \/* Left Side: Texts (Highlight + Bullets) *\/\n    .left-column {\n      flex: 1.2;\n      display: flex;\n      flex-direction: column;\n      justify-content: center;\n      padding-right: 20px;\n    }\n\n    .highlight-text {\n      font-family: 'Outfit', sans-serif;\n      font-size: clamp(1.3rem, 2.4vw, 1.8rem);\n      font-weight: 600;\n      line-height: 1.45;\n      color: var(--text-primary);\n      margin-bottom: 40px;\n      position: relative;\n      padding-left: 20px;\n      border-left: 4px solid var(--text-accent);\n    }\n\n    .bullets-list {\n      list-style: none;\n      display: flex;\n      flex-direction: column;\n      gap: 24px;\n      position: relative;\n      width: 100%;\n    }\n\n    .bullet-item {\n      font-size: clamp(1rem, 1.6vw, 1.25rem);\n      font-weight: 500;\n      position: relative;\n      padding-left: 35px;\n      opacity: 1;\n      color: #f8fafc;\n    }\n\n    .bullet-item strong {\n      color: #ADE1EB;\n    }\n\n    \/* Tech-themed Bullet Point indicator *\/\n    .bullet-item::before {\n      content: '';\n      position: absolute;\n      left: 10px;\n      top: 0.6em;\n      \/* Align to the first line of text *\/\n      width: 8px;\n      height: 8px;\n      background: var(--text-accent);\n      border-radius: 50%;\n      box-shadow: 0 0 10px var(--text-accent);\n    }\n\n    \/* Right Side: Images Stack *\/\n    .right-column {\n      flex: 1;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      height: 100%;\n      min-height: 350px;\n    }\n\n    .images-wrapper {\n      position: relative;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 100%;\n      height: 100%;\n      max-height: 500px;\n    }\n\n    .slide-image {\n      position: relative;\n      max-width: 100%;\n      max-height: 100%;\n      object-fit: contain;\n      opacity: 1;\n    }\n\n    \/* Scroll indicator *\/\n    .scroll-indicator {\n      position: absolute;\n      bottom: 20px;\n      left: 50%;\n      transform: translateX(-50%);\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      gap: 8px;\n      font-size: 0.85rem;\n      color: var(--text-secondary);\n      z-index: 10;\n      opacity: 0.8;\n      animation: fadePulse 2s infinite ease-in-out;\n    }\n\n    .mouse-icon {\n      width: 20px;\n      height: 32px;\n      border: 2px solid var(--text-secondary);\n      border-radius: 12px;\n      position: relative;\n    }\n\n    .mouse-wheel {\n      width: 4px;\n      height: 8px;\n      background-color: var(--text-accent);\n      border-radius: 2px;\n      position: absolute;\n      top: 6px;\n      left: 50%;\n      transform: translateX(-50%);\n      animation: scrollWheel 1.5s infinite ease-in-out;\n    }\n\n    \/* Spacer for scrolling effect *\/\n    .post-scroll-spacer {\n      height: 100vh;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      background: var(--bg-secondary);\n      border-top: 1px solid rgba(255, 94, 0, 0.1);\n    }\n\n    .spacer-text {\n      color: var(--text-secondary);\n      font-size: 1.1rem;\n    }\n\n    \/* Keyframes *\/\n    @keyframes scrollWheel {\n      0% {\n        transform: translate(-50%, 0);\n        opacity: 1;\n      }\n\n      50% {\n        transform: translate(-50%, 6px);\n        opacity: 0;\n      }\n\n      100% {\n        transform: translate(-50%, 0);\n        opacity: 1;\n      }\n    }\n\n    @keyframes fadePulse {\n\n      0%,\n      100% {\n        opacity: 0.5;\n      }\n\n      50% {\n        opacity: 0.9;\n      }\n    }\n\n    .pinned-container.reverse-layout {\n      flex-direction: row-reverse;\n    }\n\n\n\n    \/* Responsive adjustments *\/\n    @media (max-width: 992px) {\n      .pinned-section {\n        padding-top: 60px !important;\n        padding-bottom: 60px !important;\n        min-height: auto !important;\n        height: auto !important;\n        display: flex !important;\n        flex-direction: column !important;\n        justify-content: center !important;\n      }\n\n      .section-main-title {\n      font-size: 1.6rem;\n      margin-bottom: 20px;\n      }\n\n      .pinned-container {\n        flex-direction: column-reverse !important;\n        height: auto !important;\n        width: 100% !important;\n        display: flex !important;\n        justify-content: center !important;\n        gap: 30px !important;\n        padding: 0 !important;\n        margin: 0 auto !important;\n      }\n\n      .right-column {\n        flex: none !important;\n        height: 30vh !important;\n        \/* Proportional 30% viewport height for animation *\/\n        width: 100% !important;\n        min-height: unset !important;\n        display: flex !important;\n        align-items: center !important;\n        justify-content: center !important;\n      }\n\n      .images-wrapper {\n        height: 100% !important;\n        width: 100% !important;\n        max-height: unset !important;\n        display: flex !important;\n        align-items: center !important;\n        justify-content: center !important;\n      }\n\n      .slide-image {\n        max-height: 100% !important;\n        max-width: 100% !important;\n        object-fit: contain !important;\n      }\n\n      .left-column {\n        flex: none !important;\n        height: auto !important;\n        \/* Fit text height naturally without empty space gaps *\/\n        width: 100% !important;\n        padding-right: 0 !important;\n        display: flex !important;\n        flex-direction: column !important;\n        justify-content: center !important;\n      }\n\n      .highlight-text {\n        font-size: 1.1rem !important;\n        \/* Scales proportionally with screen height *\/\n        line-height: 1.35 !important;\n        margin-bottom: 20px !important;\n        padding-left: 12px !important;\n      }\n\n      .bullets-list {\n        display: flex !important;\n        flex-direction: column !important;\n        gap: 16px !important;\n        position: relative !important;\n        width: 100% !important;\n        margin: 0 !important;\n        padding: 0 !important;\n      }\n\n      .bullet-item {\n        position: relative !important;\n        font-size: 0.88rem !important;\n        \/* Scales proportionally with screen height *\/\n        line-height: 1.35 !important;\n        padding-left: 22px !important;\n      }\n\n      .bullet-item::before {\n        width: 5px !important;\n        height: 5px !important;\n        left: 6px !important;\n        top: 0.55em !important;\n        \/* Align to the first line on mobile *\/\n        transform: none !important;\n        \/* Reset vertical centering transform *\/\n      }\n\n      .scroll-indicator {\n        display: none !important;\n        \/* Hide scroll indicator on mobile *\/\n      }\n    }\n\n\n.animation-wrapper {\n  width: 100%;\n  max-width: 600px;\n  margin: 0 auto;\n}\n\n.stage {\n  width: 100%;\n  aspect-ratio: 5 \/ 4;\n  position: relative;\n  overflow: hidden;\n  background: #0E1428;\n}\n\ncanvas {\n  width: 100%;\n  height: 100%;\n  display: block;\n}\n  <\/style>\n\n<main id=\"how\" class=\"scroll-animation-page\">\n\n    <!-- Scroll Pin Section -->\n    <section class=\"pinned-section\" id=\"selectivity-section\">\n<h2 class=\"section-main-title\">The Selectivity <span class=\"gradient-text\">Challenge<\/span><\/h2>\n      <div class=\"pinned-container reverse-layout\">\n\n        <!-- Left Side: Text building up -->\n        <div class=\"left-column\">\n          <p class=\"highlight-text\">\n            Many biologics struggle to distinguish diseased tissue from healthy tissue, limiting their safety and\n            efficacy potential.\n          <\/p>\n\n          <ul class=\"bullets-list\">\n            <li class=\"bullet-item text-0\">Disease targets can closely resemble healthy targets.<\/li>\n            <li class=\"bullet-item text-1\">Subtle structural features can control binding.<\/li>\n            <li class=\"bullet-item text-2\">Protein interactions are dynamic, not static.<\/li>\n            <li class=\"bullet-item text-3\">The design space is too large to test experimentally.<\/li>\n          <\/ul>\n        <\/div>\n\n        <!-- Right Side: Loop GIF animation statically -->\n        <div class=\"right-column\">\n          <div class=\"images-wrapper\">\n<div class=\"animation-wrapper\">\n<div class=\"stage\"><canvas id=\"animation\" width=\"600\" height=\"480\" aria-label=\"Antibodies emerge from one source, circulate through the body, and bind to different organs\"><\/canvas><\/div>\n<\/div>\n<script>\n(() => {\n  const canvas = document.getElementById('animation');\n  const ctx = canvas.getContext('2d', {alpha:true});\n  const W = canvas.width, H = canvas.height;\n  const sourcePoint = {x:458, y:150};\n  const bg = new Image();\n  const antibodySprite = new Image();\n  \nantibodySprite.src = '\/wp-content\/uploads\/2026\/07\/antibody-sprite-1-1.png';\nbg.src = '\/wp-content\/uploads\/2026\/07\/selectivity-bg-1-1.png';\n  const routes = [[[458, 150], [440, 150], [420, 158], [404, 170], [390, 150], [376, 128], [364, 112]], [[458, 150], [440, 150], [420, 158], [405, 172], [392, 190], [382, 206], [370, 216], [360, 224]], [[458, 150], [440, 150], [420, 158], [405, 172], [392, 190], [380, 218], [366, 246], [350, 276]], [[458, 150], [440, 150], [420, 158], [400, 170], [372, 178], [334, 186], [286, 196], [225, 210]], [[458, 150], [442, 152], [424, 166], [416, 186], [420, 206], [440, 226], [466, 240], [492, 246]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [380, 250], [346, 306], [302, 344]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [390, 220], [368, 270], [318, 330], [235, 366]], [[458, 150], [442, 152], [424, 166], [410, 184], [400, 210], [394, 240], [390, 290], [388, 334], [388, 372]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [390, 220], [380, 248], [360, 286], [330, 318]]];\n  const bindingSites = [{\"x\": 364, \"y\": 112, \"color\": \"170,205,255\", \"radius\": 12, \"angle\": -0.55, \"label\": \"upper GI\"}, {\"x\": 342, \"y\": 170, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": -0.9, \"label\": \"tumor upper-left\"}, {\"x\": 354, \"y\": 166, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": -0.3, \"label\": \"tumor upper\"}, {\"x\": 366, \"y\": 170, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": 0.4, \"label\": \"tumor upper-right\"}, {\"x\": 335, \"y\": 185, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": -1.5, \"label\": \"tumor left\"}, {\"x\": 373, \"y\": 185, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": 1.0, \"label\": \"tumor right\"}, {\"x\": 342, \"y\": 200, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": -2.35, \"label\": \"tumor lower-left\"}, {\"x\": 355, \"y\": 205, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": 3.05, \"label\": \"tumor lower\"}, {\"x\": 368, \"y\": 200, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": 2.15, \"label\": \"tumor lower-right\"}, {\"x\": 360, \"y\": 224, \"color\": \"170,205,255\", \"radius\": 13, \"angle\": -0.9, \"label\": \"stomach upper\"}, {\"x\": 350, \"y\": 276, \"color\": \"170,205,255\", \"radius\": 13, \"angle\": -1.25, \"label\": \"stomach lower\"}, {\"x\": 225, \"y\": 210, \"color\": \"170,205,255\", \"radius\": 14, \"angle\": -1.45, \"label\": \"liver\"}, {\"x\": 492, \"y\": 246, \"color\": \"170,205,255\", \"radius\": 14, \"angle\": 1.05, \"label\": \"spleen\"}, {\"x\": 302, \"y\": 344, \"color\": \"170,205,255\", \"radius\": 13, \"angle\": -2.2, \"label\": \"intestine upper\"}, {\"x\": 235, \"y\": 366, \"color\": \"170,205,255\", \"radius\": 13, \"angle\": -2.45, \"label\": \"intestine lower left\"}, {\"x\": 388, \"y\": 372, \"color\": \"170,205,255\", \"radius\": 13, \"angle\": 2.5, \"label\": \"intestine lower right\"}, {\"x\": 330, \"y\": 318, \"color\": \"170,205,255\", \"radius\": 13, \"angle\": -2.1, \"label\": \"mid abdomen\"}];\n  const agents = [{\"route\": 0, \"phase\": 0.0, \"speed\": 0.046, \"scale\": 0.42, \"alpha\": 0.62, \"bindSite\": 0}, {\"route\": 1, \"phase\": 0.03, \"speed\": 0.048, \"scale\": 0.46, \"alpha\": 0.7, \"bindSite\": 1}, {\"route\": 1, \"phase\": 0.06, \"speed\": 0.049, \"scale\": 0.44, \"alpha\": 0.68, \"bindSite\": 2}, {\"route\": 1, \"phase\": 0.09, \"speed\": 0.05, \"scale\": 0.46, \"alpha\": 0.7, \"bindSite\": 3}, {\"route\": 3, \"phase\": 0.12, \"speed\": 0.051, \"scale\": 0.5, \"alpha\": 0.76, \"bindSite\": 4}, {\"route\": 4, \"phase\": 0.15, \"speed\": 0.047, \"scale\": 0.48, \"alpha\": 0.74, \"bindSite\": 5}, {\"route\": 5, \"phase\": 0.18, \"speed\": 0.046, \"scale\": 0.48, \"alpha\": 0.72, \"bindSite\": 6}, {\"route\": 8, \"phase\": 0.21, \"speed\": 0.048, \"scale\": 0.46, \"alpha\": 0.7, \"bindSite\": 7}, {\"route\": 2, \"phase\": 0.24, \"speed\": 0.05, \"scale\": 0.48, \"alpha\": 0.74, \"bindSite\": 8}, {\"route\": 1, \"phase\": 0.27, \"speed\": 0.049, \"scale\": 0.48, \"alpha\": 0.72, \"bindSite\": 9}, {\"route\": 2, \"phase\": 0.3, \"speed\": 0.047, \"scale\": 0.52, \"alpha\": 0.78, \"bindSite\": 10}, {\"route\": 3, \"phase\": 0.33, \"speed\": 0.046, \"scale\": 0.54, \"alpha\": 0.82, \"bindSite\": 11}, {\"route\": 4, \"phase\": 0.36, \"speed\": 0.05, \"scale\": 0.5, \"alpha\": 0.76, \"bindSite\": 12}, {\"route\": 5, \"phase\": 0.39, \"speed\": 0.048, \"scale\": 0.48, \"alpha\": 0.7, \"bindSite\": 13}, {\"route\": 6, \"phase\": 0.42, \"speed\": 0.047, \"scale\": 0.46, \"alpha\": 0.66, \"bindSite\": 14}, {\"route\": 7, \"phase\": 0.45, \"speed\": 0.049, \"scale\": 0.46, \"alpha\": 0.66, \"bindSite\": 15}, {\"route\": 8, \"phase\": 0.48, \"speed\": 0.046, \"scale\": 0.44, \"alpha\": 0.64, \"bindSite\": 16}];\n  const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  const loopMs = reducedMotion ? 17000 : 12000;\n\n  const lerp = (a,b,t)=>a+(b-a)*t;\n  const easeInOutSine = t => -(Math.cos(Math.PI*t)-1)\/2;\n  function routePos(route, t) {\n    const pts = routes[route];\n    const count = pts.length;\n    const segT = ((t % 1) + 1) % 1 * (count - 1);\n    const i = Math.min(count - 2, Math.floor(segT));\n    const local = segT - i;\n    return [lerp(pts[i][0], pts[i+1][0], local), lerp(pts[i][1], pts[i+1][1], local)];\n  }\n  function routeAngle(route, t) {\n    const a = routePos(route, t), b = routePos(route, t + 0.003);\n    return Math.atan2(b[1]-a[1], b[0]-a[0]) + Math.PI\/2;\n  }\n  function drawYShape() {\n    ctx.beginPath();\n    ctx.moveTo(0,24); ctx.lineTo(0,-1);\n    ctx.moveTo(0,-1); ctx.lineTo(-18,-19);\n    ctx.moveTo(0,-1); ctx.lineTo(19,-19);\n    ctx.stroke();\n    ctx.beginPath();\n    ctx.moveTo(-14,-16); ctx.lineTo(-22,-23);\n    ctx.moveTo(15,-16); ctx.lineTo(24,-23);\n    ctx.stroke();\n  }\n  function drawAntibody(x,y,angle,scale,alpha,bound=false) {\n    const base = 40; \/\/ sprite draw size before scale\n    ctx.save();\n    ctx.translate(x,y); ctx.rotate(angle); ctx.scale(scale,scale); ctx.globalAlpha = alpha;\n    ctx.shadowColor = bound ? 'rgba(255,255,255,0.85)' : 'rgba(255,255,255,0.60)';\n    ctx.shadowBlur = bound ? 12 : 7;\n    ctx.drawImage(antibodySprite, -base\/2, -base\/2, base, base);\n    ctx.restore();\n  }\n  function drawGlow(x,y,color,radius,strength=1) {\n    const parts = color.split(',').map(v=>parseInt(v.trim(),10));\n    const g = ctx.createRadialGradient(x,y,2,x,y,radius);\n    g.addColorStop(0, `rgba(${parts[0]},${parts[1]},${parts[2]},${0.18*strength})`);\n    g.addColorStop(0.45, `rgba(${parts[0]},${parts[1]},${parts[2]},${0.10*strength})`);\n    g.addColorStop(1, `rgba(${parts[0]},${parts[1]},${parts[2]},0)`);\n    ctx.fillStyle = g; ctx.beginPath(); ctx.arc(x,y,radius,0,Math.PI*2); ctx.fill();\n  }\n  function drawFlowRoute(route, now) {\n    const pts = routes[route];\n    ctx.save(); ctx.lineCap='round'; ctx.lineJoin='round';\n    ctx.strokeStyle='rgba(155,190,255,0.08)'; ctx.lineWidth=5.0;\n    ctx.beginPath(); ctx.moveTo(pts[0][0],pts[0][1]);\n    for (let i=1;i<pts.length;i++) ctx.lineTo(pts[i][0],pts[i][1]);\n    ctx.stroke();\n    const phase=((now\/loopMs)*0.88 + route*0.09)%1;\n    const p1=routePos(route,phase), p2=routePos(route,(phase+0.30)%1);\n    drawGlow(p1[0],p1[1],'170,205,255',10,0.65);\n    drawGlow(p2[0],p2[1],'170,205,255',8,0.42);\n    ctx.restore();\n  }\n  function frame(now) {\n    ctx.clearRect(0,0,W,H); ctx.drawImage(bg,0,0,W,H);\n    \/\/ subtle source glow\n    drawGlow(sourcePoint.x, sourcePoint.y, '170,205,255', 22, 1.0);\n    drawGlow(355, 186, '255,80,90', 28, 0.55);\n    for (let r=0;r<routes.length;r++) drawFlowRoute(r, now);\n    bindingSites.forEach((site,idx)=>{\n      const tumorSite = site.color === '255,80,90';\n      const pulse = 0.55 + 0.45*Math.sin(now\/(tumorSite ? 360 : 430) + idx*0.6);\n      drawGlow(site.x, site.y, site.color, site.radius + pulse*(tumorSite ? 9 : 7), tumorSite ? 0.95 : 0.82);\n    });\n    agents.forEach((a, idx) => {\n      const cycle = ((now\/loopMs)*a.speed*18 + a.phase) % 1;\n      const launchEnd = 0.12;\n      const travelEnd = 0.78;\n      const bindEnd = 0.95;\n      const fadeEnd = 0.995;\n      const site = bindingSites[a.bindSite];\n      let x, y, angle, alpha = a.alpha, bound = false;\n\n      if (cycle < launchEnd) {\n        \/\/ All antibodies visibly emerge from the same source location.\n        const t = cycle \/ launchEnd;\n        x = sourcePoint.x + Math.sin(now\/220 + idx) * 2.0 * t;\n        y = sourcePoint.y + Math.cos(now\/260 + idx*0.7) * 2.0 * t;\n        angle = -0.9 + Math.sin(now\/600 + idx*0.2) * 0.08;\n        alpha *= 0.35 + 0.65 * t;\n      } else if (cycle < travelEnd) {\n        const moveT = (cycle - launchEnd) \/ (travelEnd - launchEnd);\n        const eased = easeInOutSine(Math.max(0, Math.min(1, moveT)));\n        [x,y] = routePos(a.route, eased);\n        angle = routeAngle(a.route, eased);\n      } else {\n        bound = true;\n        x = site.x + Math.sin(now\/320 + idx*1.1) * 0.9;\n        y = site.y + Math.cos(now\/370 + idx*0.9) * 0.9;\n        angle = site.angle + Math.sin(now\/720 + idx*0.2) * 0.06;\n        alpha *= 0.94 + 0.06*Math.sin(now\/260 + idx);\n        drawGlow(site.x, site.y, site.color, site.radius + 9, 0.95);\n        if (cycle >= bindEnd) {\n          alpha *= 1 - Math.min(1, (cycle-bindEnd)\/(fadeEnd-bindEnd));\n        }\n      }\n      drawAntibody(x,y,angle,a.scale,Math.max(0,alpha),bound);\n    });\n    requestAnimationFrame(frame);\n  }\n  Promise.all([bg.decode ? bg.decode().catch(()=>{}) : Promise.resolve(), antibodySprite.decode ? antibodySprite.decode().catch(()=>{}) : Promise.resolve()]).then(() => requestAnimationFrame(frame));\n})();\n<\/script>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/section>\n\n    <!-- Scroll Pin Section 2: Predictive Path -->\n    <section class=\"pinned-section\" id=\"predictive-path-section\">\n\n<h2 class=\"section-main-title\">9Bio&#8217;s <span class=\"gradient-text\">Approach<\/span><\/h2>\n      <div class=\"pinned-container reverse-layout\">\n\n        <!-- Left Side: Text building up -->\n        <div class=\"left-column\">\n          <p class=\"highlight-text\">\n            9Bio designs biologics to act more precisely where they are needed, aiming to improve both safety and\n            efficacy.\n          <\/p>\n\n          <ul class=\"bullets-list\">\n            <li class=\"bullet-item text-0\"><strong>Structure-guided design:<\/strong> We model protein structure to\n              understand how biologics bind and how that binding can be engineered.<\/li>\n            <li class=\"bullet-item text-1\"><strong>Dynamic interaction modeling:<\/strong> We study how proteins behave\n              across changing biological conditions, not just in a single static state.<\/li>\n            <li class=\"bullet-item text-2\"><strong>Large-scale design exploration:<\/strong> We screen vast numbers of\n              protein variants digitally to find rare candidates with the right performance profile.<\/li>\n            <li class=\"bullet-item s-text-3\"><strong style=\"color:#FF5E00\">The result:<\/strong> A more predictive path to disease-selective biologics, with\n              large-scale digital exploration used to identify the best candidates before lab testing.<\/li>\n          <\/ul>\n        <\/div>\n\n        <!-- Right Side: Loop GIF animation statically -->\n        <div class=\"right-column\">\n          <div class=\"images-wrapper\">\n<div class=\"animation-wrapper\">\n<div class=\"stage\">\n  <canvas id=\"animation2\" width=\"600\" height=\"480\" aria-label=\"White antibodies emerge only from one bloodstream source, circulate briefly, and bind around the perimeter of the tumor\"><\/canvas>\n<\/div><\/div>\n<script>\n(() => {\n  const canvas2 = document.getElementById('animation2');\n  const ctx = canvas2.getContext('2d', {alpha:true});\n  const W = canvas2.width, H = canvas2.height;\n  const tumorCenter = {x:354, y:187};\n  const sourcePoint = {x:458, y:150};\n  const bg = new Image();\n  const antibodySprite = new Image();\n\nbg.src = '\/wp-content\/uploads\/2026\/07\/selectivity-bg-1-1.png';\nantibodySprite.src = '\/wp-content\/uploads\/2026\/07\/antibody-sprite-1-1.png';\n  const routes = [[[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [390, 212], [376, 196], [365, 182], [354, 187]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [390, 212], [382, 202], [372, 192], [347, 167]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [394, 214], [386, 200], [378, 188], [359, 171]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [392, 220], [382, 210], [370, 198], [366, 186]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [390, 224], [378, 220], [366, 214], [361, 202]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [388, 222], [374, 214], [360, 208], [348, 207]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [384, 224], [370, 216], [352, 210], [335, 202]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [382, 216], [360, 202], [340, 192], [328, 186]], [[458, 150], [440, 150], [420, 158], [405, 172], [396, 190], [392, 210], [398, 226], [388, 214], [372, 200], [350, 184], [335, 171]]];\n  const bindingSites = [{\"x\": 335, \"y\": 171, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": -0.9}, {\"x\": 347, \"y\": 167, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": -0.3}, {\"x\": 359, \"y\": 171, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": 0.4}, {\"x\": 328, \"y\": 186, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": -1.5}, {\"x\": 366, \"y\": 186, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": 1.0}, {\"x\": 335, \"y\": 202, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": -2.35}, {\"x\": 348, \"y\": 207, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": 3.05}, {\"x\": 361, \"y\": 202, \"color\": \"255,80,90\", \"radius\": 13, \"angle\": 2.15}];\n  const agents = [{\"route\": 0, \"release\": 0.0, \"speed\": 1.0, \"scale\": 0.11, \"alpha\": 0.95, \"bindSite\": 0}, {\"route\": 1, \"release\": 0.06, \"speed\": 1.0, \"scale\": 0.105, \"alpha\": 0.92, \"bindSite\": 1}, {\"route\": 2, \"release\": 0.12, \"speed\": 1.0, \"scale\": 0.11, \"alpha\": 0.95, \"bindSite\": 2}, {\"route\": 3, \"release\": 0.18, \"speed\": 1.0, \"scale\": 0.115, \"alpha\": 0.98, \"bindSite\": 3}, {\"route\": 4, \"release\": 0.24, \"speed\": 1.0, \"scale\": 0.115, \"alpha\": 0.98, \"bindSite\": 4}, {\"route\": 5, \"release\": 0.3, \"speed\": 1.0, \"scale\": 0.11, \"alpha\": 0.95, \"bindSite\": 5}, {\"route\": 6, \"release\": 0.36, \"speed\": 1.0, \"scale\": 0.105, \"alpha\": 0.92, \"bindSite\": 6}, {\"route\": 7, \"release\": 0.42, \"speed\": 1.0, \"scale\": 0.11, \"alpha\": 0.95, \"bindSite\": 7}, {\"route\": 8, \"release\": 0.5, \"speed\": 1.0, \"scale\": 0.1, \"alpha\": 0.88, \"bindSite\": 2}, {\"route\": 0, \"release\": 0.58, \"speed\": 1.0, \"scale\": 0.1, \"alpha\": 0.88, \"bindSite\": 5}];\n  const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  const loopMs = reducedMotion ? 17000 : 11500;\n\n  const lerp = (a,b,t)=>a+(b-a)*t;\n  const easeInOutSine = t => -(Math.cos(Math.PI*t)-1)\/2;\n\n  function routePos(route, t) {\n    const pts = routes[route];\n    const count = pts.length;\n    const segT = ((t % 1) + 1) % 1 * (count - 1);\n    const i = Math.min(count - 2, Math.floor(segT));\n    const local = segT - i;\n    return [lerp(pts[i][0], pts[i+1][0], local), lerp(pts[i][1], pts[i+1][1], local)];\n  }\n  function routeAngle(route, t) {\n    const a = routePos(route, t), b = routePos(route, t + 0.003);\n    return Math.atan2(b[1]-a[1], b[0]-a[0]) + Math.PI\/2;\n  }\n\n  function drawAntibody(x,y,angle,scale,alpha,bound=false) {\n    if (!antibodySprite.complete) return;\n    ctx.save();\n    ctx.translate(x,y); ctx.rotate(angle); ctx.scale(scale,scale); ctx.globalAlpha = alpha;\n    const baseW = 170;  \/\/ reduced to match the smaller antibody size in the attached HTML\n    const aspect = antibodySprite.height \/ antibodySprite.width;\n    const w = baseW, h = baseW * aspect;\n    ctx.shadowColor = bound ? 'rgba(255,255,255,0.88)' : 'rgba(255,255,255,0.58)';\n    ctx.shadowBlur = bound ? 11 : 7;\n    ctx.drawImage(antibodySprite, -w\/2, -h\/2, w, h);\n    ctx.globalAlpha = alpha * (bound ? 0.18 : 0.10);\n    ctx.filter = 'blur(2px)';\n    ctx.drawImage(antibodySprite, -w\/2, -h\/2, w, h);\n    ctx.filter = 'none';\n    ctx.restore();\n  }\n\n  function drawGlow(x,y,color,radius,strength=1) {\n    const parts = color.split(',').map(v=>parseInt(v.trim(),10));\n    const g = ctx.createRadialGradient(x,y,2,x,y,radius);\n    g.addColorStop(0, `rgba(${parts[0]},${parts[1]},${parts[2]},${0.19*strength})`);\n    g.addColorStop(0.45, `rgba(${parts[0]},${parts[1]},${parts[2]},${0.10*strength})`);\n    g.addColorStop(1, `rgba(${parts[0]},${parts[1]},${parts[2]},0)`);\n    ctx.fillStyle = g; ctx.beginPath(); ctx.arc(x,y,radius,0,Math.PI*2); ctx.fill();\n  }\n\n  function drawFlowRoute(route, now) {\n    const pts = routes[route];\n    ctx.save(); ctx.lineCap='round'; ctx.lineJoin='round';\n    ctx.strokeStyle='rgba(155,190,255,0.06)'; ctx.lineWidth=4.8;\n    ctx.beginPath(); ctx.moveTo(pts[0][0],pts[0][1]);\n    for (let i=1;i<pts.length;i++) ctx.lineTo(pts[i][0],pts[i][1]);\n    ctx.stroke();\n    const phase=((now\/loopMs)*0.9 + route*0.09)%1;\n    const p1=routePos(route,phase), p2=routePos(route,(phase+0.26)%1);\n    drawGlow(p1[0],p1[1],'170,205,255',10,0.55);\n    drawGlow(p2[0],p2[1],'170,205,255',8,0.35);\n    ctx.restore();\n  }\n\n  function frame(now) {\n    ctx.clearRect(0,0,W,H); \n    if (bg.complete) ctx.drawImage(bg,0,0,W,H);\n    for (let r=0;r<routes.length;r++) drawFlowRoute(r, now);\n\n    const corePulse = 0.5 + 0.5*Math.sin(now\/360);\n    drawGlow(tumorCenter.x,tumorCenter.y,'255,80,90',32+corePulse*10,1.08);\n    drawGlow(tumorCenter.x,tumorCenter.y,'255,80,90',20+corePulse*7,0.92);\n    bindingSites.forEach((site,idx)=>{\n      const pulse = 0.55 + 0.45*Math.sin(now\/390 + idx*0.7);\n      drawGlow(site.x, site.y, site.color, site.radius + pulse*8, 0.88);\n    });\n\n    agents.forEach((a, idx) => {\n      const globalCycle = ((now\/loopMs) + a.release) % 1;\n      const appearStart = 0.00;\n      const sourceHoldEnd = 0.10;\n      const travelEnd = 0.74;\n      const bindEnd = 0.95;\n      const fadeEnd = 1.00;\n      const site = bindingSites[a.bindSite];\n      let x = sourcePoint.x, y = sourcePoint.y, angle = routeAngle(a.route, 0.01), alpha = 0, bound = false;\n\n      if (globalCycle >= appearStart && globalCycle < sourceHoldEnd) {\n        const t = (globalCycle - appearStart) \/ (sourceHoldEnd - appearStart);\n        x = sourcePoint.x + Math.sin(now\/450 + idx) * 0.8;\n        y = sourcePoint.y + Math.cos(now\/500 + idx) * 0.8;\n        angle = routeAngle(a.route, 0.01);\n        alpha = a.alpha * Math.min(1, t \/ 0.35);\n      } else if (globalCycle >= sourceHoldEnd && globalCycle < travelEnd) {\n        const movingT = (globalCycle - sourceHoldEnd) \/ (travelEnd - sourceHoldEnd);\n        const eased = easeInOutSine(Math.max(0, Math.min(1, movingT)));\n        [x,y] = routePos(a.route, eased);\n        angle = routeAngle(a.route, eased);\n        alpha = a.alpha;\n      } else if (globalCycle >= travelEnd && globalCycle < bindEnd) {\n        bound = true;\n        x = site.x + Math.sin(now\/320 + idx*1.4)*0.9;\n        y = site.y + Math.cos(now\/370 + idx*1.1)*0.9;\n        angle = site.angle + Math.sin(now\/700 + idx*0.3)*0.05;\n        alpha = a.alpha * (0.95 + 0.05*Math.sin(now\/260 + idx));\n        drawGlow(site.x, site.y, site.color, site.radius + 10, 0.98);\n      } else if (globalCycle >= bindEnd && globalCycle < fadeEnd) {\n        bound = true;\n        x = site.x + Math.sin(now\/320 + idx*1.4)*0.9;\n        y = site.y + Math.cos(now\/370 + idx*1.1)*0.9;\n        angle = site.angle;\n        alpha = a.alpha * (1 - (globalCycle - bindEnd)\/(fadeEnd - bindEnd));\n      }\n\n      if (alpha > 0.001) {\n        drawAntibody(x,y,angle,a.scale,Math.max(0,alpha),bound);\n      }\n    });\n    requestAnimationFrame(frame);\n  }\n\n  Promise.all([\n    new Promise(res => bg.onload = res),\n    new Promise(res => antibodySprite.onload = res)\n  ]).then(() => requestAnimationFrame(frame));\n})();\n<\/script>\n\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/section>\n\n  <\/main>\n<\/div><\/div>\n<\/div><\/div>\n\n<\/div><\/div>\n\n<style>.kb-row-layout-wrap.wp-block-kadence-rowlayout.kb-row-layout-id952_2f0270-b9{margin-top:0px;margin-bottom:0px;}.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap{align-content:center;}:where(.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:center;}.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap{column-gap:var(--global-kb-gap-none, 0rem );row-gap:var(--global-kb-gap-md, 2rem);max-width:var( --global-content-width, 1200px );padding-left:var(--global-content-edge-padding);padding-right:var(--global-content-edge-padding);padding-top:var(--global-kb-spacing-lg, 3rem);padding-bottom:90px;grid-template-columns:minmax(0, 1fr);}.kb-row-layout-id952_2f0270-b9 > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap{column-gap:var(--global-kb-gap-none, 0rem );row-gap:var(--global-kb-gap-none, 0rem );padding-top:var(--global-kb-spacing-xl, 4rem);grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap{row-gap:var(--global-kb-gap-md, 2rem);padding-top:var(--global-kb-spacing-xl, 4rem);padding-right:0px;padding-left:0px;grid-template-columns:minmax(0, 1fr);}.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap > .wp-block-kadence-column:nth-child(1 of *:not(style)){order:1;}.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap > .wp-block-kadence-column:nth-child(2 of *:not(style)){order:11;}.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap > .wp-block-kadence-column:nth-child(3 of *:not(style)){order:21;}.kb-row-layout-id952_2f0270-b9 > .kt-row-column-wrap > .wp-block-kadence-column:nth-child(4 of *:not(style)){order:31;}}<\/style><div class=\"kb-row-layout-wrap kb-row-layout-id952_2f0270-b9 alignfull has-theme-palette6-background-color kt-row-has-bg wp-block-kadence-rowlayout\" id=\"pipeline\"><div class=\"kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-middle kt-inner-column-height-full kb-theme-content-width\">\n<style>.kadence-column952_0ef81e-03 > .kt-inside-inner-col,.kadence-column952_0ef81e-03 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column952_0ef81e-03 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column952_0ef81e-03 > .kt-inside-inner-col{flex-direction:column;}.kadence-column952_0ef81e-03 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column952_0ef81e-03 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column952_0ef81e-03{position:relative;}@media all and (max-width: 1024px){.kadence-column952_0ef81e-03 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column952_0ef81e-03 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column952_0ef81e-03\"><div class=\"kt-inside-inner-col\">\n<style>\n    \/* ==========================================================================\n       1. GLOBAL STYLES & VARIABLES (Required for preview \/ can be merged with your site's styles)\n       ========================================================================== *\/\n :root {\n      --bg-primary: #02060d;\n      --bg-secondary: #05101a;\n      \n      --card-bg: rgba(10, 25, 47, 0.4);\n      --card-border: rgba(255, 94, 0, 0.2);\n      --card-hover-border: rgba(255, 94, 0, 0.8);\n      --card-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.5);\n      \n      --text-primary: #f8fafc;\n      --text-secondary: #cbd5e1;\n      --text-accent: #FF5E00; \/* Bright Orange *\/\n      --text-accent-alt: #FF8C00; \/* Lighter Orange *\/\n      \n      --gradient-primary: linear-gradient(135deg, #FF5E00 0%, #FF8C00 100%);\n    }\n\n    \/* Background decorative grids & glows *\/\n    .bg-grid {\n      position: fixed;\n      inset: 0;\n      background-image: \n        linear-gradient(rgba(255, 94, 0, 0.02) 1px, transparent 1px),\n        linear-gradient(90deg, rgba(255, 94, 0, 0.02) 1px, transparent 1px);\n      background-size: 50px 50px;\n      pointer-events: none;\n      z-index: 0;\n    }\n\n    .bg-glow {\n      position: fixed;\n      top: -20%;\n      left: -10%;\n      width: 60vw;\n      height: 60vw;\n      background: radial-gradient(circle, rgba(255, 94, 0, 0.06) 0%, transparent 60%);\n      border-radius: 50%;\n      pointer-events: none;\n      z-index: 0;\n    }\n\n    .container-chal {\n      width: 100%;\n      max-width: 1200px;\n      z-index: 1;\n    }\n\n    \/* Info bar at the top (can be deleted) *\/\n    .info-header {\n      background: rgba(10, 25, 47, 0.6);\n      border: 1px solid rgba(255, 255, 255, 0.1);\n      border-radius: 12px;\n      padding: 15px 20px;\n      margin-bottom: 40px;\n      text-align: center;\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n    }\n    .info-header code {\n      background: rgba(255, 94, 0, 0.15);\n      color: #FF8C00;\n      padding: 2px 6px;\n      border-radius: 4px;\n      font-family: monospace;\n    }\n\n    \/* ==========================================================================\n       2. CHALLENGE COMPONENT STYLES (Copy this section to your main stylesheet)\n       ========================================================================== *\/\n    \n    .challenge-section {\n      position: relative;\n      z-index: 2;\n      padding: 80px 24px;\n      max-width: 1200px;\n      margin: 0 auto;\n    }\n\n    .section-header-center {\n      text-align: center;\n      margin-bottom: 60px;\n      max-width: 800px;\n      margin-left: auto;\n      margin-right: auto;\n    }\n\n    .section-title {\n      font-family: 'Outfit', sans-serif;\n      font-size: clamp(2.2rem, 4vw, 3.2rem);\n      margin-bottom: 24px;\n      line-height: 1.2;\n      font-weight: 700;\n      letter-spacing: -0.02em;\n    }\n\n    .gradient-text {\n      background: var(--gradient-primary);\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n      background-clip: text;\n      color: transparent;\n      display: inline-block;\n    }\n\n    .section-subtitle {\n      font-size: 1.15rem;\n      color: var(--text-secondary);\n    }\n\n    .challenge-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n      gap: 30px;\n      max-width: 1100px;\n      margin: 0 auto;\n    }\n\n    \/* Glassmorphism card *\/\n    .challenge-card {\n      position: relative;\n      background: var(--card-bg);\n      backdrop-filter: blur(16px);\n      -webkit-backdrop-filter: blur(16px);\n      border: 1px solid var(--card-border);\n      border-radius: 16px;\n      padding: 50px 30px;\n      text-align: center;\n      overflow: hidden;\n      transition: transform 0.4s cubic-bezier(0.165, 0.84, 0.44, 1), \n                  border-color 0.4s ease, \n                  box-shadow 0.4s ease;\n      min-height: 260px;\n      display: flex;\n      flex-direction: column;\n      justify-content: center;\n      align-items: center;\n      box-shadow: var(--card-shadow);\n      text-decoration: none;\n      color: inherit;\n    }\n\n    .challenge-card:hover {\n      transform: translateY(-10px);\n      border-color: var(--card-hover-border);\n      box-shadow: 0 12px 40px 0 rgba(255, 94, 0, 0.15);\n    }\n\n    .challenge-icon {\n      font-size: 3.5rem;\n      margin-bottom: 20px;\n      transition: opacity 0.3s ease, transform 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .challenge-icon img {\n      width: 1em;\n      height: 1em;\n      fill: none;\n      stroke: var(--text-accent);\n      stroke-width: 1.5;\n      stroke-linecap: round;\n      stroke-linejoin: round;\n      display: block;\n    }\n\n    .challenge-title {\n      font-family: 'Outfit', sans-serif;\n      font-size: 1.4rem;\n      font-weight: 700;\n      color: var(--text-primary);\n      transition: opacity 0.3s ease, transform 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);\n    }\n\n    \/* Hover overlay *\/\n    .challenge-overlay {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background: rgba(255, 94, 0, 0.95);\n      background: linear-gradient(135deg, rgba(255, 94, 0, 0.98) 0%, rgba(255, 140, 0, 0.98) 100%);\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      padding: 30px;\n      opacity: 0;\n      transform: translateY(100%);\n      transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n    }\n\n    .challenge-overlay p {\n      color: #ffffff;\n      font-weight: 500;\n      font-size: 1.05rem;\n      line-height: 1.6;\n      margin: 0;\n    }\n\n    \/* Hover States triggering CSS animations *\/\n    .challenge-card:hover .challenge-overlay {\n      opacity: 1;\n      transform: translateY(0);\n    }\n\n    .challenge-card:hover .challenge-icon,\n    .challenge-card:hover .challenge-title {\n      opacity: 0;\n      transform: translateY(-20px);\n    }\n\n    \/* Responsive adjustments for mobile and tablets *\/\n    @media (max-width: 768px) {\n      body {\n        justify-content: flex-start;\n      }\n\n      .info-header {\n        margin-bottom: 25px;\n        font-size: 0.85rem;\n        padding: 12px 16px;\n      }\n\n      .challenge-section {\n        padding: 30px 12px;\n      }\n\n      .section-header-center {\n        margin-bottom: 30px;\n        padding: 0 10px;\n      }\n\n      .section-title {\n        font-size: clamp(1.6rem, 5vw, 2.2rem) !important;\n        margin-bottom: 12px;\n      }\n\n      .section-subtitle {\n        font-size: 0.95rem;\n      }\n\n      .challenge-grid {\n        grid-template-columns: 1fr;\n        gap: 20px;\n      }\n\n      .challenge-card {\n        padding: 30px 20px;\n        min-height: auto;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n      }\n\n      .challenge-card:hover {\n        transform: translateY(-5px);\n      }\n\n      .challenge-icon {\n        font-size: 2.8rem;\n        margin-bottom: 10px;\n        opacity: 1 !important;\n        transform: none !important;\n      }\n\n      .challenge-title {\n        font-size: 1.25rem;\n        margin-bottom: 10px;\n        opacity: 1 !important;\n        transform: none !important;\n      }\n\n      .challenge-overlay {\n        position: static !important;\n        width: 100% !important;\n        height: auto !important;\n        background: none !important;\n        backdrop-filter: none !important;\n        -webkit-backdrop-filter: none !important;\n        padding: 0 !important;\n        opacity: 1 !important;\n        transform: none !important;\n        transition: none !important;\n        margin-top: 10px;\n      }\n\n      .challenge-overlay p {\n        color: var(--text-secondary) !important;\n        font-size: 0.9rem !important;\n        font-weight: 400;\n        line-height: 1.5;\n        text-align: center;\n      }\n    }\n  <\/style>\n\n  <div class=\"container-chal\">\n<section id=\"challenge\" class=\"challenge-section\">\n      <div class=\"challenge-grid\">\n        <!-- Item 1: Our platform -->\n        <a href=\"\/platform\" class=\"challenge-card\">\n          <div class=\"challenge-icon\">\n            <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/05\/Icon-Platform1.png\">\n          <\/div>\n          <h3 class=\"challenge-title\">Our platform<\/h3>\n          <div class=\"challenge-overlay\">\n            <p>Explore how our structure-guided and computational design platform helps create more selective, disease-focused biologics.<\/p>\n          <\/div>\n        <\/a>\n\n        <!-- Item 2: Pipeline -->\n        <a href=\"\/pipeline\" class=\"challenge-card\">\n          <div class=\"challenge-icon\">\n            <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/05\/Icon-Pipeline1.png\">\n          <\/div>\n          <h3 class=\"challenge-title\">Pipeline<\/h3>\n          <div class=\"challenge-overlay\">\n            <p>View our tech-enabled pipeline of next-generation biologics designed to address challenging targets and advanced cancers.<\/p>\n          <\/div>\n        <\/a>\n\n        <!-- Item 3: Collaborations -->\n        <a href=\"\/collaborations\" class=\"challenge-card\">\n          <div class=\"challenge-icon\">\n            <img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/05\/Icon-Collaborations1.png\">\n          <\/div>\n          <h3 class=\"challenge-title\">Collaborations<\/h3>\n          <div class=\"challenge-overlay\">\n            <p>Explore our success stories and how we partner to apply our technology across innovative protein-based therapeutics, including antibodies, engineered cytokines, CAR T cells, and ligand\/receptor mimetics.<\/p>\n          <\/div>\n        <\/a>\n      <\/div>\n    <\/section>\n    \n  <\/div>\n<\/div><\/div>\n\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>The Selectivity Challenge Many biologics struggle to distinguish diseased tissue from healthy tissue, limiting their safety and efficacy potential. Disease targets can closely resemble healthy targets. Subtle structural features can&#8230;<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_blocks_custom_css":"body { background-color:#0E1428; }","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_EventAllDay":false,"_EventTimezone":"","_EventStartDate":"","_EventEndDate":"","_EventStartDateUTC":"","_EventEndDateUTC":"","_EventShowMap":false,"_EventShowMapLink":false,"_EventURL":"","_EventCost":"","_EventCostDescription":"","_EventCurrencySymbol":"","_EventCurrencyCode":"","_EventCurrencyPosition":"","_EventDateTimeSeparator":"","_EventTimeRangeSeparator":"","_EventOrganizerID":[],"_EventVenueID":[],"_OrganizerEmail":"","_OrganizerPhone":"","_OrganizerWebsite":"","_VenueAddress":"","_VenueCity":"","_VenueCountry":"","_VenueProvince":"","_VenueState":"","_VenueZip":"","_VenuePhone":"","_VenueURL":"","_VenueStateProvince":"","_VenueLat":"","_VenueLng":"","_VenueShowMap":false,"_VenueShowMapLink":false,"_kadence_starter_templates_imported_post":true,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-952","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Home - 9Bio Therapeutics<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/9biotx.com\/fr\/\" \/>\n<meta property=\"og:locale\" content=\"fr_CA\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Home - 9Bio Therapeutics\" \/>\n<meta property=\"og:description\" content=\"The Selectivity Challenge Many biologics struggle to distinguish diseased tissue from healthy tissue, limiting their safety and efficacy potential. Disease targets can closely resemble healthy targets. Subtle structural features can...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/9biotx.com\/fr\/\" \/>\n<meta property=\"og:site_name\" content=\"9Bio Therapeutics\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-17T03:13:09+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimation du temps de lecture\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/9biotx.com\\\/\",\"url\":\"https:\\\/\\\/9biotx.com\\\/\",\"name\":\"Home - 9Bio Therapeutics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/9biotx.com\\\/#website\"},\"datePublished\":\"2023-02-17T15:51:42+00:00\",\"dateModified\":\"2026-07-17T03:13:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/9biotx.com\\\/#breadcrumb\"},\"inLanguage\":\"fr-CA\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/9biotx.com\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/9biotx.com\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/9biotx.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Home\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/9biotx.com\\\/#website\",\"url\":\"https:\\\/\\\/9biotx.com\\\/\",\"name\":\"9Bio Therapeutics\",\"description\":\"Engineering Biological Possibilities\",\"publisher\":{\"@id\":\"https:\\\/\\\/9biotx.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/9biotx.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-CA\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/9biotx.com\\\/#organization\",\"name\":\"9Bio Therapeutics\",\"url\":\"https:\\\/\\\/9biotx.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-CA\",\"@id\":\"https:\\\/\\\/9biotx.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/9biotx.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/9Bio-therapeutics-transparent-background-tangerine-small.png\",\"contentUrl\":\"https:\\\/\\\/9biotx.com\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/9Bio-therapeutics-transparent-background-tangerine-small.png\",\"width\":200,\"height\":80,\"caption\":\"9Bio Therapeutics\"},\"image\":{\"@id\":\"https:\\\/\\\/9biotx.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/9bio\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Home - 9Bio Therapeutics","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/9biotx.com\/fr\/","og_locale":"fr_CA","og_type":"article","og_title":"Home - 9Bio Therapeutics","og_description":"The Selectivity Challenge Many biologics struggle to distinguish diseased tissue from healthy tissue, limiting their safety and efficacy potential. Disease targets can closely resemble healthy targets. Subtle structural features can...","og_url":"https:\/\/9biotx.com\/fr\/","og_site_name":"9Bio Therapeutics","article_modified_time":"2026-07-17T03:13:09+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimation du temps de lecture":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/9biotx.com\/","url":"https:\/\/9biotx.com\/","name":"Home - 9Bio Therapeutics","isPartOf":{"@id":"https:\/\/9biotx.com\/#website"},"datePublished":"2023-02-17T15:51:42+00:00","dateModified":"2026-07-17T03:13:09+00:00","breadcrumb":{"@id":"https:\/\/9biotx.com\/#breadcrumb"},"inLanguage":"fr-CA","potentialAction":[{"@type":"ReadAction","target":["https:\/\/9biotx.com\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/9biotx.com\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/9biotx.com\/"},{"@type":"ListItem","position":2,"name":"Home"}]},{"@type":"WebSite","@id":"https:\/\/9biotx.com\/#website","url":"https:\/\/9biotx.com\/","name":"9Bio Th\u00e9rapeutiques","description":"Engineering Biological Possibilities","publisher":{"@id":"https:\/\/9biotx.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/9biotx.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-CA"},{"@type":"Organization","@id":"https:\/\/9biotx.com\/#organization","name":"9Bio Th\u00e9rapeutiques","url":"https:\/\/9biotx.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-CA","@id":"https:\/\/9biotx.com\/#\/schema\/logo\/image\/","url":"https:\/\/9biotx.com\/wp-content\/uploads\/2024\/10\/9Bio-therapeutics-transparent-background-tangerine-small.png","contentUrl":"https:\/\/9biotx.com\/wp-content\/uploads\/2024\/10\/9Bio-therapeutics-transparent-background-tangerine-small.png","width":200,"height":80,"caption":"9Bio Therapeutics"},"image":{"@id":"https:\/\/9biotx.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/9bio\/"]}]}},"taxonomy_info":[],"featured_image_src_large":false,"author_info":{"display_name":"Henrique de Carvalho","author_link":"https:\/\/9biotx.com\/fr\/news\/author\/decarvalho\/"},"comment_info":0,"_links":{"self":[{"href":"https:\/\/9biotx.com\/fr\/wp-json\/wp\/v2\/pages\/952","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/9biotx.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/9biotx.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/9biotx.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/9biotx.com\/fr\/wp-json\/wp\/v2\/comments?post=952"}],"version-history":[{"count":220,"href":"https:\/\/9biotx.com\/fr\/wp-json\/wp\/v2\/pages\/952\/revisions"}],"predecessor-version":[{"id":2521,"href":"https:\/\/9biotx.com\/fr\/wp-json\/wp\/v2\/pages\/952\/revisions\/2521"}],"wp:attachment":[{"href":"https:\/\/9biotx.com\/fr\/wp-json\/wp\/v2\/media?parent=952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}