@pixerate/editor 0.228.2 → 0.230.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 (64) hide show
  1. package/dist/animation-editor/camera-tools.d.cts +10 -0
  2. package/dist/animation-editor/camera-tools.d.ts +10 -0
  3. package/dist/animation-editor/camera.d.cts +67 -0
  4. package/dist/animation-editor/camera.d.ts +67 -0
  5. package/dist/animation-editor/compile.d.cts +4 -0
  6. package/dist/animation-editor/compile.d.ts +4 -0
  7. package/dist/animation-editor/controller.d.cts +34 -2
  8. package/dist/animation-editor/controller.d.ts +34 -2
  9. package/dist/animation-editor/effect-tools.d.cts +2 -1
  10. package/dist/animation-editor/effect-tools.d.ts +2 -1
  11. package/dist/animation-editor/evaluate.d.cts +9 -0
  12. package/dist/animation-editor/evaluate.d.ts +9 -0
  13. package/dist/animation-editor/flair.d.cts +8 -0
  14. package/dist/animation-editor/flair.d.ts +8 -0
  15. package/dist/animation-editor/index.cjs +603 -217
  16. package/dist/animation-editor/index.d.cts +2 -0
  17. package/dist/animation-editor/index.d.ts +2 -0
  18. package/dist/animation-editor/index.js +454 -68
  19. package/dist/animation-editor/issues.d.cts +16 -0
  20. package/dist/animation-editor/issues.d.ts +16 -0
  21. package/dist/animation-editor/tools.d.cts +1 -1
  22. package/dist/animation-editor/tools.d.ts +1 -1
  23. package/dist/animation-editor/types.d.cts +21 -3
  24. package/dist/animation-editor/types.d.ts +21 -3
  25. package/dist/canvas/index.cjs +7 -7
  26. package/dist/canvas/index.js +1 -1
  27. package/dist/{chunk-2XGW6DKL.cjs → chunk-5VQXSS2S.cjs} +8 -2
  28. package/dist/{chunk-IGPEBXUD.cjs → chunk-A57ZQDNN.cjs} +7 -7
  29. package/dist/{chunk-K5GXW5TR.cjs → chunk-C73U5UI3.cjs} +14 -14
  30. package/dist/{chunk-EBDZWIOP.cjs → chunk-ERJA5CGT.cjs} +5 -1
  31. package/dist/{chunk-SWKXPAJC.js → chunk-JVNGCS26.js} +7 -1
  32. package/dist/{chunk-LPTFDCJO.js → chunk-ONNNNGNS.js} +1 -1
  33. package/dist/{chunk-5MQOBTNP.cjs → chunk-OPSK22DL.cjs} +80 -9
  34. package/dist/{chunk-PB6JV62G.js → chunk-SBPGIZQN.js} +1 -1
  35. package/dist/{chunk-UGYUGZE2.js → chunk-TCZ2J7PR.js} +71 -0
  36. package/dist/{chunk-W4KFNAWC.js → chunk-TYCJGFCF.js} +5 -1
  37. package/dist/effects/helpers.d.cts +35 -1
  38. package/dist/effects/helpers.d.ts +35 -1
  39. package/dist/effects/index.cjs +60 -44
  40. package/dist/effects/index.js +18 -2
  41. package/dist/effects/types.d.cts +15 -0
  42. package/dist/effects/types.d.ts +15 -0
  43. package/dist/image-editor/controller.d.cts +12 -0
  44. package/dist/image-editor/controller.d.ts +12 -0
  45. package/dist/image-editor/geometry.d.cts +6 -0
  46. package/dist/image-editor/geometry.d.ts +6 -0
  47. package/dist/image-editor/index.cjs +837 -738
  48. package/dist/image-editor/index.js +117 -18
  49. package/dist/image-editor/tool-groups.d.cts +57 -9
  50. package/dist/image-editor/tool-groups.d.ts +57 -9
  51. package/dist/image-editor/types.d.cts +3 -1
  52. package/dist/image-editor/types.d.ts +3 -1
  53. package/dist/paint-editor/index.cjs +13 -13
  54. package/dist/paint-editor/index.js +3 -3
  55. package/dist/vector/index.cjs +6 -6
  56. package/dist/vector/index.js +1 -1
  57. package/dist/video-editor/index.cjs +318 -318
  58. package/dist/video-editor/index.js +4 -4
  59. package/package.json +1 -1
  60. package/skills/pixerate-animation-editor/SKILL.md +28 -1
  61. package/skills/pixerate-animation-motion-graphics/SKILL.md +3 -0
  62. package/skills/pixerate-image-editor/SKILL.md +1 -0
  63. package/skills/pixerate-video-editor/SKILL.md +16 -1
  64. package/skills/pixerate-video-montage/SKILL.md +2 -1
@@ -143,6 +143,22 @@ export declare const MOTION_ISSUE_CODES: {
143
143
  readonly severity: "note";
144
144
  readonly wording: "A camera rectangle has a different shape from the artwork, so it is letterboxed.";
145
145
  };
146
+ readonly 'camera-move-first-shot': {
147
+ readonly severity: "note";
148
+ readonly wording: "The first shot cuts to its framing, so the move its camera gets in with does not play.";
149
+ };
150
+ readonly 'camera-move-not-played': {
151
+ readonly severity: "note";
152
+ readonly wording: "A shot names a camera move, but there is no effects provider with camera moves to play it, so the camera eases instead.";
153
+ };
154
+ readonly 'camera-move-unknown': {
155
+ readonly severity: "error";
156
+ readonly wording: "A shot names a camera move the effects provider does not have, or one of the wrong role.";
157
+ };
158
+ readonly 'camera-move-values': {
159
+ readonly severity: "error";
160
+ readonly wording: "A camera move's preset or values do not fit its controls.";
161
+ };
146
162
  };
147
163
  export type MotionIssueCode = keyof typeof MOTION_ISSUE_CODES;
148
164
  export interface MotionIssue {
@@ -143,6 +143,22 @@ export declare const MOTION_ISSUE_CODES: {
143
143
  readonly severity: "note";
144
144
  readonly wording: "A camera rectangle has a different shape from the artwork, so it is letterboxed.";
145
145
  };
146
+ readonly 'camera-move-first-shot': {
147
+ readonly severity: "note";
148
+ readonly wording: "The first shot cuts to its framing, so the move its camera gets in with does not play.";
149
+ };
150
+ readonly 'camera-move-not-played': {
151
+ readonly severity: "note";
152
+ readonly wording: "A shot names a camera move, but there is no effects provider with camera moves to play it, so the camera eases instead.";
153
+ };
154
+ readonly 'camera-move-unknown': {
155
+ readonly severity: "error";
156
+ readonly wording: "A shot names a camera move the effects provider does not have, or one of the wrong role.";
157
+ };
158
+ readonly 'camera-move-values': {
159
+ readonly severity: "error";
160
+ readonly wording: "A camera move's preset or values do not fit its controls.";
161
+ };
146
162
  };
147
163
  export type MotionIssueCode = keyof typeof MOTION_ISSUE_CODES;
