@pixerate/editor 0.130.0 → 0.132.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.
Files changed (72) hide show
  1. package/dist/animation-editor/index.cjs +55 -55
  2. package/dist/animation-editor/index.d.cts +4 -4
  3. package/dist/animation-editor/index.d.ts +4 -4
  4. package/dist/animation-editor/index.js +2 -2
  5. package/dist/{bezier-CigmusV_.d.ts → bezier-0IHDCvv_.d.ts} +1 -1
  6. package/dist/{bezier-CdoGygwG.d.cts → bezier-oCBfrGDG.d.cts} +1 -1
  7. package/dist/canvas/index.d.cts +7 -7
  8. package/dist/canvas/index.d.ts +7 -7
  9. package/dist/{chunk-PMHPXCJC.cjs → chunk-55UEZIU4.cjs} +119 -90
  10. package/dist/chunk-55UEZIU4.cjs.map +1 -0
  11. package/dist/{chunk-L5OTIYOO.js → chunk-ECVI5QRE.js} +2 -2
  12. package/dist/{chunk-ERYGCA72.js → chunk-G5FX56KX.js} +39 -10
  13. package/dist/{chunk-ERYGCA72.js.map → chunk-G5FX56KX.js.map} +1 -1
  14. package/dist/{chunk-PRYMC442.js → chunk-IEYXYMRQ.js} +255 -10
  15. package/dist/chunk-IEYXYMRQ.js.map +1 -0
  16. package/dist/{chunk-2PXRKMOH.cjs → chunk-OYPJGGF3.cjs} +36 -36
  17. package/dist/{chunk-2PXRKMOH.cjs.map → chunk-OYPJGGF3.cjs.map} +1 -1
  18. package/dist/{chunk-LXGOYRPE.cjs → chunk-YYJKIESX.cjs} +320 -75
  19. package/dist/chunk-YYJKIESX.cjs.map +1 -0
  20. package/dist/effects/index.d.cts +4 -4
  21. package/dist/effects/index.d.ts +4 -4
  22. package/dist/{export-B4r8b9Ft.d.ts → export-ByJvAvR7.d.ts} +26 -4
  23. package/dist/{export-5WDKJqTy.d.cts → export-CfAogLEr.d.cts} +1 -1
  24. package/dist/{export-CU_ARP3A.d.ts → export-Crl82sbE.d.ts} +1 -1
  25. package/dist/{export-CejjC2iI.d.cts → export-D-gkjBkB.d.cts} +26 -4
  26. package/dist/{helpers-X_rycLNJ.d.ts → helpers-BCd2-PAR.d.ts} +34 -1
  27. package/dist/{helpers-CzZu51eI.d.cts → helpers-CoIeXQnW.d.cts} +34 -1
  28. package/dist/image-editor/index.cjs +775 -723
  29. package/dist/image-editor/index.cjs.map +1 -1
  30. package/dist/image-editor/index.d.cts +8 -8
  31. package/dist/image-editor/index.d.ts +8 -8
  32. package/dist/image-editor/index.js +59 -7
  33. package/dist/image-editor/index.js.map +1 -1
  34. package/dist/index.cjs +11 -4
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.js +11 -4
  37. package/dist/index.js.map +1 -1
  38. package/dist/{opentype-DlRMYcCW.d.cts → opentype-BDahNRTe.d.cts} +1 -1
  39. package/dist/{opentype-CrHAsKh3.d.ts → opentype-BQFEvy-t.d.ts} +1 -1
  40. package/dist/paint-editor/index.cjs +7 -7
  41. package/dist/paint-editor/index.d.cts +5 -5
  42. package/dist/paint-editor/index.d.ts +5 -5
  43. package/dist/paint-editor/index.js +2 -2
  44. package/dist/{pathfinder-CKfKOVP4.d.cts → pathfinder-01ZgAwqV.d.cts} +1 -1
  45. package/dist/{pathfinder-Dlss70hL.d.ts → pathfinder-DaVdT8jq.d.ts} +1 -1
  46. package/dist/{pool-DDOo0xJH.d.ts → pool-D2A3WTt9.d.ts} +1 -1
  47. package/dist/{pool-DKic69LD.d.cts → pool-D6a45MoE.d.cts} +1 -1
  48. package/dist/{svg-BRaii3pI.d.cts → svg-CcDz7Zq2.d.cts} +2 -2
  49. package/dist/{svg-BYVZeVo0.d.ts → svg-DELNVerw.d.ts} +2 -2
  50. package/dist/{tools-CtheDLDr.d.cts → tools-BFvkFnRj.d.cts} +1 -1
  51. package/dist/{tools-D8bZ-7YG.d.ts → tools-D7ws-OKL.d.ts} +1 -1
  52. package/dist/vector/index.cjs +1136 -1014
  53. package/dist/vector/index.cjs.map +1 -1
  54. package/dist/vector/index.d.cts +63 -10
  55. package/dist/vector/index.d.ts +63 -10
  56. package/dist/vector/index.js +129 -7
  57. package/dist/vector/index.js.map +1 -1
  58. package/dist/video-editor/index.d.cts +4 -4
  59. package/dist/video-editor/index.d.ts +4 -4
  60. package/dist/{warp-CZVC8pB5.d.ts → warp-2N9wkOkL.d.ts} +1 -1
  61. package/dist/{warp-BFoYxy_s.d.cts → warp-DErXW5rz.d.cts} +1 -1
  62. package/package.json +2 -2
  63. package/skills/pixerate-image-editor/SKILL.md +6 -2
  64. package/skills/pixerate-image-editor/references/color-management.md +1 -1
  65. package/skills/pixerate-image-editor/references/photoshop-files.md +2 -2
  66. package/skills/pixerate-image-editor/references/retouching.md +9 -1
  67. package/skills/pixerate-vector/SKILL.md +17 -0
  68. package/skills/pixerate-vector/references/commands.md +19 -0
  69. package/dist/chunk-LXGOYRPE.cjs.map +0 -1
  70. package/dist/chunk-PMHPXCJC.cjs.map +0 -1
  71. package/dist/chunk-PRYMC442.js.map +0 -1
  72. /package/dist/{chunk-L5OTIYOO.js.map → chunk-ECVI5QRE.js.map} +0 -0
