#let kb-red = rgb("#880000") #let kb-red-lt = rgb("#aa2222") #let kb-white = rgb("#ffffff") #let kb-dark = rgb("#1a1a1a") #let kb-mid = rgb("#555555") #let kb-light = rgb("#f5f0f0") #let kb-border = rgb("#ddcccc") #let font-heading = "Futura Now Headline" #let font-body = "Libertinus Serif" // ── Page setup ──────────────────────────────────────────────── #set page( paper: "a4", margin: (top: 2.8cm, bottom: 2.8cm, left: 2.4cm, right: 2.4cm), header: context { if counter(page).get().first() > 1 { grid( columns: (1fr, auto), align: (left + horizon, right + horizon), text(font: font-heading, size: 7pt, fill: kb-mid, tracking: 1pt)[ KLINGENBERG BYGG ], text(font: font-body, size: 8pt, fill: kb-mid)[ #counter(page).display() ] ) line(length: 100%, stroke: 0.4pt + kb-border) } }, footer: context { if counter(page).get().first() > 1 { line(length: 100%, stroke: 0.4pt + kb-border) v(3pt) text(font: font-body, size: 7.5pt, fill: kb-mid)[ Klingenberg Bygg · Hobølveien 6, 1825 Tomter · Org.nr. 976 015 711 ] } } ) // ── Typography ──────────────────────────────────────────────── #set text( font: font-body, size: 10.5pt, fill: kb-dark, lang: "nb", ) #set par( leading: 0.75em, spacing: 1.1em, justify: true, ) #show heading.where(level: 1): it => { v(1.6em) text(font: font-heading, size: 20pt, fill: kb-red, it.body) v(0.4em) line(length: 100%, stroke: 1.2pt + kb-red) v(0.6em) } #show heading.where(level: 2): it => { v(1.2em) text(font: font-heading, size: 14pt, fill: kb-dark, it.body) v(0.3em) line(length: 100%, stroke: 0.4pt + kb-border) v(0.4em) } #show heading.where(level: 3): it => { v(0.9em) text(font: font-heading, size: 11pt, fill: kb-red-lt, it.body) v(0.2em) } #show heading.where(level: 4): it => { v(0.6em) text(font: font-heading, size: 10pt, fill: kb-mid, upper(it.body)) v(0.1em) } #show link: it => text(fill: kb-red-lt, it) #show quote: it => { pad(left: 1.2em, rect( width: 100%, inset: (left: 1em, top: 0.6em, bottom: 0.6em, right: 0.6em), stroke: (left: 3pt + kb-red), fill: kb-light, text(style: "italic", fill: kb-mid, it.body) ) ) } #show raw.where(block: true): it => { rect( width: 100%, inset: 0.9em, radius: 4pt, fill: kb-light, stroke: 0.5pt + kb-border, text(font: "FreeMono", size: 8.5pt, fill: kb-dark, it) ) } #show raw.where(block: false): it => { box( inset: (x: 3pt, y: 1.5pt), radius: 3pt, fill: kb-light, stroke: 0.4pt + kb-border, text(font: "FreeMono", size: 8pt, it) ) } #show table.cell.where(y: 0): set text(fill: kb-white, font: font-heading, size: 9pt) // ── Cover page ──────────────────────────────────────────────── #let cover-page( tittel: "", undertittel: "", dato: "", av: "", kunde: "", adresse: "", bilde: "", ) = { set page(header: none, footer: none, margin: 2cm) // Logo and Company name (vertically aligned in red band) stack(spacing: 1em, rect(width: 100%, height: 3cm, fill: kb-red, radius: 0.3cm, align(left + horizon, grid( columns: (3cm, auto), gutter: .5cm, image("icon.svg", width: 3cm, height: auto), align(left + horizon, stack(spacing: 0.8em, text(font: font-heading, size: 28pt, fill: kb-white, tracking: 2pt)[KLINGENBERG BYGG], text(font: font-body, size: 10pt, fill: rgb("#ffcccc"))[Hobølveien 6, 1825 Tomter], ) ) ) ) ), v(1.5cm), text(font: font-heading, size: 26pt, fill: kb-red, tittel), if undertittel != "" { text(font: font-body, size: 13pt, fill: kb-mid, undertittel) }, line(length: 100%, stroke: 1.5pt + kb-red), grid( columns: (1fr, 1fr), gutter: 1.2em, stack(spacing: 0.6em, if kunde != "" { stack(spacing: 0.15em, text(font: font-heading, size: 7pt, fill: kb-mid, tracking: 1pt)[KUNDE], text(font: font-body, size: 10pt, fill: kb-dark, kunde), ) }, if adresse != "" { stack(spacing: 0.15em, text(font: font-heading, size: 7pt, fill: kb-mid, tracking: 1pt)[ADRESSE], text(font: font-body, size: 10pt, fill: kb-dark, adresse), ) }, ), stack(spacing: 0.6em, if av != "" { stack(spacing: 0.15em, text(font: font-heading, size: 7pt, fill: kb-mid, tracking: 1pt)[UTARBEIDET AV], text(font: font-body, size: 10pt, fill: kb-dark, av), ) }, if dato != "" { stack(spacing: 0.15em, text(font: font-heading, size: 7pt, fill: kb-mid, tracking: 1pt)[DATO], text(font: font-body, size: 10pt, fill: kb-dark, dato), ) }, ), ), v(1.5cm), if bilde != "" { image(bilde, width: 100%, height: 16cm, fit: "cover") } ) pagebreak() } // ── Render cover ────────────────────────────────────────────── $if(tittel)$ #cover-page( tittel: "$tittel$", undertittel: "$if(undertittel)$$undertittel$$endif$", dato: "$if(dato)$$dato$$endif$", av: "$if(av)$$av$$endif$", kunde: "$if(kunde)$$kunde$$endif$", adresse: "$if(adresse)$$adresse$$endif$", bilde: "$if(bilde)$$bilde$$endif$", ) $endif$ // ── Body ────────────────────────────────────────────────────── $body$