From b39e8e0a08cc74c06abda6cabb53ea3f556c5236 Mon Sep 17 00:00:00 2001 From: Fredrik Borch Lynghaug Date: Wed, 8 Apr 2026 16:36:46 +0200 Subject: [PATCH] dokument stil --- stil.typ | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 stil.typ diff --git a/stil.typ b/stil.typ new file mode 100644 index 0000000..371925c --- /dev/null +++ b/stil.typ @@ -0,0 +1,213 @@ +#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$