You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@training.apache.org by rb...@apache.org on 2026/05/24 17:13:20 UTC
(training) branch celix-starter-presentation created (now 5cb5d82)
This is an automated email from the ASF dual-hosted git repository.
rbowen pushed a change to branch celix-starter-presentation
in repository https://gitbox.apache.org/repos/asf/training.git
at 5cb5d82 Add Celix starter presentation
This branch includes the following new commits:
new 5cb5d82 Add Celix starter presentation
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(training) 01/01: Add Celix starter presentation
Posted by rb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rbowen pushed a commit to branch celix-starter-presentation
in repository https://gitbox.apache.org/repos/asf/training.git
commit 5cb5d821256d9800c459ef46f653348848718425
Author: Rich Bowen <rb...@rcbowen.com>
AuthorDate: Sun May 24 13:11:58 2026 -0400
Add Celix starter presentation
Generated training module for Apache Celix.
Content researched from celix.apache.org.
Requires human review before publishing.
---
content/Apache/Celix/metadata.yaml | 29 ++
content/Apache/Celix/pom.xml | 39 ++
.../Apache/Celix/src/main/asciidoc/_settings.adoc | 36 ++
.../src/main/asciidoc/images/project-logo.png | Bin 0 -> 39871 bytes
content/Apache/Celix/src/main/asciidoc/index.adoc | 494 +++++++++++++++++++++
content/Apache/Celix/src/main/theme/apache.css | 457 +++++++++++++++++++
6 files changed, 1055 insertions(+)
diff --git a/content/Apache/Celix/metadata.yaml b/content/Apache/Celix/metadata.yaml
new file mode 100644
index 0000000..a8fa14a
--- /dev/null
+++ b/content/Apache/Celix/metadata.yaml
@@ -0,0 +1,29 @@
+# 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 Celix"
+project_id: celix
+description: "Introduction to Apache Celix - an OSGi implementation adapted to C and C++"
+tags:
+ - iot
+ - libraries
+ - intro
+ - developer
+ - contributor
+duration: "45-60 min"
+level: beginner
+language: c-cpp
+slides: 25
+updated: "2026-05-24"
diff --git a/content/Apache/Celix/pom.xml b/content/Apache/Celix/pom.xml
new file mode 100644
index 0000000..3cb82c4
--- /dev/null
+++ b/content/Apache/Celix/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-celix</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>war</packaging>
+
+ <name>Training: Content: Apache: Celix</name>
+ <description>Introduction to Apache Celix - OSGi implementation for C and C++</description>
+
+</project>
diff --git a/content/Apache/Celix/src/main/asciidoc/_settings.adoc b/content/Apache/Celix/src/main/asciidoc/_settings.adoc
new file mode 100644
index 0000000..9a16917
--- /dev/null
+++ b/content/Apache/Celix/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/Celix/src/main/asciidoc/images/project-logo.png b/content/Apache/Celix/src/main/asciidoc/images/project-logo.png
new file mode 100644
index 0000000..9a603e1
Binary files /dev/null and b/content/Apache/Celix/src/main/asciidoc/images/project-logo.png differ
diff --git a/content/Apache/Celix/src/main/asciidoc/index.adoc b/content/Apache/Celix/src/main/asciidoc/index.adoc
new file mode 100644
index 0000000..3e8a284
--- /dev/null
+++ b/content/Apache/Celix/src/main/asciidoc/index.adoc
@@ -0,0 +1,494 @@
+////
+
+ 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[]
+:presenter_name: Your Name
+:presenter_company: Your Company
+:description: Introduction to Apache Celix
+:keywords: Apache, Celix, OSGi, C, C++, modular, dynamic, services
+:author: Your Name
+:email: Your email
+:position: Your role
+
+== Apache Celix
+
+image::project-logo.png[Apache Celix, 500]
+
+An implementation of the OSGi specification adapted to C and C++
+
+[.notes]
+--
+Apache Celix is a framework for developing dynamic modular software
+applications using component and in-process service-oriented programming.
+It brings the power of OSGi to the native world.
+--
+
+== Who am I?
+{author} +
+{position} +
+{email} +
+
+// ============================================================
+// PART 1: WHAT IS IT?
+// ============================================================
+
+== What is Apache Celix?
+
+* A framework for *C and C++14* to develop dynamic modular software
+* An implementation of the *OSGi specification* adapted for native code
+* Uses *component and service-oriented programming* in-process
+* Primarily developed in C with a C++ abstraction library
+
+[.notes]
+--
+Celix brings the OSGi modularity model to the native/embedded world.
+OSGi is well-established in Java for dynamic module systems; Celix
+adapts those concepts—bundles, services, service registries—to C and C++.
+--
+
+== The Problem it Solves
+
+* Native applications (C/C++) lack a standard *modularity framework*
+* No dynamic service discovery or hot-swapping in traditional builds
+* Monolithic designs make updates risky in *embedded* and *IoT* systems
+* Need for runtime-installable components without full restart
+
+[.notes]
+--
+In Java, OSGi solved the modularity problem decades ago. But for
+embedded systems, IoT devices, and performance-critical native apps,
+there was no equivalent. Celix fills that gap.
+--
+
+== Key Features
+
+* *Runtime-installable bundles* — zip files containing shared libraries
+* *Dynamic services* — register, discover, and track services at runtime
+* *C and C++ support* — native C API plus C++ POCO abstraction layer
+* *OSGi-inspired* — familiar model for anyone coming from Java OSGi
+* *CMake integration* — purpose-built CMake functions for building bundles
+
+[.notes]
+--
+Services in Celix are "plain old" structs with function pointers (C)
+or "plain old C++ Objects" (POCO). The framework handles lifecycle
+and dependency injection.
+--
+
+== Core Concepts
+
+* *Bundle* — a zip file containing shared libraries and a manifest
+* *Bundle Context* — the API a bundle uses to interact with the framework
+* *Service* — a C struct or C++ object registered in the service registry
+* *Service Registry* — central registry for publishing and discovering services
+* *Container* — a running Celix framework instance with installed bundles
+
+[.notes]
+--
+These concepts map directly to OSGi terminology. If you know OSGi,
+you already understand Celix's architecture at a high level.
+--
+
+== How Services Work
+
+[source,text]
+----
+┌──────────────────────────────────┐
+│ Celix Framework │
+│ ┌────────────────────────────┐ │
+│ │ Service Registry │ │
+│ └────────────────────────────┘ │
+│ ▲ register │ discover │
+│ ┌──┴───┐ ┌──▼───┐ │
+│ │Bundle │ │Bundle │ │
+│ │ A │ │ B │ │
+│ └───────┘ └───────┘ │
+└──────────────────────────────────┘
+----
+
+* Bundle A *registers* a service (struct with function pointers)
+* Bundle B *discovers and uses* that service via the registry
+
+[.notes]
+--
+Services are decoupled—Bundle B does not link directly against Bundle A.
+The registry acts as the mediator, enabling dynamic composition.
+--
+
+== Use Cases
+
+* *Embedded systems* — modular firmware with hot-swappable components
+* *IoT gateways* — plugin-based protocol adapters
+* *Industrial automation* — dynamic service composition
+* *Networking equipment* — runtime-updatable modules
+
+[.notes]
+--
+Anywhere you need modularity in native code without the overhead
+of a full JVM. Celix is particularly well-suited to resource-
+constrained environments that demand C/C++ performance.
+--
+
+== Project History
+
+* *2012* — Celix 0.0.1-incubating released (entered Apache Incubator)
+* *2014* — Celix 1.0.0.incubating released; graduated to Top-Level Project
+* *2016* — Celix 2.0.0 released
+* *2018* — Celix 2.1.0 released
+* *2023* — Celix 2.4.0 released (latest stable)
+
+[.notes]
+--
+Celix has been a TLP since July 2014. Development is steady with
+periodic releases focused on stability and API improvements.
+--
+
+// ============================================================
+// PART 2: GETTING STARTED
+// ============================================================
+
+== Prerequisites
+
+* *Operating System*: Linux, macOS, or Windows (with Conan)
+* *Compiler*: GCC or Clang with C11 and C++14 support
+* *CMake* 3.18+
+* *Conan* (optional, for dependency management)
+
+[.notes]
+--
+Celix uses CMake as its build system. Conan can simplify fetching
+dependencies but is not strictly required if you install them manually.
+--
+
+== Building from Source
+
+[source,bash]
+----
+git clone https://github.com/apache/celix.git
+cd celix
+mkdir build && cd build
+cmake -DCMAKE_BUILD_TYPE=Release ..
+make -j$(nproc)
+make install
+----
+
+[.notes]
+--
+The build produces the Celix framework libraries, built-in bundles,
+and CMake config files for downstream projects to use via find_package.
+--
+
+== Download a Release
+
+* Source tarball: `celix-2.4.0.tar.gz`
+* Download: https://celix.apache.org/download.cgi
+* Always verify signatures and checksums
+
+[source,bash]
+----
+gpg --verify celix-2.4.0.tar.gz.asc
+sha512sum -c celix-2.4.0.tar.gz.sha512
+----
+
+[.notes]
+--
+Apache Celix only releases source distributions. Binary artifacts
+are not provided—you build from source for your target platform.
+This is common for native C/C++ projects.
+--
+
+== Hello World Bundle (C++)
+
+[source,cpp]
+----
+#include <iostream>
+#include "celix/BundleActivator.h"
+
+class MyBundleActivator {
+public:
+ explicit MyBundleActivator(
+ const std::shared_ptr<celix::BundleContext>& ctx) {
+ std::cout << "Hello from bundle "
+ << ctx->getBundleId() << std::endl;
+ }
+ ~MyBundleActivator() noexcept {
+ std::cout << "Goodbye world" << std::endl;
+ }
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(MyBundleActivator)
+----
+
+[.notes]
+--
+The CELIX_GEN_CXX_BUNDLE_ACTIVATOR macro generates the entry points
+that the framework calls when the bundle is started and stopped.
+--
+
+== CMake for Hello World
+
+[source,cmake]
+----
+find_package(Celix REQUIRED)
+
+add_celix_bundle(MyBundle
+ SOURCES src/MyBundleActivator.cc
+)
+
+add_celix_container(MyContainer
+ BUNDLES
+ Celix::ShellCxx
+ Celix::shell_tui
+ MyBundle
+)
+----
+
+[.notes]
+--
+add_celix_bundle creates the bundle zip. add_celix_container generates
+a main executable that starts the framework with the listed bundles.
+--
+
+== Running the Container
+
+[source,bash]
+----
+cd cmake-build-debug/deploy/MyContainer
+./MyContainer
+
+# Celix shell commands:
+-> lb -a # list all installed bundles
+-> help # list available shell commands
+-> stop 3 # stop a bundle by ID
+-> start 3 # start it again
+-> stop 0 # stop the Celix framework
+----
+
+[.notes]
+--
+The built-in shell bundles (ShellCxx, shell_tui) provide a text
+interface for inspecting and managing bundles at runtime. This is
+extremely useful during development and debugging.
+--
+
+== Registering a Service
+
+[source,cpp]
+----
+#include "ICalc.h"
+#include "celix/BundleActivator.h"
+
+class CalcProvider : public ICalc {
+public:
+ int add(int a, int b) override { return a + b; }
+};
+
+class CalcProviderActivator {
+public:
+ explicit CalcProviderActivator(
+ const std::shared_ptr<celix::BundleContext>& ctx) {
+ reg = ctx->registerService<ICalc>(
+ std::make_shared<CalcProvider>()).build();
+ }
+private:
+ std::shared_ptr<celix::ServiceRegistration> reg{};
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcProviderActivator)
+----
+
+[.notes]
+--
+Services are registered with a type (ICalc) and can include
+properties (metadata). The registration is held via a shared_ptr;
+when it goes out of scope, the service is unregistered.
+--
+
+== Using a Service
+
+[source,cpp]
+----
+#include "ICalc.h"
+#include "celix/BundleActivator.h"
+
+class CalcUserActivator {
+public:
+ explicit CalcUserActivator(
+ const std::shared_ptr<celix::BundleContext>& ctx) {
+ ctx->useService<ICalc>()
+ .addUseCallback([](ICalc& calc) {
+ std::cout << "2+3=" << calc.add(2, 3)
+ << std::endl;
+ })
+ .setTimeout(std::chrono::seconds{1})
+ .build();
+ }
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcUserActivator)
+----
+
+[.notes]
+--
+useService provides ad-hoc access. For long-lived dependencies,
+use trackServices to be notified when services appear or disappear.
+--
+
+== Tracking Services
+
+[source,cpp]
+----
+class CalcTrackerActivator {
+public:
+ explicit CalcTrackerActivator(
+ const std::shared_ptr<celix::BundleContext>& ctx) {
+ tracker = ctx->trackServices<ICalc>().build();
+ for (auto& calc : tracker->getServices()) {
+ std::cout << "result: "
+ << calc->add(2, 3) << std::endl;
+ }
+ }
+private:
+ std::shared_ptr<celix::ServiceTracker<ICalc>>
+ tracker{};
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcTrackerActivator)
+----
+
+[.notes]
+--
+Service trackers provide continuous awareness of service availability.
+They invoke callbacks as services come and go, making your code
+reactive to the dynamic environment.
+--
+
+// ============================================================
+// PART 3: PARTICIPATING IN THE COMMUNITY
+// ============================================================
+
+== The Apache Celix Community
+
+* *PMC members*: 10
+* *Committers*: 17
+* *Top-Level Project since*: July 2014
+* *Languages*: C (49%), C++ (43%), CMake (7%)
+
+[.notes]
+--
+Celix is a focused, specialist community. The core contributors
+have deep expertise in embedded systems and native modular architectures.
+--
+
+== Communication Channels
+
+[cols="2,3", options="header"]
+|===
+| Channel | Link
+
+| Dev mailing list
+| dev@celix.apache.org — https://lists.apache.org/list.html?dev@celix.apache.org[Archive]
+
+| Commits list
+| commits@celix.apache.org
+
+| GitHub Issues
+| https://github.com/apache/celix/issues
+
+| GitHub Pull Requests
+| https://github.com/apache/celix/pulls
+|===
+
+[.notes]
+--
+The dev mailing list is the official channel for design discussion,
+release votes, and community decisions. GitHub is used for code
+review and issue tracking.
+--
+
+== How to Contribute
+
+* *Find an issue* — browse GitHub Issues or ask on dev@
+* *Discuss your approach* — email the dev list or comment on the issue
+* *Fork and branch* — `git checkout -b my-feature`
+* *Submit a PR* — reference the issue number
+* *Respond to review* — iterate based on feedback
+
+[.notes]
+--
+The Celix contributing guide is at
+https://celix.apache.org/contributing/submitting-patches.html
+Follow the development workflow described there.
+--
+
+== Beyond Code
+
+* *Documentation* — improve guides, fix typos, add examples
+* *Testing* — reproduce bugs, write test cases
+* *User support* — answer questions on the dev@ list
+* *Website* — the site uses Hugo; contributions via celix-site repo
+
+[.notes]
+--
+The website is built with Hugo and deployed via Jenkins. Pull requests
+to the celix-site repository get Netlify previews automatically.
+--
+
+== Governance & Roles
+
+[cols="2,3", options="header"]
+|===
+| Role | Description
+
+| *User*
+| Anyone using the software
+
+| *Contributor*
+| Someone who has submitted patches or helped
+
+| *Committer*
+| Earned write access (voted in by PMC)
+
+| *PMC Member*
+| Responsible for releases and project direction
+
+| *PMC Chair*
+| Administrative liaison to the ASF Board
+|===
+
+== Further Resources
+
+* *Website*: https://celix.apache.org
+* *Source code*: https://github.com/apache/celix
+* *Downloads*: https://celix.apache.org/download.cgi
+* *ASF Community*: https://community.apache.org
+* *How the ASF Works*: https://www.apache.org/foundation/how-it-works.html
+
+== Questions?
+
+image::project-logo.png[Apache Celix, 200]
+
+* dev@celix.apache.org
+* https://celix.apache.org
+
+[.notes]
+--
+Open the floor for questions.
+Remind attendees they can reach the community on the mailing list.
+--
diff --git a/content/Apache/Celix/src/main/theme/apache.css b/content/Apache/Celix/src/main/theme/apache.css
new file mode 100644
index 0000000..d8f2a14
--- /dev/null
+++ b/content/Apache/Celix/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%;
+}