@@ -1,11 +1,11 @@
1
- import { V as VideoProject, a as VideoAnimatable, b as VideoAsset, c as VideoAssetProxy, d as VideoClip, e as VideoClipAnimation, f as VideoClipEffect, g as VideoEffectRef, h as VideoEffectValues, i as VideoGrade, j as VideoGradeLut, k as VideoKeyframes, l as VideoMarker, m as VideoSequence, n as VideoTrack, o as VideoTranscriptWord, p as VideoTransform, q as VideoTransition, v as videoKeysOf, r as VideoTrackKind, s as VideoPlacementMode, t as VideoKeyframeProperty, u as VideoKey, w as VideoMediaClip, x as VideoEffectsEngine, y as VideoLayer, z as VideoFrame, A as VideoRect, B as VideoEffectPlace, C as VideoFfmpegOptions, D as VideoFfmpegExport, E as VideoEdlOptions, F as VideoFadeCurve, G as VideoFit, H as VideoBlendMode, I as VideoAssetKind, J as VideoClipAnimationEffect, K as VideoTransitionType } from '../export-5WDKJqTy.cjs';
2
- export { L as VIDEO_BLEND_MODES, M as VIDEO_CLIP_ANIMATION_EFFECTS, N as VIDEO_CLIP_TYPES, O as VIDEO_EASE_NAMES, P as VIDEO_EFFECT_PLACES, Q as VIDEO_FADE_CURVES, R as VIDEO_FITS, S as VIDEO_KEYFRAME_LIMITS, T as VIDEO_KEYFRAME_PROPERTIES, U as VIDEO_PLACEMENT_MODES, W as VIDEO_TRANSFORM_PROPERTIES, X as VIDEO_TRANSITION_TYPES, Y as VIDEO_WIPE_DIRECTIONS, Z as VideoAudioSource, _ as VideoClipType, $ as VideoColorClip, a0 as VideoEase, a1 as VideoEffectClip, a2 as VideoEffectJob, a3 as VideoEffectUse, a4 as VideoEffectsEngineOptions, a5 as VideoLayerEffect, a6 as VideoLoudnessMeasurement, a7 as VideoLoudnessTarget, a8 as VideoSequenceClip, a9 as VideoTextClip, aa as VideoWipeDirection, ab as checkVideoEffectPlace, ac as checkVideoEffectValues, ad as ffmpegFilterValue, ae as isVideoKeyframes, af as mixEffectPixels, ag as overEffectPixels, ah as parseVideoLoudnessMeasurement, ai as placeVideoRect, aj as removeVideoKey, ak as retimeVideoAnimatable, al as setVideoKey, am as sortVideoKeys, an as splitVideoAnimatable, ao as toVideoEdl, ap as toVideoFfmpeg, aq as toVideoLoudnessMeasure, ar as videoClipEffectUses, as as videoClipSoundGain, at as videoEaseBezier, au as videoEaseProgress, av as videoEffectFrameTime, aw as videoEffectLayerKey, ax as videoEffectValuesAt, ay as videoFadeCurveGain, az as videoFfmpegUnsupportedEffects, aA as videoFrameAt, aB as videoFrameLeafLayers, aC as videoKeyframeBreakpoints, aD as videoKeyframeFfmpegExpr, aE as videoLayersUseEffects, aF as videoLayersWithoutTransitionEffects, aG as videoProjectEffects, aH as videoShellQuote, aI as videoTextStyle, aJ as videoTitleFrame, aK as videoTransformAt, aL as videoTransitionAudioCurve, aM as videoTransitionEase, aN as videoValueAt } from '../export-5WDKJqTy.cjs';
1
+ import { V as VideoProject, a as VideoAnimatable, b as VideoAsset, c as VideoAssetProxy, d as VideoClip, e as VideoClipAnimation, f as VideoClipEffect, g as VideoEffectRef, h as VideoEffectValues, i as VideoGrade, j as VideoGradeLut, k as VideoKeyframes, l as VideoMarker, m as VideoSequence, n as VideoTrack, o as VideoTranscriptWord, p as VideoTransform, q as VideoTransition, v as videoKeysOf, r as VideoTrackKind, s as VideoPlacementMode, t as VideoKeyframeProperty, u as VideoKey, w as VideoMediaClip, x as VideoEffectsEngine, y as VideoLayer, z as VideoFrame, A as VideoRect, B as VideoEffectPlace, C as VideoFfmpegOptions, D as VideoFfmpegExport, E as VideoEdlOptions, F as VideoFadeCurve, G as VideoFit, H as VideoBlendMode, I as VideoAssetKind, J as VideoClipAnimationEffect, K as VideoTransitionType } from '../export-CfAogLEr.cjs';
2
+ export { L as VIDEO_BLEND_MODES, M as VIDEO_CLIP_ANIMATION_EFFECTS, N as VIDEO_CLIP_TYPES, O as VIDEO_EASE_NAMES, P as VIDEO_EFFECT_PLACES, Q as VIDEO_FADE_CURVES, R as VIDEO_FITS, S as VIDEO_KEYFRAME_LIMITS, T as VIDEO_KEYFRAME_PROPERTIES, U as VIDEO_PLACEMENT_MODES, W as VIDEO_TRANSFORM_PROPERTIES, X as VIDEO_TRANSITION_TYPES, Y as VIDEO_WIPE_DIRECTIONS, Z as VideoAudioSource, _ as VideoClipType, $ as VideoColorClip, a0 as VideoEase, a1 as VideoEffectClip, a2 as VideoEffectJob, a3 as VideoEffectUse, a4 as VideoEffectsEngineOptions, a5 as VideoLayerEffect, a6 as VideoLoudnessMeasurement, a7 as VideoLoudnessTarget, a8 as VideoSequenceClip, a9 as VideoTextClip, aa as VideoWipeDirection, ab as checkVideoEffectPlace, ac as checkVideoEffectValues, ad as ffmpegFilterValue, ae as isVideoKeyframes, af as mixEffectPixels, ag as overEffectPixels, ah as parseVideoLoudnessMeasurement, ai as placeVideoRect, aj as removeVideoKey, ak as retimeVideoAnimatable, al as setVideoKey, am as sortVideoKeys, an as splitVideoAnimatable, ao as toVideoEdl, ap as toVideoFfmpeg, aq as toVideoLoudnessMeasure, ar as videoClipEffectUses, as as videoClipSoundGain, at as videoEaseBezier, au as videoEaseProgress, av as videoEffectFrameTime, aw as videoEffectLayerKey, ax as videoEffectValuesAt, ay as videoFadeCurveGain, az as videoFfmpegUnsupportedEffects, aA as videoFrameAt, aB as videoFrameLeafLayers, aC as videoKeyframeBreakpoints, aD as videoKeyframeFfmpegExpr, aE as videoLayersUseEffects, aF as videoLayersWithoutTransitionEffects, aG as videoProjectEffects, aH as videoShellQuote, aI as videoTextStyle, aJ as videoTitleFrame, aK as videoTransformAt, aL as videoTransitionAudioCurve, aM as videoTransitionEase, aN as videoValueAt } from '../export-CfAogLEr.cjs';
3
3
  import { A as AnimationPlayer, C as Clock } from '../player-CmbY3218.cjs';
