Skip to content

Releases: georgyfr/woo-total-menu

v1.7.0 — Menus conditionnels + Analytics simple

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 18:50

🎯 v1.7.0 — Menus conditionnels + Analytics simple

Cette version finalise la roadmap initiale du plugin en livrant les deux dernières fonctionnalités majeures attendues.

✨ Nouveautés

1. Menus conditionnels

  • 10 types de règles : page_type, post_id, post_type, taxonomy, user_state, user_role, device, date_range, url_param, language
  • Logique ET/OU avec court-circuit
  • Méta _wtm_conditions sur le CPT wtm_menu (copiée dans les révisions WordPress)
  • 4 routes REST sous /wtm/v1/menus/{id}/conditions (GET/PUT/DELETE/test)
  • Panneau Builder React avec testeur live (évalue les conditions contre la requête courante)
  • Intégration native dans Location_Interceptor et Header_Footer_Injector : si les conditions ne matchent pas, le menu/header/footer ne s'affiche pas

2. Analytics simple (privacy-friendly)

  • Aucune donnée personnelle collectée (pas d'IP, pas d'user ID, pas de cookie) — conforme RGPD/CCPA sans bannière de consentement
  • Compteurs agrégés par jour stockés dans des options WordPress
  • 3 types d'événements : view, click, hover
  • 2 routes REST : POST /wtm/v1/analytics/track (public, nonce-gated) + GET /wtm/v1/analytics/stats (admin-only)
  • Tracking JS frontend via navigator.sendBeacon pour les clics (survit à la navigation)
  • Page dashboard /wp-admin/admin.php?page=wtm-analytics avec chart HTML/CSS pur (pas de dépendance JS)

🔧 Hooks développeur

  • wtm_condition_result (filter) — surcharge du résultat final d'évaluation
  • wtm_condition_rule_{type} (filter) — évaluation de types de règles custom
  • wtm_analytics_recorded (action) — déclenché après chaque événement enregistré

📦 Détails

  • 6 nouveaux fichiers PHP (~1270 lignes)
  • 1 nouveau composant React (~280 lignes)
  • 85 lignes ajoutées au JS frontend
  • Build webpack recompilé (build/index.js 158 KiB)
  • 6 nouvelles routes REST
  • Compatible PHP 7.4+ et WordPress 6.4+

Voir versions/v1.7.0.md pour la documentation complète.

v1.6.0 — Phase Polish

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 18:11

Phase Polish

  • Rôles personnalisés : Roles_Manager + 5 routes REST /wtm/v1/roles (création/maj/suppression de rôles WTM custom, protection des 5 rôles core).
  • 3 blocs Gutenberg : wtm/menu, wtm/header, wtm/footer server-rendered via register_block_type.
  • Intégration Elementor : widget custom "Woo Total Menu" (lazy-loaded si Elementor actif).
  • Intégration Bricks : élément custom wtm-menu (lazy-loaded si Bricks actif).
  • Intégration Oxygen : 3 shortcodes [wtm_header], [wtm_footer], [wtm_oxygen_menu] + helper PHP.
  • Multisite : Multisite_Manager (activation réseau + hook wpmu_new_blog + stats réseau).
  • 8 hooks développeur : wtm_role_created/updated/deleted, wtm_activated/deactivated, wtm_network_activated, wtm_multisite_blog_setup/cleanup.

Tests backend : 30/30 PASS.

Voir versions/v1.6.0.md pour la documentation complète.

v1.5.0 — Système de templates intégrés

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 17:36

🎯 Système de templates intégrés

12 templates prêts à l'emploi (4 menus + 4 headers + 4 footers) répartis en 5 catégories métier (ecommerce, blog, corporate, minimal, electronics).

