diff --git a/config.toml b/config.toml
index d1a20b3f..f0b5cb24 100755
--- a/config.toml
+++ b/config.toml
@@ -1,9 +1,10 @@
baseURL = "https://CollaboraOnline.github.io"
-RelativeURLs=true
+RelativeURLs=false
CanonifyURLs=true
title = "Collabora Online - Community Page"
copyright = "Unless a license is otherwise specified, content is under CC-BY-SA 3.0
Beaver illustrations are under Copyright © 2025 Collabora Ltd. All rights reserved."
-paginate = 2
+[pagination]
+ pagerSize = 2
languageCode = "en"
DefaultContentLanguage = "en"
enableInlineShortcodes = true
@@ -53,8 +54,8 @@ type = "type"
showLanguageSwitcher = false
# Custom CSS and JS. Relative to /static/css and /static/js respectively.
- customCSS = ["buttons.css", "anim.css", "header.css", "dropdown.css", "sidebar.css", "post-content.css"]
- customJS = []
+ customCSS = ["buttons.css", "anim.css", "header.css", "dropdown.css", "sidebar.css", "post-content.css", "copy-code.css"]
+ customJS = ["copy-code.js"]
[params.social]
rss = true
@@ -91,5 +92,5 @@ type = "type"
[services.instagram]
disableInlineCSS = true
- [services.twitter]
+ [services.x]
disableInlineCSS = true
diff --git a/data/chunky-poster/assets.json b/data/chunky-poster/assets.json
new file mode 100644
index 00000000..c06480de
--- /dev/null
+++ b/data/chunky-poster/assets.json
@@ -0,0 +1,6 @@
+{
+ "main": {
+ "css": "main.37ab3f61b95417873748.min.css",
+ "js": "main.d608eadfe5ac0688902e.min.js"
+ }
+}
\ No newline at end of file
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
new file mode 100644
index 00000000..091995bc
--- /dev/null
+++ b/layouts/_default/baseof.html
@@ -0,0 +1,16 @@
+
+
+
+ {{ partial "head.html" . }}
+
+
+ {{ partial "header.html" . }}
+
+ {{ block "main" . }}{{ end }}
+
+ {{ partial "footer.html" . }}
+ {{ partial "foot.html" . }}
+
+ {{ template "_internal/google_analytics.html" . }}
+
+
diff --git a/layouts/partials/authors.html b/layouts/partials/authors.html
new file mode 100644
index 00000000..7bc3b472
--- /dev/null
+++ b/layouts/partials/authors.html
@@ -0,0 +1,40 @@
+{{- if .Params.authors -}}
+
+ {{- range .Params.authors -}}
+ {{- with $.Site.GetPage (printf "/authors/%s" (. | urlize)) -}}
+ {{- $term := . -}}
+ -
+
+
+ {{- end -}}
+ {{- end -}}
+
+{{- end -}}
diff --git a/layouts/partials/foot.html b/layouts/partials/foot.html
new file mode 100644
index 00000000..5cdc5572
--- /dev/null
+++ b/layouts/partials/foot.html
@@ -0,0 +1,21 @@
+{{ with index .Site.Data "chunky-poster" }}
+ {{ range $vendor := .assets }}
+ {{ if $vendor.js }}
+
+ {{ end }}
+ {{ end }}
+{{ end }}
+
+{{ if .Site.Params.prismJS.enable }}
+
+
+
+{{ end }}
+
+{{ range .Site.Params.customJS -}}
+
+{{ end }}
+
diff --git a/layouts/partials/i18nlist.html b/layouts/partials/i18nlist.html
new file mode 100644
index 00000000..486e1f3e
--- /dev/null
+++ b/layouts/partials/i18nlist.html
@@ -0,0 +1,6 @@
+{{ if .IsTranslated }}
+ {{ range .Translations }}
+ {{ .Lang }}
+
+ {{ end}}
+{{ end }}
diff --git a/layouts/partials/related.html b/layouts/partials/related.html
new file mode 100644
index 00000000..9dbae449
--- /dev/null
+++ b/layouts/partials/related.html
@@ -0,0 +1,10 @@
+{{- $related := .Site.RegularPages.Related . | first 3 -}}
+{{- with $related -}}
+
+ {{- range . -}}
+
+ {{ .Render "card" }}
+
+ {{- end -}}
+
+{{- end -}}
diff --git a/layouts/partials/sharer.html b/layouts/partials/sharer.html
new file mode 100644
index 00000000..79d6c72c
--- /dev/null
+++ b/layouts/partials/sharer.html
@@ -0,0 +1,24 @@
+{{- if and .Site.Params.share (ne .Params.share false) -}}
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+
+{{- end -}}
diff --git a/static/css/copy-code.css b/static/css/copy-code.css
new file mode 100644
index 00000000..cc155fcb
--- /dev/null
+++ b/static/css/copy-code.css
@@ -0,0 +1,55 @@
+.copy-code-button {
+ position: absolute;
+ top: 0.5rem;
+ right: 4px;
+ /* Moved closer to the right edge */
+ background-color: transparent;
+ color: #a1a1aa;
+ /* zinc-400 */
+ border: none;
+ border-radius: 4px;
+ padding: 4px;
+ line-height: 0;
+ cursor: pointer;
+ opacity: 1;
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ z-index: 10;
+ transform: scale(1);
+}
+
+.copy-code-button:hover {
+ background-color: rgba(255, 255, 255, 0.05);
+ /* Subtle hover background */
+ color: #71717a;
+ /* Darker on hover for visibility against light bg, or keep zinc-400 if dark bg. User said "same shade", assuming zinc-400 for consistency */
+ outline: none;
+}
+
+.copy-code-button:focus {
+ outline: none;
+}
+
+.copy-code-button:active {
+ transform: scale(0.95);
+ /* Slight press effect */
+}
+
+.copy-code-button.copied {
+ color: #a1a1aa;
+ /* Same shade as default state for visibility */
+ transform: scale(1.1);
+ /* Pop effect when copied */
+}
+
+.copy-code-button svg {
+ width: 18px;
+ /* Slightly larger for better visibility */
+ height: 18px;
+ display: block;
+ /* Removes potential line-height issues */
+}
+
+/* Ensure the pre block handles the button overlap */
+pre {
+ position: relative;
+}
\ No newline at end of file
diff --git a/static/js/copy-code.js b/static/js/copy-code.js
new file mode 100644
index 00000000..a55cf09a
--- /dev/null
+++ b/static/js/copy-code.js
@@ -0,0 +1,50 @@
+document.addEventListener('DOMContentLoaded', function () {
+ const codeBlocks = document.querySelectorAll('pre > code');
+
+ codeBlocks.forEach(function (codeBlock) {
+ const pre = codeBlock.parentNode;
+
+ // Create the copy button container
+ const button = document.createElement('button');
+ button.className = 'copy-code-button';
+ button.type = 'button';
+ button.ariaLabel = 'Copy code to clipboard';
+
+ // SVG Icons
+ const copyIcon = `
+
+ `;
+
+ const checkIcon = `
+
+ `;
+
+ button.innerHTML = copyIcon;
+
+ // Add click event
+ button.addEventListener('click', function () {
+ const codeToCopy = codeBlock.innerText;
+
+ navigator.clipboard.writeText(codeToCopy).then(function () {
+ button.innerHTML = checkIcon;
+ button.classList.add('copied');
+
+ setTimeout(function () {
+ button.innerHTML = copyIcon;
+ button.classList.remove('copied');
+ }, 1000);
+ }).catch(function (err) {
+ console.error('Failed to copy text: ', err);
+ });
+ });
+
+ // Position the button relative to the pre block
+ pre.style.position = 'relative';
+ pre.appendChild(button);
+ });
+});