* Rename "editor:layer" to "editor:layer_path" and centralize it in a const
* Centralize "editor:merged_layers" in a const
* Centralize all other attributes in consts
* Rename consts with ATTR_ prefix
* Format
* Improve the Data panel with more type-specific detail pages
* Add network_path to SetDisplayName so renames target any network depth
* Track nested layers via full editor:layer paths and rename parent_layer to path_of_subgraph
* Polish the data panel NodeId leaf page with an editable name field
* Make lock and visibility toggles work for layers in nested subgraphs
* Fix formatting
* Fix connected_to_output running in the wrong network for nested-layer toggles
* Move Vec<String> to Table<String>
* Remove old VecDVec2
* Move Vec<u8> to Table<u8>
* Move Vec<f64> to Table<f64>
* Move [f64; 4] to Table<f64>
* Move Vec<NodeId> to Table<NodeId>
* Tidy up the TaggedValue variants
* Move Vec<BrushStroke> to Table<BrushStroke>
* Add missing type implementations
* Fix tests
---------
* Fix click target propagation with the Rasterize node
* Add the 'Write Attribute' node
* Remove tag_layer in favor of the new Write Attribute node, prune redundant attribute writes
* Replace the Vector<Upstream> type argument with the "editor:merged_layers" attribute
* Feature-gate serde derives behind cfg_attr in all runtime node graph type crates
* Refactor Table to move its hard-coded fields into an attributes field
* Encapsulate TableRow/TableRowRef/TableRowMut attribute fields behind accessor methods
* Remove TaggedValue::GraphicUnused
* Refactor Table<T> to use dynamic attributes instead fixed names
* Fix code review soundness concerns
* Add todo work
* Replace row-oriented Table<T> API with column-oriented access
* Fix attribute propagation bugs
---------
* Fix dropdown menus spawning offset in scrolled panels, a regression from upgrading to Svelte 5.54
Regression introduced in #3933 by upgrading from Svelte 5.47.1 to 5.54.1
* Code review
* Fix unrelated typo
* Add assets build size to build link comment
* Add new string processing nodes
* Remove the IntegerCount = u32 type alias
* Add the 'Format Number' node
* Add "Up To" parameter to the 'String Pad' node
* Fix 'String Capitalization' behavior
* Add 'Map String' and 'Read String' nodes
* Add separator_escaping to 'String Repeat'
* Add 'Regex Replace'
* Add 'Regex Match' node
* Regex Find and Regex Find All
* Code review
* Add the 'Escape String' node
* Improve implementations
* Move nodes from logic.rs to text/src/lib.rs
* Clean up migrations
* Fix #[{hard, soft}_{min, max}(...)] node macro attribute
* Improve Data panel number and text display
* Add the 'Query JSON' and 'Query JSON All' nodes
* Add the 'Lorem Ipsum' node and Ipsum library
* Add the 14 nodes back in their final state
* Add handling for fixed decimal places in number formatting
* Code review fixes
* Rename 'Image Value' node to 'Image' and have its input value be Image<Color> not Table<Raster<CPU>>
* Add a Properties panel widget labeling "width x height" for images in the Image node
* Add Image<Color> node registry entry for MonitorNode
* Code review
* Make paste/import SVG store as the Path node's VectorModification not Table<Vector>
* Add a migration from Table<Vector> to VectorModification for existing documents
* Add a VectorModification widget to visualize change counts
* Refactor VectorModification to compute per-category counts for additions, removals, and modifications
* Add spread method support for gradients
* Add GradientSpreadMethod enum (Pad, Repeat, Reflect) to vector-types
* Add radio buttons to gradient tool and fill properties panel
* Convert spread method when importing SVGs via usvg
* Sync backup gradient input when changing spread method
* Table<GradientStops> rendering is not yet updated for spread method
* Sync gradient tool options with layer's gradient
* Sync gradient_type and spread_method from the selected
layer's existing gradient to the tool options bar when
switching to the gradient tool
* Refactor has_gradient_on_selected_layers
to reuse a new get_gradient_on_selected_layer helper
* Swap Reflect and Repeat order in UI radio buttons
* Fix alignment of the radio buttons in right panel
* Fix the position of the radio buttons in the tool
* Rename SpreadMethod to SetSpreadMethod
* Move default spread method omission logic
* Add checkered transparency rendering to infinite canvas and artboards
* Enable artboard clipping by default
* Make new infinite canvas documents begin with a white background layer
* Remove the export dialog's transparency option now that it's redundant
* Make exporting transparent JPGs use white not black
* Code review
* Remove sample based image hashing to avoid false equalities
This was originally introduced to improve the performance of working with
image data, but since the memo hash wrapper got introduced this should no
longer be really necessary.
* Fix todo comment
* Fix Morph node transform interpolation and preservation in the table
* Fix click target positions for Morph's nested layers by pre-compensating upstream_data transforms
* Redesign Morph node (v3) with control path input and uniformly spaced progression, and fix Stroke::lerp interpolation weights
* Add migration from Morph node v2 to v3
* Redesign the 'Blend Shapes' node behavior and subgraph definition
* Add the Layer > Blend menu entry to easily set up a blend
* Optimize the Morph node
* Refactor the Morph node to remove the roundtrip through BezPath
* Fine-tune Morph node Bezier order promotion and handle interpolation
* Add the Layer > Morph menu bar entry
* Fix NaN and guard against other potential NaN bugs breaking the editor
* Add InterpolationDistribution parameter to Morph with weighted progression, swap parameter orders, and rename shear to skew
* Add the Reverse parameter to the Morph node
* Update the order of the inputs to Blend Shapes for consistency with Morph
* Make Layer > Morph create the Morph Path control layer
* Fix migrations
* Move 10 to a constant
* Avoid division by 0 in the Blend Shapes node internals
* Rename nodes 'Blend' -> 'Mix' and 'Blend Shapes' to 'Blend'
* Fix a crash encountered while testing
* Final code review
* Make domain push dupe checks debug-only and use push_unchecked in the Morph node
* Pre-allocate for pushes to the vector domains
* Add fast path at t=0
* Inline reserve()
* Set up the control path layer above not below, and starting collapsed
* Review fixes
---------
Co-authored-by: Timon <me@timon.zip>
* Fix NaN points produced by Sample Polylines on 0-scaled input
* Fix Jitter Points inverse transform for zero-scale axes and stop resetting stroke transform
* Remove a couple confusing Debug nodes
* Fix edge case
* Update demo art
* Fix order change in Jitter Points causing different results from earlier
* Fix bug in bisect tool
* Break out functionality into helper functions
* Refactor transform decomposition API with skew support, add Decompose Skew node, and fix stroke transform interpolation
* Fix bug in master with skew changing Area node calculated value
* Code review simplification
* More code review fixes
* Rename cases where "shear" terminology was used in place of "skew"
* Fix an assertion failure bug when scaling a line in the transform cage
* Fix missing defaults on node gradient inputs
* Fix Blend Shapes path input wire not updating to show in the UI after Layer > Blend
* Fix assertion failure due to browser non-monotonic timestamp
* Fix SVG renderer drawing 1px strokes as half-width when using stroke alignment
* Fix incorrect appearance of the ColorInput widget when set to "none" and "disabled"
* Fix lerp function in Fill enum to handle None cases correctly
* Fix stroke alignment bug
* Fix hide artboard for raster render mode
* Desktop: Fix transparent viewport blending
* Fix vello render using wrong color space conversion for background
* Review
* New node: Decimate
* Use preallocated stack to reduce number of allocations and fix double endpoints on closed paths
* Use Kurbo implementation of path-to-polyline sampling
* Add the 'Simplify' node