✨ Nouveautés

  • Backend PHPTemplate_Registry (~840 lignes) + Templates_Controller (~330 lignes, 3 routes REST : GET /templates, GET /templates/{id}, POST /templates/{id}/apply).
  • Builder React — Galerie de templates avec toolbar (tabs Tous/Menus/Headers/Footers), recherche plein-texte, filtre par catégorie, mini-aperçus CSS synthétiques (10 variants), bouton "Appliquer" avec confirmation.
  • Store Redux wtm/templates — cache du catalogue, filtres, états d'application, action async applyTemplate(id).
  • 2 hooks/filters développeurwtm_templates_catalog (filter) + wtm_template_applied (action).

📦 Catalogue (12 templates)

Menus : Menu horizontal simple, Méga menu boutique de mode, Méga menu électronique, Menu vertical sidebar.

Headers : Header e-commerce classique, Header minimaliste, Header promotionnel, Header sticky centré.

Footers : Footer e-commerce 4 colonnes, Footer minimaliste, Footer corporate 4 colonnes, Footer sombre accessible WCAG AA.

✅ Tests

  • 14/14 backend PASS (REST endpoints, apply, mode mismatch, filtre).
  • 5/5 browser PASS (UI galerie, filtres, apply).
  • 0 régression.

📊 Statistiques

  • 6 nouveaux fichiers, 13 modifiés.
  • ~3486 lignes ajoutées.
  • Bundle JS : 150 Ko (35 Ko gzip).
  • Bundle CSS : 35 Ko.

ZIP : https://github.com/georgyfr/woo-total-menu/releases/download/v1.5.0/woo-total-menu-1.5.0.zip
Documentation : https://github.com/georgyfr/woo-total-menu/blob/main/versions/v1.5.0.md

v1.4.0 — Header & Footer Builder

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 16:49

🎯 Nouvelle phase : Header & Footer Builder

La v1.4.0 finalise la promesse initiale du plugin : un outil unifié pour gérer les menus, headers et footers d'un site WooCommerce en quelques clics.

✨ Nouveautés principales

Builder visuel Header & Footer

  • 3 tabs Menu / Header / Footer dans le Builder React
  • Layout mode-aware : ModulePalette + LayoutCanvas + ModuleProperties en mode header/footer
  • Grille visuelle rows → columns → modules avec resize (largeur 1-12)
  • Drag-and-drop HTML5 des modules depuis la palette
  • Déplacement des modules entre colonnes
  • 9 types de modules : logo, menu, search, cart, button, html, social, newsletter, text

Backend PHP

  • Header_Footer_Renderer (~838 lignes) — walker PHP pur rows→columns→modules, HTML sémantique <header>/<footer>, réutilise les renderers widgets v1.3
  • Header_Footer_Injector (~288 lignes) — hooks wp_body_open + wp_footer pour injection globale automatique
  • Schema_Validator::validate_layout() — validation stricte (MODULE_TYPES, width 1-12, ids string requis)
  • REST API étendue : GET/POST acceptent header_config et footer_config
  • 2 meta _wtm_header_config + _wtm_footer_config versionnées dans les révisions WordPress

Settings & Hooks

  • Section header_footer dans Réglages → Woo Total Menu (5 champs)
  • 5 hooks/filters développeur : wtm_header_inject_hook, wtm_footer_inject_hook, wtm_before_header, wtm_before_footer, wtm_layout_module_html

🐛 Bugs corrigés

  • render_module_search() : attributs data-wtm-live-search et data-min-chars manquants
  • render_module_newsletter() : attributs data-provider, data-list-id, data-wtm-newsletter-message, <script data-wtm-newsletter-config> manquants

🧪 Tests

  • 53/53 PASS (28 backend + 12 frontend + 8 Builder + 5 non-régression)
  • Bundle : 138 Ko JS Builder (35 Ko gzip) + 14 Ko JS frontend + 23 Ko CSS frontend
  • 18 fichiers modifiés, +4584/-132 lignes