4
4
  import { b as AnimationLoopMode } from '../evaluate-BsxYieLN.cjs';
5
5
  import { H as HistoryManager } from '../HistoryManager-DeQQMBCj.cjs';
6
- import { v as EffectsSlot, E as EffectProvider, f as EffectDescription, e as EffectValue } from '../helpers-CzZu51eI.cjs';
6
+ import { v as EffectsSlot, E as EffectProvider, f as EffectDescription, e as EffectValue } from '../helpers-CoIeXQnW.cjs';
7
7
  import { a as AgentToolProvider } from '../registry-BqA1AZt0.cjs';
8
- import { A as AppliedEffectInfo } from '../tools-CtheDLDr.cjs';
8
+ import { A as AppliedEffectInfo } from '../tools-BFvkFnRj.cjs';
9
9
  import '../easing-lM0Xo9Ni.cjs';
10
10
  import '../types-DsiXGmjo.cjs';
11
11
  import '../schema-Di0CS6Pe.cjs';
@@ -1,11 +1,11 @@
1
- import { V as VideoProject, a as VideoAnimatable, b as VideoAsset, c as VideoAssetProxy, d as VideoClip, e as VideoClipAnimation, f as VideoClipEffect, g as VideoEffectRef, h as VideoEffectValues, i as VideoGrade, j as VideoGradeLut, k as VideoKeyframes, l as VideoMarker, m as VideoSequence, n as VideoTrack, o as VideoTranscriptWord, p as VideoTransform, q as VideoTransition, v as videoKeysOf, r as VideoTrackKind, s as VideoPlacementMode, t as VideoKeyframeProperty, u as VideoKey, w as VideoMediaClip, x as VideoEffectsEngine, y as VideoLayer, z as VideoFrame, A as VideoRect, B as VideoEffectPlace, C as VideoFfmpegOptions, D as VideoFfmpegExport, E as VideoEdlOptions, F as VideoFadeCurve, G as VideoFit, H as VideoBlendMode, I as VideoAssetKind, J as VideoClipAnimationEffect, K as VideoTransitionType } from '../export-CU_ARP3A.js';
2
- export { L as VIDEO_BLEND_MODES, M as VIDEO_CLIP_ANIMATION_EFFECTS, N as VIDEO_CLIP_TYPES, O as VIDEO_EASE_NAMES, P as VIDEO_EFFECT_PLACES, Q as VIDEO_FADE_CURVES, R as VIDEO_FITS, S as VIDEO_KEYFRAME_LIMITS, T as VIDEO_KEYFRAME_PROPERTIES, U as VIDEO_PLACEMENT_MODES, W as VIDEO_TRANSFORM_PROPERTIES, X as VIDEO_TRANSITION_TYPES, Y as VIDEO_WIPE_DIRECTIONS, Z as VideoAudioSource, _ as VideoClipType, $ as VideoColorClip, a0 as VideoEase, a1 as VideoEffectClip, a2 as VideoEffectJob, a3 as VideoEffectUse, a4 as VideoEffectsEngineOptions, a5 as VideoLayerEffect, a6 as VideoLoudnessMeasurement, a7 as VideoLoudnessTarget, a8 as VideoSequenceClip, a9 as VideoTextClip, aa as VideoWipeDirection, ab as checkVideoEffectPlace, ac as checkVideoEffectValues, ad as ffmpegFilterValue, ae as isVideoKeyframes, af as mixEffectPixels, ag as overEffectPixels, ah as parseVideoLoudnessMeasurement, ai as placeVideoRect, aj as removeVideoKey, ak as retimeVideoAnimatable, al as setVideoKey, am as sortVideoKeys, an as splitVideoAnimatable, ao as toVideoEdl, ap as toVideoFfmpeg, aq as toVideoLoudnessMeasure, ar as videoClipEffectUses, as as videoClipSoundGain, at as videoEaseBezier, au as videoEaseProgress, av as videoEffectFrameTime, aw as videoEffectLayerKey, ax as videoEffectValuesAt, ay as videoFadeCurveGain, az as videoFfmpegUnsupportedEffects, aA as videoFrameAt, aB as videoFrameLeafLayers, aC as videoKeyframeBreakpoints, aD as videoKeyframeFfmpegExpr, aE as videoLayersUseEffects, aF as videoLayersWithoutTransitionEffects, aG as videoProjectEffects, aH as videoShellQuote, aI as videoTextStyle, aJ as videoTitleFrame, aK as videoTransformAt, aL as videoTransitionAudioCurve, aM as videoTransitionEase, aN as videoValueAt } from '../export-CU_ARP3A.js';
1
+ import { V as VideoProject, a as VideoAnimatable, b as VideoAsset, c as VideoAssetProxy, d as VideoClip, e as VideoClipAnimation, f as VideoClipEffect, g as VideoEffectRef, h as VideoEffectValues, i as VideoGrade, j as VideoGradeLut, k as VideoKeyframes, l as VideoMarker, m as VideoSequence, n as VideoTrack, o as VideoTranscriptWord, p as VideoTransform, q as VideoTransition, v as videoKeysOf, r as VideoTrackKind, s as VideoPlacementMode, t as VideoKeyframeProperty, u as VideoKey, w as VideoMediaClip, x as VideoEffectsEngine, y as VideoLayer, z as VideoFrame, A as VideoRect, B as VideoEffectPlace, C as VideoFfmpegOptions, D as VideoFfmpegExport, E as VideoEdlOptions, F as VideoFadeCurve, G as VideoFit, H as VideoBlendMode, I as VideoAssetKind, J as VideoClipAnimationEffect, K as VideoTransitionType } from '../export-Crl82sbE.js';
2
+ export { L as VIDEO_BLEND_MODES, M as VIDEO_CLIP_ANIMATION_EFFECTS, N as VIDEO_CLIP_TYPES, O as VIDEO_EASE_NAMES, P as VIDEO_EFFECT_PLACES, Q as VIDEO_FADE_CURVES, R as VIDEO_FITS, S as VIDEO_KEYFRAME_LIMITS, T as VIDEO_KEYFRAME_PROPERTIES, U as VIDEO_PLACEMENT_MODES, W as VIDEO_TRANSFORM_PROPERTIES, X as VIDEO_TRANSITION_TYPES, Y as VIDEO_WIPE_DIRECTIONS, Z as VideoAudioSource, _ as VideoClipType, $ as VideoColorClip, a0 as VideoEase, a1 as VideoEffectClip, a2 as VideoEffectJob, a3 as VideoEffectUse, a4 as VideoEffectsEngineOptions, a5 as VideoLayerEffect, a6 as VideoLoudnessMeasurement, a7 as VideoLoudnessTarget, a8 as VideoSequenceClip, a9 as VideoTextClip, aa as VideoWipeDirection, ab as checkVideoEffectPlace, ac as checkVideoEffectValues, ad as ffmpegFilterValue, ae as isVideoKeyframes, af as mixEffectPixels, ag as overEffectPixels, ah as parseVideoLoudnessMeasurement, ai as placeVideoRect, aj as removeVideoKey, ak as retimeVideoAnimatable, al as setVideoKey, am as sortVideoKeys, an as splitVideoAnimatable, ao as toVideoEdl, ap as toVideoFfmpeg, aq as toVideoLoudnessMeasure, ar as videoClipEffectUses, as as videoClipSoundGain, at as videoEaseBezier, au as videoEaseProgress, av as videoEffectFrameTime, aw as videoEffectLayerKey, ax as videoEffectValuesAt, ay as videoFadeCurveGain, az as videoFfmpegUnsupportedEffects, aA as videoFrameAt, aB as videoFrameLeafLayers, aC as videoKeyframeBreakpoints, aD as videoKeyframeFfmpegExpr, aE as videoLayersUseEffects, aF as videoLayersWithoutTransitionEffects, aG as videoProjectEffects, aH as videoShellQuote, aI as videoTextStyle, aJ as videoTitleFrame, aK as videoTransformAt, aL as videoTransitionAudioCurve, aM as videoTransitionEase, aN as videoValueAt } from '../export-Crl82sbE.js';
3
3
  import { A as AnimationPlayer, C as Clock } from '../player-BK2kKbfd.js';
