Spaces:
Sleeping
Sleeping
Download tests/fixtures/published_note.html from Viney/readthrough: direct link, hf CLI and curl.
- Browser
- Download file 24.4 kB
-
https://huggingface.co/spaces/Viney/readthrough/resolve/main/tests/fixtures/published_note.html
- Command line
-
hf download hf://spaces/Viney/readthrough/tests/fixtures/published_note.html
-
curl -L -o published_note.html https://huggingface.co/spaces/Viney/readthrough/resolve/main/tests/fixtures/published_note.html
24.4 kB
| <!-- | |
| Extracts from the published research note this design reproduces: | |
| https://claude.ai/code/artifact/a552e2bc-add9-48ea-b706-4b95f122d0e5 | |
| "NVIDIA T2 FY2027 Readthrough", published 2026-09-02. | |
| Only the two things the fidelity tests assert are kept: the stylesheet, | |
| and the three figures whose geometry dashboard/note_charts.py reproduces. | |
| Do not reformat — the tests compare this text. | |
| --> | |
| <style> | |
| :root{ | |
| --paper:#F5F6F3; --paper-2:#ECEEE9; --ink:#15201B; --ink-2:#3E4A44; --ink-3:#8C968F; --rule:#D5DAD4; | |
| --accent:#1E6B55; --accent-ink:#134A3B; --accent-soft:#DCEBE3; --warn:#B8791F; --warn-soft:#F4E8D2; --crit:#A63A2B; --crit-soft:#F3DDD8; | |
| --pos:#1E6B55; --neg:#A63A2B; | |
| } | |
| @media (prefers-color-scheme: dark){ | |
| :root:not([data-theme="light"]){ | |
| --paper:#111715; --paper-2:#181F1C; --ink:#E7ECE8; --ink-2:#B4BDB7; --ink-3:#77817B; --rule:#2A332E; | |
| --accent:#5FBF9E; --accent-ink:#8ED8BE; --accent-soft:#1B2E27; --warn:#D9A24A; --warn-soft:#332816; --crit:#E07A69; --crit-soft:#3A1F1B; | |
| --pos:#5FBF9E; --neg:#E07A69; | |
| } | |
| } | |
| :root[data-theme="dark"]{ | |
| --paper:#111715; --paper-2:#181F1C; --ink:#E7ECE8; --ink-2:#B4BDB7; --ink-3:#77817B; --rule:#2A332E; | |
| --accent:#5FBF9E; --accent-ink:#8ED8BE; --accent-soft:#1B2E27; --warn:#D9A24A; --warn-soft:#332816; --crit:#E07A69; --crit-soft:#3A1F1B; | |
| --pos:#5FBF9E; --neg:#E07A69; | |
| } | |
| *{box-sizing:border-box} | |
| body{margin:0;background:var(--paper);color:var(--ink);font-family:"IBM Plex Sans",-apple-system,"Segoe UI",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.55;-webkit-font-smoothing:antialiased} | |
| .wrap{max-width:1080px;margin:0 auto;padding:0 28px 80px} | |
| h1,h2,h3{font-family:"Newsreader",Georgia,"Times New Roman",serif;font-weight:500;letter-spacing:-0.005em;text-wrap:balance;margin:0} | |
| h1{font-size:clamp(30px,4.2vw,44px);line-height:1.1;font-weight:500} | |
| h2{font-size:26px;line-height:1.2;margin:0 0 14px} | |
| h3{font-size:19px;line-height:1.25;margin:22px 0 8px} | |
| p{margin:0 0 14px;max-width:68ch} | |
| ul,ol{margin:0 0 14px;padding-left:20px;max-width:68ch} | |
| li{margin-bottom:8px} | |
| a{color:var(--accent-ink)} | |
| .eyebrow{font-family:"IBM Plex Mono",ui-monospace,Menlo,Consolas,monospace;font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3)} | |
| /* masthead */ | |
| .mast{display:grid;grid-template-columns:1fr auto;gap:24px;align-items:end;padding:26px 0 18px;border-bottom:2px solid var(--ink)} | |
| .mast .house{font-family:"Newsreader",serif;font-size:22px;font-weight:600;letter-spacing:.01em} | |
| .mast .house small{display:block;font-family:"IBM Plex Mono",monospace;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);font-weight:400;margin-top:2px} | |
| .mast .meta{text-align:right;font-family:"IBM Plex Mono",monospace;font-size:12px;color:var(--ink-2);line-height:1.7} | |
| .mast .meta b{color:var(--ink);font-weight:500} | |
| .head{padding:34px 0 22px;border-bottom:1px solid var(--rule)} | |
| .head .ticker{display:flex;gap:14px;align-items:baseline;flex-wrap:wrap;margin-bottom:12px} | |
| .head .ticker .co{font-family:"Newsreader",serif;font-size:22px;font-weight:600} | |
| .head .ticker .tk{font-family:"IBM Plex Mono",monospace;font-size:13px;color:var(--ink-2);background:var(--paper-2);padding:3px 8px;border-radius:3px} | |
| .head .lede{font-family:"Newsreader",serif;font-size:20px;line-height:1.4;color:var(--ink-2);max-width:62ch;margin:16px 0 0;font-weight:400} | |
| /* en bref */ | |
| .enbref{border-top:2px solid var(--ink);padding-top:14px;margin-top:22px} | |
| .enbref h2{font-family:"IBM Plex Mono",monospace;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);margin:0 0 10px;font-weight:500} | |
| .enbref ul{list-style:none;margin:0;padding:0;max-width:none} | |
| .enbref li{font-size:15px;line-height:1.5;margin:0 0 10px} | |
| .enbref li:last-child{margin-bottom:0} | |
| /* toc */ | |
| nav.toc{position:sticky;top:0;background:var(--paper);border-bottom:1px solid var(--rule);z-index:2;display:flex;gap:18px;overflow-x:auto;padding:10px 0;font-family:"IBM Plex Mono",monospace;font-size:11px;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap} | |
| nav.toc a{color:var(--ink-2);text-decoration:none} | |
| nav.toc a:hover{color:var(--accent-ink)} | |
| /* key tiles */ | |
| .tiles{display:grid;grid-template-columns:repeat(6,1fr);border:1px solid var(--rule);border-radius:4px;margin:26px 0 0;overflow:hidden;background:var(--paper-2)} | |
| .tile{padding:14px 16px;background:var(--paper);border-right:1px solid var(--rule)} | |
| .tile:last-child{border-right:0} | |
| .tile .k{font-family:"IBM Plex Mono",monospace;font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)} | |
| .tile .v{font-family:"Newsreader",serif;font-size:30px;line-height:1.1;margin:6px 0 4px;font-variant-numeric:tabular-nums} | |
| .tile .s{font-size:12px;color:var(--ink-2)} | |
| .tile .v.warn{color:var(--warn)} .tile .v.pos{color:var(--pos)} | |
| /* layout */ | |
| .grid{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:48px;margin-top:34px} | |
| main>section{padding:30px 0;border-bottom:1px solid var(--rule)} | |
| main>section:first-child{padding-top:6px} | |
| aside{position:sticky;top:20px;align-self:start;font-size:13px} | |
| aside .box{border-top:2px solid var(--ink);padding:12px 0 6px;margin-bottom:22px} | |
| aside .box h4{font-family:"IBM Plex Mono",monospace;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);margin:0 0 10px;font-weight:500} | |
| aside dl{margin:0;display:grid;grid-template-columns:1fr auto;gap:5px 12px} | |
| aside dt{color:var(--ink-2)} aside dd{margin:0;text-align:right;font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums;color:var(--ink)} | |
| aside .note{font-size:12px;color:var(--ink-3);margin-top:8px;line-height:1.45} | |
| /* source tags */ | |
| .src{display:inline-flex;gap:0;vertical-align:middle;margin-left:6px;font-family:"IBM Plex Mono",monospace;font-size:10px;letter-spacing:.04em;line-height:1;white-space:nowrap} | |
| .src .tag{padding:3px 6px;border:1px solid var(--rule);border-right:0;border-radius:3px 0 0 3px;color:var(--ink-2);background:var(--paper-2)} | |
| .src .rel{padding:3px 6px;border:1px solid var(--rule);border-radius:0 3px 3px 0;font-weight:500} | |
| .rel.hi{background:var(--accent-soft);color:var(--accent-ink);border-color:var(--accent-soft)} | |
| .rel.med{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-soft)} | |
| .rel.low{background:var(--crit-soft);color:var(--crit);border-color:var(--crit-soft)} | |
| /* callouts */ | |
| .thesis{border-left:3px solid var(--accent);padding:4px 0 4px 18px;margin:0 0 22px} | |
| .thesis p{font-family:"Newsreader",serif;font-size:19px;line-height:1.4;margin:0} | |
| .flag{background:var(--warn-soft);border-left:3px solid var(--warn);padding:12px 16px;margin:18px 0;font-size:14px;max-width:none} | |
| .flag p{margin:0;max-width:none} | |
| .quote{margin:14px 0 16px;padding:12px 18px;border-left:2px solid var(--rule);color:var(--ink-2);font-size:14px;max-width:70ch} | |
| .quote p{margin:0 0 6px} .quote .gl{font-size:13px;color:var(--ink-3);font-style:italic} | |
| /* two-col bull/bear */ | |
| .bb{display:grid;grid-template-columns:1fr 1fr;gap:28px} | |
| .bb h3{margin-top:0;padding-bottom:6px;border-bottom:1px solid var(--rule)} | |
| .bb ol{padding-left:18px} .bb li{font-size:14px} | |
| /* tables */ | |
| .tblwrap{overflow-x:auto;margin:14px 0 6px} | |
| table.fin{border-collapse:collapse;width:100%;font-family:"IBM Plex Mono",ui-monospace,Menlo,Consolas,monospace;font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap} | |
| table.fin th{text-align:right;font-weight:500;color:var(--ink-2);padding:8px 10px;border-bottom:1.5px solid var(--ink);font-family:"IBM Plex Sans",sans-serif;font-size:12px} | |
| table.fin th:first-child{text-align:left} | |
| table.fin td{text-align:right;padding:6px 10px;border-bottom:1px solid var(--rule)} | |
| table.fin td:first-child{text-align:left;font-family:"IBM Plex Sans",sans-serif;color:var(--ink)} | |
| table.fin tr.sub td:first-child{padding-left:22px;color:var(--ink-2)} | |
| table.fin td.pos{color:var(--pos)} table.fin td.neg{color:var(--neg)} | |
| table.fin sup{color:var(--warn);font-size:9px} | |
| /* charts */ | |
| figure{margin:16px 0 10px;padding:14px 12px 8px;border:1px solid var(--rule);border-radius:4px;background:var(--paper)} | |
| figure svg{width:100%;height:auto;display:block} | |
| figure .ct{font-family:"IBM Plex Mono",monospace;font-size:11px;fill:var(--ink-3)} | |
| figure .cv{font-family:"IBM Plex Mono",monospace;font-size:11px;fill:var(--ink)} | |
| figure .cb{font-family:"IBM Plex Mono",monospace;font-size:11px;fill:var(--accent-ink)} | |
| figure .cb.warn{fill:var(--warn)} | |
| figcaption{font-size:12.5px;color:var(--ink-2);padding:6px 4px 0;max-width:none} | |
| /* timeline */ | |
| .tl{list-style:none;padding:0;max-width:none} | |
| .tl li{display:grid;grid-template-columns:120px 1fr;gap:14px;padding:9px 0;border-bottom:1px solid var(--rule)} | |
| .tl .d{font-family:"IBM Plex Mono",monospace;font-size:12px;color:var(--ink-2)} | |
| /* annexes */ | |
| .annexe{margin-top:30px;padding-top:22px;border-top:1px solid var(--rule)} | |
| .annexe:first-of-type{margin-top:18px;padding-top:0;border-top:0} | |
| /* footer */ | |
| .foot{margin-top:34px;padding-top:18px;border-top:2px solid var(--ink);font-size:12.5px;color:var(--ink-2)} | |
| .foot h4{font-family:"IBM Plex Mono",monospace;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);margin:18px 0 8px;font-weight:500} | |
| .foot ul{max-width:none} .foot li{margin-bottom:5px} | |
| .legend{display:flex;gap:16px;flex-wrap:wrap;font-family:"IBM Plex Mono",monospace;font-size:11px;margin:8px 0} | |
| @media (max-width:900px){ | |
| .grid{grid-template-columns:1fr} aside{position:static} | |
| .tiles{grid-template-columns:repeat(3,1fr)} .tile{border-bottom:1px solid var(--rule)} .tile:nth-child(3n){border-right:0} | |
| .bb{grid-template-columns:1fr} | |
| .mast{grid-template-columns:1fr} .mast .meta{text-align:left} | |
| } | |
| @media (max-width:560px){ .tiles{grid-template-columns:repeat(2,1fr)} .tile:nth-child(3n){border-right:1px solid var(--rule)} .tile:nth-child(2n){border-right:0} .wrap{padding:0 16px 60px} } | |
| @media (prefers-reduced-motion: reduce){ *{animation:none;transition:none} } | |
| @media print{ | |
| nav.toc{display:none} | |
| .grid{display:block} | |
| aside{position:static;margin-top:34px} | |
| main{display:block} | |
| figure,table,.quote{break-inside:avoid} | |
| #annexes{break-before:page} | |
| body{font-size:11pt} | |
| .wrap{padding-left:0;padding-right:0} | |
| *{-webkit-print-color-adjust:exact;print-color-adjust:exact;color-adjust:exact} | |
| } | |
| </style> | |
| <figure id="revenue_vs_guidance"><svg viewBox="0 0 920 320" role="img" aria-label="Chiffre d’affaires trimestriel et point médian de la guidance"> | |
| <line x1="44" x2="908" y1="274.0" y2="274.0" stroke="var(--rule)" stroke-width="1"/> | |
| <text x="38" y="278.0" text-anchor="end" class="ct">0</text> | |
| <line x1="44" x2="908" y1="218.1" y2="218.1" stroke="var(--rule)" stroke-width="1"/> | |
| <text x="38" y="222.1" text-anchor="end" class="ct">25</text> | |
| <line x1="44" x2="908" y1="162.2" y2="162.2" stroke="var(--rule)" stroke-width="1"/> | |
| <text x="38" y="166.2" text-anchor="end" class="ct">50</text> | |
| <line x1="44" x2="908" y1="106.3" y2="106.3" stroke="var(--rule)" stroke-width="1"/> | |
| <text x="38" y="110.3" text-anchor="end" class="ct">75</text> | |
| <line x1="44" x2="908" y1="50.4" y2="50.4" stroke="var(--rule)" stroke-width="1"/> | |
| <text x="38" y="54.4" text-anchor="end" class="ct">100</text> | |
| <rect x="55.7" y="257.9" width="38.3" height="16.1" fill="var(--accent)" rx="1"/> | |
| <text x="74.9" y="251.9" text-anchor="middle" class="cv">7,2</text> | |
| <text x="74.9" y="290" text-anchor="middle" class="ct">T1 FY24</text> | |
| <rect x="117.4" y="243.8" width="38.3" height="30.2" fill="var(--accent)" rx="1"/> | |
| <text x="136.6" y="237.8" text-anchor="middle" class="cv">13,5</text> | |
| <line x1="114.4" x2="158.7" y1="249.4" y2="249.4" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="136.6" y="290" text-anchor="middle" class="ct">T2 FY24</text> | |
| <text x="136.6" y="306" text-anchor="middle" class="cb">+22,8 %</text> | |
| <rect x="179.2" y="233.5" width="38.3" height="40.5" fill="var(--accent)" rx="1"/> | |
| <text x="198.3" y="227.5" text-anchor="middle" class="cv">18,1</text> | |
| <line x1="176.2" x2="220.4" y1="238.2" y2="238.2" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="198.3" y="290" text-anchor="middle" class="ct">T3 FY24</text> | |
| <text x="198.3" y="306" text-anchor="middle" class="cb">+13,3 %</text> | |
| <rect x="240.9" y="224.6" width="38.3" height="49.4" fill="var(--ink-3)" rx="1"/> | |
| <text x="260.0" y="218.6" text-anchor="middle" class="cv">22,1</text> | |
| <line x1="237.9" x2="282.1" y1="229.3" y2="229.3" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="260.0" y="290" text-anchor="middle" class="ct">T4 FY24</text> | |
| <text x="260.0" y="306" text-anchor="middle" class="cb">+10,5 %</text> | |
| <rect x="302.6" y="215.8" width="38.3" height="58.2" fill="var(--accent)" rx="1"/> | |
| <text x="321.7" y="209.8" text-anchor="middle" class="cv">26,0</text> | |
| <line x1="299.6" x2="343.8" y1="220.3" y2="220.3" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="321.7" y="290" text-anchor="middle" class="ct">T1 FY25</text> | |
| <text x="321.7" y="306" text-anchor="middle" class="cb">+8,5 %</text> | |
| <rect x="364.3" y="206.8" width="38.3" height="67.2" fill="var(--accent)" rx="1"/> | |
| <text x="383.4" y="200.8" text-anchor="middle" class="cv">30,0</text> | |
| <line x1="361.3" x2="405.6" y1="211.4" y2="211.4" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="383.4" y="290" text-anchor="middle" class="ct">T2 FY25</text> | |
| <text x="383.4" y="306" text-anchor="middle" class="cb">+7,3 %</text> | |
| <rect x="426.0" y="195.5" width="38.3" height="78.5" fill="var(--accent)" rx="1"/> | |
| <text x="445.1" y="189.5" text-anchor="middle" class="cv">35,1</text> | |
| <line x1="423.0" x2="467.3" y1="201.3" y2="201.3" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="445.1" y="290" text-anchor="middle" class="ct">T3 FY25</text> | |
| <text x="445.1" y="306" text-anchor="middle" class="cb">+7,9 %</text> | |
| <rect x="487.7" y="186.0" width="38.3" height="88.0" fill="var(--ink-3)" rx="1"/> | |
| <text x="506.9" y="180.0" text-anchor="middle" class="cv">39,3</text> | |
| <line x1="484.7" x2="529.0" y1="190.1" y2="190.1" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="506.9" y="290" text-anchor="middle" class="ct">T4 FY25</text> | |
| <text x="506.9" y="306" text-anchor="middle" class="cb">+4,9 %</text> | |
| <rect x="549.4" y="175.5" width="38.3" height="98.5" fill="var(--accent)" rx="1"/> | |
| <text x="568.6" y="169.5" text-anchor="middle" class="cv">44,1</text> | |
| <line x1="546.4" x2="590.7" y1="177.8" y2="177.8" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="568.6" y="290" text-anchor="middle" class="ct">T1 FY26</text> | |
| <text x="568.6" y="306" text-anchor="middle" class="cb">+2,5 %</text> | |
| <rect x="611.2" y="169.5" width="38.3" height="104.5" fill="var(--accent)" rx="1"/> | |
| <text x="630.3" y="163.5" text-anchor="middle" class="cv">46,7</text> | |
| <line x1="608.2" x2="652.4" y1="173.4" y2="173.4" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="630.3" y="290" text-anchor="middle" class="ct">T2 FY26</text> | |
| <text x="630.3" y="306" text-anchor="middle" class="cb">+3,9 %</text> | |
| <rect x="672.9" y="146.5" width="38.3" height="127.5" fill="var(--accent)" rx="1"/> | |
| <text x="692.0" y="140.5" text-anchor="middle" class="cv">57,0</text> | |
| <line x1="669.9" x2="714.1" y1="153.2" y2="153.2" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="692.0" y="290" text-anchor="middle" class="ct">T3 FY26</text> | |
| <text x="692.0" y="306" text-anchor="middle" class="cb">+5,6 %</text> | |
| <rect x="734.6" y="121.6" width="38.3" height="152.4" fill="var(--ink-3)" rx="1"/> | |
| <text x="753.7" y="115.6" text-anchor="middle" class="cv">68,1</text> | |
| <line x1="731.6" x2="775.8" y1="128.6" y2="128.6" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="753.7" y="290" text-anchor="middle" class="ct">T4 FY26</text> | |
| <text x="753.7" y="306" text-anchor="middle" class="cb">+4,8 %</text> | |
| <rect x="796.3" y="91.5" width="38.3" height="182.5" fill="var(--accent)" rx="1"/> | |
| <text x="815.4" y="85.5" text-anchor="middle" class="cv">81,6</text> | |
| <line x1="793.3" x2="837.6" y1="99.6" y2="99.6" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="815.4" y="290" text-anchor="middle" class="ct">T1 FY27</text> | |
| <text x="815.4" y="306" text-anchor="middle" class="cb">+4,6 %</text> | |
| <rect x="858.0" y="58.8" width="38.3" height="215.2" fill="var(--accent)" rx="1"/> | |
| <text x="877.1" y="52.8" text-anchor="middle" class="cv">96,2</text> | |
| <line x1="855.0" x2="899.3" y1="70.5" y2="70.5" stroke="var(--warn)" stroke-width="2.5"/> | |
| <text x="877.1" y="290" text-anchor="middle" class="ct">T2 FY27</text> | |
| <text x="877.1" y="306" text-anchor="middle" class="cb">+5,7 %</text> | |
| <text x="44" y="16" class="ct">Md$ · barres = CA publié (gris = T4 dérivé du 10-K moins 9 mois) · trait ambre = point médian de la guidance donnée le trimestre précédent · sous l’axe : écart au point médian</text> | |
| </svg></figure> | |
| <figure id="net_income_vs_fcf"><svg viewBox="0 0 920 300" role="img" aria-label="Résultat net contre free cash-flow par trimestre"> | |
| <line x1="44" x2="908" y1="250.0" y2="250.0" stroke="var(--rule)"/> | |
| <text x="38" y="254.0" text-anchor="end" class="ct">0</text> | |
| <line x1="44" x2="908" y1="186.6" y2="186.6" stroke="var(--rule)"/> | |
| <text x="38" y="190.6" text-anchor="end" class="ct">20</text> | |
| <line x1="44" x2="908" y1="123.1" y2="123.1" stroke="var(--rule)"/> | |
| <text x="38" y="127.1" text-anchor="end" class="ct">40</text> | |
| <line x1="44" x2="908" y1="59.7" y2="59.7" stroke="var(--rule)"/> | |
| <text x="38" y="63.7" text-anchor="end" class="ct">60</text> | |
| <rect x="61.2" y="197.4" width="28.8" height="52.6" fill="var(--ink-3)" rx="1"/> | |
| <rect x="94.0" y="207.2" width="28.8" height="42.8" fill="var(--accent)" rx="1"/> | |
| <text x="75.6" y="192.4" text-anchor="middle" class="cv">16,6</text> | |
| <text x="108.4" y="202.2" text-anchor="middle" class="cv">13,5</text> | |
| <text x="92.0" y="266" text-anchor="middle" class="ct">T2 FY25</text> | |
| <text x="92.0" y="284" text-anchor="middle" class="cb">81 %</text> | |
| <rect x="157.2" y="188.8" width="28.8" height="61.2" fill="var(--ink-3)" rx="1"/> | |
| <rect x="190.0" y="196.7" width="28.8" height="53.3" fill="var(--accent)" rx="1"/> | |
| <text x="171.6" y="183.8" text-anchor="middle" class="cv">19,3</text> | |
| <text x="204.4" y="191.7" text-anchor="middle" class="cv">16,8</text> | |
| <text x="188.0" y="266" text-anchor="middle" class="ct">T3 FY25</text> | |
| <text x="188.0" y="284" text-anchor="middle" class="cb">87 %</text> | |
| <rect x="253.2" y="179.9" width="28.8" height="70.1" fill="var(--ink-3)" rx="1"/> | |
| <rect x="286.0" y="200.7" width="28.8" height="49.3" fill="var(--accent)" rx="1"/> | |
| <text x="267.6" y="174.9" text-anchor="middle" class="cv">22,1</text> | |
| <text x="300.4" y="195.7" text-anchor="middle" class="cv">15,6</text> | |
| <text x="284.0" y="266" text-anchor="middle" class="ct">T4 FY25</text> | |
| <text x="284.0" y="284" text-anchor="middle" class="cb">70 %</text> | |
| <rect x="349.2" y="190.5" width="28.8" height="59.5" fill="var(--ink-3)" rx="1"/> | |
| <rect x="382.0" y="166.9" width="28.8" height="83.1" fill="var(--accent)" rx="1"/> | |
| <text x="363.6" y="185.5" text-anchor="middle" class="cv">18,8</text> | |
| <text x="396.4" y="161.9" text-anchor="middle" class="cv">26,2</text> | |
| <text x="380.0" y="266" text-anchor="middle" class="ct">T1 FY26</text> | |
| <text x="380.0" y="284" text-anchor="middle" class="cb">139 %</text> | |
| <rect x="445.2" y="166.2" width="28.8" height="83.8" fill="var(--ink-3)" rx="1"/> | |
| <rect x="478.0" y="207.3" width="28.8" height="42.7" fill="var(--accent)" rx="1"/> | |
| <text x="459.6" y="161.2" text-anchor="middle" class="cv">26,4</text> | |
| <text x="492.4" y="202.3" text-anchor="middle" class="cv">13,5</text> | |
| <text x="476.0" y="266" text-anchor="middle" class="ct">T2 FY26</text> | |
| <text x="476.0" y="284" text-anchor="middle" class="cb">51 %</text> | |
| <rect x="541.2" y="148.8" width="28.8" height="101.2" fill="var(--ink-3)" rx="1"/> | |
| <rect x="574.0" y="179.9" width="28.8" height="70.1" fill="var(--accent)" rx="1"/> | |
| <text x="555.6" y="143.8" text-anchor="middle" class="cv">31,9</text> | |
| <text x="588.4" y="174.9" text-anchor="middle" class="cv">22,1</text> | |
| <text x="572.0" y="266" text-anchor="middle" class="ct">T3 FY26</text> | |
| <text x="572.0" y="284" text-anchor="middle" class="cb">69 %</text> | |
| <rect x="637.2" y="113.8" width="28.8" height="136.2" fill="var(--ink-3)" rx="1"/> | |
| <rect x="670.0" y="139.3" width="28.8" height="110.7" fill="var(--accent)" rx="1"/> | |
| <text x="651.6" y="108.8" text-anchor="middle" class="cv">43,0</text> | |
| <text x="684.4" y="134.3" text-anchor="middle" class="cv">34,9</text> | |
| <text x="668.0" y="266" text-anchor="middle" class="ct">T4 FY26</text> | |
| <text x="668.0" y="284" text-anchor="middle" class="cb">81 %</text> | |
| <rect x="733.2" y="65.0" width="28.8" height="185.0" fill="var(--ink-3)" rx="1"/> | |
| <rect x="766.0" y="95.9" width="28.8" height="154.1" fill="var(--accent)" rx="1"/> | |
| <text x="747.6" y="60.0" text-anchor="middle" class="cv">58,3</text> | |
| <text x="780.4" y="90.9" text-anchor="middle" class="cv">48,6</text> | |
| <text x="764.0" y="266" text-anchor="middle" class="ct">T1 FY27</text> | |
| <text x="764.0" y="284" text-anchor="middle" class="cb">83 %</text> | |
| <rect x="829.2" y="60.7" width="28.8" height="189.3" fill="var(--ink-3)" rx="1"/> | |
| <rect x="862.0" y="182.1" width="28.8" height="67.9" fill="var(--accent)" rx="1"/> | |
| <text x="843.6" y="55.7" text-anchor="middle" class="cv">59,7</text> | |
| <text x="876.4" y="177.1" text-anchor="middle" class="cv">21,4</text> | |
| <text x="860.0" y="266" text-anchor="middle" class="ct">T2 FY27</text> | |
| <text x="860.0" y="284" text-anchor="middle" class="cb warn">36 %</text> | |
| <text x="44" y="16" class="ct">Md$ · gris = résultat net GAAP · vert = free cash-flow (flux opérationnel moins capex) · sous l’axe : FCF / résultat net</text> | |
| </svg></figure> | |
| <figure id="days_sales_outstanding"><svg viewBox="0 0 920 260" role="img" aria-label="Délai de recouvrement clients en jours"> | |
| <line x1="44" x2="908" y1="226.0" y2="226.0" stroke="var(--rule)"/> | |
| <text x="38" y="230.0" text-anchor="end" class="ct">30</text> | |
| <line x1="44" x2="908" y1="176.5" y2="176.5" stroke="var(--rule)"/> | |
| <text x="38" y="180.5" text-anchor="end" class="ct">40</text> | |
| <line x1="44" x2="908" y1="127.0" y2="127.0" stroke="var(--rule)"/> | |
| <text x="38" y="131.0" text-anchor="end" class="ct">50</text> | |
| <line x1="44" x2="908" y1="77.5" y2="77.5" stroke="var(--rule)"/> | |
| <text x="38" y="81.5" text-anchor="end" class="ct">60</text> | |
| <line x1="44" x2="908" y1="28.0" y2="28.0" stroke="var(--rule)"/> | |
| <text x="38" y="32.0" text-anchor="end" class="ct">70</text> | |
| <polyline fill="none" stroke="var(--accent)" stroke-width="2.5" points="92.0,162.6 188.0,147.3 284.0,110.3 380.0,148.2 476.0,106.5 572.0,110.7 668.0,120.2 764.0,149.8 860.0,79.3"/> | |
| <circle cx="92.0" cy="162.6" r="4" fill="var(--accent)"/> | |
| <text x="92.0" y="151.6" text-anchor="middle" class="cv">43</text> | |
| <text x="92.0" y="242" text-anchor="middle" class="ct">T2 FY25</text> | |
| <circle cx="188.0" cy="147.3" r="4" fill="var(--accent)"/> | |
| <text x="188.0" y="136.3" text-anchor="middle" class="cv">46</text> | |
| <text x="188.0" y="242" text-anchor="middle" class="ct">T3 FY25</text> | |
| <circle cx="284.0" cy="110.3" r="4" fill="var(--accent)"/> | |
| <text x="284.0" y="99.3" text-anchor="middle" class="cv">53</text> | |
| <text x="284.0" y="242" text-anchor="middle" class="ct">T4 FY25</text> | |
| <circle cx="380.0" cy="148.2" r="4" fill="var(--accent)"/> | |
| <text x="380.0" y="137.2" text-anchor="middle" class="cv">46</text> | |
| <text x="380.0" y="242" text-anchor="middle" class="ct">T1 FY26</text> | |
| <circle cx="476.0" cy="106.5" r="4" fill="var(--accent)"/> | |
| <text x="476.0" y="95.5" text-anchor="middle" class="cv">54</text> | |
| <text x="476.0" y="242" text-anchor="middle" class="ct">T2 FY26</text> | |
| <circle cx="572.0" cy="110.7" r="4" fill="var(--accent)"/> | |
| <text x="572.0" y="99.7" text-anchor="middle" class="cv">53</text> | |
| <text x="572.0" y="242" text-anchor="middle" class="ct">T3 FY26</text> | |
| <circle cx="668.0" cy="120.2" r="4" fill="var(--accent)"/> | |
| <text x="668.0" y="109.2" text-anchor="middle" class="cv">51</text> | |
| <text x="668.0" y="242" text-anchor="middle" class="ct">T4 FY26</text> | |
| <circle cx="764.0" cy="149.8" r="4" fill="var(--accent)"/> | |
| <text x="764.0" y="138.8" text-anchor="middle" class="cv">45</text> | |
| <text x="764.0" y="242" text-anchor="middle" class="ct">T1 FY27</text> | |
| <circle cx="860.0" cy="79.3" r="6" fill="var(--warn)"/> | |
| <text x="860.0" y="68.3" text-anchor="middle" class="cv">60</text> | |
| <text x="860.0" y="242" text-anchor="middle" class="ct">T2 FY27</text> | |
| <text x="44" y="16" class="ct">Jours · créances clients / CA du trimestre × 91 · la CFO visait « mid-fifties » pour T2 FY27 (appel du 20 mai 2026)</text> | |
| </svg></figure> | |