Major structural reorganization and feature additions: ## Folder Reorganization - Move 17 luci-app-* packages to package/secubox/ (except luci-app-secubox core hub) - Update all tooling to support new structure: - secubox-tools/quick-deploy.sh: search both locations - secubox-tools/validate-modules.sh: validate both directories - secubox-tools/fix-permissions.sh: fix permissions in both locations - .github/workflows/test-validate.yml: build from both paths - Update README.md links to new package/secubox/ paths ## AppStore Migration (Complete) - Add catalog entries for all remaining luci-app packages: - network-tweaks.json: Network optimization tools - secubox-bonus.json: Documentation & demos hub - Total: 24 apps in AppStore catalog (22 existing + 2 new) - New category: 'documentation' for docs/demos/tutorials ## VHost Manager v2.0 Enhancements - Add profile activation system for Internal Services and Redirects - Implement createVHost() API wrapper for template-based deployment - Fix Virtual Hosts view rendering with proper LuCI patterns - Fix RPCD backend shell script errors (remove invalid local declarations) - Extend backend validation for nginx return directives (redirect support) - Add section_id parameter for named VHost profiles - Add Remove button to Redirects page for feature parity - Update README to v2.0 with comprehensive feature documentation ## Network Tweaks Dashboard - Close button added to component details modal Files changed: 340+ (336 renames with preserved git history) Packages affected: 19 luci-app, 2 secubox-app, 1 theme, 4 tools 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
366 lines
5.3 KiB
CSS
366 lines
5.3 KiB
CSS
/* Traffic Shaper Dashboard Styles * Version: 0.3.0
|
|
*/
|
|
|
|
.traffic-shaper-dashboard {
|
|
padding: 1em;
|
|
}
|
|
|
|
/* Status Cards * Version: 0.3.0
|
|
*/
|
|
.ts-status-cards {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
gap: 1em;
|
|
margin-bottom: 2em;
|
|
}
|
|
|
|
.ts-status-card {
|
|
background: #fff;
|
|
border: 1px solid #ddd;
|
|
border-radius: 4px;
|
|
padding: 1em;
|
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
}
|
|
|
|
.ts-status-card h3 {
|
|
margin: 0 0 0.5em 0;
|
|
font-size: 1.1em;
|
|
color: #333;
|
|
}
|
|
|
|
.ts-status-value {
|
|
font-size: 2em;
|
|
font-weight: bold;
|
|
color: #0088cc;
|
|
}
|
|
|
|
.ts-status-label {
|
|
font-size: 0.9em;
|
|
color: #666;
|
|
}
|
|
|
|
/* Traffic Class Diagram */
|
|
.ts-class-diagram {
|
|
background: #f9f9f9;
|
|
border: 1px solid #ddd;
|
|
border-radius: 4px;
|
|
padding: 1.5em;
|
|
margin-bottom: 2em;
|
|
}
|
|
|
|
.ts-class-flow {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 1em;
|
|
}
|
|
|
|
.ts-class-item {
|
|
background: #fff;
|
|
border: 2px solid #ddd;
|
|
border-radius: 4px;
|
|
padding: 1em;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
transition: all 0.3s;
|
|
}
|
|
|
|
.ts-class-item:hover {
|
|
border-color: #0088cc;
|
|
box-shadow: 0 2px 8px rgba(0,136,204,0.2);
|
|
}
|
|
|
|
.ts-class-info {
|
|
flex: 1;
|
|
}
|
|
|
|
.ts-class-name {
|
|
font-weight: bold;
|
|
font-size: 1.1em;
|
|
margin-bottom: 0.3em;
|
|
}
|
|
|
|
.ts-class-details {
|
|
font-size: 0.9em;
|
|
color: #666;
|
|
}
|
|
|
|
.ts-class-metrics {
|
|
display: flex;
|
|
gap: 1.5em;
|
|
text-align: right;
|
|
}
|
|
|
|
.ts-metric {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.ts-metric-value {
|
|
font-size: 1.2em;
|
|
font-weight: bold;
|
|
color: #0088cc;
|
|
}
|
|
|
|
.ts-metric-label {
|
|
font-size: 0.8em;
|
|
color: #999;
|
|
}
|
|
|
|
/* Priority Indicators */
|
|
.high-priority {
|
|
border-left: 4px solid #dc3545;
|
|
}
|
|
|
|
.medium-priority {
|
|
border-left: 4px solid #fd7e14;
|
|
}
|
|
|
|
.normal-priority {
|
|
border-left: 4px solid #28a745;
|
|
}
|
|
|
|
.low-priority {
|
|
border-left: 4px solid #6c757d;
|
|
}
|
|
|
|
/* Tables */
|
|
.ts-table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
background: #fff;
|
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
}
|
|
|
|
.ts-table th {
|
|
background: #f8f9fa;
|
|
padding: 0.75em;
|
|
text-align: left;
|
|
border-bottom: 2px solid #dee2e6;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.ts-table td {
|
|
padding: 0.75em;
|
|
border-bottom: 1px solid #dee2e6;
|
|
}
|
|
|
|
.ts-table tr:hover {
|
|
background: #f8f9fa;
|
|
}
|
|
|
|
/* Action Buttons */
|
|
.ts-action-buttons {
|
|
display: flex;
|
|
gap: 0.5em;
|
|
}
|
|
|
|
.ts-btn {
|
|
padding: 0.4em 0.8em;
|
|
border: none;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
font-size: 0.9em;
|
|
transition: all 0.2s;
|
|
}
|
|
|
|
.ts-btn-primary {
|
|
background: #0088cc;
|
|
color: white;
|
|
}
|
|
|
|
.ts-btn-primary:hover {
|
|
background: #006699;
|
|
}
|
|
|
|
.ts-btn-success {
|
|
background: #28a745;
|
|
color: white;
|
|
}
|
|
|
|
.ts-btn-success:hover {
|
|
background: #218838;
|
|
}
|
|
|
|
.ts-btn-danger {
|
|
background: #dc3545;
|
|
color: white;
|
|
}
|
|
|
|
.ts-btn-danger:hover {
|
|
background: #c82333;
|
|
}
|
|
|
|
.ts-btn-warning {
|
|
background: #ffc107;
|
|
color: #212529;
|
|
}
|
|
|
|
.ts-btn-warning:hover {
|
|
background: #e0a800;
|
|
}
|
|
|
|
/* Preset Cards */
|
|
.ts-preset-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
gap: 1.5em;
|
|
margin-top: 1em;
|
|
}
|
|
|
|
.ts-preset-card {
|
|
background: #fff;
|
|
border: 2px solid #ddd;
|
|
border-radius: 8px;
|
|
padding: 1.5em;
|
|
cursor: pointer;
|
|
transition: all 0.3s;
|
|
}
|
|
|
|
.ts-preset-card:hover {
|
|
border-color: #0088cc;
|
|
box-shadow: 0 4px 12px rgba(0,136,204,0.2);
|
|
transform: translateY(-2px);
|
|
}
|
|
|
|
.ts-preset-title {
|
|
font-size: 1.3em;
|
|
font-weight: bold;
|
|
margin-bottom: 0.5em;
|
|
color: #333;
|
|
}
|
|
|
|
.ts-preset-description {
|
|
color: #666;
|
|
margin-bottom: 1em;
|
|
font-size: 0.95em;
|
|
}
|
|
|
|
.ts-preset-apply {
|
|
text-align: right;
|
|
}
|
|
|
|
/* Stats View */
|
|
.ts-stats-container {
|
|
background: #fff;
|
|
border-radius: 4px;
|
|
padding: 1.5em;
|
|
margin-bottom: 1.5em;
|
|
}
|
|
|
|
.ts-stats-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 1em;
|
|
padding-bottom: 0.5em;
|
|
border-bottom: 2px solid #eee;
|
|
}
|
|
|
|
.ts-stats-refresh {
|
|
padding: 0.5em 1em;
|
|
background: #0088cc;
|
|
color: white;
|
|
border: none;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.ts-stats-refresh:hover {
|
|
background: #006699;
|
|
}
|
|
|
|
/* Traffic Flow Animation */
|
|
@keyframes flowAnimation {
|
|
0% { transform: translateX(-100%); }
|
|
100% { transform: translateX(100%); }
|
|
}
|
|
|
|
.ts-class-item.active::after {
|
|
content: '';
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background: linear-gradient(90deg, transparent, rgba(0,136,204,0.1), transparent);
|
|
animation: flowAnimation 2s infinite;
|
|
}
|
|
|
|
/* Responsive */
|
|
@media (max-width: 768px) {
|
|
.ts-status-cards {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.ts-class-metrics {
|
|
flex-direction: column;
|
|
gap: 0.5em;
|
|
}
|
|
|
|
.ts-preset-grid {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
}
|
|
|
|
/* Form Styles */
|
|
.ts-form-group {
|
|
margin-bottom: 1em;
|
|
}
|
|
|
|
.ts-form-label {
|
|
display: block;
|
|
margin-bottom: 0.3em;
|
|
font-weight: 600;
|
|
color: #333;
|
|
}
|
|
|
|
.ts-form-input {
|
|
width: 100%;
|
|
padding: 0.5em;
|
|
border: 1px solid #ddd;
|
|
border-radius: 4px;
|
|
font-size: 1em;
|
|
}
|
|
|
|
.ts-form-input:focus {
|
|
outline: none;
|
|
border-color: #0088cc;
|
|
box-shadow: 0 0 0 3px rgba(0,136,204,0.1);
|
|
}
|
|
|
|
.ts-form-help {
|
|
font-size: 0.85em;
|
|
color: #666;
|
|
margin-top: 0.3em;
|
|
}
|
|
|
|
/* Status Indicators */
|
|
.ts-status-active {
|
|
color: #28a745;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.ts-status-inactive {
|
|
color: #dc3545;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.ts-status-badge {
|
|
display: inline-block;
|
|
padding: 0.25em 0.6em;
|
|
border-radius: 12px;
|
|
font-size: 0.85em;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.ts-status-badge.active {
|
|
background: #d4edda;
|
|
color: #155724;
|
|
}
|
|
|
|
.ts-status-badge.inactive {
|
|
background: #f8d7da;
|
|
color: #721c24;
|
|
}
|