This skill should be used when creating, modifying, or troubleshooting custom themes for iA Presenter.
Create or edit custom iA Presenter themes that control the visual appearance of presentations, including typography, colours, layouts, backgrounds, and responsive behaviour. Themes consist of CSS files, JSON configuration files, and optional custom fonts or images.
Every iA Presenter theme consists of:
template.json - Theme metadata (name, author, CSS filename, fonts)presets.json - Colour presets for light/dark modes and gradientstheme.css - CSS rules for layouts, typography, and styling.woff2 font filesThemes are stored in:
~/Library/Containers/net.ia.presenter/Data/Library/Application Support/iA Presenter/Themes/
When the user requests theme work, determine the appropriate task:
Trigger: User wants to create a theme from scratch Steps:
references/quick_reference.md for CSS classestemplate.json, presets.json, and CSS fileResources: assets/starter-theme/*, references/quick_reference.md
Trigger: User wants to customise an existing theme Steps:
Resources: references/official_guide.md, references/quick_reference.md
Trigger: User wants to add custom typography Steps:
.woff2 format) are available@font-face declarations to CSStemplate.json with display namespresets.json with CSS font family namesResources: references/official_guide.md (Custom Fonts section)
Trigger: User wants gradients, images, or SVG backgrounds Steps:
presets.jsonResources: references/official_guide.md (Backgrounds section), references/advanced_techniques.md
Trigger: Theme not working as expected Steps:
references/advanced_techniques.md for debugging tipsResources: references/advanced_techniques.md
Modify heading sizes, line heights, and font weights. The starter CSS includes a typography section with heading sizes for both desktop and mobile. Target headings within layouts:
section > :not([class*="layout-"]) h1,
[class*="layout-"] > div h1 {
font-size: 2.986em;
line-height: 1;
}
Available layouts and their CSS classes:
| Layout | Container Class | Content Class |
|---|---|---|
| Cover | .cover-container |
.layout-cover |
| Title | .title-container |
.layout-title |
| Section | .section-container |
.layout-section |
| Split | .v-split-container |
.layout-v-split |
| Grid | .grid-container |
.layout-grid |
| Caption | .caption-container |
.layout-caption |
| Image Title | .title-image-container |
.layout-title-image |
| Default | .default-container |
.layout-default |
To align content, target the inner div of each layout:
.layout-cover > div {
justify-content: center; /* vertical: flex-start, center, flex-end */
align-items: center; /* horizontal: flex-start, center, flex-end */
}
Image backgrounds:
.backgrounds .cover-container {
background-image: url("cover-bg.jpg");
background-size: cover;
background-position: center;
}
Inline SVG (use rgb() colours, not hex):
.backgrounds .v-split-container {
background-image: url('data:image/svg+xml;utf8,<svg>...</svg>');
}
Gradients (defined in presets.json, not CSS):
{
"LightBgGradient": ["#c7e7ff", "#f0c8ff", "#ffdada", "#ffebb2"],
"DarkBgGradient": ["#15354c", "#3e154c", "#4c2828", "#4c3900"]
}
Configure colours for both modes in presets.json:
{
"Appearance": "light",
"DarkBodyTextColor": "#000000",
"LightBodyTextColor": "#ffffff",
"DarkTitleTextColor": "#000000",
"LightTitleTextColor": "#ffffff",
"DarkBackgroundColor": "#1a1a1a",
"LightBackgroundColor": "#ffffff"
}
CRITICAL: Understanding iA Presenter Colour Naming
The colour field names in presets.json can be counter-intuitive. They refer to the COLOUR OF THE ELEMENT, not the mode:
DarkBodyTextColor = Dark-coloured text (e.g. #000000 black)
LightBodyTextColor = Light-coloured text (e.g. #ffffff white)
DarkBackgroundColor = Dark background colour (e.g. #1a1a1a)
LightBackgroundColor = Light background colour (e.g. #ffffff)
Example - For good contrast:
{
"DarkBodyTextColor": "#000000", // Black text for light backgrounds
"LightBodyTextColor": "#ffffff", // White text for dark backgrounds
"DarkBackgroundColor": "#1a1a1a", // Dark grey background
"LightBackgroundColor": "#ffffff" // White background
}
In light mode: Uses LightBackgroundColor (#ffffff) with DarkBodyTextColor (#000000) In dark mode: Uses DarkBackgroundColor (#1a1a1a) with LightBodyTextColor (#ffffff)
Common Mistake: Swapping DarkBodyTextColor and LightBodyTextColor, which results in invisible text.
Force appearance for specific layouts in template.json:
"Layouts": [
{
"Name": "Cover",
"Classes": "dark"
}
]
Default CSS applies to mobile. Use media queries for larger screens:
/* Mobile (default) */
@media (max-width: 639px) {
[class*="layout-"] > div h1 {
font-size: 2.074em;
}
}
/* Desktop/Tablet */
@media (min-width: 768px) {
/* Desktop-specific styles */
}
Symptom: Text appears invisible in both light and dark modes
Cause: Incorrect colour assignments in presets.json. The colour naming refers to the colour of the element, not the mode.
Solution: Ensure colours are assigned correctly:
{
"DarkBodyTextColor": "#000000", // Dark text (for light backgrounds)
"LightBodyTextColor": "#ffffff", // Light text (for dark backgrounds)
"DarkBackgroundColor": "#1a1a1a", // Dark background
"LightBackgroundColor": "#ffffff" // Light background
}
Common Mistake: Setting DarkBodyTextColor to a light colour like "#ffffff" - this puts white text on a white background in light mode.
Use rgb(255,0,0) instead of #FF0000 in inline SVG. Hex colours break inline SVG in CSS.
Verify:
.woff2) are in the theme directory@font-face declarations use correct file pathstemplate.json has display font namespresets.json has CSS font family namesTarget the inner div of layouts:
.layout-cover > div { /* alignment properties */ }
Not the container:
.cover-container { /* this won't align content */ }
Use coloured borders during development:
.cover-container { border: 5px solid red; }
.layout-cover > div { border: 5px dashed red; }
.title-container { border: 5px solid blue; }
.layout-title > div { border: 5px dotted blue; }
Remove these before final distribution.
When creating or modifying themes:
template.json, presets.json, CSS file)assets/starter-theme/* for consistencyreferences/quick_reference.md for CSS classes.layout-* > div, not the containerrgb() format, not hexadecimal@media (min-width: 768px) for desktop.grid-items-2, .grid-items-3, etc. classesReference documentation to load into context as needed:
official_guide.md - Complete official iA Presenter theme documentation covering all layouts, CSS classes, font configuration, backgrounds, gradients, and appearancesquick_reference.md - Condensed reference with CSS classes, selectors, file structure, and common patterns for quick lookupadvanced_techniques.md - Advanced techniques including centring content, debugging borders, inline SVG backgrounds, and workflow tipsLoad progressively:
quick_reference.md (CSS classes, structure)assets/starter-theme/* filesofficial_guide.mdadvanced_techniques.mdStarter theme templates in assets/starter-theme/:
template.json - Minimal theme metadata templatepresets.json - Colour preset template with sensible defaultstheme.css - Comprehensive CSS starter with commented sections for typography, layouts, backgrounds, headers/footers, responsive designREADME.md - Guide for using the starter templatesUse these templates as a starting point for new themes. Copy and customise based on user requirements.