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
+10 -3
View File
@@ -517,6 +517,9 @@ export function initTagResize() {
// Frontmatter Accent Card Builder
// ---------------------------------------------------------------------------
// Persist toggle state across document openings
let _frontmatterOpen = false;
export function buildFrontmatterCard(frontmatter) {
// Helper: format date
function formatDate(iso) {
@@ -530,11 +533,11 @@ export function buildFrontmatterCard(frontmatter) {
// Extract boolean flags
const booleanFlags = ["publish", "favoris", "template", "task", "archive", "draft", "private"].map((key) => ({ key, value: !!frontmatter[key] }));
// Toggle state
let isOpen = true;
// Toggle state (persisted across documents)
let isOpen = _frontmatterOpen;
// Build header with chevron
const chevron = el("span", { class: "fm-chevron open" });
const chevron = el("span", { class: "fm-chevron " + (isOpen ? "open" : "closed") });
chevron.innerHTML = '<i data-lucide="chevron-down" style="width:14px;height:14px"></i>';
const fmHeader = el("div", { class: "fm-header" }, [chevron, document.createTextNode("Frontmatter")]);
@@ -612,9 +615,13 @@ export function buildFrontmatterCard(frontmatter) {
// Assemble the card
const acCard = el("div", { class: "ac-card" }, [acTop, acBody, acTagsRow, acFlagsRow]);
// Set initial display based on persisted state
if (!isOpen) acCard.style.display = "none";
// Toggle functionality
fmHeader.addEventListener("click", () => {
isOpen = !isOpen;
_frontmatterOpen = isOpen;
if (isOpen) {
acCard.style.display = "block";
chevron.classList.remove("closed");