feat: finalisation éditeur Forge + mode hors-ligne PWA + consolidation roadmap
CI / lint (push) Failing after 7s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / security (push) Failing after -7s

- Forge: Tab indent, Ctrl+K, auto-focus, AI status, messages erreur FR
- Forge: slash commands clean, cache-bust iframe, preview serveur
- Forge: iframe 82vh, hauteur auto, table inline, sélecteur langage
- PWA hors-ligne: IndexedDB (offline-db.js + offline.js)
- Mermaid: thème dark complet, highlight.js preview
- Backend: màj CSP, rename chain, bookmarks/history/shares
- Roadmap: consolidation dans docs/ROADMAP.md (75 items)
- Infra: docker-compose.podman.yml, suppression test-vault
- .gitignore: exclusion odysseus/
This commit is contained in:
2026-06-14 20:27:37 -04:00
parent 0cdebc5b40
commit feeb46b873
31 changed files with 1769 additions and 981 deletions
+134
View File
@@ -9,6 +9,14 @@
box-sizing: border-box;
}
/* ── Editor save dot state colors ── */
:root {
--ok: #34d399;
--warn: #fbbf24;
--ai: #8b5cf6;
--err: #f87171;
}
/* ===== THEME — DARK (default) ===== */
:root[data-theme="dark"] {
--bg-primary: #0f1117;
@@ -189,6 +197,98 @@ a:hover {
opacity: 0.8;
}
/* ── Offline Indicator ── */
.offline-indicator {
position: relative;
display: flex;
align-items: center;
justify-content: center;
margin-right: 8px;
cursor: default;
}
.offline-indicator.offline i {
color: var(--warning, #f59e0b);
opacity: 1;
}
.offline-pending {
position: absolute;
top: -4px;
right: -8px;
background: var(--danger, #ef4444);
color: #fff;
font-size: 0.6rem;
font-weight: 700;
min-width: 14px;
height: 14px;
line-height: 14px;
text-align: center;
border-radius: 7px;
padding: 0 3px;
}
/* ── Offline Search Result Badge ── */
.search-result-offline-badge {
display: inline-block;
background: var(--warning, #f59e0b);
color: #000;
font-size: 0.55rem;
font-weight: 700;
padding: 1px 5px;
border-radius: 3px;
margin-left: 6px;
vertical-align: middle;
text-transform: uppercase;
}
/* ── Conflict Resolution Modal ── */
.conflict-modal-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.6);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
}
.conflict-modal {
background: var(--bg-card, #1e1e2e);
border: 1px solid var(--border, #333);
border-radius: 8px;
padding: 24px;
max-width: 600px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
}
.conflict-modal h3 {
margin: 0 0 8px;
font-size: 1.1rem;
}
.conflict-modal p {
color: var(--text-muted, #888);
font-size: 0.85rem;
margin: 0 0 16px;
}
.conflict-modal-actions {
display: flex;
gap: 8px;
justify-content: flex-end;
}
.conflict-modal-actions button {
padding: 8px 16px;
border-radius: 6px;
border: 1px solid var(--border, #333);
background: var(--bg-input, #2a2a3c);
color: var(--text, #ddd);
cursor: pointer;
font-size: 0.85rem;
}
.conflict-modal-actions .btn-primary {
background: var(--accent, #3b82f6);
border-color: var(--accent);
color: #fff;
}
/* All vaults — blue */
.vault-ctx-all {
background: color-mix(in srgb, #3b82f6 14%, transparent) !important;
@@ -2215,6 +2315,29 @@ select {
color: var(--text-primary);
font-weight: 600;
}
.editor-brand { font-weight: 700; font-size: 12px; color: var(--accent); letter-spacing: 0.5px; white-space: nowrap; margin-right: 8px; }
.editor-title-input { flex: 1; min-width: 80px; background: transparent; border: 1px solid transparent; color: var(--text-primary); font-size: 13px; padding: 3px 6px; border-radius: 6px; outline: none; font-family: var(--font-sans); }
.editor-title-input:hover { border-color: var(--border); }
.editor-title-input:focus { border-color: var(--accent); background: var(--bg-input); }
.editor-sep { color: var(--text-muted); font-size: 13px; padding: 0 2px; user-select: none; }
.editor-filename-input { width: 140px; background: transparent; border: 1px solid transparent; color: var(--text-primary); font-size: 12px; padding: 3px 6px; border-radius: 6px; outline: none; font-family: var(--font-mono); }
.editor-filename-input:hover { border-color: var(--border); }
.editor-filename-input:focus { border-color: var(--ok); background: var(--bg-input); }
.editor-spacer { flex: 1; }
.editor-save-dot { display: flex; align-items: center; gap: 4px; font-size: 11px; padding: 0 4px; margin-right: 8px; }
.editor-btn + .editor-btn { margin-left: 6px; }
.editor-save-dot .dot { width: 6px; height: 6px; border-radius: 50%; }
.editor-save-dot.ok { color: var(--ok); } .editor-save-dot.ok .dot { background: var(--ok); }
.editor-save-dot.dirty { color: var(--warn); } .editor-save-dot.dirty .dot { background: var(--warn); }
.editor-save-dot.saving { color: var(--ai); } .editor-save-dot.saving .dot { background: var(--ai); }
@keyframes editor-pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } }
.editor-save-dot.saving { animation: editor-pulse 0.8s infinite; }
.editor-save-dot.err { color: var(--err); } .editor-save-dot.err .dot { background: var(--err); }
.editor-body-cm { flex: 1; overflow: auto; }
.editor-body-cm .cm-editor { height: 100%; }
.editor-body-cm .cm-editor .cm-scroller { font-family: var(--font-mono); font-size: 13.5px; line-height: 1.75; }
.editor-footer { height: 26px; min-height: 26px; display: flex; align-items: center; justify-content: space-between; padding: 0 12px; background: var(--bg-secondary); border-top: 1px solid var(--border); font-size: 11px; color: var(--text-muted); flex-shrink: 0; }
.editor-stat-file { color: var(--text-secondary); max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.editor-actions {
display: flex;
gap: 6px;
@@ -3335,6 +3458,17 @@ body.resizing-v {
border-color: var(--accent);
}
.config-select {
padding: 8px 12px;
border: 1px solid var(--border);
border-radius: var(--r);
background: var(--bg-input);
color: var(--text-primary);
font-size: 0.86rem;
font-family: var(--mono);
cursor: pointer;
}
.config-btn-add {
padding: 8px 16px;
border: 1px solid var(--accent);