📦 Téléchargement

  • ZIP de release : woo-total-menu-1.4.0.zip (344 Ko, 86 fichiers)
  • Documentation détaillée : versions/v1.4.0.md

🧭 Prochaine version

v1.5.x — Templates Library : bibliothèque de templates prêts à l'emploi importables en un clic, mode Démo, export/import JSON.

v1.3.0 — Widgets WooCommerce avancés

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 14:24

Objectif

La v1.3.0 enrichit la bibliotheque de widgets avec 4 nouveaux types orientes e-commerce et marketing, et upgrade 2 widgets existants.

Nouveautes

4 nouveaux widgets

  • recent_posts : articles WordPress en grille (image, titre, date, extrait) avec tri + transient cache filtrable.
  • social_icons : icones reseaux sociaux avec glyphes SVG inline (CSS mask) pour 7 reseaux + couleurs hover par reseau.
  • newsletter : formulaire abonnement email avec layout inline/stacked, providers internal/mailchimp/none, AJAX submit avec nonce, IP anonymisee GDPR.
  • filters : filtres WooCommerce layered nav (categories, prix min/max, attributs en checkboxes).

2 widgets upgraded

  • mini_cart : nouveau mode display_mode: drawer qui ouvre un panneau lateral AJAX avec contenu du panier + refresh auto.
  • search : nouvelle option live_suggestions qui active un dropdown de suggestions produits en AJAX (debounce 250 ms) + navigation clavier.

2 routes REST publiques

  • GET /wtm/v1/search-suggest?s=...&limit=5
  • GET /wtm/v1/mini-cart-contents

1 admin-ajax handler

  • wtm_newsletter_subscribe (nonce + IP anonymisee GDPR + hooks pour Mailchimp)

Builder React

  • Widget subtype picker avec 12 sous-types
  • Inspecteurs PropertiesPanel pour les 7 nouveaux widgets

Tests

25/25 tests PASS. 1 bug pre-existant v1.2.0 corrige (widget_settings vs settings dans Menu_Renderer).

v1.2.0 — Rendu frontend complet

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 13:29

🎯 Nouvelle phase : Rendu Frontend

Jusqu'à v1.1.5 le plugin savait stocker et prévisualiser les menus dans le Builder. À partir de v1.2.0, il peut les afficher côté visiteur pour les 4 types de menus :

  • Horizontal (méga menu — spec §5.4)
  • Vertical (sidebar — spec §5.5)
  • Off-canvas (panneau mobile — spec §5.6)
  • Footer (multi-colonnes — spec §5.7)

✨ Nouveautés

4 nouveaux services PHP (src/Frontend/)

Classe Rôle Spec
Menu_Renderer Walker PHP pur qui parcourt l'arbre JSON _wtm_config et produit du HTML sémantique <nav><ul> pour 6 types d'items + 7 types de widgets §2.4
Location_Interceptor Hook wp_nav_menu_args qui remplace les locations wtm_* par le rendu WTM §7.5
Dynamic_CSS Compile un CSS unique (couleurs, typo, breakpoint) sauvegardé dans uploads/wtm-cache/ avec cache-busting §2.4.3
Shortcode [wtm_menu id="123"] ou [wtm_menu location="primary"] §2.8.2
Assets_Loader Enqueue conditionnel des CSS/JS uniquement si un menu est rendu sur la page §2.6.1

Assets frontend

  • assets/front/wtm-frontend.css (~15 Ko) — styles pour 4 types de menus + méga panel + widgets + responsive + reduced-motion
  • assets/front/wtm-frontend.js (~6 Ko, vanilla JS, pas de jQuery) — off-canvas (focus trap, ESC, overlay), click-trigger mega containers, mobile accordion, footer accordion, sync mini-cart WooCommerce

4 widgets WooCommerce rendus

  • product_grid — grille de produits (image/nom/prix/bouton Ajouter) via wc_get_products(). Cache transient 12h filtrable.
  • category_grid — grille de catégories avec thumbnail
  • mini_cart — lien vers /cart avec compteur + total synchronisés WC
  • search — formulaire de recherche produits WC

