diff --git a/themes/itix/LICENSE b/themes/itix/LICENSE
new file mode 100644
index 0000000..9e18be0
--- /dev/null
+++ b/themes/itix/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Nicolas Massé
+
+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/themes/itix/README.md b/themes/itix/README.md
new file mode 100644
index 0000000..c2ab83b
--- /dev/null
+++ b/themes/itix/README.md
@@ -0,0 +1 @@
+# Theme for www.itix.fr
diff --git a/themes/itix/assets/css/.gitignore b/themes/itix/assets/css/.gitignore
new file mode 100644
index 0000000..c94d1fd
--- /dev/null
+++ b/themes/itix/assets/css/.gitignore
@@ -0,0 +1 @@
+chroma.css
\ No newline at end of file
diff --git a/themes/itix/assets/css/itix.css b/themes/itix/assets/css/itix.css
new file mode 100644
index 0000000..a6fc294
--- /dev/null
+++ b/themes/itix/assets/css/itix.css
@@ -0,0 +1,859 @@
+:root {
+ /*
+ * Theme colors
+ */
+ --main-color: #1870c9; /* Adjusted to ensure a 4.5:1 contrast ratio for accessibility */
+ --main-background-color: #fcfcfc;
+ --alternate-text-color: #145ca4;
+ --main-text-color: #092949; /* 50% darker than main-color */
+ --active-menu-background-color: #f4f8fb;
+ --active-menu-color: #0e4377;
+ --active-menu-border-color: #74abe3;
+ --hover-menu-background-color: #f4f8fb;
+ --hover-menu-color: #0e4377;
+ --hover-menu-border-color: #74abe3;
+ --post-metadata-color: #555;
+ --text-selection-background-color: #a2c7ec;
+ --quote-background-color: #f0f5fa;
+ --quote-border-color: #589bdd;
+ --codeblock-background-color: #ebf2f9;
+ --toc-background-color: #f0f5fa;
+ --pagination-disabled-color: #555;
+ --table-border-color: #092949;
+
+ /*
+ * Layout
+ */
+ --menu-container-width: 25%;
+ --toolbar-container-width: 25%;
+
+ /*
+ * Fonts
+ */
+ --default-font-list: "Source Serif Pro", serif;
+ --mono-font-list: "JetBrains Mono", monospace;
+ --sans-preferred-font-list: "Source Sans Pro", sans-serif;
+
+}
+
+/*
+ * Fonts
+ */
+@font-face{
+ font-family: 'JetBrains Mono';
+ src: url('/fonts/JetBrainsMono-Regular.woff2') format('woff2'),
+ url('/fonts/JetBrainsMono-Regular.woff') format('woff'),
+ url('/fonts/JetBrainsMono-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+
+ /*
+ * Core Web Vitals / Cumulative Layout Shift.
+ *
+ * Avoid showing invisible text while custom fonts load.
+ */
+ font-display: swap;
+}
+
+@font-face{
+ font-family: 'Source Serif Pro';
+ src: url('/fonts/SourceSerifPro-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+
+ /*
+ * Core Web Vitals / Cumulative Layout Shift.
+ *
+ * Avoid showing invisible text while custom fonts load.
+ */
+ font-display: swap;
+}
+
+@font-face{
+ font-family: 'Source Sans Pro';
+ src: url('/fonts/SourceSansPro-Regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+
+ /*
+ * Core Web Vitals / Cumulative Layout Shift.
+ *
+ * Avoid showing invisible text while custom fonts load.
+ */
+ font-display: swap;
+}
+
+/*
+ * General settings
+ */
+
+::selection {
+ /* Text selection uses the theme main color with some transparency */
+ background: var(--text-selection-background-color);
+}
+
+body {
+ background: var(--main-background-color);
+ padding: 0;
+ margin: 0;
+ font-family: var(--default-font-list);
+ color: var(--main-text-color);
+}
+
+* {
+ /* By default in the CSS box model, the width and height you assign to an
+ * element is applied only to the element's content box. If the element has
+ * any border or padding, this is then added to the width and height to arrive
+ * at the size of the box that's rendered on the screen. This means that when
+ * you set width and height, you have to adjust the value you give to allow
+ * for any border or padding that may be added.
+ *
+ * border-box tells the browser to account for any border and padding in the
+ * values you specify for an element's width and height. If you set an element's
+ * width to 100 pixels, that 100 pixels will include any border or padding you
+ * added, and the content box will shrink to absorb that extra width.
+ * This typically makes it much easier to size elements.
+ */
+ box-sizing: border-box;
+}
+
+/*
+ * Heading and figure numbering
+ */
+
+main, #TableOfContents {
+ /*
+ * all counters need to be specified on one single line
+ * and they have to be reset on an enclosing element
+ */
+ counter-reset: h2 figcaption;
+}
+
+h2::before, #TableOfContents > ul > li::before {
+ content: counter(h2) ".\0000a0\0000a0"; /* \0000a0 => Non-breakable space */
+ counter-increment: h2;
+}
+
+h2, #TableOfContents > ul > li {
+ counter-reset: h3;
+}
+
+h3::before, #TableOfContents > ul > li > ul > li::before {
+ content: counter(h2) "." counter(h3) ".\0000a0\0000a0";
+ counter-increment: h3;
+}
+
+figcaption::before {
+ /*
+ * When the numbering is done in CSS, we cannot honor typographical
+ * conventions of the user language. So, here I chose the english convention
+ * with no space before the colon and a space after.
+ */
+ content: "Figure " counter(figcaption) ": ";
+ counter-increment: figcaption;
+
+}
+
+/*
+ * Main content formatting
+ */
+
+h1, h2, h3 {
+ font-weight: bold;
+ line-height: 1.5em;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin: 20px 0 20px 0;
+}
+
+h1 {
+ font-size: 30px;
+}
+
+h2 {
+ font-size: 24px;
+}
+
+h3 {
+ font-size: 21px;
+}
+
+h4 {
+ font-size: 21px;
+}
+
+h5 {
+ font-size: 20px;
+}
+
+h6 {
+ font-size: 19px;
+}
+
+figure {
+ margin: 0;
+}
+
+figure figcaption {
+ font-style: italic;
+}
+
+ul {
+ list-style-type: "\2013\0000a0";
+ list-style-position: outside;
+}
+
+textarea,
+select,
+input,
+button {
+ outline: none !important;
+}
+
+main table {
+ table-layout: fixed;
+ overflow-x: scroll;
+ border-collapse: collapse;
+ width: 100%;
+ table-layout: auto;
+}
+
+main table td, main table th {
+ border: 1px solid var(--table-border-color);
+ padding: 0.2rem 0.5rem;
+}
+
+button {
+ cursor: pointer;
+}
+
+blockquote {
+ padding: 10px 20px;
+ border-left: 3px solid var(--quote-border-color);
+ color: var(--alternate-text-color);
+ background: var(--quote-background-color);
+}
+
+blockquote p {
+ margin-bottom: 0;
+}
+
+blockquote * {
+ color: var(--alternate-text-color);
+}
+
+a {
+ color: var(--main-color);
+}
+
+a:hover {
+ color: var(--alternate-text-color);
+}
+
+/*
+ * Code block
+ */
+
+pre.chroma {
+ /* Overide the default chroma background color with ours */
+ background: var(--codeblock-background-color);
+}
+
+/* Code block (three backticks in markdown) */
+pre {
+ background: var(--codeblock-background-color);
+ padding: 12px 15px;
+ border-radius: 5px;
+ font-family: var(--mono-font-list);
+
+ /* Do not wrap lines of code */
+ overflow-x: hidden;
+
+ /* Hide scrollbar for IE, Edge and Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+
+/* Hide scrollbar for Chrome, Safari and Opera */
+pre::-webkit-scrollbar {
+ display: none;
+}
+
+/* Inline code (single backticks in markdown) */
+code {
+ color: var(--alternate-text-color);
+ background: var(--codeblock-background-color) !important;
+ padding: 2px 5px;
+ border-radius: 3px;
+ font-family: var(--mono-font-list);
+}
+
+/*
+ * And because there is a code tag inside a pre tag for Markdown code blocks,
+ * we need to overide some properties
+ */
+pre code {
+ background: none !important;
+ font-family: var(--mono-font-list) !important;
+ padding: 0;
+}
+
+/*
+ * Highlighted file has a wrapping div. Some properties are redefined for it
+ * and reset to their default value for its children.
+ */
+.highlightedFile {
+ background: var(--codeblock-background-color);
+ border-radius: 5px;
+}
+
+.highlightedFile .filename {
+ border-bottom: 2px solid var(--hover-menu-border-color);
+ font-family: var(--sans-preferred-font-list) !important;
+ font-size: larger;
+ padding: 12px 15px;
+}
+
+.highlightedFile pre {
+ background: inherit;
+ border-radius: inherit;
+ padding: 12px 15px;
+ margin: 0;
+}
+
+
+pre:hover {
+ /* Show the horizontal scroll bar when hovering code (if needed) */
+ overflow-x: auto;
+}
+
+/*
+ * i18n
+ */
+.tiny-flag {
+ vertical-align: middle;
+ margin-left: 5px;
+ margin-right: 5px;
+}
+
+/*
+ * Pagination
+ */
+.pagination {
+ list-style: none;
+ padding: 0;
+ text-align: center;
+ font-size: larger;
+}
+
+.pagination .page-item {
+ display: inline;
+ margin: 5px;
+}
+
+.pagination .disabled {
+ color: var(--pagination-disabled-color);
+}
+
+.pagination .active {
+ font-weight: bold;
+}
+
+/*
+ * Article list
+ */
+
+.article-list p {
+ /* Move the excerpt closer to the metadata */
+ margin-top: 0.5em;
+ /* Add spacing around each item of the list */
+ margin-bottom: 2.5em;
+}
+
+.article-list h4 {
+ /* Move the title closer to the metadata */
+ margin-bottom: 0.5em;
+}
+
+.article-list .post-metadata {
+ /* Fade the metadata */
+ color: var(--post-metadata-color);
+}
+
+.article-list .continue-reading {
+ /* Leave some space between the excerpt and the "continue reading" link */
+ margin-left: 0.5em;
+}
+
+/*
+ * Post Metadata (valid for the "list" and "single" views)
+ */
+.post-metadata .material-icons {
+ vertical-align: sub;
+ margin-right: 3px;
+ margin-left: 5px;
+ max-height: 1rem;
+}
+
+.post-metadata time {
+ /* Leave some space between publication date and taxonomies */
+ margin-right: 20px;
+}
+
+
+article .post-metadata {
+ /* Leave some space between the metadata and the title */
+ margin-top: 20px;
+}
+
+/*
+ * Single post layout
+ */
+article {
+ padding: 50px 35px 20px 35px;
+ font-size: 16px;
+ line-height: 1.5em;
+}
+
+article img, article video {
+ max-width: 100%;
+ height: auto;
+ border-radius: 5px;
+ overflow: hidden;
+}
+
+article p {
+ text-align: justify;
+ text-justify: inter-word;
+}
+
+article header {
+ padding-bottom: 30px;
+ font-style: normal;
+ line-height: 1.5em;
+
+ /* Align the site title with the article title */
+ padding-top: 11px;
+}
+
+/* Article title */
+article header h1 {
+ font-size: 30px;
+ margin: 0;
+}
+
+/* Article subtitle */
+article header h4 {
+ font-size: 18px;
+ opacity: 0.6;
+ padding: 0px 0 8px 0;
+}
+
+/*
+ * Menu (left side)
+ */
+.menu-lang {
+ padding-right: 28px;
+}
+
+.menu-head, .menu-link-list a, .menu-head:hover, .menu-link-list a:hover {
+ display: block;
+ text-decoration: none !important;
+ cursor: pointer;
+ border-right: 2px solid transparent;
+}
+
+.menu-head.active, .menu-link-list a.active {
+ border-right: 2px solid var(--active-menu-border-color);
+ background: var(--active-menu-background-color);
+ color: var(--active-menu-color);
+}
+
+.menu-head:hover, .menu-link-list a:hover {
+ border-right: 2px solid var(--hover-menu-border-color);
+ background: var(--hover-menu-background-color);
+ color: var(--hover-menu-color);
+}
+
+.menu-footer {
+ padding: 20px 30px 0 20px;
+ font-size: 12px;
+}
+
+.menu-head {
+ padding: 30px 28px 30px 20px;
+ margin-bottom: 10px;
+ color: var(--main-text-color);
+}
+
+.menu-title {
+ --menu-title-size: 30px;
+ font-size: var(--menu-title-size);
+ line-height: calc(var(--menu-title-size) * 1.4);
+}
+
+.menu-subtitle {
+ margin-top: 8px;
+ font-size: 18px;
+}
+
+
+.menu-link-list {
+ flex-grow: 1;
+}
+
+.menu-link-list a {
+ font-size: 20px;
+ margin-bottom: 10px;
+ padding: 8px 28px 8px 30px;
+ color: var(--main-text-color);
+}
+
+.menu-content {
+ position: fixed;
+ top: 0;
+ height: 100vh;
+ width: var(--menu-container-width);
+ text-align: right;
+ font-family: var(--sans-preferred-font-list);
+ padding: 20px 0 50px 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+
+ /* Below the hamburger menu but on top of the overlay */
+ z-index: 253;
+}
+
+/*
+ * Hamburger menu
+ */
+.menu input.hamburger-menu {
+ display: block;
+ width: 80px;
+ height: 72px;
+ position: fixed;
+ top: 0px;
+ left: 0px;
+ margin: 0;
+
+ cursor: pointer;
+
+ opacity: 0; /* hide this */
+ z-index: 255; /* and place it over the hamburger */
+
+ -webkit-touch-callout: none;
+}
+
+/*
+ * Draw the hamburger
+ */
+.menu div.hamburger-menu {
+ width: 32px;
+ height: 4px;
+ position: fixed;
+ left: 24px;
+
+ background: var(--main-text-color);
+ border-radius: 3px;
+
+ z-index: 254;
+
+ transform-origin: center;
+ transition: transform 0.5s cubic-bezier(0.77,0.2,0.05,1.0),
+ opacity 0.55s ease;
+}
+
+.menu div.hamburger-menu:nth-child(2) {
+ top: 25px;
+}
+
+.menu div.hamburger-menu:nth-child(3) {
+ top: 34px;
+}
+
+.menu div.hamburger-menu:nth-child(4) {
+ top: 43px;
+}
+
+/* Transform all the slices of hamburger into a crossmark. */
+.menu input.hamburger-menu:checked ~ div.hamburger-menu:nth-child(2) {
+ opacity: 1;
+ transform: translate(0, 9px) rotate(45deg);
+}
+
+/* But let's hide the middle one. */
+.menu input.hamburger-menu:checked ~ div.hamburger-menu:nth-child(3) {
+ opacity: 0;
+ transform: rotate(0deg) scale(0.2, 0.2);
+}
+
+/* And the last one should go the other direction */
+.menu input.hamburger-menu:checked ~ div.hamburger-menu:nth-child(4) {
+ transform: translate(0, -9px) rotate(-45deg);
+}
+
+/* On mobile browsers, keep a title displayed on top */
+.menu .mobile-title {
+ padding: 20px 80px 20px 80px;
+ margin: 0;
+ width: 100%;
+ height: 80px;
+ line-height: 40px; /* line-height = height - padding-top - padding-bottom */
+ text-align: center;
+ font-size: calc(var(--heading1-size) - 3 * var(--heading-diff));
+ font-weight: bold;
+ position: fixed;
+ box-shadow: 0 0 16px rgba(0, 0, 0, 0.12);
+ background-color: var(--main-background-color);
+}
+
+/* But hide them by default. They will be uncovered when needed by media queries */
+.menu .hamburger-menu, .menu .mobile-title {
+ display: none;
+}
+
+/*
+ * Toolbar (right side)
+ */
+.toolbar {
+ position: fixed;
+ top: 0;
+ right: 0;
+ width: var(--toolbar-container-width);
+ font-family: var(--sans-preferred-font-list);
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-end;
+}
+
+.actions {
+ position: fixed;
+ bottom: 0;
+ display: flex;
+ flex-direction: row;
+ margin-bottom: 50px;
+ margin-left: 30px;
+}
+
+.actions .action {
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+ margin-right: 10px;
+}
+
+.actions a {
+ text-decoration: none;
+ color: var(--main-text-color);
+}
+
+.actions a:visited {
+ color: var(--main-text-color);
+}
+
+.actions .material-icons {
+ height: 2rem;
+ width: auto;
+}
+
+/*
+ * Search page
+ */
+.search input {
+ width: 100%;
+}
+
+@media screen {
+ /*
+ * Main part of the page (center)
+ *
+ * Enclosed in @media screen block because this style is not desired for
+ * printing.
+ */
+ main {
+ padding-left: var(--menu-container-width);
+ padding-right: var(--toolbar-container-width);
+ width: 100%;
+
+ min-height: 100vh;
+ }
+
+ /* Immediate children of main gets a left/right shadow */
+ main > * {
+ box-shadow: 0 0 16px rgba(0, 0, 0, 0.12);
+ min-height: 100vh;
+ }
+}
+
+/*
+ * Table of content (within the toolbar on the right)
+ */
+.toc {
+ float: right;
+ border-radius: 5px;
+ margin-left: 30px;
+ margin-right: 60px;
+ margin-top: 30px;
+ max-width: 260px;
+ max-height: 80vh;
+ overflow: auto;
+ background: var(--toc-background-color);
+ padding: 20px;
+ font-size: 16px;
+}
+
+.toc ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ line-height: 1.7em;
+}
+
+.toc h4 {
+ text-align: center;
+ margin: 0 0 10px 0;
+}
+
+/* Mathjax container */
+mjx-container {
+ overflow-y: hidden !important;
+}
+
+/*
+ * Reactive tweaks
+ */
+@media screen and (max-width: 1440px) {
+ :root {
+ --menu-container-width: 20%;
+ }
+}
+
+@media screen and (max-width: 1280px) {
+ .toc {
+ display: none;
+ }
+ :root {
+ --toolbar-container-width: 5%;
+ }
+}
+
+@media screen and (max-width: 1140px) {
+ article {
+ padding: 30px 20px 20px 20px;
+ }
+
+ main {
+ padding: 0;
+ min-height: unset;
+ }
+
+ .toolbar {
+ display: none;
+ }
+
+ .toc {
+ line-height: 2em;
+ float: none;
+ margin-top: 30px;
+ margin-left: 0;
+ margin-right: 0;
+ }
+
+ /*
+ * On mobile devices, there are no :hover events. So we must always
+ * propose horizontal scrollbars when needed.
+ */
+ pre {
+ overflow-x: auto;
+ }
+
+ .menu .hamburger-menu, .menu .mobile-title {
+ display: block;
+ }
+
+ /*
+ * On mobile, leave some room above the article so that the title + hamburger
+ * menu do not hide the article title.
+ */
+ main > *:first-child {
+ padding-top: 110px;
+ }
+
+ .menu .menu-content {
+ width: 300px;
+ left: -300px;
+ height: 100vh;
+ background-color: var(--main-background-color);
+ position: fixed;
+ transform: none;
+ transition: transform 0.2s linear;
+ }
+
+ .menu .menu-overlay {
+ display: block;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+ transition: background-color 0.2s linear;
+
+ /*
+ * Put the overlay on the bottom of the stack so that it does not catch
+ * click events.
+ */
+ z-index: -1;
+ }
+
+
+ /*
+ * When the hamburger menu is clicked, show the menu content and enable
+ * the overlay that hides the article content.
+ */
+ .menu input.hamburger-menu:checked ~ .menu-content {
+ transform: translate(300px, 0);
+ }
+
+ .menu input.hamburger-menu:checked ~ .menu-overlay {
+ /* Semi transparent background */
+ background-color: rgba(0, 0, 0, 0.5);
+
+ /* Below the hamburger menu, the menu content but over the article content */
+ z-index: 250;
+ }
+
+ /*
+ * Leave some room between the list items in the term pages so that it is
+ * easier to click on mobile. Also makes Google happy.
+ */
+ .terms ul li {
+ line-height: 2em;
+ }
+}
+
+@media screen and (max-width: 512px) {
+ /*
+ * On mobile, hide some post metadata
+ */
+ .post-metadata .opensource, .post-metadata .topic, .post-metadata .reading-time {
+ display: none;
+ }
+}
+
+/*
+ * Tweaks for printing
+ */
+@media print {
+ .menu, .menu-content, .hamburger-menu, .toolbar {
+ display: none !important;
+ }
+
+ /* Since you cannot scroll horizontally on a paper, wrap the code blocks */
+ pre {
+ white-space: pre-wrap;
+ word-break: break-all;
+ word-wrap: break-word;
+ }
+}
\ No newline at end of file
diff --git a/themes/itix/i18n/en.yaml b/themes/itix/i18n/en.yaml
new file mode 100644
index 0000000..c9751f4
--- /dev/null
+++ b/themes/itix/i18n/en.yaml
@@ -0,0 +1,42 @@
+- id: last_modify_on
+ translation: Last modified on
+- id: published_on
+ translation: Published on
+- id: date_format
+ translation: "January 2, 2006"
+- id: toc
+ translation: Table of contents
+- id: back_to_top
+ translation: Top of the page
+- id: minutes
+ translation:
+ one: '{{ .Count }} minute'
+ other: '{{ .Count }} minutes'
+- id: continue_reading
+ translation: Continue reading
+- id: articles_related_to
+ translation: Articles related to
+- id: recent_articles
+ translation: Recent articles
+- id: not_found
+ translation: This page does not exist!
+- id: go_home
+ translation: Go Home
+- id: search
+ translation: Search
+- id: search_here
+ translation: Search something...
+- id: type_blog
+ translation: Article
+- id: type_writing
+ translation: Writing
+- id: type_speaking
+ translation: Speaking
+- id: type_page
+ translation: Misc.
+- id: show_menu
+ translation: Show the menu
+- id: file
+ translation: 'File "%s"'
+- id: rss_feed
+ translation: 'RSS Feed'
diff --git a/themes/itix/i18n/fr.yaml b/themes/itix/i18n/fr.yaml
new file mode 100644
index 0000000..97f4d90
--- /dev/null
+++ b/themes/itix/i18n/fr.yaml
@@ -0,0 +1,42 @@
+- id: last_modify_on
+ translation: Dernière modification le
+- id: published_on
+ translation: Publié le
+- id: date_format
+ translation: "02/01/2006"
+- id: toc
+ translation: Sommaire
+- id: back_to_top
+ translation: Retour en haut de la page
+- id: minutes
+ translation:
+ one: '{{ .Count }} minute'
+ other: '{{ .Count }} minutes'
+- id: continue_reading
+ translation: Continuer la lecture
+- id: articles_related_to
+ translation: Articles concernant
+- id: recent_articles
+ translation: Articles récents
+- id: not_found
+ translation: Cette page n'existe pas !
+- id: go_home
+ translation: Retour à la page d'accueil
+- id: search
+ translation: Recherche
+- id: search_here
+ translation: Rechercher quelque chose...
+- id: type_blog
+ translation: Article
+- id: type_writing
+ translation: Publication
+- id: type_speaking
+ translation: Conférence
+- id: type_page
+ translation: Divers
+- id: show_menu
+ translation: Afficher le menu
+- id: file
+ translation: 'Fichier "%s"'
+- id: rss_feed
+ translation: 'Flux RSS'
diff --git a/themes/itix/layouts/404.html b/themes/itix/layouts/404.html
new file mode 100644
index 0000000..a1f13c8
--- /dev/null
+++ b/themes/itix/layouts/404.html
@@ -0,0 +1,9 @@
+{{ define "main" }}
+
+
+
+ {{ i18n "not_found" }}
+
+ {{ i18n "go_home" }}
+
+{{ end }}
diff --git a/themes/itix/layouts/_default/baseof.html b/themes/itix/layouts/_default/baseof.html
new file mode 100644
index 0000000..7e439ca
--- /dev/null
+++ b/themes/itix/layouts/_default/baseof.html
@@ -0,0 +1,14 @@
+
+
+
+{{ partial "head.html" . }}
+
+
+
+{{ partial "menu.html" . }}
+{{ partial "toolbar.html" . }}
+
+{{ block "main" . }}{{- end }}
+
+
+
diff --git a/themes/itix/layouts/_default/search.html b/themes/itix/layouts/_default/search.html
new file mode 100644
index 0000000..6793f86
--- /dev/null
+++ b/themes/itix/layouts/_default/search.html
@@ -0,0 +1,214 @@
+{{ define "main" }}
+
+
+
+ {{ .Title }}
+ {{- with .Description }}
+ {{ . }}
+ {{- end }}
+
+ {{ .Content }}
+
+
+
+
+ {{- range $_, $file := (slice "en" "fr" "label" "link" "schedule") -}}
+
+ {{- partial (printf "icons/%s.svg" $file) . -}}
+
+ {{- end }}
+
+
+
+{{ end }}
diff --git a/themes/itix/layouts/_default/section.html b/themes/itix/layouts/_default/section.html
new file mode 100644
index 0000000..38234e3
--- /dev/null
+++ b/themes/itix/layouts/_default/section.html
@@ -0,0 +1,14 @@
+{{ define "main" }}
+
+
+
+ {{ .Content }}
+
+ {{ range (sort .Pages "Date").Reverse }}
+ {{ .Title }}
+ {{ end }}
+
+
+{{ end }}
diff --git a/themes/itix/layouts/_default/single.html b/themes/itix/layouts/_default/single.html
new file mode 100644
index 0000000..264d86e
--- /dev/null
+++ b/themes/itix/layouts/_default/single.html
@@ -0,0 +1,18 @@
+{{ define "main" }}
+
+{{- partial "lang-detection.html" . -}}
+
+
+ {{ .Title }}
+ {{- with .Description }}
+ {{ . }}
+ {{- end }}
+ {{ partial "post-metadata.html" (dict "current" . "parent" .) -}}
+
+ {{ .Content }}
+ {{- if and (not .Lastmod.IsZero) (ne .Lastmod .PublishDate) }}
+
+ {{ i18n "last_modify_on" }} {{ .Lastmod.Format (i18n "date_format") }}
+ {{- end }}
+
+{{ end }}
diff --git a/themes/itix/layouts/_default/taxonomy.html b/themes/itix/layouts/_default/taxonomy.html
new file mode 100644
index 0000000..4b2a3c1
--- /dev/null
+++ b/themes/itix/layouts/_default/taxonomy.html
@@ -0,0 +1,14 @@
+{{ define "main" }}
+
+
+
+ {{ i18n "articles_related_to" }} {{.Parent.Title}} / {{ .Title }} :
+ {{ .Content }}
+ {{ range (.Paginate (sort .Pages "Date").Reverse).Pages }}
+ {{- partial "article-headline.html" (dict "current" . "parent" $.Page) -}}
+ {{ end }}
+ {{ template "_internal/pagination.html" . }}
+
+{{ end }}
diff --git a/themes/itix/layouts/_default/terms.html b/themes/itix/layouts/_default/terms.html
new file mode 100644
index 0000000..5fd4900
--- /dev/null
+++ b/themes/itix/layouts/_default/terms.html
@@ -0,0 +1,14 @@
+{{ define "main" }}
+
+
+
+ {{ .Content }}
+
+ {{ range sort .Pages "Title" }}
+ {{ .Title }}
+ {{ end }}
+
+
+{{ end }}
diff --git a/themes/itix/layouts/blog/list.html b/themes/itix/layouts/blog/list.html
new file mode 100644
index 0000000..f52eb5d
--- /dev/null
+++ b/themes/itix/layouts/blog/list.html
@@ -0,0 +1,14 @@
+{{ define "main" }}
+
+
+
+ {{ .Content }}
+
+ {{ range (.Paginate (sort .Pages "Date").Reverse).Pages }}
+ {{- partial "article-headline.html" (dict "current" . "parent" $.Page) -}}
+ {{ end }}
+ {{ template "_internal/pagination.html" . }}
+
+{{ end }}
diff --git a/themes/itix/layouts/index.html b/themes/itix/layouts/index.html
new file mode 100644
index 0000000..55c23bf
--- /dev/null
+++ b/themes/itix/layouts/index.html
@@ -0,0 +1,24 @@
+{{ define "main" }}
+
+
+
+
+ {{ .Content }}
+
+
+
+ {{ i18n "recent_articles" }}
+
+ {{ range first 5 (sort ((.Site.GetPage "/blog").Pages) "Date").Reverse }}
+ {{- partial "article-headline.html" (dict "current" . "parent" $.Page) -}}
+ {{ end }}
+
+
+{{ end }}
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/article-headline.html b/themes/itix/layouts/partials/article-headline.html
new file mode 100644
index 0000000..84dda21
--- /dev/null
+++ b/themes/itix/layouts/partials/article-headline.html
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/head.html b/themes/itix/layouts/partials/head.html
new file mode 100644
index 0000000..9721db1
--- /dev/null
+++ b/themes/itix/layouts/partials/head.html
@@ -0,0 +1,146 @@
+
+{{.Title}}
+
+
+
+{{ $chroma := resources.Get "css/chroma.css" }}
+{{ $itix := resources.Get "css/itix.css" }}
+{{ $css := slice $chroma $itix | resources.Concat "css/itix.css" | resources.Minify | resources.Fingerprint "sha512" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+{{- if .IsHome }}
+{{- with .Site.Params.description }}
+
+{{- else }}
+
+{{- end }}
+{{- else }}
+{{- with .Params.description }}
+
+{{- else }}
+
+{{- end }}
+{{- end }}
+
+
+{{ with .OutputFormats.Get "rss" -}}
+ {{ printf ` ` .Rel .MediaType.Type .Permalink site.Title | safeHTML }}
+{{ end }}
+
+
+
+
+
+
+
+{{ template "_internal/opengraph.html" . }}
+{{ template "_internal/twitter_cards.html" . }}
+
+
+{{ if eq .Type "search" }}
+
+
+{{ end }}
+
+{{- if .Site.Params.enablePlausible -}}
+
+{{- end -}}
+
+{{- if .Params.enableMathJax -}}
+ {{- partial "mathjax.html" . -}}
+{{- end -}}
+
+
+{{- partial "lang-detection.html" . -}}
+{{- if .IsTranslated -}}
+{{- range .Translations -}}
+{{- if .Scratch.Get "en_article_in_fr_site" -}}
+
+
+
+{{ else }}
+
+
+{{ end -}}
+{{- end -}}
+{{- end -}}
+
+
+{{- if .IsHome -}}
+ {{- $.Scratch.Set "structured_data" (dict "@context" "http://schema.org" "@type" "WebSite" "name" .Site.Title "url" .Site.BaseURL) -}}
+ {{- with .Site.Params.subtitle -}}
+ {{- $.Scratch.SetInMap "structured_data" "description" . -}}
+ {{- end -}}
+{{- else if and .IsPage (eq .Section "blog") -}}
+ {{- $.Scratch.Set "structured_data" (dict "@context" "http://schema.org" "@type" "BlogPosting" "headline" .Title "image" (slice) "articleSection" .Section) -}}
+ {{- if and (eq .Lang "fr") (.Scratch.Get "en_article_in_fr_site") -}}
+ {{- $.Scratch.SetInMap "structured_data" "inLanguage" "en" -}}
+ {{- range first 1 .Translations -}}
+ {{- $.Scratch.SetInMap "structured_data" "mainEntityOfPage" (dict "@type" "WebPage" "@id" .Permalink) -}}
+ {{- end -}}
+ {{- else -}}
+ {{- $.Scratch.SetInMap "structured_data" "inLanguage" .Language.Lang -}}
+ {{- $.Scratch.SetInMap "structured_data" "mainEntityOfPage" (dict "@type" "WebPage" "@id" .Permalink) -}}
+ {{- end -}}
+ {{- if not .PublishDate.IsZero -}}
+ {{- $.Scratch.SetInMap "structured_data" "datePublished" .PublishDate -}}
+ {{- end -}}
+ {{- if and (not .Lastmod.IsZero) (ne .Lastmod .PublishDate) -}}
+ {{- $.Scratch.SetInMap "structured_data" "dateModified" .Lastmod -}}
+ {{- end -}}
+{{- end -}}
+{{- with $.Scratch.Get "structured_data" }}
+
+{{- end }}
+
+
diff --git a/themes/itix/layouts/partials/icons/en.svg b/themes/itix/layouts/partials/icons/en.svg
new file mode 100644
index 0000000..fb59cf0
--- /dev/null
+++ b/themes/itix/layouts/partials/icons/en.svg
@@ -0,0 +1,16 @@
+
+British flag
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/icons/fr.svg b/themes/itix/layouts/partials/icons/fr.svg
new file mode 100644
index 0000000..34f2b8d
--- /dev/null
+++ b/themes/itix/layouts/partials/icons/fr.svg
@@ -0,0 +1,6 @@
+
+French flag
+
+
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/icons/label.svg b/themes/itix/layouts/partials/icons/label.svg
new file mode 100644
index 0000000..631f681
--- /dev/null
+++ b/themes/itix/layouts/partials/icons/label.svg
@@ -0,0 +1,5 @@
+
+label
+
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/icons/link.svg b/themes/itix/layouts/partials/icons/link.svg
new file mode 100644
index 0000000..4b9f27d
--- /dev/null
+++ b/themes/itix/layouts/partials/icons/link.svg
@@ -0,0 +1,5 @@
+
+link
+
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/icons/rss_feed.svg b/themes/itix/layouts/partials/icons/rss_feed.svg
new file mode 100644
index 0000000..310edb1
--- /dev/null
+++ b/themes/itix/layouts/partials/icons/rss_feed.svg
@@ -0,0 +1,6 @@
+
+rss_feed
+
+
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/icons/schedule.svg b/themes/itix/layouts/partials/icons/schedule.svg
new file mode 100644
index 0000000..f61f578
--- /dev/null
+++ b/themes/itix/layouts/partials/icons/schedule.svg
@@ -0,0 +1,6 @@
+
+schedule
+
+
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/icons/search.svg b/themes/itix/layouts/partials/icons/search.svg
new file mode 100644
index 0000000..f57f43a
--- /dev/null
+++ b/themes/itix/layouts/partials/icons/search.svg
@@ -0,0 +1,5 @@
+
+search
+
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/icons/vertical_align_top.svg b/themes/itix/layouts/partials/icons/vertical_align_top.svg
new file mode 100644
index 0000000..06fdf5b
--- /dev/null
+++ b/themes/itix/layouts/partials/icons/vertical_align_top.svg
@@ -0,0 +1,5 @@
+
+back to top
+
+
+
\ No newline at end of file
diff --git a/themes/itix/layouts/partials/lang-detection.html b/themes/itix/layouts/partials/lang-detection.html
new file mode 100644
index 0000000..a196a20
--- /dev/null
+++ b/themes/itix/layouts/partials/lang-detection.html
@@ -0,0 +1,15 @@
+{{ if and .IsTranslated (eq .Lang "fr") }}
+
+ {{ if and (index .AllTranslations 0).File (index .AllTranslations 1).File }}
+ {{ $file0 := readFile (index .AllTranslations 0).File.Filename }}
+ {{ $file1 := readFile (index .AllTranslations 1).File.Filename }}
+ {{ if eq (sha256 $file0) (sha256 $file1) }}
+ {{ .Scratch.Set "en_article_in_fr_site" true }}
+ {{ end }}
+ {{ else }}
+
+ {{ if eq (index .AllTranslations 0).Plain (index .AllTranslations 1).Plain }}
+ {{ .Scratch.Set "en_article_in_fr_site" true }}
+ {{ end }}
+ {{ end }}
+{{ end }}
diff --git a/themes/itix/layouts/partials/mathjax.html b/themes/itix/layouts/partials/mathjax.html
new file mode 100644
index 0000000..143f716
--- /dev/null
+++ b/themes/itix/layouts/partials/mathjax.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/themes/itix/layouts/partials/menu.html b/themes/itix/layouts/partials/menu.html
new file mode 100644
index 0000000..3e7c269
--- /dev/null
+++ b/themes/itix/layouts/partials/menu.html
@@ -0,0 +1,65 @@
+
+
diff --git a/themes/itix/layouts/partials/post-metadata.html b/themes/itix/layouts/partials/post-metadata.html
new file mode 100644
index 0000000..49a1e72
--- /dev/null
+++ b/themes/itix/layouts/partials/post-metadata.html
@@ -0,0 +1,43 @@
+
+
+ {{- with .current.PublishDate }}
+
+ {{ i18n "published_on" }}
+ {{ .Format (i18n "date_format") }}
+
+ {{- end }}
+
+
+ {{ range .current.Params.topics -}}
+
+ {{- if or (not $.parent.Data.topic) (ne . $.parent.Data.Term) }}
+
+ {{- partial "icons/link.svg" . -}}{{ . }}
+
+ {{- end -}}
+ {{- end }}
+
+
+ {{ range .current.Params.opensource -}}
+
+ {{- if or (not $.parent.Data.opensource) (ne . $.parent.Data.Term) }}
+
+ {{- partial "icons/label.svg" . -}}{{ . }}
+
+ {{- end -}}
+ {{- end }}
+
+
+ {{- if eq .current.Type "blog" }}
+
+ {{- partial "icons/schedule.svg" . -}}
+ {{- $minutes := .current.ReadingTime -}}
+ {{- if gt $minutes 0 -}}
+ {{- i18n "minutes" $minutes -}}
+ {{- end -}}
+
+ {{- end }}
+
diff --git a/themes/itix/layouts/partials/toolbar.html b/themes/itix/layouts/partials/toolbar.html
new file mode 100644
index 0000000..3d7e10d
--- /dev/null
+++ b/themes/itix/layouts/partials/toolbar.html
@@ -0,0 +1,23 @@
+
diff --git a/themes/itix/layouts/shortcodes/highlightFile.html b/themes/itix/layouts/shortcodes/highlightFile.html
new file mode 100644
index 0000000..80c7e10
--- /dev/null
+++ b/themes/itix/layouts/shortcodes/highlightFile.html
@@ -0,0 +1,7 @@
+
+
+{{- with .Get 0 -}}
+
{{ printf (i18n "file") . | safeHTML }}
+{{- end -}}
+{{- highlight (trim .Inner "\n") (.Get 1) (.Get 2) -}}
+
\ No newline at end of file
diff --git a/themes/itix/layouts/shortcodes/highlightWithTitle.html b/themes/itix/layouts/shortcodes/highlightWithTitle.html
new file mode 100644
index 0000000..5cf49e9
--- /dev/null
+++ b/themes/itix/layouts/shortcodes/highlightWithTitle.html
@@ -0,0 +1,7 @@
+
+
+{{- with .Get 0 -}}
+
{{ . | safeHTML }}
+{{- end -}}
+{{- highlight (trim .Inner "\n") (.Get 1) (.Get 2) -}}
+
\ No newline at end of file
diff --git a/themes/itix/layouts/shortcodes/internalLink.html b/themes/itix/layouts/shortcodes/internalLink.html
new file mode 100644
index 0000000..0c0891d
--- /dev/null
+++ b/themes/itix/layouts/shortcodes/internalLink.html
@@ -0,0 +1,31 @@
+
+{{ $path := .Get "path" }}
+{{ $currentLang := .Page.Lang }}
+{{ $title := .Get "title" }}
+{{ $sites := .Page.Sites }}
+{{ if ne $currentLang (index .Page.Sites 0).Language.Lang }}
+{{ $sites = collections.Reverse .Page.Sites }}
+{{ end }}
+{{ range $sites }}
+{{ with .GetPage $path }}
+
+{{ if ne $title "" }}
+{{ $title }}
+{{ else }}
+{{ .Title }}
+{{ end }}
+
+{{ if and (eq $currentLang "en") (eq .Lang "fr") }}
+{{- partial "icons/fr.svg" . -}}
+{{ end }}
+{{ if (eq $currentLang "fr") }}
+{{- partial "lang-detection.html" . -}}
+{{ if .Scratch.Get "en_article_in_fr_site" }}
+{{- partial "icons/en.svg" . -}}
+{{ end }}
+{{ end }}
+{{ break }}
+{{ end }}
+{{ end }}
diff --git a/themes/itix/layouts/speaking/list.html b/themes/itix/layouts/speaking/list.html
new file mode 100644
index 0000000..7903829
--- /dev/null
+++ b/themes/itix/layouts/speaking/list.html
@@ -0,0 +1,14 @@
+{{ define "main" }}
+
+
+
+ {{ .Content }}
+
+ {{ range (sort .Pages "Date").Reverse }}
+ {{ .Date.Format "January 2006" }} - {{ .Title }}
+ {{ end }}
+
+
+{{ end }}
diff --git a/themes/itix/layouts/writing/list.html b/themes/itix/layouts/writing/list.html
new file mode 100644
index 0000000..5860145
--- /dev/null
+++ b/themes/itix/layouts/writing/list.html
@@ -0,0 +1,14 @@
+{{ define "main" }}
+
+
+
+ {{ .Content }}
+
+ {{ range (sort .Pages "Date").Reverse }}
+ {{ .Date.Format "January 2006" }} - {{ .Title }}
+ {{ end }}
+
+
+{{ end }}
diff --git a/themes/itix/static/fonts/JetBrainsMono-Regular.ttf b/themes/itix/static/fonts/JetBrainsMono-Regular.ttf
new file mode 100644
index 0000000..b06b6e2
Binary files /dev/null and b/themes/itix/static/fonts/JetBrainsMono-Regular.ttf differ
diff --git a/themes/itix/static/fonts/JetBrainsMono-Regular.woff b/themes/itix/static/fonts/JetBrainsMono-Regular.woff
new file mode 100644
index 0000000..8d0c65f
Binary files /dev/null and b/themes/itix/static/fonts/JetBrainsMono-Regular.woff differ
diff --git a/themes/itix/static/fonts/JetBrainsMono-Regular.woff2 b/themes/itix/static/fonts/JetBrainsMono-Regular.woff2
new file mode 100644
index 0000000..124f414
Binary files /dev/null and b/themes/itix/static/fonts/JetBrainsMono-Regular.woff2 differ
diff --git a/themes/itix/static/fonts/SourceSansPro-Regular.ttf b/themes/itix/static/fonts/SourceSansPro-Regular.ttf
new file mode 100644
index 0000000..b422bf4
Binary files /dev/null and b/themes/itix/static/fonts/SourceSansPro-Regular.ttf differ
diff --git a/themes/itix/static/fonts/SourceSerifPro-Regular.ttf b/themes/itix/static/fonts/SourceSerifPro-Regular.ttf
new file mode 100644
index 0000000..e6c5dff
Binary files /dev/null and b/themes/itix/static/fonts/SourceSerifPro-Regular.ttf differ
diff --git a/themes/itix/static/fonts/material-icons.ttf b/themes/itix/static/fonts/material-icons.ttf
new file mode 100644
index 0000000..a7c4999
Binary files /dev/null and b/themes/itix/static/fonts/material-icons.ttf differ
diff --git a/themes/itix/static/fonts/material-icons.woff2 b/themes/itix/static/fonts/material-icons.woff2
new file mode 100644
index 0000000..84084a5
Binary files /dev/null and b/themes/itix/static/fonts/material-icons.woff2 differ
diff --git a/themes/itix/static/js/fuse.js b/themes/itix/static/js/fuse.js
new file mode 100644
index 0000000..dabc9fb
--- /dev/null
+++ b/themes/itix/static/js/fuse.js
@@ -0,0 +1,9 @@
+/**
+ * Fuse.js v6.4.3 - Lightweight fuzzy-search (http://fusejs.io)
+ *
+ * Copyright (c) 2020 Kiro Risk (http://kiro.me)
+ * All Rights Reserved. Apache Software License 2.0
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+var e,t;e=this,t=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:3,t=new Map;return{get:function(n){var r=n.match(w).length;if(t.has(r))return t.get(r);var i=parseFloat((1/Math.sqrt(r)).toFixed(e));return t.set(r,i),i},clear:function(){t.clear()}}}var _=function(){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.getFn,i=void 0===r?x.getFn:r;t(this,e),this.norm=L(3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return r(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,u(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();u(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?x.getFn:r,o=new _({getFn:i});return o.setKeys(e.map(b)),o.setSources(t),o.create(),o}function O(e,t){var n=e.matches;t.matches=[],f(n)&&n.forEach((function(e){if(f(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function A(e,t){t.score=e.score}function j(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,h=void 0===s?x.distance:s,u=t.ignoreLocation,l=void 0===u?x.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(a-o);return h?d+f/h:f?1:d}function E(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}function I(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?x.location:o,a=i.threshold,s=void 0===a?x.threshold:a,h=i.distance,u=void 0===h?x.distance:h,l=i.includeMatches,d=void 0===l?x.includeMatches:l,f=i.findAllMatches,v=void 0===f?x.findAllMatches:f,y=i.minMatchCharLength,g=void 0===y?x.minMatchCharLength:y,p=i.isCaseSensitive,m=void 0===p?x.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?x.ignoreLocation:b;if(t(this,e),this.options={location:c,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:g,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?n:n.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){r.chunks.push({pattern:e,alphabet:I(e),startIndex:t})},w=this.pattern.length;if(w>32){for(var L=0,_=w%32,S=w-_;L3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?x.location:i,c=r.distance,a=void 0===c?x.distance:c,s=r.threshold,h=void 0===s?x.threshold:s,u=r.findAllMatches,l=void 0===u?x.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?x.minMatchCharLength:d,v=r.includeMatches,y=void 0===v?x.includeMatches:v,p=r.ignoreLocation,m=void 0===p?x.ignoreLocation:p;if(t.length>32)throw new Error(g(32));for(var b,k=t.length,M=e.length,w=Math.max(0,Math.min(o,M)),L=h,_=w,S=f>1||y,O=S?Array(M):[];(b=e.indexOf(t,_))>-1;){var A=j(t,{currentLocation:b,expectedLocation:w,distance:a,ignoreLocation:m});if(L=Math.min(A,L),_=b+k,S)for(var I=0;I=J;U-=1){var q=U-1,B=n[e.charAt(q)];if(S&&(O[q]=+!!B),T[U]=(T[U+1]<<1|1)&B,$&&(T[U]|=(F[U+1]|F[U])<<1|1|F[U+1]),T[U]&N&&(C=j(t,{errors:$,currentLocation:q,expectedLocation:w,distance:a,ignoreLocation:m}))<=L){if(L=C,(_=q)<=w)break;J=Math.max(1,2*w-_)}}var V=j(t,{errors:$+1,currentLocation:w,expectedLocation:w,distance:a,ignoreLocation:m});if(V>L)break;F=T}var G={isMatch:_>=0,score:Math.max(.001,C)};if(S){var H=E(O,f);H.length?y&&(G.indices=H):G.isMatch=!1}return G}(e,n,i,{location:c+o,distance:s,threshold:h,findAllMatches:u,minMatchCharLength:l,includeMatches:r,ignoreLocation:d}),m=p.isMatch,b=p.score,k=p.indices;m&&(y=!0),v+=b,m&&k&&(f=[].concat(a(f),a(k)))}));var p={isMatch:y,score:y?v/this.chunks.length:1};return y&&r&&(p.indices=f),p}}]),e}(),C=[];function P(e,t){for(var n=0,r=C.length;n1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;if(t(this,e),this.options=c({},x,{},r),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new m(this.options.keys),this.setCollection(n,i)}return r(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof _))throw new Error("Incorrect 'index' type");this._myIndex=t||S(this.options.keys,this._docs,{getFn:this.options.getFn})}},{key:"add",value:function(e){f(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,h=i.ignoreFieldNorm,d=u(e)?u(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return $(d,{ignoreFieldNorm:h}),a&&d.sort(s),l(r)&&r>-1&&(d=d.slice(0,r)),D(d,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=P(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(f(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,h=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=P(e,this.options),r=this._myIndex,i=r.keys,o=r.records,c=[];return o.forEach((function(e){var r=e.$,o=e.i;if(f(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,a(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&c.push({idx:o,item:r,matches:s})}})),c}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!f(n))return[];var i=[];if(h(n))n.forEach((function(e){var n=e.v,o=e.i,c=e.n;if(f(n)){var a=r.searchIn(n),s=a.isMatch,h=a.score,u=a.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:c,indices:u})}}));else{var o=n.v,c=n.n,a=r.searchIn(o),s=a.isMatch,u=a.score,l=a.indices;s&&i.push({score:u,key:t,value:o,norm:c,indices:l})}return i}}]),e}();function $(e,t){var n=t.ignoreFieldNorm,r=void 0===n?x.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,c=n?n.weight:null;t*=Math.pow(0===o&&c?Number.EPSILON:o,(c||1)*(r?1:i))})),e.score=t}))}function D(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?x.includeMatches:r,o=n.includeScore,c=void 0===o?x.includeScore:o,a=[];return i&&a.push(O),c&&a.push(A),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}return N.version="6.4.3",N.createIndex=S,N.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?x.getFn:n,i=e.keys,o=e.records,c=new _({getFn:r});return c.setKeys(i),c.setIndexRecords(o),c},N.config=x,N},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Fuse=t();
\ No newline at end of file
diff --git a/themes/itix/theme.toml b/themes/itix/theme.toml
new file mode 100644
index 0000000..c5214b5
--- /dev/null
+++ b/themes/itix/theme.toml
@@ -0,0 +1,19 @@
+name = "ITIX"
+license = "MIT"
+licenselink = "https://github.com/nmasse-itix/hugo-theme-itix/blob/master/LICENSE"
+description = "Theme of my personal site: www.itix.fr"
+homepage = "https://www.itix.fr/"
+tags = ["blog"]
+features = ["mobile","elegant"]
+min_version = "0.59.0"
+
+[author]
+ name = "Nicolas Massé"
+ homepage = "https://www.itix.fr/"
+
+
+# If porting an existing theme
+[original]
+ name = "amazingrise"
+ homepage = "https://amazingrise.net/"
+ repo = "https://github.com/amazingrise/hugo-theme-diary"