|
26 | 26 | page-fill : rgb("#121620"), |
27 | 27 | section-fill : rgb("#171d2e"), // glass-bg dark ≈ rgba(255,255,255,0.03) over #121620 |
28 | 28 | section-stroke: rgb("#252d42"), // glass-border dark ≈ rgba(255,255,255,0.1) |
| 29 | + exp-fill : rgb("#191d27"), // full-bleed experiences bg (dark) — from style-pdf.css |
29 | 30 | text : rgb("#e0e0e0"), |
30 | 31 | heading : rgb("#ffffff"), |
31 | 32 | h1 : rgb("#ffffff"), |
|
40 | 41 | page-fill : rgb("#e3ebf4"), // --pdf-page-margin-color |
41 | 42 | section-fill : rgb("#ffffff"), // --pdf-page-bg |
42 | 43 | section-stroke: rgb("#ccd6e4"), // glass-border light ≈ rgba(255,255,255,0.4) over #e3ebf4 |
| 44 | + exp-fill : rgb("#ffffff"), // full-bleed experiences bg (light) — white band on grey page |
43 | 45 | text : rgb("#1a1a1c"), |
44 | 46 | heading : rgb("#1a1a1c"), |
45 | 47 | h1 : rgb("#1a1a1c"), |
|
58 | 60 | // PAGE & BASE TEXT SETUP |
59 | 61 | // ============================================================================= |
60 | 62 | #set page( |
61 | | - paper : "a4", |
62 | | - margin: (x: 8mm, y: 8mm), |
63 | | - fill : t.page-fill, |
| 63 | + paper : "a4", |
| 64 | + margin : (x: 8mm, y: 8mm), |
| 65 | + fill : t.page-fill, |
| 66 | + // Paint exp-fill into the top/bottom margins on pages where the experiences |
| 67 | + // section appears, so the band is seamless across page breaks. |
| 68 | + background: context { |
| 69 | + let pg = here().page() |
| 70 | + let ss = query(<exp-bleed-start>) |
| 71 | + let es = query(<exp-bleed-end>) |
| 72 | + if ss.len() == 0 or es.len() == 0 { return } |
| 73 | + let s-loc = ss.first().location() |
| 74 | + let e-loc = es.first().location() |
| 75 | + let sp = s-loc.page() |
| 76 | + let ep = e-loc.page() |
| 77 | + if pg < sp or pg > ep { return } |
| 78 | + let sy = s-loc.position().y |
| 79 | + let ey = e-loc.position().y |
| 80 | + let top-y = if pg == sp { sy } else { 0mm } |
| 81 | + let bot-y = if pg == ep { ey } else { 297mm } |
| 82 | + if bot-y <= top-y { return } |
| 83 | + place(left + top, dy: top-y, |
| 84 | + rect(width: 210mm, height: bot-y - top-y, fill: t.exp-fill) |
| 85 | + ) |
| 86 | + }, |
64 | 87 | ) |
65 | 88 |
|
66 | 89 | #set text( |
|
130 | 153 | ] |
131 | 154 | } |
132 | 155 |
|
| 156 | +// ── Full-bleed experiences box (edge-to-edge, no card border) ────────────────── |
| 157 | +// pad(x: -8mm) expands the available width by 2×8mm = full A4 width. |
| 158 | +// block(width: 100%) then fills that full width. |
| 159 | +// inset x = 8mm (compensate the margin expansion) + 11pt (regular content padding). |
| 160 | +#let exp-bleed-box(title: "", body) = { |
| 161 | + // Metadata markers let the page background context know where this section |
| 162 | + // starts/ends so it can paint exp-fill into the top/bottom margin areas, |
| 163 | + // producing a continuous band across the page break. |
| 164 | + [#metadata("s") <exp-bleed-start>] |
| 165 | + pad(x: -8mm)[ |
| 166 | + #block( |
| 167 | + width : 100%, |
| 168 | + fill : t.exp-fill, |
| 169 | + inset : (x: 8mm + 11pt, top: 10pt, bottom: 5pt), |
| 170 | + above : 6pt, |
| 171 | + below : 0pt, |
| 172 | + breakable: true, |
| 173 | + )[ |
| 174 | + #section-heading(title) |
| 175 | + #v(8pt) |
| 176 | + #body |
| 177 | + ] |
| 178 | + ] |
| 179 | + [#metadata("e") <exp-bleed-end>] |
| 180 | + // Force a visible non-collapsible gap in page-fill colour before next section. |
| 181 | + // A block() is immune to Typst's paragraph-spacing collapse, unlike v(). |
| 182 | + block(height: 10pt, width: 100%, above: 0pt, below: 0pt) |
| 183 | +} |
| 184 | + |
133 | 185 | // ── Contact card (blue background, no stroke) ───────────────────────────────── |
134 | 186 | #let contact-box(body) = { |
135 | 187 | block( |
|
185 | 237 | // ── HEADER — Name + Tagline ─────────────────────────────────────────────────── |
186 | 238 | #block(below: 10pt)[ |
187 | 239 | #text( |
188 | | - size : 25pt, |
| 240 | + size : 21pt, |
189 | 241 | weight : "extrabold", |
190 | 242 | fill : t.h1, |
191 | 243 | tracking: 0.8pt, |
|
236 | 288 | ] |
237 | 289 |
|
238 | 290 | // ── EXPERIENCES ───────────────────────────────────────────────────────────────────────────────── |
239 | | -#section-box(title: d.titles.experiences)[ |
| 291 | +#exp-bleed-box(title: d.titles.experiences)[ |
240 | 292 |
|
241 | 293 | // ── Experience 1 : Fractional CTO (special structure) ────────────────────── |
242 | 294 | #let exp0 = d.experiences.at(0) |
|
0 commit comments