diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/.gitignore b/packages/preview/ucph-nielsine-touying/0.1.3/.gitignore
new file mode 100644
index 0000000000..9cf6416ae3
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/.gitignore
@@ -0,0 +1 @@
+assets/fonts
\ No newline at end of file
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/CHANGELOG.md b/packages/preview/ucph-nielsine-touying/0.1.3/CHANGELOG.md
new file mode 100644
index 0000000000..5c7ed0e590
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/CHANGELOG.md
@@ -0,0 +1,84 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+
+Migration guide from v0.1.X
+
+
+
+
+
+### Added
+
+### Changed
+
+### Deprecated
+
+### Removed
+
+### Fixed
+
+### Security
+
+## [0.1.3] - 2026-03-13
+
+### Changed
+- Bumped `Touying` version to 0.6.3.
+- Exposed `header-block-size` & `header-block-text-size` to user
+- Increased default `header-block-size` & `header-block-text-size`
+- Removed Fira Math as default math font
+
+## [0.1.2] - 2025-10-28
+
+### Changed
+- [Works with `typst` 0.14.0].
+- Updated optional dependencies (`theorion`).
+
+### Fixed
+- No bold text for current section.
+- White cite color in heading, blue in main text.
+
+## [0.1.1] - 2025-07-21
+
+### Added
+- logos.typ
+- Examples with `pinit`and `theorion`.
+- Language option - `en` or `dk` -> changes logo on `uc.focus-slide()` to Danish/English version.
+
+### Changed
+- Default font to [*Fira Sans*](https://fonts.google.com/specimen/Fira+Sans) and [*Fira Math*](https://github.com/firamath/firamath).
+- Screenshots of template.
+- Logos are no longer included under `/assets`-folder in template, but are accessed as `uc.logos.seal`.
+- Color scheme: Secondary color is UCPH-medium gray.
+
+### Fixed
+- Issue with heading (#1): Could not write in **BOLD**.
+
+## [0.1.0] - 2025-07-03
+
+### Added
+
+
+- Based on the `metropolis` Touying theme
+- Adapted to fit the styling of University of Copenhagen
+- Section links in the footer
+- Exposing more custom options for the user than originally available
+
+
+
+[Unreleased]: https://github.com/jorgenhost/ucph-nielsine-touying/compare/v0.1.0...HEAD
+[0.1.0]: https://github.com/jorgenhost/ucph-nielsine-touying/releases/tag/v0.1.0
+[0.1.1]: https://github.com/jorgenhost/ucph-nielsine-touying/releases/tag/v0.1.1
+[0.1.2]: https://github.com/jorgenhost/ucph-nielsine-touying/releases/tag/v0.1.2
+[0.1.3]: https://github.com/jorgenhost/ucph-nielsine-touying/releases/tag/v0.1.3
\ No newline at end of file
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/LICENSE b/packages/preview/ucph-nielsine-touying/0.1.3/LICENSE
new file mode 100644
index 0000000000..dcc492fa4c
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/LICENSE
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) 2025 Jørgen Baun Høst
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/README.md b/packages/preview/ucph-nielsine-touying/0.1.3/README.md
new file mode 100644
index 0000000000..94e3218741
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/README.md
@@ -0,0 +1,145 @@
+# `ucph-nielsine-touying`
+
+_This theme is **NOT** affiliated with the University of Copenhagen. The logo is the property of the University of Copenhagen._
+
+**ucph-nielsine-touying** is a [Touying](https://github.com/touying-typ/touying) theme for creating presentation slides in [Typst](https://github.com/typst/typst), adhering to the core principles of the [style guide of the University of Copenhagen, Denmark](https://designguide.ku.dk/) (Danish). It is an **unofficial** theme.
+
+This theme was partly created using components from [touying-unistra-pristine](https://github.com/spidersouris/touying-unistra-pristine) and [typslides](https://github.com/manjavacas/typslides).
+
+## Getting Started
+
+These instructions will get you a copy of the project up and running on the typst web app.
+
+```typ
+#import "@preview/ucph-nielsine-touying:0.1.3" as uc
+#import "@preview/touying:0.6.3" as ty
+
+// Font settings
+#set text(font: "Fira Sans", weight: "light")
+
+#show: uc.ucph-metropolis-theme.with(
+ language: "en", // or "dk"
+ ty.config-info(
+ title: [Title],
+ subtitle: [Subtitle],
+ author: [Authors],
+ date: datetime.today(),
+ institution: [University of Copenhagen],
+ logo: uc.logos.seal,
+ ),
+)
+
+#uc.title-slide()
+
+= First section
+== First slide
+Wow, this is a slide.
+
+#uc.focus-slide("Wake up!")
+```
+
+
+
+
+
+
+
+## Usage
+
+Configuration is done via `Touying`'s `config-xxx` options which is then passed to the `ucph-metropolis` function. It is strongly recommended to explore the [documentation](https://touying-typ.github.io/) of the `touying` package to learn more about the core functionality that this template is built around. This includes, but is not limited to, bibliography/references, animations and compatibility with other Typst packages like [`pinit`](https://typst.app/universe/package/pinit/) and [`theorion`](https://typst.app/universe/package/theorion/). Check out the example below to learn more about the functionality:
+
+```typ
+#import "@preview/ucph-nielsine-touying:0.1.3" as uc
+#import "@preview/theorion:0.5.0" as th
+#import th.cosmos.clouds as thc
+#import "@preview/touying:0.6.3" as ty
+#import "@preview/pinit:0.2.2" as pi
+
+// Font settings
+#set text(font: "Fira Sans", weight: "light")
+
+// Settings for theorion package
+#show: th.show-theorion
+#th.set-inherited-levels(0)
+
+#show: uc.ucph-metropolis-theme.with(language: "en", ty.config-info(
+ title: [Title],
+ subtitle: [Subtitle],
+ author: [Authors],
+ date: datetime.today(),
+ institution: [University of Copenhagen],
+ logo: uc.logos.seal,
+))
+
+#uc.title-slide()
+
+
+= First section
+
+== First slide
+_Wow, this is a slide._
+
+#cite(, form: "prose") proposed a model to describe segregation dynamics that has a striking proposition: Despite "tolerant" attitudes towards people of different types, patterns of segregation will still persist.
+
+= Examples
+== Example: `pinit`
+The music experience has been #pi.pin(1)cancelled#pi.pin(2).
+
+#pi.pinit-highlight(1, 2)
+
+#pi.pinit-point-from(2)[This quote is from the Severance TV-show]
+
+
+== Example: `theorion`
+#thc.definition()[
+ The OLS estimator
+ $
+ hat(bold(beta)) = (bold(X)^T bold(X))^(-1) bold(X)^T bold(y)
+ $
+]
+#th.important-block(fill: uc.colors.ucph-dark.red)[
+ - This is very important.
+ - Remember this.
+]
+#thc.theorem()[
+ #lorem(5)
+]
+#thc.proposition()[
+ #lorem(5)
+]
+
+#let my-gradient = gradient.linear(uc.colors.ucph-dark.red, uc.colors.ucph-dark.blue, angle: 45deg)
+
+#uc.focus-slide(fill: my-gradient)[
+ Please pay attention!
+]
+
+== References
+#set text(size: 14pt)
+#bibliography("bibliography.bib", style: "harvard-cite-them-right", title: none)
+```
+A more extensive example of the slide template is available [here](https://github.com/jorgenhost/ucph-nielsine-touying/tree/main/examples).
+
+
+
+
+
+
+## Working locally
+Follow the initial steps from the official [repo](https://github.com/typst/typst) to install Typst on your machine. Open your terminal and type:
+
+```
+typst init @preview/ucph-nielsine-touying
+```
+This will create a directory with the template name on your current path. Note that you may need to install the [Fira Sans](https://fonts.google.com/specimen/Fira+Sans) font used in this template.
+
+## Development
+Clone the following repository:
+
+```
+$ git clone https://github.com/jorgenhost/ucph-nielsine-touying
+$ cd ucph-nielsine-touying
+```
+
+## Why "nielsine"?
+On Friday, January 23, 1885, Nielsine Nielsen made history in Denmark by becoming the first woman to earn a degree in medicine and the nation's first female academic. The reply (by royal decree) to her application read: _"Women are hereby allowed to obtain an academic degree at the University of Copenhagen."_ That is pretty cool. Read more [here](https://news.ku.dk/nielsine-nielsen/).
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide1.png b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide1.png
new file mode 100644
index 0000000000..adb8d897c0
Binary files /dev/null and b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide1.png differ
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide2.png b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide2.png
new file mode 100644
index 0000000000..c65224ae33
Binary files /dev/null and b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide2.png differ
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide3.png b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide3.png
new file mode 100644
index 0000000000..ea76b7de5e
Binary files /dev/null and b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide3.png differ
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide4.png b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide4.png
new file mode 100644
index 0000000000..532eaed7e8
Binary files /dev/null and b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide4.png differ
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide5.png b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide5.png
new file mode 100644
index 0000000000..d6eb763e06
Binary files /dev/null and b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide5.png differ
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide6.png b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide6.png
new file mode 100644
index 0000000000..105a848fae
Binary files /dev/null and b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide6.png differ
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide7.png b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide7.png
new file mode 100644
index 0000000000..a844029582
Binary files /dev/null and b/packages/preview/ucph-nielsine-touying/0.1.3/assets/slide7.png differ
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/thumbnail.png b/packages/preview/ucph-nielsine-touying/0.1.3/assets/thumbnail.png
new file mode 100644
index 0000000000..b896c5c0d1
Binary files /dev/null and b/packages/preview/ucph-nielsine-touying/0.1.3/assets/thumbnail.png differ
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-negative-dk.svg b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-negative-dk.svg
new file mode 100644
index 0000000000..49330aeabf
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-negative-dk.svg
@@ -0,0 +1,1500 @@
+
+
+
+
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-negative.svg b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-negative.svg
new file mode 100644
index 0000000000..d7910ed869
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-negative.svg
@@ -0,0 +1,1514 @@
+
+
+
+
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-seal-negative.svg b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-seal-negative.svg
new file mode 100644
index 0000000000..b3b4cb52d1
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-seal-negative.svg
@@ -0,0 +1,1186 @@
+
+
+
+
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-seal.svg b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-seal.svg
new file mode 100644
index 0000000000..40f0f337c7
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-seal.svg
@@ -0,0 +1,1186 @@
+
+
+
+
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-standard-dk.svg b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-standard-dk.svg
new file mode 100644
index 0000000000..a6ed4e8480
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-standard-dk.svg
@@ -0,0 +1,1513 @@
+
+
+
+
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-standard.svg b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-standard.svg
new file mode 100644
index 0000000000..5810b002b8
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/assets/ucph-1-standard.svg
@@ -0,0 +1,1527 @@
+
+
+
+
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/src/colors.typ b/packages/preview/ucph-nielsine-touying/0.1.3/src/colors.typ
new file mode 100644
index 0000000000..83cd137a42
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/src/colors.typ
@@ -0,0 +1,91 @@
+// Taken from https://designguide.ku.dk/download/ku_farvepalet_rgb.pdf
+
+#let white = rgb("ffffff")
+
+#let ucph-dark = (
+ red: rgb("901a1E"),
+ blue: rgb("122947"),
+ petroleum: rgb("0a5963"),
+ green: rgb("39641c"),
+ grey: rgb("3d3d3d"),
+ white: white,
+)
+
+#let ucph-medium = (
+ red: rgb("c73028"),
+ blue: rgb("425570"),
+ petroleum: rgb("197f8e"),
+ green: rgb("4b8325"),
+ grey: rgb("666666"),
+ champagne: rgb("fefaf2"),
+)
+
+#let ucph-light = (
+ red: rgb("dB3B0A"),
+ blue: rgb("bac7d9"),
+ petroleum: rgb("b7d7de"),
+ green: rgb("becaa8"),
+ grey: rgb("e1dfdf"),
+ yellow: rgb("ffbd38"),
+)
+
+#let gradient-darks = gradient.linear(
+ ucph-dark.red,
+ ucph-dark.blue,
+ ucph-dark.petroleum,
+ ucph-dark.green,
+ ucph-dark.green,
+ ucph-dark.grey,
+)
+
+#let gradient-medium = gradient.linear(
+ ucph-medium.red,
+ ucph-medium.blue,
+ ucph-medium.petroleum,
+ ucph-medium.green,
+ ucph-medium.green,
+ ucph-medium.grey,
+)
+
+#let gradient-light = gradient.linear(
+ ucph-light.red,
+ ucph-light.blue,
+ ucph-light.petroleum,
+ ucph-light.green,
+ ucph-light.green,
+ ucph-light.yellow,
+)
+
+
+#let palette-box(color, name, text-color: black) = {
+ rect(width: 7em, height: 6em, fill: color, inset: 1em, text(fill: text-color, size: 14pt, [
+ #name\
+ #color.to-hex()
+ ]))
+}
+
+#let show-color-pallette() = {
+ grid(
+ columns: 5,
+ rows: 3,
+ palette-box(ucph-dark.red, "Dark red", text-color: white),
+ palette-box(ucph-dark.blue, "Dark blue", text-color: white),
+ palette-box(ucph-dark.petroleum, "Dark petroleum", text-color: white),
+ palette-box(ucph-dark.green, "Dark green", text-color: white),
+ palette-box(ucph-dark.grey, "Dark grey", text-color: white),
+
+ palette-box(ucph-medium.red, "Red", text-color: white),
+ palette-box(ucph-medium.blue, "Blue", text-color: white),
+ palette-box(ucph-medium.petroleum, "Petroleum", text-color: white),
+ palette-box(ucph-medium.green, "Green", text-color: white),
+ palette-box(ucph-medium.grey, "Grey", text-color: white),
+
+ palette-box(ucph-light.red, "Light red", text-color: white),
+ palette-box(ucph-light.blue, "Light blue"),
+ palette-box(ucph-light.petroleum, "Light petroleum"),
+ palette-box(ucph-light.green, "Light green"),
+ palette-box(ucph-light.grey, "Light grey"),
+ )
+}
+
+
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/src/lib.typ b/packages/preview/ucph-nielsine-touying/0.1.3/src/lib.typ
new file mode 100644
index 0000000000..ed8097438d
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/src/lib.typ
@@ -0,0 +1,4 @@
+#import "colors.typ": *
+#import "ucph-metropolis.typ": *
+#import "utils.typ": *
+#import "logos.typ": *
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/src/logos.typ b/packages/preview/ucph-nielsine-touying/0.1.3/src/logos.typ
new file mode 100644
index 0000000000..c5bc041bdf
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/src/logos.typ
@@ -0,0 +1,18 @@
+// Save logos
+#let logo-seal-path = "../assets/ucph-1-seal.svg"
+#let logo-seal-negative-path = "../assets/ucph-1-seal-negative.svg"
+#let logo-standard-path = "../assets/ucph-1-standard.svg"
+#let logo-standard-negative = "../assets/ucph-1-negative.svg"
+#let logo-standard-dk = "../assets/ucph-1-standard-dk.svg"
+#let logo-standard-dk-negative = "../assets/ucph-1-negative-dk.svg"
+
+#let logos = (
+ seal: image(logo-seal-path),
+ seal-negative: image(logo-seal-negative-path),
+ standard: image(logo-standard-path),
+ standard-negative: image(logo-standard-negative),
+ standard-dk: image(logo-standard-dk),
+ standard-dk-negative: image(logo-standard-dk-negative),
+)
+
+#let logo-height = 1.5cm
\ No newline at end of file
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/src/ucph-metropolis.typ b/packages/preview/ucph-nielsine-touying/0.1.3/src/ucph-metropolis.typ
new file mode 100644
index 0000000000..5afe5773b6
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/src/ucph-metropolis.typ
@@ -0,0 +1,373 @@
+// This theme is inspired by https://github.com/matze/mtheme
+// The origin code was written by https://github.com/Enivex
+
+#import "@preview/touying:0.6.3" as ty
+#import "colors.typ" as colors
+#import "utils.typ" as uc-utils
+#import "logos.typ" as uc-logos
+/// Default slide function for the presentation.
+///
+/// - title (string): The title of the slide. Default is `auto`.
+///
+/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For several configurations, you can use `utils.merge-dicts` to merge them.
+///
+/// - repeat (int, string): The number of subslides. Default is `auto`, which means touying will automatically calculate the number of subslides.
+///
+/// The `repeat` argument is necessary when you use `#slide(repeat: 3, self => [ .. ])` style code to create a slide. The callback-style `uncover` and `only` cannot be detected by touying automatically.
+///
+/// - setting (function): The setting of the slide. You can use it to add some set/show rules for the slide.
+///
+/// - composer (function, array): The composer of the slide. You can use it to set the layout of the slide.
+///
+/// For example, `#slide(composer: (1fr, 2fr, 1fr))[A][B][C]` to split the slide into three parts. The first and the last parts will take 1/4 of the slide, and the second part will take 1/2 of the slide.
+///
+/// If you pass a non-function value like `(1fr, 2fr, 1fr)`, it will be assumed to be the first argument of the `components.side-by-side` function.
+///
+/// The `components.side-by-side` function is a simple wrapper of the `grid` function. It means you can use the `grid.cell(colspan: 2, ..)` to make the cell take 2 columns.
+///
+/// For example, `#slide(composer: 2)[A][B][#grid.cell(colspan: 2)[Footer]]` will make the `Footer` cell take 2 columns.
+///
+/// If you want to customize the composer, you can pass a function to the `composer` argument. The function should receive the contents of the slide and return the content of the slide, like `#slide(composer: grid.with(columns: 2))[A][B]`.
+///
+/// - bodies (array): The contents of the slide. You can call the `slide` function with syntax like `#slide[A][B][C]` to create a slide.
+#let slide(
+ title: auto,
+ align: auto,
+ config: (:),
+ repeat: auto,
+ setting: body => body,
+ composer: auto,
+ ..bodies,
+) = ty.touying-slide-wrapper(self => {
+ if align != auto {
+ self.store.align = align
+ }
+ let header(self) = {
+ set std.align(top)
+ show: ty.components.cell.with(fill: self.colors.secondary, inset: 1em, height: self.store.header-block-size)
+ set std.align(horizon)
+ set text(fill: self.colors.neutral-lightest, weight: "medium", size: self.store.header-text-size)
+ show cite: it => {
+ show regex("\d{4}"): set text(white)
+ it
+ }
+
+ ty.components.left-and-right(
+ {
+ if title != auto {
+ ty.utils.fit-to-width(grow: false, 100%, title)
+ } else {
+ ty.utils.call-or-display(self, self.store.header)
+ }
+ },
+ ty.utils.call-or-display(self, self.store.header-right),
+ )
+ }
+ let footer(self) = {
+ set std.align(bottom)
+ set text(size: 14pt)
+ pad(.5em, ty.components.left-and-right(
+ text(fill: self.colors.neutral-darkest.lighten(40%), ty.utils.call-or-display(self, self.store.footer)),
+ text(fill: self.colors.neutral-darkest, ty.utils.call-or-display(self, self.store.footer-right)),
+ ))
+ if self.store.footer-progress {
+ place(bottom, ty.components.progress-bar(height: 2pt, self.colors.primary, self.colors.primary-light))
+ }
+ }
+ let self = ty.utils.merge-dicts(self, ty.config-page(
+ fill: self.colors.neutral-lightest,
+ header: header,
+ footer: footer,
+ ), config)
+ let new-setting = body => {
+ show: std.align.with(self.store.align)
+ set text(fill: self.colors.neutral-darkest)
+ show: setting
+ body
+ }
+ ty.touying-slide(self: self, config: config, repeat: repeat, setting: new-setting, composer: composer, ..bodies)
+})
+
+
+/// Title slide for the presentation. You should update the information in the `config-info` function. You can also pass the information directly to the `title-slide` function.
+///
+/// Example:
+///
+/// ```typst
+/// #import "@preview/ucph-nielsine-slides:0.1.2" as uc
+/// #show: ucph-metropolis-theme.with(
+/// config-info(
+/// title: [Title],
+/// logo: uc.logos.seal,
+/// ),
+/// )
+///
+/// #uc.title-slide()
+/// ```
+///
+/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For several configurations, you can use `utils.merge-dicts` to merge them.
+///
+/// - extra (string, none): The extra information you want to display on the title slide.
+#let title-slide(
+ config: (:),
+ extra: none,
+ ..args,
+) = ty.touying-slide-wrapper(self => {
+ self = ty.utils.merge-dicts(self, ty.config-common(freeze-slide-counter: true), ty.config-page(
+ fill: self.colors.neutral-lightest,
+ ), config)
+ let info = self.info + args.named()
+ let body = {
+ set text(fill: self.colors.neutral-darkest)
+ set std.align(horizon)
+ block(width: 100%, inset: 2em, {
+ ty.components.left-and-right(
+ {
+ text(size: 1.3em, text(weight: "medium", info.title))
+ if info.subtitle != none {
+ linebreak()
+ text(size: 0.9em, info.subtitle)
+ }
+ },
+ text(2em, ty.utils.call-or-display(self, info.logo)),
+ )
+ line(length: 100%, stroke: .05em + self.colors.primary)
+ set text(size: .8em)
+ if info.author != none {
+ block(spacing: 1em, info.author)
+ }
+ if info.date != none {
+ block(spacing: 1em, ty.utils.display-info-date(self))
+ }
+ set text(size: .8em)
+ if info.institution != none {
+ block(spacing: 1em, info.institution)
+ }
+ if extra != none {
+ block(spacing: 1em, extra)
+ }
+ })
+ }
+ ty.touying-slide(self: self, body)
+})
+
+
+/// New section slide for the presentation. You can update it by updating the `new-section-slide-fn` argument for `ty.config-common` function.
+///
+/// Example: `ty.config-common(new-section-slide-fn: new-section-slide.with(numbered: false))`
+///
+/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For several configurations, you can use `utils.merge-dicts` to merge them.
+///
+/// - level (int): The level of the heading.
+///
+/// - numbered (boolean): Indicates whether the heading is numbered.
+///
+/// - body (auto): The body of the section. It will be passed by touying automatically.
+#let new-section-slide(config: (:), level: 1, numbered: true, body) = ty.touying-slide-wrapper(self => {
+ let slide-body = {
+ set std.align(horizon)
+ show: pad.with(20%)
+ set text(size: 1.5em)
+ stack(
+ dir: ttb,
+ spacing: 1em,
+ text(self.colors.neutral-darkest, ty.utils.display-current-heading(
+ level: level,
+ numbered: numbered,
+ style: auto,
+ )),
+ block(height: 2pt, width: 100%, spacing: 0pt, ty.components.progress-bar(
+ height: 2pt,
+ self.colors.primary,
+ self.colors.primary-light,
+ )),
+ )
+ text(self.colors.neutral-dark, body)
+ }
+ self = ty.utils.merge-dicts(self, ty.config-page(fill: self.colors.neutral-lightest), config)
+ ty.touying-slide(self: self, config: config, slide-body)
+})
+
+
+/// Focus on some content.
+///
+/// Example: `#focus-slide[Wake up!]`
+///
+/// - config (dictionary): The configuration of the slide. You can use `config-xxx` to set the configuration of the slide. For several configurations, you can use `utils.merge-dicts` to merge them.
+///
+/// - align (alignment): The alignment of the content. Default is `horizon + center`.
+#let focus-slide(
+ config: (:),
+ align: horizon + center,
+ fill: colors.ucph-dark.red,
+ body,
+) = ty.touying-slide-wrapper(self => {
+ self = ty.utils.merge-dicts(self, ty.config-common(freeze-slide-counter: true), ty.config-page(
+ fill: fill,
+ margin: 2em,
+ footer: if self.store.language == "en" {
+ place(right, image(uc-logos.logo-standard-negative, width: 14%), dx: -15pt, dy: -8pt)
+ } else if self.store.language == "dk" {
+ place(right, image(uc-logos.logo-standard-dk-negative, width: 14%), dx: -15pt, dy: -8pt)
+ },
+ ), config)
+ set text(fill: self.colors.neutral-lightest, size: 1.5em)
+ ty.touying-slide(self: self, config: config, std.align(align, body))
+})
+
+/// Touying metropolis theme styled to fit the University of Copenhagen.
+///
+/// The default colors:
+///
+/// ```typ
+/// ty.config-colors(
+/// primary: rgb("901a1E"), // The "default" dark red UCPH color
+/// primary-light: rgb("#d6c6b7"),
+/// secondary: rgb("666666"), // "Medium" UCPH grey
+/// neutral-lightest: rgb("#fafafa"),
+/// neutral-dark: rgb("#23373b"),
+/// neutral-darkest: rgb("#23373b"),
+/// bold-color: black
+/// )
+/// ```
+///
+/// - aspect-ratio (string): The aspect ratio of the slides. Default is `16-9`.
+///
+/// - align (alignment): The alignment of the content. Default is `horizon`.
+///
+/// - header (content, function): The header of the slide. Default is `self => utils.display-current-heading(setting: utils.fit-to-width.with(grow: false, 100%), depth: self.slide-level)`.
+///
+/// - header-right (content, function): The right part of the header. Default is `self => self.info.logo`.
+///
+/// - footer (content, function): The footer of the slide. Default is `none`.
+///
+/// - footer-right (content, function): The right part of the footer. Default is `context utils.slide-counter.display() + " / " + utils.last-slide-number`.
+/// - footer-appendix-label (str): Suffix to put on the slide counter in the appendix. #link("https://github.com/spidersouris/touying-unistra-pristine/blob/8c19b94a20edbde35d06a8cb9c4fc4a1c3c8a79c/src/unistra.typ#L91-L106")[Based on] `touying-unistra-pristine`.
+/// - language (str): Specify language in the presentation. ("en" for English or "dk" for Danish currently supported)
+/// - footer-progress (boolean): Whether to show the progress. Default is `true`.
+#let ucph-metropolis-theme(
+ aspect-ratio: "16-9",
+ align: horizon,
+ language: "en",
+ header: self => ty.utils.display-current-heading(
+ setting: ty.utils.fit-to-width.with(grow: false, 100%),
+ depth: self.slide-level,
+ ),
+ header-block-size: 3em,
+ header-text-size: 25pt,
+ header-right: self => align(right, image(uc-logos.logo-seal-path, height: self.store.header-block-size*0.55)),
+ footer: self => uc-utils.section-links(self),
+ footer-right: self => uc-utils.slide-counter-label(self),
+ footer-progress: true,
+ footer-appendix-label: "A-",
+ ..args,
+ body,
+) = {
+ set text(size: 18pt, lang: language)
+ show cite: it => {
+ show regex("\d{4}"): set text(blue)
+ it
+ }
+
+ show: ty.touying-slides.with(
+ ty.config-page(..ty.utils.page-args-from-aspect-ratio(aspect-ratio), header-ascent: 30%, footer-descent: 30%, margin: (
+ top: 3em,
+ bottom: 1.5em,
+ x: 2em,
+ )),
+ ty.config-common(
+ slide-fn: slide,
+ new-section-slide-fn: new-section-slide,
+ ),
+ ty.config-methods(alert: uc-utils.alert-bold-color),
+ ty.config-colors(
+ primary: colors.ucph-dark.red,
+ primary-light: rgb("#d6c6b7"),
+ secondary: colors.ucph-medium.grey,
+ neutral-lightest: rgb("#fafafa"),
+ neutral-dark: rgb("#23373b"),
+ neutral-darkest: rgb("#23373b"),
+ bold-color: black,
+ ),
+ // save the variables for later use
+ ty.config-store(
+ language: language,
+ align: align,
+ header-block-size: header-block-size,
+ header-text-size: header-text-size,
+ header: header,
+ header-right: header-right,
+ footer: footer,
+ footer-right: footer-right,
+ footer-progress: footer-progress,
+ footer-appendix-label: footer-appendix-label,
+ ),
+ ..args,
+ )
+
+ body
+}
+
+/// A highlighted text box to emphasize a point. No numbering.
+/// Based on #link("https://github.com/manjavacas/typslides/blob/a43e27b2cc69bf423fc25b4c140838d646975217/typslides.typ#L75-L130")[typslides].
+///
+/// - title (str): Title for text box. Default `none`.
+/// - back-color (color): Text box background color. Default `rgb("FBF7EE")`.
+/// - framed-color (color): Title background color. Default `rgb("#23373b")`.
+/// - block-width (ratio): Width of block/text-box
+/// - content (content): Content to render in text box.
+#let framed(
+ title: none,
+ back-color: rgb("FBF7EE"),
+ framed-color: rgb("#23373b"),
+ block-width: 100%,
+ content,
+) = (
+ context {
+ let w = auto
+ set block(
+ inset: (x: .6cm, y: .6cm),
+ breakable: false,
+ above: .1cm,
+ below: .1cm,
+ )
+ if title != none {
+ stack(
+ block(
+ fill: if framed-color == none { theme-color.get() } else { framed-color },
+ inset: (x: .6cm, y: .55cm),
+ radius: (top: .2cm, bottom: 0cm),
+ stroke: 2pt,
+ width: block-width,
+ )[
+ #text(weight: "semibold", fill: white)[#title]
+ ],
+ block(
+ fill: {
+ if back-color != none {
+ back-color
+ } else {
+ white
+ }
+ },
+ width: block-width, // Set width directly on this block
+ radius: (top: 0cm, bottom: .2cm),
+ stroke: 2pt,
+ content,
+ ),
+ )
+ } else {
+ stack(block(
+ width: block-width,
+ fill: if back-color != none {
+ back-color
+ } else {
+ rgb("FBF7EE")
+ },
+ radius: (top: .2cm, bottom: .2cm),
+ stroke: 2pt,
+ content,
+ ))
+ }
+ }
+)
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/src/utils.typ b/packages/preview/ucph-nielsine-touying/0.1.3/src/utils.typ
new file mode 100644
index 0000000000..71f9898456
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/src/utils.typ
@@ -0,0 +1,67 @@
+#import "@preview/touying:0.6.3" as ty
+
+// Helper function to get current section number
+#let get-current-section() = {
+ let current = ty.utils.current-heading(level: 1)
+
+ if current == none {
+ return 0
+ }
+
+ // Find its index in the list of sections
+ let sections = query(heading.where(level: 1))
+ for (i, section) in sections.enumerate() {
+ if section == current {
+ return i + 1
+ }
+ }
+
+ 0
+}
+
+// Add this helper function to generate section links
+#let section-links(self) = {
+ context {
+ let sections = query(heading.where(level: 1))
+ let current-section = get-current-section()
+
+ if sections.len() == 0 {
+ return []
+ }
+
+ sections
+ .enumerate()
+ .map(((i, section)) => {
+ let is-current = (i + 1) == current-section
+ let link-text = if is-current {
+ text(weight: "bold", fill: self.colors.neutral-darkest.lighten(45%), section.body, size: 12pt)
+ } else {
+ text(fill: self.colors.neutral-darkest.lighten(30%), section.body, size: 12pt)
+ }
+
+ // Create a clickable link to the section
+ link(section.location(), link-text)
+ })
+ .join(text(fill: self.colors.neutral-darkest.lighten(50%), " | "))
+ }
+}
+
+// Slide counter
+#let slide-counter-label(self) = context {
+ let current = int(ty.utils.slide-counter.display())
+ let last = int(ty.utils.last-slide-counter.display())
+
+ // This works because Touying freezes the slide counter in the appendix
+ if current > last {
+ text(self.store.footer-appendix-label, style: "italic") + str(current)
+ } else {
+ ty.utils.slide-counter.display() + " / " + ty.utils.last-slide-number
+ }
+}
+
+/// Alert content with a primary or self-specified color.
+///
+/// Example: `config-methods(alert: ty.utils.alert-with-primary-color)`
+///
+/// -> content
+#let alert-bold-color(self: none, body) = text(fill: self.colors.bold-color, body)
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/template/bibliography.bib b/packages/preview/ucph-nielsine-touying/0.1.3/template/bibliography.bib
new file mode 100644
index 0000000000..80d9191ae5
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/template/bibliography.bib
@@ -0,0 +1,10 @@
+@article{schelling1971dynamic,
+ title={Dynamic models of segregation},
+ author={Schelling, Thomas C},
+ journal={Journal of mathematical sociology},
+ volume={1},
+ number={2},
+ pages={143--186},
+ year={1971},
+ publisher={Taylor \& Francis}
+}
\ No newline at end of file
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/template/main.typ b/packages/preview/ucph-nielsine-touying/0.1.3/template/main.typ
new file mode 100644
index 0000000000..fe10787ed7
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/template/main.typ
@@ -0,0 +1,90 @@
+#import "@preview/ucph-nielsine-touying:0.1.3" as uc
+#import "@preview/touying:0.6.3" as ty
+#import "@preview/theorion:0.5.0" as th
+#import th.cosmos.clouds as thc
+
+// Font settings
+#set text(font: "Fira Sans", weight: "light")
+
+// Settings for theorion package
+#show: th.show-theorion
+#th.set-inherited-levels(0)
+
+#show: uc.ucph-metropolis-theme.with(
+ language: "en", // or "dk"
+ ty.config-info(
+ title: [Title],
+ subtitle: [Subtitle],
+ author: [Authors],
+ date: datetime.today(),
+ institution: [University of Copenhagen],
+ logo: uc.logos.seal,
+ ),
+)
+
+#uc.title-slide()
+
+// If you want a table of contents
+// #ty.components.adaptive-columns(outline(indent: 1em))
+
+= First section
+== First slide
+Wow, this is a slide.
+
+= Examples
+== Example with `theorion`: OLS estimator
+#thc.definition()[
+ The OLS estimator
+ $
+ hat(bold(beta)) = (bold(X)^T bold(X))^(-1) bold(X)^T bold(y)
+ $
+]
+#th.important-block(fill: uc.colors.ucph-dark.red)[
+ - This is very important.
+ - Remember this.
+]
+== Third slide
+#uc.slide(align: center + horizon, composer: (1fr, 1fr))[
+ First column.
+][
+ Second column. #cite(, form: "prose")#footnote("a footnote")
+]
+
+// A "focus" slide that is colored according to the primary color
+#uc.focus-slide([
+ Wake up!
+])
+
+// You can change the coloring to be gradient of UCPH colors instead
+
+#let my-gradient = gradient.linear(uc.colors.ucph-dark.red, uc.colors.ucph-dark.blue, angle: 45deg)
+#uc.focus-slide(
+ [
+ Wake up with a gradient!
+ ],
+ fill: my-gradient,
+)
+
+= Colors
+== Color scheme
+Colors of the University of Copenhagen can be retrieved by specifying:
+```typ
+#import "@preview/ucph-nielsine-touying:0.1.3" as uc
+// Darks
+uc.colors.ucph-dark.red // the default dark red color of UCPH
+// Medium
+uc.colors.ucph-medium // ...
+// Light
+uc.colors.ucph-light // ...
+
+```
+#pagebreak()
+
+#align(center, uc.show-color-pallette())
+
+
+== References
+#uc.slide[
+#set text(size: 14pt)
+#bibliography("bibliography.bib", style: "harvard-cite-them-right", title: none)
+]
\ No newline at end of file
diff --git a/packages/preview/ucph-nielsine-touying/0.1.3/typst.toml b/packages/preview/ucph-nielsine-touying/0.1.3/typst.toml
new file mode 100644
index 0000000000..ca8fb048fd
--- /dev/null
+++ b/packages/preview/ucph-nielsine-touying/0.1.3/typst.toml
@@ -0,0 +1,26 @@
+[package]
+name = "ucph-nielsine-touying"
+version = "0.1.3"
+entrypoint = "src/lib.typ"
+authors = ["Jørgen Baun Høst "]
+license = "MIT"
+description = "Slide template built on Touying for the University of Copenhagen."
+repository = "https://github.com/jorgenhost/ucph-nielsine-touying"
+keywords = ["presentation", "slide", "slides", "touying", "ucph", "copenhagen", "ku", "københavn", "university of copenhagen"]
+categories = ["presentation"]
+compiler = "0.13.1"
+exclude = [
+ ".github",
+ "scripts",
+ ".typstignore",
+ "Justfile",
+ "examples",
+ "assets/slide*.png",
+ "examples/*.pdf",
+ "template/*.pdf"
+]
+
+[template]
+path = "template"
+entrypoint = "main.typ"
+thumbnail = "assets/thumbnail.png"
\ No newline at end of file