- Add complete Project Hub & Workspace Interface implementation - New data models: Project, ModuleKit, Workspace - 3 fixture projects (cybermind.fr, cybermood.eu, secubox-c3) - 4 module kits (Security, Network, Automation, Media) - Workspace routes with project switching and kit installation - 4 workspace tabs: Overview, Module Kits, Devices, Composer - New navigation item: Workspace (7th section) - Remove all glowing effects from UI - Remove Command Center widget glow and backdrop blur - Remove device status indicator glow - Remove toggle button glow effects - Extend DataStore with 13 new methods for workspace management - Add 270+ lines of workspace-specific CSS with responsive layouts - Create workspace templates and result partials 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
80 lines
2.8 KiB
HTML
80 lines
2.8 KiB
HTML
{% extends theme_template %}
|
|
{% block content %}
|
|
<section class="panel">
|
|
<div class="panel-head">
|
|
<div>
|
|
<h2>AppStore & Modules</h2>
|
|
<p>Responsive grid of LuCI apps, SecuBox services, themes, and profiles.</p>
|
|
</div>
|
|
<div class="filter-chips">
|
|
<button
|
|
class="chip {% if not active_tag %}chip-active{% endif %}"
|
|
hx-get="/modules/grid?theme={{ selected_theme }}"
|
|
hx-target="#module-grid"
|
|
hx-swap="outerHTML"
|
|
>All</button>
|
|
{% for tag in available_tags %}
|
|
<button
|
|
class="chip {% if active_tag == tag %}chip-active{% endif %}"
|
|
hx-get="/modules/grid?theme={{ selected_theme }}&tag={{ tag }}"
|
|
hx-target="#module-grid"
|
|
hx-swap="outerHTML"
|
|
>#{{ tag }}</button>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% include "partials/module_grid.html" %}
|
|
</section>
|
|
|
|
<section class="panel preset-panel">
|
|
<div class="panel-head">
|
|
<div>
|
|
<h2>Preset Runner</h2>
|
|
<p>Apply multi-command templates and preview results instantly.</p>
|
|
</div>
|
|
</div>
|
|
<div class="preset-grid">
|
|
{% for preset in presets %}
|
|
<article class="preset-card">
|
|
<header>
|
|
<h3>{{ preset.name }}</h3>
|
|
<p class="muted">Module: {{ preset.module }}</p>
|
|
</header>
|
|
<p>{{ preset.description }}</p>
|
|
<p class="muted">Sequence: {{ preset.command_sequence|join(' → ') }}</p>
|
|
<button class="btn" hx-post="/presets/{{ preset.id }}/run" hx-target="#preset-result" hx-swap="innerHTML">
|
|
Run Preset
|
|
</button>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
<div id="preset-result" class="preset-result muted">
|
|
<p>Select a preset to view the simulated output.</p>
|
|
</div>
|
|
<div class="custom-run">
|
|
<h3>Custom Context Run</h3>
|
|
<p class="muted">Select a preset and pass JSON context (e.g. {"mode": "dry-run"}).</p>
|
|
<form
|
|
hx-post="/presets/run"
|
|
hx-target="#preset-result"
|
|
hx-swap="innerHTML"
|
|
class="custom-run-form"
|
|
>
|
|
<label>
|
|
Preset
|
|
<select name="preset_id">
|
|
{% for preset in presets %}
|
|
<option value="{{ preset.id }}">{{ preset.name }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</label>
|
|
<label>
|
|
Context JSON
|
|
<textarea name="context_json" rows="3" placeholder='{"mode": "dry-run"}'></textarea>
|
|
</label>
|
|
<button type="submit" class="btn">Run with Context</button>
|
|
</form>
|
|
</div>
|
|
</section>
|
|
{% endblock %}
|