feat: pastilles tags colorées dans toutes les vues + ajustements hauteur
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped

- Tags affichés avec pastille de couleur (tag-dot 6px) dans TOUTES les vues:
  tree (renderChildren), table filtrée, details, cards, content, preview panel
- Barre de filtres tags: pastille couleur + nom + compteur
- CSS .tag-dot: cercle 6px avec background dynamique
- Hauteur réduite: breadcrumb-row padding 3px, toolbar-row padding 3px
  margin-bottom 4px, flèches nav 24px au lieu de 28px
- Bouton show sidebar (uncollapse): top 60px au lieu de 12px →
  ne chevauche plus la breadcrumb/toolbar
This commit is contained in:
2026-07-12 16:59:06 -04:00
parent ed0510ec9b
commit 6db8eba670
2 changed files with 29 additions and 15 deletions
+28 -14
View File
@@ -185,9 +185,10 @@
.file-preview-body{padding:10px 12px;margin:0;font-size:12px;line-height:1.5;color:var(--text,#ddd);max-height:200px;overflow:auto;font-family:'Fira Code','Cascadia Code',monospace;white-space:pre-wrap;word-wrap:break-word;background:#141414;}
/* Tag chips */
.tag-chip{display:inline-flex;align-items:center;gap:3px;padding:1px 7px;background:rgba(120,119,116,.15);border-radius:10px;font-size:11px;color:var(--text-secondary);white-space:nowrap;margin:1px 2px;transition:all 150ms;}
.tag-chip{display:inline-flex;align-items:center;gap:4px;padding:1px 7px 1px 4px;background:rgba(120,119,116,.15);border-radius:10px;font-size:11px;color:var(--text-secondary);white-space:nowrap;margin:1px 2px;transition:all 150ms;}
.tag-chip:hover{background:rgba(120,119,116,.25);}
.tag-chip.rm-btn{background:none;border:none;color:var(--text-tertiary);cursor:pointer;font-size:13px;line-height:1;padding:0 2px;border-radius:50%;}
.tag-chip .tag-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;}
.tag-chip.rm-btn{background:none;border:none;color:var(--text-tertiary);cursor:pointer;font-size:13px;line-height:1;padding:0 2px;border-radius:50%;margin-left:2px;}
.tag-chip.rm-btn:hover{color:var(--danger);background:rgba(255,80,80,.15);}
.tag-chip.active{background:var(--accent);color:#fff;}
.tag-add-btn{display:inline-flex;align-items:center;gap:3px;padding:1px 7px;background:none;border:1px dashed var(--border);border-radius:10px;font-size:11px;color:var(--text-tertiary);cursor:pointer;white-space:nowrap;transition:all 150ms;}
@@ -223,9 +224,9 @@
@media(max-width:768px){.ws-split{flex-direction:column;padding:20px 12px 0;}.preview-panel{width:100%;max-width:100%;min-width:100%;}.ws-main{width:100%;}}
/* Breadcrumb row */
.breadcrumb-row{display:flex;align-items:center;gap:6px;padding:6px 8px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:10px 10px 0 0;margin-bottom:0;flex-wrap:wrap;}
/* Toolbar row */
.toolbar-row{display:flex;align-items:center;gap:6px;padding:4px 8px;background:var(--bg-secondary);border:1px solid var(--border);border-top:none;border-radius:0 0 10px 10px;margin-bottom:8px;flex-wrap:wrap;}
.breadcrumb-row{display:flex;align-items:center;gap:6px;padding:3px 8px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:10px 10px 0 0;margin-bottom:0;flex-wrap:wrap;}
.breadcrumb-row .nav-arrow{width:24px;height:24px;padding:0;font-size:14px;}
.toolbar-row{display:flex;align-items:center;gap:6px;padding:3px 8px;background:var(--bg-secondary);border:1px solid var(--border);border-top:none;border-radius:0 0 10px 10px;margin-bottom:4px;flex-wrap:wrap;}
.nav-arrow{width:28px;height:28px;font-size:13px;flex-shrink:0;}
.unified-breadcrumb{flex:1;display:flex;align-items:center;gap:2px;min-width:0;font-size:13px;overflow:hidden;}
.unified-breadcrumb .bc-icon{font-size:15px;flex-shrink:0;}
@@ -542,6 +543,7 @@
<template x-for="t in workspaceTags" :key="'tf'+t.id">
<button class="tag-chip" :class="{ active: tagFilter === t.name }"
@click="toggleTagFilter(t.name)">
<span class="tag-dot" :style="{background: t.color}"></span>
<span x-text="t.name"></span>
<span style="font-size:10px;opacity:.7" x-text="'('+t.count+')'"></span>
</button>
@@ -579,6 +581,7 @@
<span style="display:flex;align-items:center;gap:2px;flex-wrap:wrap;">
<template x-for="t in (node.tags||[])" :key="'ftag'+t.id">
<span class="tag-chip">
<span class="tag-dot" :style="{background: t.color}"></span>
<span x-text="t.name"></span>
<button class="tag-chip rm-btn" @click.stop="removeTag(node.id, t.id)" title="Remove tag">×</button>
</span>
@@ -651,7 +654,7 @@
<td class="col-tags">
<span style="display:flex;align-items:center;gap:2px;flex-wrap:wrap;">
<template x-for="t in (node.tags||[])" :key="'dtag'+t.id">
<span class="tag-chip"><span x-text="t.name"></span></span>
<span class="tag-chip"><span class="tag-dot" :style="{background: t.color}"></span><span x-text="t.name"></span></span>
</template>
</span>
</td>
@@ -688,13 +691,13 @@
<div class="content-item-preview" x-text="node.is_folder ? (node.child_count||0)+' items' : (node.size_display||'—')"></div>
<div class="content-item-tags" x-show="(node.tags||[]).length > 0">
<template x-for="t in (node.tags||[])" :key="'ctag'+t.id">
<span class="tag-chip"><span x-text="t.name"></span></span>
</template>
</div>
</div>
</template>
</div>
<span class="tag-chip"><span class="tag-dot" :style="{background: t.color}"></span><span x-text="t.name"></span></span>
</template>
</div>
</template>
</div>
</div>
</div>
<!-- Old table view kept for backward compat, hidden -->
<table class="ws-table" x-show="false" style="display:none">
<thead><tr><th>Name</th><th>Type</th><th>Size</th></tr></thead>
@@ -848,7 +851,7 @@
</div>
<div class="preview-panel-tags" x-show="(previewItem.tags||[]).length > 0">
<template x-for="t in (previewItem.tags||[])" :key="'ptag'+t.id">
<span class="tag-chip"><span x-text="t.name"></span></span>
<span class="tag-chip"><span class="tag-dot" :style="{background: t.color}"></span><span x-text="t.name"></span></span>
</template>
</div>
<div class="preview-panel-body" x-html="previewPanelContent || '<div style=text-align:center;padding:40px;color:var(--text-tertiary)>Loading preview...</div>'"></div>
@@ -1406,6 +1409,17 @@ document.addEventListener('alpine:init', function() {
}
html += '<button class="ws-act" data-ws-action="rename" data-ws-id="'+c.id+'" data-ws-name="'+escName+'">✏️</button>';
html += '<button class="ws-act danger" data-ws-action="delete" data-ws-id="'+c.id+'" data-ws-name="'+escName+'">🗑</button>';
// Tags
if (c.tags && c.tags.length > 0) {
html += '<span style="display:flex;gap:2px;margin-left:4px;">';
for (var ti=0; ti<c.tags.length; ti++) {
var t = c.tags[ti];
var tc = this.esc(t.color||'#787774');
var tn = this.esc(t.name);
html += '<span class="tag-chip" style="padding-left:4px;"><span class="tag-dot" style="background:'+tc+'"></span>'+tn+'</span>';
}
html += '</span>';
}
html += '</div></div>';
if (hasKids) {
html += '<ul class="ws-tree" style="display:none">'+this.renderChildren(c.children, depth+1)+'</ul>';