8 hooks filters pour développeurs (spec §2.8.4)

wtm_menu_config, wtm_render_item, wtm_menu_classes, wtm_dynamic_css, wtm_map_theme_location, wtm_product_grid_query, wtm_widget_cache_duration, wtm_force_enqueue_assets, + action wtm_rendered_location.

🔒 Sécurité

  • Tout le HTML rendu échappé (esc_url, esc_html, wp_kses_post)
  • Couleurs validées via regex whitelist (hex / rgb)
  • Répertoire de cache protégé par .htaccess + index.php

🧪 Tests

22/22 PASS (10 backend + 9 browser + 3 non-régression) :

  • Shortcode par ID et par location
  • Méga menu complet avec 3 colonnes + 4 widgets WC + badge + separator
  • Off-canvas : ouverture, focus trap Tab/Shift+Tab, Escape ferme
  • Mega click trigger + outside click + Escape ferme
  • Mobile 375px responsive + footer accordion collapse
  • Enter key sur mega trigger (clavier)
  • Dynamic CSS purge sur save_post_wtm_menu + régénération
  • Non-régression Builder React (8 items arbre)
  • 0 erreur console, 0 warning React

Rapport complet : download/dnd-tests/Rapport-Tests-v1.2.0.md

📦 Installation

  1. Téléchargez le ZIP ci-dessous
  2. Remplacez wp-content/plugins/woo-total-menu/ par le contenu du ZIP
  3. Aucune migration de données — le schéma JSON _wtm_config est inchangé

🔗 Liens

v1.1.5 — Historique des révisions WordPress + restauration

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 12:27

🎯 v1.1.5 — Historique des révisions WordPress + restauration

Cette version ajoute la gestion historique des révisions WordPress au Builder. Chaque sauvegarde crée désormais une révision du CPT wtm_menu, capturant à la fois les champs du post ET les 6 métadonnées WTM (_wtm_config, _wtm_menu_type, _wtm_location, _wtm_header_config, _wtm_footer_config, _wtm_version).

L'utilisateur peut lister, prévisualiser et restaurer n'importe quelle révision passée depuis un nouveau modal « Historique » dans le Builder.

✨ Nouveautés

  • 3 nouvelles routes REST : GET /wtm/v1/menus/{id}/revisions, GET .../{revision_id}, POST .../{revision_id}/restore
  • Filtre wtm_max_revisions (défaut 10, spec §7.6) via wp_revisions_to_keep
  • 6 méta WTM versionnées dans les révisions (revisions_enabled => true + filtre _wp_post_revision_meta_keys)
  • Modal Historique (HistoryPanel.js) avec overlay, liste scrollable, avatars Gravatar, dates relatives, compteur d'items
  • Prévisualisation de révision dans l'iframe de preview (pill jaune « Révision #N »)
  • Restauration avec confirmation inline (bannière jaune « Restaurer cette révision ? »)
  • Hook wp_restore_post_revision pour restaurer les méta WTM après une restauration WP core

🐛 Bugs corrigés pendant le développement

