Commit Graph
100 Commits
Author SHA1 Message Date
Keavon Chambers a35143586a Add the "Perceptual" and "Classic" families of gradient spaces with OkLab as the new default (#4415)
* 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
2026-09-14 12:58:40 +02:00
Keavon Chambers 11dfc27645 Make gradient evaluation follow the ramp's interpolation space attribute (#4414) 2026-09-14 12:58:39 +02:00
Keavon Chambers 3678826a48 Give whole-expanse gradient layers a transform cage based on the gradient line (#4413) 2026-09-14 12:58:37 +02:00
Keavon Chambers f8975b7d94 Add a gradient interpolation space attribute with sRGB Gamma (existing) and sRGB Linear (new) (#4412)
* 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
2026-09-14 12:58:36 +02:00
Keavon Chambers ea6f45ddc0 Fix node shaking causing an offset from the pointer for the rest of the drag (#4411) 2026-09-14 12:58:34 +02:00
Keavon Chambers c71f78edb5 Add a Clear gradient spread that cuts off to transparency beyond the ends (#4410) 2026-09-14 12:58:32 +02:00
Keavon Chambers 344e24f0c2 Bind the Gradient tool's spread to the gradient value's ramp instead of a Gradient Spread node (#4409) 2026-09-14 12:58:30 +02:00
Keavon Chambers ba5b25112b Build radio widget entries from choice type metadata so variants display their icons (#4408)
* 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
2026-09-14 12:58:29 +02:00
Keavon Chambers b635e6fa02 Let the Fill and Gradient tools paint blank layers with whole-expanse colors and gradients (#4407)
* 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
2026-09-14 12:58:27 +02:00
Keavon Chambers 4da366acf1 Rename gradient type to gradient form (#4405)
* Rename gradient type to gradient form

* Update the demo art for the gradient form rename

* Say form not type in the Gradient Form node's doc comment
2026-09-14 12:58:26 +02:00
Keavon Chambers 167da6a210 Rename spread method to gradient spread so it matches the other gradient attribute names (#4404)
* 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
2026-09-14 12:58:24 +02:00
Keavon Chambers 27f1e8a65b Move the gradient-focused nodes from the Color category to a new Gradient category (#4403) 2026-09-14 12:58:23 +02:00
Keavon Chambers c5cb466e28 Move the gradient spread method into GradientRamp and the color picker popover (#4402)
* 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
2026-09-14 12:58:22 +02:00
Keavon Chambers 6480de274e Ban the null literal via ESLint and replace existing usages with undefined or truthiness checks (#4401) 2026-09-14 12:58:21 +02:00
Keavon Chambers 360321e0ce Wrap serialized gradient stops in a new GradientRamp struct and unify FillChoice (#4400)
* 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
2026-09-14 12:58:19 +02:00
Keavon Chambers 4d8729d87c Add a drill-in button beside Data panel gradient preview widgets (#4398) 2026-09-14 12:58:18 +02:00
Keavon Chambers 86d4106592 Rework Gradient into a newtype of List<Color> with optional position and midpoint attributes (#4397)
* 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
2026-09-14 12:58:16 +02:00
Keavon Chambers b78e4b107e Remove custom (de)serializers from the DashPattern and BoxCorners TaggedValue variants (#4394)
Replace the DashPattern and BoxCorners custom serde impls with storage-shaped Vec<f64> TaggedValue payloads
2026-09-14 12:58:15 +02:00
Keavon Chambers 69148d1b36 Replace raw node input indices with compile-time parameter symbols (#4387)
* 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
2026-09-14 12:58:14 +02:00
Keavon Chambers e39782c957 Fix the math parser's implicit multiplication precedence and other regressions from the rewrite (#4383)
* Fix parsing regressions, make parsing 2.5x faster than the old pest parser, and clean up the math-parser rewrite

* Fix review findings: whitespace-juxtaposed numbers, mixed real/complex logic, correctly rounded literals, unified NaN truthiness, and gcd/lcm range checks
2026-09-14 12:58:12 +02:00
Keavon Chambers c77359bedf Add a Connect Cells option to the 'Grid' node (#4374)
Add a Connect Cells option to the Grid node
2026-09-14 12:57:19 +02:00
Keavon Chambers 24ba1e047c Box big enum variants to satisfy Clippy's lint warnings (#4292)
* 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`
2026-09-14 12:57:18 +02:00
Keavon Chambers cd03202060 Deduplicate the network interface query helpers and collapse TransientMetadata into TransientCache (#4382)
* 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
2026-09-14 12:57:18 +02:00
Keavon Chambers b6accaf4bd Fix wrong-input disconnects, ghost wire caches, and partial import removal in the network interface (#4381)
* 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
2026-09-14 12:57:17 +02:00
Keavon Chambers e666838580 Move session state out of the network interface caches and replace the selection hijacks with explicit parameters (#4379)
* 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
2026-09-14 12:57:16 +02:00
Keavon Chambers 09f8864450 Make the network interface's queries take &self instead of &mut self (#4378)
* 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
2026-09-14 12:57:16 +02:00
Keavon Chambers d03adcae83 Replace NodeTemplate's parallel node and metadata trees with a single flat recursive shape (#4377)
* 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
2026-09-14 12:57:15 +02:00
Keavon Chambers 72b3a883a7 Introduce the NetworkView read cursor with typed errors and convert the network queries onto it (#4376)
* Introduce a NetworkView cursor with typed errors and convert the primitive queries to it

* Convert the composite name, selection, and eligibility queries onto NetworkView
2026-09-14 12:57:14 +02:00
Keavon Chambers 81398ca0cb Make double-clicking a text layer begin editing in shallow select mode, not just deep select mode (#4373) 2026-09-14 12:57:14 +02:00
Keavon Chambers fded44c293 Break apart the enormous network_interface.rs into submodules (#4371)
Split the network interface monolith into submodules with no behavior change
2026-09-14 12:57:13 +02:00
Keavon Chambers 79944bd6d0 Add additional tests to the network interface (#4370)
* 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
2026-09-14 12:57:12 +02:00
Keavon Chambers ff18b33362 Fix assorted node graph correctness bugs and replace network interface panics with logged errors (#4364)
* 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
2026-09-14 12:57:12 +02:00
Keavon Chambers f4609e0e3b Improve number fields/labels in the UI to filter out floating point noise and truncate at correct precision (#4363)
* Improve the displayed precision of float number labels

* Show actual tiny values in high-precision number fields
2026-09-14 12:57:11 +02:00
Keavon Chambers 31239f77c6 Make the 'Angle Between' node report the signed angle and fix its zero-vector output (#4362) 2026-09-14 12:57:10 +02:00
Keavon Chambers 85dd39c35b New nodes: 'Sign', 'Distance', 'Cross Product', and 'Lerp' (#4361) 2026-09-14 12:57:09 +02:00
Keavon Chambers 28f8325a64 Add Vec2 support to the scalar math operator nodes (#4360)
* Add Vec2 support to the scalar math operator nodes

* Support the scalar-with-Vec2 operand order in the Exponent, Root, Logarithm, Min, Max, and Clamp nodes

* Detect an f32 base of e in the Logarithm node despite inexact widening to f64
2026-09-14 12:57:09 +02:00
Keavon Chambers 5dbcdaf0c2 Fix the 'Divide' node dividing partially-zero Vec2 denominators and the 'Logarithm' node misdetecting base e (#4359) 2026-09-14 12:57:08 +02:00
Keavon Chambers 83d24251d7 Rename the nodes 'Length' -> 'Magnitude', 'Flatten Path' -> 'Combine Paths', 'Vec2 Value' -> 'Combine Vec2', and add a new 'Vec2 Value' node (#4349)
* Rename the node 'Length' -> 'Magnitude'

* Rename the node 'Flatten Path' -> 'Combine Paths'

* Replace the node 'Vec2 Value' with 'Combine Vec2' and add a new 'Vec2 Value' that's actually a vec2

* Update demo artwork
2026-09-14 12:57:07 +02:00
Keavon Chambers 095f169b2f New nodes: 'Voronoi Cells', 'Tesselate', and 'Relax Points' (#4345) 2026-09-14 12:57:06 +02:00
Keavon ChambersandDennis Kobert cba642a7a1 New nodes: Sum, Average, Minimum, Maximum, Any, All (#4344)
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
2026-09-14 12:57:05 +02:00
Keavon ChambersandDennis Kobert 67690d22d4 Convert the node catalog to rank-polymorphic kernels, materialize stored values as ranked wires, and display wire rank in the graph
Co-authored-by:    Dennis Kobert <dennis@kobert.dev>
2026-09-14 12:57:05 +02:00
Keavon Chambers 5bc41c4c58 Reshape the node catalog: rename the list access nodes, split Text to Vector, reinstate Upload Texture as a proto node, and delete the vestigial debug nodes 2026-09-14 12:57:04 +02:00
Keavon Chambers 7ddab438d1 Split Fill's optional transform into a has-transform toggle and add the DashPattern and BoxCorners value types 2026-09-14 12:57:03 +02:00
Keavon Chambers 6acc0638e4 Add Graphic::None and store paint choices as plain color, gradient, and no-paint values 2026-09-14 12:57:02 +02:00
Keavon Chambers fd7f67b3e9 Rename GradientStops to Gradient and the legacy Gradient/Fill structs to LegacyGradient/LegacyFill 2026-09-14 12:57:01 +02:00
Keavon Chambers e40fe7843d Exclude teardown metrics from executors in the gungraun benchmark functions (#4336) 2026-07-15 05:29:48 -07:00
Keavon Chambers 97a43e66fb Split up Wasm binaries so Cloudflare deployments stay below 25 MB per file 2026-07-14 14:43:34 -07:00
Keavon Chambers f82b0a8fca Switch production builds from -Os to -Oz to avoid 25 MB deployment limit (#4309) 2026-07-04 14:25:38 -07:00
Keavon Chambers f05a644bd9 Revamp the syntax to #[hard(a..b)] and #[soft(a..b)] bounds on node definitions (#4307)
* Revamp the syntax to #[hard(a..b)] and #[soft(a..b)] bounds on node definitions

* Address review feedback: error on empty bounds ranges and remove redundant count clamps

* Fix NaN transform from Repeat Array with a count of 1

* Remove redundant manual clamps already enforced by #[hard(...)] bounds
2026-07-03 18:48:58 -07:00
Keavon Chambers 95c1ab81f3 Prep for the RC6 release of the desktop app 2026-07-01 04:55:57 -07:00
Keavon Chambers 7ae7bda3d3 Add persistence to the collapsed state of Properties panel node sections (#4300)
* Add persistence to the collapsed state of Properties panel node sections

* Improve comments

* Fix generator node handling with #4299
2026-07-01 04:54:39 -07:00
Keavon Chambers 1648e33c1f Implement dragging to reorder Properties panel node sections (#4299)
* Implement dragging to reorder Properties panel node sections

* Code review
2026-07-01 03:39:52 -07:00
Keavon Chambers 7c870d9426 Fix skewed linear gradient layers ignoring the horizontal shear axis in Vello 2026-06-30 21:48:51 -07:00
Keavon Chambers 3e674c939b Revamp the stand-in for embedded YouTube videos on the website 2026-06-30 01:42:40 -07:00
Keavon Chambers 2a3f1a12a8 Fix nondeterministic Vector point IDs from the 'As Vector' node 2026-06-29 23:52:51 -07:00
Keavon Chambers 244b25708d Add color picker gradient color stop duplication by holding Alt (#4291)
* Add color picker gradient color stop duplication by holding Alt

* Fix bugs

* Bug fix
2026-06-28 17:34:27 -07:00
Keavon Chambers fa27d53b98 Add a Vite plugin to auto-prefix -webkit-user-select so it's not so often forgotten (#4288)
* Add a Vite plugin to auto-prefix -webkit-user-select so it's not so often forgotten

* Enforce a property boundary on the left
2026-06-28 00:20:26 -07:00
Keavon Chambers cc465d6f2a Fix the 'Separate Subpaths' node dropping a layer's transform when it has no subpaths (#4289)
Fix the Separate Subpaths node dropping a layer's transform when it has no subpaths
2026-06-27 23:42:25 -07:00
Keavon Chambers ebbbb6bd1b Fix the Shift-drag alignment guide anchoring to the prior selection instead of the dragged layer (#4278) 2026-06-23 02:28:06 -07:00
Keavon Chambers 1158d93bb4 Migrate legacy gradients via an isolated measurement pre-pass (#4268)
* 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
2026-06-22 16:59:22 -07:00
Keavon Chambers c1fa8ba8da Move NumberInput.svelte input processing from JS to Rust (#4274)
* Move NumberInput.svelte input processing from JS to Rust

* Fix edge cases
2026-06-22 14:57:11 -07:00
Keavon Chambers b286e89746 Make the Pen tool's preview segment follow the cursor during a G/R/S handle transform (#4269) 2026-06-22 01:37:23 -07:00
Keavon Chambers 1f05000238 Exclude viewport zoom from influencing scale in the Transform node set by the drawing tools (#4260)
* Keep viewport zoom out of drawing tools' Transform node

* Simplify window-aligned transform helpers and fix spline DragStop fallback
2026-06-21 12:09:21 -07:00
Keavon Chambers 194c5b2222 Fix the Select tool's transform dial not working on rotated layers (#4259) 2026-06-20 15:05:30 -07:00
Keavon Chambers e8f9413e03 Fix double-clicking a gradient stop under snapping influence not opening color picker (#4258)
* Fix double-clicking a gradient stop under snapping influence not opening color picker

* Simplify
2026-06-20 14:48:26 -07:00
Keavon Chambers 13abf9fa8c Make vector mesh branch detection and free-point click targets O(n) instead of O(n^2) (#4255)
* Make is_branching and free-point click targets O(n) instead of O(n^2)

* usize -> u8

* Fix profiling CI treating performance improvements as regressions
2026-06-18 21:52:02 -07:00
Keavon Chambers 5b008936d2 Make the node graph's "Merge Selected Nodes" target the right-clicked node, and fix it crashing (#4252) 2026-06-17 22:31:06 -07:00
Keavon Chambers 9a9436c5b9 Fix "Untitled Document {N}" numbering progression when another doc includes that substring (#4253)
* Fix "Untitled Document {N}" numbering progression when another doc includes that substring

* Fix names with non-numeric suffixes blocking the base name
2026-06-17 22:00:31 -07:00
Keavon Chambers a5e7a4f905 Simplify comments on the Color struct 2026-06-15 22:20:31 -07:00
Keavon Chambers 9f01e54a9b Add layer and artboard nudge resizing (#4242)
* Add layer and artboard nudge resizing

* Improve bounding box validation for layer resizing to ensure only finite bounds are considered
2026-06-15 21:37:40 -07:00
Keavon Chambers 8b8cac23d1 Remove layer and artboard nudge resizing 2026-06-15 18:51:15 -07:00
Keavon Chambers 82879c7a08 Simplify helper function signatures in document_message_handler.rs 2026-06-15 17:11:01 -07:00
Keavon Chambers 3414b32d5e Remove dead code from the unused curves adjustment widget 2026-06-15 14:46:43 -07:00
Keavon Chambers 971d1fb16b Fix loading documents saved before #4129 with raster images appearing missing 2026-06-15 11:19:21 -07:00
Keavon Chambers 34e0fd7757 Replace the 'Vec2 to Point' node with automatic conversion machinery (#4236)
* Replace the 'Vec2 to Point' node with an 'As Vector' node and automatic conversion

* Accept a Vec2 as content for the Wrap Graphic node

* Rename the type-assertion nodes from 'To' to 'As'

* Fix the Transform node reversing a Vec2 input's direction

* Fix text migration bug
2026-06-14 21:44:08 -07:00
Keavon Chambers cde8dd78e6 Remove stray float literal .0 suffixes in lieu of just ending with a point (#4233)
Remove the .0 suffix on floats in lieu of just ending with a point
2026-06-12 19:47:36 -07:00
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 f658665d4a Fix CI deploying all PR preview builds to dev.graphite.art
Fixes a regression introduced in 9dccc526b
2026-06-10 16:18:41 -07:00
Keavon Chambers a7171f5939 Stop flatten_graphic_list() from adding unused attributes (#4220) 2026-06-10 14:37:14 -07:00
Keavon Chambers 863b1f9993 Fix opacity attributes from defaulting to 0 rather than 1 (#4219)
* Fix opacity attribute padding to default to 1 instead of 0

* Perf fixes
2026-06-09 23:00:57 -07:00
Keavon Chambers 02a40a860f Add a wave propagation ripple effect to the website navbar (#4150)
* WIP: Website navbar ripple

* Fix performance and other bugs

* Make the navbar ripple's active button explicitly inert
2026-06-08 23:15:12 -07:00
Keavon Chambers b4e04e616a Fix the SVG renderer not representing skewed raster images (#4218)
Fix the SVG renderer not skewing raster images to fit their bounds
2026-06-08 21:28:38 -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
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 85ee5e41b9 Fix strokes with inside/outside alignment not being selectable when above other layers (#4207) 2026-06-07 17:08:04 -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
Keavon Chambers d0d9a350c7 Add new May 2026 release update video to website home page 2026-05-23 02:04:59 -04:00
Keavon Chambers 9dccc526bb Add the May 2026 release message to the welcome screen 2026-05-23 01:41:42 -04:00
Keavon Chambers 96be4ec351 Add an "Initializing Renderer…" overlay when Vello shader compilation is slow on web 2026-05-23 01:07:26 -04: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
Keavon Chambers 21d2994059 Fix 'Solidify Strokes' node to produce dashed segments in an ordered sequence per open subpath (#3820)
Fix the ordering of dashed segments of open paths with the 'Solidify Stroke' node
2026-05-17 10:56:40 -07:00
Keavon Chambers c4a978009a Fix SVG import treating gamma-encoded colors as linear-light 2026-05-16 05:37:01 -07:00
Keavon Chambers 256dd26b99 Recognize ExtractPosition/InjectPosition in the node macro context analyzer
Also, fix migration missing alias
2026-05-16 01:40:49 -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 79df7cfa87 Implement dragging the visibility/lock icons in the Layers panel to toggle each (#4152)
* Implement dragging the visibility/lock icons in the Layers panel to toggle each

* Code review fixes
2026-05-15 15:16:40 -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