4
4
  import { b as AnimationLoopMode } from '../evaluate-BbCeF6pt.js';
5
5
  import { H as HistoryManager } from '../HistoryManager-DWSLd6Tf.js';
6
- import { v as EffectsSlot, E as EffectProvider, f as EffectDescription, e as EffectValue } from '../helpers-X_rycLNJ.js';
6
+ import { v as EffectsSlot, E as EffectProvider, f as EffectDescription, e as EffectValue } from '../helpers-BCd2-PAR.js';
7
7
  import { a as AgentToolProvider } from '../registry-D-4fit9C.js';
8
- import { A as AppliedEffectInfo } from '../tools-D8bZ-7YG.js';
8
+ import { A as AppliedEffectInfo } from '../tools-D7ws-OKL.js';
9
9
  import '../easing-lM0Xo9Ni.js';
10
10
  import '../types-DsiXGmjo.js';
11
11
  import '../schema-Di0CS6Pe.js';
@@ -1,4 +1,4 @@
1
- import { B as BezierPath } from './bezier-CigmusV_.js';
1
+ import { B as BezierPath } from './bezier-0IHDCvv_.js';
2
2
  import { W as WarpStyle, a as WarpMesh, V as Vec2, B as Box } from './types-CwMPoRMU.js';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { B as BezierPath } from './bezier-CdoGygwG.cjs';
