214 lines
6.0 KiB
Typst
214 lines
6.0 KiB
Typst
|
|
#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$
|