ISSB (IFRS S1 & S2) Reporting Platform
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@300;400;500;600&display=swap'); /* hide Dawn theme native purchase UI */ .product-form, .product__quantity, .price__container, .price, .product__tax, .product-form__buttons, .shopify-payment-button, .payment-button, [data-productid] form, .product__info-container .price, .product__info-container .product-form { display: none !important; } .elx *, .elx *::before, .elx *::after { margin:0; padding:0; box-sizing:border-box; } .elx img { display:block; max-width:100%; height:auto; } .elx{ --navy:#0A1628; --navy-h:#16233B; --ink:#0E1116; --teal:#4E9D8F; --teal-x:#7FBCAB; --mut:#5B6470; --mut-l:#8A929B; --faint:#98A0A8; --paper:#FBFBFA; --sage:#F4F8F6; --rule:#E7E9EC; --rule-l:#EFF1F3; --h1-max:54px; --impact-max:44px; font-family:'IBM Plex Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif; color:var(--ink); line-height:1.6; background:#fff; -webkit-font-smoothing:antialiased; width:100%; overflow-x:hidden; } .elx a{ text-decoration:none; } /* ── rhythm ─────────────────────────────────────────────────────────── */ .elx .sec{ padding:clamp(60px,6vw,102px) 22px; } .elx .sec-hero{ padding:clamp(40px,4vw,64px) 22px clamp(56px,5.5vw,92px); } .elx .sec-minor{ padding:clamp(48px,4.5vw,78px) 22px; } .elx .sec-final{ padding:clamp(68px,6.6vw,120px) 22px; } .elx .wrap{ max-width:1240px; margin:0 auto; } .elx .paper{ background:var(--paper); } .elx .dark{ background:var(--navy); } /* ── type ───────────────────────────────────────────────────────────── */ .elx .eyebrow{ display:block; font-family:'IBM Plex Mono',monospace; font-size:11px; font-weight:500; letter-spacing:.13em; text-transform:uppercase; color:var(--teal); margin-bottom:14px; } .elx .dark .eyebrow{ color:var(--teal-x); } .elx h1{ font-weight:600; font-size:clamp(33px,4vw,var(--h1-max)); line-height:1.05; letter-spacing:-.026em; color:var(--ink); text-wrap:balance; } .elx h2{ font-weight:600; font-size:clamp(26px,2.9vw,36px); line-height:1.12; letter-spacing:-.026em; color:var(--ink); max-width:820px; text-wrap:balance; } .elx h2.impact{ font-size:clamp(27px,3.3vw,var(--impact-max)); line-height:1.08; max-width:900px; } .elx .dark h1, .elx .dark h2{ color:#fff; } .elx h3{ font-weight:600; font-size:clamp(20px,1.95vw,24px); line-height:1.24; letter-spacing:-.02em; } .elx .dark h3{ color:#fff; } .elx .lead{ font-size:clamp(16px,1.3vw,18px); line-height:1.6; font-weight:300; color:var(--mut); max-width:660px; margin-top:20px; } .elx .dark .lead{ color:rgba(255,255,255,.74); } .elx .body{ font-size:clamp(14.5px,1.15vw,15.5px); line-height:1.65; font-weight:300; color:var(--mut); } .elx .dark .body{ color:rgba(255,255,255,.68); } .elx .statement{ font-weight:600; font-size:clamp(22px,2.4vw,30px); line-height:1.28; letter-spacing:-.02em; } .elx .dark .statement{ color:#fff; } .elx .mono{ font-family:'IBM Plex Mono',monospace; } .elx .small{ font-size:13px; line-height:1.5; color:var(--mut-l); font-weight:300; } /* ── actions ────────────────────────────────────────────────────────── */ .elx .ctas{ display:flex; gap:12px; flex-wrap:wrap; align-items:center; margin-top:26px; } .elx .btn{ display:inline-flex; align-items:center; gap:8px; font-size:14.5px; font-weight:600; padding:12px 22px; border-radius:8px; transition:background .2s, transform .15s, box-shadow .18s, border-color .2s; } .elx .btn.solid{ background:var(--navy); color:#fff; } .elx .btn.solid:hover{ background:var(--navy-h); transform:translateY(-2px); box-shadow:0 10px 24px rgba(10,22,40,.24); } .elx .btn.line{ color:var(--navy); border:1px solid rgba(10,22,40,.18); } .elx .btn.line:hover{ border-color:var(--navy); transform:translateY(-2px); } .elx .textcta{ display:inline-flex; align-items:center; gap:9px; font-size:15px; font-weight:500; color:var(--ink); border-bottom:1px solid #C6CCD2; padding-bottom:2px; transition:border-color .2s; } .elx .textcta:hover{ border-color:var(--ink); } .elx .textcta svg{ transition:transform .2s; } .elx .textcta:hover svg{ transform:translateX(3px); } /* ── 1 hero ─────────────────────────────────────────────────────────── */ .elx .hero{ display:grid; grid-template-columns:55fr 45fr; gap:clamp(30px,4vw,58px); align-items:center; } .elx .proof{ display:flex; flex-wrap:wrap; gap:8px 22px; margin-top:30px; padding-top:16px; border-top:1px solid var(--rule); font-size:13.5px; color:var(--mut-l); font-weight:300; } .elx .frame{ border:1px solid var(--rule); border-radius:12px; overflow:hidden; background:#fff; box-shadow:0 26px 60px rgba(10,22,40,.15); } .elx .frame-bar{ display:flex; align-items:center; gap:7px; padding:10px 14px; border-bottom:1px solid var(--rule-l); background:var(--paper); } .elx .frame-bar i{ width:9px; height:9px; border-radius:50%; background:#DFE3E7; display:block; } .elx .frame-bar span{ margin-left:8px; font-size:11px; color:var(--mut-l); font-weight:500; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } /* hero crop: shows the top of the interface rather than shrinking the whole screen */ .elx .crop{ height:340px; overflow:hidden; } .elx .crop img{ width:100%; object-fit:cover; object-position:left top; height:100%; } /* ── 2 output ───────────────────────────────────────────────────────── */ .elx .doc{ display:block; margin-top:38px; max-width:72%; } .elx .doc img{ width:100%; border:1px solid var(--rule); box-shadow:0 30px 66px rgba(10,22,40,.15); transition:transform .25s, box-shadow .25s; } .elx .doc:hover img{ transform:translateY(-3px); box-shadow:0 36px 76px rgba(10,22,40,.2); } .elx .pillars{ display:grid; grid-template-columns:repeat(4,1fr); gap:0; margin-top:42px; } .elx .pillar{ padding:0 24px; border-left:1px solid var(--rule); } .elx .pillar:first-child{ padding-left:0; border-left:none; } .elx .pillar .k{ font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.11em; text-transform:uppercase; color:var(--ink); margin-bottom:7px; } .elx .pillar p{ font-size:13.5px; line-height:1.55; color:var(--mut); font-weight:300; } /* ── 3 chain ────────────────────────────────────────────────────────── */ .elx .chain{ display:grid; grid-template-columns:repeat(4,1fr); gap:0; margin-top:38px; position:relative; } .elx .cnode{ padding:18px 20px; border:1px solid rgba(255,255,255,.14); border-right:none; background:rgba(255,255,255,.03); } .elx .cnode:last-child{ border-right:1px solid rgba(255,255,255,.14); } .elx .cnode .k{ font-family:'IBM Plex Mono',monospace; font-size:9.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--teal-x); margin-bottom:9px; } .elx .cnode .v{ font-size:14px; font-weight:500; color:#fff; letter-spacing:-.01em; line-height:1.35; } .elx .cnode .s{ font-size:12px; color:rgba(255,255,255,.5); margin-top:4px; line-height:1.45; } .elx .cout{ margin-top:14px; border:1px solid rgba(127,188,171,.4); border-radius:2px; background:rgba(78,157,143,.08); padding:20px 22px; } .elx .cout .k{ font-family:'IBM Plex Mono',monospace; font-size:9.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--teal-x); margin-bottom:10px; } .elx .cout p{ font-size:15px; line-height:1.75; color:rgba(255,255,255,.9); font-weight:300; } .elx .hl{ background:rgba(127,188,171,.22); border-bottom:1px solid var(--teal-x); padding:0 3px; color:#fff; } .elx .cite{ font-family:'IBM Plex Mono',monospace; font-size:10px; color:var(--teal-x); vertical-align:super; } .elx .three{ display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(22px,3vw,44px); margin-top:38px; } .elx .three .k{ font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--teal-x); margin-bottom:8px; } .elx .three p{ font-size:14.5px; line-height:1.6; color:rgba(255,255,255,.72); font-weight:300; } /* ── 4 workflow, sticky ─────────────────────────────────────────────── */ .elx .flow{ display:grid; grid-template-columns:210px 1fr; gap:clamp(28px,5vw,72px); margin-top:44px; align-items:start; } .elx .rail{ position:sticky; top:100px; } .elx .rail a{ display:block; padding:11px 0 11px 15px; border-left:2px solid var(--rule); transition:border-color .25s, color .25s; } .elx .rail a .n{ font-family:'IBM Plex Mono',monospace; font-size:10px; letter-spacing:.12em; color:var(--faint); display:block; margin-bottom:3px; } .elx .rail a .t{ font-size:15px; font-weight:500; color:var(--mut-l); letter-spacing:-.01em; transition:color .25s; } .elx .rail a.on{ border-left-color:var(--navy); } .elx .rail a.on .t{ color:var(--ink); } .elx .rail a.on .n{ color:var(--teal); } .elx .stage{ margin-bottom:76px; } .elx .stage:last-child{ margin-bottom:0; } .elx .stage .k{ font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.13em; text-transform:uppercase; color:var(--teal); margin-bottom:10px; } .elx .stage .body{ margin-top:11px; max-width:560px; } .elx .stage .vis{ margin-top:26px; } .elx .cadence{ margin-top:64px; padding-top:34px; border-top:1px solid var(--rule); display:flex; justify-content:space-between; align-items:center; gap:24px; flex-wrap:wrap; } /* ── panels ─────────────────────────────────────────────────────────── */ .elx .panel{ border:1px solid var(--rule); border-radius:12px; background:#fff; overflow:hidden; box-shadow:0 20px 48px rgba(10,22,40,.1); } .elx .panel-body{ padding:16px; } .elx .prow{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:11px 13px; border:1px solid var(--rule-l); border-radius:8px; margin-bottom:8px; } .elx .prow:last-of-type{ margin-bottom:0; } .elx .prow.on{ border-color:var(--teal); background:#F7FBF9; } .elx .prow .pl{ font-size:13.5px; color:var(--ink); } .elx .prow .pr{ font-family:'IBM Plex Mono',monospace; font-size:11.5px; color:var(--mut); white-space:nowrap; } .elx .tag{ font-family:'IBM Plex Mono',monospace; font-size:10px; letter-spacing:.06em; padding:4px 9px; border-radius:5px; white-space:nowrap; } .elx .tag.done{ color:var(--teal); background:#EAF3F0; } .elx .tag.wip{ color:#B9821F; background:#FBF3E4; } .elx .tag.na{ color:var(--mut); background:#F1F3F5; } .elx .pmeta{ display:flex; justify-content:space-between; gap:12px; flex-wrap:wrap; margin-top:14px; padding-top:12px; border-top:1px solid var(--rule-l); font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.06em; text-transform:uppercase; color:var(--faint); } /* small UI detail paired with a large screenshot */ .elx .pair{ display:grid; grid-template-columns:1fr 260px; gap:16px; align-items:end; } .elx .detail{ border:1px solid var(--rule); border-radius:10px; background:#fff; padding:14px 15px; box-shadow:0 12px 30px rgba(10,22,40,.08); } .elx .detail .k{ font-family:'IBM Plex Mono',monospace; font-size:9px; letter-spacing:.12em; text-transform:uppercase; color:var(--faint); margin-bottom:7px; } .elx .detail .v{ font-size:19px; font-weight:600; letter-spacing:-.02em; } .elx .detail .s{ font-size:11.5px; color:var(--mut-l); margin-top:3px; line-height:1.45; } /* ── 5 cycle timeline ───────────────────────────────────────────────── */ .elx .tl{ display:grid; grid-template-columns:repeat(3,1fr); gap:0; margin-top:40px; } .elx .tstep{ padding:22px 26px 4px; border-top:2px solid rgba(255,255,255,.28); position:relative; } .elx .tstep:nth-child(1){ padding-left:0; } .elx .tstep.now{ border-top-color:var(--teal-x); } .elx .tstep .k{ font-family:'IBM Plex Mono',monospace; font-size:11px; letter-spacing:.14em; text-transform:uppercase; color:#fff; margin-bottom:14px; } .elx .tstep ul{ list-style:none; } .elx .tstep li{ font-size:14.5px; color:rgba(255,255,255,.66); font-weight:300; padding:4px 0; } .elx .tstep.now li{ color:rgba(255,255,255,.86); } /* ── 6 scale ────────────────────────────────────────────────────────── */ .elx .scale{ display:flex; align-items:center; flex-wrap:wrap; gap:10px 4px; margin-top:36px; padding:20px 0; border-top:1px solid var(--rule); border-bottom:1px solid var(--rule); } .elx .sstep{ font-family:'IBM Plex Mono',monospace; font-size:11.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--ink); padding:6px 0; } .elx .sarr{ color:#C4CCD2; padding:0 14px; display:flex; align-items:center; } .elx .cols3{ display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(24px,3.4vw,52px); margin-top:34px; } .elx .col .k{ font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.13em; text-transform:uppercase; color:var(--faint); margin-bottom:9px; } .elx .col p{ font-size:14.5px; line-height:1.6; color:var(--mut); font-weight:300; } /* ── 7 spec and faq ─────────────────────────────────────────────────── */ .elx .databar{ display:flex; flex-wrap:wrap; align-items:baseline; gap:10px 30px; padding:18px 0; border-top:1px solid var(--rule); border-bottom:1px solid var(--rule); margin-bottom:clamp(40px,4.5vw,66px); } .elx .databar .k{ font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.13em; text-transform:uppercase; color:var(--faint); } .elx .databar span{ font-size:14px; color:var(--ink); font-weight:300; } .elx .split{ display:grid; grid-template-columns:1fr 1fr; gap:clamp(32px,5vw,76px); align-items:start; } .elx .speclist{ display:grid; grid-template-columns:1fr 1fr; gap:0 26px; margin-top:24px; } .elx .speclist ul{ list-style:none; } .elx .speclist li{ font-size:14.5px; color:#41474F; font-weight:300; padding:8px 0; border-bottom:1px solid var(--rule-l); } .elx .faq{ margin-top:24px; border-top:1px solid var(--rule); } .elx .faq details{ border-bottom:1px solid var(--rule); } .elx .faq summary{ list-style:none; cursor:pointer; padding:16px 0; font-size:15.5px; font-weight:500; letter-spacing:-.01em; color:var(--ink); display:flex; justify-content:space-between; gap:16px; } .elx .faq summary::-webkit-details-marker{ display:none; } .elx .faq summary::after{ content:'+'; color:var(--teal); font-size:20px; line-height:1; font-weight:400; } .elx .faq details[open] summary::after{ content:'\2013'; } .elx .faq p{ padding:0 0 18px; font-size:14.5px; line-height:1.7; color:var(--mut); font-weight:300; } /* ── 8 close ────────────────────────────────────────────────────────── */ .elx .close{ background:linear-gradient(180deg,#FFFFFF 0%,#F4F6F8 55%,#E9EDF1 100%); } .elx .foot{ padding:26px 22px; text-align:center; font-size:11.5px; line-height:1.7; color:#9AA3AD; font-weight:300; border-top:1px solid var(--rule-l); } /* ── tablet ─────────────────────────────────────────────────────────── */ @media (max-width:980px){ .elx .hero{ grid-template-columns:1fr; gap:34px; } .elx .crop{ height:280px; } .elx .doc{ max-width:100%; } .elx .flow{ grid-template-columns:1fr; gap:26px; } .elx .rail{ position:static; display:flex; gap:0; border-bottom:1px solid var(--rule); } .elx .rail a{ flex:1; border-left:none; border-bottom:2px solid var(--rule); padding:0 0 10px; } .elx .rail a.on{ border-left-color:var(--rule); border-bottom-color:var(--navy); } .elx .split{ grid-template-columns:1fr; gap:44px; } .elx .pair{ grid-template-columns:1fr; } .elx .detail{ max-width:320px; } } /* ── phone ──────────────────────────────────────────────────────────── */ @media (max-width:640px){ .elx .sec{ padding:clamp(52px,10vw,64px) 22px; } .elx .sec-minor{ padding:clamp(44px,8vw,56px) 22px; } .elx .pillars{ grid-template-columns:1fr 1fr; gap:20px 0; } .elx .pillar{ padding:0 16px; } .elx .pillar:nth-child(odd){ padding-left:0; border-left:none; } .elx .chain{ grid-template-columns:1fr; } .elx .cnode{ border-right:1px solid rgba(255,255,255,.14); border-bottom:none; } .elx .cnode:last-of-type{ border-bottom:1px solid rgba(255,255,255,.14); } .elx .three{ grid-template-columns:1fr; gap:22px; } .elx .tl{ grid-template-columns:1fr; gap:24px; } .elx .tstep{ padding:18px 0 0; } .elx .cols3{ grid-template-columns:1fr; gap:24px; } .elx .speclist{ grid-template-columns:1fr; } .elx .stage{ margin-bottom:52px; } .elx .btn{ width:100%; justify-content:center; } .elx .crop{ height:230px; } .elx .scale{ gap:6px 0; } .elx .sarr{ padding:0 10px; transform:rotate(90deg); } .elx .cadence{ flex-direction:column; align-items:flex-start; gap:18px; } .elx .rail a .t{ font-size:13.5px; } .elx h1, .elx h2, .elx .lead, .elx .body{ overflow-wrap:break-word; } } ISSB | IFRS S1 and IFRS S2 From company data to a complete ISSB disclosure. EcoLedger brings IFRS S1, IFRS S2, industry metrics, Scope 1 to 3 emissions, climate scenarios and supporting evidence into one controlled reporting process. See the platform View sample disclosure IFRS S1IFRS S2Scope 1 to 3Industry metricsScenario analysisEvidence trail app.theecoledger.com The output Start with what you actually have to deliver. A complete IFRS S1 and IFRS S2 disclosure, backed by the calculations, evidence and requirement mapping behind it. Governance Board oversight, responsibilities and controls Strategy Risks, opportunities, scenarios and resilience Risk management Identification, assessment and monitoring Metrics and targets Emissions, industry metrics and climate targets The disclosure is the output. The reporting record behind it is the product. Behind the disclosure Every statement should lead back to something. EcoLedger connects reported narrative and metrics to the data, calculation, evidence and requirement behind them. Source data Fleet_fuel_records.csv 412,900 litres of diesel, twelve depots Calculation DESNZ 2026 factor Litres multiplied by factor, GHG Protocol basis Evidence 3 documents attached Fuel card statements, reconciled to ledger Requirement IFRS S2 29(a)(i) Gross Scope 1 greenhouse gas emissions Disclosure During FY2026 the Group’s gross Scope 1 greenhouse gas emissions were 1,284 tCO₂e [S2 29(a)(i)], measured in accordance with the GHG Protocol Corporate Standard. Traceable See where each reported figure came from. Mapped Know which requirement the data satisfies. Reviewable Give finance and assurance teams the supporting evidence trail. Inside EcoLedger One reporting process from data to disclosure. 01Calculate 02Map 03Disclose 01 Calculate Build the numbers. Calculate Scope 1, Scope 2 and Scope 3 using reporting year factors, with entity detail and data quality preserved. app.theecoledger.com · Emissions Scope 1 · FY2026 1,284 tCO₂e DESNZ 2026 · primary data 02 Map Close the requirements. Track every IFRS S1 and IFRS S2 requirement against the datapoints, narrative and evidence required to satisfy it. app.theecoledger.com · Requirement tracker S2 29(a) Gross emissions, Scope 1 and 2Complete S2 29(a)(i) Scope 3 by categoryComplete S2 22(b) Climate scenario analysisIn progress S1 27 Governance and oversightComplete S2 29(f) Internal carbon priceNot applicable 84 of 91 addressedEvidence on 96 percent 03 Disclose Build the report from the record. Assemble governance, strategy, risk management, scenarios, metrics and targets into a disclosure linked back to its supporting evidence. app.theecoledger.com · Disclosure builder Calculate. Map. Disclose. See how EcoLedger maps your ISSB reporting requirements Built for the reporting cycle Built for review this year. Built to be reused next year. Sustainability builds the reporting record. Finance can review the process. Assurance teams can follow the evidence. When the next reporting year arrives, the structure is already there. Build Data Risks Metrics Narrative Review Controls Evidence Challenge Sign off Refresh Prior year structure Updated data Updated factors Updated disclosure The first disclosure is implementation. The next one should be a refresh. Deployment Start with ISSB. Extend when your reporting perimeter does. EcoLedger can support IFRS S1 and IFRS S2 for a single reporting entity or extend the same underlying data across entities, jurisdictions and additional disclosure frameworks. Single entity Group reporting Multiple jurisdictions Multiple frameworks Entities Sites, subsidiaries, business units and group reporting. Jurisdictions ISSB baseline and local adoption requirements. Frameworks Reuse underlying data across related sustainability disclosures. Discuss your reporting requirements Your data On device optionEncrypted syncPasswordless accessExport at any time What is included ISSB reporting in EcoLedger. IFRS S1 requirements IFRS S2 requirements Industry metrics Scope 1, 2 and 3 Climate scenarios Materiality Risks and opportunities Metrics and targets Evidence register Requirement mapping Multi entity reporting Word and PDF output Common questions Can EcoLedger support multiple entities and jurisdictions? Yes. Entities are configured individually and consolidated into group reporting, so subsidiaries can hold their own activity data, metrics and narrative while the group reports on one dataset. Local ISSB adoption regimes sit over the same underlying data as jurisdiction overlays, so a datapoint entered once can satisfy the global baseline and the local requirement. Which emission factors are supported? DESNZ factors for United Kingdom activity and IEA grid factors for international electricity, matched to the reporting year rather than the current year, so prior year comparatives and restatements stay consistent. Calculations follow the GHG Protocol Corporate Standard across Scope 1, Scope 2 on both location and market basis, and all 15 Scope 3 categories. The factor edition and data quality are recorded against each figure, and new editions are added each reporting year. How does EcoLedger support review and assurance? Each reported figure keeps its source data, calculation and attached evidence, and each disclosure statement carries the requirement it satisfies. Reviewers can move from a number in the report to the document behind it without a separate request, and the same structure is available to an external assurance provider. EcoLedger supports your own review process. It does not provide an assurance opinion. How much reporting guidance is built into the platform? EcoLedger structures the reporting process around the requirements themselves. Each requirement is mapped to the data, narrative and evidence needed to complete it, with guidance embedded throughout the workflow. Your team retains responsibility for the judgements, assumptions and underlying information that form the disclosure. See it with your reporting Bring one ISSB reporting problem. We will show you how EcoLedger handles it. Bring an existing disclosure, spreadsheet, emissions inventory or reporting gap. We will map it into the EcoLedger process and show you what the reporting record would look like. Discuss your reporting requirements View sample disclosure EcoLedger is built on IFRS S1 and IFRS S2, the ISSB global sustainability disclosure standards. It supports the preparation of your reporting and your own review and assurance process. It does not provide an assurance opinion. (function(){ var rail = document.querySelectorAll('.elx .rail a[data-rail]'); var stages = ['st1','st2','st3'].map(function(id){ return document.getElementById(id); }).filter(Boolean); if(!rail.length || stages.length !== 3) return; function setActive(id){ rail.forEach(function(a){ a.classList.toggle('on', a.getAttribute('data-rail') === id); }); } if('IntersectionObserver' in window){ var io = new IntersectionObserver(function(entries){ entries.forEach(function(e){ if(e.isIntersecting) setActive(e.target.id); }); }, { rootMargin:'-45% 0px -50% 0px', threshold:0 }); stages.forEach(function(s){ io.observe(s); }); } rail.forEach(function(a){ a.addEventListener('click', function(ev){ ev.preventDefault(); var t = document.getElementById(a.getAttribute('data-rail')); if(t) window.scrollTo({ top: t.getBoundingClientRect().top + window.pageYOffset - 90, behavior:'smooth' }); }); }); })();