1
+ import { B as BezierPath } from './bezier-oCBfrGDG.cjs';
2
2
  import { W as WarpStyle, a as WarpMesh, V as Vec2, B as Box } from './types-CwMPoRMU.cjs';
3
3
 
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor",
3
- "version": "0.130.0",
3
+ "version": "0.132.0",
4
4
  "description": "UI-agnostic rich text and media editing core library",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -191,7 +191,7 @@
191
191
  "@tiptap/extension-underline": "^2.11.5",
192
192
  "@tiptap/starter-kit": "^2.11.5",
193
193
  "@tiptap/suggestion": "^2.11.5",
194
- "markdown-it": "^15.0.2",
194
+ "markdown-it": "^15.0.3",
195
195
  "markdown-it-task-lists": "^2.1.1",
196
196
  "prosemirror-markdown": "^1.13.8"
197
197
  },
@@ -193,7 +193,8 @@ The working space, Assign / Convert to Profile with intents, soft proofing with
193
193
  and colour conversions for print briefs: read [references/color-management.md](references/color-management.md).
194
194
  ### Retouching
195
195
 
196
- Clone Stamp, Healing Brush, Spot Healing, Smudge, Dodge, Burn and Sponge: retouch on an empty
196
+ Clone Stamp, Healing Brush, Spot Healing, Smudge, Dodge, Burn, Sponge, Blur, Sharpen and the
197
+ History Brush: retouch on an empty
197
198
  layer with `sample: "current-below"`, pick `spot_heal` for small spots, `heal_brush` for larger
