Merge _configs/ into config/ for single configuration directory. Update all path references. Changes: - Move _configs/* to config/ - Update .gitignore for new patterns - No code references to _configs/ found Impact: -1 root directory (layout_conventions.md compliance)
7.9 KiB
rust-tui Integration Guide
This document describes how syntaxis-tui integrates with the rust-tui shared library and how other TUI applications can do the same.
Overview
The rust-tui library provides a foundation for building consistent, maintainable terminal user interfaces. syntaxis-tui uses rust-tui components to reduce code duplication and ensure visual consistency across applications.
Integration Components
1. Widgets (AppHeader, AppFooter)
File: src/ui.rs
The application uses rust-tui's pre-built widgets for header and footer rendering:
use rust_tui::prelude::{Theme, AppHeader, AppFooter};
// In render function:
let theme = Theme::default();
let header = AppHeader::new("📋 Lifecycle Manager");
header.render(f, chunks[0], &theme);
let footer = AppFooter::new(help_text);
footer.render(f, chunks[2], &theme);
Benefits:
- Consistent visual style across applications
- Reduced code duplication
- Easy theme switching
2. Theme System
File: src/theme.rs
Wraps rust-tui's Theme with application-specific styling:
use crate::theme::AppTheme;
use rust_tui::Theme;
let base_theme = Theme::default();
let app_theme = AppTheme::new(base_theme);
// Use themed styles:
let header_style = app_theme.header_style();
let selected_style = app_theme.selected_item_style();
let error_style = app_theme.error_style();
Available Themes:
Theme::default()- Professional cyan themeTheme::dark()- Dark modeTheme::light()- Light/inverted colorsTheme::minimal()- High contrast whiteTheme::professional()- Corporate blue
AppTheme Features:
- Phase-specific colors (planning, development, testing, completed, archived)
- Status indicators (success, warning, error, loading)
- Text styling (normal, metadata, dimmed)
- Configurable bold headers and italic metadata
3. Utility Functions
File: src/utils.rs
Re-exports commonly used utilities from rust-tui:
use crate::utils::{
truncate_with_ellipsis,
center_text,
pad_text,
normalize_spaces,
navigate_down,
navigate_up,
clamp_index,
};
// Text formatting
let name = format_project_name("Very Long Name", 20); // Safe truncation
// List navigation (with wrapping)
let next_index = navigate_down(current, list_len); // Wraps to 0 at end
let prev_index = navigate_up(current, list_len); // Wraps to end at 0
Key Utilities:
Text Utilities
truncate_with_ellipsis(text, max_len)- Smart truncation with "…"center_text(text, width)- Center with paddingpad_text(text, width)- Left-pad to widthnormalize_spaces(text)- Replace multiple spaces with singlewrap_text(text, width)- Word-wrap to width
List Utilities
navigate_down(current, len)- Move down with wrappingnavigate_up(current, len)- Move up with wrappingclamp_index(index, len)- Safe index bounds checking
Terminal Utilities
is_terminal_large_enough(w, h)- Check minimum size (40x10)min_recommended_size()- Get recommended size (80x24)
4. Plugin System
File: src/plugins.rs
Provides plugin infrastructure for extending syntaxis-tui:
use crate::plugins::PluginManager;
use rust_tui::plugin::Plugin;
let mut manager = PluginManager::new();
manager.register(Box::new(my_plugin))?;
manager.enable_all()?;
manager.broadcast_event("app_start")?;
Supported Events:
"app_start"- Application started"app_exit"- Application exiting"project_created"- New project created"project_deleted"- Project deleted"screen_changed"- Current screen changed"nav_up"/"nav_down"- Navigation events
Implementation Details
R-STATE-SEPARATION Pattern
All rendering uses immutable references:
pub(crate) fn render(f: &mut Frame<'_>, app: &App) {
// render() takes &App (immutable), never &mut App
// Theme is created here, not in app state
let theme = Theme::default();
// Pass theme to screen renderers
render_projects_screen(f, chunks[1], app, &theme);
}
R-CONSISTENT-THEMING Pattern
Single theme parameter to all rendering functions:
// All widgets receive &Theme or &AppTheme
render_app_header(f, chunks[0], &theme);
render_projects_screen(f, chunks[1], app, &app_theme);
render_app_footer(f, chunks[2], app, &theme);
Theme Integration Points
The application integrates themes at three levels:
- rust-tui Theme - Base color palette
- AppTheme - Application-specific styles (phase colors, status indicators)
- Individual Widgets - Accept theme as parameter for rendering
Integration Checklist
If you're integrating rust-tui into another TUI application:
- Add
rust-tuidependency toCargo.toml - Import
rust_tui::preludein rendering modules - Replace custom header/footer with
AppHeader/AppFooter - Create an
AppThemewrapper for consistent styling - Update screen renderers to accept
&Themeparameter - Replace custom list navigation with
navigate_down()/navigate_up() - Use text utilities for truncation and formatting
- (Optional) Create
PluginManagerfor extensibility - Update tests to use new rendering functions
- Verify all tests pass
Test Coverage
The integration includes comprehensive tests:
- 20 app tests - State mutations, navigation, screen changes
- 13 ui tests - Rendering with various terminal sizes
- 5 theme tests - Theme variants and style generation
- 8 utils tests - Text formatting, list navigation
- 5 plugin tests - Plugin registration and event broadcasting
Total: 50 tests validating the complete integration
Performance Impact
The rust-tui integration has minimal performance impact:
- Rendering: <1ms per frame (same as before)
- Theme application: <0.1ms per render
- Text formatting: Negligible (<1μs per operation)
- Memory: <1KB additional overhead per application
Future Enhancements
Planned improvements to the integration:
-
Dynamic Theme Switching
- Allow themes to be changed at runtime
- Store user preferences
- Support custom theme files (TOML/JSON)
-
Plugin API Expansion
- Custom widget plugins
- Theme customization plugins
- Event filtering/transformation plugins
-
Component Library Growth
- Table widget with sorting
- Form builder
- Dialog system
- Tree view widget
-
Configuration Management
- Application-level theme configuration
- Plugin auto-discovery
- Feature flags per plugin
References
- rust-tui Library:
/crates/rust-tui/ - rust-tui README:
/crates/rust-tui/README.md - rust-tui Architecture:
/crates/rust-tui/ARCHITECTURE.md - rust-tui Plugin System:
/crates/rust-tui/PLUGIN_SYSTEM.md - Ratatui Documentation: https://docs.rs/ratatui/
Troubleshooting
Theme colors not applying
Ensure you're passing the theme to widget render methods:
// ✅ Correct: theme passed to render
render_app_header(f, chunks[0], &theme);
// ❌ Wrong: theme not used
render_app_header(f, chunks[0]); // Won't compile
Widgets not rendering
Verify frame rendering call:
// In main render loop:
terminal.draw(|f| {
render(f, &app); // Must call render with Frame and App
})?;
Navigation wrapping not working
Use rust-tui utilities instead of custom logic:
// ✅ Correct: uses safe wrapping
self.selected = navigate_down(self.selected, items.len());
// ❌ Wrong: may panic if items.len() is 0
self.selected = (self.selected + 1) % items.len();
Contributing
When making changes to the rust-tui integration:
- Ensure all 50 tests pass
- Add tests for new functionality
- Update this guide with new features
- Follow R-* pattern guidelines
- Use
cargo clippyandcargo fmt
Questions?
Refer to:
src/theme.rs- Theme system implementationsrc/utils.rs- Utility functionssrc/plugins.rs- Plugin systemARCHITECTURE.md- Application architecture