Rustelo/examples/plugin-example-theme/README.md
Jesús Pérez 642998ba35
chore: update
2026-07-18 20:15:23 +01:00

319 lines
9.1 KiB
Markdown

# Example Analytics Theme Plugin
A complete, production-ready example plugin for the Rustelo website framework demonstrating Level 5 (Compile-Time) plugin architecture.
## 🎯 Purpose
This plugin serves as a reference implementation showing how to:
1. **Create a plugin crate** with proper structure and dependencies
2. **Implement ResourceContributor** trait for providing themes and translations
3. **Embed configuration** using `include_str!()` macros
4. **Write comprehensive tests** for plugin functionality
5. **Document thoroughly** with examples and usage instructions
6. **Follow best practices** for Rust plugin development
## 📦 What This Plugin Provides
### Themes
- **analytics-dashboard** - A professional theme optimized for analytics dashboards
- High-contrast color scheme for readability
- Professional color palette (blues, teals, ambers)
- Comprehensive spacing and typography rules
- Responsive breakpoints and animation definitions
### Translations
- **English (en)** - Complete English UI strings
- Dashboard labels and metrics
- Chart titles and legends
- Action button labels
- Status messages and tooltips
- **Spanish (es)** - Complete Spanish translations
- Full parity with English strings
- Localized terminology for analytics
## 🚀 Quick Start
### 1. Add to Your Project
In your main Rustelo project's `Cargo.toml`:
```toml
[dependencies]
plugin-example-theme = { path = "./crates/plugin-example-theme" }
```
### 2. Register the Plugin
In your server-side resources initialization (`src/resources.rs`):
```rust
use plugin_example_theme::ExampleThemeContributor;
pub fn initialize() -> Result<(), Box<dyn std::error::Error>> {
// Register your own resources
rustelo_core_lib::register_contributor(&WebsiteResourceContributor)?;
// Register the example plugin
rustelo_core_lib::register_contributor(&ExampleThemeContributor)?;
// Load all resources from configuration
rustelo_core_lib::load_resources_from_config()?;
Ok(())
}
```
### 3. Use the Plugin's Theme
In your application's CSS/styling configuration, reference the `analytics-dashboard` theme:
```css
/* Your CSS can now use the theme variables */
:root {
--color-primary: #2563EB;
--color-secondary: #14B8A6;
--color-accent: #F59E0B;
/* ... etc ... */
}
```
## 📁 Project Structure
```
plugin-example-theme/
├── Cargo.toml # Plugin manifest
├── README.md # This file
├── src/
│ ├── lib.rs # Public API and initialization
│ └── resources.rs # ResourceContributor implementation
├── config/
│ ├── themes/
│ │ └── analytics-dashboard.toml # Theme configuration
│ └── i18n/
│ ├── en.ftl # English translations
│ └── es.ftl # Spanish translations
└── examples/
└── integration_test.rs # Integration test example
```
## 🧪 Testing
### Run All Tests
```bash
cd crates/plugin-example-theme
cargo test
```
### Expected Output
```
running 10 tests
test resources::test_contributor_is_clone_and_copy ... ok
test resources::test_contributor_name ... ok
test resources::test_fluent_files_are_not_empty ... ok
test resources::test_fluent_files_are_provided ... ok
test resources::test_menus_and_footers_are_empty ... ok
test resources::test_theme_content_is_not_empty ... ok
test resources::test_theme_is_provided ... ok
test resources::test_theme_is_valid_toml ... ok
test tests::test_plugin_can_be_initialized ... ok
test tests::test_plugin_exports_public_api ... ok
test result: ok. 10 passed; 0 failed; 0 ignored
```
### Test Coverage
The plugin includes tests for:
- ✅ Contributor name and identity
- ✅ Theme availability and content
- ✅ TOML syntax validation
- ✅ Translation files (fluent) availability
- ✅ Empty menus/footers (correctly not provided)
- ✅ Copy/Clone trait implementation
- ✅ Plugin initialization
- ✅ Public API exports
## 🎨 Theme Details
### Color Palette
| Purpose | Color | Hex |
|---------|-------|-----|
| Primary | Blue | `#2563EB` |
| Secondary | Teal | `#14B8A6` |
| Accent | Amber | `#F59E0B` |
| Success | Green | `#10B981` |
| Warning | Amber | `#FBBF24` |
| Error | Red | `#EF4444` |
| Info | Blue | `#3B82F6` |
### Typography
- **Heading Font:** Inter, system-ui, sans-serif
- **Body Font:** Inter, system-ui, sans-serif
- **Monospace Font:** JetBrains Mono, Monaco, monospace
- **Scale Factor:** 1.125 (12.5% increase per step)
### Responsive Breakpoints
- Mobile: 320px
- Tablet: 768px
- Desktop: 1024px
- Wide: 1280px
- Ultra-wide: 1536px
### Spacing System
- Base unit: 8px
- Step multiplier: 1.5x
- Increments: 8px, 12px, 18px, 27px, ...
## 📝 Implementation Details
### How It Works
1. **Compile Time:** During `cargo build`, this plugin is compiled into your application
2. **Static Embedding:** Theme and i18n files are embedded via `include_str!()` macros
3. **Initialization:** When the application starts, the plugin is registered via `initialize()`
4. **Resource Loading:** The framework loads the embedded resources into memory
5. **Runtime:** The framework makes resources available to components via registries
### Why This Design?
-**No Conditional Compilation:** Framework doesn't know about plugins
-**Self-Contained:** Plugin is a complete, standalone crate
-**Type Safe:** Rust compiler validates all resource references
-**Performance:** Zero runtime overhead (fully inlined at compile time)
-**Maintainable:** Clean separation between plugin and framework
-**Scalable:** Add unlimited plugins without increasing complexity
## 🔧 Customizing This Plugin
### Modify the Theme
1. Edit `config/themes/analytics-dashboard.toml`
2. Change colors, fonts, spacing, or animations
3. Rebuild: `cargo build`
### Add Translations
1. Edit or create files in `config/i18n/`
2. Use ISO 639-1 language codes (e.g., `fr.ftl` for French)
3. Update `src/resources.rs` to include new files
4. Rebuild: `cargo build`
### Extend with More Resources
To add menus or footers:
```rust
fn menus(&self) -> HashMap<String, String> {
let mut menus = HashMap::new();
let menu_content = include_str!("../config/menus/my-menu.toml");
menus.insert("my-menu".to_string(), menu_content.to_string());
menus
}
```
## 📚 Learning Resources
### For Plugin Developers
- **PHASE3-PLUGIN-DEVELOPMENT-GUIDE.md** - Comprehensive guide to plugin development
- **PHASE1-COMPLETE.md** - Architecture foundation documentation
- **PHASE2-IMPLEMENTATION-SUMMARY.md** - Build-time code generation details
### For Framework Users
- **RUST_CODE_STYLE.md** - Rust coding standards for Rustelo
- **Framework API Docs** - ResourceContributor trait documentation
## 🎓 Architecture Level
This plugin implements **Level 5 (Compile-Time Plugins)** of the Rustelo plugin architecture:
```
Level 5: Compile-Time Plugins
├─ Trait-based registration
├─ Static code generation at build time
├─ No conditional compilation
├─ Plugin crate is self-contained
└─ Registration at application startup
```
**Future Evolution to Level 8:** The same trait interfaces can support runtime plugin loading without breaking changes.
## ✅ Quality Checklist
- ✅ Implements `ResourceContributor` trait
- ✅ Has comprehensive documentation with examples
- ✅ Includes 10+ unit tests (100% trait method coverage)
- ✅ Configuration files are valid TOML/FTL
- ✅ No hardcoded paths (uses `include_str!()`)
- ✅ No unsafe code
- ✅ No unwrap() or expect() in production code
- ✅ Cargo.toml has clear version and dependencies
- ✅ README explains purpose and usage
- ✅ Examples show typical integration
- ✅ Error handling is robust
- ✅ Performance optimized (no unnecessary allocations)
## 🤝 Contributing
To extend this example plugin:
1. Create a feature branch: `git checkout -b feature/your-feature`
2. Make changes following RUST_CODE_STYLE.md
3. Add tests for new functionality
4. Ensure all tests pass: `cargo test --all`
5. Submit pull request with clear description
## 📄 License
This example plugin is provided as part of the Rustelo framework and follows the same license terms.
## 🆘 Troubleshooting
### Plugin doesn't load
**Check:**
1. Is the plugin added to Cargo.toml?
2. Is `initialize()` called in your resources module?
3. Are there any compilation errors?
### Translations not showing
**Check:**
1. Are language codes correct (en, es, etc)?
2. Are FTL files valid Fluent syntax?
3. Is the framework loading translations?
### Theme colors not applying
**Check:**
1. Is the theme registered: `analytics-dashboard` in registry?
2. Are CSS variables using correct names?
3. Are there conflicting theme registrations?
## 📞 Support
For questions or issues with this plugin:
1. Check **PHASE3-PLUGIN-DEVELOPMENT-GUIDE.md** for comprehensive documentation
2. Review the source code comments in `src/`
3. Run tests to verify functionality
4. Check framework documentation for trait specifications
---
**Created:** 2024-11-02
**Status:** Production Ready
**Version:** 0.1.0
**Compatibility:** Rustelo Level 5+