Commit Graph

1576 Commits

Author SHA1 Message Date
Keavon Chambers
97324cd852 Fix the Gradient tool breaking the layer deletion hotkey (#4224)
* Fix the Gradient tool breaking the layer deletion hotkey

* Fix
2026-06-10 22:32:39 -07:00
Keavon Chambers
bc1f63ccc6 Add Alt+drag layer duplication to the Layers panel (#4216)
* Add Alt+drag layer duplication to the Layers panel

* Code review
2026-06-08 21:08:16 -07:00
Keavon Chambers
04bca4a877 Fix the Pen tool's preview being misplaced and angle-locked after undo or redo (#4215)
* Fix the Pen tool's preview being misplaced and angle-locked after undo or redo

* Clear the Pen tool's stale angle-lock flag after undo or redo
2026-06-08 13:28:57 -07:00
Vatsal Kumar
cc7d700bfd Fix the Pen tool preview segment disappearing during repeated undo (#3791)
* fix preview line to be visible on multiple undo

* fixed regression issue for last anchor

* Remove unneeded preview-state resync from the Pen tool undo handler

* Prevent a transient vector gap from ending the Pen tool drawing session

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
2026-06-08 11:46:10 -07:00
Jatin Bharti
2835c3b536 Fix the Fill node not restoring its solid color after switching to gradient and back (#4159)
* fix: Fill node solid colour backup update

* chore: refactor
2026-06-08 04:18:10 +00:00
Keavon Chambers
7a6e4f6f25 Fix new nodes being added in the wrong place near graph edges (#4211) 2026-06-07 19:22:30 -07:00
Keavon Chambers
2c29d2c406 Fix Gradient tool inserting new nodes in the wrong position when updating a Fill node's gradient chain (#4203)
* Fix Gradient tool inserting new nodes in the wrong position when updating a Fill node's gradient chain

* Improve robustness
2026-06-05 21:02:42 -07:00
YohYamasaki
a3b62dac00 Make the Gradient tool work with gradient node chains feeding a Fill node (#4177)
* Add Gradient node

* Add support of new Gradient node for Gradient tool

* Adapt gemini reviews

* Add tests

* Bring back visibility check

* Remove the 'Gradient' node since it's unwanted after all

* Formatting

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
2026-06-06 03:23:14 +00:00
Timon
9d2071ce6a Desktop: Disable UI acceleration by default on Linux (#4201) 2026-06-05 22:16:37 +00:00
Timon
08c6d02e5b Introduce network request handler (#4194)
* 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
2026-06-05 13:27:45 -04:00
Timon
cd8ea1f554 Migrate fonts to be stored as resources (#4165)
* 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
2026-06-05 13:27:25 -04:00
Dennis Kobert
7b9c480a8d Make ResourceStorage trait &self-based and remove 'static requirement (#4188)
* Make ResourceStorage trait &self-based with elided-lifetime ResourceFuture

* Adress review comments
2026-06-01 10:37:05 +00:00
Timon
e32ff4b7f0 Make Resource aware of its own hash (#4187)
* Fix future message handler field name

* Add Resource::hash()

* Move all remaining resource types from core-types to graphene-resources

* Review
2026-05-31 23:08:01 +00:00
Dennis Kobert
78679a5ba2 Implement editor level future message handler (#4182)
* Implement proper editor level async message handler

* Take application_io and wake callback as Editor::new arguments

* Rename AsyncMessage -> FutureMessage

* add DesktopWrapperMessage::Wake

---------

Co-authored-by: Timon <me@timon.zip>
2026-05-31 21:26:29 +00:00
Timon
a40e0d2887 Use ResourceId for referring to Resources (#4176)
* 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
2026-05-29 10:56:32 +00:00
Timon
bbbe04903f Define data types for ID-based resource handling (#4168)
* Add resource lib

* rename ResourceSource to ResourceInput

* Rename ResourceInput -> DataSource and improve API

* Review

---------

Co-authored-by: Dennis Kobert <dennis@kobert.dev>
2026-05-25 10:50:57 +00:00
Keavon Chambers
62287d7893 Add a recovery path for autosaved documents that don't open successfully (#4157)
* 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
2026-05-22 21:14:28 -07:00
Timon
2770df7567 Implement content-addressed resource storage for raster images (#4148)
* Implement content-addressed resource storage

* Implement OPFS resource storage

* Remove ResourceStorage::read

* Review
2026-05-21 19:31:07 +00:00
Timon
d5f0140f26 Upgrade WGPU and Linebender dependencies (#4154) 2026-05-17 15:36:59 +00:00
Keavon Chambers
c4a978009a Fix SVG import treating gamma-encoded colors as linear-light 2026-05-16 05:37:01 -07:00
Keavon Chambers
06e2a049de Implement dragging layers into the group/new/delete buttons in the Layers panel (#4153) 2026-05-15 15:39:01 -07:00
Keavon Chambers
16c7544d96 Add the Layer > Expand Fill/Stroke menu action (#4151)
* Add the Layer > Expand Fill/Stroke menu action

* Code review feedback
2026-05-15 13:10:50 -07:00
Keavon Chambers
a56746c6bf Deprecate all usages of the Color struct representing gamma space values, fixing round-trip precision bugs (#4149)
* Deprecate all usages of the Color struct representing gamma space values, fixing round-trip precision bugs

* Code review fixes
2026-05-14 22:48:33 -07:00
Keavon Chambers
1c9c19a697 Simplify and standardize how data types are presented in user-facing strings (#4147)
* User-facing type formatting

* Parse unicode not ASCII chars
2026-05-14 00:56:43 -07:00
Keavon Chambers
696b625a3e Fix hover transfer bugs occurring with the color picker popover (#4146)
* Fix hover transfer bugs occurring with the color picker popover

* Code review fix
2026-05-13 20:19:56 -07:00
Keavon Chambers
4d5dce976e Replace the control bar's stroke weight with a full stroke properties popover (#4145)
* Replace the control bar's stroke weight with a full stroke properties popover

* Code review
2026-05-13 03:58:12 -07:00
Keavon Chambers
629a1f4b4c Redesign how the control bar handles fill and stroke colors (#4137)
* Revamp how the control bar handles fill and stroke colors

* Fix bugs

* Code review
2026-05-11 18:13:02 -07:00
Keavon Chambers
a28b9437aa Rename the "Table" type to "List" everywhere (#4133)
* Rename the "Table" type to "List" everywhere

* Fix a few missed ones

* Re-save demo artwork
2026-05-09 01:33:39 -07:00
Keavon Chambers
6b3e4757de Rename the Table type's "rows" -> "items" and "columns" -> "attributes" everywhere (#4130)
* Rename TableRow -> Item

* Rename row -> item and column -> attribute throughout

* Fix a few missed ones

* Format
2026-05-08 23:11:33 -07:00
Keavon Chambers
cb21e5960b Remove serialization from Table<T> and make TaggedValue only store tooling/widget node inputs (#4129)
* 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
2026-05-08 16:11:25 -07:00
Timon
d97fe835b5 Desktop: Focus app window when loading a document (#4124) 2026-05-08 15:00:20 +00:00
Keavon Chambers
9d876ab27d Add support for opening multiple selected files from disk (#4128) 2026-05-07 21:21:45 -07:00
Keavon Chambers
dff8ac5511 Remove code for the deprecated and unused Curve type (#4127)
* Remove the unused Curve type

* Fix frontend
2026-05-07 16:16:19 -07:00
Keavon Chambers
0834bff2da Make the Brush node store its cache as internal #[data] state instead of a serialized node input (#4126)
* Make the Brush node store its cache as internal #[data] state instead of a serialized node input

* Remove BrushCacheImpl::unique_id
2026-05-07 15:34:21 -07:00
Keavon Chambers
525e49f7e9 Make the Shape tool's modes' parameter controls sync with the selected shape layer (#4121)
* Make the Shape tool's modes' parameter controls sync with the selected shape layer

* Fix populating the Shape tool mode selection list
2026-05-07 02:42:39 -07:00
Keavon Chambers
1596469e92 Make the drawing tools' Weight control sync with the selected layer (#4120) 2026-05-07 02:12:38 -07:00
Keavon Chambers
9512f7df41 Make the Gradient tool default to the primary/secondary working colors as its initial gradient (#4119)
* Make the Gradient tool default to the primary/secondary working colors as its initial gradient

* Fix drawing direction
2026-05-07 01:41:01 -07:00
Keavon Chambers
24c857ddc7 Make the Text tool control bar font family, style, and size sync with the selected layer (#4118)
* Fix contenteditable preview alignment

* Make the Text tool control bar font family, style, and size sync with the selected layer

* Tidying up
2026-05-06 20:50:41 -07:00
Keavon Chambers
2ae35a67e7 Add icons for text alignment/justification 2026-05-06 19:26:26 -07:00
Jatin Bharti
c0a8241f50 Add text last-line alignment modes for "Justify Center", "Justify Right", and "Justify All" (#4024)
* feat: Add justify proper alignments(right/left/centre/all)

* chore: fmt

* chore: refactor

* Cleanup

* Fix crash when changing selected layer's alignment from the Text tool control bar

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
2026-05-06 19:16:19 -07:00
Keavon Chambers
d106bedecd Fix Pen tool regression that broke dragging a sharp tangent out of the last-placed anchor (#4115) 2026-05-06 03:16:24 -07:00
Keavon Chambers
ecf94258fa Fix tool overlays and snap targets to use upstream Path node geometry, not downstream final geometry (#4114)
* 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
2026-05-06 03:00:38 -07:00
Keavon Chambers
9565d43481 Include stroke thickness in the bounds of document exports sized to fit "All Artwork" or "Selection" (#4112)
* Include stroke thickness in the bounds of document exports sized to fit "All Artwork" or "Selection"

* Code review fixes
2026-05-06 02:05:19 -07:00
Keavon Chambers
644e9cf91e New nodes: 'Attach Attribute' and 'Read Attribute *' (#4100)
* New nodes: 'Zip Attribute' and 'Read Attribute {Vector, Number, Bool, String, Transform, Color, Blend Mode, Gradient Type, Spread Method}

* Cleanup

* Reduce type explosion
2026-05-05 04:03:41 -07:00
Keavon Chambers
9db91a1ac4 Use the SpectrumInput widget for the adjustment node Properties panel layouts (#4105) 2026-05-05 03:42:44 -07:00
Keavon Chambers
e59612c4ce Port the color picker popover to a Rust-defined layout (#4102)
* 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
2026-05-05 02:47:53 -07:00
Keavon Chambers
21e5e06b0b Clean up document message wrappers around proto nodes so they're now used directly (#4101)
* 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
2026-05-03 19:26:36 -07:00
Keavon Chambers
ebdb835890 Properly track the Text node's text frame via the attribute system to fix misalignment (#4097)
* 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
2026-05-02 21:04:30 -07:00
Keavon Chambers
de2ae29edd Improve click targets to use compound paths so interior negative space is excluded (#4096)
* 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
2026-05-02 18:47:43 -07:00
Keavon Chambers
325e9aff06 Add custom click targets to make Text node output easier to select (#4095)
* 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
2026-05-02 18:12:42 -07:00