# luci-theme-secubox Usage Guide
## Quick Start
### 1. Installation
Install the theme package alongside your SecuBox modules:
```bash
opkg update
opkg install luci-theme-secubox
```
### 2. Basic Usage in a LuCI Module
```javascript
'use strict';
'require view';
'require secubox-theme/theme as Theme';
return view.extend({
load: function() {
// Initialize theme system
return Theme.init({
theme: 'dark', // 'dark', 'light', or 'cyberpunk'
language: 'en' // 'en', 'fr', 'de', or 'es'
});
},
render: function(data) {
return E('div', { 'class': 'cyber-container' }, [
// Always include the theme CSS
E('link', {
'rel': 'stylesheet',
'href': L.resource('secubox-theme/secubox-theme.css')
}),
// Create a card using the theme
Theme.createCard({
title: Theme.t('dashboard.title'),
icon: '🚀',
content: E('p', {}, Theme.t('dashboard.welcome', { name: 'SecuBox' }))
})
]);
}
});
```
## Theme Controller API
### Initialization
```javascript
// Initialize with defaults (dark theme, English)
Theme.init();
// Initialize with custom options
Theme.init({
theme: 'cyberpunk',
language: 'fr'
});
```
### Theme Switching
```javascript
// Apply a theme
Theme.apply('dark'); // Dark mode (default)
Theme.apply('light'); // Light mode
Theme.apply('cyberpunk'); // Cyberpunk mode
```
### Translations
```javascript
// Simple translation
var title = Theme.t('dashboard.title');
// Translation with parameters
var welcome = Theme.t('dashboard.welcome', { name: 'John' });
// Output: "Welcome back, John"
// Change language
Theme.setLanguage('fr').then(function() {
console.log(Theme.t('dashboard.title'));
// Output: "Centre de contrôle SecuBox"
});
```
### UI Components
#### Create Card
```javascript
Theme.createCard({
title: 'System Status',
icon: 'âš¡',
content: E('div', {}, 'Card content here'),
badge: Theme.createBadge('Active', 'success'),
hideHeader: false // Optional: hide header
});
```
#### Create Button
```javascript
Theme.createButton({
label: 'Save Changes',
icon: '💾',
variant: 'primary', // 'primary', 'secondary', 'danger', 'ghost'
attrs: {
'click': function() { /* handler */ }
}
});
```
#### Create Badge
```javascript
Theme.createBadge('Online', 'success'); // Green badge
Theme.createBadge('Warning', 'warning'); // Yellow badge
Theme.createBadge('Error', 'danger'); // Red badge
```
## CSS Classes
### Cards
```html
Glass effect card
Success card
Warning card
Danger card
Primary accent card
```
### Buttons
```html
```
### Badges
```html
Default
Success
Warning
Danger
```
## CSS Variables
All colors, spacing, and effects are available as CSS variables:
```css
/* Use in your custom CSS */
.my-component {
background: var(--cyber-bg-primary);
color: var(--cyber-text-primary);
border: var(--cyber-border);
border-radius: var(--cyber-radius-md);
padding: var(--cyber-space-lg);
font-family: var(--cyber-font-body);
transition: all var(--cyber-transition);
}
.my-component:hover {
box-shadow: var(--cyber-shadow);
background: var(--cyber-glass-bg);
backdrop-filter: blur(var(--cyber-glass-blur));
}
```
### Available Variables
**Colors:**
- `--cyber-bg-primary`, `--cyber-bg-secondary`, `--cyber-bg-tertiary`
- `--cyber-text-primary`, `--cyber-text-secondary`, `--cyber-text-muted`
- `--cyber-accent-primary`, `--cyber-accent-secondary`
- `--cyber-success`, `--cyber-warning`, `--cyber-danger`, `--cyber-info`
**Typography:**
- `--cyber-font-display` (Orbitron)
- `--cyber-font-body` (Inter)
- `--cyber-font-mono` (JetBrains Mono)
- `--cyber-text-xs` through `--cyber-text-4xl`
**Spacing:**
- `--cyber-space-xs` through `--cyber-space-2xl`
**Effects:**
- `--cyber-shadow`, `--cyber-shadow-soft`
- `--cyber-glass-bg`, `--cyber-glass-blur`, `--cyber-glass-shadow`
- `--cyber-radius-xs` through `--cyber-radius-lg`
- `--cyber-transition`, `--cyber-transition-fast`, `--cyber-transition-bounce`
**Gradients:**
- `--cyber-gradient-primary`, `--cyber-gradient-cyber`
- `--cyber-gradient-steel`, `--cyber-gradient-chrome`
## Complete Example
```javascript
'use strict';
'require view';
'require secubox-theme/theme as Theme';
'require rpc';
var callStatus = rpc.declare({
object: 'luci.mymodule',
method: 'status',
expect: {}
});
return view.extend({
load: function() {
return Promise.all([
Theme.init({ theme: 'dark', language: 'en' }),
callStatus()
]);
},
render: function(data) {
var status = data[1] || {};
return E('div', { 'class': 'cyber-container' }, [
E('link', {
'rel': 'stylesheet',
'href': L.resource('secubox-theme/secubox-theme.css')
}),
E('div', { 'class': 'cyber-grid cyber-grid--3' }, [
Theme.createCard({
title: Theme.t('dashboard.system_health'),
icon: '💚',
content: E('div', {}, [
E('p', {}, Theme.t('common.status') + ': '),
Theme.createBadge(
status.running ? Theme.t('common.active') : Theme.t('common.inactive'),
status.running ? 'success' : 'danger'
)
])
}),
Theme.createCard({
title: Theme.t('dashboard.quick_actions'),
icon: 'âš¡',
content: E('div', { 'style': 'display: flex; gap: 0.5rem;' }, [
Theme.createButton({
label: Theme.t('common.apply'),
variant: 'primary',
attrs: { 'click': this.handleApply.bind(this) }
}),
Theme.createButton({
label: Theme.t('common.reset'),
variant: 'secondary',
attrs: { 'click': this.handleReset.bind(this) }
})
])
})
])
]);
},
handleApply: function() {
console.log('Apply clicked');
},
handleReset: function() {
console.log('Reset clicked');
}
});
```
## Translation Keys
All available translation keys (en, fr, de, es):
- `common.*` - Common UI strings (loading, error, success, save, cancel, etc.)
- `dashboard.*` - Dashboard-specific strings
- `modules.*` - Module management strings
- `settings.*` - Settings page strings
- `errors.*` - Error messages
## Browser Support
- Chrome 90+
- Firefox 88+
- Safari 14+
- Edge 90+
## Performance
- Main CSS bundle: ~15KB uncompressed
- Minified version: ~8KB
- All translations: ~2KB total
- Theme JS controller: ~3KB
## See Also
- [DOCS/GLOBAL_THEME_SYSTEM.md](../../DOCS/GLOBAL_THEME_SYSTEM.md) - Complete design system documentation
- [.claude/THEME_CONTEXT.md](../../.claude/THEME_CONTEXT.md) - Quick reference for developers