diff --git a/css/theme/source/camptocamp.scss b/css/theme/source/camptocamp.scss
new file mode 100644
index 00000000000..8c3911b10f2
--- /dev/null
+++ b/css/theme/source/camptocamp.scss
@@ -0,0 +1,95 @@
+/**
+ * Camptocamp theme for reveal.js.
+ */
+
+
+// Default mixins and settings -----------------
+@import "../template/mixins";
+@import "../template/settings";
+// ---------------------------------------------
+
+
+// Include theme-specific fonts
+@import url(./fonts/inter/inter.css);
+
+$camptocampOrangeColor: #ff680a;
+$camptocampGreyColor: #7a7f82;
+
+// Override theme settings (see ../template/settings.scss)
+$backgroundColor: #ffffff;
+
+$mainColor: $camptocampGreyColor;
+$headingColor: $camptocampOrangeColor;
+
+$mainFontSize: 42px;
+$mainFont: 'Inter', Helvetica, sans-serif;
+$headingFont: 'Inter', Helvetica, sans-serif;
+$headingTextShadow: none;
+$headingLetterSpacing: normal;
+$headingTextTransform: uppercase;
+$headingFontWeight: 600;
+$linkColor: $camptocampOrangeColor;
+$linkColorHover: lighten($linkColor, 15%);
+$selectionBackgroundColor: lighten($linkColor, 25%);
+
+$heading1Size: 2.5em;
+$heading2Size: 1.6em;
+$heading3Size: 1.3em;
+$heading4Size: 1.0em;
+
+.reveal-viewport {
+ .slide-background.title {
+ background: #000000;
+ }
+
+ #logo-title {
+ content: url(../img/logo-title.svg);
+ position: fixed;
+ top: 2%;
+ left: 2%;
+ height: 15%;
+ z-index: 1;
+ }
+
+ #logo-header-left {
+ content: url(../img/logo-header-left.svg);
+ position: fixed;
+ top: 2%;
+ left: 2%;
+ height: 5%;
+ z-index: 1;
+ }
+
+ #logo-header-right {
+ content: url(../img/logo-header-right.svg);
+ position: fixed;
+ top: 2%;
+ right: 2%;
+ height: 5%;
+ z-index: 1;
+ }
+
+ &:not(.title),
+ &.overview {
+ #logo-title {
+ display: none;
+ }
+ }
+
+ &.title,
+ &.overview {
+ #logo-header-left,
+ #logo-header-right {
+ display: none;
+ }
+ }
+
+ section.title ul:has(>li>.author) {
+ text-align: center;
+ margin: 0;
+ }
+}
+
+// Theme template ------------------------------
+@import "../template/theme";
+// ---------------------------------------------
diff --git a/dist/img/logo-header-left.svg b/dist/img/logo-header-left.svg
new file mode 100644
index 00000000000..4ff3e66197b
--- /dev/null
+++ b/dist/img/logo-header-left.svg
@@ -0,0 +1,89 @@
+
+
+
+
diff --git a/dist/img/logo-header-right.svg b/dist/img/logo-header-right.svg
new file mode 100644
index 00000000000..2e8392345d7
--- /dev/null
+++ b/dist/img/logo-header-right.svg
@@ -0,0 +1,86 @@
+
+
+
+
diff --git a/dist/img/logo-title.svg b/dist/img/logo-title.svg
new file mode 100644
index 00000000000..80b53a2f843
--- /dev/null
+++ b/dist/img/logo-title.svg
@@ -0,0 +1,132 @@
+
+
+
+
diff --git a/dist/theme/camptocamp.css b/dist/theme/camptocamp.css
new file mode 100644
index 00000000000..9fddcce5c55
--- /dev/null
+++ b/dist/theme/camptocamp.css
@@ -0,0 +1,393 @@
+/**
+ * Camptocamp theme for reveal.js.
+ */
+@import url(./fonts/inter/inter.css);
+.reveal-viewport .slide-background.title {
+ background: #000000;
+}
+.reveal-viewport #logo-title {
+ content: url(../img/logo-title.svg);
+ position: fixed;
+ top: 2%;
+ left: 2%;
+ height: 15%;
+ z-index: 1;
+}
+.reveal-viewport #logo-header-left {
+ content: url(../img/logo-header-left.svg);
+ position: fixed;
+ top: 2%;
+ left: 2%;
+ height: 5%;
+ z-index: 1;
+}
+.reveal-viewport #logo-header-right {
+ content: url(../img/logo-header-right.svg);
+ position: fixed;
+ top: 2%;
+ right: 2%;
+ height: 5%;
+ z-index: 1;
+}
+.reveal-viewport:not(.title) #logo-title, .reveal-viewport.overview #logo-title {
+ display: none;
+}
+.reveal-viewport.title #logo-header-left,
+.reveal-viewport.title #logo-header-right, .reveal-viewport.overview #logo-header-left,
+.reveal-viewport.overview #logo-header-right {
+ display: none;
+}
+.reveal-viewport section.title ul:has(> li > .author) {
+ text-align: center;
+ margin: 0;
+}
+
+/*********************************************
+ * GLOBAL STYLES
+ *********************************************/
+:root {
+ --r-background-color: #ffffff;
+ --r-main-font: Inter, Helvetica, sans-serif;
+ --r-main-font-size: 42px;
+ --r-main-color: #7a7f82;
+ --r-block-margin: 20px;
+ --r-heading-margin: 0 0 20px 0;
+ --r-heading-font: Inter, Helvetica, sans-serif;
+ --r-heading-color: #ff680a;
+ --r-heading-line-height: 1.2;
+ --r-heading-letter-spacing: normal;
+ --r-heading-text-transform: uppercase;
+ --r-heading-text-shadow: none;
+ --r-heading-font-weight: 600;
+ --r-heading1-text-shadow: none;
+ --r-heading1-size: 2.5em;
+ --r-heading2-size: 1.6em;
+ --r-heading3-size: 1.3em;
+ --r-heading4-size: 1em;
+ --r-code-font: monospace;
+ --r-link-color: #ff680a;
+ --r-link-color-dark: #bd4800;
+ --r-link-color-hover: #ff9757;
+ --r-selection-background-color: #ffb78a;
+ --r-selection-color: #fff;
+ --r-overlay-element-bg-color: 240, 240, 240;
+ --r-overlay-element-fg-color: 0, 0, 0;
+}
+
+.reveal-viewport {
+ background: #ffffff;
+ background-color: var(--r-background-color);
+}
+
+.reveal {
+ font-family: var(--r-main-font);
+ font-size: var(--r-main-font-size);
+ font-weight: normal;
+ color: var(--r-main-color);
+}
+
+.reveal ::selection {
+ color: var(--r-selection-color);
+ background: var(--r-selection-background-color);
+ text-shadow: none;
+}
+
+.reveal ::-moz-selection {
+ color: var(--r-selection-color);
+ background: var(--r-selection-background-color);
+ text-shadow: none;
+}
+
+.reveal .slides section,
+.reveal .slides section > section {
+ line-height: 1.3;
+ font-weight: inherit;
+}
+
+/*********************************************
+ * HEADERS
+ *********************************************/
+.reveal h1,
+.reveal h2,
+.reveal h3,
+.reveal h4,
+.reveal h5,
+.reveal h6 {
+ margin: var(--r-heading-margin);
+ color: var(--r-heading-color);
+ font-family: var(--r-heading-font);
+ font-weight: var(--r-heading-font-weight);
+ line-height: var(--r-heading-line-height);
+ letter-spacing: var(--r-heading-letter-spacing);
+ text-transform: var(--r-heading-text-transform);
+ text-shadow: var(--r-heading-text-shadow);
+ word-wrap: break-word;
+}
+
+.reveal h1 {
+ font-size: var(--r-heading1-size);
+}
+
+.reveal h2 {
+ font-size: var(--r-heading2-size);
+}
+
+.reveal h3 {
+ font-size: var(--r-heading3-size);
+}
+
+.reveal h4 {
+ font-size: var(--r-heading4-size);
+}
+
+.reveal h1 {
+ text-shadow: var(--r-heading1-text-shadow);
+}
+
+/*********************************************
+ * OTHER
+ *********************************************/
+.reveal p {
+ margin: var(--r-block-margin) 0;
+ line-height: 1.3;
+}
+
+/* Remove trailing margins after titles */
+.reveal h1:last-child,
+.reveal h2:last-child,
+.reveal h3:last-child,
+.reveal h4:last-child,
+.reveal h5:last-child,
+.reveal h6:last-child {
+ margin-bottom: 0;
+}
+
+/* Ensure certain elements are never larger than the slide itself */
+.reveal img,
+.reveal video,
+.reveal iframe {
+ max-width: 95%;
+ max-height: 95%;
+}
+
+.reveal strong,
+.reveal b {
+ font-weight: bold;
+}
+
+.reveal em {
+ font-style: italic;
+}
+
+.reveal ol,
+.reveal dl,
+.reveal ul {
+ display: inline-block;
+ text-align: left;
+ margin: 0 0 0 1em;
+}
+
+.reveal ol {
+ list-style-type: decimal;
+}
+
+.reveal ul {
+ list-style-type: disc;
+}
+
+.reveal ul ul {
+ list-style-type: square;
+}
+
+.reveal ul ul ul {
+ list-style-type: circle;
+}
+
+.reveal ul ul,
+.reveal ul ol,
+.reveal ol ol,
+.reveal ol ul {
+ display: block;
+ margin-left: 40px;
+}
+
+.reveal dt {
+ font-weight: bold;
+}
+
+.reveal dd {
+ margin-left: 40px;
+}
+
+.reveal blockquote {
+ display: block;
+ position: relative;
+ width: 70%;
+ margin: var(--r-block-margin) auto;
+ padding: 5px;
+ font-style: italic;
+ background: rgba(255, 255, 255, 0.05);
+ box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2);
+}
+
+.reveal blockquote p:first-child,
+.reveal blockquote p:last-child {
+ display: inline-block;
+}
+
+.reveal q {
+ font-style: italic;
+}
+
+.reveal pre {
+ display: block;
+ position: relative;
+ width: 90%;
+ margin: var(--r-block-margin) auto;
+ text-align: left;
+ font-size: 0.55em;
+ font-family: var(--r-code-font);
+ line-height: 1.2em;
+ word-wrap: break-word;
+ box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15);
+}
+
+.reveal code {
+ font-family: var(--r-code-font);
+ text-transform: none;
+ tab-size: 2;
+}
+
+.reveal pre code {
+ display: block;
+ padding: 5px;
+ overflow: auto;
+ max-height: 400px;
+ word-wrap: normal;
+}
+
+.reveal .code-wrapper {
+ white-space: normal;
+}
+
+.reveal .code-wrapper code {
+ white-space: pre;
+}
+
+.reveal table {
+ margin: auto;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+.reveal table th {
+ font-weight: bold;
+}
+
+.reveal table th,
+.reveal table td {
+ text-align: left;
+ padding: 0.2em 0.5em 0.2em 0.5em;
+ border-bottom: 1px solid;
+}
+
+.reveal table th[align=center],
+.reveal table td[align=center] {
+ text-align: center;
+}
+
+.reveal table th[align=right],
+.reveal table td[align=right] {
+ text-align: right;
+}
+
+.reveal table tbody tr:last-child th,
+.reveal table tbody tr:last-child td {
+ border-bottom: none;
+}
+
+.reveal sup {
+ vertical-align: super;
+ font-size: smaller;
+}
+
+.reveal sub {
+ vertical-align: sub;
+ font-size: smaller;
+}
+
+.reveal small {
+ display: inline-block;
+ font-size: 0.6em;
+ line-height: 1.2em;
+ vertical-align: top;
+}
+
+.reveal small * {
+ vertical-align: top;
+}
+
+.reveal img {
+ margin: var(--r-block-margin) 0;
+}
+
+/*********************************************
+ * LINKS
+ *********************************************/
+.reveal a {
+ color: var(--r-link-color);
+ text-decoration: none;
+ transition: color 0.15s ease;
+}
+
+.reveal a:hover {
+ color: var(--r-link-color-hover);
+ text-shadow: none;
+ border: none;
+}
+
+.reveal .roll span:after {
+ color: #fff;
+ background: var(--r-link-color-dark);
+}
+
+/*********************************************
+ * Frame helper
+ *********************************************/
+.reveal .r-frame {
+ border: 4px solid var(--r-main-color);
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
+}
+
+.reveal a .r-frame {
+ transition: all 0.15s linear;
+}
+
+.reveal a:hover .r-frame {
+ border-color: var(--r-link-color);
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
+}
+
+/*********************************************
+ * NAVIGATION CONTROLS
+ *********************************************/
+.reveal .controls {
+ color: var(--r-link-color);
+}
+
+/*********************************************
+ * PROGRESS BAR
+ *********************************************/
+.reveal .progress {
+ background: rgba(0, 0, 0, 0.2);
+ color: var(--r-link-color);
+}
+
+/*********************************************
+ * PRINT BACKGROUND
+ *********************************************/
+@media print {
+ .backgrounds {
+ background-color: var(--r-background-color);
+ }
+}
\ No newline at end of file
diff --git a/dist/theme/camptocamp.css.map b/dist/theme/camptocamp.css.map
new file mode 100644
index 00000000000..cd83533ac5c
--- /dev/null
+++ b/dist/theme/camptocamp.css.map
@@ -0,0 +1 @@
+{"version":3,"sourceRoot":"","sources":["../../css/theme/source/camptocamp.scss","../../css/theme/template/theme.scss","../../css/theme/template/exposer.scss","../../css/theme/template/settings.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAYQ;AA4BP;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAKA;EACC;;AAMD;AAAA;AAAA;EAEC;;;AChFH;AAAA;AAAA;ACAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADlBF;EEmCC,YHzBiB;ECRjB;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;AAAA;EAEC;EACA;;;AAGD;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;EAMC;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;;;AAGD;EAAY;;;AACZ;EAAY;;;AACZ;EAAY;;;AACZ;EAAY;;;AAEZ;EACC;;;AAID;AAAA;AAAA;AAIA;EACC;EACA;;;AAGD;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;EAMC;;;AAGD;AACA;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;EAEC;;;AAGD;EACC;;;AAGD;AAAA;AAAA;EAGC;EAEA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAAA;AAAA;AAAA;EAIC;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;;;AAEA;AAAA;EAEC;;;AAGF;EACC;;;AAGD;EACC;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EAEA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAGD;AAAA;EAEC;;;AAGD;AAAA;EAEC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;EACA;;;AAED;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAID;AAAA;AAAA;AAIA;EACC;EACA;EACA;;;AAEA;EACC;EACA;EACA;;;AAGF;EACC;EAEC;;;AAKF;AAAA;AAAA;AAIA;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAID;AAAA;AAAA;AAIA;EACC;;;AAID;AAAA;AAAA;AAIA;EACC;EACA;;;AAGD;AAAA;AAAA;AAGC;EACG;IACI","file":"camptocamp.css"}
\ No newline at end of file
diff --git a/dist/theme/fonts/inter/Inter-VariableFont_slnt,wght.ttf b/dist/theme/fonts/inter/Inter-VariableFont_slnt,wght.ttf
new file mode 100644
index 00000000000..ec3164efa8f
Binary files /dev/null and b/dist/theme/fonts/inter/Inter-VariableFont_slnt,wght.ttf differ
diff --git a/dist/theme/fonts/inter/inter.css b/dist/theme/fonts/inter/inter.css
new file mode 100644
index 00000000000..0624abdcc7b
--- /dev/null
+++ b/dist/theme/fonts/inter/inter.css
@@ -0,0 +1,4 @@
+@font-face {
+ font-family: 'Inter';
+ src: url('./Inter-VariableFont_slnt,wght.ttf') format('truetype');
+}