feat: finalisation éditeur Forge + mode hors-ligne PWA + consolidation roadmap
- 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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user