Skins¶
r0astr features a skin system that allows customization of the UI layout and visual theme through modular skin packages.
What Are Skins?¶
Skins are self-contained packages that define:
- HTML Templates — Panel layout, slider controls, UI components
- CSS Theme — Visual styling, colors, spacing, animations
- Manifest — Metadata, configuration, and CSS variable overrides
Unlike traditional themes that only change colors, r0astr skins can completely restructure the UI layout while maintaining compatibility with the underlying JavaScript.
Included Skins¶
Default (Tree Layout)¶
The standard r0astr interface with collapsible tree-structured panels, inline sliders, and floating visualizers.
- Vertical tree layout with drag-to-reorder
- Collapsible details panels
- Badge-based panel numbering
- Top banner hover trigger for menu access
Glass (Glassmorphism)¶
Modern frosted glass design with translucent panels and backdrop blur.
- Dark purple gradient background
- Frosted glass panels with backdrop blur
- Glowing cyan accents
- Left-edge menu trigger (vertical slide-out)
- Bottom metronome trigger (glass strip)
- Pulsing glow animations on playing panels
Switching Skins¶
- Click CONFIG in the top menu (hover the top banner area to reveal it)
- Navigate to Integrations
- Select a skin from the UI Skin / Theme dropdown
- Click Save
Skins hot-reload automatically — no page refresh needed. Panel state is preserved during the transition.
How Skins Work¶
Loading Sequence¶
- App loads settings from localStorage
- Fetch manifest from
/skins/{skinName}/skin.json - Inject skin's
theme.cssinto document head - Parse HTML templates into rendering functions
- Templates cached in memory for fast rendering
Storage¶
- Browser: localStorage as part of r0astr-settings
- Electron:
userData/r0astr-settings.json
All modes work offline with bundled skins.
Skin Structure¶
A skin is a folder in public/skins/ containing:
your-skin-name/
├── skin.json # Manifest (name, version, templates, cssVariables, hoverTargets)
├── theme.css # Visual styling
└── templates/
├── panel.html # Panel structure
├── slider.html # Labeled slider
└── slider-collapsed.html # Compact slider
Templates use Mustache-style {{variable}} placeholders. For JavaScript functionality to work, templates must include specific CSS classes:
| Class | Purpose |
|---|---|
.panel-tree |
Main container (in index.html) |
.level-panel |
Panel wrapper |
.panel-title |
Editable title |
.code-editor |
CodeMirror mount point |
.btn-playback |
Play/pause button |
.panel-controls-container |
Sliders area |
Technical Details¶
- SkinManager:
src/managers/skinManager.js - Template Compilation: Simple regex-based Mustache engine
- Integration: panelManager and sliderManager use
skinManager.render() - Initialization:
main.jsloads skin before rendering UI
License¶
Skins inherit the project's AGPL-3.0 license unless otherwise specified in skin.json.