198
199
  flaws and `clone_stamp` to copy exactly, and keep strokes short and soft. Read
199
200
  [references/retouching.md](references/retouching.md) before retouching.
@@ -396,7 +397,10 @@ in the source frame at the document's bit depth, colour mode and profile. Read
396
397
  | `dodge` | Lighten what `points` cover, most in `range` shadows \| midtones \| highlights, at `exposure` 0..1 (overlaps in one stroke never exceed it); `protectTones` keeps hue and saturation. Alpha kept. One undo step. Returns the layer, channel, `bounds` and dabs. |
397
398
  | `burn` | As `dodge`, darkening. |
398
399
  | `sponge` | Desaturate (`mode` desaturate, default) or saturate what `points` cover; `vibrance` damps clipping; passes compound, `brush.flow` sets each pass's strength. Pixels only. One undo step. Returns the layer, channel, `bounds` and dabs. |
399
- | `get_retouch_options` | Read-only. The retouching defaults (`aligned`, `sample`, `spotType`, `range`, `exposure`, `protectTones`, `spongeMode`, `vibrance`, `strength`) and the `cloneSource` `{x, y, offset}` or null. Call before a clone or heal stroke without `source`. |
400
+ | `blur_stroke` | Soften what `points` cover (`strength` 0..1 × brush opacity) on pixels or a mask. One undo step. Returns the layer, channel, `bounds` and dab count. Check with `capture_view`. |
401
+ | `sharpen_stroke` | Crisp what `points` cover (an unsharp mask at `strength`; keep it 0.2..0.5). One undo step. Returns the layer, channel, `bounds` and dab count. |
402
+ | `history_brush` | Paint the layer (or mask) back as it was `historySteps` undo steps ago (0 = oldest kept state) along `points`. Fails if the layer did not exist then. One undo step. Returns the layer, channel, `bounds` and dab count. |
403
+ | `get_retouch_options` | Read-only. The retouching defaults (`aligned`, `sample`, `spotType`, `range`, `exposure`, `protectTones`, `spongeMode`, `vibrance`, `strength`, `historySteps`) and the `cloneSource` `{x, y, offset}` or null (an aligned stroke samples at the brush plus `offset`; the editors show it as a crosshair). Call before a clone or heal stroke without `source`. |
400
404
  | `set_retouch_options` | Set those defaults (view state, not an undo step); each stroke tool can override them per call. Changing `aligned` clears the kept offset. Returns the options. |
