dokument stil

This commit is contained in:
2026-04-08 16:36:46 +02:00
parent 92a171616a
commit b39e8e0a08
+213
View File
@@ -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$