Theme templates
Theme templates
Reusable style templates for PraisonAI PPT — colours, fonts, backgrounds, and slide size — separate from sermon content in your deck YAML.
Quick start
template: sermon-dark
presentation_title: Sunday Service
sections:
- section: Message
verses:
- reference: John 3:16 (NKJV)
text: For God so loved the world…
praisonaippt -i my_sermon.yaml
# or
praisonaippt -i my_sermon.yaml --template sermon-gold
Built-in templates
| Name | Extends | Description |
|---|---|---|
default |
— | Dark background colour + optional image |
sermon-dark |
default |
House style (white Palatino on dark background) |
sermon-gold |
sermon-dark |
Gold highlights, blue references |
sermon-dark-center |
sermon-dark |
Centred body text |
sermon-dark-ref-bottom |
sermon-dark |
Reference line at bottom |
light-minimal |
— | No background image; blue highlights |
praisonaippt --list-templates
praisonaippt template sermon-gold # show resolved style YAML
Extend a template
Theme files support extends: (style keys only):
# ~/.praisonaippt/templates/my-church.yaml
extends: sermon-gold.yaml
description: Our church variant
slide_style:
highlight_color: '#E6C200'
Deck referencing your theme:
template: my-church
presentation_title: …
sections: …
Or extend inline on the deck:
extends: sermon-dark.yaml
slide_style:
highlight_color: '#FFD700'
Preset and overrides
Without a separate theme file:
slide_style:
preset: sermon-dark
overrides:
highlight_color: '#FFD700'
Deck inline slide_style always wins over template layers.
Merge priority (low → high)
- Template file
extendschain - Top-level
template:or--template - Deck
extends: slide_style.presetslide_style.overrides- Inline
slide_styleon the deck
Python API
from praisonaippt import load_verses_from_file, list_templates, resolve_template_style
load_verses_from_file("sermon.yaml", template="sermon-dark")
resolve_template_style("sermon-gold") # merged dict for tooling
list_templates()
Layout SDK (optional)
Templates may include optional layout tokens under slide_style:
slide_style:
preset: sermon-dark
typography:
title_size_pt: 44
subtitle_size_pt: 28
layouts:
title:
margin_in: 0.6
content_width_in: 9.0
title_top_in: 2.5
Omitted keys use built-in defaults (unchanged decks).
Full token tables: Slide style reference.
Example override block
slide_style:
split_max_length: 220
typography:
body_size_pt: 30
reference_size_pt: 26
layouts:
verse:
margin_in: 0.75
list:
list_top_in: 0.5
image:
margin_in: 0.4
caption_height_in: 1.0
Convention: layouts.* = position and size in inches; typography.* = font sizes in pt.
Built-in slide types
list_renderers() returns all registered kinds, including:
big_number, comparison, hebrew_rename, image, list, picture_text, quote, table, title_only, two_column, verse.
See formatting.md for YAML examples.
Adding a custom slide type
Register a renderer before building the deck when you need a layout not in the table above:
from praisonaippt import register_renderer, create_presentation, load_verses_from_dict
class CalloutRenderer:
kind = "callout"
def validate(self, verse, path):
if not verse.get("text"):
from praisonaippt.exceptions import SchemaError
raise SchemaError(f"{path} callout slide requires 'text'")
def render(self, prs, verse, style, *, source_file=None):
from praisonaippt.core import add_quote_slide
add_quote_slide(prs, verse["text"], style=style, reference=verse.get("reference"))
register_renderer(CalloutRenderer())
Deck YAML:
sections:
- section: Custom
verses:
- slide_type: callout
text: A boxed callout for your deck.
Resolution order: explicit slide_type (must be registered) → list_type (bullet / numbered) → default verse. Unknown slide_type raises SchemaError.
from praisonaippt import list_renderers
list_renderers()
Content vs style templates
| Type | Location | CLI |
|---|---|---|
| Content (verses, sections) | examples/template.yaml, --use-example |
--list-examples |
| Style (theme) | templates/*.yaml, ~/.praisonaippt/templates/ |
--list-templates |
Copy content from examples/template.yaml; apply style with template: sermon-dark.