// Client-facing narrative under sell-side M&A on the Services page. // Tells the seller why a competitive tender is the single biggest lever on price, // with a SVG chart drawn from doubleYou's last three contested processes. const DyTenderStory = ({ lang, tt, pk }) => { const T = window.dyContent.tenderStory; const ax = T.chartAxis; // Chart geometry — plot area inside the 880×460 viewBox. // mapY(v) for v in [60..140] → y in [370..50] const mapY = (v) => 370 - (v - 60) * 4; const X = { nbo: 130, loi: 470, bid: 800 }; const Yp = { nbo: mapY(100), loi: mapY(121), bid: mapY(130) }; const Yr = { nbo: mapY(100), loi: mapY(85), bid: mapY(85) }; // Picks a localized value from a string-or-{en,sk} field const pickGateValue = (g) => (lang === "sk" && g.vSk ? g.vSk : g.v); return (
{pk(T.eyebrow)}

{T.h[lang].map((chunk, i) => typeof chunk === "string" ? {chunk} : {chunk.em} )}

{pk(T.lead)}

{/* LEFT: chart column */}
{pk(T.chartCaption)}
{/* Plot frame: bottom + left axis (hairlines) */} {/* Y gridlines */} {[60, 80, 100, 120, 140].map((v) => ( {v} ))} {pk(ax.yLabel)} {/* Baseline 100 stronger */} {/* GREEN area under tender path */} {/* GREEN tender path */} {/* RED exclusivity path (dashed) */} {/* Endpoint dots — GREEN */} {/* Endpoint dots — RED */} {/* Path labels — tender label sits near LOI above the path; exclusivity label sits below the NBO point above the −10/−15 chip */} {pk(ax.tender)} {pk(ax.exclusive)} {/* +21% chip */} +21% {/* +5 to 10% chip */} {lang === "sk" ? "+5 až 10 %" : "+5 to 10 %"} {/* -10 to 15% chip */} {lang === "sk" ? "−10 až 15 %" : "−10 to 15 %"} {/* Endpoint value labels */} 100 121 127 – 133 85 {pk(ax.afterDD)} 85 {pk(ax.noFurther)} {/* X-axis tick labels */} {pk(ax.x1Top)} {pk(ax.x1Sub)} {pk(ax.x2Top)} {pk(ax.x2Sub)} {pk(ax.x3Top)} {pk(ax.x3Sub)}

{pk(T.source)}

{/* RIGHT: callout + gates */}
{pk(T.callout.eyebrow)}

{pk(T.callout.body)}

{pk(T.twoGatesHeading)}
    {T.gates.map((g, i) => (
  • {pickGateValue(g)}

    {pk(g.t)}

    {pk(g.d)}

  • ))}
); }; window.DyTenderStory = DyTenderStory;