I did some more work on the map tools prototype today. This time adding sub-tool that let you tweak how the current tool works. For the "shade" you can shade or erase or change how large the brush is.
Everything uses the custom undo/redo stack which is using native web events to dispatch and bubble events up to get handled by the container. It's sort of vue's two-way binding, but 100% web native.