401
405
  | `set_clone_source` | Set the clone source `{x, y}` in document px (the Alt-click), or remove it with `clear: true`. View state. The next `clone_stamp` / `heal_brush` fixes the offset from its first point. Returns the source. |
402
406
  | `fill_pixels` | Fill the selection (or the canvas without one / with `useSelection: false`) on pixels or a mask with `color`, `opacity`, `blend`. Returns the changed bounds. |
@@ -22,7 +22,7 @@ means sRGB. The viewport assumes an sRGB display and converts other working spac
22
22
  look with `capture_view`; adjust (lower saturation in the greyed areas); then `off: true`.
23
23
  5. **Print documents**: `set_color_mode` `cmyk` with the press profile makes the document a
24
24
  CMYK one: you keep editing RGB, the viewport proofs through the press, and `export_psd`
25
- writes a CMYK PSD (the separation uses `intent`). Opening a CMYK PSD does this for you. Check
25
+ writes a CMYK PSD (the separation uses `intent`), at 16 bits for a 16- or 32-bit document. Opening a CMYK PSD does this for you. Check
26
26
  out-of-gamut colours with `set_proof_setup` `gamutWarning` before exporting.
27
27
  6. **Numbers for a print brief**: `convert_colors` gives CMYK percentages (values × 100) and
28
28
  Lab for any `#rrggbb`, without changing the document.
@@ -28,8 +28,8 @@
28
28
  in linear light). Layer masks keep the depth too: 16- and 32-bit masks open and save at depth,
29
29
  blend with their full precision, and the brush, eraser, `fill_pixels` and `clear_pixels` paint
30
30
  them at depth (retouching on a mask stays 8-bit). Layer filters (develop, blur) and layer
