diff --git a/packages/preview/heh-template/1.0.0/.gitignore b/packages/preview/heh-template/1.0.0/.gitignore new file mode 100644 index 0000000000..f3997a85f8 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/.gitignore @@ -0,0 +1,4 @@ +*.pdf +!manuel.pdf +!demo_presentation.pdf + diff --git a/packages/preview/heh-template/1.0.0/CODE_OF_CONDUCT.md b/packages/preview/heh-template/1.0.0/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..242f940d8a --- /dev/null +++ b/packages/preview/heh-template/1.0.0/CODE_OF_CONDUCT.md @@ -0,0 +1,88 @@ +# Code de conduite _Contributor Covenant_ + +## Prélude + +Ce code de conduite est dérivé du [contributor covenant v2.0](https://www.contributor-covenant.org) et adapté pour le dépot dépendant de la haute école. En plus des règles présentes ci-dessous, veuillez également prendre en compte le règlement d'ordre intérieur qui doit être appliqué à ce dépot. + +## Notre engagement + +En tant que membres, contributeur·trice·s et dirigeant·e·s, nous nous engageons à faire de la participation à notre communauté une expérience sans harcèlement, quel que soit l'âge, la taille corporelle, le handicap visible ou invisible, l'appartenance ethnique, les caractéristiques sexuelles, l'identité et l'expression de genre, le niveau d'expérience, l'éducation, le statut socio-économique, la nationalité, l'apparence personnelle, la race, la religion, ou l'identité et l'orientation sexuelle. + +Nous nous engageons à agir et interagir de manière à contribuer à une communauté ouverte, accueillante, diversifiée, inclusive et saine. + +## Nos critères + +Exemples de comportements qui contribuent à créer un environnement positif : + +* Faire preuve d'empathie et de bienveillance envers les autres +* Être respectueux des opinions, points de vue et expériences divergents +* Donner et recevoir avec grâce les critiques constructives +* Assumer ses responsabilités et s'excuser auprès des personnes affectées par nos erreurs et apprendre de ces expériences +* Se concentrer sur ce qui est le meilleur non pas uniquement pour nous en tant qu'individu, mais aussi pour l'ensemble de la communauté + +Exemples de comportements inacceptables : + +* L'utilisation de langage ou d'images sexualisés et d'attentions ou d'avances sexuelles de toute nature +* Le _trolling_, les commentaires insultants ou désobligeants et les attaques personnelles ou d'ordre politique +* Le harcèlement en public ou en privé +* La publication d'informations privées d'autrui, telle qu'une adresse postale ou une adresse électronique, sans leur autorisation explicite +* Toute autre conduite qui pourrait raisonnablement être considérée comme inappropriée dans un cadre professionnel + +## Responsabilités d'application + +Les dirigeant·e·s de la communauté sont chargé·e·s de clarifier et de faire respecter nos normes de comportements acceptables et prendront des mesures correctives appropriées et équitables en réponse à tout comportement qu'ils ou elles jugent inapproprié, menaçant, offensant ou nuisible. + +Les dirigeant·e·s de la communauté ont le droit et la responsabilité de supprimer, modifier ou rejeter les commentaires, les contributions, le code, les modifications de wikis, les rapports d'incidents ou de bogues et autres contributions qui ne sont pas alignés sur ce code de conduite, et communiqueront les raisons des décisions de modération le cas échéant. + +## Portée d'application + +Ce code de conduite s'applique à la fois au sein des espaces du projet ainsi que dans les espaces publics lorsqu'un individu représente officiellement le projet ou sa communauté. Font parties des exemples de représentation d'un projet ou d'une communauté l'utilisation d'une adresse électronique officielle, la publication sur les réseaux sociaux à l'aide d'un compte officiel ou le fait d'agir en tant que représentant·e désigné·e lors d'un événement en ligne ou hors-ligne. + +## Application + +Les cas de comportements abusifs, harcelants ou tout autre comportement inacceptables peuvent être signalés aux personnes reponsables du dépôt heh-template. Toutes les plaintes seront examinées et feront l'objet d'une enquête rapide et équitable. + +Tou·te·s les dirigeant·e·s de la communauté sont tenu·e·s de respecter la vie privée et la sécurité des personnes ayant signalé un incident. + +## Directives d'application + +Les dirigeant·e·s de communauté suivront ces directives d'application sur l'impact communautaire afin de déterminer les conséquences de toute action qu'ils jugent contraire au présent code de conduite : + +### 1. Correction + +**Impact communautaire** : utilisation d'un langage inapproprié ou tout autre comportement jugé non professionnel ou indésirable dans la communauté. + +**Conséquence** : un avertissement écrit et privé de la part des dirigeant·e·s de la communauté, clarifiant la nature du non-respect et expliquant pourquoi le comportement était inapproprié. Des excuses publiques peuvent être demandées. + +### 2. Avertissement + +**Impact communautaire** : un non-respect par un seul incident ou une série d'actions. + +**Conséquence** : un avertissement avec des conséquences dû à la poursuite du comportement. Aucune interaction avec les personnes concernées, y compris l'interaction non sollicitée avec celles et ceux qui sont chargé·e·s de l'application de ce code de conduite, pendant une période déterminée. Cela comprend le fait d'éviter les interactions dans les espaces communautaires ainsi que sur les canaux externes comme les médias sociaux. Le non-respect de ces conditions peut entraîner un bannissement temporaire ou permanent. + +### 3. Bannissement temporaire + +**Impact communautaire** : un non-respect grave des normes communautaires, notamment un comportement inapproprié soutenu. + +**Conséquence** : un bannissement temporaire de toutes formes d'interactions ou de communications avec la communauté pendant une période déterminée. Aucune interaction publique ou privée avec les personnes concernées, y compris les interactions non sollicitées avec celles et ceux qui appliquent ce code de conduite, n'est autorisée pendant cette période. Le non-respect de ces conditions peut entraîner un bannissement permanent. + +### 4. Bannissement permanent + +**Impact communautaire** : démontrer un schéma récurrent de non-respect des normes de la communauté y compris un comportement inapproprié soutenu, le harcèlement d'un individu ainsi que l'agression ou le dénigrement de catégories d'individus. + +**Conséquence** : un bannissement permanent de toutes formes d'interactions publiques au sein de la communauté. + +## Attributions + +Ce code de conduite est adapté du [Contributor Covenant](https://www.contributor-covenant.org), version 2.0, disponible à [https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. + +Les Directives d'application ont été inspirées par le [Code of conduct enforcement ladder][Mozilla CoC] de Mozilla. + +Pour obtenir des réponses aux questions courantes sur ce code de conduite, consultez la FAQ à [https://www.contributor-covenant.org/faq][FAQ]. Les traductions sont disponibles sur [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations + diff --git a/packages/preview/heh-template/1.0.0/CONTRIBUTING.md b/packages/preview/heh-template/1.0.0/CONTRIBUTING.md new file mode 100644 index 0000000000..5f67900d9e --- /dev/null +++ b/packages/preview/heh-template/1.0.0/CONTRIBUTING.md @@ -0,0 +1,24 @@ +# Contribuer à typst-template + +Premièrement, merci de prendre le temps de contribuer à ce dépot. + +Toutes les contributions, peu importe leur taille sont les bienvenues. Ce document a pour but de faciliter le processus de contribution et la maintenance du dépot en définissant les **prérequis à respecter** en créant une pull request. Il est donc essentiel de prendre connaissance du contenu de ce document **avant** de contribuer + +## Rapports de bugs / suggestion de fonctionalités + +Pour signaler des problèmes ou suggérer des fonctionnalités, nous utilisons les **issues** de GitHub. Avant de faire une demande, assurez vous qu'une autre issue concernant le même problème ou contenant la même demande **n'est pas déjà ouverte**. + +Si une issue existe déjà, vous pouvez éventuellement y contribuer en y ajoutant des **informations supplémentaires** dans le cas d'un rapport de bug (exemple: préciser depuis quand vous avez le problème si personne d'autre ne l'a fait). Dans le cas d'une demande de fonctionnalités, vous pouvez simplement **réagir avec un :+1: pour montrer votre support** + +## Contribuer au code + +Si vous souhaitez contribuer au code (résoudre un bug, ajouter une fonctionalité, ...), nous vous demandons de faire une **pull request** sur GitHub. + +Premièrement, faites attention à bien respecter notre **convention de commit** qui est basée sur les [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). Nous utilisons le formattage suivant `type(cible (optionnel)): message en français` ou le `type` vient des conventional commits et est en anglais + +**Avant** d'envoyer la PR, il est impératif de tester le code en compilant le manuel et la démo et en vérifiant que **tous** les éléments s'affichent correctemnt + +Nous vous demandons aussi de formatter le code avec `just fmt` et de suivre les pratiques de style indiquées dans [STYLE.md](STYLE.md) + +Bien sûr, si vous avez une hésitation sur comment implémenter une fonctionnalité / formatter votre code / ..., n'hésitez pas à soumettre la pull request et poser les questions nécéssaires, le but n'étant pas non plus de freiner les contributions. + diff --git a/packages/preview/heh-template/1.0.0/Justfile b/packages/preview/heh-template/1.0.0/Justfile new file mode 100644 index 0000000000..7b264157fa --- /dev/null +++ b/packages/preview/heh-template/1.0.0/Justfile @@ -0,0 +1,52 @@ +demo_file := "manuel.typ" +demo_presentation_file := "demo_presentation.typ" + +alias b := build-manuel +alias w := watch-manuel + +alias bm := build-monochrome +alias wm := watch-monochrome + +alias bp := build-presentation +alias wp := watch-presentation + +alias bmp := build-monochrome-presentation +alias wmp := watch-monochrome-presentation + +alias fmt := format + +# Créer le PDF de démonstration (manuel) +build-manuel: + typst compile {{ demo_file }} + +# Compile le pdf de démonstration (manuel) à chaque changement +watch-manuel: + typst watch {{ demo_file }} + +# Créer le manuel PDF en monochrome +build-monochrome: + typst compile --input monochrome=true {{ demo_file }} + +# Compile le PDF monochrome a chaque changement +watch-monochrome: + typst watch --input monochrome=true {{ demo_file }} + +# Créer le PDF la présentation de démonstration +build-presentation: + typst compile {{ demo_presentation_file }} + +# Créer le PDF la présentation de démonstration à chaque changement +watch-presentation: + typst watch {{ demo_presentation_file }} + +# Créer le PDF la présentation de démonstration en monochrome +build-monochrome-presentation: + typst compile --input monochrome=true {{ demo_presentation_file }} + +# Créer le PDF la présentation de démonstration monochrome a chaque changement +watch-monochrome-presentation: + typst watch --input monochrome=true {{ demo_presentation_file }} + +# Formatte le code avec typstyle +format: + typstyle -i . diff --git a/packages/preview/heh-template/1.0.0/LICENSE.md b/packages/preview/heh-template/1.0.0/LICENSE.md new file mode 100644 index 0000000000..5ba7604ca1 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/LICENSE.md @@ -0,0 +1,7 @@ +Copyright (c) 2026 Haute École en Hainaut + +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/heh-template/1.0.0/README.md b/packages/preview/heh-template/1.0.0/README.md new file mode 100644 index 0000000000..da7a4780da --- /dev/null +++ b/packages/preview/heh-template/1.0.0/README.md @@ -0,0 +1,68 @@ +![Template de documents HEH. Fait par des étudiant.e.s pour des Étudiant.e.s](meta/banner.svg) + +Le projet HEH typst a pour objectif de simplifier la rédaction de rapports, document et cours aux sein de la HEH que ce soit pour les étudiants ou les élèves. + +Le projet prend la forme d'un package [typst](https://typst.app/) multi-fonction. + +### Table des matières +1. [Contenus](#contenus) +2. [Utilisation](#utilisation) +3. [Contribution](#contribution) +4. [License](#license) + +## Contenus + +Le package heh-template comprend les éléments suivants : +- Deux templates de document (rapport et tfe) +- Un template de présentation +- Une librarie de composants complète (font, boite, tableaux, mise ne page) + +![Deux templates de document. Un template de présentation. Librarie complète](meta/whatisincluded.svg) + +Les templates gèrent automatiquement la mise en forme et la coloration des différents éléments selon le campus, le tout étant modulaire et s'adaptant automatiquement aux paramètres du template. + +La librairie de composants dispose des éléments suivants: +- Des tableaux modulaires +- Des boites informatives +- Contextes d'environnement spécifique au campus +- Dites-nous ce qu'ont pourrait ajouter! (ou [contribuez](#contribution)!) + +![Des tableaux modulaires. Des voxes informatives. S'adapte aux campus!](meta/components.svg) + +## Utilisation + +Pour commencer, vous devez avoir Typst `v0.15.x` ou une version supérieur afin d'être sur que la librairie puisse fonctionner. Il est également vivement conseilé de comprendre au moins le base de la rédaction de document en [typst](https://typst.app/). + +Pour utiliser le package, vous n'avez qu'a ajouter la ligne `#import "@preview/heh-template:1.0.0"` en haut de n'importe quel fichier .typ + +Pour créer un document simple il suffit d'instancier le template de document avec les paramètres suivants: +```typst +#import "@preview/heh-template:1.0.0": heh-document, campus, config + +// Appel du template en utilisant le style du département technique (DST) +#show: heh-document.with( + campus-config-fn: campus.dst-config, + document-config-fn: config.default-document-config +) + += Premier titre +``` + +Vous pouvez choisir votre campus an changent la valeur de `campus.dst-config` par les valeurs suivantes: +- `campus.dss-ms-config` Pour le Département des Sciences Sociales de Mons. +- `campus.dss-to-config` Pour le Département des Sciences Sociales de Tournai. +- `campus.dsee-to-config` Pour le Département des Sciences de l'Éducation et de l'Enseignement de Tournai. +- `campus.dsee-ms-config` Pour le Département des Sciences de l'Éducation et de l'Enseignement de Mons. +- `campus.deco-config` Pour le Département des Sciences Juridiques, Éconnomique et gestion. +- `campus.dst-config` Pour le Département des Sciences et Technologies. + +Avec ceci, vous devriez avoir ce qu'il vous faut pour commencer, mais il est important de noter que le template regorge de bien plus de fonctionnalités que ça! Si vous voulez en savoir plus sur comment personnaliser votre documents, comment utiliser les tableaux, boites, le template de TFE et de présentation, jetez un coup d'œil au [manuel d'utilisation](manuel.pdf)! + +## Contribution +Toutes contribution est la bienvenue afin de souvetenir le projet HEH template! +Cepandant avant de vous lancer dans le bain, jetez un œil au [règles de contribution](CONTRIBUTING.md) et au [code de conduite](CODE_OF_CONDUCT.md) de notre communauté. + +Également, ce répertoire est soumis au règlement d'ordre intérieur de la Haute École en Hainaut et tout manquement a celui-ci peut avoir des répercution au sein de l'établissement. + +## License +Le projet HEH Typst est sous la license [MIT](LICENSE.md) à l'exception des différents logos de la HEH qui eux sont la propriété de la [Haute École en Hainaut](https://HEH.be). diff --git a/packages/preview/heh-template/1.0.0/STYLE.md b/packages/preview/heh-template/1.0.0/STYLE.md new file mode 100644 index 0000000000..f62672006c --- /dev/null +++ b/packages/preview/heh-template/1.0.0/STYLE.md @@ -0,0 +1,47 @@ +# Règles de formatage - template HEH Typst + +Les règles suivantes sont **complémentaires** au style par défaut appliqué par `typststyle`. Pour appliquer automatiquement le style de `typstyle`, utilisez la commande `just format` + +## Règles de base + +### Indentation + +- Le code est indenté avec une longeur de **2 espaces** +- Les variables et noms de fonctions utilisent la convention **kebab-case** +- Les blocs (`()`, `{}`, `[]`, ...) doivent être indentés selon la hiérarchie du document + +### Longeur des lignes + +- Maximum de 100 charactères par ligne + +### Espacement + +- Tout les variables, opérateurs, et blocs sont **entourés d'un espace**. Par exemple, on écrira `200px + 200px` au lieu de `200px+200px`. +- Les virgules ne sont **pas précédées d'un espace** +- Les virgules qui ne constituent **pas la fin de la ligne sont succédées par un espace** + +## Blocs + +- L'accolade ouvrante **peut se situer sur la même ligne** +- L'accolade fermante doit se trouver sur **sa propre ligne** +- Les fonctions et les blocs de contenu ne contenant qu'une ligne ne **doivent pas utiliser d'accolades** +- Si un bloc est quasiment composé exclusivement de code et **d'un peu de markup**, il vaut mieux utiliser **un bloc de code** + +## Fonctions et appels de fonction + +- Les valeurs par défaut des paramètres d'une fonction **doivent être utiles pour la compréhension du code si nécéssaire** +- Si la ligne des paramètres est trop longue, les paramètres peuvent être listées sur plusieurs lignes (un paramètre par ligne) +- Le raccourci `#function(params)[content]` **devrait** être utilisé uniquement si il n'y a pas de `params`, par exemeple pour `#function[content]`. Dans les autres cas, la syntaxe `#function(params, content)` **devrait** être utilisée + +## Conditions, boucles, ... + +- Les paramètres doivent être **espacés** d'un espace si ils sont mis entre paranthèses + +## Commentaires + +- Les commentaires **doivent** être placés au dessus du code qu'ils concernent + +## Fichiers + +- Les fichiers **doivent** être terminés par une ligne vide + diff --git a/packages/preview/heh-template/1.0.0/assets/icons/address.vsvg b/packages/preview/heh-template/1.0.0/assets/icons/address.vsvg new file mode 100644 index 0000000000..57b51a61e4 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/icons/address.vsvg @@ -0,0 +1,3 @@ + + + diff --git a/packages/preview/heh-template/1.0.0/assets/icons/hint.vsvg b/packages/preview/heh-template/1.0.0/assets/icons/hint.vsvg new file mode 100644 index 0000000000..68b3ccce29 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/icons/hint.vsvg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/packages/preview/heh-template/1.0.0/assets/icons/important.vsvg b/packages/preview/heh-template/1.0.0/assets/icons/important.vsvg new file mode 100644 index 0000000000..b41b4333dc --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/icons/important.vsvg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/preview/heh-template/1.0.0/assets/icons/information.vsvg b/packages/preview/heh-template/1.0.0/assets/icons/information.vsvg new file mode 100644 index 0000000000..6394446af9 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/icons/information.vsvg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/preview/heh-template/1.0.0/assets/icons/mail.vsvg b/packages/preview/heh-template/1.0.0/assets/icons/mail.vsvg new file mode 100644 index 0000000000..8f7af3463c --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/icons/mail.vsvg @@ -0,0 +1,3 @@ + + + diff --git a/packages/preview/heh-template/1.0.0/assets/icons/phone.vsvg b/packages/preview/heh-template/1.0.0/assets/icons/phone.vsvg new file mode 100644 index 0000000000..23f3df7330 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/icons/phone.vsvg @@ -0,0 +1,3 @@ + + + diff --git a/packages/preview/heh-template/1.0.0/assets/icons/silly.vsvg b/packages/preview/heh-template/1.0.0/assets/icons/silly.vsvg new file mode 100644 index 0000000000..562a7c0e98 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/icons/silly.vsvg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/preview/heh-template/1.0.0/assets/logos/heh-logo.vsvg b/packages/preview/heh-template/1.0.0/assets/logos/heh-logo.vsvg new file mode 100644 index 0000000000..bd8e0714f4 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/logos/heh-logo.vsvg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + +{title} {subtitle} + diff --git a/packages/preview/heh-template/1.0.0/assets/logos/ph.svg b/packages/preview/heh-template/1.0.0/assets/logos/ph.svg new file mode 100644 index 0000000000..3aa6b0145e --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/logos/ph.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/preview/heh-template/1.0.0/assets/logos/wbe.svg b/packages/preview/heh-template/1.0.0/assets/logos/wbe.svg new file mode 100644 index 0000000000..561516b079 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/assets/logos/wbe.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/heh-template/1.0.0/components/boxes.typ b/packages/preview/heh-template/1.0.0/components/boxes.typ new file mode 100644 index 0000000000..ae484d82ce --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/boxes.typ @@ -0,0 +1,82 @@ +#import "/utils/utils.typ": single-color-svg +#import "/utils/states.typ": heh-config + +#let box-default-styling = box.with( + width: 100%, + inset: 14pt, +) + +#let grid-with-box-default-styling = grid.with( + columns: (auto, 1fr), + row-gutter: 14pt, + column-gutter: 8pt, + align: (alignment.center, alignment.horizon), +) + +#let box-default( + content, + accent-color: rgb("#34356B"), + title: "Default box", + icon-path: "/assets/icons/information.vsvg", + bg: auto, +) = context { + let config = heh-config.get() + let monochrome = config.print.at("monochrome", default: false) + + let true-accent = if monochrome { black } else { accent-color } + + let bg = if monochrome { + white + } else { + if bg == auto { + accent-color.lighten(90%) + } else { + bg + } + } + + set text(fill: true-accent) + + box-default-styling( + fill: bg, + stroke: if monochrome { 1pt + black } else { none }, + grid-with-box-default-styling( + single-color-svg(icon-path, true-accent), + title, + grid.cell( + x: 0, + y: 1, + colspan: 2, + align(left, rect( + stroke: (left: 1pt + true-accent), + inset: (left: 20pt), + outset: (left: -6.5pt), + content, + )), + ), + ), + ) +} + +#let info = box-default.with( + icon-path: "/assets/icons/information.vsvg", + title: "Information", +) + +#let important = box-default.with( + icon-path: "/assets/icons/important.vsvg", + accent-color: rgb("#d02020"), + title: "Important", +) + +#let hint = box-default.with( + icon-path: "/assets/icons/hint.vsvg", + accent-color: rgb("#168a5c"), + title: "Indice", +) + +#let silly = box-default.with( + icon-path: "/assets/icons/silly.vsvg", + accent-color: rgb("#b31077"), + title: "Info Silly", +) diff --git a/packages/preview/heh-template/1.0.0/components/double-table.typ b/packages/preview/heh-template/1.0.0/components/double-table.typ new file mode 100644 index 0000000000..24c584eb8d --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/double-table.typ @@ -0,0 +1,25 @@ +#import "/utils/states.typ": heh-config + +#let double-table( + ..args, +) = context { + let primary-color = heh-config.get().campus.style.primary-color + show table.cell: it => { + if (it.y == 0 or it.x == 0) { + set text(white, weight: "bold") + it + } else { + it + } + } + + table( + ..args, fill: (x, y) => { + if (y == 0 or x == 0) { + primary-color.darken(40%) + } else { + primary-color.transparentize(90%) + } + } + ) +} diff --git a/packages/preview/heh-template/1.0.0/components/footers/footers.typ b/packages/preview/heh-template/1.0.0/components/footers/footers.typ new file mode 100644 index 0000000000..48f784d53f --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/footers/footers.typ @@ -0,0 +1,4 @@ +#import "page-numbers.typ": page-numbers +#import "page-numbers-side.typ": page-numbers-side +#import "presentation-footer.typ": presentation-footer + diff --git a/packages/preview/heh-template/1.0.0/components/footers/page-numbers-side.typ b/packages/preview/heh-template/1.0.0/components/footers/page-numbers-side.typ new file mode 100644 index 0000000000..537b87042f --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/footers/page-numbers-side.typ @@ -0,0 +1,18 @@ +// Affiche les numéros de page à droite ou à gauche, avec une barre pour savoir s'il s'agit de la page de droite ou de gauche +// Assume que la page de garden'est pas la première page (mais la "page 0") +#let page-numbers-side( + show-total: true, + ..args, +) = { + let pagenr = counter(page).get().first() + let alignment = if calc.rem(pagenr, 2) == 0 { right } else { left } + + align( + alignment, + counter(page).display( + if (alignment == left) { "1/1 |" } else { "| 1/1" }, + both: show-total, + ), + ) +} + diff --git a/packages/preview/heh-template/1.0.0/components/footers/page-numbers.typ b/packages/preview/heh-template/1.0.0/components/footers/page-numbers.typ new file mode 100644 index 0000000000..a385f448c6 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/footers/page-numbers.typ @@ -0,0 +1,13 @@ +// Affiche les numéros de page à droite +#let page-numbers( + show-total: true, +) = { + align( + right, + counter(page).display( + "1/1", + both: show-total, + ), + ) +} + diff --git a/packages/preview/heh-template/1.0.0/components/footers/presentation-footer.typ b/packages/preview/heh-template/1.0.0/components/footers/presentation-footer.typ new file mode 100644 index 0000000000..ed160e9ab3 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/footers/presentation-footer.typ @@ -0,0 +1,31 @@ +#import "/utils/utils.typ": format-author-names +#import "/utils/states.typ": heh-config + +#let presentation-footer() = context { + set text(size: 14pt) + let config = heh-config.get() + grid( + columns: (auto, 3fr, 1fr), + { + format-author-names(config.document.authors, false).join( + ", ", + last: " et ", + ) + }, + { + align(center, { + config.document.title + }) + }, + { + // Affiche les numéros de page à droite + align( + right, + counter(page).display( + "1/1", + both: true, + ), + ) + }, + ) +} diff --git a/packages/preview/heh-template/1.0.0/components/headers/headers.typ b/packages/preview/heh-template/1.0.0/components/headers/headers.typ new file mode 100644 index 0000000000..54ee1f4a8d --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/headers/headers.typ @@ -0,0 +1,4 @@ +#import "logo-year-title.typ": logo-year-title +#import "year-title.typ": year-title +#import "presentation-header.typ": presentation-header + diff --git a/packages/preview/heh-template/1.0.0/components/headers/logo-year-title.typ b/packages/preview/heh-template/1.0.0/components/headers/logo-year-title.typ new file mode 100644 index 0000000000..f0029ff6d4 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/headers/logo-year-title.typ @@ -0,0 +1,29 @@ +#import "/utils/utils.typ": heh-logo +#import "/utils/states.typ": heh-config + +// Affiche le logo à gauche et l'année académique et le titre à droite +#let logo-year-title( + show-year: true, + show-title: true, +) = context { + let config = heh-config.get() + columns(2, { + heh-logo( + width: 200pt, + ) + + colbreak() + align(right, { + if show-year [ + Année académique #text(config.document.year, fill: config.campus.style.primary-color) + ] + if show-year and show-title { + linebreak() + } + if show-title { + config.document.title + } + }) + }) +} + diff --git a/packages/preview/heh-template/1.0.0/components/headers/presentation-header.typ b/packages/preview/heh-template/1.0.0/components/headers/presentation-header.typ new file mode 100644 index 0000000000..205f8e3921 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/headers/presentation-header.typ @@ -0,0 +1,79 @@ +#import "/utils/utils.typ": get-next-heading, heh-logo +#import "/utils/states.typ": ( + group-current-slide, group-slide-count, group-title-state, heh-config, +) +#import "@preview/polylux:0.4.0": toolbox + +// Affiche le logo à gauche et l'année académique et le titre à droite +#let presentation-header(show-titles: true, show-progression: true) = context { + let next-heading = get-next-heading(level: 2) + let config = heh-config.get() + set text(size: 14pt) + + grid( + columns: (100pt, 1fr, auto), + heh-logo(width: 200pt), + { + if show-titles { + colbreak() + align(center + horizon)[ + #set text(size: 16pt) + #underline(group-title-state.get()) + #linebreak() + #next-heading + ] + } + }, + context { + if show-progression { + colbreak() + + align(right + horizon, { + // La slide actuelle n'est pas passée + let max-dots = 13 + + let passed-slides = group-current-slide.get().at(0) - 1 + let remaining-slides = ( + group-slide-count.get().at(0) - passed-slides - 1 + ) + + let total-slides = passed-slides + remaining-slides + 1 + + if total-slides > max-dots { + if passed-slides > 1 { + passed-slides = calc.max( + 1, + passed-slides - (total-slides - max-dots), + ) + } + total-slides = passed-slides + remaining-slides + 1 + if total-slides > max-dots { + remaining-slides = calc.max( + 0, + remaining-slides - (total-slides - max-dots), + ) + } + } + + let slidecircle(fill: none) = box(inset: 3pt, circle( + radius: 4pt, + fill: fill, + )) + + for _ in range(passed-slides) { + slidecircle( + fill: config.campus.style.primary-color.transparentize(60%), + ) + } + + slidecircle(fill: config.campus.style.primary-color) + + for _ in range(remaining-slides) { + slidecircle() + } + }) + } + }, + ) +} + diff --git a/packages/preview/heh-template/1.0.0/components/headers/year-title.typ b/packages/preview/heh-template/1.0.0/components/headers/year-title.typ new file mode 100644 index 0000000000..435813ebca --- /dev/null +++ b/packages/preview/heh-template/1.0.0/components/headers/year-title.typ @@ -0,0 +1,20 @@ +#import "/utils/states.typ": heh-config + +// Affiche le titre à gauche et l'académique à droite +#let year-title( + title-left: true, +) = context { + let config = heh-config.get() + let year-content = [ + Année académique #text(config.document.year, fill: config.campus.style.primary-color) + ] + let title-content = config.document.title + + let lhs = if title-left { title-content } else { year-content } + let rhs = if title-left { year-content } else { title-content } + + lhs + h(1fr) + rhs +} + diff --git a/packages/preview/heh-template/1.0.0/data/campus.typ b/packages/preview/heh-template/1.0.0/data/campus.typ new file mode 100644 index 0000000000..f55e07d943 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/data/campus.typ @@ -0,0 +1,189 @@ +#let default-style-config( + decorations-color: rgb("#2F5496"), + primary-color: rgb("#2756a2"), + onprimary-color: rgb("#FFFFFF"), +) = { + ( + decorations-color: decorations-color, + primary-color: primary-color, + onprimary-color: onprimary-color, + ) +} + +#let default-contact-config( + address-line1: "Avenue Victor Maistriau 8a", + address-line2: "B-7000 Mons", + phone-nr-pretty: "+32 (0)65 33 81 54", + phone-nr-short: auto, + mail: "scitech-mons@heh.be", +) = { + ( + address-line1: address-line1, + address-line2: address-line2, + phone-nr-pretty: phone-nr-pretty, + phone-nr-short: if phone-nr-short == auto { + phone-nr-pretty.replace("(0)", "").replace(" ", "") + } else { phone-nr-short }, + mail: mail, + ) +} + +#let default-naming-config( + short-name: "DST", + full-name: "Département des sciences et technologies", + logo-title: "Sciences", + logo-subtitle: "et technologies", +) = { + ( + short-name: short-name, + full-name: full-name, + logo-title: logo-title, + logo-subtitle: logo-subtitle, + ) +} + +#let default-config( + naming: default-naming-config, + contact: default-contact-config, + style: default-style-config, +) = { + ( + naming: naming(), + contact: contact(), + style: style(), + ) +} + +// Les configs du DST sont les configurations par défaut +#let dst-naming-config = default-naming-config +#let dst-contact-config = default-contact-config +#let dst-style-config = default-style-config.with( + primary-color: rgb("#E41513"), + onprimary-color: rgb("#FFFFFF"), +) + +#let dst-config = default-config.with( + naming: dst-naming-config, + contact: dst-contact-config, + style: dst-style-config, +) + +#let dss-ms-naming-config = default-naming-config.with( + short-name: "DSS-MS", + full-name: "Département des sciences sociales (Mons)", + + logo-title: "Sciences", + logo-subtitle: "sociales", +) + + +#let dss-ms-contact-config = default-contact-config.with( + address-line1: "Avenue Victor Maistriau 13", + address-line2: "B-7000 Mons", + phone-nr-pretty: "+32 (0)65 39 48 90", + mail: "social-mons@heh.be", +) + +#let dss-style-config = default-style-config.with( + primary-color: rgb("#EB6922"), + onprimary-color: rgb("#FFFFFF"), +) + +#let dss-ms-config = default-config.with( + naming: dss-ms-naming-config, + contact: dss-ms-contact-config, + style: dss-style-config, +) + +#let dss-to-naming-config = default-naming-config.with( + short-name: "DSS-TO", + full-name: "Département des sciences sociales (Tournai)", +) + +#let dss-to-contact-config = default-contact-config.with( + address-line1: "Rue des Carmes 19B", + address-line2: "B-7500 Tournai", + + phone-nr-pretty: "+32 (0)69 22 55 12", + mail: "social-tournai@heh.be", +) + +#let dss-to-config = default-config.with( + naming: dss-to-naming-config, + contact: dss-to-contact-config, + style: dss-style-config, +) + +#let dsee-ms-naming-config = default-naming-config.with( + short-name: "DSEE-MS", + full-name: "Département des sciences de l'éducation et de l'enseignement (Mons)", + + logo-title: "Sciences de l'éducation", + logo-subtitle: "et Enseignement", +) + +#let dsee-ms-contact-config = default-contact-config.with( + address-line1: "Boulevard Albert-Elisabeth 2", + address-line2: "B-7000 Mons", + + phone-nr-pretty: "+32 (0)65 33 76 66", + mail: "peda-mons@heh.be", +) + +#let dsee-style-config = default-style-config.with( + primary-color: rgb("#B83A6E"), + onprimary-color: rgb("#FFFFFF"), +) + +#let dsee-ms-config = default-config.with( + naming: dsee-ms-naming-config, + contact: dsee-ms-contact-config, + style: dsee-style-config, +) + +#let dsee-to-naming-config = default-naming-config.with( + short-name: "DSS-TO", + full-name: "Département des sciences de l'éducation et de l'enseignement (Tournai)", +) + +#let dsee-to-contact-config = default-contact-config.with( + address-line1: "Rue des Carmes 19B", + address-line2: "B-7500 Tournai", + + phone-nr-pretty: "+32 (0)69 22 55 12", + mail: "peda-tournai@heh.be", +) + +#let dsee-to-config = default-config.with( + naming: dsee-to-naming-config, + contact: dsee-to-contact-config, + style: dsee-style-config, +) + +#let deco-naming-config = default-naming-config.with( + short-name: "DECO", + full-name: "Département des sciences juridiques, économiques et de gestion", + + logo-title: "Sciences juridiques,", + logo-subtitle: "économiques et de gestion", +) + +#let deco-contact-config = default-contact-config.with( + address-line1: "Rue du Chambge 23", + address-line2: "B-7500 Tournai", + + phone-nr-pretty: "+32 (0)69 22 67 72", + mail: "eco-tournai@heh.be", +) + +#let deco-style-config = default-style-config.with( + primary-color: rgb("#6E5EA5"), + onprimary-color: rgb("#FFFFFF"), +) + +#let deco-config = default-config.with( + naming: deco-naming-config, + contact: deco-contact-config, + style: deco-style-config, +) + diff --git a/packages/preview/heh-template/1.0.0/data/config.typ b/packages/preview/heh-template/1.0.0/data/config.typ new file mode 100644 index 0000000000..687e9fb731 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/data/config.typ @@ -0,0 +1,57 @@ +#let default-document-config( + title: "Titre", + description: "Description", + formation: "Nom de la formation", + orientation: "Orientation", + year: "2025 - 2026", + authors: ( + ("Prenom Nom", "prenom.nom@std.heh.be"), + ("Xy Z", "xy.z@std.heh.be"), + ), + exam-session: "Juin 2026", + internal-promoter: "NOM PRÉNOM", + thanks: "Mes plus sincères remerciements à toutes les personnes qui nous ont aidées de près ou de loin à réaliser le projet HEH-Template", +) = { + return ( + title: title, + description: description, + formation: formation, + orientation: orientation, + year: year, + authors: authors, + exam-session: exam-session, + internal-promoter: internal-promoter, + thanks: thanks, + ) +} + +#let outlines = ( + headings: (target: heading, title: "Table des matières"), + tables: (target: figure.where(kind: table), title: "Table des tableaux"), + images: (target: figure.where(kind: image), title: "Table des images"), +) + +#let default-outlines-values = ( + outlines.headings, + outlines.tables, + outlines.images, +) + +#let default-print-config( + monochrome: false, + monochromeimages: true, + outlines: default-outlines-values, + show-blank-page: false, + font: "Roboto", + lang: "fr", +) = { + return ( + monochrome: monochrome, + monochromeimages: monochromeimages, + outlines: outlines, + font: font, + lang: lang, + show-blank-page: show-blank-page, + ) +} + diff --git a/packages/preview/heh-template/1.0.0/demo_presentation.pdf b/packages/preview/heh-template/1.0.0/demo_presentation.pdf new file mode 100644 index 0000000000..75f9efce53 Binary files /dev/null and b/packages/preview/heh-template/1.0.0/demo_presentation.pdf differ diff --git a/packages/preview/heh-template/1.0.0/demo_presentation.typ b/packages/preview/heh-template/1.0.0/demo_presentation.typ new file mode 100644 index 0000000000..d2b65425d3 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/demo_presentation.typ @@ -0,0 +1,116 @@ +#import "/lib.typ": ( + campus, config, heh-presentation, important, info, slide, slidegroup, +) + +#import "@preview/polylux:0.4.0": item-by-item, one-by-one, uncover +#import "@preview/mmdr:0.2.2": mermaid +#import "@preview/cetz:0.5.2" +#import "@preview/cetz-plot:0.1.3" + +#show: heh-presentation.with( + document-config-fn: config.default-document-config.with( + title: "Présentation du HEH-Template", + description: "Présentation de démonstration de HEH-Template", + formation: none, + orientation: none, + authors: ( + ("Contributeurs de HEH-Template", ""), + ), + ), + print-config-fn: config.default-print-config.with( + monochrome: "monochrome" in sys.inputs and sys.inputs.monochrome == "true", + ), + campus-config-fn: campus.dst-config, +) + +#slidegroup("Introduction au template")[ + #slide[ + == Les tableaux + + #show: align.with(center) + + #table( + columns: 3, + table.header([*ID*], [*E-Mail*], [*Nom*]), + [1], [john.doe\@heh.be], [John Doe], + [2], [john.doe\@heh.be], [John Doe], + ) + ] + + #slide[ + == Boites + + #info[ + Vous pouvez faire des informations sur vos slides! + ] + + #important[ + N'oubliez pas d'utiliser le handout mode pour publier vos présentations en supprimant les animations + ] + ] +] + +#slidegroup("Exemples")[ + #slide[ + == Mathématiques + + === Formules de Carnot + + #item-by-item[ + - $cos(a)^2 = frac(1 + cos(2a), 2)$ + - $sin(a)^2 = frac(1 - cos(2a), 2)$ + - $tan(a)^2 = frac(1 - cos(2a), 1 + cos(2a))$ + ] + + #one-by-one(start: 4)[ + === Formules de simpson + + #item-by-item(start: 5)[ + - $cos(a) + cos(b) = 2cos((a + b) / 2) cos((a - b) / 2)$ + - $cos(a) - cos(b) = -2sin((a + b) / 2) sin((a - b) / 2)$ + - $tan(a) + tan(b) = sin(a + b) / (cos(a) cos(b))$ + ] + ] + ] + + #slide[ + #show: align.with(horizon) + + == Diagrammes avec Mermaid + + #mermaid( + "gitGraph + commit id: \"Initial commit\" + branch feat/add-presentations + checkout feat/add-presentations + commit id: \"feat: Ajout du support des présentations\" + commit id: \"feat: Ajout du support du handout-mode\" + checkout main + merge feat/add-presentations + commit + commit + ", + ) + ] + + #slide[ + #show: align.with(center + horizon) + == Graphiques avec CETZ + + #cetz.canvas({ + import cetz.draw: * + import cetz-plot: * + + plot.plot( + size: (10, 5), + x-tick-step: calc.pi, + y-tick-step: 1, + plot.add( + domain: (-2 * calc.pi, 2 * calc.pi), + x => calc.sin(x), + ), + ) + }) + ] +] + diff --git a/packages/preview/heh-template/1.0.0/lib.typ b/packages/preview/heh-template/1.0.0/lib.typ new file mode 100644 index 0000000000..5bb4ebea9a --- /dev/null +++ b/packages/preview/heh-template/1.0.0/lib.typ @@ -0,0 +1,20 @@ +#import "/pages/cover-page.typ": heh-cover-page +#import "/pages/presentation-cover-page.typ": presentation-cover-page +#import "/pages/tfe-cover-page.typ": tfe-cover-page +#import "/pages/outline.typ": heh-outline-page +#import "/pages/blank-page.typ": heh-blank-page +#import "/pages/thanks.typ": thanks-page + +#import "/data/config.typ" +#import "/data/campus.typ" + +#import "/utils/states.typ": heh-config +#import "/utils/presentations.typ": slidegroup + +#import "/components/headers/headers.typ" +#import "/components/footers/footers.typ" +#import "/components/boxes.typ": hint, important, info, silly +#import "/components/double-table.typ": double-table + +#import "/templates.typ": heh-document, heh-presentation, heh-tfe +#import "@preview/polylux:0.4.0": enable-handout-mode, slide diff --git a/packages/preview/heh-template/1.0.0/manuel.pdf b/packages/preview/heh-template/1.0.0/manuel.pdf new file mode 100644 index 0000000000..c29e68d676 Binary files /dev/null and b/packages/preview/heh-template/1.0.0/manuel.pdf differ diff --git a/packages/preview/heh-template/1.0.0/manuel.typ b/packages/preview/heh-template/1.0.0/manuel.typ new file mode 100644 index 0000000000..7e6862a53c --- /dev/null +++ b/packages/preview/heh-template/1.0.0/manuel.typ @@ -0,0 +1,490 @@ +#import "/lib.typ": ( + config, double-table, heh-config, heh-document, hint, important, info, +) + +#show: heh-document.with( + document-config-fn: config.default-document-config.with( + title: "Documentation de HEH-Template", + description: "Démonstration et documentation du template", + formation: none, + orientation: none, + authors: ( + ("Contributeurs de HEH-Template", ""), + ), + ), + print-config-fn: config.default-print-config.with( + monochrome: "monochrome" in sys.inputs and sys.inputs.monochrome == "true", + ), +) + += Utilisation basique + +Pour utiliser le template, commencez par le télécharger dans le dossier de vos paquets locaux typst. Ici par exemple, sous `heh-template/1.0.0`. Pour respecter la charte graphique HEH, la *police utilisée est Roboto*, pensez donc à l'installer aussi. + +Afin que le style sout appliqué en entier, utilisez une directive `show` globale au document: + +```typst +#import "@preview/heh-template:1.0.0" : heh-document, campus, config + +// Appel du template en utilisant le style du département technique (DST) +#show: heh-document.with( + campus-config-fn: campus.dst-config, + document-config-fn: config.default-document-config +) + += Premier titre + +``` + += Configuration du document + +Pour modifier la configuration du document, vous devez modifier la fonction `default-document-config` avec `.with()` pour changer ses paramètres par défaut. Par exemple: + +```typst +#import "@preview/heh-template:1.0.0" : heh-document, campus, config + +// Appel du template en utilisant le style du département technique (DST) +#show: heh-document.with( + campus-config-fn: campus.dst-config, + document-config-fn: config.default-document-config.with( + title: "Titre", // Titre du document + description: "Description", // Description du document + formation: "Bachelier en Informatique", // Nom de la formation + orientation: "Orientation développement", // Orientation / sous-titre de la formation + year: "2025 - 2026", // Année académique + authors: ( // Liste contentn le prenom/nom des auteurs avec leur email + ("Prenom Nom", "prenom.nom@std.heh.be"), + ("Xy Z", "xy.z@std.heh.be"), + ), + ) +) + +// Reste du document + += Premier titre +``` + += Style du document + +Comme paramètre pour `campus-config-fn`, vous pouvez choisir parmi les différents départements de la HEH. + +- `dst-config` : Département des sciences et technologies +- `dss-ms-config` : Département des sciences sociales (Mons) +- `dss-to-config` : Département des sciences sociales (Tournai) +- `dsee-ms-config` : Département des sciences de l'éducation et de l'enseignement (Mons) +- `dsee-to-config` : Département des sciences de l'éducation et de l'enseignement (Tournai) +- `deco-config` : Département des sciences juridiques, économiques et de gestion + + += Configuration de l'impression / des pages + +Les données de configuration des pages / du document se trouvent dans `print-config-fn` qui peut être modifiée de la même façon que `document-config-fn`. Par exemple: + +```typst +... +#show: heh-document.with( + ... + print-config-fn: default-print-config.with( + monochrome: false, // Si `true`, le document sera affiché uniquement en nuances de gris, + monochromeimages: true, // Si `true` et que le mode monochrome est activé, transforme automatiquement toutes les images du document en nuances de gris, + + outlines: ( + config.outlines.headings, + config.outlines.tables, + config.outlines.images, + ), // Une liste de dictionnaires avec 'target' comme sélecteur et 'title' pour le titre de la table. + + font: "Roboto", // Police d'écriture du document, + lang: "fr", // Langage du document + ) +) +... +``` + +#important[ + Le paramètre `monochromeimages` utilise un module externe pour transformer les images en nuances de gris. La conversion peut prendre un certain temps lors de la compilation. + + Les images à convertir doivent être spécifiées avec un `path` comme ceci: `#image(path("image.png"))` +] + +#hint[ + Pour définir le paramètre `monochrome` plus simplement, vous pouvez utilise `sys.inputs` et compiler le fichier avec `--input monochrome=true` + + ```typst + ... + monochrome: "monochrome" in sys.inputs and sys.inputs.monochrome == "true" + ... + ``` +] + +#hint[ + Pour désactiver la table des matières, vous pouvez définir la valeur de `outline` a *`none`*. Si une partie de la table des matières n'a rien a afficher (pas de tableaux, d'images, d'en-têtes, ...), elle ne s'affichera pas. + ```typst + outlines: none, // désactive la table des matières + ``` +] + +#hint[ + Vous pouvez également importer certaines tables des matières préfaites pour vous depuis la variable `config.outlines` afin de gagner du temps et de la lisiblité sur votre document: + - `config.outlines.headings` + - `config.outlines.tables` + - `config.outlines.images` + ```typst + outlines: (config.outlines.headings, ) // ATTENTION! La virgule est nécéssaire + ``` +] + += Configuration des pieds de page et en-têtes + +Les pieds et en-têtes de page n'étant pas standards pour toute la HEH, le template propose *plusieurs styles* et vous permet de définir les vôtres facilement en modifiant les paramètres `header-style` et `footer-style` de `heh-document`. Vous pouvez également y rajouter des paramètres supplémentaires en utilisant la fonction `.with()` sur la fonction du header / footer + +== Exemple de changement de footers + +```typst +#import "@preview/heh-template:1.0.0" : headers, footers, ... +... +#show: heh-document.with( + ... + header-style: headers.year-title, // Affiche l'année académique et le titre + header-extra-params: (), + footer-style: footer.page-numbers.with( + show-total: false + ), // Affiche les numéros de pages (sans le total) +) +... + +``` + +== Définition d'une fonction personalisée (headers / footers) + +```typst +#import "@preview/heh-template:1.0.0": ..., heh-config +... +#let myheader( + show-logo: false +) = context { + // Accès à config.campus, config.document et config.print + let config = heh-config.get() +} + +#show: heh-document.with( + ... + header-style: myheader.with(show-logo: true), +) +``` + +== Liste des footers + +- Numéros de page (@footers-no) +- Numéros de page avec indicateur de côté (@footers-no-sided) + +=== Numéros de page + +Affiche les numéros de page à droite de la page + +```typst +... +footer-style: footers.page-numbers +... +``` + +==== Paramètres + +- `show-total`: Affiche le nombre total de pages du document à coté (par défaut) + +=== Numéros de page avec indicateur de coté + +Affiche les numéros de page à gauche ou à droite de la page, selon la ou elle devrait être imprimée (page de gauche => gauche, page de droite => droite) + +```typst +... +footer-style: footers.page-numbers-side +... +``` + +==== Paramètres + +- `show-total`: Affiche le nombre total de pages du document à coté (par défaut) + +== Liste des headers + +- Logo, année et titre @logo-year-title +- Année académique et titre @year-title + +=== Logo, année et titre + +Affiche le logo a gauche et l'année académique / le titre à droite + +```typst +header-style: headers.logo-year-title +``` + +==== Paramètres `.with()` + +- `bool show-year`: Affiche l'année acadamique (par défaut) +- `bool show-title`: Affiche le titre du document (par défaut) + +=== Année académique et titre + +Affiche le titre et l'année académique (par défaut le titre à gauche et l'année à droite) + +```typst +... +header-style: headers.year-title +... +``` + +==== Paramètres (`.with()`) + +- `bool title-left`: Affiche le titre à gauche (par défaut) + += Modifier les configurations d'un campus + +Si vous souhaitez modifier les configurations d'un campus (changer les noms, les couleurs, ...), vous pouvez utiliser les versions modifiées de `**-naming-config`, `**-style-config` et `**-contact-config`. + +Voici le schéma des configurations: + +```typst +( + naming: ( + short-name: "DST", + full-name: "Département des sciences et technologies", + logo-title: "Sciences", + logo-subtitle: "et technologies", + ), + contact: ( + address-line1: "Avenue Victor Maistriau 8a", + address-line2: "B-7000 Mons", + phone-nr-pretty: "+32 (0)65 33 81 54", + phone-nr-short: "+3265338154", + mail: "scitech-mons@heh.be", + ), + style: ( + decorations-color: rgb("#2f5496"), + primary-color: rgb("#e41513"), + onprimary-color: rgb("#ffffff"), + ), +) +``` + +== Exemple: modification des noms + +```typst +... +campus-config-fn: campus.dst-config.with( + naming: campus.dst-naming-config.with( + full-name: "Département des technologies et sciences" + ) +) +... +``` + += Fonctionnalités du template + +== Tableaux + +Le template propose des tableaux stylysés avec les couleurs des différents campus de la HEH. Le style est appliqué par défaut pour les tableaux créés avec `#table()` + +Dans le heh-template, nous avons stylisé des tableaux en thème avec les couleurs des différents campus de la heh. le style est appliqué par défault si vous faites un simple tableau `#table()`. + +Par exemple: +```typ +#table( + columns: (50pt, 1fr, 1fr), + table.header( + [ID], [Nom], [Email] + ), + [1], [John Doe], [john.doe\@std.heh.be], + [2], [John Doe], [john.doe\@std.heh.be], + [3], [John Doe], [john.doe\@std.heh.be], +) +``` + +#table( + columns: (50pt, 1fr, 1fr), + table.header([ID], [Nom], [Email]), + [1], [John Doe], [john.doe\@std.heh.be], + [2], [John Doe], [john.doe\@std.heh.be], + [3], [John Doe], [john.doe\@std.heh.be], +) + +== Tableaux double entrées + +Si vous voulez utiliser des tableaux a double entrée, vous pouvez importer directement `#double-table()` depuis heh-template + +```typ +#double-table( + columns: (50pt, 1fr, 1fr), + [], [A], [not A], + [B], [O], [X], + [not B], [X], [X] +) +``` + +#double-table( + columns: (50pt, 1fr, 1fr), + [], + [A], + [not A], + [B], + [O], + [X], + [not B], + [X], + [X], +) + +== Tableaux personalisés + +Pour l'instant, le template ne propose que des tableaux à simple et à double entrée. Si vous souhaitez pousser la modification des tableaux, vous pouvez créer vos propres fonctions: + +Vous pouvez utiliser le `state` `heh-config` qui contient l'ensemble de la configuration du document + +```typ +#let custom-table( + ..args +) = context { + + let primary-color = heh-config.get().campus.style.primary-color + + show table.cell: it => { + if(it.y <= 1 or it.x == 0) { + set text(white, weight: "bold") + it + } else { + it + } + } + + table(..args, fill: (x, y) => { + if (y <= 1 or x == 0) { + primary-color.darken(40%) + } else { + primary-color.transparentize(90%) + } + }) +} +``` + +Et son utilisation en pratique: + +#block(breakable: false)[ + ```typ + #custom-table( + columns: (1fr, 1fr, 1fr, 1fr, 1fr), + table.cell(rowspan: 2)[], + table.cell(colspan: 2)[2025], + table.cell(colspan: 2)[2026], + table.cell(colspan: 2)[Quad 1], + [Quad 2], [Quad 3], + [Rattrapage?], + table.cell(colspan: 2)[Non], + [Non], + [Oui] + ) + ``` +] +#let custom-table( + ..args, +) = context { + let primary-color = heh-config.get().campus.style.primary-color + + show table.cell: it => { + if (it.y <= 1 or it.x == 0) { + set text(white, weight: "bold") + it + } else { + it + } + } + + table(..args, fill: (x, y) => { + if (y <= 1 or x == 0) { + primary-color.darken(40%) + } else { + primary-color.transparentize(90%) + } + }) +} + +#custom-table( + columns: (1fr, 1fr, 1fr, 1fr, 1fr), + table.cell(rowspan: 2)[], + table.cell(colspan: 2)[2025], + table.cell(colspan: 2)[2026], + table.cell(colspan: 2)[Quad 1], + [Quad 2], + [Quad 3], + [Rattrapage?], + table.cell(colspan: 2)[Non], + [Non], + [Oui], +) + +== Boites (information / important / ...) + +Boites d'information, avertissement, d'astuces, ... pour mettre en évidence du texte + +Pour les utilisez, importez les fonctions `info`, `important` ou `hint` depuis le template. + +=== Exemple + +```typst +#import "@preview/heh-template:1.0.0" : info, important, hint + +#info[Information utile] +#hint[N'oubliez pas que vous pouvez entièrement customiser les boites d'information] +#important[N'oubliez pas de mettre à jour le template] +``` + +#info[Information utile] +#hint[N'oubliez pas que vous pouvez entièrement customiser les boîtes d'information] +#important[N'oubliez pas de mettre à jour le template] + +=== Boites personalisées + +Pour créer vos propres boites, vous pouvez simplement modifier les fonctions existantes: + +```typst +#let superimportant = important.with( + accent-color: rgb("#8B0000"), + title: "Super important !", +) + +#superimportant[Attention, il faut impérativement penser à mettre à jour le template] +``` + +== Présentations + +HEH-Template vous permet de réaliser des présentations composées de slides avec l'aide de #link("https://polylux.dev/book", "polylux"). Pour un exemple plus complet, référez vous à `demo_presentation.typ`. + +=== Utilisation basique + +Les présentations sont composées de groupes de slides. Ceux ci sont créés avec la fonction `slidegroup`. Par exemple: + +```typst +#import "@preview/heh-template:1.0.0": heh-presentation, slidegroup, slide + +#show: heh-presentation.with( + ... // config + handout-mode: false // Active le mode "handout" (supprime les animations) +) + + +#slidegroup("Introduction")[ + #slide[ + == Titre de la slide + + Bonjour ! + ] + + #slide[ + == Titre de l'autre slide + + Hello ! + ] +] +``` + +Vous pouvez aussi utiliser les `uncover`, `item-by-item`, ... et les autres helpers de polylux pour faire des animations (référez vous à la #link("https://polylux.dev/book", "documentation polylux")) + diff --git a/packages/preview/heh-template/1.0.0/meta/banner.svg b/packages/preview/heh-template/1.0.0/meta/banner.svg new file mode 100644 index 0000000000..3b9a7fce79 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/meta/banner.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/heh-template/1.0.0/meta/components.svg b/packages/preview/heh-template/1.0.0/meta/components.svg new file mode 100644 index 0000000000..a9a9de247c --- /dev/null +++ b/packages/preview/heh-template/1.0.0/meta/components.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/heh-template/1.0.0/meta/whatisincluded.svg b/packages/preview/heh-template/1.0.0/meta/whatisincluded.svg new file mode 100644 index 0000000000..ed44401119 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/meta/whatisincluded.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/heh-template/1.0.0/pages/blank-page.typ b/packages/preview/heh-template/1.0.0/pages/blank-page.typ new file mode 100644 index 0000000000..f045f2cfac --- /dev/null +++ b/packages/preview/heh-template/1.0.0/pages/blank-page.typ @@ -0,0 +1,12 @@ +#import "/data/config.typ": default-print-config + +#let heh-blank-page( + print-config-fn: default-print-config, +) = { + let print-config = print-config-fn() + let show-blank-page = print-config.show-blank-page + + if (show-blank-page) { + pagebreak() + } +} diff --git a/packages/preview/heh-template/1.0.0/pages/cover-page.typ b/packages/preview/heh-template/1.0.0/pages/cover-page.typ new file mode 100644 index 0000000000..5b056e1693 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/pages/cover-page.typ @@ -0,0 +1,107 @@ +#import "/utils/utils.typ": campus-branded-svg, heh-logo +#import "/utils/states.typ": heh-config + +#let heh-cover-page() = context { + let config = heh-config.get() + set page(margin: (x: 45pt, y: 45pt), header: none, footer: none) + set text(font: ("Roboto", "Inter"), size: 14pt) + show link: set text(fill: black) + + box(heh-logo(width: 200pt)) + h(1fr) + [Année académique #text(config.document.year, fill: config.campus.style.primary-color)] + + line(length: 100pt, stroke: 3pt + config.campus.style.primary-color) + + { + set text(size: 8pt) + box( + width: 40%, + { + grid( + columns: (13pt, 1fr), + align: horizon, + row-gutter: 5pt, + column-gutter: 5pt, + + campus-branded-svg( + "/assets/icons/address.vsvg", + ), + text( + config.campus.contact.address-line1 + + linebreak() + + config.campus.contact.address-line2, + ), + + campus-branded-svg( + "/assets/icons/phone.vsvg", + ), + link( + "tel:" + config.campus.contact.phone-nr-short, + config.campus.contact.phone-nr-pretty, + ), + + campus-branded-svg( + "/assets/icons/mail.vsvg", + ), + link( + "mailto:" + config.campus.contact.mail, + config.campus.contact.mail, + ), + ) + box( + fill: config.campus.style.primary-color, + inset: 5pt, + text( + "WWW.HEH.BE", + weight: "bold", + fill: config.campus.style.onprimary-color, + ), + ) + }, + ) + } + + v(1fr) + + align(right, box( + fill: config.campus.style.primary-color, + width: 75%, + inset: (x: 20pt, y: 20pt), + align(left)[ + #set text(size: 15pt, fill: config.campus.style.onprimary-color) + + #text(weight: "bold")[ + #config.document.title + ] + + #config.document.description + + #config.document.formation \ + #config.document.orientation + ], + )) + + v(1fr) + + align(bottom, grid( + columns: (1fr, auto, auto), + gutter: 24pt, + text( + config + .document + .authors + .map(it => ( + it.at(0) + linebreak() + link("mailto:" + it.at(1), it.at(1)) + )) + .join(linebreak()), + ), + + image( + "/assets/logos/wbe.svg", + alt: "Logo de WBE (Wallonie-Bruxelles Enseignement)", + height: 5%, + ), + image("/assets/logos/ph.svg", alt: "Logo du Pôle Hainuyer", height: 5%), + )) +} diff --git a/packages/preview/heh-template/1.0.0/pages/outline.typ b/packages/preview/heh-template/1.0.0/pages/outline.typ new file mode 100644 index 0000000000..4f91813838 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/pages/outline.typ @@ -0,0 +1,19 @@ +#import "/data/config.typ": default-print-config +#import "/utils/utils.typ": show-if-has-match + +#let heh-outline-page( + print-config-fn: default-print-config, +) = { + let print-config = print-config-fn() + let outlines = print-config.outlines + + if (outlines != none and outlines != ()) { + for o in outlines { + show-if-has-match( + selector: o.target, + to-show: outline.with(title: o.title, target: o.target), + ) + } + pagebreak() + } +} diff --git a/packages/preview/heh-template/1.0.0/pages/presentation-cover-page.typ b/packages/preview/heh-template/1.0.0/pages/presentation-cover-page.typ new file mode 100644 index 0000000000..11fa5e6ef7 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/pages/presentation-cover-page.typ @@ -0,0 +1,110 @@ +#import "/utils/utils.typ": campus-branded-svg, heh-logo +#import "/utils/states.typ": heh-config + +#let presentation-cover-page() = context { + let config = heh-config.get() + set page(margin: (x: 30pt, y: 30pt), header: none, footer: none) + set text(font: ("Roboto", "Inter"), size: 12pt) + show link: set text(fill: black) + + box(heh-logo(width: 200pt)) + h(1fr) + [Année académique #text(config.document.year, fill: config.campus.style.primary-color)] + + line(length: 100pt, stroke: 3pt + config.campus.style.primary-color) + + { + set text(size: 8pt) + box( + width: 40%, + { + grid( + columns: (13pt, 1fr), + align: horizon, + row-gutter: 5pt, + column-gutter: 5pt, + + campus-branded-svg( + "/assets/icons/address.vsvg", + ), + text( + config.campus.contact.address-line1 + + linebreak() + + config.campus.contact.address-line2, + ), + + campus-branded-svg( + "/assets/icons/phone.vsvg", + ), + link( + "tel:" + config.campus.contact.phone-nr-short, + config.campus.contact.phone-nr-pretty, + ), + + campus-branded-svg( + "/assets/icons/mail.vsvg", + ), + link( + "mailto:" + config.campus.contact.mail, + config.campus.contact.mail, + ), + ) + box( + fill: config.campus.style.primary-color, + inset: 5pt, + text( + "WWW.HEH.BE", + weight: "bold", + fill: config.campus.style.onprimary-color, + ), + ) + }, + ) + } + + v(1fr) + + grid( + columns: (auto, 1fr), + text( + config + .document + .authors + .map(it => ( + it.at(0) + linebreak() + link("mailto:" + it.at(1), it.at(1)) + )) + .join(linebreak()), + ), + align(right, box( + fill: config.campus.style.primary-color, + width: 90%, + inset: (x: 20pt, y: 20pt), + align(left)[ + #set text(size: 15pt, fill: config.campus.style.onprimary-color) + + #text(weight: "bold")[ + #config.document.title + ] + + #config.document.description + + #config.document.formation \ + #config.document.orientation + ], + )), + ) + + v(1fr) + + align(bottom + right, grid( + columns: (auto, auto), + gutter: 24pt, + + image( + "/assets/logos/wbe.svg", + alt: "Logo de WBE (Wallonie-Bruxelles Enseignement)", + height: 5%, + ), + image("/assets/logos/ph.svg", alt: "Logo du Pôle Hainuyer", height: 5%), + )) +} diff --git a/packages/preview/heh-template/1.0.0/pages/tfe-cover-page.typ b/packages/preview/heh-template/1.0.0/pages/tfe-cover-page.typ new file mode 100644 index 0000000000..d1848d56fb --- /dev/null +++ b/packages/preview/heh-template/1.0.0/pages/tfe-cover-page.typ @@ -0,0 +1,81 @@ +#import "/utils/utils.typ": heh-logo +#import "/components/headers/headers.typ": logo-year-title +#import "/utils/states.typ": heh-config + +#let tfe-cover-page( + show-year: false, +) = context { + set page(margin: (x: 45pt, y: 45pt), header: none, footer: none) + set text(font: ("Roboto", "Inter"), size: 14pt) + show link: set text(fill: black) + let config = heh-config.get() + logo-year-title(show-title: false) + + v(.4fr) + + align( + center, + text( + size: 14pt, + top-edge: 1.25em, + spacing: 100% + 2pt, + )[ + HAUTE ÉCOLE DE LA COMMUNAUTÉ FRANÇAISE EN HAINAUT \ + #config.campus.naming.full-name \ + #config.campus.contact.address-line1 - #config.campus.contact.address-line2 + ], + ) + + v(1fr) + + align( + center, + text(size: 16pt, weight: "bold")[ + #config.document.title + ], + ) + + v(.3fr) + + align( + center, + text(size: 12pt)[ + #config.document.description + ], + ) + + v(1fr) + + let columns-amount = 2 + if (show-year) { + columns-amount = 3 + } + + columns(columns-amount)[ + Promoteur.trice interne : #config.document.internal-promoter + #colbreak() + #if (show-year) { + align(center, config.document.exam-session) + colbreak() + } + #align(right, { + grid( + columns: (auto, auto), + gutter: .5em, + [Rédigé par : ], + { + align(left, { + for author in config.document.authors { + author.at(0) + linebreak() + } + }) + }, + ) + }) + ] + + pagebreak() +} + +#tfe-cover-page() diff --git a/packages/preview/heh-template/1.0.0/pages/thanks.typ b/packages/preview/heh-template/1.0.0/pages/thanks.typ new file mode 100644 index 0000000000..1c42414091 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/pages/thanks.typ @@ -0,0 +1,10 @@ +#import "/utils/states.typ": heh-config + +#let thanks-page() = context { + let config = heh-config.get() + box( + width: 60%, + text(style: "italic", { config.document.thanks }), + ) + pagebreak() +} diff --git a/packages/preview/heh-template/1.0.0/style/defaults.typ b/packages/preview/heh-template/1.0.0/style/defaults.typ new file mode 100644 index 0000000000..3a4f6ce797 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/style/defaults.typ @@ -0,0 +1,16 @@ +#import "/style/images.typ": heh-images-defaults +#import "/style/text.typ": ( + heh-headings-defaults, heh-links-defaults, heh-raw-defaults, +) +#import "/style/tables.typ": heh-table-defaults + +#let heh-style-defaults( + doc, +) = { + show: heh-headings-defaults + show: heh-links-defaults + show: heh-raw-defaults + + show: heh-table-defaults + doc +} diff --git a/packages/preview/heh-template/1.0.0/style/images.typ b/packages/preview/heh-template/1.0.0/style/images.typ new file mode 100644 index 0000000000..b96f905a9f --- /dev/null +++ b/packages/preview/heh-template/1.0.0/style/images.typ @@ -0,0 +1,38 @@ +#import "/utils/states.typ": heh-config + +#let heh-images-defaults(doc) = context { + let config = heh-config.get() + show image: it => { + if ( + config.print.monochromeimages + and config.print.monochrome + and type(it.source) == path + ) { + import "@preview/grayness:0.8.0": plg + let source = read(it.source, encoding: none) + + let is-svg = source.slice(0, 1).at(0) == str.to-unicode("<") + + let graybytes = if is-svg { + plg.svg-grayscale(source) + } else { + plg.grayscale(source) + } + + image( + graybytes, + alt: it.alt, + width: it.width, + height: it.height, + page: it.page, + fit: it.fit, + scaling: it.scaling, + icc: it.icc, + ) + } else { + it + } + } + + doc +} diff --git a/packages/preview/heh-template/1.0.0/style/tables.typ b/packages/preview/heh-template/1.0.0/style/tables.typ new file mode 100644 index 0000000000..51e12b279c --- /dev/null +++ b/packages/preview/heh-template/1.0.0/style/tables.typ @@ -0,0 +1,32 @@ +#import "/utils/states.typ": heh-config + +#let heh-table-defaults( + doc, +) = context { + let config = heh-config.get() + show table: it => box(radius: 5pt, clip: true, it) + + set table( + stroke: none, + inset: 0.6em, + gutter: 2pt, + fill: (x, y) => { + if (y == 0) { + config.campus.style.primary-color.darken(40%) + } else { + config.campus.style.primary-color.transparentize(90%) + } + }, + ) + + show table.cell: it => { + if (it.y == 0) { + set text(white, weight: "bold") + it + } else { + it + } + } + + doc +} diff --git a/packages/preview/heh-template/1.0.0/style/text.typ b/packages/preview/heh-template/1.0.0/style/text.typ new file mode 100644 index 0000000000..a1303b20ea --- /dev/null +++ b/packages/preview/heh-template/1.0.0/style/text.typ @@ -0,0 +1,42 @@ +#import "/utils/states.typ": heh-config + +#let heh-headings-defaults(doc) = context { + let config = heh-config.get() + let decorations-color = config.campus.style.decorations-color + + show heading: set text(weight: "medium") if not config.print.monochrome + show heading.where(level: 1): set text( + fill: decorations-color, + ) if not config.print.monochrome + show heading.where(level: 2): set text( + fill: decorations-color.lighten(5%), + ) if not config.print.monochrome + show heading.where(level: 3): set text( + fill: decorations-color.lighten(10%), + ) if not config.print.monochrome + + set par(spacing: 2em, leading: 0.8em) + show heading: set text(top-edge: 1.6em, bottom-edge: "descender") + + doc +} + +#let heh-links-defaults(doc) = context { + let config = heh-config.get() + let decorations-color = config.campus.style.decorations-color + + show link: set text( + fill: decorations-color.lighten(15%), + ) if not config.print.monochrome + show link: it => if config.print.monochrome { underline(it) } else { it } + + doc +} + +#let heh-raw-defaults(doc) = context { + let config = heh-config.get() + set raw(theme: none) if config.print.monochrome + + doc +} + diff --git a/packages/preview/heh-template/1.0.0/template/main.typ b/packages/preview/heh-template/1.0.0/template/main.typ new file mode 100644 index 0000000000..47c5319e5f --- /dev/null +++ b/packages/preview/heh-template/1.0.0/template/main.typ @@ -0,0 +1,19 @@ +#import "@preview/heh-template:1.0.0": * + +#show: heh-document.with( + document-config-fn: config.default-document-config.with( + title: "Titre du document", + description: "Description du document", + formation: none, + orientation: none, + authors: ( + ("Auteur", "john.doe@example.com"), + ), + ), + print-config-fn: config.default-print-config.with( + monochrome: "monochrome" in sys.inputs and sys.inputs.monochrome == "true", + ), +) + += Hello, world + diff --git a/packages/preview/heh-template/1.0.0/templates.typ b/packages/preview/heh-template/1.0.0/templates.typ new file mode 100644 index 0000000000..ae35169049 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/templates.typ @@ -0,0 +1,201 @@ +#import "/pages/cover-page.typ": heh-cover-page +#import "/pages/presentation-cover-page.typ": presentation-cover-page +#import "/pages/tfe-cover-page.typ": tfe-cover-page +#import "/pages/outline.typ": heh-outline-page +#import "/pages/blank-page.typ": heh-blank-page +#import "/pages/thanks.typ": thanks-page + +#import "/data/config.typ" +#import "/data/campus.typ" + +#import "/utils/states.typ": heh-config +#import "/utils/presentations.typ": slidegroup + +#import "/components/headers/headers.typ" +#import "/components/footers/footers.typ" +#import "/components/boxes.typ": hint, important, info, silly +#import "/components/double-table.typ": double-table + +#import "/style/defaults.typ" as style-defaults + +#import "@preview/polylux:0.4.0": enable-handout-mode, slide + +#let heh-common-template(doc) = context { + let config = heh-config.get() + + set text(font: (config.print.font, "Open Sans"), lang: config.print.lang) + set document(title: config.document.description) + show: style-defaults.heh-images-defaults + show: style-defaults.heh-style-defaults + + doc +} + +#let heh-document( + document-config-fn: config.default-document-config, + print-config-fn: config.default-print-config, + campus-config-fn: campus.dst-config, + + header-style: headers.logo-year-title, + footer-style: footers.page-numbers, + + doc, +) = context { + let document-config = document-config-fn() + let print-config = print-config-fn() + let campus-config-fn = campus-config-fn + + if print-config.monochrome { + campus-config-fn = campus-config-fn.with( + style: campus.default-style-config.with( + primary-color: black, + onprimary-color: white, + decorations-color: black, + ), + ) + } + + let campus-config = campus-config-fn() + + let conf = ( + document: document-config, + print: print-config, + campus: campus-config, + ) + heh-config.update(conf) + + show: heh-common-template + + set page("a4") + set heading(numbering: "1.") + + heh-cover-page() + pagebreak() + + set page( + header: context header-style(), + margin: (top: 125pt), + ) + + heh-outline-page() + heh-blank-page() + + set page(footer: context footer-style()) + + counter(page).update(1) + doc +} + +#let heh-presentation( + document-config-fn: config.default-document-config, + print-config-fn: config.default-print-config, + campus-config-fn: campus.dst-config, + + handout-mode: false, + doc, +) = context { + let document-config = document-config-fn() + let print-config = print-config-fn() + let campus-config-fn = campus-config-fn + + if print-config.monochrome { + campus-config-fn = campus-config-fn.with( + style: campus.default-style-config.with( + primary-color: black, + onprimary-color: white, + decorations-color: black, + ), + ) + } + + let campus-config = campus-config-fn() + + let conf = ( + document: document-config, + print: print-config, + campus: campus-config, + ) + heh-config.update(conf) + enable-handout-mode(handout-mode) + + set text(size: 20pt) + show: heh-common-template + set page( + "presentation-16-9", + + header: context { headers.presentation-header() }, + footer: context { footers.presentation-footer() }, + margin: (top: 100pt, x: 30pt), + ) + + slide[#presentation-cover-page()] + + show heading.where(level: 2): none + + doc +} + +#let heh-tfe( + document-config-fn: config.default-document-config, + print-config-fn: config.default-print-config, + + campus-config-fn: campus.dst-config, + + header-style: headers.logo-year-title, + footer-style: footers.page-numbers, + + doc, +) = { + let document-config = document-config-fn() + let print-config = print-config-fn() + let campus-config-fn = campus-config-fn + + if print-config.monochrome { + campus-config-fn = campus-config-fn.with( + style: campus.default-style-config.with( + primary-color: black, + onprimary-color: white, + decorations-color: black, + ), + ) + } + + let campus-config = campus-config-fn() + + let conf = ( + document: document-config, + print: print-config, + campus: campus-config, + ) + heh-config.update(conf) + + show: heh-common-template + set page("a4") + set heading(numbering: "1.") + + show: style-defaults.heh-images-defaults.with() + show: style-defaults.heh-style-defaults.with() + + tfe-cover-page() + pagebreak() + tfe-cover-page(show-year: true) + + thanks-page() + + set page( + header: context header-style(), + margin: (top: 125pt), + ) + + heh-outline-page() + + heh-blank-page() + + set page( + footer: context footer-style(), + ) + + counter(page).update(1) + + doc +} diff --git a/packages/preview/heh-template/1.0.0/thumbnail.png b/packages/preview/heh-template/1.0.0/thumbnail.png new file mode 100644 index 0000000000..f77655d6b5 Binary files /dev/null and b/packages/preview/heh-template/1.0.0/thumbnail.png differ diff --git a/packages/preview/heh-template/1.0.0/typst.toml b/packages/preview/heh-template/1.0.0/typst.toml new file mode 100644 index 0000000000..3868a089f8 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/typst.toml @@ -0,0 +1,29 @@ +[package] +name = "heh-template" +version = "1.0.0" +description = "Unofficial HEH reports and presentations template" +authors = ["Woomymy", "Hana"] +license = "MIT" +repository = "https://github.com/heh-dst-students/typst-template" +keywords = ["heh", "report-template", "presentation-template", "haute-ecole-en-hainaut"] +categories = ["presentation", "report"] +disciplines = ["computer-science", "education", "engineering", "mathematics", "physics"] + +entrypoint = "lib.typ" +compiler = "0.15.0" +exclude = [ + "*.pdf", + "manuel.typ", + "demo_presentation.typ", + "Justfile", + "CONTRIBUTING.md", + "CODE_OF_CONDUCT.md", + "STYLE.md", + ".gitignore", + ".github" +] + +[template] +path = "template" +entrypoint = "main.typ" +thumbnail = "thumbnail.png" diff --git a/packages/preview/heh-template/1.0.0/utils/presentations.typ b/packages/preview/heh-template/1.0.0/utils/presentations.typ new file mode 100644 index 0000000000..9320392dfd --- /dev/null +++ b/packages/preview/heh-template/1.0.0/utils/presentations.typ @@ -0,0 +1,41 @@ +#import "/utils/states.typ": ( + group-current-slide, group-slide-count, group-title-state, heh-config, + slidegroups-count, +) +#import "/components/headers/headers.typ": presentation-header + +#import "@preview/polylux:0.4.0": slide + +#let slidegroup(title, content) = context { + let configuration = heh-config.get() + let subslides = content.children.filter(it => repr(it.func()) == "sequence") + slidegroups-count.step() + group-slide-count.update(subslides.len()) + group-title-state.update(title) + group-current-slide.update(0) + + slide[ + #align(left + horizon, [ + #set page(header: context { + presentation-header(show-progression: false, show-titles: false) + }) + #set heading(numbering: "1.") + #show heading: set text( + size: 1.5em, + weight: "bold", + fill: black, + top-edge: "cap-height", + ) + + = #title + ]) + ] + + slide[] + + for subslide in subslides { + group-current-slide.step() + subslide + } +} + diff --git a/packages/preview/heh-template/1.0.0/utils/states.typ b/packages/preview/heh-template/1.0.0/utils/states.typ new file mode 100644 index 0000000000..ca520e8445 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/utils/states.typ @@ -0,0 +1,16 @@ +// Contient la configuration du document +#let heh-config = state( + "heh-config", + ( + document: (:), + print: (:), + campus: (:), + ), +) + + +#let slidegroups-count = counter("slidegroups") +#let group-slide-count = counter("group-slide-count") +#let group-title-state = state("group-title", "") +#let group-current-slide = counter("group-current-slide") + diff --git a/packages/preview/heh-template/1.0.0/utils/utils.typ b/packages/preview/heh-template/1.0.0/utils/utils.typ new file mode 100644 index 0000000000..102f6eb0a9 --- /dev/null +++ b/packages/preview/heh-template/1.0.0/utils/utils.typ @@ -0,0 +1,95 @@ +#import "/utils/states.typ": heh-config + +#let get-next-heading(level: 1) = context { + let headings = query(heading.where(level: level).after(here())) + if headings.len() > 0 { + let h = headings.first() + if h.location().page() == here().page() { + h.body + } else { + none + } + } else { + none + } +} + +#let show-if-has-match( + selector: heading, + to-show: outline, +) = context { + if (counter(selector).final().at(0) >= 1) { + to-show() + } +} + +#let template-svg( + source, + params: (key: "variable", value: "value"), + ..args, +) = { + let imageString = read(source) + + for param in params { + imageString = imageString.replace( + regex("\{" + param.key + "\}"), + param.value, + ) + } + + image(bytes(imageString), ..args) +} + +#let single-color-svg( + source, + color, + ..args, +) = template-svg( + source, + params: ((key: "color", value: color.to-hex()),), + ..args, +) + +#let campus-branded-svg( + source, + ..args, +) = context { + let config = heh-config.get() + template-svg( + source, + params: ( + (key: "color", value: config.campus.style.primary-color.to-hex()), + (key: "title", value: config.campus.naming.logo-title), + (key: "subtitle", value: config.campus.naming.logo-subtitle), + ), + ..args, + ) +} + +#let heh-logo(..args) = campus-branded-svg( + "/assets/logos/heh-logo.vsvg", + ..args, +) + +#let format-author-names( + authors, + include-email, + email-separator: linebreak(), +) = { + let formatted-authors = () + + for author in authors { + // Le 3ème champ peut être le nom abrégé de l'auteur + let name = author.at(2, default: author.at(0)) + let email = author.at(1) + + if include-email { + formatted-authors.push([#name#email-separator#email]) + } else { + formatted-authors.push([#name]) + } + } + + return formatted-authors +} +