* Impl NetworkMessageHandler
* Repalce Frontend fetch like messages with NetworkMessage
* Reimpl resource loading with NetworkMessage
* Fix wasm
* dedublicate resource requests
* Embedd font resources created by migration
* Fixup
* Fix tests
* Fix font catalog not loading
* Cleanup
* Fix layouts not updating when font catalog is loaded
* Review
* Review
* Cleanup
* Good start
* Impl
* allow responses.add(async { Message::NoOp });
* Fix
* Cache font blob in text node
* Refactor font handling to use Font struct direcly
* Fix fmt
* Embedd Font Resources by default
* Review
* Review
* Cache font info based on ResourceHash
* Use ResourceId for referring to Resources
* Use Doc
* use error for preprocessor ResourceId replacement failure
* Keep hashes in DocumentInfo
* Migrate with less mem copy
* Global ResourceMessage -> ResourceStorageMessage
* Add document ResourceMessage
* Move embedding logic
* Fix
* Cleanup
* Review
* Fix
* Add a recovery path for autosaved documents that don't open successfully
* Fix file naming edge case
* Add edge cases for Windows zip names
* Simplify comments and remove desktop portion
* Add TaggedValue::TypeDefault to avoid baking placeholder Tables into saved documents
* Add TaggedValue::TypeDefault to avoid baking placeholder Tables into saved documents
* Migrate empty Vector/Raster/Graphic/Artboard placeholder values to TypeDefault on load
Documents written before the TypeDefault mechanism existed have empty Table<Vector>/<Raster>/<Graphic>/<Artboard> values baked into every unwired exposed input. Walk each migrated node's inputs and rewrite any such placeholder NodeInput::Value into the equivalent NodeInput::type_default, so re-saved documents shed the placeholder payloads. Marked with a TODO for eventual removal once enough documents have been re-saved.
* Re-save demo artwork
* Remove Graphic and Artboard placeholder containers from TaggedValue
* Remove Raster placeholder TaggedValue variant
* Simplify document migration
* Remove Vector placeholder TaggedValue variant
* Remove NodeIdTable from the TaggedValue
* Remove StringTable from the TaggedValue
* Remove F64Table in place of F64Array in TaggedValue
* Replace TaggedValue::Color(Table<Color>) with ::Color(Option<Color>)
* Replace TaggedValue::GradientTable(Table<GradientStops>) with ::Gradient(GradientStops)
* Replace TaggedValue::BrushStrokeTable(Table<BrushStroke>) with ::BrushStrokes(Vec<BrushStroke>)
* Make TaggedValue::DocumentNode runtime-only with TypeDefault placeholder
* Make TaggedValue::ContextFeatures runtime-only
* Remove Serialize/Deserialize from Table<T>
* Add a widget for TaggedValue::BrushStrokes to visualize strokes and samples
* Define a reusable list of TaggedValue::TypeDefault types for its generated methods
* Re-save demo artwork
* Fix tool overlays and snap targets to use upstream Path node geometry not downstream final geometry
* Snap to upstream Path free points, dedupe the lookup via a helper
* Break out VisualColorPickersInput.svelte
* Break out ColorComparisonInput.svelte and ColorPresetsInput.svelte
* Add backend definitions and plumbing for the 4 new widgets
* Port the ColorPicker.svelte layout and business logic to Rust
* Port more ColorComparisonInput.svelte logic to Rust
* Port more SpectrumInput.svelte logic to Rust
* Port more frontend logic to Rust
* Code review
* Code review
* Fix some CSS
* Rename the 'Identity' node to 'Passthrough' internally
* Rename the 'Memoize' node to 'Cache' internally
* Let skip_impl proto nodes auto-generate as document node definitions
* Remove the wrapper 'Passthrough' node from document_node_definitions.rs
* Remove the wrapper 'Cache' node from document_node_definitions.rs
* Remove the wrapper 'Monitor' node from document_node_definitions.rs
* Remove the wrapper 'Noise Pattern' node from document_node_definitions.rs
* Remove the wrapper 'Brush' node from document_node_definitions.rs
* Remove the wrapper 'Transform' node from document_node_definitions.rs
* Code review improvements
* Rename Cache node back to Memoize
* More code review
* Compensate for upstream row-0 transform absorption in viewport-space 'TransformSet'
* Add 'editor:text_frame' row attribute so the Text tool's drag cage tracks multi-row text
* "Separate Glyph Elements" -> "Separate Glyphs"
* Improve artboard migration robustness from older documents
* Code review
* Make the tools visualize the text frame based on attribute not upstream node
* Add ClickTargetType::CompoundPath variant for fill-rule-aware compound shape hit testing
* Generate one compound click target per Vector so glyph holes aren't treated as filled
* Fix insidenss logic
* Stop pushing duplicate layer entries when re-clicking an already-selected layer
* Make Text node generate per-glyph bounding box click targets
* Show source-geometry outlines and aggregate all rows for layer click targets
* Strip 'editor:click_target' override on Path node so direct edits restore precise hit testing
* Fix inverting a zero-determinate transform
* Fix another panel docking bug where restoring would leave a blank no-panel space
* Improve panel hide/show to restore position, size, and adjacency
* Check full subtree for document panel and avoid double traversal in insert
* Add a pointer hover marker line to the rulers
* Fix rulers and pointer marker when document is flipped
* Reduce duplicate code
* Fix ruler label placement
* Performance