31
- effects composite at depth in merges, `compositeDeepPixels` and the exported merged image (a
32
- group's effects and legacy-process develop filters stay 8-bit). The viewport always shows
31
+ effects (a group's too) composite at depth in merges, `compositeDeepPixels` and the exported
32
+ merged image; smart objects render their contents and smart filters at 8 bits. The viewport always shows
33
33
  the 8-bit rendering. Afterwards work with `list_layers` as
34
34
  usual: there is no Background source image, every pixel comes from the layers.
35
35
  4. **Smart objects come in live**: embedded contents (a PSB opens as a nested document you can
@@ -24,6 +24,14 @@
24
24
  eyes), `saturate` adds it; passes compound, so use a low `brush.flow`.
25
25
  6. **Smudge** drags colour along the stroke like a finger in wet paint (`strength` how far); for
26
26
  blending paint colours use the Mixer Brush instead.
27
+ 7. **Blur and sharpen locally**: `blur_stroke` softens (a background, a harsh edge, skin texture)
28
+ and `sharpen_stroke` crisps (eyes, a detail). Keep `strength` low (sharpen 0.2..0.5) and check
29
+ with `capture_view`; for the whole layer use a layer filter instead. Dabs in one stroke do not
30
+ compound; another stroke goes further.
31
+ 8. **Take back part of a change** with `history_brush`: it paints the layer as it was
32
+ `historySteps` undo steps back (0, the default, is the oldest state history keeps). Filter or
33
+ grade the whole layer, then paint the original back where it should not apply. It fails when the
34
+ layer did not exist in that state; read `historySteps` from how many steps you have made since.
27
35
 
28
36
  ## Pitfalls
29
37
 
@@ -33,4 +41,4 @@
33
41
  - `heal_brush` and `spot_heal` show a plain clone or a dark trail while a person draws and blend
34
42
  when the stroke ends; through the tools the result is already blended.
35
43
  - `dodge`, `burn`, `sponge` and `smudge` ignore `brush.opacity` (exposure, flow and strength set
36
- their strength) and `brush.blend`. The Sponge refuses masks, which have no colour.
44
+ their strength) and `brush.blend`; `blur_stroke` and `sharpen_stroke` multiply it by `strength`. The Sponge refuses masks, which have no colour.
@@ -325,6 +325,23 @@ the browser's shaper they are kept but not drawn until outlines are available.
325
325
  | `vector.enterSymmetry` | Hand the canvas to the user drawing inside a symmetry group (pen, pencil, shapes, text go in, mirrored live). Returns `{ id }`. |
326
326
  | `vector.exitSymmetry` | Stop drawing inside it. |
327
327
 
328
+ ### Perspective drawing
329
+
330
+ | Command | Use it to |
331
+ | --- | --- |
332
+ | `vector.getPerspective` | Read the grid (`vanishingPoints`, `origin`, `gridSize`, `extent`, `visible`), its `planes` and `drawingOn`. |
333
+ | `vector.setPerspective` | Set a 1-, 2- or 3-point grid: vanishing points on the horizon, the origin below where the planes meet. Returns the grid. |
334
+ | `vector.removePerspective` | Remove the grid (art stays). |
335
+ | `vector.setPerspectivePlane` | Make the rectangle, ellipse, polygon and star tools (the user's drags) draw on a plane, or flat with `null`. |
336
+ | `vector.attachToPerspective` | Project objects onto a plane: draw them flat next to the origin (x right, y up from it), then attach. Use for signs on walls, tiles on floors, windows. Returns `{ ids }`. |
337
+
338
+ ### Lenses
339
+
340
+ | Command | Use it to |
341
+ | --- | --- |
342
+ | `vector.setLens` | Make closed paths lenses (`type` magnify, fisheye, brighten, invert, tintedGrayscale, colorAdd, colorLimit, heatMap, wireframe, transparency; `amount`, `color`) or change them. What is below shows changed inside the outline and follows every edit; bounds stay the lens's own. Use for loupes, callouts, "X-ray" wireframes, duotone windows. Returns `{ lenses: [{ id, lens }] }`. |
343
+ | `vector.removeLens` | Make lenses plain paths again. Returns `{ ids }`. |
344
+
328
345
  ### Masks and clipping
329
346
 
330
347
  | Command | Use it to |
@@ -161,3 +161,22 @@ fill; an unfilled stroked path takes part as the area its stroke paints. Pathfin
161
161
  `outline` also run on a single path; the other operations need two or more overlapping paths. Shape Builder
162
162
  `points` should come from `vector.shapeBuilderFaces` (`point` of each face) so a click lands
163
163
  inside the intended face.
164
+
165
+ ## Lenses
166
+
167
+ `vector.setLens` types, their `amount` and `color`. Missing values take these defaults; switching type resets to them.
168
+
169
+ | Type | amount (default) | color | What shows inside the lens |
170
+ | --- | --- | --- | --- |
171
+ | magnify | 1–20 times (2) | – | The backdrop scaled about the lens centre. |
172
+ | fisheye | −100…100 (50) | – | Bulged (positive) or pinched (negative); the lens edge stays put. |
173
+ | brighten | −100…100 % (40) | – | Lighter, or darker for negative amounts. |
174
+ | invert | 0–100 % strength (100) | – | Inverted colours. |
175
+ | tintedGrayscale | 0–100 % (100) | `#b45309` | Brightness as dark → tint → white (a duotone). |
176
+ | colorAdd | 0–100 % (50) | `#ff0000` | The colour added. |
177
+ | colorLimit | 0–100 % (100) | `#22c55e` | Only the colour let through. |
178
+ | heatMap | 0–100 % palette turn (0) | – | Brightness on a cold-to-hot palette. |
179
+ | wireframe | 0–100 % opacity (100) | `#0f172a` | Outlines only, 1 unit wide. |
180
+ | transparency | 0–100 % see-through (50) | – | The lens's own fill, see-through. |
181
+
182
+ The lens shows what is drawn before it (below it), follows edits there, and keeps its own bounds. Move it with `vector.transform` like any path. Remove it with `vector.removeLens`.