@pixerate/editor 0.112.0 → 0.113.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +6 -0
- package/dist/chunk-4KLT7ZYS.cjs +781 -0
- package/dist/chunk-4KLT7ZYS.cjs.map +1 -0
- package/dist/chunk-LPYOIVLA.js +781 -0
- package/dist/chunk-LPYOIVLA.js.map +1 -0
- package/dist/{export-DBba-buV.d.cts → export-CEXEzqBf.d.cts} +111 -6
- package/dist/{export-DNu_Jr8p.d.ts → export-DIkoK8-r.d.ts} +111 -6
- package/dist/image-editor/index.cjs +872 -285
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +77 -9
- package/dist/image-editor/index.d.ts +77 -9
- package/dist/image-editor/index.js +654 -67
- package/dist/image-editor/index.js.map +1 -1
- package/dist/paint/index.cjs +61 -2
- package/dist/paint/index.cjs.map +1 -1
- package/dist/paint/index.d.cts +29 -2
- package/dist/paint/index.d.ts +29 -2
- package/dist/paint/index.js +60 -1
- package/dist/paint-editor/index.d.cts +3 -3
- package/dist/paint-editor/index.d.ts +3 -3
- package/dist/{blending-DXl06NSx.d.ts → retouch-BXmeSCaB.d.ts} +218 -1
- package/dist/{blending-aOE6Y3UE.d.cts → retouch-CEIKR22W.d.cts} +218 -1
- package/package.json +1 -1
- package/skills/pixerate-image-editor/SKILL.md +30 -6
- package/skills/pixerate-image-editor/references/retouching.md +36 -0
- package/skills/pixerate-vector/SKILL.md +102 -5
- package/dist/chunk-FTBZPI77.cjs +0 -1
- package/dist/chunk-FTBZPI77.cjs.map +0 -1
- package/dist/chunk-VKK5VS2T.js +0 -1
- package/dist/chunk-VKK5VS2T.js.map +0 -1
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -12,6 +12,8 @@ reproduced at the end of this file. Paths are relative to each source repository
|
|
|
12
12
|
|
|
13
13
|
© 2026 ArtCraft Team and the CadCraft contributors.
|
|
14
14
|
|
|
15
|
+
- `crates/engine/src/spatial.rs` (an R-tree over object bounds used by picking, window selection and snaps, built only above 256 objects, reused while the content is the same and rebuilt from unchanged parts after an edit, returning candidates in draw order for the same exact tests a scan runs) → the approach of `VectorRTree`, `vectorSpatialIndex` and `vectorNodesNear` in `packages/core/src/vector/spatial.ts`, used by `hitTestVectorNodes`, marquee selection and snapping to segments; the tree is our own sort-tile-recursive packing (cadcraft uses the `rstar` crate), and unchanged parts are reused by caching each node's bounds by node object; parity tests are our own → `packages/core/tests/vector-spatial.test.ts`
|
|
16
|
+
- `crates/constraints/src/lm.rs` (damped, weighted minimum-norm Gauss–Newton with a numerical Jacobian, `Δx = −W⁻¹Jᵀ(JW⁻¹Jᵀ + μI)⁻¹r`; Gaussian elimination with partial pivoting; Householder QR with column pivoting on row- and column-balanced matrices for rank and null space), `lib.rs` (constraints grouped into connected components, edited geometry weighted to move least, conflicts located by leaving each constraint out, new constraints refused when they do not raise the Jacobian's rank or when a Fix locks parameters already determined), `residual.rs` (the residual forms: point–point, point on line or circle, collinear, parallel, perpendicular, horizontal / vertical, tangent line–circle and circle–circle, symmetric, equal, distance along an axis, angle with its orientation from the starting geometry, radius, diameter), `dof.rs` (remaining degrees of freedom per component, per object by the null space restricted to its parameters, statuses), `auto.rs` (`infer`: coincident points, concentric and tangent circles, horizontal / vertical lines, collinear, connected perpendicular and parallel pairs, equal lengths and radii, in that order) and `expr.rs` (named expressions with `+ - * /`, parentheses and `pi`, evaluated lazily with cycle detection) → `packages/core/src/vector/constraints/lm.ts`, `solve.ts`, `auto.ts` and `expr.ts`; entities and handles became our anchors with stable ids, segments, handles, G1 / G2 joints at anchors and round closed paths, angle-type residuals are scaled to lengths so one tolerance fits all rows, and a solve after every edit weights what changed since the last solve; test cases re-expressed → `packages/core/tests/vector-constraints.test.ts`
|
|
15
17
|
- `crates/geom/src/region.rs` (`enclosing_loop`, `boundary_at_gap` and `build_gap`: curves split at their crossings, gaps between loose ends bridged to the nearest other loose end within reach, a ray from the point meeting edges in order and the face to the left of each traced by always taking the sharpest left turn until a counter-clockwise loop round the point comes back; islands — pieces nested in that face — as holes; `interior_point`) → `PlanarMap.regionAt` and `closeGaps` in `packages/core/src/canvas/pathops/planar.ts` and `fillRegion` in `packages/core/src/vector/controller.ts`; islands are taken per face (the smallest face of another piece around each outer boundary) rather than every group inside the loop, so islands inside islands are not holes; test cases re-expressed → `packages/core/tests/canvas-pathfinder.test.ts`
|
|
16
18
|
- `crates/engine/src/snap/curves.rs` (`Param::solve` with the `perpendicular` and `tangent` conditions: sign changes of sampled conditions narrowed by bisection, near-zero check, degenerate "every point qualifies" case) → `solveOnSegment` and `VectorSnapTargets` perpendicular / tangent snaps in `packages/core/src/vector/snap.ts`
|
|
17
19
|
|
|
@@ -53,6 +55,7 @@ reproduced at the end of this file. Paths are relative to each source repository
|
|
|
53
55
|
- `crates/path/src/ops.rs` (`trim` / `trim_individually` with `trim_intervals` and `Measured::append`: start / end percentages swapped when reversed, an offset in degrees wrapping round, a piece that starts where the last ended continuing it; `pucker_bloat`; `round_corners`; `offset` with copies at `amount · (i + 1 + copy_offset)`; `twist` with subdivided segments and handles mapped through the warp's derivative; `resample` and `emit` (corner bisectors, smooth handles as a fraction of the pieces); `zigzag`; `WiggleParams`, `splitmix`, `hash`, the Catmull-Rom `noise` and `wiggle`; `MergeMode` and `merge`) → `trimPaths`, `trimPathsIndividually`, `puckerBloatPaths`, `offsetPaths`, `twistPaths`, `zigzagPaths`, `wigglePaths` and `mergePaths` in `packages/core/src/vector/pathEffects.ts`; arc lengths come from our `segmentLength` / `trimSegments`, offsets from `offsetPath`, booleans from `pathBoolean`, and Round Corners (`roundCornerPaths`) uses our live-corner maths (a true radius) instead of the port's setback arc; the wiggle's time is a plain parameter; test cases from `crates/path/src/ops/tests.rs` re-expressed → `packages/core/tests/vector-effects.test.ts`
|
|
54
56
|
- `crates/render/src/shapes.rs` (the module's stacking rule — an operator acts on every path above it in its group, nested groups included, and operators below a repeater act on its copies; the `"repeater"` branch of `collect()`: copy i transformed by `translate(position·k) · rotate(rotation·k) · scale^k` about the anchor with `k = i + offset`, opacity ramped from start to end, a fractional count fading the last copy, below / above composite order; Merge Paths painting with the paint below it) → `applyVectorEffects` / `vectorAppearanceShapes` in `packages/core/src/vector/appearance.ts` and `vectorRepeaterCopies` / `repeatPaths` in `packages/core/src/vector/pathEffects.ts`; effects live on path and group nodes rather than as items among paints, each shape painted in its source path's style (merged results in the bottom one's), and the repeater's anchor is an offset from the middle of the shapes' bounds
|
|
55
57
|
- `crates/render/src/shapes.rs` (`GradientRamp::new` / `t`: a radial gradient's focal point and t measured along the ray from it to the circle, the same as SVG `fx` / `fy`) → `vectorGradientFocalParam` in `packages/core/src/vector/gradient.ts`, generalised to SVG's focal circle (`fr`); test cases re-expressed → `packages/core/tests/vector-gradient.test.ts`
|
|
58
|
+
- `crates/text/src/path_text.rs` (`PathMeasure`: the first subpath flattened and measured by arc length, `at` wrapping round closed paths and running straight past the ends of open ones; `place`: a character's pivot on the path, turned perpendicular to it or upright, offset across it; `arc_positions`: pivots placed from the path's start, centred or from its end with first / last margins, or forced over the path) → `measureVectorPath`, `vectorPathAt` and `vectorPathTextPositions` in `packages/core/src/vector/text.ts` and the path frame of `layoutVectorText`; the text's line comes from the shared layout (`src/text/layout.ts`), each character is placed by the middle of its advance, `flip` reverses the path, the baseline can sit on the ascender, descender or centre, and characters past an open path's end are hidden and reported as overflow; test cases re-expressed → `packages/core/tests/vector-text.test.ts`
|
|
56
59
|
- `crates/ui-egui/src/panels/graph.rs` and `graph_tools.rs` (value range frozen while a key is dragged, Shift locks to the axis moved most, `snap_px` nearest candidate within a few screen pixels) → `startChartPointDrag` and `snapChartDragValue` in `packages/core/src/chart/interaction.ts`
|
|
57
60
|
|
|
58
61
|
- `crates/render/src/eval.rs` (`responsive_source_time` with `protected_regions`: when a composition is stretched, protected spans play at their own speed and the rest absorb the change at one shared rate) → `fitMotionScene` and the `fit_animation` tool in `packages/core/src/animation-editor/fit.ts`; whole shots are kept instead of marker spans, and the fit sets each shot's `speed`
|
|
@@ -64,6 +67,7 @@ reproduced at the end of this file. Paths are relative to each source repository
|
|
|
64
67
|
|
|
65
68
|
© 2026 ArtCraft Team and the FigCraft contributors.
|
|
66
69
|
|
|
70
|
+
- `crates/geom/src/lib.rs` (`corner_profile`: a smoothed (squircle) corner reaching (1 + s) times the radius along each side, a circular arc over (1 − s) of the turn and cubic transitions whose lengths `a`, `b`, `c`, `d` come from the arc's tangent; smoothing reduced first when the corner does not fit; `append_corner`) → `smoothCut` in `packages/core/src/vector/corners.ts`, generalised from 90° to any corner angle (the transition's second handle is where the arc's tangent meets the side) and limited to round corners between straight sides; it follows the MIT-licensed figma-squircle algorithm (© 2021 Phamfoo), which figcraft does not credit; test cases our own → `packages/core/tests/vector-corners-strokes.test.ts`
|
|
67
71
|
- `crates/ui-egui/src/present.rs` (`match_layers`: Smart Animate pairs layers by their name path, nested groups pairing their own layers, and fades out what has no partner) → `matchMotionNodes` in `packages/core/src/animation-editor/match.ts`
|
|
68
72
|
- `crates/engine/src/distance.rs` (`between`, `inside`, `to_guide`, `label`) → `packages/core/src/canvas/measure.ts`
|
|
69
73
|
- `crates/engine/src/measure_tests.rs` (test cases re-expressed) → `packages/core/tests/canvas-measure.test.ts`
|
|
@@ -185,6 +189,7 @@ GridCraft. Apache POI is © The Apache Software Foundation, licensed under the A
|
|
|
185
189
|
- `crates/raster/src/lib.rs` (`Surface`: a sparse map of 256 px tiles behind shared pointers with a default pixel, copy-on-write writes that share untouched tiles, uniform tiles stored once, `prune` of tiles equal to the default, `content_bounds`, `translated`, region read / write) → `TiledSurface`, `SurfaceDraft`, `readRegion`, `writeRegion`, `fillRect`, `contentBounds` and `translateSurface` in `packages/core/src/raster/surface.ts`; 8-bit RGBA / 1-byte mask tiles instead of photocraft's pixel formats
|
|
186
190
|
- `crates/paint/src/lib.rs` (`TIP_SHAPE`, `tip_shape`, `soft_exp`, `tip_falloff`, `tip_reach`, `dab_coverage`: Photoshop's measured round tip; `smooth`), `crates/paint/src/dynamics.rs` (`PathWalker`: the first point as a dab, then one every spacing × diameter along the path; `base_diameter` and the Transfer pressure-to-opacity rule) and `crates/paint/src/render.rs` (`rasterize_into` for the round computed tip with a 4 × 4 sub-pixel grid below 3 px; `CoverageMap::accumulate`: flow building up towards each dab's opacity ceiling; `composite`: one composite at the stroke opacity over the pre-stroke pixels, the selection multiplying coverage, the eraser and lock transparency) → `packages/core/src/paint/brush.ts`; only the computed round tip, pressure size and opacity, and simple smoothing are ported (no sampled tips, jitter, texture, dual brush, wet edges or dithering); brush test cases re-expressed → `packages/core/tests/image-layers-paint.test.ts`
|
|
187
191
|
- `crates/paint/src/mixer.rs` (`MixerSettings`, `MixerState`, `PICKUP_RATE`, `apply_mixer_stroke`: per dab, sample the canvas under the footprint by coverage and alpha, move the pickup colour towards it by the pick-up rate × wet, mix the reservoir (weight amount × (1 − mix·wet)) with the pickup (weight mix·wet), deposit at flow × the total weight, drain the reservoir by 8 % × (1 − load) per dab; `load` / `clean`) → `MixerStroke`, `normalizeMixer`, `loadMixer` and `cleanMixer` in `packages/core/src/paint/mixer.ts`; our additions are the pigment mixing model for pickup, paint and deposit, load / clean after each stroke, and tiles in place of photocraft's surfaces (no Sample All Layers or Transfer › Wetness yet); mixer test cases re-expressed → `packages/core/tests/paint-mixer.test.ts`
|
|
192
|
+
- `crates/paint/src/retouch.rs` (the two retouching stroke shapes: accumulate a stroke's coverage and composite paint taken from the pre-stroke state through it, or run dabs in order over a working copy; `Smudge`), `crates/algo/src/retouch.rs` (`tone_curve`, `dodge_burn` with Protect Tones on luma and gamut compression towards luma, `saturation`, `sponge` with vibrance), `crates/algo/src/poisson.rs` (`solve_membrane`: cascadic multigrid with over-relaxed Gauss-Seidel sweeps; `seamless_clone` after Pérez, Gangnet and Blake 2003; `membrane_fill`), `crates/algo/src/inpaint.rs` (`best_offset`: the ring-matched proximity search with a coarse grid and a refinement, a hole summed-area table and a mild distance penalty) and `crates/engine/src/retouch_cmds.rs` (`clone_stamp`, `healing_brush`'s padded coverage and Dirichlet ring, `spot_heal_surface`'s dilated fill domain and heal mask, `tone_stroke`'s tone-once-from-the-original under capped coverage, `per_dab`, the aligned / non-aligned offset) → `packages/core/src/paint/retouch.ts` and `heal.ts`; on 8-bit tiles, translation-only clone sources (no scale, rotation or Clone Source panel), Spot Healing with proximity match or a smooth fill (no content-aware synthesis yet), the Smudge on our `SmudgeTip` and no Blur, Sharpen or History Brush yet; test cases re-expressed → `packages/core/tests/image-retouch.test.ts`
|
|
188
193
|
- `crates/paint/src/procedural.rs` (`smooth`, the tileable `value_noise` on a wrapped lattice, `fbm` doubling the lattice per octave, the `Paper` and `Canvas` pattern styles: fractal noise with per-pixel grain, and an over / under weave of sine threads) and `crates/paint/src/rng.rs` (counter-based randomness: every value a pure hash of seed, index and stream, so a stroke's jitter replays however its points are chunked) → `TileableNoise`, `hash2`, `rand01` in `packages/core/src/paint-editor/noise.ts` and the `cold-pressed` and `canvas` grain patterns in `packages/core/src/paint-editor/paper.ts`; on 32-bit integer hashes instead of SplitMix64, with unequal lattice periods per axis for fibres and streaks; the other paper patterns, the paper library and the grain response of dry media are our own. The paint editor's `PenDabWalker` extends our port of `crates/paint/src/dynamics.rs`'s `PathWalker` (above) with tilt, barrel rotation and velocity
|
|
189
194
|
- `crates/paint/src/symmetry.rs` (`SymmetryMode` vertical / horizontal / dual / diagonal, `PresetSymmetry::directions` with each mode's initial axis and the rotation added, `reflected_passes`: reflection about the centre along each axis plus the point reflection for dual, `segments`: the axes clipped to the document without assuming the centre is inside, and the coordinate limit) → `symmetryAxisAngles`, `symmetryCopies` and `symmetryAxisSegments` in `packages/core/src/paint-editor/guides.ts`, as affine maps of the stroke's points so one stroke paints every copy; our additions are the kaleidoscope (n rotations and the mirrored segments) and perspective guides; symmetry test cases re-expressed → `packages/core/tests/paint-editor-guides.test.ts`
|
|
190
195
|
- `crates/engine/src/layer_mask_props_cmds.rs` and `crates/compose/src/masks.rs` (non-destructive mask density and feather) → `packages/core/src/image-editor/selection/layer-mask.ts`
|
|
@@ -221,6 +226,7 @@ GridCraft. Apache POI is © The Apache Software Foundation, licensed under the A
|
|
|
221
226
|
|
|
222
227
|
© 2026 ArtCraft Team and the VectorCraft contributors.
|
|
223
228
|
|
|
229
|
+
- `crates/doc/src/symbols.rs` (`Symbol { name, art }` and `SymbolInstance { symbol, xf }`: a document's symbols drawn and measured by instances through their own affine transform, art boxes measured per symbol, nesting bounded, and a symbol that would hold itself measured as nothing) → the concepts of `VectorSymbol`, `VectorInstanceNode`, `resolveVectorSymbols` and `vectorInstanceGroup` in `packages/core/src/vector/symbols.ts`; our instances carry their symbol's art resolved, and draw it as a group whose rotation stays rigid while scale and skew are baked into the art (strokes scaled by √|det| unless `scaleStrokes` is false); the editing (Make Symbol, isolation mode, Detach, Replace, overrides) is our own
|
|
224
230
|
- `crates/tools/src/guides.rs` (`snap_scale`) → `packages/core/src/canvas/resizeSnap.ts`
|
|
225
231
|
- `crates/tools/src/guides.rs` (`Targets` gathered once per gesture and kept x / y sorted with `within` bisection lookups; `for_move`, `for_drawing`, `for_handle`, `for_anchor_drag` leaving the moving anchors and their segments out, `push_segments`; the `snap_from` priority — Shift-constrained ray, point, intersection, on-segment, construction angle, x / y alignment — with `slide`, `lined_up`, `on_segment`, `crossing`; `align_rects`, `snap_rects`, `even_spacing`, `gap_marks`; `snap_scale` for rotated boxes; `Leave`, `construction`; the "anchor" / "centre" / "path" / "intersect" / "align" labels) → `packages/core/src/vector/snap.ts`; the curve–curve `meeting` search was not ported (`segmentIntersections` in `packages/core/src/canvas/pathops/boolean.ts` finds every crossing instead)
|
|
226
232
|
- Test cases from `crates/tools/src/guides.rs`, re-expressed → `packages/core/tests/vector-snap.test.ts`
|