3 bugs bloquants ont été découverts et corrigés avant la release :

  1. Meta_Boxes seulement instancié en adminregister_post_meta() et le filtre _wp_post_revision_meta_keys n'étaient pas actifs en contexte REST. Les révisions étaient créées mais leur méta était vide. Fix : Bootstrap.php instancie Meta_Boxes sur toutes les requêtes.

  2. sanitize_json wp_slashait sa valeur de retour → double-wp_slashing au stockage, json_decode échouait à la lecture. Ce bug était silencieux en v1.1.4 (parce que le Bug 1 empêchait le sanitize_callback de s'exécuter en REST). Fix : retirer wp_slash du retour de sanitize_json().

  3. Route args avec default causaient un wipe silencieux du config → un PUT avec {"title":"..."} (pas de config) resetait silencieusement le config à la valeur par défaut {"version":1,"items":[]}. Fix : utiliser $request->get_json_params() + isset() pour vérifier le body JSON brut, au lieu de get_param()/has_param() qui incluent les defaults.

🔧 Modifications techniques

  • Menu_Controller::update_menu() écrit une signature dérivée du config dans post_content pour garantir qu'une révision est créée à chaque save (WP ne crée pas de révision sur changements meta-only)
  • Les meta sont mises à jour avant wp_update_post pour que la révision capture le nouvel état (pas l'ancien)
  • Bump Requires at least 6.3 → 6.4 (nécessaire pour revisions_enabled arg de register_post_meta, aligné avec spec §7.6)
  • Bump version 1.1.4 → 1.1.5

📊 Métriques

Métrique v1.1.4 v1.1.5 Delta
Bundle JS (compressé) 87,2 Ko 95,2 Ko +8,0 Ko
Bundle CSS 15,1 Ko 20,4 Ko +5,3 Ko
Routes REST 8 11 +3
Composants React 7 8 +1
Fichiers PHP 14 15 +1
Hooks WordPress 18 22 +4

✅ Tests

  • 22/22 tests PASS (4 backend + 8 UI v1.1.5 + 10 non-régression)
  • 8 captures d'écran : /home/z/my-project/download/dnd-tests/
  • Rapport détaillé : Rapport-Tests-v1.1.5.md

📦 Installation

Téléchargez le ZIP ci-dessous et uploadez-le via WordPress admin → Extensions → Ajouter → Téléverser une extension.

Requires WordPress 6.4+ (changement par rapport à v1.1.4 qui nécessitait 6.3).

v1.1.4 — Live preview via iframe + postMessage

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 10:35

🎯 Objectif

Cette version transforme le panneau central du Builder en véritable aperçu live : ce n'est plus un placeholder statique comme en v1.1.0, mais un iframe qui restitue en direct la configuration du menu, à chaque modification.

🚀 Nouveautés

1. Endpoint admin-ajax.php?action=wtm_preview_frame

Fichier : src/Frontend/Preview_Controller.php (nouveau, 540 lignes)

Ce controller hook wp_ajax_wtm_preview_frame et sert un document HTML auto-contenu (CSS + JS inline, ~10 Ko). Ce document :

  • Charge dans un iframe côté Builder
  • Écoute les postMessage reçus du parent (vérification event.source === window.parent)
  • Sur réception d'un message { type: 'wtm-render', config, device }, met à jour le body.className avec le device et re-render le menu
  • Émet un signal wtm-preview-ready au parent au chargement

Pourquoi admin-ajax et pas REST ? Un <iframe src> ne peut envoyer que des cookies, pas le header X-WP-Nonce requis par WP REST pour cookie auth. admin-ajax.php authentifie via cookie seul pour les utilisateurs connectés — exactement ce qu'il faut.

2. Composant PreviewPanel.js réécrit

Le nouveau composant :

  • Charge l'iframe avec src={previewFrameUrl}
  • Attend le signal wtm-preview-ready avant d'envoyer des messages
  • Sur changement de menu ou device, envoie un postMessage debounce 250 ms (spec §6.6)
  • Sur changement de device seul, envoie immédiatement (pas de debounce)

3. Modes responsive (desktop / tablet / mobile)

  • desktop : 100% (pleine largeur)
  • tablet : 768px, bordure sombre 6px, border-radius 12px
  • mobile : 375px, bordure sombre 8px, border-radius 24px (look smartphone)

À l'intérieur de l'iframe, le body reçoit wtm-pv-device--{device} qui ajuste le layout du menu (passage en colonne en mobile, etc.).

4. Types d'items et widgets supportés

Le renderer JS de l'iframe sait afficher :

  • 6 types d'items : link, mega_container, column, widget, title, separator
  • 7 types de widgets : html, banner, product_grid, category_grid, mini_cart, search, custom_link

🔒 Sécurité

Mesure Description
Permission current_user_can('wtm_manage_menus') obligatoire
X-Frame-Options SAMEORIGIN — iframe limitée au même domaine
sandbox iframe allow-same-origin allow-scripts — pas de forms, pas de top-nav
Origin check event.source !== window.parent côté iframe
postMessage target window.location.origin côté parent (pas '*')

✅ Tests

Nouveaux tests spécifiques v1.1.4 (tous passent) :

  • ✅ Iframe se charge avec readyState=complete
  • ✅ Signal wtm-preview-ready émis au chargement
  • ✅ postMessage parent → iframe fonctionne
  • ✅ Debounce 250 ms respecté
  • ✅ Changement de device immédiat
  • ✅ 6 types d'items + 7 types de widgets rendus correctement
  • ✅ Save + reload : preview se recharge avec l'état persisté
  • ✅ Sécurité : X-Frame-Options, sandbox, permission_callback

Tests de non-régression : 23/23 (DnD, undo/redo, ARIA, persistance).

Rapport complet : download/dnd-tests/RApport-Tests-v1.1.4.md

📊 Métriques

Métrique Avant (v1.1.3) Après (v1.1.4)
Taille bundle JS 86,3 Ko 87,2 Ko
Taille bundle CSS 14,3 Ko 15,1 Ko
Preview panel Placeholder statique iframe live + postMessage
Refresh preview Manuel (F5) Automatique (250 ms debounce)
Modes responsive 3 largeurs CSS 3 frames visuelles
Fichiers PHP 16 17 (+1)

🔗 Liens

v1.1.3 — Fixes UX : indicateur drop temps réel + React 18 + ARIA unique

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 10:15

🎯 Objectif

Cette version est une release de polish qui corrige les 3 bugs résiduels non-bloquants identifiés lors des tests approfondis en navigateur de la v1.1.2.

🐛 Fixes

1. Indicateur de drop temps réel (spec §6.3.2)

Pendant un drag, quand le curseur se déplaçait verticalement à l'intérieur d'un même item, l'indicateur visuel (before/after/inside) ne se mettait pas à jour. Il fallait sortir de l'item et y revenir pour rafraîchir l'indicateur.

Cause racine : le useEffect de SortableTreeItem.js utilisait sortable.activatorEvent.clientY — le Y du pointerdown initial, qui ne change jamais pendant le drag.

Correctif : ajout d'un listener pointermove global qui met à jour cursorPosRef.current et incrémente cursorTick. Le useEffect de calcul dépend maintenant de cursorTick, donc se re-déclenche à chaque mouvement du curseur.

2. Migration React 18 — createRoot (spec §9.2)

Remplacement de ReactDOM.render() (déprécié) par createRoot() depuis @wordpress/element. Corrige le warning React et active les fonctionnalités concurrentes.

3. Annonce ARIA unique en français (spec §6.7)

Après chaque drop, les utilisateurs de lecteur d'écran entendaient deux annonces : l'anglaise par défaut de @dnd-kit et la française du plugin.

Correctif : encapsulation du prop announcements dans accessibility (accessibility={{ announcements: {...} }}) avec toutes les callbacks retournant une chaîne vide.

Note technique : en @dnd-kit/core v6, announcements ne peut PAS être passé au premier niveau du <DndContext> — il atterrit dans ...props et est silencieusement ignoré. Il doit être encapsulé dans accessibility.

✅ Tests

Les 20 tests DnD de la v1.1.2 ont été rejoués sur la v1.1.3 en navigateur headless (Chromium via agent-browser). Tous passent.

Nouveaux tests spécifiques v1.1.3 :

  • ✅ L'indicateur visuel passe de drop-before à drop-after quand le curseur descend dans un même item
  • ✅ Aucun warning React n'est émis dans la console au chargement
  • ✅ Une seule annonce ARIA est lue par les lecteurs d'écran après un drop

Rapport complet : download/dnd-tests/RApport-Tests-DnD-v1.1.3.md

📊 Métriques

Métrique Avant (v1.1.2) Après (v1.1.3)
Taille bundle JS 85,7 Ko 86,3 Ko
Taille bundle CSS 14,3 Ko 14,3 Ko
Warnings console au load 2 0
Annonces ARIA par drop 2 (FR + EN) 1 (FR)
Refresh indicateur drag Non (figé) Oui (temps réel)

🔗 Liens

v1.1.2 — Drag & Drop arborescent + Undo/Redo

Choose a tag to compare

@georgyfr georgyfr released this 25 Jun 07:10

🎯 Objectif

Cette version rend le builder pleinement interactif en ajoutant le glisser-déposer arborescent complet sur la liste des items, ainsi que l'Undo/Redo et les raccourcis clavier pour une accessibilité WCAG AA.

✅ Nouveautés

Drag & Drop via @dnd-kit (spec §6.3)

  • DndContext + PointerSensor + KeyboardSensor
  • 3 actions : réordonnancement, cross-level moves, nesting
  • Indicateurs visuels : ligne bleue before/after, bordure pointillée inside
  • Drag handle (⠿) + DragOverlay ghost
  • Auto-expand des containers repliés après 500ms
  • Validation des règles de nesting en temps réel

Undo/Redo (spec §9.9)

  • Stacks past/future (max 50 snapshots) dans le store wtm/menu
  • Boutons Annuler/Rétablir dans le Header
  • Raccourcis : Ctrl+Z, Ctrl+Shift+Z, Ctrl+Y
  • clearHistory() après chaque saveMenu()

Raccourcis clavier (spec §6.3.5)

  • Ctrl+↑/↓ : réordonner parmi les frères
  • Ctrl+→ : indenter (enfant du frère précédent)
  • Ctrl+← : outdenter (frère du parent)

Accessibilité (spec §6.7)

  • aria-live='polite' après chaque déplacement
  • aria-grabbed sur les drag handles
  • Messages : « déplacé en position dans . »

🔧 Corrections

  • 🚨 Bug critique mapItems() : const newItem réassignée → TypeError sur toute opération d'arbre non-root. Corrigé en let newItem.
  • moveItem reducer : réécrit avec insertItemAtIndex()
  • About.php roadmap : versions marquées 'done' correctement
  • package.json version synchronisée (1.1.0 → 1.1.2)

📦 Build

  • index.js : 28.6 Ko → 85.7 Ko (+57.1 Ko pour @dnd-kit)
  • style-index.css : 11.9 Ko → 14.3 Ko (+2.4 Ko)

🧪 Tests

  • ✅ npm run build réussit
  • ✅ Plugin activé sur WordPress 6.7.1 + WooCommerce 9.7.1 + SQLite
  • ✅ Builder accessible (HTTP 200)
  • ✅ Bundle JS contient DndContext, DragOverlay, ADD_ITEM, MOVE_ITEM, UNDO, REDO
  • ✅ WTM_VERSION = 1.1.2

📋 Périmètre exclus (non réalisable selon analyse du cahier des charges)

  • ❌ Assistant IA copilote complet (Ch. 12) — à rescoper en v2.0
  • ❌ Auto-adaptation ML temps réel
  • ❌ Heatmaps intégrées
  • ❌ WebLLM embarqué
  • ❌ Support vocal
  • ❌ Promesse 'zéro impact performance'
  • ❌ Compatibilité universelle

🔗 Liens

🚀 Prochaines étapes

Version Contenu
v1.1.3 Live preview via iframe + postMessage
v1.1.4 Undo/Redo révisions WordPress + historique
v1.2.0 Rendu frontend : Menu_Walker, méga menu, off-canvas mobile