From cbfb20505d833088d2c9171eee8536b286b7cdec Mon Sep 17 00:00:00 2001 From: enzo Date: Sat, 21 Mar 2026 19:09:58 +0100 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20Service=20Worker=20WS,=20mode?= =?UTF-8?q?=20=C3=A9dition=20dashboard,=20sidebar=20click-to-toggle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WebSocket via Service Worker (ws.sw.js) : connexions persistantes entre navigations Swup, reconnexion exponentielle, protocole WS_SUBSCRIBE/WS_UNSUBSCRIBE/WS_SEND - WsProxy dans app.js : abstraction SW + fallback WebSocket direct - proxmoxPage migré vers WsProxy (identique au dashboardPage) - Dashboard : mode édition toggle — DnD, resize (x1/x2), masquer/afficher widget uniquement actifs en mode édition ; preview drag (is-dragging/drag-over) - Sidebar : suppression bouton hamburger, clic sur sidebar-header pour replier - pages.css : targets-grid 350px, styles edit mode, widget-size-2, drag preview - neu.css : sidebar-header cursor pointer, suppression .sidebar-toggle Co-Authored-By: Claude Sonnet 4.6 --- frontend/css/neu.css | 6 +- frontend/css/pages.css | 54 +++++++++- frontend/dashboard.html | 82 ++++++++------ frontend/js/app.js | 229 ++++++++++++++++++++++++++++------------ frontend/js/ws.sw.js | 86 +++++++++++++++ frontend/modules.html | 5 +- frontend/profile.html | 5 +- frontend/proxmox.html | 5 +- frontend/settings.html | 5 +- frontend/terminal.html | 5 +- frontend/updates.html | 5 +- 11 files changed, 359 insertions(+), 128 deletions(-) create mode 100644 frontend/js/ws.sw.js diff --git a/frontend/css/neu.css b/frontend/css/neu.css index d5c044f..c4e950a 100644 --- a/frontend/css/neu.css +++ b/frontend/css/neu.css @@ -431,6 +431,8 @@ input, select, textarea { font-family: inherit; font-size: inherit; } border-bottom: 1px solid var(--neu-border); min-height: var(--navbar-height); flex-shrink: 0; + cursor: pointer; + user-select: none; } .sidebar-logo { @@ -447,10 +449,6 @@ input, select, textarea { font-family: inherit; font-size: inherit; } color: var(--neu-text); } -.sidebar-toggle { - margin-left: auto; - flex-shrink: 0; -} .sidebar-nav { flex: 1; diff --git a/frontend/css/pages.css b/frontend/css/pages.css index 971b739..48b706d 100644 --- a/frontend/css/pages.css +++ b/frontend/css/pages.css @@ -196,7 +196,7 @@ .total-badge { font-size: .875rem; font-weight: 600; color: var(--neu-primary); } .targets-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); gap: 1rem; } .target-card { padding: 1rem; display: flex; flex-direction: column; gap: .75rem; } @@ -548,6 +548,58 @@ gap: .375rem; } +/* Widget edit mode */ +.widget-size-2 { grid-column: span 2; } +@media (max-width: 720px) { .widget-size-2 { grid-column: span 1; } } + +.widget.is-dragging { opacity: 0.35; transform: scale(.97); } +.widget.drag-over { outline: 2px dashed var(--neu-primary); transform: scale(1.02); } + +.widget-edit-bar { + display: flex; + align-items: center; + gap: .375rem; + padding: .25rem 0 .75rem; + border-bottom: 1px solid var(--neu-border); + margin-bottom: .75rem; +} +.widget-edit-bar-title { flex: 1; font-size: .75rem; font-weight: 600; color: var(--neu-text-muted); text-transform: uppercase; } + +.edit-mode-banner { + display: flex; + align-items: center; + gap: .75rem; + padding: .625rem 1rem; + border-radius: var(--neu-radius-sm); + background: rgba(108, 142, 244, 0.1); + border: 1px solid var(--neu-primary); + margin-bottom: 1.25rem; + font-size: .875rem; + color: var(--neu-primary); +} +.edit-mode-banner i { font-size: 1.1rem; } + +.widget-add-grid { + display: flex; + flex-wrap: wrap; + gap: .75rem; + margin-top: 1.5rem; +} +.widget-add-btn { + display: flex; + align-items: center; + gap: .5rem; + padding: .5rem 1rem; + border-radius: var(--neu-radius-sm); + border: 1px dashed var(--neu-border); + background: transparent; + color: var(--neu-text-muted); + cursor: pointer; + font-size: .875rem; + transition: all .15s; +} +.widget-add-btn:hover { border-color: var(--neu-primary); color: var(--neu-primary); } + /* ── Profil / préférences ────────────────────────────────────────────────────── */ .settings-section { margin-bottom: 1.25rem; diff --git a/frontend/dashboard.html b/frontend/dashboard.html index 8944742..e6d4a8d 100644 --- a/frontend/dashboard.html +++ b/frontend/dashboard.html @@ -18,12 +18,9 @@