From e36dead312471ae4f6b676687075d1b55f3f0330 Mon Sep 17 00:00:00 2001 From: bruno Date: Sun, 12 Jul 2026 11:18:57 -0400 Subject: [PATCH] feat: multi-vues workspace + preview panel (tree/list/details/title/content) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Sélecteur de vue avec 5 modes: Tree, List, Details, Title, Content - Vue List: compacte (Name, Type, Size, Modified) - Vue Details: table complète (Path, Author, Tags) - Vue Title: grille de cartes avec icônes - Vue Content: liste avec aperçu inline - Preview Panel: panneau latéral avec rendu contenu + métadonnées + actions - Animation slide-in/out pour le preview panel - Tri par date (Oldest/Newest) --- CHANGELOG.md | 17 ++ app/main.py | 2 +- app/templates/local_workspace.html | 258 +++++++++++++++++++++++++++-- 3 files changed, 258 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 745a9f2..ae3ca81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog — FlowDeck +## v2.3.0 (2026-07-12) — Multi-Vues Workspace & Preview Panel + +### Added +- **Sélecteur de vue**: 🌳 Tree, 📋 List, 📊 Details, 🏷️ Title, 📝 Content — 5 modes d'affichage +- **Vue List**: liste compacte avec Name, Type, Size, Modified +- **Vue Details**: table complète avec Path, Author, Tags +- **Vue Title**: grille de cartes avec icônes et métadonnées +- **Vue Content**: liste avec aperçu inline (taille ou nombre d'items) +- **Preview Panel**: panneau latéral droit avec contenu du fichier sélectionné + - Header avec icône + titre + bouton fermer + - Métadonnées (type, taille, date) + - Tags affichés en chips + - Corps avec rendu du contenu (blocks JSON → HTML, texte brut) + - Actions: Open, Rename, Delete + - Animation slide-in/out +- **Tri par date**: options Oldest/Newest dans le selecteur de tri + ## v2.2.0 (2026-07-12) — Tags & Recherche Avancée ### Added diff --git a/app/main.py b/app/main.py index 9e81d57..cac919b 100644 --- a/app/main.py +++ b/app/main.py @@ -39,7 +39,7 @@ async def lifespan(_app: FastAPI): app = FastAPI( title="FlowDeck", - version="2.2.0", + version="2.3.0", docs_url="/docs" if settings.log_level == "DEBUG" else None, redoc_url=None, lifespan=lifespan, diff --git a/app/templates/local_workspace.html b/app/templates/local_workspace.html index f50c10b..64932d2 100644 --- a/app/templates/local_workspace.html +++ b/app/templates/local_workspace.html @@ -221,6 +221,55 @@ .ws-table-compact th{text-align:left;padding:6px 10px;color:var(--text-tertiary);font-weight:500;border-bottom:2px solid var(--border);font-size:11px;text-transform:uppercase;} .ws-table-compact td{padding:5px 10px;border-bottom:1px solid var(--border);} .ws-table-compact tr:hover td{background:var(--bg-hover);} + +/* View selector */ +.view-selector{display:flex;gap:2px;background:var(--bg-tertiary);border-radius:8px;padding:2px;} +.view-btn{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:none;border:none;border-radius:6px;cursor:pointer;font-size:14px;color:var(--text-tertiary);transition:all 150ms;} +.view-btn:hover{background:var(--bg-hover);color:var(--text);} +.view-btn.active{background:var(--accent);color:#fff;} + +/* Title grid */ +.title-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:8px;margin-top:8px;} +.title-card{display:flex;flex-direction:column;align-items:center;padding:16px 8px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:10px;cursor:pointer;transition:all 150ms;min-height:100px;justify-content:center;} +.title-card:hover{background:var(--bg-hover);border-color:var(--accent);} +.title-card.selected-card{background:rgba(35,131,226,.1);border-color:var(--accent);} +.title-card-icon{font-size:28px;margin-bottom:8px;} +.title-card-name{font-size:13px;font-weight:500;text-align:center;word-break:break-word;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;} +.title-card-meta{display:flex;gap:8px;margin-top:6px;font-size:11px;color:var(--text-tertiary);} + +/* Content list view */ +.content-list{display:flex;flex-direction:column;gap:4px;margin-top:8px;} +.content-item{padding:10px 12px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:8px;cursor:pointer;transition:all 150ms;} +.content-item:hover{background:var(--bg-hover);border-color:var(--accent);} +.content-item.selected-row{background:rgba(35,131,226,.08);border-color:var(--accent);} +.content-item-header{display:flex;align-items:center;gap:8px;font-size:14px;} +.content-item-preview{font-size:12px;color:var(--text-secondary);margin-top:6px;padding-left:24px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:600px;} +.content-item-tags{display:flex;gap:4px;margin-top:6px;padding-left:24px;} + +/* Selected row highlight */ +.selected-row{background:rgba(35,131,226,.08)!important;} + +/* Preview panel */ +.preview-panel{position:fixed;top:44px;right:0;width:380px;max-width:90vw;height:calc(100vh - 44px);background:var(--bg);border-left:1px solid var(--border-strong);box-shadow:-4px 0 20px rgba(0,0,0,.3);z-index:200;display:flex;flex-direction:column;overflow:hidden;} +@media(max-width:768px){.preview-panel{width:100vw;max-width:100vw;}} +.preview-panel-header{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--border);flex-shrink:0;} +.preview-panel-title{font-size:15px;font-weight:600;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} +.preview-close{background:none;border:none;color:var(--text-tertiary);font-size:20px;cursor:pointer;padding:2px 6px;border-radius:4px;line-height:1;} +.preview-close:hover{color:var(--text);background:var(--bg-hover);} +.preview-panel-meta{display:flex;gap:12px;padding:8px 16px;font-size:12px;color:var(--text-tertiary);border-bottom:1px solid var(--border);flex-shrink:0;} +.preview-panel-tags{display:flex;gap:4px;flex-wrap:wrap;padding:8px 16px;border-bottom:1px solid var(--border);flex-shrink:0;} +.preview-panel-body{flex:1;overflow:auto;padding:16px;font-size:13px;line-height:1.6;color:var(--text);} +.preview-panel-body pre{background:var(--bg-tertiary);border-radius:8px;padding:12px;overflow:auto;font-size:12px;font-family:'Fira Code',monospace;white-space:pre-wrap;word-wrap:break-word;} +.preview-panel-body img{max-width:100%;border-radius:8px;} +.preview-panel-actions{display:flex;gap:8px;padding:12px 16px;border-top:1px solid var(--border);flex-shrink:0;} + +/* Transitions */ +.preview-enter{transition:transform .2s ease,opacity .2s ease;} +.preview-enter-start{transform:translateX(100%);opacity:0;} +.preview-enter-end{transform:translateX(0);opacity:1;} +.preview-leave{transition:transform .15s ease,opacity .15s ease;} +.preview-leave-start{transform:translateX(0);opacity:1;} +.preview-leave-end{transform:translateX(100%);opacity:0;}
- +
+ + + + + +
- - + +
@@ -316,6 +371,7 @@ +
@@ -476,27 +533,106 @@ - - + +
- - + + + + + -
NameTypeSizeNameTypeSizeModified