feat: introduce local-first SVG workbench

This commit is contained in:
2026-08-02 16:31:49 +02:00
commit 39d9802daa
97 changed files with 20702 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
# Animation
Native SVG animation elements are discovered/countable in source but removed
from every rendered editing projection, so imported SMIL and event-triggered
animation cannot execute automatically. Imported scripts are never supported.
Version 0.1.0 implements a deliberately small app-owned animation slice:
- add an opacity animation to the selected element;
- enable/disable/remove definitions;
- preview generated CSS only in the opaque-origin canvas;
- persist definitions in an explicit `.svgtools.json` project;
- apply validated CSS plus stable target IDs to source in one transaction.
One shared validator is used for project import, preview and Apply. It bounds
definition/keyframe counts and strings, requires finite ordered offsets and
bounded timing/iteration values, allowlists property/kind/direction/fill mode,
accepts only safe easing grammar and parses every CSS value with css-tree. URLs,
resource functions, structural CSS/XML characters and parser raw nodes are
rejected even for disabled definitions. Selectors and keyframe identifiers are
escaped/generated by the app.
The preview has play/pause as an enable toggle but no timeline, seek or native
SMIL editing. Duration/keyframes are not yet exposed as a general UI. Transform,
colour, motion-path and compatible path-morph authoring, animation discovery
panels and conversion between CSS/SMIL remain future milestones. Applying CSS
changes the SVG source intentionally and may affect downstream consumers that
do not support the same CSS animation features.