diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/LICENSE b/packages/preview/paris-saclay-thesis-flat/1.0.2/LICENSE
new file mode 100644
index 000000000..f5c3313bc
--- /dev/null
+++ b/packages/preview/paris-saclay-thesis-flat/1.0.2/LICENSE
@@ -0,0 +1,18 @@
+MIT No Attribution
+
+Copyright 2025 Sébastien Mestrallet
+
+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.
+
+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/paris-saclay-thesis-flat/1.0.2/README.md b/packages/preview/paris-saclay-thesis-flat/1.0.2/README.md
new file mode 100644
index 000000000..795d52cdd
--- /dev/null
+++ b/packages/preview/paris-saclay-thesis-flat/1.0.2/README.md
@@ -0,0 +1,125 @@
+# The `paris-saclay-thesis-flat` Typst package
+
+An unofficial, flat-design Typst template for Paris-Saclay University theses
+
+[![Maintenance Level: Actively Maintained](https://badgen.net/badge/Maintenance%20Level/Actively%20Maintained?color=97ca00)](https://gist.github.com/cheerfulstoic/d107229326a01ff0f333a1d3476e068d)
+
+
+
+
+
+
+
+About the name
+
+- `typst-paris-saclay-thesis-flat` is the name of the GitHub repo, `paris-saclay-thesis-flat` is the name of the Typst template
+- The Typst template name does not contain `typst`, because it is redundant[^typst_template_naming]
+- The Typst template name is not just `paris-saclay-thesis`, because it is not an official template[^typst_template_naming]. I got rid of the ugly white gradients in the vertical banner, so here is a flat-design version (was accepted by the university library for my thesis).
+
+[^typst_template_naming]: https://github.com/typst/packages?tab=readme-ov-file#submission-guidelines
+
+
+
+## Usage
+
+
+
+You can use this template in the [Typst web app](https://typst.app/) by clicking "Start from template" on the dashboard and searching for `paris-saclay-thesis-flat`.
+
+Alternatively, you can use the CLI to kick this project off using the command:
+```bash
+typst init @preview/paris-saclay-thesis-flat
+cd paris-saclay-thesis-flat
+```
+
+Then download the _Segoe UI This_ font, e.g. from [here](https://font.download/font/segoe-ui-this), and place the .ttf files e.g. in a `fonts/` subfolder.
+
+If you use the CLI, you must tell the binary where to look for additional fonts with the `--font-path` argument:
+```bash
+typst watch main.typ --font-path fonts
+```
+
+And if you use [VS Code](https://code.visualstudio.com/) and [tinymist](https://github.com/Myriad-Dreamin/tinymist), set `["${workspaceFolder}/fonts"]` for `tinymist.fontPaths` in VS Code settings.
+
+In the web app, [project fonts are automatically discovered](https://typst.app/docs/reference/text/text/#parameters-font).
+
+## Configuration
+
+This template exports the `paris-saclay-thesis` function with the following named arguments:
+- `candidate-name`: Name of the PhD candidate [type: content]
+- `title-fr`: Thesis title in French [content]
+- `title-en`: Translated thesis title, in English [content]
+- `keywords-fr`: Keywords of the thesis subject, in French [strings array]
+- `keywords-en`: Translated keywords of the thesis subject, in English [strings array]
+- `abstract-fr`: Abstract of the thesis, in French [content]
+- `abstract-en`: Translated abstract of the thesis, in English [content]
+- `NNT`: National thesis number [content]
+- `doctoral-school`: Line mentioning the doctoral school [content]
+- `doctoral-school-code`: Short code of the doctoral school (usually the acronym) to fetch the right logo [string]
+- `specialty`: Line mentioning the specialty [content]
+- `graduate-school`: Line mentioning the graduate school [content]
+- `university-component`: Line mentioning the university component ("référent") [content]
+- `research-unit-and-advisors`: Paragraph mentioning the research unit and the PhD advisors [content]
+- `defense-date`: Date of the PhD defense [content]
+- `thesis-examiners`: List of thesis examiners [array of dictionaries, each with a `name`, `title` and `status` field, of type content]
+
+Some spacings are adjustable, see [`src/lib.typ`](src/lib.typ) for the complete list of arguments.
+
+The template will initialize your package with a sample call to the `paris-saclay-thesis` function in a show rule. If you want to change an existing project to use this template, you can add a show rule like this at the top of your file:
+
+```typst
+#import "@preview/paris-saclay-thesis-flat:1.0.2": paris-saclay-thesis
+
+#show: paris-saclay-thesis.with(
+ candidate-name: [Frodon Sacquet],
+ title-fr: [Propriétés et conséquences psychiques, magiques et géopoliques du métal Au lorsque forgé en Anneau Unique],
+ title-en: [Properties and psychic, magical and geopolitical consequences of Au metal when forged into the One Ring],
+ keywords-fr: ("Or", "montagne du Destin", "Magie occulte"),
+ keywords-en: ("Gold","Mount Doom", "Occult magic"),
+ abstract-fr: lorem(200),
+ abstract-en: lorem(200),
+ NNT: [1955UPASX000],
+ doctoral-school: [École doctorale n°573 : INTERFACES - approches interdisciplinaires,\ fondements, applications et innovation],
+ doctoral-school-code: "INTERFACES",
+ specialty: [Spécialité de doctorat : Sciences des matériaux],
+ graduate-school: [Graduate School : Physique],
+ university-component: [Référent : Faculté des sciences d'Orsay],
+ research-unit-and-advisors: [
+ Thèse préparée dans l'unité de recherche *Fondcombe*,\ sous la direction d'*Elrond*, seigneur de Fondcombe,\
+ et l'encadrement de *Gandalf*, magicien de l'ordre des Istari.
+ ],
+ defense-date: [20 octobre 1955],
+ thesis-examiners: (
+ (
+ name: [*Aragorn*],
+ title: [Roi du Gondor],
+ status: [Président]
+ ),
+ (
+ name: [*Legolas*],
+ title: [Prince des Elfes Sylvains],
+ status: [Rapporteur &\ Examinateur]
+ ),
+ (
+ name: [*Gimli*],
+ title: [Guerrier du royaume d'Erebor],
+ status: [Rapporteur &\ Examinateur]
+ ),
+ (
+ name: [*Faramir*],
+ title: [Intendant du Gondor],
+ status: [Examinateur]
+ ),
+ ),
+)
+
+// Your content goes below.
+```
+
+## Resources
+
+- [Official MS Word & LaTeX templates](https://www.universite-paris-saclay.fr/recherche/doctorat-et-hdr/le-guide-de-la-soutenance-de-doctorat#Ressources) from the Paris-Saclay University
+
+# License
+
+[MIT-0](./LICENSE)
\ No newline at end of file
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/2MIB.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/2MIB.png
new file mode 100755
index 000000000..019452140
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/2MIB.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/AAIF.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/AAIF.png
new file mode 100755
index 000000000..e8215ef76
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/AAIF.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/ABIES.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/ABIES.png
new file mode 100755
index 000000000..64af72b2a
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/ABIES.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/BIOSIGNE.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/BIOSIGNE.png
new file mode 100755
index 000000000..32f6017bf
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/BIOSIGNE.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/CBMS.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/CBMS.png
new file mode 100755
index 000000000..16a98b8ae
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/CBMS.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/DEM.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/DEM.png
new file mode 100755
index 000000000..c9e989d1c
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/DEM.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDMH.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDMH.png
new file mode 100755
index 000000000..c53049693
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDMH.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDOM.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDOM.png
new file mode 100755
index 000000000..4feb475d7
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDOM.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDSP.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDSP.png
new file mode 100755
index 000000000..251d8651c
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EDSP.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EOBE.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EOBE.png
new file mode 100755
index 000000000..fa374f8fb
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/EOBE.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/INTERFACES.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/INTERFACES.png
new file mode 100755
index 000000000..533f433ce
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/INTERFACES.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/ITFA.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/ITFA.png
new file mode 100755
index 000000000..10b51216d
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/ITFA.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/PHENIICS.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/PHENIICS.png
new file mode 100755
index 000000000..0485ff97d
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/PHENIICS.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/PIF.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/PIF.png
new file mode 100755
index 000000000..98d8ebfc5
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/PIF.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/README.md b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/README.md
new file mode 100644
index 000000000..a3fe08f19
--- /dev/null
+++ b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/README.md
@@ -0,0 +1 @@
+images from the official LaTex template
\ No newline at end of file
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SDSV.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SDSV.png
new file mode 100755
index 000000000..1a750d00e
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SDSV.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SEIF.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SEIF.png
new file mode 100755
index 000000000..3d56a1076
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SEIF.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SEVE.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SEVE.png
new file mode 100755
index 000000000..1f187e7e4
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SEVE.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SMEMAG.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SMEMAG.png
new file mode 100755
index 000000000..5621efe02
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SMEMAG.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SSH.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SSH.png
new file mode 100755
index 000000000..34febd12f
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SSH.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SSMMH.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SSMMH.png
new file mode 100755
index 000000000..49711ebb2
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/SSMMH.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/STIC.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/STIC.png
new file mode 100755
index 000000000..08d285407
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/STIC.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/universite-paris-saclay.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/universite-paris-saclay.png
new file mode 100644
index 000000000..5b9ce0bc0
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/img/universite-paris-saclay.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/src/lib.typ b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/lib.typ
new file mode 100644
index 000000000..3ee3fa2ca
--- /dev/null
+++ b/packages/preview/paris-saclay-thesis-flat/1.0.2/src/lib.typ
@@ -0,0 +1,311 @@
+// The main color of the Paris-Saclay University visual identity
+#let prune = rgb(99, 0, 60)
+
+// Yellow background color for highlighting
+#let yellow-highlighting = rgb("#fffd11a1") // default color of highlight() https://typst.app/docs/reference/text/highlight/#parameters-fill
+
+// An highlighted empty rectangle for missing parameters
+#let missing-field(width: 10em) = box(
+ fill: yellow-highlighting,
+ width: width,
+ height: 1em,
+ baseline: 0.2em
+)
+
+// An highlighted block for when the doctoral school logo is not selected
+#let missing-doctoral-school-logo = block(
+ height: 65pt,
+ width: 200pt,
+ fill: yellow-highlighting
+)[
+ #align(center+horizon)[
+ Logo de l'école doctorale
+ ]
+]
+
+// The function takes the whole document as `body` parameter
+// and formats it for a Paris-Saclay University thesis
+#let paris-saclay-thesis(
+
+ // The first and last names of the candidate
+ candidate-name: highlight[Prénom Nom],
+
+ // The thesis title in French
+ title-fr: highlight[Titre de la thèse],
+
+ // The translated thesis title in English
+ title-en: highlight[Title of the thesis],
+
+ // The keywords of the thesis subject, in French
+ keywords-fr: (highlight[Mot-clé 1], highlight[Mot-clé 2], highlight[Mot-clé 3]),
+
+ // The translated keywords of the thesis subject, in English
+ keywords-en: (highlight[Keyword 1], highlight[Keyword 2], highlight[Keyword 3]),
+
+ // Abstract of the thesis, in French
+ abstract-fr: highlight(lorem(200)),
+
+ // Translated abstract of the thesis, in English
+ abstract-en: highlight(lorem(200)),
+
+ // The national thesis number (NNT, Numéro National de Thèse)
+ NNT: highlight[XXXXXXXXXX],
+
+ // The line for the doctoral school number and name
+ doctoral-school: [École doctorale n°#missing-field(width: 3em) : #missing-field()],
+
+ // The short code of the doctoral school. See images filename in ./img/
+ doctoral-school-code: none,
+
+ // The line for the specialty
+ specialty: [Spécialité de doctorat : #missing-field()],
+
+ // The line for the graduate school
+ graduate-school: [Graduate School : #missing-field()],
+
+ // The line for the university component / associated university (référent)
+ university-component: [Référent : #missing-field()],
+
+ // The paragraph for the research unit and the PhD advisors
+ research-unit-and-advisors: [
+ Thèse préparée dans l'unité de recherche #missing-field(),\ sous la direction de #missing-field(), #highlight[titre du directeur de thèse],\
+ et l'encadrement de #missing-field(), #highlight[titre du co-endadrant].
+ ],
+
+ // The date of the PhD defense
+ defense-date: [#missing-field()],
+
+ // The list of thesis examiners (rapporteurs and defense examiners)
+ thesis-examiners: (
+ (
+ name: missing-field(),
+ title: missing-field(width: 25em),
+ status: highlight[Président(e)]
+ ),
+ (
+ name: missing-field(),
+ title: missing-field(width: 25em),
+ status: highlight[Rapporteur &\ Examinateur/trice]
+ ),
+ (
+ name: missing-field(),
+ title: missing-field(width: 25em),
+ status: highlight[Rapporteur &\ Examinateur/trice]
+ ),
+ (
+ name: missing-field(),
+ title: missing-field(width: 25em),
+ status: highlight[Examinateur/trice]
+ ),
+ ),
+
+ // Spacings in the first page
+ vertical-spacing-1: 15pt,
+ vertical-spacing-2: 55pt,
+ vertical-spacing-3: 40pt,
+ vertical-spacing-4: 40pt,
+ vertical-spacing-5: 40pt,
+ horizontal-spacing-1: 50pt,
+ horizontal-spacing-2: 100pt,
+
+ // The thesis content
+ body
+
+) = {
+
+ set page(
+ paper: "a4",
+ margin: (
+ left: 0pt,
+ top: 0pt,
+ bottom: 0pt,
+ right: 2.5cm
+ )
+ )
+
+ set text(
+ font: ("Segoe UI This"),
+ size: 12pt,
+ lang: "fr"
+ )
+
+ let rectangle_width = 16.4%*21cm // 16.4% of the page width
+
+ grid(
+ columns: (rectangle_width, 100%-rectangle_width),
+ gutter: 25pt,
+ [
+ #rect(
+ fill: prune,
+ width: 100%,// 100% of rectangle_width,
+ height: 100%
+ )
+
+ #place(
+ bottom+left,
+ dx: 0.1cm,
+ dy: -3cm,
+ rotate(
+ -90deg,
+ block[
+ #text(
+ fill: white,
+ size: 16pt,
+ )[
+ THESE~DE~DOCTORAT
+ ]
+ #v(0.5pt)
+ #text(
+ fill: white,
+ )[
+ NNT~:~#NNT
+ ]
+ ]
+ )
+ )
+ ],
+ [ // right part of the grid
+
+ #v(vertical-spacing-1)
+
+ #image("img/universite-paris-saclay.png", width: 25.4%*21cm)
+
+ #v(vertical-spacing-2)
+
+ #align(right)[
+ #text(
+ size: 20pt,
+ fill: prune,
+ )[
+ #title-fr
+ ]\
+ #v(2pt)
+ #text(
+ size: 13pt,
+ fill: black,
+ style: "italic"
+ )[
+ #title-en
+ ]\
+
+ #v(vertical-spacing-3)
+
+ #text(
+ size: 13pt,
+ weight: 400,
+ )[
+ *Thèse de doctorat de l’université Paris-Saclay*
+ ]
+ #v(10pt)
+ #text(
+ size: 12pt,
+ )[
+ #doctoral-school\
+ #specialty\
+ #graduate-school\
+ #university-component
+ #v(10pt)
+ #research-unit-and-advisors
+ ]
+
+ #v(vertical-spacing-4)
+
+ #text(
+ size: 11pt,
+ )[
+ *Thèse soutenue à Paris-Saclay, le #defense-date, par* \
+ ]
+
+ #text(
+ size: 20pt,
+ fill: prune,
+ weight: 600,
+ )[
+ #candidate-name
+ ]
+ ]
+
+ #v(vertical-spacing-5)
+
+ #grid(
+ columns: (horizontal-spacing-1, auto),
+ row-gutter: 1em,
+ stroke: (x,y) => if x == 1 and y == 1 { (left: (1pt + prune)) },
+ [],
+ [
+ #text(size: 14pt, fill: prune)[*Composition du jury*]\
+ #text(size: 11pt, fill: prune)[Membres du jury avec voix délibérative]
+ ],
+ [],
+ [
+ #set text(10pt)
+ #grid(
+ columns: (auto, auto),
+ column-gutter: horizontal-spacing-2,
+ inset: (x: 6pt, y: 3pt),
+ align: horizon,
+ ..for thesis-examiner in thesis-examiners {
+ (thesis-examiner.name, grid.cell(rowspan: 2)[#thesis-examiner.status], text(size: 9pt)[#thesis-examiner.title])
+ if thesis-examiner != thesis-examiners.last() {
+ ([],[])
+ }
+ }
+ )
+ ],
+ )
+ ]
+ ) // end grid
+
+ // from the second page, default margins of the A4 paper size
+ set page(
+ margin: auto
+ )
+
+ pagebreak()
+
+ if doctoral-school-code == none {
+ missing-doctoral-school-logo
+ }
+ else {
+ assert(type(doctoral-school-code) == str)
+ image("img/" + doctoral-school-code + ".png", width: 60%)
+ }
+
+ v(10pt)
+
+ grid(
+ columns: (100%),
+ rows: 2,
+ gutter: 40pt,
+ inset: 10pt,
+ stroke: 1pt+prune,
+ [
+ #set text(10pt)
+ *Titre :* #title-fr\
+ *Mots-clés :* #for keyword in keywords-fr {
+ (keyword)
+ if keyword != keywords-fr.last() {
+ (", ")
+ }
+ }\
+ #v(5pt)
+ *Résumé :* #abstract-fr
+ ],
+ [
+ #set text(10pt)
+ *Title :* #title-en\
+ *Keywords :* #for keyword in keywords-en {
+ (keyword)
+ if keyword != keywords-en.last() {
+ (", ")
+ }
+ }\
+ #v(5pt)
+ *Abstract :* #abstract-en
+ ]
+ )
+
+ pagebreak(weak: true)
+
+ body
+}
\ No newline at end of file
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/template/bib.yml b/packages/preview/paris-saclay-thesis-flat/1.0.2/template/bib.yml
new file mode 100644
index 000000000..68386a9e1
--- /dev/null
+++ b/packages/preview/paris-saclay-thesis-flat/1.0.2/template/bib.yml
@@ -0,0 +1,6 @@
+# https://github.com/typst/hayagriva/blob/main/docs/file-format.md
+
+bib:concerning-hobbits:
+ title: Concerning Hobbits
+ author: Bilbon Sacquet
+ type: book
\ No newline at end of file
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/template/main.typ b/packages/preview/paris-saclay-thesis-flat/1.0.2/template/main.typ
new file mode 100644
index 000000000..2bf288967
--- /dev/null
+++ b/packages/preview/paris-saclay-thesis-flat/1.0.2/template/main.typ
@@ -0,0 +1,268 @@
+#import "@preview/paris-saclay-thesis-flat:1.0.2": paris-saclay-thesis, prune
+
+///////////////////////////////////////////
+// 1/3 If not already done, download the
+// "Segoe UI This" font (see README)
+///////////////////////////////////////////
+
+///////////////////////////////////////////
+// 2/3 Change the value of the following
+// parameters to edit the first two pages.
+// All parameters have a default value, so
+// you can remove some to highlight which
+// ones are still missing.
+///////////////////////////////////////////
+
+#show: paris-saclay-thesis.with(
+ candidate-name: [Frodon Sacquet],
+ title-fr: [Propriétés et conséquences psychiques, magiques et géopoliques du métal Au lorsque forgé en Anneau Unique],
+ title-en: [Properties and psychic, magical and geopolitical consequences of Au metal when forged into the One Ring],
+ keywords-fr: ("Or", "montagne du Destin", "Magie occulte"),
+ keywords-en: ("Gold","Mount Doom", "Occult magic"),
+ abstract-fr: lorem(200),
+ abstract-en: lorem(200),
+ NNT: [1955UPASX000],
+ doctoral-school: [École doctorale n°573 : INTERFACES - approches interdisciplinaires,\ fondements, applications et innovation],
+ doctoral-school-code: "INTERFACES", // for the logo to insert
+ specialty: [Spécialité de doctorat : Sciences des matériaux],
+ graduate-school: [Graduate School : Physique],
+ university-component: [Référent : Faculté des sciences d'Orsay],
+ research-unit-and-advisors: [
+ Thèse préparée dans l'unité de recherche *Fondcombe*,\ sous la direction d'*Elrond*, seigneur de Fondcombe,\
+ et l'encadrement de *Gandalf*, magicien de l'ordre des Istari.
+ ],
+ defense-date: [20 octobre 1955],
+ thesis-examiners: (
+ (
+ name: [*Aragorn*],
+ title: [Roi du Gondor],
+ status: [Président]
+ ),
+ (
+ name: [*Legolas*],
+ title: [Prince des Elfes Sylvains],
+ status: [Rapporteur &\ Examinateur]
+ ),
+ (
+ name: [*Gimli*],
+ title: [Guerrier du royaume d'Erebor],
+ status: [Rapporteur &\ Examinateur]
+ ),
+ (
+ name: [*Faramir*],
+ title: [Intendant du Gondor],
+ status: [Examinateur]
+ ),
+ ),
+ // You can also adjust spacings in the first page with
+ // `vertical-spacing-1` to `vertical-spacing-5`
+ // and `horizontal-spacing-1` to `horizontal-spacing-2`
+)
+
+///////////////////////////////////////////
+// 3/3 Starting from here, the third page,
+// no formatting is imposed.
+// However here are some tweaks you
+// might like.
+///////////////////////////////////////////
+
+// Switch to a serif font family, size 11
+
+#set text(
+ font: "Libertinus Serif",
+ size: 11pt
+)
+
+// Show links in blue
+
+#show link: set text(fill: blue)
+
+// Show numbers in references (to a bibliography entry, a section, a figure) in blue
+// thanks Eric Biedert https://github.com/typst/typst/discussions/4143
+
+#show cite: it => {
+ // reference to a bibliography entry -> color only the number, not square brackets, not the potential supplement
+ show regex("\[",): set text(fill: black) // enforce square brackets in black
+ show regex("^\[(\d+)",): set text(fill: blue) // only the first number, in case there is a number in the supplement
+ it
+}
+#show ref: it => {
+ if it.element == none {
+ // reference to a bibliography entry -> manage by `#show cite` above
+ return it
+ }
+ // reference to a section or a figure
+ show regex("[\d]+[\.]?[\d]*[\.]?[\d]*"): set text(fill: blue) // find something like "1", "1.2" or "1.3"
+ it
+}
+
+// Figure legends in italic and with smaller font size
+
+#show figure.caption: it => [
+ #text(size: 10pt, style: "italic")[#it]
+]
+
+// Headings numbering & refer to a section with "Chapitre X" instead of "Section X"
+
+#set heading(numbering: "1.1", supplement: "Chapitre")
+
+// Refer to an equation with "Équation X" instead of "Equation X"
+
+#set math.equation(supplement: "Équation")
+
+// Headings formatting
+
+#let heading_text_size = (none, 18pt, 15pt, 12pt, 11pt) // for each heading level
+#show heading.where(level: 1): header => {
+ set text(
+ size: heading_text_size.at(1),
+ fill: prune,
+ font: "Segoe UI This",
+ weight: "bold"
+ )
+ let number = context counter(heading).display("1 • ") // prefix format
+ pagebreak(weak: true) // start level 1 headings on a new page
+ block(breakable: false)[
+ #if header.numbering != none [ #number ]
+ #upper(header.body)
+ ]
+ v(heading_text_size.at(1)) // same height spacing as the font size
+}
+#show heading.where(level: 2): header => {
+ set text(
+ size: heading_text_size.at(2),
+ font: "Segoe UI This",
+ weight: "bold"
+ )
+ v(heading_text_size.at(2)) // same height spacing as the font size
+ box()[
+ #counter(heading).display()~
+ #upper(header.body)
+ ]
+ v(heading_text_size.at(2)) // same height spacing as the font size
+}
+#show heading.where(level: 3): header => {
+ set text(
+ size: heading_text_size.at(3),
+ font: "Segoe UI This",
+ weight: "bold"
+ )
+ v(heading_text_size.at(3)) // same height spacing as the font size
+ box()[
+ #h(10pt) // small indent
+ #counter(heading).display()~
+ #header.body
+ ]
+ v(heading_text_size.at(3)) // same height spacing as the font size
+}
+
+// Headings formatting in the outline
+
+#show outline.entry.where(level: 1): it => {
+ v(12pt, weak: true) // small spacing before
+ strong(it) // in bold
+}
+#show outline.entry.where(level: 3): it => {
+ text(size: 10pt)[#it] // slightly smaller
+}
+
+// Footer with the page number
+
+#set page(footer: context [
+ #set align(center)
+ #text(
+ fill: black,
+ size: 12pt,
+ weight: "regular"
+ )[
+ #counter(page).display("1")
+ ]
+ ]
+)
+
+// Text justification
+
+#set par(
+ justify: true,
+ linebreaks: "optimized"
+)
+
+// A "Remarque : " text box
+
+#let remarque(number: none, body) = {
+ block(stroke: (left: 1pt), inset: 0.5em)[
+ #smallcaps[Remarque #number :] #body
+ ]
+}
+
+// "En résumé" & "Publications et communications scientifiques" boxes
+
+#import "@preview/colorful-boxes:1.4.1": colorbox
+
+#let en_résumé(body) = {
+ colorbox(
+ title: text(font: "Segoe UI This")[En résumé],
+ radius: 2pt,
+ width: auto,
+ color: "default"
+ )[
+ #body
+ #v(2pt)
+ ]
+}
+
+#let publications(body) = {
+ colorbox(
+ title: text(font: "Segoe UI This")[Publications et communications scientifiques],
+ radius: 2pt,
+ width: auto,
+ box-colors: (
+ prune: (stroke: prune, fill: white, title: white),
+ ),
+ color: "prune"
+ )[
+ #body
+ #v(2pt)
+ ]
+}
+
+// Display the outline
+
+#outline(
+ title: [Table des matières],
+ indent: 1em
+)
+
+///////////////////////////////////////////
+// Write your thesis below. Bon courage !
+///////////////////////////////////////////
+
+= Chapitre
+
+#lorem(50)
+
+#en_résumé[
+ #lorem(25)
+]
+
+#publications[
+ - #lorem(12)
+ - #lorem(12)
+ - #lorem(12)
+]
+
+== Sous-chapitre
+
+#lorem(25)
+
+=== Sous-sous-chapitre
+
+#lorem(50) @bib:concerning-hobbits
+
+#remarque[
+ #lorem(25)
+]
+
+#lorem(50)
+
+#bibliography("bib.yml", title: [Bibliographie])
\ No newline at end of file
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/thumbnails/p1.png b/packages/preview/paris-saclay-thesis-flat/1.0.2/thumbnails/p1.png
new file mode 100644
index 000000000..31e4ca433
Binary files /dev/null and b/packages/preview/paris-saclay-thesis-flat/1.0.2/thumbnails/p1.png differ
diff --git a/packages/preview/paris-saclay-thesis-flat/1.0.2/typst.toml b/packages/preview/paris-saclay-thesis-flat/1.0.2/typst.toml
new file mode 100644
index 000000000..970dd3f2f
--- /dev/null
+++ b/packages/preview/paris-saclay-thesis-flat/1.0.2/typst.toml
@@ -0,0 +1,33 @@
+# for a description of available keys, see https://github.com/typst/packages/?tab=readme-ov-file#package-format
+
+[package]
+name = "paris-saclay-thesis-flat"
+version = "1.0.2"
+entrypoint = "src/lib.typ"
+authors = ["Sébastien Mestrallet <@sebmestrallet>"]
+license = "MIT-0"
+description = "An unofficial, flat-design template for Paris-Saclay University theses"
+repository = "https://github.com/sebmestrallet/typst-paris-saclay-thesis-flat"
+keywords = ["thesis", "Paris-Saclay"]
+categories = ["thesis"]
+disciplines = []
+compiler = "0.12.0"
+exclude = [
+ ".github/",
+ "fonts/",
+ "scripts/",
+ "template/main.pdf",
+ "thumbnails/p2.png",
+ "thumbnails/README.md",
+ ".gitignore",
+ ".typstignore",
+ "CHANGELOG.md",
+ "CITATION.cff",
+ "Justfile"
+]
+
+[template]
+path = "template/" # all files inside will be copied into the user's new project directory
+entrypoint = "main.typ" # compilation target
+thumbnail = "thumbnails/p1.png"
+