* Port all remaining Subpath producers to BezPath and delete the legacy subpath module
* Reset contour state at each MoveTo so an open contour's segments don't leak into the next region
* Give the polygon and star constructors a true center and radius instead of compensated arguments
* Let the Fill and Stroke paint inputs take Item<Graphic>, replacing the IntoPaint trait
* Rename the FIll node's "fill" input to "paint"
* Let the graphic-consuming nodes take List<Graphic> directly, relying on the embedding adapters
* Remove outdated todo comments
* Re-save the demo art
* Split 'To Graphic' and 'Wrap Graphic' into the 'As Graphic' type assertion and 'Into Group' reducer nodes
* Make 'Into Group' reduce List<DVec2> not Item<DVec2>
* Reset the Merge definition for every legacy alias of its coercion nodes
* Improve test
* Add the rank-0 Item leaf variants to the Graphic enum, rendering leaves and list rows through shared per-row logic
* Traverse the rank-0 Graphic leaf variants in the vector node helpers and flattening
* Reach rank-0 vector graphics from the styling and gradient-fitting helpers
* Two code review fixes
* Fix comment
* Make the Artboard and Gradient newtype fields public to match the other list newtypes
* Rename the Graphic enum's self-named Graphic::Graphic variant to Graphic::GraphicList
* Rename the Graphic::Vector variant to Graphic::VectorList
* Rename the Graphic::RasterCPU variant to Graphic::RasterCPUList
* Rename the Graphic::RasterGPU variant to Graphic::RasterGPUList
* Rename the Graphic::Color variant to Graphic::ColorList
* Rename the Graphic::Gradient variant to Graphic::GradientList
* Rename the Graphic::Text variant to Graphic::TextList
* Restore the SVG group tag comment that the variant rename sweep clobbered
* Add the appearance model types and attribute constants
* Dual-write the appearance attribute alongside the fill/stroke pair in all paint-writing nodes
* Read paint from the appearance attribute in the renderer, analysis, metadata, and editor, cascading from ancestors
* Retire the fill/stroke attribute pair and the Vector stroke field in favor of the appearance attribute
* Replace the Stroke node's paint order input with the relative chain order of the Fill and Stroke nodes
* Code review fixes
* Re-save demo art
* Stamp coverages in place and fuse the renderer's per-item appearance reads into single walks
* Treat an empty appearance as the undeclared state so padded rows inherit instead of blocking the cascade
* Update demo art
* Treat padded appearance rows as undeclared in the boolean flatten's group recursion
* Stop chain node insertion from stranding a node on layers without a chain
* Gate the Layers panel blending controls on whether the layer can host them
* Gate the fill and stroke setters on whether the layer can host paint nodes
* Make the tool options fill and stroke controls treat layers that cannot take paint as unselected
* Remove the unused first_selected_stroke_weight helper
* New nodes: 'Gradient Reverse', 'Gradient Shift', and 'Gradient Stretch' nodes for rearranging a ramp's stops
* Clip a lone out-of-range stop into the bake, and correct the docs that still promised edge-held stops
* Rename the 'Sample Gradient' node to 'Evaluate Gradient'
* Let the Evaluate Gradient node's position reach the out-of-range values its spread modes handle
* Upgrade Vello to a git main revision that honors the brush's interpolation alpha space
* Interpolate Vello gradients with straight alpha, matching the SVG renderer
* Draw the gradient picker strip and fill swatches as SVG so transparency previews with straight alpha
* Keep gradient stop handles opaque so a transparent stop's RGB stays visible
* Paint a stopless gradient's picker strip and swatch black rather than transparent
* Delete dead code function
* Add a Gradient Interpolation axis with Stepped, Linear, and Smooth paths through the stops
* Keep the gradient interpolation attached when dragging stops in the picker
* Give the gradient popover's dropdowns the same tooltips as their row labels
* Order the gradient popover with Intrp. above Space
* Hold gradient stops in place when the cyclic flag is toggled
* Fix wrong Smooth gradient colors around stops sitting on the ramp boundaries
* Consolidate gradient settings plumbing and fix bugs
* Bundle whole-ramp gradient settings into GradientSettings across the editor plumbing
* Name the Smooth gradient interpolation's spline type in its tooltip
* Linearize the gamma hex stop colors recovered from imported Graphite SVGs
* Code review
* Aim the Smooth bake's seam subdivision at the copied boundary color
* Add GradientEvaluator to build gradient sampling state once per loop instead of per sample
* Correct the gradient evaluator's documented setup cost to O(n log n)
* Add a Cyclic gradient attribute that wraps the stop list through the 1|0 boundary back to the first stop
* Show the wrap segment's midpoint diamond in the color picker spectrum strip when cyclic
* Keep the wrap midpoint diamond tracking the pointer by a wrapped strip width when dragged past the ends
* Give the Gradient tool's viewport overlay the same cyclic wrap midpoint diamond and drag behavior
* Correct the docs claiming the final stop's midpoint is always ignored now that cyclic uses it
* Move the gradient cyclic toggle onto the Ends row as a Link icon checkbox
* Update labels
* Register GradientHueDirection with the Data panel so its attribute column renders
* Reword wrap segment to wrapped interval and stray segment usages to interval
* Clean up comments
* Fix the color picker write-back losing default position elision and the blend path guessing the cyclic flag
* Add an OkLab gradient interpolation space and make it the new default
* Fix the Properties panel fill row resetting the gradient interpolation space to the default
* Add OkLch, Lab, LCh, and HSL gradient interpolation spaces
* Add a hue direction attribute and picker choice for polar gradient interpolation spaces
* Add an HSV gradient interpolation space
* Rename the sRGB Linear and sRGB Gamma gradient spaces to RGB Linear and RGB Gamma
* Divide the gradient interpolation dropdown between absolute and relative color spaces
* Rename the OkLch gradient interpolation space to OkLCh for channel-notation capitalization
* Shorten the color picker popover's hue direction row label to Arc
* Call the Gradient Interpolation node's parameter Space and extend the picker tooltip title to match
* Rename the gradient interpolation attribute and type family to gradient space
* Rename the gradient tool's gradient space transform to gradient to viewport transform
* Add serde aliases and a node replacement covering the gradient space renames
* Give the gradient space choices artist-facing labels and reorder the dropdown sections
* Add a Gradient Hue Direction node and its attribute read node
* Say interpolate instead of blend for gradient stop color traversal in docs and tooltips
* Label the polar perceptual gradient spaces as Perceptual Hue and group the dropdown sections by geometry
* Add a migration alias covering the gradient space attribute reader rename
* Carry the gradient hue direction attribute through boolean operations
* Register GradientHueDirection wire types in the node registry
* Build dropdown menu entries from choice type metadata
* Add a gradient interpolation color space attribute, blending stops in linear light by default
* Add a Space interpolation dropdown to the color picker popover
* Stamp legacy gradient ramps with their implicit gamma interpolation during deserialization
* Resolve color-interpolation from SVG style blocks and fix cascade order among repeated declarations
* Build radio widget entries from choice type metadata so variants display their icons
* Route the node properties enum radio through the shared choice type entry builder
* Let the Gradient and Fill tools paint blank layers with whole-expanse gradients and colors
* Make it work on layers with un-fed Transform nodes
* Show the Fill tool's hover pattern over the whole expanse of layers painted by a color chain
* Let the Fill and Gradient tools replace one another's whole-expanse paint on a selected layer
* Keep a shared paint node alive when a tool takes over a layer, and share the paint value lookup
* Stop a chain node from being shifted twice when a node is inserted in front of it
* Rename spread method to gradient spread so it matches the other gradient attribute names
* Keep the legacy gradient struct's spread method field name matching its on-disk key
* Add a spread method field to GradientRamp, carried at runtime as the gradient item's attribute
* Retire the Fill node's spread method input, folding its value into the gradient ramps on document upgrade
* Add an Ends spread method radio to the color picker popover, replacing the Gradient tool's control bar radio
* Update the demo art
* Introduce the GradientRamp exchange struct as the serialized TaggedValue::Gradient payload
* Unify FillChoice and FillChoiceUI into one enum generic over color format, carrying GradientRamp stops
* Rename the TaggedValue::Gradient variant to GradientRamp to match its payload
* Move the Color variant into the tagged_value macro list since its stored and wire forms match
* Rework Gradient into a newtype of List<Color> with optional position and midpoint attributes
* Fix Vello stopless-gradient fallback coverage, empty legacy gradient tables, the node docs gradient swatch, NaN position elision, and wired setter input overwrites
* Remove the dead InputAccessor traits and the uncallable test helper built on them
* Replace raw node input indices with macro-generated parameter symbols across the editor
* Audit dynamic input index usage, converting to parameter symbols and named input position constants
* Abstract the remaining input index plumbing behind ParameterRef APIs and accessors
* Build SetInputValue messages as struct literals to keep message enums impl-free
* Delete the typed parameter markers in favor of explicit-output test introspection
* Wire the interpolation control path input per chain node type
* Return no input when a parameter symbol is read against the wrong node's parameter view
* Box the `value` field of `NodeGraphMessage::SetInputValue`
* Box the `ExecutionResponse` variant of `NodeGraphUpdate`
* Box the `Layer` variant of `NodeTypeClickTargets`
* Box the `Scope` variant of `ParsedValueSource`
* Route the remaining view queries through the logging query helper
* Name the cache readers by their loading contract and stop cloning the owned nodes per collision check
* Deduplicate the port center, output count, and upstream connector helpers and drop dead accessors
* Collapse the TransientMetadata enum into the Option inside TransientCache
* Extract the shared history snapshot install from undo and redo
* Remove commented-out code and fix stale names and doc comments
* Validate that the pinned node order only references existing nodes
* Abort remove_import before any mutation when the import's wires cannot be resolved
* Purge the deleted nodes' cached wire paths in delete_nodes
* Disconnect a deleted node's inputs by position so hidden inputs cannot mask a later exposed wire
* Gather the delete_nodes layer sweep only when deleting children needs it
* Move drag offsets out of the stack dependents cache into dedicated drag session state
* Replace the move_layer_to_stack selection hijack with a seeded stack dependents load
* Move text measurement into a neutral utility module out of the overlays layer
* Deduplicate the document bounds queries and name the artboard clip input index
* Replace the remove_references_from_network selection hijack with an explicit shift set
* Extract shared import and export wire disconnection used by the expose handlers
* Extract the shared epilogue of the import and export removal operations
* Move the post node lookup into the network interface to fix the layering inversion
* Clear drag offsets when the stack dependents cache unloads so programmatic shifts cannot replay them
* Use the thread-local text context for text measurement instead of a process-global mutex
* Resolve the post node lookup within the network being edited instead of the document root
* Back the outward wires cache with an interior-mutability cell readable through &self
* Convert the remaining network-level caches to interior-mutability TransientCache cells
* Move the owned nodes cache out of persistent layer metadata into a transient cell
* Flatten the transient node type enum into a layer width cell with &self loading
* Back the per-node click targets cache with a TransientCache cell
* Unify the per-input and per-export wire caches into one connector-keyed map
* Flip the click target, position, and stack dependent load chains to &self
* Flip the bounding box, import export position, and port load chains to &self
* Flip the wire geometry and resolved type query families to &self
* Flip the hit testing and frontend click target surface to &self
* Flip the frontend assembly, clipboard copy, and chain validation queries to &self
* Load stack dependents before filtering layer-owned nodes out of a selected-nodes shift
* Unify NodeTemplate into a single flat recursive shape with from_parts/into_parts as the storage split points
* Unify the three sole-dependent traversals onto one is_sole_dependent kernel
* Scan network exports for resource values when collecting used resources
* Introduce a NetworkView cursor with typed errors and convert the primitive queries to it
* Convert the composite name, selection, and eligibility queries onto NetworkView
* Add a network interface invariant validator and characterization tests as a refactor safety net
* Characterize stack, chain, layer move, signature edit, and preview behaviors in tests
* Sweep network interface invariants after every message in editor tests
* Deselect deleted layer children by pruning the expanded deletion set from the selection
* Rebuild the document structure on redo to match undo
* Check for cycles in set_input before applying layout side effects rather than reverting after
* Correct the swapped old/new exposure binding names in set_input
* Reload the document structure when an import or export is appended into the first two slots
* Treat toggling preview on a disconnected export as a preview with nothing to restore
* Replace panics on malformed networks with logged errors in the network interface
* Make is_artboard an identity check independent of scene connectivity
* Stop serializing the selection undo and redo history into saved documents
* Run the set_input cycle check before the node-to-node disconnect so a rejected wire swap leaves the graph unchanged