148
164
  export interface MotionIssue {
@@ -43,7 +43,7 @@ export declare function describeMotionElements(scene: MotionScene): {
43
43
  } | undefined;
44
44
  effects?: {
45
45
  id: string;
46
- type: "trim" | "merge" | "bevel" | "offset" | "twist" | "roundCorners" | "puckerBloat" | "zigzag" | "wiggle" | "repeater" | "envelope" | "contour" | "blockShadow" | "extrude";
46
+ type: "trim" | "merge" | "bevel" | "offset" | "contour" | "twist" | "roundCorners" | "puckerBloat" | "zigzag" | "wiggle" | "repeater" | "envelope" | "blockShadow" | "extrude";
47
47
  numericParams: {
48
48
  [k: string]: unknown;
49
49
  };
@@ -43,7 +43,7 @@ export declare function describeMotionElements(scene: MotionScene): {
43
43
  } | undefined;
44
44
  effects?: {
45
45
  id: string;
46
- type: "trim" | "merge" | "bevel" | "offset" | "twist" | "roundCorners" | "puckerBloat" | "zigzag" | "wiggle" | "repeater" | "envelope" | "contour" | "blockShadow" | "extrude";
46
+ type: "trim" | "merge" | "bevel" | "offset" | "contour" | "twist" | "roundCorners" | "puckerBloat" | "zigzag" | "wiggle" | "repeater" | "envelope" | "blockShadow" | "extrude";
47
47
  numericParams: {
48
48
  [k: string]: unknown;
49
49
  };
@@ -1,4 +1,4 @@
1
- import type { EffectValue } from '../effects/types.cjs';
1
+ import type { CameraMoveSpec, EffectValue } from '../effects/types.cjs';
2
2
  import type { AnimationEasing } from '../animation/easing.cjs';
3
3
  import type { AnimationLoopMode } from '../animation/evaluate.cjs';
4
4
  import type { VectorDocument } from '../vector/types.cjs';
@@ -76,17 +76,35 @@ export interface MotionRect {
76
76
  }
77
77
  /**
78
78
  * Where the camera looks: a rectangle, or the id of a node to frame (with `padding` around
79
- * its bounds, default 24). The camera eases there over `ms` (default 1000; the first shot cuts).
79
+ * its bounds, default 24), or neither to keep the framing it has (to name only a move). The
80
+ * camera eases there over `ms` (default 1000; the first shot cuts).
81
+ *
82
+ * With an effects provider that has camera moves (`capabilities.supportsCamera`), the camera can
83
+ * play a move from its catalog (as Flair's scene fields of the same names):
84
+ * - `in`: how it gets into this shot, a move whose role is `transition` (a glide, a whip pan, a
85
+ * cut). Its `ms` (else `ms` here, else 1000) sets how long it takes.
86
+ * - `during`: how it moves while the shot holds, a move whose role is `hold` (a Ken Burns drift,
87
+ * a crash zoom), played across the shot's hold. The next shot's move starts from where it ends.
88
+ * Without such a provider they are kept but not played: the camera eases as it would without them.
80
89
  */
81
90
  export type MotionCamera = (MotionRect | {
82
91
  frame: string;
83
92
  padding?: number;
84
- }) & {
93
+ } | MotionCameraNoFraming) & {
85
94
  ease?: AnimationEasing;
86
95
  ms?: number;
87
96
  /** Zoom at a steady rate (the size changes by the same factor each moment) instead of linearly. */
88
97
  geometric?: boolean;
98
+ in?: CameraMoveSpec;
99
+ during?: CameraMoveSpec;
89
100
  };
101
+ /** A camera that keeps the framing it has (it names only a move). */
102
+ export interface MotionCameraNoFraming {
103
+ x?: undefined;
104
+ frame?: undefined;
105
+ }
106
+ /** True when a shot's camera gives a framing (a rectangle or a node), not only a move. */
107
+ export declare const motionCameraFramed: (camera: MotionCamera) => boolean;
90
108
  /** A steady beat: `bpm` beats a minute, the first at `offset` ms, `meter` beats a bar. */
91
109
  export interface MotionBeatGrid {
92
110
  bpm: number;
@@ -1,4 +1,4 @@
1
- import type { EffectValue } from '../effects/types.js';
1
+ import type { CameraMoveSpec, EffectValue } from '../effects/types.js';
2
2
  import type { AnimationEasing } from '../animation/easing.js';
3
3
  import type { AnimationLoopMode } from '../animation/evaluate.js';
4
4
  import type { VectorDocument } from '../vector/types.js';
@@ -76,17 +76,35 @@ export interface MotionRect {
76
76
  }
77
77
  /**
78
78
  * Where the camera looks: a rectangle, or the id of a node to frame (with `padding` around
79
- * its bounds, default 24). The camera eases there over `ms` (default 1000; the first shot cuts).
79
+ * its bounds, default 24), or neither to keep the framing it has (to name only a move). The
80
+ * camera eases there over `ms` (default 1000; the first shot cuts).
81
+ *
82
+ * With an effects provider that has camera moves (`capabilities.supportsCamera`), the camera can
83
+ * play a move from its catalog (as Flair's scene fields of the same names):
84
+ * - `in`: how it gets into this shot, a move whose role is `transition` (a glide, a whip pan, a
85
+ * cut). Its `ms` (else `ms` here, else 1000) sets how long it takes.
86
+ * - `during`: how it moves while the shot holds, a move whose role is `hold` (a Ken Burns drift,
87
+ * a crash zoom), played across the shot's hold. The next shot's move starts from where it ends.
88
+ * Without such a provider they are kept but not played: the camera eases as it would without them.
80
89
  */
81
90
  export type MotionCamera = (MotionRect | {
82
91
  frame: string;
83
92
  padding?: number;
84
- }) & {
93
+ } | MotionCameraNoFraming) & {
85
94
  ease?: AnimationEasing;
86
95
  ms?: number;
87
96
  /** Zoom at a steady rate (the size changes by the same factor each moment) instead of linearly. */
88
97
  geometric?: boolean;
98
+ in?: CameraMoveSpec;
99
+ during?: CameraMoveSpec;
89
100
  };
101
+ /** A camera that keeps the framing it has (it names only a move). */
102
+ export interface MotionCameraNoFraming {
103
+ x?: undefined;
104
+ frame?: undefined;
105
+ }
106
+ /** True when a shot's camera gives a framing (a rectangle or a node), not only a move. */
107
+ export declare const motionCameraFramed: (camera: MotionCamera) => boolean;
90
108
  /** A steady beat: `bpm` beats a minute, the first at `offset` ms, `meter` beats a bar. */
91
109
  export interface MotionBeatGrid {
92
110
  bpm: number;
@@ -220,7 +220,7 @@ var _chunkNM3G4VQTcjs = require('../chunk-NM3G4VQT.cjs');
220
220
 
221
221
 
222
222
 
223
- var _chunk5MQOBTNPcjs = require('../chunk-5MQOBTNP.cjs');
223
+ var _chunkOPSK22DLcjs = require('../chunk-OPSK22DL.cjs');
224
224
  require('../chunk-WOFXZ3XU.cjs');
225
225
 
226
226
 
@@ -11425,14 +11425,14 @@ function canvasEffectErrorReason(effect, error) {
11425
11425
  }
11426
11426
  var CANVAS_EFFECT_MISSING_PATTERN = "repeating-linear-gradient(45deg, rgba(128,128,128,0.28) 0 2px, transparent 2px 8px)";
11427
11427
  function createCanvasEffectsController(options) {
11428
- const slot = new (0, _chunk5MQOBTNPcjs.EffectsSlot)();
11428
+ const slot = new (0, _chunkOPSK22DLcjs.EffectsSlot)();
11429
11429
  if (options.effects) slot.set(options.effects);
11430
11430
  const describe = async (effect, place2) => {
11431
11431
  const d = await slot.require().describe(effect);
11432
11432
  const allowed = CANVAS_EFFECT_PLACES[place2];
11433
11433
  if (d.kind === "motion" || !d.uses.some((u) => allowed.includes(u))) {
11434
11434
  const where = place2 === "transition" ? "a scene transition" : place2 === "fill" ? "a fill" : "an overlay";
11435
- throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${d.id}" (${d.name}) is a ${d.uses.join(" / ")} effect and cannot be ${where}, which takes ${allowed.join(" or ")} effects; search_effects with use "${allowed[0]}" lists ones that fit.`, d.id);
11435
+ throw new (0, _chunkOPSK22DLcjs.EffectUnsupportedError)(`"${d.id}" (${d.name}) is a ${d.uses.join(" / ")} effect and cannot be ${where}, which takes ${allowed.join(" or ")} effects; search_effects with use "${allowed[0]}" lists ones that fit.`, d.id);
11436
11436
  }
11437
11437
  return d;
11438
11438
  };
@@ -11463,7 +11463,7 @@ function createCanvasEffectsController(options) {
11463
11463
  else if (k in d.controls.properties) base[k] = d.defaults[k];
11464
11464
  else throw new Error(`"${k}" is not a control of "${d.id}"; its controls are ${Object.keys(d.controls.properties).join(", ")}.`);
11465
11465
  }
11466
- return { ...base, ..._chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
11466
+ return { ...base, ..._chunkOPSK22DLcjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
11467
11467
  };
11468
11468
  return {
11469
11469
  /** The provider slot. */
@@ -11497,7 +11497,7 @@ function createCanvasEffectsController(options) {
11497
11497
  const mode = _nullishCoalesce(opts.mode, () => ( "fill"));
11498
11498
  const d = await describe(effect, mode);
11499
11499
  if (opts.opacity !== void 0 && !(opts.opacity >= 0 && opts.opacity <= 1)) throw new Error("opacity must be from 0 to 1.");
11500
- const next = { effect: d.id, provider: slot.require().id, name: d.name, values: _chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, d, opts.values), mode, ...opts.opacity !== void 0 && opts.opacity !== 1 ? { opacity: opts.opacity } : {} };
11500
+ const next = { effect: d.id, provider: slot.require().id, name: d.name, values: _chunkOPSK22DLcjs.resolveEffectValues.call(void 0, d, opts.values), mode, ...opts.opacity !== void 0 && opts.opacity !== 1 ? { opacity: opts.opacity } : {} };
11501
11501
  commit(`Add effect ${d.name}`, withEffect(nodeId, next));
11502
11502
  return next;
11503
11503
  },
@@ -11554,7 +11554,7 @@ function createCanvasEffectsController(options) {
11554
11554
  const d = await describe(effect, "transition");
11555
11555
  const duration = _nullishCoalesce(_nullishCoalesce(opts.duration, () => ( d.duration)), () => ( 600));
11556
11556
  if (!(duration > 0)) throw new Error("duration must be a number of ms above 0.");
11557
- const transition = { effect: d.id, provider: slot.require().id, name: d.name, values: _chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, d, opts.values), duration };
11557
+ const transition = { effect: d.id, provider: slot.require().id, name: d.name, values: _chunkOPSK22DLcjs.resolveEffectValues.call(void 0, d, opts.values), duration };
11558
11558
  scenes2.update(sceneId, { transition });
11559
11559
  return transition;
11560
11560
  }
@@ -11698,7 +11698,7 @@ function createCanvasEffectsToolProvider(controller, options = {}) {
11698
11698
  const once = (instance) => {
11699
11699
  if (instance !== "effect") throw new Error('A shape node has one effect, "effect".');
11700
11700
  };
11701
- return _chunk5MQOBTNPcjs.createEffectToolProvider.call(void 0, {
11701
+ return _chunkOPSK22DLcjs.createEffectToolProvider.call(void 0, {
11702
11702
  id: _nullishCoalesce(options.id, () => ( "canvas-effects")),
11703
11703
  namespace: options.namespace,
11704
11704
  title: "Canvas effects",
@@ -220,7 +220,7 @@ import {
220
220
  EffectsSlot,
221
221
  createEffectToolProvider,
222
222
  resolveEffectValues
223
- } from "../chunk-UGYUGZE2.js";
223
+ } from "../chunk-TCZ2J7PR.js";
224
224
  import "../chunk-V2ZCJRDM.js";
225
225
  import {
226
226
  brushstrokeScaleBucket
@@ -464,6 +464,11 @@ function clampCropToImage(crop, width, height) {
464
464
  height: Math.max(1, Math.min(height - y, crop.height))
465
465
  };
466
466
  }
467
+ var MARGIN_FIT_MIN_GUTTER = 36;
468
+ function marginFitSpan(size) {
469
+ const gutter = Math.max(size * 0.075, MARGIN_FIT_MIN_GUTTER);
470
+ return size - 2 * gutter > size * 0.5 ? size - 2 * gutter : size * 0.85;
471
+ }
467
472
  function resolveViewport(state, vpWidth, vpHeight, isActivelyCropping, cropOverride) {
468
473
  const { imageDimensions, crop: stateCrop, transform, zoom, pan, fit = "margin" } = state;
469
474
  const naturalWidth = imageDimensions.width || 800;
@@ -472,7 +477,7 @@ function resolveViewport(state, vpWidth, vpHeight, isActivelyCropping, cropOverr
472
477
  const activeCrop = cropOverride !== void 0 && cropOverride !== null ? cropOverride : _nullishCoalesce(stateCrop, () => ( (isActivelyCropping ? full : null)));
473
478
  const region = !isActivelyCropping && activeCrop ? clampCropToImage(activeCrop, naturalWidth, naturalHeight) : full;
474
479
  const { width: baseW, height: baseH } = getRotatedSize(region.width, region.height, transform);
475
- const fitScale = fit === "contain" ? Math.min(vpWidth / baseW, vpHeight / baseH) : Math.min(vpWidth * 0.85 / baseW, vpHeight * 0.85 / baseH, 1);
480
+ const fitScale = fit === "contain" ? Math.min(vpWidth / baseW, vpHeight / baseH) : Math.min(marginFitSpan(vpWidth) / baseW, marginFitSpan(vpHeight) / baseH, 1);
476
481
  const centerX = vpWidth / 2 + pan.x;
477
482
  const centerY = vpHeight / 2 + pan.y;
478
483
  const projection = {
@@ -12079,4 +12084,5 @@ function exportPsd(input) {
12079
12084
 
12080
12085
 
12081
12086
 
12082
- exports.LEGACY_PROCESS_VERSION = LEGACY_PROCESS_VERSION; exports.LATEST_PROCESS_VERSION = LATEST_PROCESS_VERSION; exports.normalizeProcessVersion = normalizeProcessVersion; exports.srgbToLinear = srgbToLinear; exports.linearToSrgb = linearToSrgb; exports.LUMA_709 = LUMA_709; exports.IDENTITY_MATRIX3 = IDENTITY_MATRIX3; exports.mulMatrix3 = mulMatrix3; exports.applyMatrix3 = applyMatrix3; exports.invertMatrix3 = invertMatrix3; exports.D65 = D65; exports.bradfordAdaptation = bradfordAdaptation; exports.wbMatrix = wbMatrix; exports.linearSrgbToXy = linearSrgbToXy; exports.TINT_SCALE = TINT_SCALE; exports.MIN_KELVIN = MIN_KELVIN; exports.MAX_KELVIN = MAX_KELVIN; exports.xyToUv = xyToUv; exports.uvToXy = uvToXy; exports.tempTintToXy = tempTintToXy; exports.xyToTempTint = xyToTempTint; exports.AS_SHOT_KELVIN = AS_SHOT_KELVIN; exports.MIRED_PER_TEMPERATURE_UNIT = MIRED_PER_TEMPERATURE_UNIT; exports.temperatureToKelvin = temperatureToKelvin; exports.kelvinToTemperature = kelvinToTemperature; exports.whiteBalanceMatrix = whiteBalanceMatrix; exports.whiteBalanceFromSample = whiteBalanceFromSample; exports.TONE_LUT_SIZE = TONE_LUT_SIZE; exports.toneCurve = toneCurve; exports.buildToneLut = buildToneLut; exports.sampleToneLut = sampleToneLut; exports.normalizeAngle = normalizeAngle; exports.isQuarterTurnSwapped = isQuarterTurnSwapped; exports.getRotatedSize = getRotatedSize; exports.projectImagePoint = projectImagePoint; exports.unprojectCanvasPoint = unprojectCanvasPoint; exports.applyImageProjectionToContext = applyImageProjectionToContext; exports.projectImageRect = projectImageRect; exports.clampCropToImage = clampCropToImage; exports.getViewportProjection = getViewportProjection; exports.getViewportMetrics = getViewportMetrics; exports.canvasToImagePoint = canvasToImagePoint; exports.imageToCanvasPoint = imageToCanvasPoint; exports.mapCropHandle = mapCropHandle; exports.hitTestCrop = hitTestCrop; exports.getCropCursor = getCropCursor; exports.calculateCropDrag = calculateCropDrag; exports.getAnnotationBounds = getAnnotationBounds; exports.hitTestAnnotation = hitTestAnnotation; exports.layerMaskSelection = layerMaskSelection; exports.normalizeLayerMask = normalizeLayerMask; exports.layerMaskFromSelection = layerMaskFromSelection; exports.updateLayerMaskProps = updateLayerMaskProps; exports.decodeLayerMask = decodeLayerMask; exports.layerMaskKey = layerMaskKey; exports.layerMaskCoverage = layerMaskCoverage; exports.projectMaskCoverage = projectMaskCoverage; exports.buildLayerMaskPlanes = buildLayerMaskPlanes; exports.ADJUSTMENT_LUT_SIZE = ADJUSTMENT_LUT_SIZE; exports.sampleLut = sampleLut; exports.ADJUSTMENT_KINDS = ADJUSTMENT_KINDS; exports.isAdjustmentKind = isAdjustmentKind; exports.adjustmentKindLabel = adjustmentKindLabel; exports.HUE_RANGE_LABELS = HUE_RANGE_LABELS; exports.neutralHueRange = neutralHueRange; exports.identityCurve = identityCurve; exports.identityLevels = identityLevels; exports.defaultAdjustmentParams = defaultAdjustmentParams; exports.createAdjustmentLayer = createAdjustmentLayer; exports.normalizeAdjustmentLayer = normalizeAdjustmentLayer; exports.normalizeAdjustmentLayers = normalizeAdjustmentLayers; exports.curveLutFromLevels = curveLutFromLevels; exports.levelsValue = levelsValue; exports.rgbToHsl = rgbToHsl; exports.hslToRgb = hslToRgb; exports.hueRangeWeight = hueRangeWeight; exports.hueRangeTables = hueRangeTables; exports.hueSaturation = hueSaturation; exports.rangeLightness = rangeLightness; exports.VIBRANCE_GREY = VIBRANCE_GREY; exports.vibranceLinear = vibranceLinear; exports.vibrancePixel = vibrancePixel; exports.colorBalanceChannel = colorBalanceChannel; exports.blackWhiteGray = blackWhiteGray; exports.D50 = D50; exports.XYZ_D50_TO_SRGB = XYZ_D50_TO_SRGB; exports.photoFilterMatrix = photoFilterMatrix; exports.posterizeValue = posterizeValue; exports.rgbToGray = rgbToGray; exports.hexToRgb = hexToRgb; exports.toneLuts = toneLuts; exports.compileAdjustmentLayer = compileAdjustmentLayer; exports.activeAdjustmentLayers = activeAdjustmentLayers; exports.evaluateAdjustmentLayers = evaluateAdjustmentLayers; exports.applyAdjustmentLayers = applyAdjustmentLayers; exports.applyAdjustmentLayersFloat = applyAdjustmentLayersFloat; exports.adjustmentLayersKey = adjustmentLayersKey; exports.applyAdjustments = applyAdjustments; exports.applyLegacyAdjustments = applyLegacyAdjustments; exports.applyLegacyFloat = applyLegacyFloat; exports.applyProcess2Adjustments = applyProcess2Adjustments; exports.applyProcess2Float = applyProcess2Float; exports.applyBoxBlurFloat = applyBoxBlurFloat; exports.applyBoxBlur = applyBoxBlur; exports.applyDepthMask = applyDepthMask; exports.removeAlpha = removeAlpha; exports.flattenPath = flattenPath; exports.rasterizeCoverage = rasterizeCoverage; exports.TEXT_ORIENTATIONS = TEXT_ORIENTATIONS; exports.TEXT_ALIGNS = TEXT_ALIGNS; exports.MAX_EFFECT_ANIMATION_MS = MAX_EFFECT_ANIMATION_MS; exports.SHAPE_OPERATIONS = SHAPE_OPERATIONS; exports.LIVE_SHAPE_KINDS = LIVE_SHAPE_KINDS; exports.newLayerId = newLayerId; exports.pixelLayers = pixelLayers; exports.developFilter = developFilter; exports.blurFilter = blurFilter; exports.isActiveFilter = isActiveFilter; exports.isSpatialFilter = isSpatialFilter; exports.pixelLayerBounds = pixelLayerBounds; exports.layerTypeLabel = layerTypeLabel; exports.hasSurface = hasSurface; exports.isRenderedLayer = isRenderedLayer; exports.shapeLayers = shapeLayers; exports.smartObjectLayers = smartObjectLayers; exports.LayerOperationError = LayerOperationError; exports.userErrorMessage = userErrorMessage; exports.isPaintableLayer = isPaintableLayer; exports.defaultActiveLayerId = defaultActiveLayerId; exports.activeLayerAfterRemoval = activeLayerAfterRemoval; exports.requireLayer = requireLayer; exports.requireUnlocked = requireUnlocked; exports.placeLayer = placeLayer; exports.removeLayer = removeLayer; exports.moveLayer = moveLayer; exports.withNewIds = withNewIds; exports.duplicateLayer = duplicateLayer; exports.setLayerProperties = setLayerProperties; exports.groupLayers = groupLayers; exports.ungroupLayer = ungroupLayer; exports.offsetLayer = offsetLayer; exports.setLayerMask = setLayerMask; exports.normalizeFilter = normalizeFilter; exports.addLayerFilter = addLayerFilter; exports.updateLayerFilter = updateLayerFilter; exports.removeLayerFilter = removeLayerFilter; exports.layerEffectsOf = layerEffectsOf; exports.setLayerEffects = setLayerEffects; exports.addLayerEffect = addLayerEffect; exports.updateLayerEffect = updateLayerEffect; exports.removeLayerEffect = removeLayerEffect; exports.setLayerEffectsEnabled = setLayerEffectsEnabled; exports.parseBlend = parseBlend; exports.unionRect = unionRect; exports.SHAPE_RENDER_MARGIN = SHAPE_RENDER_MARGIN; exports.DEFAULT_MITER_LIMIT = DEFAULT_MITER_LIMIT; exports.mapSubpaths = mapSubpaths; exports.liveShapeSubpaths = liveShapeSubpaths; exports.liveComponent = liveComponent; exports.componentPath = componentPath; exports.shapeOutline = shapeOutline; exports.shapeGeometryBounds = shapeGeometryBounds; exports.componentsCoverage = componentsCoverage; exports.shapeRenderClip = shapeRenderClip; exports.renderShapeRect = renderShapeRect; exports.renderShape = renderShape; exports.rerenderShape = rerenderShape; exports.normalizeShapePaint = normalizeShapePaint; exports.normalizeShapeStroke = normalizeShapeStroke; exports.normalizeLiveShape = normalizeLiveShape; exports.normalizeSubpaths = normalizeSubpaths; exports.requireOperation = requireOperation; exports.requireShapeLayer = requireShapeLayer; exports.createShapeLayer = createShapeLayer; exports.defaultShapeName = defaultShapeName; exports.updateShapeLayer = updateShapeLayer; exports.transformShapeComponents = transformShapeComponents; exports.offsetShape = offsetShape; exports.mergeShapeComponents = mergeShapeComponents; exports.shapeAsPixelLayer = shapeAsPixelLayer; exports.shapeFromAnnotation = shapeFromAnnotation; exports.annotationBlend = annotationBlend; exports.annotationOfShape = annotationOfShape; exports.VECTOR_MASK_EDGE_DEFAULTS = VECTOR_MASK_EDGE_DEFAULTS; exports.vectorMaskSegments = vectorMaskSegments; exports.validVectorMaskEdges = validVectorMaskEdges; exports.hybridVectorMaskCoverage = hybridVectorMaskCoverage; exports.isActiveVectorMask = isActiveVectorMask; exports.vectorMaskCoverage = vectorMaskCoverage; exports.layerGuide = layerGuide; exports.effectiveLayerMask = effectiveLayerMask; exports.resolveVectorMasks = resolveVectorMasks; exports.offsetVectorMask = offsetVectorMask; exports.transformVectorMask = transformVectorMask; exports.followLayerMove = followLayerMove; exports.vectorMaskBounds = vectorMaskBounds; exports.vectorMaskThumbnail = vectorMaskThumbnail; exports.EDGE_COLOR_RADIUS = EDGE_COLOR_RADIUS; exports.hasEdgeUnmix = hasEdgeUnmix; exports.maskCoverageOverCanvas = maskCoverageOverCanvas; exports.hasSoftBand = hasSoftBand; exports.despillEdge = despillEdge; exports.applyEdgeUnmix = applyEdgeUnmix; exports.adjustmentNodeAsLayer = adjustmentNodeAsLayer; exports.depthMaskAlpha = depthMaskAlpha; exports.runLayerFilters = runLayerFilters; exports.runLayerFiltersFloat = runLayerFiltersFloat; exports.LayerCompositor = LayerCompositor; exports.compositeDeep = compositeDeep; exports.DEFAULT_ADJUSTMENTS_VALUES = DEFAULT_ADJUSTMENTS_VALUES; exports.DEFAULT_TRANSFORM_VALUES = DEFAULT_TRANSFORM_VALUES; exports.DEFAULT_DEPTH_MASK_VALUES = DEFAULT_DEPTH_MASK_VALUES; exports.TEXT_RENDER_MARGIN = TEXT_RENDER_MARGIN; exports.textMatrix = textMatrix; exports.textOutlines = textOutlines; exports.renderText = renderText; exports.rerenderText = rerenderText; exports.TEXT_STYLE_FIELDS = TEXT_STYLE_FIELDS; exports.patchTextStyle = patchTextStyle; exports.PARAGRAPH_STYLE_FIELDS = PARAGRAPH_STYLE_FIELDS; exports.patchParagraphStyle = patchParagraphStyle; exports.textRange = textRange; exports.requireTypeLayer = requireTypeLayer; exports.normalizeText = normalizeText; exports.typeLayerName = typeLayerName; exports.textOrientation = textOrientation; exports.createTypeLayer = createTypeLayer; exports.updateTypeLayer = updateTypeLayer; exports.replaceTextRange = replaceTextRange; exports.transformTypeLayer = transformTypeLayer; exports.typeFrame = typeFrame; exports.typeAsPixelLayer = typeAsPixelLayer; exports.toTextSpace = toTextSpace; exports.typeFromAnnotation = typeFromAnnotation; exports.annotationOfType = annotationOfType; exports.BACKGROUND_LAYER_ID = BACKGROUND_LAYER_ID; exports.BACKGROUND_LAYER_NAME = BACKGROUND_LAYER_NAME; exports.DEVELOP_FILTER_ID = DEVELOP_FILTER_ID; exports.BLUR_FILTER_ID = BLUR_FILTER_ID; exports.rasterMaskFromLegacy = rasterMaskFromLegacy; exports.hasResampledLegacyMask = hasResampledLegacyMask; exports.legacyMaskOf = legacyMaskOf; exports.isDefaultDepthMask = isDefaultDepthMask; exports.developFromAdjustments = developFromAdjustments; exports.annotationLayerName = annotationLayerName; exports.annotationLayerFor = annotationLayerFor; exports.annotationOfLayer = annotationOfLayer; exports.adjustmentNodeFromLegacy = adjustmentNodeFromLegacy; exports.backgroundLayer = backgroundLayer; exports.depthRasterMask = depthRasterMask; exports.layersFromLegacy = layersFromLegacy; exports.legacyAdjustmentLayer = legacyAdjustmentLayer; exports.developTarget = developTarget; exports.legacyView = legacyView; exports.isLegacyShape = isLegacyShape; exports.FREE_TRANSFORM_MODES = FREE_TRANSFORM_MODES; exports.TRANSFORM_ANCHORS = TRANSFORM_ANCHORS; exports.ANCHOR_FRACTION = ANCHOR_FRACTION; exports.isTransformAnchor = isTransformAnchor; exports.identityTransform = identityTransform; exports.cornersFromMatrix = cornersFromMatrix; exports.matrixFromCorners = matrixFromCorners; exports.transformHomography = transformHomography; exports.hasWarp = hasWarp; exports.isIdentityTransform = isIdentityTransform; exports.transformMap = transformMap; exports.transformedPoint = transformedPoint; exports.anchorPoint = anchorPoint; exports.transformedBox = transformedBox; exports.referencePoint = referencePoint; exports.matrixFromParams = matrixFromParams; exports.describeTransform = describeTransform; exports.applyParams = applyParams; exports.flipCorners = flipCorners; exports.boxPointOf = boxPointOf; exports.presetWarp = presetWarp; exports.isValidWarp = isValidWarp; exports.geometryHomography = geometryHomography; exports.SMART_RENDER_MARGIN = SMART_RENDER_MARGIN; exports.isSmartSurfaceIncomplete = isSmartSurfaceIncomplete; exports.newContentsId = newContentsId; exports.contentsBox = contentsBox; exports.placementGeometry = placementGeometry; exports.placementAt = placementAt; exports.isContentsDecoded = isContentsDecoded; exports.requireSmartObject = requireSmartObject; exports.contentsSurface = contentsSurface; exports.rasterContents = rasterContents; exports.documentContents = documentContents; exports.placeContents = placeContents; exports.activeSmartFilters = activeSmartFilters; exports.activeEffectSmartFilters = activeEffectSmartFilters; exports.filterMaskCoverage = filterMaskCoverage; exports.applySmartFilters = applySmartFilters; exports.renderSmartObject = renderSmartObject; exports.rerender = rerender; exports.normalizePlacement = normalizePlacement; exports.setSmartPlacement = setSmartPlacement; exports.offsetSmartObject = offsetSmartObject; exports.translateLayer = translateLayer; exports.convertToSmartObject = convertToSmartObject; exports.rasterizeSmartObject = rasterizeSmartObject; exports.copySmartObject = copySmartObject; exports.instancesOf = instancesOf; exports.replaceContents = replaceContents; exports.normalizeSmartFilter = normalizeSmartFilter; exports.addSmartFilter = addSmartFilter; exports.updateSmartFilter = updateSmartFilter; exports.removeSmartFilter = removeSmartFilter; exports.moveSmartFilter = moveSmartFilter; exports.setSmartFiltersEnabled = setSmartFiltersEnabled; exports.setSmartFilterMask = setSmartFilterMask; exports.withFilterMaskSurface = withFilterMaskSurface; exports.placementBounds = placementBounds; exports.LAYERED_SCHEMA_VERSION = LAYERED_SCHEMA_VERSION; exports.serializePatterns = serializePatterns; exports.deserializePatterns = deserializePatterns; exports.encodeSurface = encodeSurface; exports.encodeDeepSurface = encodeDeepSurface; exports.decodeDeepSurface = decodeDeepSurface; exports.readEdgeColor = readEdgeColor; exports.serializeEffects = serializeEffects; exports.deserializeEffects = deserializeEffects; exports.readShapeComponents = readShapeComponents; exports.serializeLayer = serializeLayer; exports.serializeContents = serializeContents; exports.serializeLayers = serializeLayers; exports.serializeLayersExternal = serializeLayersExternal; exports.resolveExternalAssets = resolveExternalAssets; exports.decodePngDataUrl = decodePngDataUrl; exports.deserializeLayer = deserializeLayer; exports.deserializeLayers = deserializeLayers; exports.PsdError = PsdError; exports.decodePlanes = decodePlanes; exports.encodeRle = encodeRle; exports.parseVersionedDescriptor = parseVersionedDescriptor; exports.versionedDescriptorBytes = versionedDescriptorBytes; exports.ADJUSTMENT_KEYS = ADJUSTMENT_KEYS; exports.SUPPORTED_ADJUSTMENT_KEYS = SUPPORTED_ADJUSTMENT_KEYS; exports.parseAdjustmentBlock = parseAdjustmentBlock; exports.writeAdjustmentBlock = writeAdjustmentBlock; exports.parseLfx2 = parseLfx2; exports.writeLfx2 = writeLfx2; exports.parseLrfx = parseLrfx; exports.BROWSER_IMAGE_TYPES = BROWSER_IMAGE_TYPES; exports.readPsd = readPsd; exports.layerName = layerName; exports.layerTree = layerTree; exports.decodeLayerChannel = decodeLayerChannel; exports.decodeMergedImage = decodeMergedImage; exports.writePsd = writePsd; exports.PATTERN_BLOCK_KEYS = PATTERN_BLOCK_KEYS; exports.parsePatternBlock = parsePatternBlock; exports.psdPatternToEffectPattern = psdPatternToEffectPattern; exports.writePatternBlock = writePatternBlock; exports.PSD_BLEND_KEYS = PSD_BLEND_KEYS; exports.psdToLayers = psdToLayers; exports.importPsd = importPsd; exports.smartContentsFile = smartContentsFile; exports.exportPsd = exportPsd;
12087
+
12088
+ exports.LEGACY_PROCESS_VERSION = LEGACY_PROCESS_VERSION; exports.LATEST_PROCESS_VERSION = LATEST_PROCESS_VERSION; exports.normalizeProcessVersion = normalizeProcessVersion; exports.srgbToLinear = srgbToLinear; exports.linearToSrgb = linearToSrgb; exports.LUMA_709 = LUMA_709; exports.IDENTITY_MATRIX3 = IDENTITY_MATRIX3; exports.mulMatrix3 = mulMatrix3; exports.applyMatrix3 = applyMatrix3; exports.invertMatrix3 = invertMatrix3; exports.D65 = D65; exports.bradfordAdaptation = bradfordAdaptation; exports.wbMatrix = wbMatrix; exports.linearSrgbToXy = linearSrgbToXy; exports.TINT_SCALE = TINT_SCALE; exports.MIN_KELVIN = MIN_KELVIN; exports.MAX_KELVIN = MAX_KELVIN; exports.xyToUv = xyToUv; exports.uvToXy = uvToXy; exports.tempTintToXy = tempTintToXy; exports.xyToTempTint = xyToTempTint; exports.AS_SHOT_KELVIN = AS_SHOT_KELVIN; exports.MIRED_PER_TEMPERATURE_UNIT = MIRED_PER_TEMPERATURE_UNIT; exports.temperatureToKelvin = temperatureToKelvin; exports.kelvinToTemperature = kelvinToTemperature; exports.whiteBalanceMatrix = whiteBalanceMatrix; exports.whiteBalanceFromSample = whiteBalanceFromSample; exports.TONE_LUT_SIZE = TONE_LUT_SIZE; exports.toneCurve = toneCurve; exports.buildToneLut = buildToneLut; exports.sampleToneLut = sampleToneLut; exports.normalizeAngle = normalizeAngle; exports.isQuarterTurnSwapped = isQuarterTurnSwapped; exports.getRotatedSize = getRotatedSize; exports.projectImagePoint = projectImagePoint; exports.unprojectCanvasPoint = unprojectCanvasPoint; exports.applyImageProjectionToContext = applyImageProjectionToContext; exports.projectImageRect = projectImageRect; exports.clampCropToImage = clampCropToImage; exports.MARGIN_FIT_MIN_GUTTER = MARGIN_FIT_MIN_GUTTER; exports.getViewportProjection = getViewportProjection; exports.getViewportMetrics = getViewportMetrics; exports.canvasToImagePoint = canvasToImagePoint; exports.imageToCanvasPoint = imageToCanvasPoint; exports.mapCropHandle = mapCropHandle; exports.hitTestCrop = hitTestCrop; exports.getCropCursor = getCropCursor; exports.calculateCropDrag = calculateCropDrag; exports.getAnnotationBounds = getAnnotationBounds; exports.hitTestAnnotation = hitTestAnnotation; exports.layerMaskSelection = layerMaskSelection; exports.normalizeLayerMask = normalizeLayerMask; exports.layerMaskFromSelection = layerMaskFromSelection; exports.updateLayerMaskProps = updateLayerMaskProps; exports.decodeLayerMask = decodeLayerMask; exports.layerMaskKey = layerMaskKey; exports.layerMaskCoverage = layerMaskCoverage; exports.projectMaskCoverage = projectMaskCoverage; exports.buildLayerMaskPlanes = buildLayerMaskPlanes; exports.ADJUSTMENT_LUT_SIZE = ADJUSTMENT_LUT_SIZE; exports.sampleLut = sampleLut; exports.ADJUSTMENT_KINDS = ADJUSTMENT_KINDS; exports.isAdjustmentKind = isAdjustmentKind; exports.adjustmentKindLabel = adjustmentKindLabel; exports.HUE_RANGE_LABELS = HUE_RANGE_LABELS; exports.neutralHueRange = neutralHueRange; exports.identityCurve = identityCurve; exports.identityLevels = identityLevels; exports.defaultAdjustmentParams = defaultAdjustmentParams; exports.createAdjustmentLayer = createAdjustmentLayer; exports.normalizeAdjustmentLayer = normalizeAdjustmentLayer; exports.normalizeAdjustmentLayers = normalizeAdjustmentLayers; exports.curveLutFromLevels = curveLutFromLevels; exports.levelsValue = levelsValue; exports.rgbToHsl = rgbToHsl; exports.hslToRgb = hslToRgb; exports.hueRangeWeight = hueRangeWeight; exports.hueRangeTables = hueRangeTables; exports.hueSaturation = hueSaturation; exports.rangeLightness = rangeLightness; exports.VIBRANCE_GREY = VIBRANCE_GREY; exports.vibranceLinear = vibranceLinear; exports.vibrancePixel = vibrancePixel; exports.colorBalanceChannel = colorBalanceChannel; exports.blackWhiteGray = blackWhiteGray; exports.D50 = D50; exports.XYZ_D50_TO_SRGB = XYZ_D50_TO_SRGB; exports.photoFilterMatrix = photoFilterMatrix; exports.posterizeValue = posterizeValue; exports.rgbToGray = rgbToGray; exports.hexToRgb = hexToRgb; exports.toneLuts = toneLuts; exports.compileAdjustmentLayer = compileAdjustmentLayer; exports.activeAdjustmentLayers = activeAdjustmentLayers; exports.evaluateAdjustmentLayers = evaluateAdjustmentLayers; exports.applyAdjustmentLayers = applyAdjustmentLayers; exports.applyAdjustmentLayersFloat = applyAdjustmentLayersFloat; exports.adjustmentLayersKey = adjustmentLayersKey; exports.applyAdjustments = applyAdjustments; exports.applyLegacyAdjustments = applyLegacyAdjustments; exports.applyLegacyFloat = applyLegacyFloat; exports.applyProcess2Adjustments = applyProcess2Adjustments; exports.applyProcess2Float = applyProcess2Float; exports.applyBoxBlurFloat = applyBoxBlurFloat; exports.applyBoxBlur = applyBoxBlur; exports.applyDepthMask = applyDepthMask; exports.removeAlpha = removeAlpha; exports.flattenPath = flattenPath; exports.rasterizeCoverage = rasterizeCoverage; exports.TEXT_ORIENTATIONS = TEXT_ORIENTATIONS; exports.TEXT_ALIGNS = TEXT_ALIGNS; exports.MAX_EFFECT_ANIMATION_MS = MAX_EFFECT_ANIMATION_MS; exports.SHAPE_OPERATIONS = SHAPE_OPERATIONS; exports.LIVE_SHAPE_KINDS = LIVE_SHAPE_KINDS; exports.newLayerId = newLayerId; exports.pixelLayers = pixelLayers; exports.developFilter = developFilter; exports.blurFilter = blurFilter; exports.isActiveFilter = isActiveFilter; exports.isSpatialFilter = isSpatialFilter; exports.pixelLayerBounds = pixelLayerBounds; exports.layerTypeLabel = layerTypeLabel; exports.hasSurface = hasSurface; exports.isRenderedLayer = isRenderedLayer; exports.shapeLayers = shapeLayers; exports.smartObjectLayers = smartObjectLayers; exports.LayerOperationError = LayerOperationError; exports.userErrorMessage = userErrorMessage; exports.isPaintableLayer = isPaintableLayer; exports.defaultActiveLayerId = defaultActiveLayerId; exports.activeLayerAfterRemoval = activeLayerAfterRemoval; exports.requireLayer = requireLayer; exports.requireUnlocked = requireUnlocked; exports.placeLayer = placeLayer; exports.removeLayer = removeLayer; exports.moveLayer = moveLayer; exports.withNewIds = withNewIds; exports.duplicateLayer = duplicateLayer; exports.setLayerProperties = setLayerProperties; exports.groupLayers = groupLayers; exports.ungroupLayer = ungroupLayer; exports.offsetLayer = offsetLayer; exports.setLayerMask = setLayerMask; exports.normalizeFilter = normalizeFilter; exports.addLayerFilter = addLayerFilter; exports.updateLayerFilter = updateLayerFilter; exports.removeLayerFilter = removeLayerFilter; exports.layerEffectsOf = layerEffectsOf; exports.setLayerEffects = setLayerEffects; exports.addLayerEffect = addLayerEffect; exports.updateLayerEffect = updateLayerEffect; exports.removeLayerEffect = removeLayerEffect; exports.setLayerEffectsEnabled = setLayerEffectsEnabled; exports.parseBlend = parseBlend; exports.unionRect = unionRect; exports.SHAPE_RENDER_MARGIN = SHAPE_RENDER_MARGIN; exports.DEFAULT_MITER_LIMIT = DEFAULT_MITER_LIMIT; exports.mapSubpaths = mapSubpaths; exports.liveShapeSubpaths = liveShapeSubpaths; exports.liveComponent = liveComponent; exports.componentPath = componentPath; exports.shapeOutline = shapeOutline; exports.shapeGeometryBounds = shapeGeometryBounds; exports.componentsCoverage = componentsCoverage; exports.shapeRenderClip = shapeRenderClip; exports.renderShapeRect = renderShapeRect; exports.renderShape = renderShape; exports.rerenderShape = rerenderShape; exports.normalizeShapePaint = normalizeShapePaint; exports.normalizeShapeStroke = normalizeShapeStroke; exports.normalizeLiveShape = normalizeLiveShape; exports.normalizeSubpaths = normalizeSubpaths; exports.requireOperation = requireOperation; exports.requireShapeLayer = requireShapeLayer; exports.createShapeLayer = createShapeLayer; exports.defaultShapeName = defaultShapeName; exports.updateShapeLayer = updateShapeLayer; exports.transformShapeComponents = transformShapeComponents; exports.offsetShape = offsetShape; exports.mergeShapeComponents = mergeShapeComponents; exports.shapeAsPixelLayer = shapeAsPixelLayer; exports.shapeFromAnnotation = shapeFromAnnotation; exports.annotationBlend = annotationBlend; exports.annotationOfShape = annotationOfShape; exports.VECTOR_MASK_EDGE_DEFAULTS = VECTOR_MASK_EDGE_DEFAULTS; exports.vectorMaskSegments = vectorMaskSegments; exports.validVectorMaskEdges = validVectorMaskEdges; exports.hybridVectorMaskCoverage = hybridVectorMaskCoverage; exports.isActiveVectorMask = isActiveVectorMask; exports.vectorMaskCoverage = vectorMaskCoverage; exports.layerGuide = layerGuide; exports.effectiveLayerMask = effectiveLayerMask; exports.resolveVectorMasks = resolveVectorMasks; exports.offsetVectorMask = offsetVectorMask; exports.transformVectorMask = transformVectorMask; exports.followLayerMove = followLayerMove; exports.vectorMaskBounds = vectorMaskBounds; exports.vectorMaskThumbnail = vectorMaskThumbnail; exports.EDGE_COLOR_RADIUS = EDGE_COLOR_RADIUS; exports.hasEdgeUnmix = hasEdgeUnmix; exports.maskCoverageOverCanvas = maskCoverageOverCanvas; exports.hasSoftBand = hasSoftBand; exports.despillEdge = despillEdge; exports.applyEdgeUnmix = applyEdgeUnmix; exports.adjustmentNodeAsLayer = adjustmentNodeAsLayer; exports.depthMaskAlpha = depthMaskAlpha; exports.runLayerFilters = runLayerFilters; exports.runLayerFiltersFloat = runLayerFiltersFloat; exports.LayerCompositor = LayerCompositor; exports.compositeDeep = compositeDeep; exports.DEFAULT_ADJUSTMENTS_VALUES = DEFAULT_ADJUSTMENTS_VALUES; exports.DEFAULT_TRANSFORM_VALUES = DEFAULT_TRANSFORM_VALUES; exports.DEFAULT_DEPTH_MASK_VALUES = DEFAULT_DEPTH_MASK_VALUES; exports.TEXT_RENDER_MARGIN = TEXT_RENDER_MARGIN; exports.textMatrix = textMatrix; exports.textOutlines = textOutlines; exports.renderText = renderText; exports.rerenderText = rerenderText; exports.TEXT_STYLE_FIELDS = TEXT_STYLE_FIELDS; exports.patchTextStyle = patchTextStyle; exports.PARAGRAPH_STYLE_FIELDS = PARAGRAPH_STYLE_FIELDS; exports.patchParagraphStyle = patchParagraphStyle; exports.textRange = textRange; exports.requireTypeLayer = requireTypeLayer; exports.normalizeText = normalizeText; exports.typeLayerName = typeLayerName; exports.textOrientation = textOrientation; exports.createTypeLayer = createTypeLayer; exports.updateTypeLayer = updateTypeLayer; exports.replaceTextRange = replaceTextRange; exports.transformTypeLayer = transformTypeLayer; exports.typeFrame = typeFrame; exports.typeAsPixelLayer = typeAsPixelLayer; exports.toTextSpace = toTextSpace; exports.typeFromAnnotation = typeFromAnnotation; exports.annotationOfType = annotationOfType; exports.BACKGROUND_LAYER_ID = BACKGROUND_LAYER_ID; exports.BACKGROUND_LAYER_NAME = BACKGROUND_LAYER_NAME; exports.DEVELOP_FILTER_ID = DEVELOP_FILTER_ID; exports.BLUR_FILTER_ID = BLUR_FILTER_ID; exports.rasterMaskFromLegacy = rasterMaskFromLegacy; exports.hasResampledLegacyMask = hasResampledLegacyMask; exports.legacyMaskOf = legacyMaskOf; exports.isDefaultDepthMask = isDefaultDepthMask; exports.developFromAdjustments = developFromAdjustments; exports.annotationLayerName = annotationLayerName; exports.annotationLayerFor = annotationLayerFor; exports.annotationOfLayer = annotationOfLayer; exports.adjustmentNodeFromLegacy = adjustmentNodeFromLegacy; exports.backgroundLayer = backgroundLayer; exports.depthRasterMask = depthRasterMask; exports.layersFromLegacy = layersFromLegacy; exports.legacyAdjustmentLayer = legacyAdjustmentLayer; exports.developTarget = developTarget; exports.legacyView = legacyView; exports.isLegacyShape = isLegacyShape; exports.FREE_TRANSFORM_MODES = FREE_TRANSFORM_MODES; exports.TRANSFORM_ANCHORS = TRANSFORM_ANCHORS; exports.ANCHOR_FRACTION = ANCHOR_FRACTION; exports.isTransformAnchor = isTransformAnchor; exports.identityTransform = identityTransform; exports.cornersFromMatrix = cornersFromMatrix; exports.matrixFromCorners = matrixFromCorners; exports.transformHomography = transformHomography; exports.hasWarp = hasWarp; exports.isIdentityTransform = isIdentityTransform; exports.transformMap = transformMap; exports.transformedPoint = transformedPoint; exports.anchorPoint = anchorPoint; exports.transformedBox = transformedBox; exports.referencePoint = referencePoint; exports.matrixFromParams = matrixFromParams; exports.describeTransform = describeTransform; exports.applyParams = applyParams; exports.flipCorners = flipCorners; exports.boxPointOf = boxPointOf; exports.presetWarp = presetWarp; exports.isValidWarp = isValidWarp; exports.geometryHomography = geometryHomography; exports.SMART_RENDER_MARGIN = SMART_RENDER_MARGIN; exports.isSmartSurfaceIncomplete = isSmartSurfaceIncomplete; exports.newContentsId = newContentsId; exports.contentsBox = contentsBox; exports.placementGeometry = placementGeometry; exports.placementAt = placementAt; exports.isContentsDecoded = isContentsDecoded; exports.requireSmartObject = requireSmartObject; exports.contentsSurface = contentsSurface; exports.rasterContents = rasterContents; exports.documentContents = documentContents; exports.placeContents = placeContents; exports.activeSmartFilters = activeSmartFilters; exports.activeEffectSmartFilters = activeEffectSmartFilters; exports.filterMaskCoverage = filterMaskCoverage; exports.applySmartFilters = applySmartFilters; exports.renderSmartObject = renderSmartObject; exports.rerender = rerender; exports.normalizePlacement = normalizePlacement; exports.setSmartPlacement = setSmartPlacement; exports.offsetSmartObject = offsetSmartObject; exports.translateLayer = translateLayer; exports.convertToSmartObject = convertToSmartObject; exports.rasterizeSmartObject = rasterizeSmartObject; exports.copySmartObject = copySmartObject; exports.instancesOf = instancesOf; exports.replaceContents = replaceContents; exports.normalizeSmartFilter = normalizeSmartFilter; exports.addSmartFilter = addSmartFilter; exports.updateSmartFilter = updateSmartFilter; exports.removeSmartFilter = removeSmartFilter; exports.moveSmartFilter = moveSmartFilter; exports.setSmartFiltersEnabled = setSmartFiltersEnabled; exports.setSmartFilterMask = setSmartFilterMask; exports.withFilterMaskSurface = withFilterMaskSurface; exports.placementBounds = placementBounds; exports.LAYERED_SCHEMA_VERSION = LAYERED_SCHEMA_VERSION; exports.serializePatterns = serializePatterns; exports.deserializePatterns = deserializePatterns; exports.encodeSurface = encodeSurface; exports.encodeDeepSurface = encodeDeepSurface; exports.decodeDeepSurface = decodeDeepSurface; exports.readEdgeColor = readEdgeColor; exports.serializeEffects = serializeEffects; exports.deserializeEffects = deserializeEffects; exports.readShapeComponents = readShapeComponents; exports.serializeLayer = serializeLayer; exports.serializeContents = serializeContents; exports.serializeLayers = serializeLayers; exports.serializeLayersExternal = serializeLayersExternal; exports.resolveExternalAssets = resolveExternalAssets; exports.decodePngDataUrl = decodePngDataUrl; exports.deserializeLayer = deserializeLayer; exports.deserializeLayers = deserializeLayers; exports.PsdError = PsdError; exports.decodePlanes = decodePlanes; exports.encodeRle = encodeRle; exports.parseVersionedDescriptor = parseVersionedDescriptor; exports.versionedDescriptorBytes = versionedDescriptorBytes; exports.ADJUSTMENT_KEYS = ADJUSTMENT_KEYS; exports.SUPPORTED_ADJUSTMENT_KEYS = SUPPORTED_ADJUSTMENT_KEYS; exports.parseAdjustmentBlock = parseAdjustmentBlock; exports.writeAdjustmentBlock = writeAdjustmentBlock; exports.parseLfx2 = parseLfx2; exports.writeLfx2 = writeLfx2; exports.parseLrfx = parseLrfx; exports.BROWSER_IMAGE_TYPES = BROWSER_IMAGE_TYPES; exports.readPsd = readPsd; exports.layerName = layerName; exports.layerTree = layerTree; exports.decodeLayerChannel = decodeLayerChannel; exports.decodeMergedImage = decodeMergedImage; exports.writePsd = writePsd; exports.PATTERN_BLOCK_KEYS = PATTERN_BLOCK_KEYS; exports.parsePatternBlock = parsePatternBlock; exports.psdPatternToEffectPattern = psdPatternToEffectPattern; exports.writePatternBlock = writePatternBlock; exports.PSD_BLEND_KEYS = PSD_BLEND_KEYS; exports.psdToLayers = psdToLayers; exports.importPsd = importPsd; exports.smartContentsFile = smartContentsFile; exports.exportPsd = exportPsd;
@@ -7,7 +7,7 @@ var _chunkPY4GWSE2cjs = require('./chunk-PY4GWSE2.cjs');
7
7
 
8
8
 
9
9
 
10
- var _chunk5MQOBTNPcjs = require('./chunk-5MQOBTNP.cjs');
10
+ var _chunkOPSK22DLcjs = require('./chunk-OPSK22DL.cjs');
11
11
 
12
12
 
13
13
  var _chunkWOFXZ3XUcjs = require('./chunk-WOFXZ3XU.cjs');
@@ -1307,12 +1307,12 @@ function videoEffectLayerKey(layer, width, height) {
1307
1307
  }
1308
1308
  function mixEffectPixels(a, b, k) {
1309
1309
  if (k >= 1) return b;
1310
- const out = _chunk5MQOBTNPcjs.createEffectPixels.call(void 0, a.width, a.height);
1310
+ const out = _chunkOPSK22DLcjs.createEffectPixels.call(void 0, a.width, a.height);
1311
1311
  for (let i = 0; i < out.data.length; i++) out.data[i] = a.data[i] + (b.data[i] - a.data[i]) * k;
1312
1312
  return out;
1313
1313
  }
1314
1314
  function overEffectPixels(base, top, opacity = 1) {
1315
- const out = _chunk5MQOBTNPcjs.createEffectPixels.call(void 0, base.width, base.height);
1315
+ const out = _chunkOPSK22DLcjs.createEffectPixels.call(void 0, base.width, base.height);
1316
1316
  const o = out.data;
1317
1317
  const b = base.data;
1318
1318
  const t = top.data;
@@ -1357,7 +1357,7 @@ var VideoEffectsEngine = (_class2 = class {
1357
1357
  __init10() {this.generation = 0}
1358
1358
 
1359
1359
  constructor(options = {}) {;_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);
1360
- this.slot = _nullishCoalesce(options.slot, () => ( new (0, _chunk5MQOBTNPcjs.EffectsSlot)()));
1360
+ this.slot = _nullishCoalesce(options.slot, () => ( new (0, _chunkOPSK22DLcjs.EffectsSlot)()));
1361
1361
  this.maxEntries = _nullishCoalesce(options.maxEntries, () => ( 120));
1362
1362
  this.toImage = _nullishCoalesce(options.toImage, () => ( defaultToImage));
1363
1363
  this.pool = new (0, _chunkPY4GWSE2cjs.EffectRendererPool)({ maxRenderers: options.maxRenderers });
@@ -1499,7 +1499,7 @@ function checkVideoEffectPlace(d, place) {
1499
1499
  if (d.kind === "motion" || !d.uses.some((u) => allowed.includes(u))) {
1500
1500
  const where = place === "clip" ? "on a clip" : place === "transition" ? "as a transition" : "as an effect clip";
1501
1501
  const instead = d.uses.includes("transition") ? "set_video_effect_transition" : d.uses.some((u) => VIDEO_EFFECT_PLACES.generator.includes(u)) ? "add_video_effect_clip" : d.uses.some((u) => u === "filter") ? "apply_effect" : null;
1502
- throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(
1502
+ throw new (0, _chunkOPSK22DLcjs.EffectUnsupportedError)(
1503
1503
  `"${d.id}" (${d.name}) is a ${d.uses.join(" / ")} effect and cannot be used ${where}, which takes ${allowed.join(" or ")} effects${instead ? `; use ${instead} instead` : ""}. search_effects with use "${allowed[0]}" lists ones that fit.`,
1504
1504
  d.id
1505
1505
  );
@@ -1520,12 +1520,12 @@ function checkVideoEffectValues(d, values, options = {}) {
1520
1520
  else if (type !== "number" && type !== "integer") errors.push({ path: `/${k}`, message: "only number controls can be keyframed." });
1521
1521
  else for (const [i, key] of v.keys.entries()) for (const e of _chunkWOFXZ3XUcjs.validateJsonSchema.call(void 0, key.v, schema)) errors.push({ path: `/${k}/keys/${i}/v`, message: e.message });
1522
1522
  }
1523
- for (const e of _chunk5MQOBTNPcjs.effectValueErrors.call(void 0, d, plain)) {
1523
+ for (const e of _chunkOPSK22DLcjs.effectValueErrors.call(void 0, d, plain)) {
1524
1524
  const name = e.path.split("/")[1];
1525
1525
  const about = name && _optionalChain([d, 'access', _46 => _46.controls, 'access', _47 => _47.properties, 'access', _48 => _48[name], 'optionalAccess', _49 => _49.description]);
1526
1526
  errors.push(about ? { path: e.path, message: `${e.message} (${about})` } : e);
1527
1527
  }
1528
- if (errors.length) throw new (0, _chunk5MQOBTNPcjs.EffectControlError)(d.id, errors);
1528
+ if (errors.length) throw new (0, _chunkOPSK22DLcjs.EffectControlError)(d.id, errors);
1529
1529
  return { ..._nullishCoalesce(options.base, () => ( d.defaults)), ..._nullishCoalesce(values, () => ( {})) };
1530
1530
  }
1531
1531
 
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- var _chunk5MQOBTNPcjs = require('./chunk-5MQOBTNP.cjs');
6
+ var _chunkOPSK22DLcjs = require('./chunk-OPSK22DL.cjs');
7
7
 
8
8
 
9
9
  var _chunkFJ2MSI43cjs = require('./chunk-FJ2MSI43.cjs');
@@ -26,7 +26,7 @@ function documentErrors(doc, description) {
26
26
  const isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
27
27
  if (doc.values !== void 0) {
28
28
  if (!isRecord(doc.values)) errors.push({ path: "/values", message: "must be an object of control values" });
29
- else errors.push(..._chunk5MQOBTNPcjs.effectValueErrors.call(void 0, description, doc.values).map((e) => ({ ...e, path: `/values${e.path}` })));
29
+ else errors.push(..._chunkOPSK22DLcjs.effectValueErrors.call(void 0, description, doc.values).map((e) => ({ ...e, path: `/values${e.path}` })));
30
30
  }
31
31
  if (doc.tracks !== void 0) {
32
32
  if (!isRecord(doc.tracks)) errors.push({ path: "/tracks", message: "must be an object of keyframe lists" });
@@ -39,7 +39,7 @@ function documentErrors(doc, description) {
39
39
  kfs.forEach((kf, i) => {
40
40
  if (!isRecord(kf)) return errors.push({ path: `${at}/${i}`, message: "must be a keyframe object" });
41
41
  if (typeof kf.time !== "number" || !Number.isFinite(kf.time) || kf.time < 0) errors.push({ path: `${at}/${i}/time`, message: "must be a finite number of ms >= 0" });
42
- errors.push(..._chunk5MQOBTNPcjs.effectValueErrors.call(void 0, description, { [control]: kf.value }).map((e) => ({ ...e, path: `${at}/${i}/value` })));
42
+ errors.push(..._chunkOPSK22DLcjs.effectValueErrors.call(void 0, description, { [control]: kf.value }).map((e) => ({ ...e, path: `${at}/${i}/value` })));
43
43
  if (kf.easing !== void 0 && !_chunkDWJJI6RTcjs.isAnimationEasing.call(void 0, kf.easing)) errors.push({ path: `${at}/${i}/easing`, message: "is not a valid easing" });
44
44
  });
45
45
  }
@@ -49,7 +49,7 @@ function documentErrors(doc, description) {
49
49
  else
50
50
  doc.presets.forEach((p, i) => {
51
51
  if (!isRecord(p) || typeof p.name !== "string" || !p.name) return errors.push({ path: `/presets/${i}`, message: "must have a name" });
52
- errors.push(..._chunk5MQOBTNPcjs.effectValueErrors.call(void 0, description, p.values).map((e) => ({ ...e, path: `/presets/${i}/values${e.path}` })));
52
+ errors.push(..._chunkOPSK22DLcjs.effectValueErrors.call(void 0, description, p.values).map((e) => ({ ...e, path: `/presets/${i}/values${e.path}` })));
53
53
  });
54
54
  }
55
55
  if (doc.duration !== void 0 && (typeof doc.duration !== "number" || !Number.isFinite(doc.duration) || !(doc.duration > 0))) {
@@ -170,7 +170,7 @@ async function createEffectAuthoringSession(source, options) {
170
170
  if (isDocumentSource(source)) {
171
171
  const doc = source.document;
172
172
  if (doc.version !== 1 || !doc.effectId) {
173
- throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)("Invalid effect authoring document: version 1 required");
173
+ throw new (0, _chunkOPSK22DLcjs.EffectUnsupportedError)("Invalid effect authoring document: version 1 required");
174
174
  }
175
175
  effectId = doc.effectId;
176
176
  initialDoc = doc;
@@ -178,15 +178,15 @@ async function createEffectAuthoringSession(source, options) {
178
178
  effectId = source.effectId;
179
179
  requestedPreset = source.preset;
180
180
  } else {
181
- throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)("Invalid effect authoring source");
181
+ throw new (0, _chunkOPSK22DLcjs.EffectUnsupportedError)("Invalid effect authoring source");
182
182
  }
183
183
  const description = await provider.describe(effectId);
184
184
  if (initialDoc) {
185
185
  const problems = documentErrors(initialDoc, description);
186
- if (problems.length) throw new (0, _chunk5MQOBTNPcjs.EffectControlError)(effectId, problems);
186
+ if (problems.length) throw new (0, _chunkOPSK22DLcjs.EffectControlError)(effectId, problems);
187
187
  }
188
188
  if (description.kind === "motion") {
189
- throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)("Motion effects cannot be authored as pixel effects", effectId);
189
+ throw new (0, _chunkOPSK22DLcjs.EffectUnsupportedError)("Motion effects cannot be authored as pixel effects", effectId);
190
190
  }
191
191
  let disposed = false;
192
192
  let playing = false;
@@ -207,7 +207,7 @@ async function createEffectAuthoringSession(source, options) {
207
207
  const found = description.presets.find((p) => p.name === requestedPreset);
208
208
  if (!found) {
209
209
  const validNames = description.presets.map((p) => `"${p.name}"`).join(", ");
210
- throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(
210
+ throw new (0, _chunkOPSK22DLcjs.EffectUnsupportedError)(
211
211
  `Unknown preset "${requestedPreset}" for effect "${effectId}". Valid presets are: ${validNames || "none"}`,
212
212
  effectId
213
213
  );
@@ -321,7 +321,7 @@ async function createEffectAuthoringSession(source, options) {
321
321
  if (!validNames.includes(name)) {
322
322
  return { ok: false, message: `there is no control "${name}"; the controls are ${validNames.join(", ")}` };
323
323
  }
324
- const errors = _chunk5MQOBTNPcjs.effectValueErrors.call(void 0, description, { [name]: value });
324
+ const errors = _chunkOPSK22DLcjs.effectValueErrors.call(void 0, description, { [name]: value });
325
325
  if (errors.length > 0) {
326
326
  return { ok: false, message: valueErrorMessage(errors) };
327
327
  }
@@ -391,7 +391,7 @@ async function createEffectAuthoringSession(source, options) {
391
391
  if (!validNames.includes(k)) {
392
392
  return { ok: false, message: `there is no control "${k}"; the controls are ${validNames.join(", ")}` };
393
393
  }
394
- const errors = _chunk5MQOBTNPcjs.effectValueErrors.call(void 0, description, { [k]: v });
394
+ const errors = _chunkOPSK22DLcjs.effectValueErrors.call(void 0, description, { [k]: v });
395
395
  if (errors.length > 0) {
396
396
  return { ok: false, message: valueErrorMessage(errors) };
397
397
  }
@@ -528,7 +528,7 @@ async function createEffectAuthoringSession(source, options) {
528
528
  return { ok: false, message: `invalid easing: ${String(easing)}` };
529
529
  }
530
530
  const targetValue = value !== void 0 ? value : valuesAtTime(time, baseValues, tracks)[name];
531
- const errors = _chunk5MQOBTNPcjs.effectValueErrors.call(void 0, description, { [name]: targetValue });
531
+ const errors = _chunkOPSK22DLcjs.effectValueErrors.call(void 0, description, { [name]: targetValue });
532
532
  if (errors.length > 0) {
533
533
  return { ok: false, message: valueErrorMessage(errors) };
534
534
  }
@@ -705,7 +705,7 @@ async function createEffectAuthoringSession(source, options) {
705
705
  },
706
706
  async createPreview(opts) {
707
707
  if (disposed) {
708
- throw new (0, _chunk5MQOBTNPcjs.EffectDisposedError)(effectId);
708
+ throw new (0, _chunkOPSK22DLcjs.EffectDisposedError)(effectId);
709
709
  }
710
710
  let renderer;
711
711
  try {
@@ -730,7 +730,7 @@ async function createEffectAuthoringSession(source, options) {
730
730
  height: renderer.height,
731
731
  depth: renderer.depth,
732
732
  render: async (req) => {
733
- if (disposed) throw new (0, _chunk5MQOBTNPcjs.EffectDisposedError)(effectId);
733
+ if (disposed) throw new (0, _chunkOPSK22DLcjs.EffectDisposedError)(effectId);
734
734
  const effectiveValues = _nullishCoalesce(req.values, () => ( valuesAtTime(req.time, baseValues, tracks)));
735
735
  const pixels = await renderer.render({
736
736
  ...req,
@@ -33,7 +33,11 @@ var MOTION_ISSUE_CODES = {
33
33
  "scene-too-short": { severity: "warning", wording: "The scene ends before its target length." },
34
34
  "unknown-control-color": { severity: "warning", wording: "A control stands for a colour the scene never uses." },
35
35
  "empty-shot": { severity: "note", wording: "A shot neither moves the camera nor runs a command." },
36
- "camera-aspect": { severity: "note", wording: "A camera rectangle has a different shape from the artwork, so it is letterboxed." }
36
+ "camera-aspect": { severity: "note", wording: "A camera rectangle has a different shape from the artwork, so it is letterboxed." },
37
+ "camera-move-first-shot": { severity: "note", wording: "The first shot cuts to its framing, so the move its camera gets in with does not play." },
38
+ "camera-move-not-played": { severity: "note", wording: "A shot names a camera move, but there is no effects provider with camera moves to play it, so the camera eases instead." },
39
+ "camera-move-unknown": { severity: "error", wording: "A shot names a camera move the effects provider does not have, or one of the wrong role." },
40
+ "camera-move-values": { severity: "error", wording: "A camera move's preset or values do not fit its controls." }
37
41
  };
38
42
  function motionIssue(code, message, extra = {}) {
39
43
  return { code, severity: MOTION_ISSUE_CODES[code].severity, message, ...extra };
@@ -464,6 +464,11 @@ function clampCropToImage(crop, width, height) {
464
464
  height: Math.max(1, Math.min(height - y, crop.height))
465
465
  };
466
466
  }
467
+ var MARGIN_FIT_MIN_GUTTER = 36;
468
+ function marginFitSpan(size) {
469
+ const gutter = Math.max(size * 0.075, MARGIN_FIT_MIN_GUTTER);
470
+ return size - 2 * gutter > size * 0.5 ? size - 2 * gutter : size * 0.85;
471
+ }
467
472
  function resolveViewport(state, vpWidth, vpHeight, isActivelyCropping, cropOverride) {
468
473
  const { imageDimensions, crop: stateCrop, transform, zoom, pan, fit = "margin" } = state;
469
474
  const naturalWidth = imageDimensions.width || 800;
@@ -472,7 +477,7 @@ function resolveViewport(state, vpWidth, vpHeight, isActivelyCropping, cropOverr
472
477
  const activeCrop = cropOverride !== void 0 && cropOverride !== null ? cropOverride : stateCrop ?? (isActivelyCropping ? full : null);
473
478
  const region = !isActivelyCropping && activeCrop ? clampCropToImage(activeCrop, naturalWidth, naturalHeight) : full;
474
479
  const { width: baseW, height: baseH } = getRotatedSize(region.width, region.height, transform);
475
- const fitScale = fit === "contain" ? Math.min(vpWidth / baseW, vpHeight / baseH) : Math.min(vpWidth * 0.85 / baseW, vpHeight * 0.85 / baseH, 1);
480
+ const fitScale = fit === "contain" ? Math.min(vpWidth / baseW, vpHeight / baseH) : Math.min(marginFitSpan(vpWidth) / baseW, marginFitSpan(vpHeight) / baseH, 1);
476
481
  const centerX = vpWidth / 2 + pan.x;
477
482
  const centerY = vpHeight / 2 + pan.y;
478
483
  const projection = {
@@ -11758,6 +11763,7 @@ export {
11758
11763
  applyImageProjectionToContext,
11759
11764
  projectImageRect,
11760
11765
  clampCropToImage,
11766
+ MARGIN_FIT_MIN_GUTTER,
11761
11767
  getViewportProjection,
11762
11768
  getViewportMetrics,
11763
11769
  canvasToImagePoint,
@@ -7,7 +7,7 @@ import {
7
7
  EffectsSlot,
8
8
  createEffectPixels,
9
9
  effectValueErrors
10
- } from "./chunk-UGYUGZE2.js";
10
+ } from "./chunk-TCZ2J7PR.js";
11
11
  import {
12
12
  validateJsonSchema
13
13
  } from "./chunk-V2ZCJRDM.js";