* Make wasm wrapper not depend on editor on native
* Introduce pkg-native
* Fix tests
* Fix fmt
* Correct span and make cargo fmt work inside editor_commands block
* Review
* Fix lint
* Allow using any graphics type for fill
* Adapt gradient/fill property panels and tools to handle List<T>
* Make the initial gradient transform covers the target's bounding box
* Introduce AnyGraphicListDyn to avoid combinatorial explosion
* Allow using any graphics type for stroke paint
* Add FIll node migration
* Add `for_each_vector_list_mut` instead of `set_paint_attribute`
* Adapt paint flow to read and write attributes instead of legacy Fill/Stroke.color
* Fix responsibilities of paint related node input setters
* Fix Morph by storing List<Graphic> for attributes rather than the concrete types
Store fill/stroke paints as List<Graphic> so Color/Gradient transitions
do not hit set_attribute_value_dyn's type-mismatch fallback to default paint.
* Preserve paint attributes in vector editing ops
* Enhance the clarity between direct and chained fill gradients
* Update demo arts
* Consolidate Fill node gradient appearance inputs
* Fix after the cubic review
* Revert "Consolidate Fill node gradient appearance inputs"
This reverts commit 9622feb20196e2c4da99e98ca95dcc2e34c2c98e.
* Replace AnyGraphicListDyn with generic paint connectors on the Fill and Stroke nodes
* Canonicalize paint attribute storage to List<Graphic> with a single write helper
* Fix Solidify Stroke missing fills stored in the legacy style
* Fix Solidify Stroke producing invisible strokes for legacy-only stroke colors
* Fix the initial gradient transform ignoring the bounding box's vertical extent
* Step paint at the morph midpoint instead of dropping it for unmixable pairings
* Remove migration-stage comments
* Clarify the initial gradient transform helper's doc and name
* Correct the bake_paint_transforms doc and prune dead tolerance arms
* Delete the unused Gradient::lerp
* Fix a comment typo
* Thread network paths through the legacy gradient bake so nested fills migrate
* Restore the legacy fill fallback in Expand Fill and Stroke
* Read gradient stops from the node's own input in the Fill properties panel
* Use the transform input constant instead of a hardcoded index
* Remove the unreachable wired color fallback in the Fill properties solid branch
* Narrow the fill overlay redraw check to actual fill inputs
* Coalesce the fill setter's graph runs into a single dispatch
* Position the Gradient Value node inserted for gradient stops
* Bake backup gradient placement during migration
* Persist pending gradient bakes so unfinished migrations retry on reopen
* Migrate the backup gradient's type and spread method
* Harden the gradient-migration pass against document switches and stale bakes
* Keep the Fill properties UI for layerless and nested Fill nodes
* Leave a wired gradient transform input connected instead of overwriting it
* Refuse to start a gradient chain ahead of existing layer content
* Decode a Fill node's gradient through one shared reader
* Nudge a degenerate bounding box so the Fill gradient transform stays invertible
* Broadcast Fill and Stroke paint with a single attribute-column pass
* Fix Morph stepping the target's stroke in near the source instead of the target
* Tidy conventions: clippy get_first, comment periods, sentence-case test messages
* Reattach the gradient orientation doc to its function
* Re-save demo artwork
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Migrate legacy gradients via an isolated measurement pre-pass
Convert legacy bounding-box-relative Fill::Gradient values to absolute
space on document load by measuring each fill's evaluated geometry,
rather than walking each layer's primary flow. The pre-pass scans the
whole root network so fills on secondary branches (e.g. a Copy to Points
instance) and fills in hidden, disabled, or orphaned branches are all
found, redirecting the document export to each fill in turn to force its
branch to evaluate and reading its geometry back from the inspect result.
With every legacy gradient converted before any render, the legacy
bounding-box render path is removed: the ATTR_GRADIENT_LEGACY marker, the
renderer's legacy brush branch, and fill_to_graphic_list's bbox bake all
go away. Gradients nested inside subgraph node networks are out of scope
and warned about.
* Address review: harden gradient migration against stalls and document switches
- Advance the queue on dispatch early returns (missing export or channel
send error) so a failure can't leave the migration permanently stuck
with the document unable to render.
- Tag the migration with its DocumentId: cancel-and-restart when a
different document's migration is requested, and only apply a
measurement to the active document's in-progress migration, so
switching documents mid-migration can't stall or cross-apply.
* Remove nested network non-migration warning
* Cleanup
* Also add migrations for Fill node backup colors
* Apply migrations to the demo art
* Use userSpaceOnUse to render gradient on SVG
* Allow non-uniform transform to radial gradient on vello
* Position gradients absolutely instead of by bbox
* Fix SVG import by removing multiplication of bound's inverse transform
* Represent sheared linear gradients via their equivalent gradient line
* Migration
* Fix migration for radial (elliptical) gradients
* Fix boolean operation gradients
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Add conversion from Fill to Table<Graphic>
* Refactor Vector vello renderer for Gradient / Color
* Refactor Vector SVG renderer for Gradient / Color
* Fix conflicts
* Add basic clipping-based fill for SVG rendering
* Use Cow to avoid cloning graphic list for fill
* Cleanup for Cow usage
* format code
* Use `<pattern>` instead of `<clipPath>` for clip
This simplifies the future implementation of clipping-based rendering
for strokes, as the stroke does not support the use of a clip path but
rather paint sources from a paint server.
* Move svg pattern rendering function to RenderExt
* Fix comment
* Fix empty fill list rendering as default black
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
* Move opaque check function to Graphic impl
* Add color converter and debug node to use graphic
* WIP: Use List<Graphic> to render Color & Gradient
* Use `Arc<List<Vector>>` for vector_data metadata
This exposes List's attributes to message handlers, enabling them to
access the necessary attribute data such as ATTR_STROKE_PAINT_GRAPHIC
as `Fill` and `Stroke` will not have paint information in the future.
* Recurse opacity checks on nested `Graphic`
Also extracts `fill_graphic_list_at` /
`stroke_paint_graphic_list_at` to share the row-attribute
lookup across the existing call sites.
* Fix fill and stroke visibility check degradation
* Fix clipping based stroke paint positioning
* Refactor vello renderer for stroke to use graphic
* Reduce `Fill` / `Stroke.color` to `List<Graphic>` allocations
* Revert "Use `Arc<List<Vector>>` for vector_data metadata"
This reverts commit 4285243a5d
* Expose paint row attributes as dedicated metadata for vectors
Add `fill_attributes` / `stroke_paint_attributes` to `DocumentMetadata`
so the `ExpandFillStrokeOnSelectedLayers` handler can read row paint
visibility without exposing entire `List<Vector>`.
* Fix transparency check to consider fill opacity
* Fix consistency of gradient placement for SVG stroke
* Rename `stroke_paint_..` to `stroke_..`
* Remove debug nodes
* Allow to use any graphic type without casting
* Rename `fill_graphic` / `stroke_graphic` to `fill` / `stroke`
* Fix SVG pattern placement when stroke transform differs from item transform
* Fix click target fill check for empty list in graphic
* Fix blank fill/stroke attribute masking legacy style
* Fix SVG's paint order trick for vector/raster fills
* Add zero-division guard for pattern wraparound prevention
* Code review
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* 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
* 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
* 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
* 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
* Fix hide artboard for raster render mode
* Desktop: Fix transparent viewport blending
* Fix vello render using wrong color space conversion for background
* Review
* Migrate Specta to Tsify to auto-generate messages.ts, working except colors and widgets
* Adopt the generated FillColor/Color/GradientStops
* Fix widget typing
* Separate WidgetGroup enum variants into wrapper structs
* Small rename
* Simplify widgets further
* Clean up message type references
* Switch type imports to the auto-generated file
* Remove lowercase serde rename
* Fix FillChoice deserialization
* Fix small regression from #3837
* Improve type safety
* Make WidgetSpan type-safe
* More cleanup and type safety
* More type safety
* More type safety
* Get the rest to type-check without errors; improve widget builder macro to have optional icons; improve Svelte 5 configs
* Cargo fmt
* Fix imports
* Update outdated readme info
* Fix lint command rename references
* Fix typos
* One more typos fix
* Remove unnecessary dep: prefix from the edited Cargo.toml files
* Remove excess parts from Cargo.toml
* Fix compiling on desktop
* Revert "Remove excess parts from Cargo.toml"
This reverts commit 6b711117b3a5d5d8a3ee20f36a43bc74930b7c82.
* Update dev docs with simpler, more accurate instructions
* Remove Vello from preferences
* Add the Render Mode: SVG Preview radio button
* Remove SVG outline renderer
* Add a tooltip explaination when disabled in unsupported browsers
* Fix Eyedropper tool to support Outline render mode
* Use #[allow(clippy::too_many_arguments)] instead of tuple
* Rerun nodegraph when max render area is changed
---------
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* Make manual_compositon non optional and rename to call_argument
* Fix clippy warnings
* Remove automatic composition compiler infrastructure
* Implement document migration
* Fix tests
* Fix compilation on web
* Fix doble number test
* Remove extra parens
* Cleanup
* Update demo artwork
* Remove last compose node mention
* Remove last mention of manual composition
* Make file name and document name identical
* Add save as action
* Fix test errors
* Add missing save as action
* Desktop fix drop file open document file message
* Address review comments
* Replace file save suffix with file extension
* Add comment specifying that the upload function takes a html input accept string
* Fix remove file extension in web
* Use let
* Don't show save as menu entry in web
* Don't add SaveDocumentAs in web
* Remove file extension on all open document file calls
---------
Co-authored-by: Dennis Kobert <dennis@kobert.dev>