C’est à toi d’implémenter ce comportement, le navigateur ne sait pas le faire nativement.
Il y a plusieurs approches possibles mais la plus simple me semble être un algorithme de ce genre : après chaque action, tu enregistres l’état du dessin. Concrètement tu peux enregistrer le contenu du <svg>...</svg>
dans une variable. Si l’utilisateur annule son action, il suffit de restituer en remplaçant, dans le DOM, le dernier svg gardé en mémoire.
Je ne suis pas spécialiste JS, ce bout de code sert à illustrer l’idée mais il y a sans doute quelques subtilités à connaître avant de procéder ainsi. Je laisse les connaisseurs JS apporter des précisions si nécessaire.
Je pense à un truc comme ça :
var last = document.querySelector('div#main > svg').cloneNode(true);
document.querySelector('div#main > svg').replaceWith(last);
Si tu veux enregistrer les états successifs pour annuler plusieurs actions en arrière, il suffit d’empiler cela dans une liste plutôt que d’utiliser une seule variable :
let last = document.querySelector('div#main > svg').cloneNode(true);
previous_states.push(last);
let last = previous_states.pop();
document.querySelector('div#main > svg').replaceWith(last);
Cette solution me semble pas idéale, et je crains que cette manipulation du DOM soit peu optimale… Mais c’est la seule approche qui me paraît possible dans ton code actuel. Dans un cas idéal, je pense qu’il faudrait dissocier les données et leur rendu. Cela permettrait d’enregistrer non pas une partie du DOM mais plutôt des objets simples sur lesquels il suffirait ensuite d’invoquer un rendu, par exemple.
Sans découplage, on est obligé de manipuler directement le DOM qui est à la fois le porteur de données et le rendu. Si les données et le rendu sont découplés, le pattern est de mettre à jour ton état (les données), et d’invoquer aussitôt un rendu sur cet état, le rendu étant une fonction qui a pour mission de prendre un état et de faire en sorte que le bon code SVG correspondant soit chargé dans le DOM.