diff --git a/modules/slides/README.md b/modules/slides/README.md index 8e300fe7..2ee8fe6a 100644 --- a/modules/slides/README.md +++ b/modules/slides/README.md @@ -16,6 +16,76 @@ Supports math, syntax highlighting, diagrams, speaker notes, and much more! - path: github.com/HugoBlox/kit/modules/slides ``` +## Branding & Customization + +### Logo and Overlays + +Add consistent branding across all slides by configuring `slides.branding` in your site config or slide front matter: + +```yaml +# In hugo.yaml (site-wide) or slide front matter (per-deck) +params: + slides: + branding: + logo: + filename: "logo.png" # File in assets/media/ + position: "top-left" # top-left, top-right, bottom-left, bottom-right + width: "80px" # Logo width + margin: "20px" # Distance from edges + title: + show: true # Show presentation title overlay + text: "Short Title" # Optional: Override auto-detected title + position: "bottom-left" + author: + show: true # Show author name overlay + position: "bottom-right" + footer: + text: "© 2026 Copyright" # Footer text (e.g. copyright) + position: "bottom-center" # bottom-center, bottom-left, bottom-right + +``` + +### Hooks System + +Inject custom content into presentations without modifying module files. Create partials in your project's `layouts/_partials/hooks/` directory: + +| Hook | Location | Use Case | +|------|----------|----------| +| `slide-header/` | Top of presentation | Course code, session info | +| `slide-footer/` | Bottom of presentation | Social handles, copyright | +| `slide-head-end/` | End of `` | Custom CSS, fonts, analytics | +| `slide-body-end/` | End of `` | Custom JS, Reveal.js plugins | + +Example: Create `layouts/_partials/hooks/slide-footer/social.html`: + +```html +
+ @yourhandle · yoursite.com +
+``` + +See `_example.html` files in each hook directory for more examples. + +## Per-Slide Visibility + +Control branding visibility on individual slides using HTML comments: + +- ``: Hide all branding elements (logo, header, footer) +- ``: Hide only the header (and logo) +- ``: Hide only the footer + +Example: + +```markdown +--- + + + +## Full Screen Image Slide + +This slide will have no branding overlays. +``` + ## Usage [View the documentation](https://docs.hugoblox.com/content/slides/) diff --git a/modules/slides/assets/css/slides-branding.css b/modules/slides/assets/css/slides-branding.css new file mode 100644 index 00000000..2bf8d6bc --- /dev/null +++ b/modules/slides/assets/css/slides-branding.css @@ -0,0 +1,129 @@ +/* + * HugoBlox Slides Branding Styles + * + * Default styles for slide branding elements (logo, overlays, headers/footers). + * These styles ensure branding elements don't interfere with slide content. + */ + +/* Logo container */ +#slide-logo { + position: fixed; + z-index: 100; + pointer-events: none; + transition: opacity 0.3s ease; + color: var(--r-main-color, #fff); +} + +#slide-logo img { + width: 100%; + height: auto; + max-height: 60px; +} + +#slide-logo svg { + width: 100%; + height: auto; + max-height: 60px; + fill: currentColor; +} + +/* Title and author overlays */ +#slide-title-overlay, +#slide-author-overlay, +#slide-footer-text-overlay { + position: fixed; + z-index: 100; + pointer-events: none; + font-family: var(--r-main-font, inherit); + color: var(--r-main-color, #fff); + font-size: 0.7em; + opacity: 0.8; + max-width: 40%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); +} + +#slide-footer-text-overlay { + font-size: 0.6em; + opacity: 0.7; +} + +/* Header and footer hook containers */ +.slide-header, +.slide-footer { + position: fixed; + left: 0; + right: 0; + z-index: 100; + pointer-events: none; + display: flex; + align-items: center; + padding: 10px 20px; +} + +.slide-header { + top: 0; + justify-content: space-between; +} + +.slide-footer { + bottom: 0; + justify-content: space-between; +} + +/* Visibility Control via data-state classes (applied to body by JS) */ +body.no-branding #slide-logo, +body.no-branding #slide-title-overlay, +body.no-branding #slide-author-overlay, +body.no-branding #slide-footer-text-overlay, +body.no-branding .slide-header, +body.no-branding .slide-footer { + /* biome-ignore lint/complexity/noImportantStyles: Required to override Reveal.js styles */ + display: none !important; +} + +body.no-header .slide-header, +body.no-header #slide-logo, +body.no-header #slide-title-overlay { + /* biome-ignore lint/complexity/noImportantStyles: Required to override Reveal.js styles */ + display: none !important; +} + +body.no-footer .slide-footer, +body.no-footer #slide-author-overlay, +body.no-footer #slide-footer-text-overlay { + /* biome-ignore lint/complexity/noImportantStyles: Required to override Reveal.js styles */ + display: none !important; +} + +/* Re-enable pointer events for interactive elements within header/footer */ +.slide-header a, +.slide-header button, +.slide-footer a, +.slide-footer button { + pointer-events: auto; +} + +/* Hide branding in print mode for cleaner PDFs */ +@media print { + #slide-logo, + #slide-title-overlay, + #slide-author-overlay, + #slide-footer-text-overlay, + .slide-header, + .slide-footer { + opacity: 0.5; + } +} + +/* Respect Reveal.js overview mode */ +.reveal.overview #slide-logo, +.reveal.overview #slide-title-overlay, +.reveal.overview #slide-author-overlay, +.reveal.overview #slide-footer-text-overlay, +.reveal.overview .slide-header, +.reveal.overview .slide-footer { + display: none; +} diff --git a/modules/slides/assets/js/hugoblox-slides.js b/modules/slides/assets/js/hugoblox-slides.js index 2d7444ca..5d985dfd 100644 --- a/modules/slides/assets/js/hugoblox-slides.js +++ b/modules/slides/assets/js/hugoblox-slides.js @@ -63,6 +63,30 @@ pluginOptions.plugins = enabledPlugins; Reveal.initialize(pluginOptions); +// Handle data-state for branding visibility +// Apply classes to body since branding elements are body-level siblings of .reveal +const applySlideState = (event) => { + const body = document.body; + if (!body) return; + + // Remove previous state classes from body + body.classList.remove("no-branding", "no-header", "no-footer"); + + // Get current slide's data-state + const currentSlide = event?.currentSlide || Reveal.getCurrentSlide(); + if (currentSlide) { + const state = currentSlide.getAttribute("data-state"); + if (state) { + state.split(" ").forEach((s) => { + body.classList.add(s); + }); + } + } +}; + +Reveal.on("ready", applySlideState); +Reveal.on("slidechanged", applySlideState); + // Disable Mermaid by default. if (typeof slides.diagram === "undefined") { slides.diagram = false; diff --git a/modules/slides/layouts/_partials/components/slide-branding.html b/modules/slides/layouts/_partials/components/slide-branding.html new file mode 100644 index 00000000..20d55bb9 --- /dev/null +++ b/modules/slides/layouts/_partials/components/slide-branding.html @@ -0,0 +1,157 @@ +{{/* + Slide Branding Component + + Renders persistent branding elements (logo, title overlay, etc.) that appear + across all slides in a presentation. + + Configuration (site.Params.slides.branding or .Params.slides.branding): + logo: + src: "media/logo.png" # Path to logo image + alt: "Organization Logo" # Alt text + position: "top-left" # top-left, top-right, bottom-left, bottom-right + width: "100px" # Logo width + margin: "20px" # Distance from edges + title: + show: true # Show presentation title + position: "bottom-left" # Position of title text + author: + show: true # Show author/presenter name + position: "bottom-right" # Position of author text +*/}} + +{{/* Merge page-level config with site-level defaults */}} +{{ $site_branding := site.Params.slides.branding | default dict }} +{{ $page_branding := .Params.slides.branding | default dict }} +{{ $branding := merge $site_branding $page_branding }} + +{{/* Logo rendering */}} +{{ with $branding.logo }} + {{ if .filename }} + {{ $resource_path := printf "media/%s" .filename }} + {{ $logo_resource := resources.Get $resource_path }} + {{ with $logo_resource }} + {{ $position := $branding.logo.position | default "top-left" }} + {{ $width := $branding.logo.width | default "80px" }} + {{ $margin := $branding.logo.margin | default "20px" }} + {{ $alt := $branding.logo.alt | default "Logo" }} + + {{/* Calculate CSS position based on position string */}} + {{ $positionCSS := "" }} + {{ if eq $position "top-left" }} + {{ $positionCSS = printf "top: %s; left: %s;" $margin $margin }} + {{ else if eq $position "top-right" }} + {{ $positionCSS = printf "top: %s; right: %s;" $margin $margin }} + {{ else if eq $position "bottom-left" }} + {{ $positionCSS = printf "bottom: %s; left: %s;" $margin $margin }} + {{ else if eq $position "bottom-right" }} + {{ $positionCSS = printf "bottom: %s; right: %s;" $margin $margin }} + {{ else }} + {{/* Custom position - expect CSS string */}} + {{ $positionCSS = $position }} + {{ end }} + + + {{ end }} + {{ end }} +{{ end }} + +{{/* Title overlay (optional) */}} +{{ if $branding.title }} + {{ with $branding.title }} + {{ if .show }} + {{ $position := .position | default "bottom-left" }} + {{ $margin := .margin | default "20px" }} + + {{ $positionCSS := "" }} + {{ if eq $position "top-left" }} + {{ $positionCSS = printf "top: %s; left: %s;" $margin $margin }} + {{ else if eq $position "top-right" }} + {{ $positionCSS = printf "top: %s; right: %s;" $margin $margin }} + {{ else if eq $position "bottom-left" }} + {{ $positionCSS = printf "bottom: %s; left: %s;" $margin $margin }} + {{ else if eq $position "bottom-right" }} + {{ $positionCSS = printf "bottom: %s; right: %s;" $margin $margin }} + {{ end }} + +
+ {{ .text | default $.Title }} +
+ {{ end }} + {{ end }} +{{ end }} + +{{/* Author overlay (optional) */}} +{{ if $branding.author }} + {{ with $branding.author }} + {{ if .show }} + {{ $position := .position | default "bottom-right" }} + {{ $margin := .margin | default "20px" }} + + {{ $positionCSS := "" }} + {{ if eq $position "top-left" }} + {{ $positionCSS = printf "top: %s; left: %s;" $margin $margin }} + {{ else if eq $position "top-right" }} + {{ $positionCSS = printf "top: %s; right: %s;" $margin $margin }} + {{ else if eq $position "bottom-left" }} + {{ $positionCSS = printf "bottom: %s; left: %s;" $margin $margin }} + {{ else if eq $position "bottom-right" }} + {{ $positionCSS = printf "bottom: %s; right: %s;" $margin $margin }} + {{ end }} + + {{/* Get author from page params or first author */}} + {{ $author := "" }} + {{ with $.Params.authors }} + {{ if reflect.IsSlice . }} + {{ $author = index . 0 }} + {{ else }} + {{ $author = . }} + {{ end }} + {{ end }} + {{ with $.Params.author }} + {{ $author = . }} + {{ end }} + + {{ if $author }} +
+ {{ $author }} +
+ {{ end }} + {{ end }} + {{ end }} +{{ end }} + +{{/* Footer text overlay (optional) - e.g. for copyright */}} +{{ if $branding.footer }} + {{ with $branding.footer }} + {{ if .text }} + {{ $position := .position | default "bottom-center" }} + {{ $margin := .margin | default "20px" }} + + {{ $positionCSS := "" }} + {{ if eq $position "top-left" }} + {{ $positionCSS = printf "top: %s; left: %s;" $margin $margin }} + {{ else if eq $position "top-right" }} + {{ $positionCSS = printf "top: %s; right: %s;" $margin $margin }} + {{ else if eq $position "bottom-left" }} + {{ $positionCSS = printf "bottom: %s; left: %s;" $margin $margin }} + {{ else if eq $position "bottom-right" }} + {{ $positionCSS = printf "bottom: %s; right: %s;" $margin $margin }} + {{ else if eq $position "bottom-center" }} + {{ $positionCSS = printf "bottom: %s; left: 50%%; transform: translateX(-50%%);" $margin }} + {{ end }} + + + {{ end }} + {{ end }} +{{ end }} + + diff --git a/modules/slides/layouts/_partials/functions/slides_get_hook.html b/modules/slides/layouts/_partials/functions/slides_get_hook.html new file mode 100644 index 00000000..153381d9 --- /dev/null +++ b/modules/slides/layouts/_partials/functions/slides_get_hook.html @@ -0,0 +1,39 @@ +{{/* + Slides Hook Loader - Independent Implementation + + This is a self-contained hook system for the slides module that doesn't + depend on the blox module. Users can create partials in their own project's + layouts/_partials/hooks/{hook-name}/ directory. + + Usage: {{ partial "functions/slides_get_hook" (dict "hook" "slide-header" "context" .) }} + + Available hooks for slides: + - slide-header: Top of presentation (inside .reveal, above .slides) + - slide-footer: Bottom of presentation (inside .reveal, below .slides) + - slide-head-end: End of tag (for custom CSS/JS) + - slide-body-end: End of tag (for custom JS) + + Input: dict with "hook" (string) and "context" (page context) + Output: Renders all partials found in the hook directory +*/}} + +{{ $loaded := false }} +{{ $partial_dir := printf "hooks/%s/" .hook }} +{{ $context := .context }} +{{ $hook_dir_path := path.Join "layouts/_partials" $partial_dir }} + +{{/* Use try to gracefully handle missing directories */}} +{{ with try (os.ReadDir $hook_dir_path) }} + {{ with .Value }} + {{ range . }} + {{ if not .IsDir }} + {{ $partial_path := path.Join $partial_dir .Name }} + {{ partial $partial_path $context }} + {{ $loaded = true }} + {{ end }} + {{ end }} + {{ end }} +{{ end }} + +{{/* Debug: uncomment to see if hooks are loaded */}} +{{/* return $loaded */}} diff --git a/modules/slides/layouts/_partials/hooks/slide-body-end/_example.html b/modules/slides/layouts/_partials/hooks/slide-body-end/_example.html new file mode 100644 index 00000000..dc0b507f --- /dev/null +++ b/modules/slides/layouts/_partials/hooks/slide-body-end/_example.html @@ -0,0 +1,22 @@ +{{/* + Example Slide Body-End Hook + + This hook allows injecting custom JavaScript at the end of the + tag, after Reveal.js has been loaded. Useful for: + - Custom Reveal.js plugins + - Analytics tracking on slide changes + - Custom keyboard shortcuts + - Integration with other JS libraries + + To use this hook, create a file at: + layouts/_partials/hooks/slide-body-end/your-custom-script.html +*/}} + +{{/* Uncomment below to track slide changes with console logging */}} +{{/* + +*/}} diff --git a/modules/slides/layouts/_partials/hooks/slide-footer/_example.html b/modules/slides/layouts/_partials/hooks/slide-footer/_example.html new file mode 100644 index 00000000..e4c37ffa --- /dev/null +++ b/modules/slides/layouts/_partials/hooks/slide-footer/_example.html @@ -0,0 +1,20 @@ +{{/* + Example Slide Footer Hook + + This is an example file showing how to create custom footer content + that appears at the bottom of every slide in a presentation. + + To use this hook, create a file at: + layouts/_partials/hooks/slide-footer/your-custom-footer.html + + The content will be rendered inside a diff --git a/modules/slides/layouts/slides/baseof.present.html b/modules/slides/layouts/slides/baseof.present.html index 340e476c..5632ad0c 100644 --- a/modules/slides/layouts/slides/baseof.present.html +++ b/modules/slides/layouts/slides/baseof.present.html @@ -1,5 +1,23 @@ {{/* Present Baseof - Presentation output only + + Hook Points Available: + - slide-head-end: End of for custom CSS/JS + - slide-header: Top of presentation (inside .reveal wrapper) + - slide-footer: Bottom of presentation (inside .reveal wrapper) + - slide-body-end: End of for custom JS + + Branding Configuration (site.Params.slides.branding or page front matter): + logo: + src: "media/logo.png" + position: "top-left" # top-left, top-right, bottom-left, bottom-right + width: "100px" + title: + show: true + position: "bottom-left" + author: + show: true + position: "bottom-right" */}} @@ -38,6 +56,13 @@ {{- $theme := $.Param "slides.theme" | default "black" -}} + {{/* Load branding CSS */}} + {{ $branding_css := resources.Get "css/slides-branding.css" }} + {{ with $branding_css }} + {{ $branding_css = . | minify | fingerprint }} + + {{ end }} + {{/* Hugo Chroma Syntax Highlighter */}} {{ $hl_theme := $.Param "slides.highlight_style" | default "dracula" }} {{ $hl_theme_path := printf "css/libs/chroma/%s.css" $hl_theme }} @@ -58,6 +83,10 @@ document.head.appendChild(link); })(); + + {{/* Hook: slide-head-end - Custom CSS/JS injection point */}} + {{ partial "functions/slides_get_hook" (dict "hook" "slide-head-end" "context" .) }} + @@ -80,7 +109,8 @@ {{ $slidejs := resources.Get "js/hugoblox-slides.js" | js.Build (dict "params" (dict "slides" $.Params.slides )) | fingerprint }} - {{ partial "functions/get_hook" (dict "hook" "body-end" "context" .) }} + {{/* Hook: slide-body-end - End of body for custom JS */}} + {{ partial "functions/slides_get_hook" (dict "hook" "slide-body-end" "context" .) }} diff --git a/templates/academic-cv/assets/media/slides-logo.svg b/templates/academic-cv/assets/media/slides-logo.svg new file mode 100644 index 00000000..d24a8a0c --- /dev/null +++ b/templates/academic-cv/assets/media/slides-logo.svg @@ -0,0 +1 @@ +Markdown \ No newline at end of file diff --git a/templates/academic-cv/assets/media/stacked-peaks.svg b/templates/academic-cv/assets/media/stacked-peaks.svg deleted file mode 100644 index 1adb53a5..00000000 --- a/templates/academic-cv/assets/media/stacked-peaks.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/templates/academic-cv/content/slides/example/index.md b/templates/academic-cv/content/slides/example/index.md index 210143fa..a4bdf6ab 100644 --- a/templates/academic-cv/content/slides/example/index.md +++ b/templates/academic-cv/content/slides/example/index.md @@ -5,16 +5,45 @@ date: 2024-01-01 type: slides summary: "A quick tour of recent research highlights: multimodal LLMs, efficient training, and responsible AI." slides: - theme: black - highlight_style: dracula - diagram: true # Enable Mermaid diagrams + theme: black # Options: black, white, league, beige, sky, night, serif, simple, solarized + highlight_style: dracula # Code syntax highlighting theme + diagram: true # Enable Mermaid diagrams for flowcharts, etc. reveal_options: - controls: true - progress: true - slideNumber: true - hash: true + controls: true # Show navigation arrows + progress: true # Show progress bar + slideNumber: true # Show slide numbers + hash: true # Update URL when navigating slides + + # BRANDING: Add logo, title overlay, and footer to your presentation + # All settings are optional - remove any you don't need + branding: + # LOGO: Display your organization's logo + logo: + filename: "slides-logo.svg" # File in assets/media/ folder (SVG recommended for any theme) + position: "top-right" # Options: top-left, top-right, bottom-left, bottom-right + width: "50px" # Logo width (height scales automatically) + # margin: "20px" # Distance from edge (optional, default: 20px) + + # TITLE OVERLAY: Show presentation title on every slide + title: + show: true # Set to false to hide + position: "bottom-left" # Options: top-left, top-right, bottom-left, bottom-right + # text: "Short Title" # Optional: override the page title with custom text + # margin: "20px" # Distance from edge (optional) + + # AUTHOR OVERLAY: Show author name on every slide + # author: + # show: true + # position: "bottom-right" + + # FOOTER TEXT: Display copyright, conference name, etc. + footer: + text: "© 2026 HugoBlox" # Supports Markdown (e.g., links) + position: "bottom-center" # Options: top-left, top-right, bottom-left, bottom-right, bottom-center --- + + # Example Talk ### Dr. Alex Johnson · Meta AI @@ -319,3 +348,138 @@ This slide won't appear in the presentation but remains in source for reference. Note: Thank you for your attention! Feel free to reach out with questions or contributions. + +--- + +## 🎨 Branding Your Slides + +Add your identity to every slide with simple configuration! + +**What you can add:** + +| Element | Position Options | +|---------|-----------------| +| Logo | top-left, top-right, bottom-left, bottom-right | +| Title | Same as above | +| Author | Same as above | +| Footer Text | Same + bottom-center | + +Edit the `branding:` section in your slide's front matter (top of file). + +--- + +## 📁 Adding Your Logo + +1. Place your logo in `assets/media/` folder +2. Use SVG format for best results (auto-adapts to any theme!) +3. Add to front matter: + +```yaml +branding: + logo: + filename: "your-logo.svg" # Must be in assets/media/ + position: "top-right" + width: "60px" +``` + +**Tip:** SVGs with `fill="currentColor"` automatically match theme colors! + +--- + +## 📝 Title & Author Overlays + +Show presentation title and/or author on every slide: + +```yaml +branding: + title: + show: true + position: "bottom-left" + text: "Short Title" # Optional: override long page title + + author: + show: true + position: "bottom-right" +``` + +Author is auto-detected from page front matter (`author:` or `authors:`). + +--- + +## 📄 Footer Text + +Add copyright, conference name, or any persistent text: + +```yaml +branding: + footer: + text: "© 2024 Your Name · ICML 2024" + position: "bottom-center" +``` + +**Tip:** Supports Markdown! Use `[Link](url)` for clickable links. + +--- + + + +## 🔇 Hiding Branding Per-Slide + +Sometimes you want a clean slide (title slides, full-screen images). + +Add this comment at the **start** of your slide content: + +```markdown + +## My Clean Slide + +Content here... +``` + +☝️ **This slide uses ``** — notice no logo or overlays! + +--- + + + +## 🔇 Selective Hiding + +Hide just the header (logo + title): + +```markdown + +``` + +Or just the footer (author + footer text): + +```markdown + +``` + +☝️ **This slide uses ``** — footer still visible below! + +--- + + + +## ✅ Quick Reference + +| Comment | Hides | +|---------|-------| +| `` | Everything (logo, title, author, footer) | +| `` | Logo + Title overlay | +| `` | Author + Footer text | + +☝️ **This slide uses ``** — logo still visible above! + +--- + +## 🚀 Get Started + +1. Copy this example's front matter as a starting point +2. Replace logo with yours in `assets/media/` +3. Customize positions and text +4. Use `` for special slides + +**Pro tip:** Set site-wide defaults in `config/_default/params.yaml` under `slides.branding`! + diff --git a/templates/markdown-slides/assets/media/slides-logo.svg b/templates/markdown-slides/assets/media/slides-logo.svg new file mode 100644 index 00000000..d24a8a0c --- /dev/null +++ b/templates/markdown-slides/assets/media/slides-logo.svg @@ -0,0 +1 @@ +Markdown \ No newline at end of file diff --git a/templates/markdown-slides/content/slides/example/index.md b/templates/markdown-slides/content/slides/example/index.md index 6e8161ac..12530c5a 100644 --- a/templates/markdown-slides/content/slides/example/index.md +++ b/templates/markdown-slides/content/slides/example/index.md @@ -8,16 +8,36 @@ venue: "Hugo Blox Tutorial" featured: true type: slides slides: - theme: black - highlight_style: dracula - diagram: true + theme: black # Options: black, white, league, beige, sky, night, serif, simple, solarized + highlight_style: dracula # Code syntax highlighting theme + diagram: true # Enable Mermaid diagrams for flowcharts, etc. reveal_options: - controls: true - progress: true - slideNumber: true - hash: true + controls: true # Show navigation arrows + progress: true # Show progress bar + slideNumber: true # Show slide numbers + hash: true # Update URL when navigating slides + + # BRANDING: Add logo, title overlay, and footer to your presentation + # All settings are optional - remove any you don't need + branding: + # LOGO: Display your organization's logo + logo: + filename: "slides-logo.svg" # File in assets/media/ folder (SVG recommended for any theme) + position: "top-right" # Options: top-left, top-right, bottom-left, bottom-right + width: "50px" # Logo width (height scales automatically) + + # TITLE OVERLAY: Show presentation title on every slide + title: + show: true # Set to false to hide + position: "bottom-left" # Options: top-left, top-right, bottom-left, bottom-right + + # FOOTER TEXT: Display copyright, conference name, etc. + footer: + text: "© 2026 HugoBlox" # Supports Markdown (e.g., links) + position: "bottom-center" # Options: top-left, top-right, bottom-left, bottom-right, bottom-center --- + # Markdown Slides ### Write in Markdown. Present Anywhere. @@ -164,3 +184,127 @@ Use `{{}}` - Docs: [docs.hugoblox.com](https://docs.hugoblox.com) *Built with Markdown Slides* + +--- + +## 🎨 Branding Your Slides + +Add your identity to every slide with simple configuration! + +**What you can add:** + +| Element | Position Options | +|---------|-----------------| +| Logo | top-left, top-right, bottom-left, bottom-right | +| Title | Same as above | +| Author | Same as above | +| Footer Text | Same + bottom-center | + +Edit the `branding:` section in your slide's front matter (top of file). + +--- + +## 📁 Adding Your Logo + +1. Place your logo in `assets/media/` folder +2. Use SVG format for best results (auto-adapts to any theme!) +3. Add to front matter: + +```yaml +branding: + logo: + filename: "your-logo.svg" # Must be in assets/media/ + position: "top-right" + width: "60px" +``` + +**Tip:** SVGs with `fill="currentColor"` automatically match theme colors! + +--- + +## 📝 Title & Author Overlays + +Show presentation title and/or author on every slide: + +```yaml +branding: + title: + show: true + position: "bottom-left" + text: "Short Title" # Optional: override long page title + + author: + show: true + position: "bottom-right" +``` + +Author is auto-detected from page front matter (`author:` or `authors:`). + +--- + +## 📄 Footer Text + +Add copyright, conference name, or any persistent text: + +```yaml +branding: + footer: + text: "© 2024 Your Name · ICML 2024" + position: "bottom-center" +``` + +**Tip:** Supports Markdown! Use `[Link](url)` for clickable links. + +--- + + + +## 🔇 Hiding Branding Per-Slide + +Sometimes you want a clean slide (title slides, full-screen images). + +Add this comment at the **start** of your slide content: + +```markdown + +## My Clean Slide + +Content here... +``` + +☝️ **This slide uses ``** — notice no logo or overlays! + +--- + + + +## 🔇 Selective Hiding + +Hide just the header (logo + title): + +```markdown + +``` + +Or just the footer (author + footer text): + +```markdown + +``` + +☝️ **This slide uses ``** — footer still visible below! + +--- + + + +## ✅ Quick Reference + +| Comment | Hides | +|---------|-------| +| `` | Everything (logo, title, author, footer) | +| `` | Logo + Title overlay | +| `` | Author + Footer text | + +☝️ **This slide uses ``** — logo still visible above! +