diff --git a/packages/preview/unofficial-eirb-report/0.1.1/LICENSE b/packages/preview/unofficial-eirb-report/0.1.1/LICENSE
new file mode 100644
index 0000000000..1dc7d3d495
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 floriandelage
+
+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.
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/README.md b/packages/preview/unofficial-eirb-report/0.1.1/README.md
new file mode 100644
index 0000000000..e0b2a8ea42
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/README.md
@@ -0,0 +1,130 @@
+# Enseirb-Matmeca Typst Template for Reports
+[](https://github.com/floriandelage/unofficial-eirb-report/releases)
+
+An unofficial [Typst](https://typst.app/) template for [Enseirb-Matmeca](https://enseirb-matmeca.bordeaux-inp.fr/fr)
+
+*Disclaimer: This template is not affiliated with Enseirb-Matmeca.*
+
+## Assets and trademarks
+
+This package includes official branding assets from Enseirb-Matmeca / Bordeaux INP.
+
+These assets are **not covered by the package license** and remain the property of their respective copyright holders.
+
+- Enseirb-Matmeca branding guidelines and assets: https://enseirb-matmeca.bordeaux-inp.fr/fr/outils-de-communication-inp
+
+Use of these assets is subject to the terms provided by the copyright holder.
+
+
+ View example PDF output
+
+
+## Getting Started
+
+1. **Font Installation (optional, but recommended)**
+ - The template uses [Linux Libertine](https://www.dafont.com/linux-libertine.font) for the main text
+ - The template also uses [JetBrains Mono](https://www.jetbrains.com/lp/mono/) for code blocks and raw text
+ - There is a fallback system that will use "New Computer Modern", the default Typst font
+
+2. **Configure the template**
+ - Edit the template parameters in `main.typ` to set your details:
+ ```typ
+ #show: template.with(
+ sector: "Filière Informatique",
+ document-type: "Rapport de Projet",
+
+ title: "Implémentation d'un modèle de rapport académique",
+
+ authors: (
+ (name: "Alexandrine Mercier", email: "alexandrine.mercier@enseirb.fr"),
+ (name: "Narcisse Fay", email: "narcisse.fay@enseirb.fr"),
+ (name: "Johanne Reyer", email: "johanne.reyer@enseirb.fr"),
+ (name: "Modestine Lapointe", email: "modestine.lapointe@enseirb.fr"),
+ ),
+ author-columns: 2,
+
+ advisers: (
+ (name: "Adelphe Félix", email: "adelphe.felix@enseirb.fr"),
+ ),
+ adviser-columns: 1,
+
+ date: "Mai 2025",
+ abstract: include "sections/0-abstract.typ",
+ )
+ ```
+
+3. **Write your content**
+ - The sections are split into files for organisation (see the `sections` folder)
+ - If you add sections, don't forget to add them in the `main.typ` file
+
+4. **Compile your document**
+ ```bash
+ typst compile main.typ
+ ```
+ - Or watch for changes and recompile automatically:
+ ```bash
+ typst watch main.typ
+ ```
+
+## Getting Started with Typst
+
+### Resources
+- [Typst for LaTeX users](https://typst.app/docs/guides/guide-for-latex-users/)
+- [Official Typst Documentation](https://typst.app/docs)
+- [Typst Examples Book](https://sitandr.github.io/typst-examples-book/book/)
+
+### Installation
+> **Note:** Typst also provides an online editor at [typst.app](https://typst.app/)
+
+1. **Install Typst**
+ - [Typst GitHub Repository](https://github.com/typst/typst?tab=readme-ov-file#installation)
+
+2. **Editor Integration**
+ - [TinyMist Extension](https://github.com/Myriad-Dreamin/tinymist?tab=readme-ov-file#installation) for VSCode, NeoVim, etc.
+
+## For Internship reports
+
+You can add the company logo of your internship, which will be placed next to the school logo in the title page and the footer, like that:
+
+```typ
+#show: template.with(
+ company-logo: image("path_to_company_logo.png", width: 50%),
+)
+```
+
+You can also override the school logo if you want to by using `school-logo`.
+
+Finally, you can also disable the abstract by setting it to `none`.
+
+## Working with References
+
+### Subfigures
+
+This template includes the package [subpar](https://typst.app/universe/package/subpar/), which allows you to easily create and reference subfigures, a feature that is not natively supported in Typst.
+
+You can create subfigures and label them like this:
+
+```typst
+#import "@preview/unofficial-eirb-report:0.1.1": subfig
+
+#subfig(
+ figure(image("./assets/figure.png"), caption: [Première sous-figure]),
+ ,
+ figure(image("./assets/figure.png"), caption: [Seconde sous-figure]),
+ ,
+ columns: (1fr, 1fr),
+ caption: [Une figure contenant deux sous-figures.],
+ label: ,
+)
+```
+
+### Bibliography
+- Add references to `bib.yaml`
+- Reference in text using `@citation_key` or `#ref()`
+- The bibliography is generated automatically at the end fo the document
+- Supports articles, books, proceedings, web resources, and more
+
+## Credits
+This template is built on the foundation provided by [onyx-itu-unofficial](https://github.com/FrederikBertelsen/onyx-itu-unofficial) by FrederikBertelsen.
+The original work has been expanded with additional features, French language support,
+and Enseirb-Matmeca styling.
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/docs/example.pdf b/packages/preview/unofficial-eirb-report/0.1.1/docs/example.pdf
new file mode 100644
index 0000000000..fdb3f886e7
Binary files /dev/null and b/packages/preview/unofficial-eirb-report/0.1.1/docs/example.pdf differ
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/src/assets/logo.png b/packages/preview/unofficial-eirb-report/0.1.1/src/assets/logo.png
new file mode 100644
index 0000000000..a0e5aee6c8
Binary files /dev/null and b/packages/preview/unofficial-eirb-report/0.1.1/src/assets/logo.png differ
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/src/lib.typ b/packages/preview/unofficial-eirb-report/0.1.1/src/lib.typ
new file mode 100644
index 0000000000..f64c5ae23a
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/src/lib.typ
@@ -0,0 +1,369 @@
+// ==========================================================================
+// Packages
+// ==========================================================================
+
+#import "@preview/subpar:0.2.2"
+
+// ==========================================================================
+// Typography Constants
+// ==========================================================================
+
+#let _default-font-body = "New Computer Modern"
+#let _default-font-mono = "New Computer Modern Mono"
+#let _font-size = 11pt
+#let _line-spacing = 0.65em
+#let _par-spacing = 1.2em
+
+// ==========================================================================
+// Header
+// ==========================================================================
+
+#let _current-chapter = state("chapter", none)
+#let _current-section = state("section", none)
+
+#let _build-main-header(content) = {
+ align(center, smallcaps(content))
+ line(length: 100%)
+}
+
+#let _build-secondary-header(chapter, section) = {
+ smallcaps(chapter)
+ h(1fr)
+ emph(section)
+ line(length: 100%)
+}
+
+#let _header = context {
+ let chapter = _current-chapter.get()
+ let section = _current-section.get()
+
+ let next-chapter = query(heading.where(level: 1)).find(h => (
+ h.location().page() == here().page()
+ ))
+
+ if next-chapter != none {
+ _build-main-header(next-chapter.body)
+ } else if chapter == none {
+ []
+ } else if section != none {
+ _build-secondary-header(chapter, section)
+ } else {
+ _build-main-header(chapter)
+ }
+}
+
+// ==========================================================================
+// Footer
+// ==========================================================================
+
+#let _build-footer(
+ school-logo,
+ company-logo,
+) = context {
+ line(length: 100%)
+ grid(
+ columns: (1fr, 1fr, 1fr),
+ align: (left, center, right),
+ if (company-logo != none) {
+ company-logo
+ } else {
+ []
+ },
+ text(1.2em, counter(page).display("1 / 1", both: true)),
+ school-logo,
+ )
+}
+// ==========================================================================
+// Subfigures
+// ==========================================================================
+
+#let subfig = subpar.grid.with(
+ numbering: n => {
+ let chapter = counter(heading.where(level: 1)).get().first()
+ numbering("I", chapter) + "." + str(n)
+ },
+ numbering-sub: (m, n) => {
+ let chapter = counter(heading.where(level: 1)).get().first()
+ numbering("I", chapter) + "." + str(m) + " (" + numbering("a", n) + ")"
+ },
+ numbering-sub-ref: (m, n) => {
+ let chapter = counter(heading.where(level: 1)).get().first()
+ numbering("I", chapter) + "." + str(m) + " (" + numbering("a", n) + ")"
+ },
+)
+
+// ==========================================================================
+// Page Components
+// ==========================================================================
+
+#let _person-grid(people, columns) = {
+ let cols = calc.min(columns, people.len())
+ grid(
+ columns: (1fr,) * cols,
+ gutter: 2em,
+ ..people.map(p => align(center, text(1.2em, [
+ #strong(p.name) \
+ #emph(p.email)
+ ])))
+ )
+}
+
+#let _title-page(
+ school-logo,
+ company-logo,
+ sector,
+ document-type,
+ title,
+ authors,
+ author-columns,
+ advisers,
+ adviser-columns,
+ date,
+) = {
+ if (company-logo != none) {
+ grid(
+ columns: (1fr, 1fr),
+ align: (left, right),
+ school-logo, company-logo,
+ )
+ } else {
+ align(center, school-logo)
+ }
+
+ if sector != none {
+ align(center, smallcaps(text(1.4em, sector)))
+ }
+
+ v(4em)
+
+ if document-type != none {
+ align(center, smallcaps(text(1.6em, document-type)))
+ v(1em)
+ } else {
+ v(4em)
+ }
+
+ align(center, text(2.6em, weight: "bold", title))
+
+ align(center, [
+ #line(length: 60%, stroke: 0.5pt + gray)
+ #v(1em)
+ #text(1.2em, smallcaps[Réalisé par])
+ #v(1em)
+ ])
+ _person-grid(authors, author-columns)
+
+ if advisers.len() > 0 {
+ v(8em)
+ align(center, text(1.2em, smallcaps[Supervisé par]))
+ v(0.8em)
+ _person-grid(advisers, adviser-columns)
+ }
+
+ place(bottom + center, text(1.2em, date))
+ pagebreak()
+}
+
+#let _abstract-page(abstract) = {
+ if (abstract != none) {
+ v(1fr)
+ align(center, heading(outlined: false, numbering: none, text(
+ 0.85em,
+ smallcaps[Abstract],
+ )))
+ abstract
+ v(1.618fr)
+ pagebreak()
+ }
+}
+
+#let _toc-page() = {
+ outline(depth: 3)
+ pagebreak()
+}
+
+#let _heading-num(it) = {
+ if it.numbering != none {
+ numbering(it.numbering, ..counter(heading).at(it.location()))
+ [ ]
+ }
+ it.body
+}
+
+// ==========================================================================
+// Template
+// ==========================================================================
+
+#let template(
+ school-logo: image("./assets/logo.png", width: 50%),
+ company-logo: none,
+
+ sector: none,
+ document-type: none,
+ title: "",
+ authors: (),
+ author-columns: 1,
+ advisers: (),
+ adviser-columns: 1,
+ date: datetime.today().display("[month repr:long] [year]"),
+ abstract: [],
+
+ font-body: "Linux Libertine",
+ font-mono: "JetBrains Mono",
+ chapter-break: true,
+
+ body,
+) = {
+ // -- Document metadata ---------------------------------------------------
+ set document(author: authors.map(a => a.name), title: title)
+
+ // -- Page -----------------------------------------------------------------
+
+ set page(paper: "a4", margin: 2.5cm)
+
+ // -- Text -----------------------------------------------------------------
+
+ set text(
+ font: (font-body, _default-font-body),
+ size: _font-size,
+ lang: "fr",
+ )
+
+ set par(
+ justify: true,
+ leading: _line-spacing,
+ first-line-indent: 1.5em,
+ spacing: _par-spacing,
+ )
+
+ // -- Math -----------------------------------------------------------------
+
+ set math.equation(numbering: it => {
+ let chapter = counter(heading.where(level: 1)).get().first()
+ numbering("(I.1)", chapter, it)
+ })
+
+ show math.equation: it => {
+ set text(weight: "regular")
+ it
+ }
+
+ // -- Code blocks ----------------------------------------------------------
+
+ show raw: set text(
+ font: (font-mono, _default-font-mono),
+ size: 0.9em,
+ )
+
+ // -- Figures --------------------------------------------------------------
+
+ set figure(
+ numbering: n => {
+ let chapter = counter(heading.where(level: 1)).get().first()
+ numbering("I", chapter) + "." + str(n)
+ },
+ placement: none,
+ )
+
+ show figure: it => {
+ v(1em)
+ it
+ v(1em)
+ }
+
+ show figure.where(kind: raw): it => {
+ show raw: it => block(
+ stroke: 1pt + luma(150),
+ fill: luma(240),
+ inset: 1em,
+ radius: 2pt,
+ width: auto,
+ it,
+ )
+ it
+ }
+
+ // -- Headings --------------------------------------------------------------
+
+ set heading(numbering: "I.1.a")
+
+ show heading.where(level: 1): it => {
+ if it.outlined {
+ counter(figure.where(kind: image)).update(0)
+ counter(figure.where(kind: table)).update(0)
+ counter(figure.where(kind: raw)).update(0)
+ counter(math.equation).update(0)
+ if chapter-break { pagebreak(weak: true) }
+ _current-chapter.update(it.body)
+ _current-section.update(none)
+ }
+ v(2em)
+ block(
+ width: 100%,
+ inset: (left: 1em),
+ stroke: (left: 3pt + black),
+ text(1.6em, weight: "bold", _heading-num(it)),
+ )
+ v(1em)
+ }
+
+ show heading.where(level: 2): it => {
+ if it.outlined { _current-section.update(it.body) }
+ v(1.2em)
+ {
+ set par(first-line-indent: 0em)
+ text(1.2em, weight: "bold", smallcaps(_heading-num(it)))
+ }
+ v(0.6em)
+ }
+
+ show heading.where(level: 3): it => {
+ v(0.8em)
+ {
+ set par(first-line-indent: 0em)
+ text(1em, weight: "bold", style: "italic", _heading-num(it))
+ }
+ v(0.4em)
+ }
+
+ show heading: it => {
+ if (it.level > 3) {
+ set par(first-line-indent: 0em)
+ text(1em, weight: "bold", style: "italic", it.body)
+ } else {
+ it
+ }
+ }
+
+ // -- Front matter --------------------------------------------------------------
+
+ _title-page(
+ school-logo,
+ company-logo,
+ sector,
+ document-type,
+ title,
+ authors,
+ author-columns,
+ advisers,
+ adviser-columns,
+ date,
+ )
+
+ _abstract-page(abstract)
+
+ _toc-page()
+
+ set page(
+ header: _header,
+ footer: _build-footer(
+ school-logo,
+ company-logo,
+ ),
+ numbering: "1",
+ )
+
+ counter(page).update(1)
+
+ body
+}
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/bib.yaml b/packages/preview/unofficial-eirb-report/0.1.1/template/bib.yaml
new file mode 100644
index 0000000000..9d80a758af
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/bib.yaml
@@ -0,0 +1,7 @@
+typst:
+ type: misc
+ title: Typst
+ author: Laurenz Mädje
+ year: 2025
+ url: https://typst.app
+ note: A modern typesetting system
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/main.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/main.typ
new file mode 100644
index 0000000000..060134e4c5
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/main.typ
@@ -0,0 +1,53 @@
+#import "@preview/unofficial-eirb-report:0.1.1": template
+
+// ==========================================================================
+// Template
+// ==========================================================================
+
+#show: template.with(
+ sector: "Filière Informatique",
+ document-type: "Rapport de Projet",
+
+ title: "Implémentation d'un modèle de rapport académique",
+
+ authors: (
+ (name: "Alexandrine Mercier", email: "alexandrine.mercier@enseirb.fr"),
+ (name: "Narcisse Fay", email: "narcisse.fay@enseirb.fr"),
+ (name: "Johanne Reyer", email: "johanne.reyer@enseirb.fr"),
+ (name: "Modestine Lapointe", email: "modestine.lapointe@enseirb.fr"),
+ ),
+ author-columns: 2,
+
+ advisers: ((name: "Adelphe Félix", email: "adelphe.felix@enseirb.fr"),),
+ adviser-columns: 1,
+
+ date: "Mai 2025",
+ abstract: include "sections/0-abstract.typ",
+)
+
+// ==========================================================================
+// Sections
+// ==========================================================================
+
+#include "sections/1-introduction.typ"
+#include "sections/2-analyse.typ"
+#include "sections/3-modelisation.typ"
+#include "sections/4-implementation.typ"
+#include "sections/5-tests.typ"
+#include "sections/6-conclusion.typ"
+
+// ==========================================================================
+// End of Document
+// ==========================================================================
+
+#set page(header: none)
+
+#pagebreak(weak: true)
+
+= Bibliographie
+#bibliography(
+ "bib.yaml",
+ style: "ieee",
+ title: none,
+ full: true,
+)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/sections/0-abstract.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/0-abstract.typ
new file mode 100644
index 0000000000..ad021bfdf0
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/0-abstract.typ
@@ -0,0 +1 @@
+#lorem(500)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/sections/1-introduction.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/1-introduction.typ
new file mode 100644
index 0000000000..448e8492cd
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/1-introduction.typ
@@ -0,0 +1,13 @@
+= Introduction
+
+== Contexte
+#lorem(250)
+
+== Présentation du sujet
+#lorem(250)
+
+== Objectifs pédagogiques
+#lorem(250)
+
+== Plan du rapport
+#lorem(250)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/sections/2-analyse.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/2-analyse.typ
new file mode 100644
index 0000000000..e454a9f4cb
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/2-analyse.typ
@@ -0,0 +1,13 @@
+= Analyse du sujet
+
+== Compréhension du problème
+#lorem(250)
+
+== Identification des contraintes
+#lorem(250)
+
+== Cas limites et ambiguïtés
+#lorem(250)
+
+== Hypothèses retenues
+#lorem(250)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/sections/3-modelisation.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/3-modelisation.typ
new file mode 100644
index 0000000000..3152b3f64e
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/3-modelisation.typ
@@ -0,0 +1,13 @@
+= Modélisation & Conception
+
+== Modélisation du problème
+#lorem(250)
+
+== Choix algorithmiques
+#lorem(250)
+
+== Diagrammes
+#lorem(250)
+
+== Lien avec les notions du cours
+#lorem(250)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/sections/4-implementation.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/4-implementation.typ
new file mode 100644
index 0000000000..48e15db2ae
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/4-implementation.typ
@@ -0,0 +1,10 @@
+= Implémentation
+
+== Structure du code
+#lorem(250)
+
+== Points techniques clés
+#lorem(250)
+
+== Difficultés rencontrées
+#lorem(250)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/sections/5-tests.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/5-tests.typ
new file mode 100644
index 0000000000..24e2e9f1ad
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/5-tests.typ
@@ -0,0 +1,13 @@
+= Tests & Résultats
+
+== Jeux de tests
+#lorem(250)
+
+== Résultats obtenus
+#lorem(250)
+
+== Performance
+#lorem(250)
+
+== Limites
+#lorem(250)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/sections/6-conclusion.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/6-conclusion.typ
new file mode 100644
index 0000000000..5f87f85249
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/sections/6-conclusion.typ
@@ -0,0 +1,10 @@
+= Conclusion
+
+== Bilan
+#lorem(250)
+
+== Recul critique
+#lorem(250)
+
+== Apprentissages
+#lorem(250)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/assets/figure.png b/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/assets/figure.png
new file mode 100644
index 0000000000..b11f739883
Binary files /dev/null and b/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/assets/figure.png differ
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/figures.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/figures.typ
new file mode 100644
index 0000000000..39419fd52b
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/figures.typ
@@ -0,0 +1,54 @@
+#import "@preview/unofficial-eirb-report:0.1.1": subfig
+
+= Exemples de figures
+
+== Figure d'une image
+
+#figure(
+ image("./assets/figure.png", width: 70%),
+ caption: [Une figure contenant une image et une description.],
+)
+
+Noter la balise `` permettant de référencer cette figure, vous pouvez
+la référencer comme ceci : @basic-fig.
+
+== Figure d'un tableau
+
+#figure(
+ table(
+ columns: (auto, auto, auto),
+ table.header([*Nom*], [*Âge*], [*Rôle*]),
+ [Alice], [28], [Designer],
+ [Bob], [34], [Développeur],
+ [Charlie], [45], [Manager],
+ ),
+ caption: [Une figure contenant un tableau et une description.],
+)
+
+Voir @table-fig pour les valeurs.
+
+== Figure d'un code
+
+#figure(
+ ```c
+ #include
+ int main(int argc, char *argv[])
+ {
+ printf("Hello, World!\n");
+ return 0;
+ }
+ ```,
+ caption: [Une figure contenant du code.],
+)
+
+== Sous-figures
+
+#subfig(
+ figure(image("./assets/figure.png"), caption: [Première sous-figure]),
+ ,
+ figure(image("./assets/figure.png"), caption: [Seconde sous-figure]),
+ ,
+ columns: (1fr, 1fr),
+ caption: [Une figure contenant deux sous-figures.],
+ label: ,
+)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/listes.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/listes.typ
new file mode 100644
index 0000000000..15faf3fa17
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/listes.typ
@@ -0,0 +1,56 @@
+= Exemple de listes
+
+== Listes non ordonnées
+Les listes sont créées avec le symbole `-` :
+
+- Ceci est le premier élément
+- Ceci est le deuxième élément
+- Ceci est le troisième élément
+
+== Listes ordonnées
+Les énumérations sont créées avec le symbole `+` :
+
++ Premier élément ordonné
++ Deuxième élément ordonné
++ Troisième élément ordonné
+
+== Listes imbriquées
+
+Vous pouvez créer des listes imbriquées en ajoutant une indentation :
+
+- Fruits
+ - Pommes
+ - Bananes
+ - Oranges
+- Légumes
+ - Carottes
+ - Brocoli
+ - Épinards
+
+== Listes mixtes
+
++ Étape un
++ Étape deux
+ - Sous-élément A
+ - Sous-élément B
++ Étape trois
+
+== Listes de termes
+
+Les listes de termes (similaires aux listes de définitions) utilisent `/` :
+
+/ Terme 1: Ceci est la définition du premier terme.
+/ Terme 2: Ceci est la définition du deuxième terme.
+/ Typst: Un système de composition basé sur un langage de balisage.
+
+== Listes personnalisées
+
+#set enum(numbering: "1.a)")
++ Élément de premier niveau
+ + Élément imbriqué a)
+ + Élément imbriqué b)
++ Un autre élément de premier niveau
+
+#set list(marker: [→])
+- Élément avec puce personnalisée
+- Un autre élément avec puce personnalisée
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/tableaux.typ b/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/tableaux.typ
new file mode 100644
index 0000000000..3a7a00b660
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/template/typst-basic/tableaux.typ
@@ -0,0 +1,55 @@
+= Exemples de tableaux
+
+== Tableaux de base
+
+#table(
+ columns: (auto, auto, auto),
+ align: center,
+ inset: 1em,
+ [*Nom*], [*Âge*], [*Rôle*],
+ [Alice], [28], [Designer],
+ [Bob], [34], [Développeur],
+ [Charlie], [45], [Manager],
+)
+
+== Tableau dans une figure
+
+#figure(
+ table(
+ columns: (auto, auto, auto),
+ align: center,
+ inset: 1em,
+ [*Nom*], [*Âge*], [*Rôle*],
+ [Alice], [28], [Designer],
+ [Bob], [34], [Développeur],
+ [Charlie], [45], [Manager],
+ ),
+ caption: "Un tableau simple avec une légende",
+)
+
+== Style de tableau
+
+#table(
+ columns: (1fr, auto, auto),
+ inset: 1em,
+ fill: (_, row) => if row == 0 { rgb("#dfebf6") } else if calc.odd(row) {
+ rgb("#f7f7f7")
+ } else { white },
+ stroke: 0.7pt + rgb("#5c8db7"),
+ [*Produit*], [*Prix*], [*Quantité*],
+ [Ordinateur portable], [\$999], [5],
+ [Clavier], [\$25], [10],
+ [Souris], [\$85], [7],
+ [Écran], [\$249], [3],
+)
+
+== Dimensionnement des colonnes
+
+#table(
+ columns: (20%, 50%, 30%),
+ inset: 1em,
+ [*Colonne 1*], [*Colonne 2*], [*Colonne 3*],
+ [Ceci est du texte dans la première colonne],
+ [Cette colonne est plus large et offre plus d’espace pour le contenu],
+ [Retour à une colonne plus étroite],
+)
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/thumbnail.png b/packages/preview/unofficial-eirb-report/0.1.1/thumbnail.png
new file mode 100644
index 0000000000..47dfcc5ebb
Binary files /dev/null and b/packages/preview/unofficial-eirb-report/0.1.1/thumbnail.png differ
diff --git a/packages/preview/unofficial-eirb-report/0.1.1/typst.toml b/packages/preview/unofficial-eirb-report/0.1.1/typst.toml
new file mode 100644
index 0000000000..a16a98080b
--- /dev/null
+++ b/packages/preview/unofficial-eirb-report/0.1.1/typst.toml
@@ -0,0 +1,26 @@
+[package]
+name = "unofficial-eirb-report"
+version = "0.1.1"
+entrypoint = "src/lib.typ"
+authors = ["Florian Delage"]
+license = "MIT"
+description = "An unofficial report template for Enseirb-Matmeca"
+repository = "https://github.com/floriandelage/report-eirb"
+keywords = ["report","project","enseirb"]
+categories = ["report"]
+disciplines = ["engineering","computer-science"]
+exclude = [
+ ".github",
+ "docs",
+ "scripts",
+ "tests",
+ ".typstignore",
+ "Justfile",
+ "thumbnail-dark.svg",
+ "thumbnail-light.svg",
+]
+
+[template]
+path = "template"
+entrypoint = "main.typ"
+thumbnail = "thumbnail.png"