Add XMLGraphics starter presentation

Generated training module for Apache XMLGraphics.
Content researched from xmlgraphics.apache.org.
Requires human review before publishing.
diff --git a/content/Apache/XMLGraphics/metadata.yaml b/content/Apache/XMLGraphics/metadata.yaml
new file mode 100644
index 0000000..d88c2c2
--- /dev/null
+++ b/content/Apache/XMLGraphics/metadata.yaml
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+title: "Apache XML Graphics"
+project_id: xmlgraphics
+description: "Conversion from XML to graphical output — Batik (SVG), FOP (XSL-FO), and XML Graphics Commons"
+tags:
+  - libraries
+  - jvm
+  - intro
+  - developer
+duration: "45-60 min"
+level: beginner
+language: java
+slides: 24
+updated: "2026-05-24"
diff --git a/content/Apache/XMLGraphics/pom.xml b/content/Apache/XMLGraphics/pom.xml
new file mode 100644
index 0000000..b8de462
--- /dev/null
+++ b/content/Apache/XMLGraphics/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.training</groupId>
+    <artifactId>content-parent-pom</artifactId>
+    <version>1.5.0-SNAPSHOT</version>
+    <relativePath>../../../tools/content-parent-pom/pom.xml</relativePath>
+  </parent>
+
+  <groupId>org.apache.training.content</groupId>
+  <artifactId>training-content-apache-xmlgraphics</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>war</packaging>
+
+  <name>Training: Content: Apache: XMLGraphics</name>
+  <description>Training module covering the Apache XML Graphics project (Batik, FOP, and XML Graphics Commons)</description>
+
+</project>
diff --git a/content/Apache/XMLGraphics/src/main/asciidoc/_settings.adoc b/content/Apache/XMLGraphics/src/main/asciidoc/_settings.adoc
new file mode 100644
index 0000000..9a16917
--- /dev/null
+++ b/content/Apache/XMLGraphics/src/main/asciidoc/_settings.adoc
@@ -0,0 +1,36 @@
+////
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+////
+
+:goto:
+:menu:
+:navigation:
+:status:
+:arrows:
+:revealjs_theme: black
+:revealjs_progress: true
+:revealjs_slidenumber: true
+:revealjs_center: false
+:revealjs_history: true
+:customcss: reveal.js-5.2.1/dist/theme/apache.css
+:favicon: https://apache.org/favicon.ico
+:icons: font
+:imagesdir: images
+:sourcedir: ../java
+:idprefix:
+:idseparator: -
diff --git a/content/Apache/XMLGraphics/src/main/asciidoc/images/project-logo.png b/content/Apache/XMLGraphics/src/main/asciidoc/images/project-logo.png
new file mode 100644
index 0000000..d06dd4d
--- /dev/null
+++ b/content/Apache/XMLGraphics/src/main/asciidoc/images/project-logo.png
Binary files differ
diff --git a/content/Apache/XMLGraphics/src/main/asciidoc/index.adoc b/content/Apache/XMLGraphics/src/main/asciidoc/index.adoc
new file mode 100644
index 0000000..5b3dce7
--- /dev/null
+++ b/content/Apache/XMLGraphics/src/main/asciidoc/index.adoc
@@ -0,0 +1,457 @@
+////
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+////
+
+include::_settings.adoc[]
+
+== Apache XML Graphics
+
+image::project-logo.png[Apache XML Graphics, 500]
+
+Conversion from XML to graphical output
+
+[.notes]
+--
+Welcome to the Apache XML Graphics training module. This project is responsible for
+software intended for the creation and maintenance of tools that convert XML to
+graphical output. It has been part of the ASF since October 2004.
+--
+
+== What We'll Cover
+
+* *Part 1* — What Is Apache XML Graphics?
+* *Part 2* — Getting Started
+* *Part 3* — Community
+
+[.notes]
+--
+We'll walk through the three sub-projects, how to get started using them,
+and how to participate in the community.
+--
+
+== Project Overview
+
+* Umbrella project for XML-to-graphics conversion tools
+* Three sub-projects under one PMC:
+** Apache Batik — SVG toolkit
+** Apache FOP — XSL-FO processor
+** Apache XML Graphics Commons — shared library
+* All written in Java
+* Established at the ASF in October 2004
+
+[.notes]
+--
+Apache XML Graphics is not a single tool but rather an umbrella project
+that manages three closely related Java sub-projects, all focused on
+converting XML-based formats into graphical or print output.
+--
+
+== The Charter
+
+[quote]
+____
+Apache XML Graphics exists to promote the use of XML. We view XML as a
+compelling paradigm that structures data as information, thereby
+facilitating the exchange, transformation, and presentation of knowledge.
+____
+
+[.notes]
+--
+This is from the project's official charter. The key goal is building freely
+available products for the conversion of XML to graphical output.
+--
+
+== Apache Batik — SVG Toolkit
+
+* Java-based toolkit for Scalable Vector Graphics (SVG)
+* Display, generate, and manipulate SVG images in Java
+* Core modules: SVG Parser, SVG Generator, SVG DOM, Transcoder API
+* Tools: Squiggle SVG browser, Rasterizer (SVG → PNG/JPEG/TIFF)
+* Latest release: Batik 1.19 (May 2025)
+
+[.notes]
+--
+Batik is a comprehensive SVG toolkit. It lets developers render SVG in Java
+applications, generate SVG from Java2D calls, and manipulate SVG documents
+programmatically. Squiggle is a standalone SVG browser, and the rasterizer
+converts SVG to PNG/JPEG/TIFF from the command line.
+--
+
+== Apache FOP — XSL-FO Processor
+
+* Print formatter driven by XSL formatting objects (XSL-FO)
+* Reads an FO tree and renders to output formats
+* Primary output target: PDF
+* Also supports: PS, PCL, AFP, SVG, XML, Print, AWT, PNG
+* Latest release: FOP 2.11 (May 2025)
+
+[.notes]
+--
+FOP — Formatting Objects Processor — is the world's first print formatter
+driven by XSL-FO. It takes an XML formatting-object tree and produces
+paginated output. PDF is the main target but there are many others.
+--
+
+== FOP Output Formats
+
+[cols="2*", options="header"]
+|===
+| Format | Description
+
+| PDF | Portable Document Format
+| PS | Adobe PostScript
+| PCL | Printer Control Language
+| AFP | MO:DCA
+| SVG | Scalable Vector Graphics
+| PNG | Raster image
+| RTF | Rich Text Format (limited)
+| TXT | Plain text
+|===
+
+[.notes]
+--
+FOP is remarkably versatile in its output targets. PDF and PostScript
+are the most commonly used, but the same XSL-FO input can produce
+any of these formats without code changes.
+--
+
+== Typical FOP Workflow
+
+[source, text]
+----
+XML Data + XSLT Stylesheet → XSL-FO Document
+                |
+                v
+        Apache FOP Processor
+        |
+        v
+  PDF / PS / PCL / ...
+----
+
+[.notes]
+--
+The common pattern: you have XML data, transform it via XSLT into an
+XSL-FO document, then feed that to FOP. FOP handles pagination, font
+management, and output generation. This separates content from presentation.
+--
+
+== Apache XML Graphics Commons
+
+* Shared library used by both Batik and FOP
+* Reusable components usable independently
+* Key components:
+** Image codecs (PNG, TIFF)
+** Graphics2D implementations for PS and EPS output
+** PostScript helper classes and DSC parser
+** XMP metadata framework
+** Image loader framework
+* Latest release: Commons 2.11 (May 2025)
+
+[.notes]
+--
+XML Graphics Commons is the shared foundation. It extracts reusable pieces
+from Batik and FOP into a standalone library. You can use these components
+in your own projects without pulling in all of Batik or FOP.
+--
+
+== How the Sub-Projects Relate
+
+[source, text]
+----
++----------------+     +----------------+
+| Apache Batik   |     |  Apache FOP    |
+| (SVG Toolkit)  |     | (XSL-FO→PDF)  |
++-------+--------+     +--------+-------+
+        |                       |
+        +----------+  +---------+
+                   v  v
+     +-- Apache XML Graphics Commons --+
+----
+
+[.notes]
+--
+Both Batik and FOP depend on XML Graphics Commons for shared functionality
+like PostScript generation, image loading, and codec support. They can also
+interact — for example, FOP uses Batik to handle SVG content in XSL-FO documents.
+--
+
+== Getting Batik
+
+* Download from https://xmlgraphics.apache.org/batik/
+* Binary distribution includes all dependencies
+* Requires Java Runtime Environment 1.8 or later
+* Maven coordinates:
+[source, xml]
+----
+<dependency>
+  <groupId>org.apache.xmlgraphics</groupId>
+  <artifactId>batik-all</artifactId>
+  <version>1.19</version>
+</dependency>
+----
+
+[.notes]
+--
+The binary distribution is self-contained — all dependencies are bundled.
+For Maven projects, you can pull in batik-all or individual modules like
+batik-transcoder, batik-svg-dom, etc.
+--
+
+== Getting FOP
+
+* Download from https://xmlgraphics.apache.org/fop/
+* Binary or source distribution available
+* Requires Java 1.8 or later
+* Maven coordinates:
+[source, xml]
+----
+<dependency>
+  <groupId>org.apache.xmlgraphics</groupId>
+  <artifactId>fop</artifactId>
+  <version>2.11</version>
+</dependency>
+----
+
+[.notes]
+--
+Like Batik, FOP is available as a binary download or via Maven. The binary
+distribution includes command-line scripts for quick use. FOP also has an
+Ant task for build-tool integration.
+--
+
+== FOP Quick Start — Hello World
+
+1. Unpack the binary distribution
+2. Create an XML data file (`name.xml`)
+3. Create an XSLT stylesheet that transforms to XSL-FO
+4. Run FOP:
+
+[source, bash]
+----
+fop -xml name.xml -xsl name2fo.xsl -pdf name.pdf
+----
+
+[.notes]
+--
+The quickest way to see FOP in action: create a simple XML file, write an
+XSLT stylesheet that outputs XSL-FO, then run the fop command. You'll have
+a PDF in seconds. The FOP Quick Start Guide on the website walks through
+this in detail.
+--
+
+== Embedding FOP in Java
+
+[source, java]
+----
+FopFactory fopFactory = FopFactory.newInstance(
+    new File("fop.xconf"));
+FOUserAgent foUserAgent =
+    fopFactory.newFOUserAgent();
+OutputStream out = new FileOutputStream("out.pdf");
+Fop fop = fopFactory.newFop(
+    MimeConstants.MIME_PDF, foUserAgent, out);
+----
+
+[.notes]
+--
+For programmatic use, you create a FopFactory, configure it, obtain a
+FOUserAgent, and create a Fop instance bound to your desired output format.
+Then you feed it a SAX stream or FO document via a Transformer.
+--
+
+== Using Batik — SVG Rasterizer
+
+[source, bash]
+----
+java -jar batik-rasterizer.jar input.svg
+----
+
+* Converts SVG to PNG by default
+* Options for JPEG, TIFF, PDF output
+* Batch mode: pass multiple files or a directory
+
+[.notes]
+--
+The Batik rasterizer is a handy command-line tool for converting SVG files
+to raster images. It supports customizing output resolution, area, and format.
+Great for batch-processing SVG assets in a build pipeline.
+--
+
+== Using Batik — SVG Generator
+
+[source, java]
+----
+DOMImplementation domImpl =
+    GenericDOMImplementation.getDOMImplementation();
+Document document = domImpl.createDocument(
+    SVGConstants.SVG_NAMESPACE_URI, "svg", null);
+SVGGraphics2D svgGenerator =
+    new SVGGraphics2D(document);
+// Paint using standard Java2D calls
+myComponent.paint(svgGenerator);
+----
+
+[.notes]
+--
+The SVG Generator lets you take any Java2D drawing code and produce SVG
+output. You simply instantiate SVGGraphics2D and use it as your Graphics2D
+context. Then serialize the resulting DOM to get an SVG file.
+--
+
+== Source Repositories
+
+[cols="2*", options="header"]
+|===
+| Repository | Content
+
+| xmlgraphics-batik | Apache Batik source
+| xmlgraphics-fop | Apache FOP source
+| xmlgraphics-commons | Shared commons library
+| xmlgraphics-website | Project website
+|===
+
+All hosted at https://gitbox.apache.org/repos/asf/ and mirrored on GitHub.
+
+[.notes]
+--
+The source code lives in Git repositories on ASF Gitbox, with read-only
+mirrors on GitHub. Contributors can submit patches or pull requests
+through either path.
+--
+
+== Building from Source
+
+[source, bash]
+----
+git clone https://gitbox.apache.org/repos/asf/\
+    xmlgraphics-fop.git
+cd xmlgraphics-fop
+mvn clean install
+----
+
+* All sub-projects use Apache Maven
+* Java 8+ required for building
+
+[.notes]
+--
+Building from source follows standard Maven conventions. Clone the repo,
+run mvn clean install, and you're set. Integration tests may require
+additional setup — check each sub-project's README.
+--
+
+== Project Governance
+
+* Apache Software Foundation Top-Level Project (TLP)
+* PMC (Project Management Committee) with 12 members
+* Established October 2004
+* Operates on meritocracy — contributions earn responsibility
+* Reports to the ASF Board on a quarterly cycle
+
+[.notes]
+--
+XML Graphics is a mature TLP. The PMC currently has 12 members who
+oversee releases, community, and project direction. Like all ASF projects,
+it follows the Apache Way — open, transparent, and community-driven.
+--
+
+== Mailing Lists
+
+* `general@xmlgraphics.apache.org` — cross-project discussions
+* `batik-users@xmlgraphics.apache.org` — Batik user questions
+* `batik-dev@xmlgraphics.apache.org` — Batik development
+* `fop-users@xmlgraphics.apache.org` — FOP user questions
+* `fop-dev@xmlgraphics.apache.org` — FOP development
+
+[.notes]
+--
+lists are the primary communication channel. The general list covers
+cross-project and XML Graphics Commons topics. Each sub-project has its own
+users and dev list. Archives are available via mail-archives.apache.org.
+--
+
+== Issue Tracking & Contributing
+
+* Batik: https://issues.apache.org/jira/browse/BATIK
+* FOP: https://issues.apache.org/jira/browse/FOP
+* Commons: https://issues.apache.org/jira/browse/XGC
+* Subscribe to the dev list → find an issue → submit a patch
+* Pull requests accepted on GitHub mirrors
+
+[.notes]
+--
+Bug reports and feature requests go through ASF JIRA. The path to
+contribution: subscribe to the dev list, find an issue, submit a patch
+or pull request via GitHub mirrors. Code review happens on the mailing list.
+--
+
+== Current Status (May 2025 Releases)
+
+* Batik 1.19 — bug fix release
+* FOP 2.11 — latest stable
+* XML Graphics Commons 2.11 — supports FOP 2.11
+* All released on May 6, 2025
+
+[.notes]
+--
+The project recently released coordinated updates across all three
+sub-projects. The Batik release focused on bug fixes, while FOP 2.11
+brings the latest stable feature set for XSL-FO processing.
+--
+
+== Key Use Cases
+
+* Generate PDF reports from XML data (FOP)
+* Render SVG in Java applications (Batik)
+* Convert SVG to raster images in build pipelines (Batik)
+* Produce PostScript output from Java2D (Commons)
+* Embed SVG graphics in XSL-FO documents (Batik + FOP)
+
+[.notes]
+--
+These are the most common real-world scenarios. Many organizations use FOP
+for automated PDF generation from business data. Batik is popular in
+diagram editors and visualization tools. The combination of all three
+covers the full pipeline from data to print-ready output.
+--
+
+== Resources
+
+* Website: https://xmlgraphics.apache.org/
+* Batik: https://xmlgraphics.apache.org/batik/
+* FOP: https://xmlgraphics.apache.org/fop/
+* Commons: https://xmlgraphics.apache.org/commons/
+* Wiki: https://cwiki.apache.org/confluence/display/XMLGRAPHICS
+
+[.notes]
+--
+Here are the key links for further exploration. The website has full
+documentation, tutorials, and API references for each sub-project.
+The wiki contains community plans and additional how-to guides.
+--
+
+== Thank You
+
+image::project-logo.png[Apache XML Graphics, 300]
+
+https://xmlgraphics.apache.org/
+
+[.notes]
+--
+Thank you for attending this session on Apache XML Graphics. Please visit
+the website, join the mailing lists, and consider contributing!
+--
diff --git a/content/Apache/XMLGraphics/src/main/theme/apache.css b/content/Apache/XMLGraphics/src/main/theme/apache.css
new file mode 100644
index 0000000..d8f2a14
--- /dev/null
+++ b/content/Apache/XMLGraphics/src/main/theme/apache.css
@@ -0,0 +1,457 @@
+/*
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+*/
+
+/*********************************************
+ * APACHE TRAINING DARK THEME
+ * White text on black, large fonts for
+ * conference room visibility.
+ *********************************************/
+
+/*********************************************
+ * GLOBAL STYLES
+ *********************************************/
+body {
+  background-color: #1a1a1a;
+  background-image: none;
+}
+
+.reveal-viewport {
+  background-color: #1a1a1a;
+  color: #f0f0f0;
+  background-image: none !important;
+}
+
+.reveal {
+  font-family: "Segoe UI", Helvetica, Arial, sans-serif;
+  font-size: 32px;
+  font-weight: normal;
+  color: #f0f0f0;
+}
+
+/*********************************************
+ * SLIDE OVERFLOW — allow scrolling if content
+ * exceeds slide height
+ *********************************************/
+.reveal .slides section {
+  height: auto !important;
+  overflow-y: auto !important;
+}
+
+::selection {
+  color: #fff;
+  background: #42affa;
+  text-shadow: none;
+}
+
+.reveal .slides > section, .reveal .slides > section > section {
+  line-height: 1.4;
+  font-weight: inherit;
+}
+
+/*********************************************
+ * HEADERS — smaller than default
+ *********************************************/
+.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {
+  margin: 0 0 20px 0;
+  color: #ffffff;
+  font-family: "Segoe UI", Helvetica, Arial, sans-serif;
+  font-weight: 600;
+  line-height: 1.2;
+  letter-spacing: normal;
+  text-transform: none;
+  text-shadow: none;
+  word-wrap: break-word;
+}
+
+.reveal h1 {
+  font-size: 1.4em;
+}
+
+.reveal h2 {
+  font-size: 1.0em;
+}
+
+.reveal h3 {
+  font-size: 0.9em;
+}
+
+.reveal h4 {
+  font-size: 0.8em;
+}
+
+/*********************************************
+ * BODY TEXT — large for back-of-room
+ *********************************************/
+.reveal p {
+  margin: 20px 0;
+  line-height: 1.4;
+  font-size: 1em;
+}
+
+.reveal li {
+  font-size: 0.95em;
+  margin-bottom: 0.3em;
+}
+
+/* Ensure certain elements are never larger than the slide itself */
+.reveal img, .reveal video, .reveal iframe {
+  max-width: 95%;
+  max-height: 85%;
+}
+
+.reveal strong, .reveal b {
+  font-weight: bold;
+  color: #ffffff;
+}
+
+.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 q, .reveal blockquote {
+  quotes: none;
+}
+
+.reveal blockquote {
+  display: block;
+  position: relative;
+  width: 70%;
+  margin: 20px auto;
+  padding: 5px;
+  font-style: italic;
+  background: rgba(255, 255, 255, 0.05);
+  box-shadow: 0 0 2px rgba(255, 255, 255, 0.2);
+  color: #ccc;
+}
+
+.reveal blockquote p:first-child, .reveal blockquote p:last-child {
+  display: inline-block;
+}
+
+.reveal q {
+  font-style: italic;
+}
+
+/*********************************************
+ * CODE
+ *********************************************/
+.reveal pre {
+  display: block;
+  position: relative;
+  width: 90%;
+  margin: 20px auto;
+  text-align: left;
+  font-size: 0.55em;
+  font-family: "Fira Code", "Consolas", monospace;
+  line-height: 1.3em;
+  word-wrap: break-word;
+  box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
+}
+
+.reveal code {
+  font-family: "Fira Code", "Consolas", monospace;
+}
+
+.reveal pre code {
+  display: block;
+  padding: 10px;
+  overflow: auto;
+  max-height: 450px;
+  word-wrap: normal;
+  background: #2d2d2d;
+  color: #e0e0e0;
+  border-radius: 4px;
+}
+
+/*********************************************
+ * TABLES
+ *********************************************/
+.reveal table {
+  margin: auto;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+.reveal table th {
+  font-weight: bold;
+  color: #ffffff;
+}
+
+.reveal table th, .reveal table td {
+  text-align: left;
+  padding: 0.3em 0.6em;
+  border-bottom: 1px solid #555;
+  color: #e0e0e0;
+}
+
+.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 tr:last-child td {
+  border-bottom: none;
+}
+
+.reveal sup {
+  vertical-align: super;
+}
+
+.reveal sub {
+  vertical-align: sub;
+}
+
+.reveal small {
+  display: inline-block;
+  font-size: 0.6em;
+  line-height: 1.2em;
+  vertical-align: top;
+}
+
+.reveal small * {
+  vertical-align: top;
+}
+
+/*********************************************
+ * LINKS
+ *********************************************/
+.reveal a {
+  color: #42affa;
+  text-decoration: none;
+  -webkit-transition: color 0.15s ease;
+  -moz-transition: color 0.15s ease;
+  transition: color 0.15s ease;
+}
+
+.reveal a:hover {
+  color: #8dcffc;
+  text-shadow: none;
+  border: none;
+}
+
+.reveal .roll span:after {
+  color: #fff;
+  background: #068ee9;
+}
+
+/*********************************************
+ * IMAGES
+ *********************************************/
+.reveal section img {
+  margin: 15px 0;
+}
+
+.reveal a img {
+  -webkit-transition: all 0.15s linear;
+  -moz-transition: all 0.15s linear;
+  transition: all 0.15s linear;
+}
+
+.reveal a:hover img {
+  background: rgba(255, 255, 255, 0.2);
+  border-color: #42affa;
+  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
+}
+
+/*********************************************
+ * NAVIGATION CONTROLS
+ *********************************************/
+.reveal .controls div.navigate-left, .reveal .controls div.navigate-left.enabled {
+  border-right-color: #42affa;
+}
+
+.reveal .controls div.navigate-right, .reveal .controls div.navigate-right.enabled {
+  border-left-color: #42affa;
+}
+
+.reveal .controls div.navigate-up, .reveal .controls div.navigate-up.enabled {
+  border-bottom-color: #42affa;
+}
+
+.reveal .controls div.navigate-down, .reveal .controls div.navigate-down.enabled {
+  border-top-color: #42affa;
+}
+
+.reveal .controls div.navigate-left.enabled:hover {
+  border-right-color: #8dcffc;
+}
+
+.reveal .controls div.navigate-right.enabled:hover {
+  border-left-color: #8dcffc;
+}
+
+.reveal .controls div.navigate-up.enabled:hover {
+  border-bottom-color: #8dcffc;
+}
+
+.reveal .controls div.navigate-down.enabled:hover {
+  border-top-color: #8dcffc;
+}
+
+/*********************************************
+ * PROGRESS BAR
+ *********************************************/
+.reveal .progress {
+  background: rgba(255, 255, 255, 0.2);
+}
+
+.reveal .progress span {
+  background: #42affa;
+  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
+  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
+  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
+}
+
+/*********************************************
+ * SLIDE NUMBER
+ *********************************************/
+.reveal .slide-number {
+  color: #888;
+  background-color: rgba(0, 0, 0, 0);
+}
+
+/*********************************************
+ * GENERAL PURPOSE COLORS
+ *********************************************/
+.reveal .red {
+  color: #ff4444;
+}
+
+.reveal .orange {
+  color: #ffaa44;
+}
+
+.reveal .yellow {
+  color: #ffff44;
+}
+
+.reveal .green {
+  color: #44ff44;
+}
+
+/*********************************************
+ * HIDE THE PERSISTENT HEADER/FOOTER from
+ * document.html.slim template
+ *********************************************/
+.header,
+.footer {
+  display: none !important;
+}
+
+/*********************************************
+ * PROJECT LOGO — small, top left of every slide
+ * Each module should place a project-logo.png
+ * in src/main/asciidoc/images/ OR override
+ * this rule in a local customcss with the
+ * project's logo URL.
+ *********************************************/
+.reveal::before {
+  content: "";
+  position: fixed;
+  top: 16px;
+  left: 16px;
+  width: 120px;
+  height: 36px;
+  background-image: url("../../../images/project-logo.png");
+  background-size: contain;
+  background-repeat: no-repeat;
+  opacity: 0.7;
+  z-index: 100;
+  pointer-events: none;
+}
+
+/*********************************************
+ * APACHE OAK LEAF — bottom right of every slide
+ *********************************************/
+.reveal::after {
+  content: "";
+  position: fixed;
+  bottom: 16px;
+  left: 16px;
+  width: 36px;
+  height: 36px;
+  background-image: url("../../../images/logo-apache.png");
+  background-size: contain;
+  background-repeat: no-repeat;
+  opacity: 0.6;
+  z-index: 100;
+  pointer-events: none;
+}
+
+/*********************************************
+ * C3JS Charts (dark mode)
+ *********************************************/
+.c3 {
+  fill: white;
+}
+
+.c3 line, .c3 path {
+  stroke: white !important;
+}
+
+/*********************************************
+ * Column layout
+ *********************************************/
+.reveal .west {
+  position: fixed;
+  left: 5%;
+}
+
+.reveal .east {
+  position: fixed;
+  right: 5%;
+}