@pixerate/editor 0.174.1 → 0.176.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 (36) hide show
  1. package/dist/{chunk-OVYQAYGH.cjs → chunk-UHMSMUHK.cjs} +75 -66
  2. package/dist/{chunk-BDIM6NVW.js → chunk-Y46OMERN.js} +10 -1
  3. package/dist/effects/fake.d.cts +1 -1
  4. package/dist/effects/fake.d.ts +1 -1
  5. package/dist/effects/index.cjs +36 -22
  6. package/dist/effects/index.js +19 -5
  7. package/dist/effects/types.d.cts +6 -0
  8. package/dist/effects/types.d.ts +6 -0
  9. package/dist/effects/ui.d.cts +0 -6
  10. package/dist/effects/ui.d.ts +0 -6
  11. package/dist/image-editor/controller.d.cts +28 -5
  12. package/dist/image-editor/controller.d.ts +28 -5
  13. package/dist/image-editor/effect-layers.d.cts +40 -0
  14. package/dist/image-editor/effect-layers.d.ts +40 -0
  15. package/dist/image-editor/index.cjs +931 -812
  16. package/dist/image-editor/index.d.cts +1 -0
  17. package/dist/image-editor/index.d.ts +1 -0
  18. package/dist/image-editor/index.js +152 -33
  19. package/dist/image-editor/layers/model.d.cts +15 -1
  20. package/dist/image-editor/layers/model.d.ts +15 -1
  21. package/dist/image-editor/layers/panel.d.cts +6 -2
  22. package/dist/image-editor/layers/panel.d.ts +6 -2
  23. package/dist/image-editor/provider-effect-tools.d.cts +2 -1
  24. package/dist/image-editor/provider-effect-tools.d.ts +2 -1
  25. package/dist/paint-editor/index.cjs +6 -6
  26. package/dist/paint-editor/index.js +1 -1
  27. package/dist/parameters/index.cjs +33 -1
  28. package/dist/parameters/index.d.cts +2 -0
  29. package/dist/parameters/index.d.ts +2 -0
  30. package/dist/parameters/index.js +32 -0
  31. package/dist/parameters/options.d.cts +7 -0
  32. package/dist/parameters/options.d.ts +7 -0
  33. package/dist/parameters/theme.d.cts +30 -0
  34. package/dist/parameters/theme.d.ts +30 -0
  35. package/package.json +1 -1
  36. package/skills/pixerate-image-editor/SKILL.md +2 -1
@@ -2385,6 +2385,7 @@ function removeAlpha(imageData) {
2385
2385
  var TEXT_ALIGNS = ["left", "center", "right", "justify"];
2386
2386
 
2387
2387
  // src/image-editor/layers/model.ts
2388
+ var MAX_EFFECT_ANIMATION_MS = 6e4;
2388
2389
  var SHAPE_OPERATIONS = ["combine", "subtract", "intersect", "exclude"];
2389
2390
  var LIVE_SHAPE_KINDS = ["rect", "ellipse", "polygon", "star", "line"];
2390
2391
  var idCounter = 0;
@@ -5926,7 +5927,14 @@ function deserializeLayer(raw, ctx) {
5926
5927
  const filters = readFilters(r.filters);
5927
5928
  if (filters) layer.filters = filters;
5928
5929
  const generator = readEffectRef(r.generator);
5929
- if (generator) layer.generator = { ...generator, ...typeof r.generator.time === "number" && r.generator.time > 0 ? { time: r.generator.time } : {} };
5930
+ if (generator) {
5931
+ const duration = _optionalChain([r, 'access', _169 => _169.generator, 'access', _170 => _170.animate, 'optionalAccess', _171 => _171.duration]);
5932
+ layer.generator = {
5933
+ ...generator,
5934
+ ...typeof r.generator.time === "number" && r.generator.time > 0 ? { time: r.generator.time } : {},
5935
+ ...typeof duration === "number" && Number.isFinite(duration) && duration > 0 ? { animate: { duration: Math.min(duration, MAX_EFFECT_ANIMATION_MS) } } : {}
5936
+ };
5937
+ }
5930
5938
  return layer;
5931
5939
  }
5932
5940
  case "adjustment": {
@@ -5951,7 +5959,7 @@ function deserializeLayer(raw, ctx) {
5951
5959
  return null;
5952
5960
  }
5953
5961
  const annotation = JSON.parse(JSON.stringify({ ...a, id: typeof a.id === "string" ? a.id : id }));
5954
- const migrated = annotationLayerFor(annotation, { ..._nullishCoalesce(ctx.canvas, () => ( { width: 1, height: 1 })), shaper: _nullishCoalesce(_optionalChain([ctx, 'access', _169 => _169.text, 'optionalAccess', _170 => _170.shaper]), () => ( null)), createCanvas: _optionalChain([ctx, 'access', _171 => _171.text, 'optionalAccess', _172 => _172.createCanvas]) });
5962
+ const migrated = annotationLayerFor(annotation, { ..._nullishCoalesce(ctx.canvas, () => ( { width: 1, height: 1 })), shaper: _nullishCoalesce(_optionalChain([ctx, 'access', _172 => _172.text, 'optionalAccess', _173 => _173.shaper]), () => ( null)), createCanvas: _optionalChain([ctx, 'access', _174 => _174.text, 'optionalAccess', _175 => _175.createCanvas]) });
5955
5963
  if (migrated.type === "shape" || migrated.type === "type") {
5956
5964
  const blend = base.blend === "normal" ? migrated.blend : base.blend;
5957
5965
  return { ...migrated, ...base, blend, id, name: base.name };
@@ -6343,7 +6351,7 @@ function descriptor(classId, items = []) {
6343
6351
  return { name: "", classId, items };
6344
6352
  }
6345
6353
  function descGet(d, key) {
6346
- return _optionalChain([d, 'access', _173 => _173.items, 'access', _174 => _174.find, 'call', _175 => _175(([k]) => k === key), 'optionalAccess', _176 => _176[1]]);
6354
+ return _optionalChain([d, 'access', _176 => _176.items, 'access', _177 => _177.find, 'call', _178 => _178(([k]) => k === key), 'optionalAccess', _179 => _179[1]]);
6347
6355
  }
6348
6356
  function descNumber(d, key) {
6349
6357
  const v = descGet(d, key);
@@ -6353,7 +6361,7 @@ function descNumber(d, key) {
6353
6361
  }
6354
6362
  function descBool(d, key) {
6355
6363
  const v = descGet(d, key);
6356
- return _optionalChain([v, 'optionalAccess', _177 => _177.type]) === "bool" ? v.value : void 0;
6364
+ return _optionalChain([v, 'optionalAccess', _180 => _180.type]) === "bool" ? v.value : void 0;
6357
6365
  }
6358
6366
  function descObject(d, key) {
6359
6367
  const v = descGet(d, key);
@@ -7074,7 +7082,7 @@ var enumV = (typeId, value) => ({ type: "enum", typeId, value });
7074
7082
  var obj = (d) => ({ type: "Objc", value: d });
7075
7083
  var enumOf = (d, key) => {
7076
7084
  const v = descGet(d, key);
7077
- return _optionalChain([v, 'optionalAccess', _178 => _178.type]) === "enum" ? v.value : void 0;
7085
+ return _optionalChain([v, 'optionalAccess', _181 => _181.type]) === "enum" ? v.value : void 0;
7078
7086
  };
7079
7087
  function read(data) {
7080
7088
  try {
@@ -7156,7 +7164,7 @@ function strokeFromVstk(data, dpi, notes) {
7156
7164
  const miter = descNumber(d, "strokeStyleMiterLimit");
7157
7165
  if (miter !== void 0 && miter !== 100) stroke.miterLimit = Math.max(1, Math.min(500, miter));
7158
7166
  const dashes = descGet(d, "strokeStyleLineDashSet");
7159
- if (_optionalChain([dashes, 'optionalAccess', _179 => _179.type]) === "VlLs") {
7167
+ if (_optionalChain([dashes, 'optionalAccess', _182 => _182.type]) === "VlLs") {
7160
7168
  const list2 = dashes.items.map((v) => v.type === "UntF" || v.type === "doub" || v.type === "long" ? v.value : NaN).filter((v) => Number.isFinite(v) && v >= 0);
7161
7169
  if (list2.length && list2.some((v) => v > 0)) stroke.dashes = list2;
7162
7170
  }
@@ -7308,7 +7316,7 @@ function vogkBytes(components, dpi) {
7308
7316
  ["keyOriginLineArrowEnd", boolV(Boolean(live.endArrow))],
7309
7317
  ["keyOriginLineArrWdth", dbl(head ? head.width / w * 100 : 0)],
7310
7318
  ["keyOriginLineArrLngth", dbl(head ? head.length / w * 100 : 0)],
7311
- ["keyOriginLineArrConc", long2(_optionalChain([head, 'optionalAccess', _180 => _180.concavity]) ? head.concavity * 100 : 0)]
7319
+ ["keyOriginLineArrConc", long2(_optionalChain([head, 'optionalAccess', _183 => _183.concavity]) ? head.concavity * 100 : 0)]
7312
7320
  ];
7313
7321
  }
7314
7322
  const m = live.transform;
@@ -7341,7 +7349,7 @@ function shapeSignature(layer) {
7341
7349
  return JSON.stringify([layer.components, layer.fill, layer.stroke, _nullishCoalesce(layer.fillRule, () => ( "nonzero")), Boolean(layer.inverted)]);
7342
7350
  }
7343
7351
  function shapeFromBlocks(blocks, width, height, dpi, notes) {
7344
- const block = (k) => _optionalChain([blocks, 'access', _181 => _181.find, 'call', _182 => _182((b) => b.key === k), 'optionalAccess', _183 => _183.data]);
7352
+ const block = (k) => _optionalChain([blocks, 'access', _184 => _184.find, 'call', _185 => _185((b) => b.key === k), 'optionalAccess', _186 => _186.data]);
7345
7353
  const vector = _nullishCoalesce(block("vsms"), () => ( block("vmsk")));
7346
7354
  const path = vector ? componentsFromVectorBlock(vector, width, height) : null;
7347
7355
  if (!path) return null;
@@ -7396,18 +7404,18 @@ function sameExtent(sub, c) {
7396
7404
  return a.every((v, i) => Math.abs(v - b[i]) < 1);
7397
7405
  }
7398
7406
  function shapeBlocks(layer, width, height, dpi, notes) {
7399
- const kept = _optionalChain([layer, 'access', _184 => _184.psd, 'optionalAccess', _185 => _185.blocks]);
7400
- if (_optionalChain([kept, 'optionalAccess', _186 => _186.length]) && _optionalChain([layer, 'access', _187 => _187.psd, 'optionalAccess', _188 => _188.signature]) === shapeSignature(layer)) return kept.map((b) => ({ key: b.key, data: b.data }));
7407
+ const kept = _optionalChain([layer, 'access', _187 => _187.psd, 'optionalAccess', _188 => _188.blocks]);
7408
+ if (_optionalChain([kept, 'optionalAccess', _189 => _189.length]) && _optionalChain([layer, 'access', _190 => _190.psd, 'optionalAccess', _191 => _191.signature]) === shapeSignature(layer)) return kept.map((b) => ({ key: b.key, data: b.data }));
7401
7409
  const out = [];
7402
7410
  out.push({ key: "vsms", data: vectorBlockForComponents(layer.components, Boolean(layer.inverted), width, height) });
7403
7411
  if (layer.fillRule === "evenodd" && layer.components.some((c) => c.subpaths.length > 1)) notes.add("Even-odd fill rules were written as nonzero (Photoshop fills shapes nonzero)");
7404
7412
  const fill = _nullishCoalesce(layer.fill, () => ( { type: "color", color: "#000000" }));
7405
- if (_optionalChain([layer, 'access', _189 => _189.fill, 'optionalAccess', _190 => _190.opacity]) !== void 0 && layer.fill.opacity < 1) notes.add("Shape fill opacity has no PSD equivalent and was written as 100 % (use the layer fill opacity)");
7413
+ if (_optionalChain([layer, 'access', _192 => _192.fill, 'optionalAccess', _193 => _193.opacity]) !== void 0 && layer.fill.opacity < 1) notes.add("Shape fill opacity has no PSD equivalent and was written as 100 % (use the layer fill opacity)");
7406
7414
  out.push({ key: "vscg", data: vscgBytes(fill) });
7407
7415
  if (layer.stroke || !layer.fill) out.push({ key: "vstk", data: vstkBytes(layer.stroke, Boolean(layer.fill), dpi) });
7408
7416
  const vogk = vogkBytes(layer.components, dpi);
7409
7417
  if (vogk) out.push({ key: "vogk", data: vogk });
7410
- if (layer.components.some((c) => _optionalChain([c, 'access', _191 => _191.live, 'optionalAccess', _192 => _192.kind]) === "line" && (c.live.startArrow && c.live.endArrow && JSON.stringify(c.live.startArrow) !== JSON.stringify(c.live.endArrow) || false))) {
7418
+ if (layer.components.some((c) => _optionalChain([c, 'access', _194 => _194.live, 'optionalAccess', _195 => _195.kind]) === "line" && (c.live.startArrow && c.live.endArrow && JSON.stringify(c.live.startArrow) !== JSON.stringify(c.live.endArrow) || false))) {
7411
7419
  notes.add("Lines with different start and end arrowheads were written with one arrowhead size (Photoshop has one)");
7412
7420
  }
7413
7421
  return out;
@@ -7616,7 +7624,7 @@ var E = {
7616
7624
  bool: (value) => ({ t: "bool", value })
7617
7625
  };
7618
7626
  function eGet(v, key) {
7619
- return _optionalChain([v, 'optionalAccess', _193 => _193.t]) === "dict" ? _optionalChain([v, 'access', _194 => _194.items, 'access', _195 => _195.find, 'call', _196 => _196(([k]) => k === key), 'optionalAccess', _197 => _197[1]]) : void 0;
7627
+ return _optionalChain([v, 'optionalAccess', _196 => _196.t]) === "dict" ? _optionalChain([v, 'access', _197 => _197.items, 'access', _198 => _198.find, 'call', _199 => _199(([k]) => k === key), 'optionalAccess', _200 => _200[1]]) : void 0;
7620
7628
  }
7621
7629
  function ePath(v, keys) {
7622
7630
  return keys.reduce((at, k) => eGet(at, k), v);
@@ -7634,7 +7642,7 @@ function eStr(v) {
7634
7642
  return v && (v.t === "string" || v.t === "name") ? v.value : void 0;
7635
7643
  }
7636
7644
  function eArray(v) {
7637
- return _optionalChain([v, 'optionalAccess', _198 => _198.t]) === "array" ? v.items : [];
7645
+ return _optionalChain([v, 'optionalAccess', _201 => _201.t]) === "array" ? v.items : [];
7638
7646
  }
7639
7647
  function eSet(d, key, value) {
7640
7648
  if (d.t !== "dict") return;
@@ -7736,7 +7744,7 @@ function fontFromPostScript(ps) {
7736
7744
  }
7737
7745
  family += suffix;
7738
7746
  const s = style.toLowerCase();
7739
- const weight = _nullishCoalesce(_optionalChain([WEIGHTS, 'access', _199 => _199.find, 'call', _200 => _200(([re]) => re.test(s)), 'optionalAccess', _201 => _201[1]]), () => ( 400));
7747
+ const weight = _nullishCoalesce(_optionalChain([WEIGHTS, 'access', _202 => _202.find, 'call', _203 => _203(([re]) => re.test(s)), 'optionalAccess', _204 => _204[1]]), () => ( 400));
7740
7748
  return { family: family || ps, weight, italic: /italic|oblique|it$/.test(s) };
7741
7749
  }
7742
7750
  var STYLE_NAMES = [
@@ -7761,7 +7769,7 @@ var hex2 = (v) => Math.round(Math.max(0, Math.min(1, v)) * 255).toString(16).pad
7761
7769
  function merged(levels) {
7762
7770
  const items = [];
7763
7771
  for (const l of levels) {
7764
- if (_optionalChain([l, 'optionalAccess', _202 => _202.t]) !== "dict") continue;
7772
+ if (_optionalChain([l, 'optionalAccess', _205 => _205.t]) !== "dict") continue;
7765
7773
  for (const [k, v] of l.items) if (!items.some(([o]) => o === k)) items.push([k, v]);
7766
7774
  }
7767
7775
  return E.dict(items);
@@ -7832,10 +7840,10 @@ function typeFromTySh(data, notes) {
7832
7840
  const t = parseTySh(data);
7833
7841
  if (!t) return null;
7834
7842
  const txtV = descGet(t.text, "Txt ");
7835
- const txt = _optionalChain([txtV, 'optionalAccess', _203 => _203.type]) === "TEXT" ? txtV.value.replace(/\0+$/, "") : void 0;
7843
+ const txt = _optionalChain([txtV, 'optionalAccess', _206 => _206.type]) === "TEXT" ? txtV.value.replace(/\0+$/, "") : void 0;
7836
7844
  const ed = descGet(t.text, "EngineData");
7837
7845
  let engine = null;
7838
- if (_optionalChain([ed, 'optionalAccess', _204 => _204.type]) === "tdta") {
7846
+ if (_optionalChain([ed, 'optionalAccess', _207 => _207.type]) === "tdta") {
7839
7847
  try {
7840
7848
  engine = parseEngineData(ed.data);
7841
7849
  } catch (e18) {
@@ -7843,12 +7851,12 @@ function typeFromTySh(data, notes) {
7843
7851
  }
7844
7852
  }
7845
7853
  const anti = descGet(t.text, "AntA");
7846
- const antiAlias = !(_optionalChain([anti, 'optionalAccess', _205 => _205.type]) === "enum" && (anti.value === "Anno" || anti.value === "antiAliasNone"));
7854
+ const antiAlias = !(_optionalChain([anti, 'optionalAccess', _208 => _208.type]) === "enum" && (anti.value === "Anno" || anti.value === "antiAliasNone"));
7847
7855
  const ornt = descGet(t.text, "Ornt");
7848
- if (_optionalChain([ornt, 'optionalAccess', _206 => _206.type]) === "enum" && ornt.value === "Vrtc") notes.add("vertical type is laid out horizontally");
7856
+ if (_optionalChain([ornt, 'optionalAccess', _209 => _209.type]) === "enum" && ornt.value === "Vrtc") notes.add("vertical type is laid out horizontally");
7849
7857
  if (t.warp) {
7850
7858
  const style = descGet(t.warp, "warpStyle");
7851
- if (_optionalChain([style, 'optionalAccess', _207 => _207.type]) === "enum" && style.value !== "warpNone") notes.add("warped text is drawn without its warp when edited");
7859
+ if (_optionalChain([style, 'optionalAccess', _210 => _210.type]) === "enum" && style.value !== "warpNone") notes.add("warped text is drawn without its warp when edited");
7852
7860
  }
7853
7861
  const edText = _nullishCoalesce(eStr(ePath(_nullishCoalesce(engine, () => ( void 0)), ["EngineDict", "Editor", "Text"])), () => ( ""));
7854
7862
  const text3 = (_nullishCoalesce(txt, () => ( edText.replace(/\r$/, "")))).replace(/\r\n?/g, "\n");
@@ -7897,7 +7905,7 @@ function typeFromTySh(data, notes) {
7897
7905
  let at = 0;
7898
7906
  runs = ssheets.map((sheet, i) => {
7899
7907
  const own = named(styleSet, sheet);
7900
- const paraDefault = _optionalChain([paraBases, 'access', _208 => _208[paraAt(at)], 'optionalAccess', _209 => _209.charDefault]);
7908
+ const paraDefault = _optionalChain([paraBases, 'access', _211 => _211[paraAt(at)], 'optionalAccess', _212 => _212.charDefault]);
7901
7909
  at += _nullishCoalesce(slens[i], () => ( 0));
7902
7910
  const d = merged([eGet(sheet, "StyleSheetData"), eGet(own, "StyleSheetData"), eGet(paraDefault, "StyleSheetData"), eGet(normalStyle, "StyleSheetData")]);
7903
7911
  return { length: _nullishCoalesce(slens[i], () => ( 0)), style: charStyle(d, fonts, notes) };
@@ -7976,8 +7984,8 @@ var fontEntry = (name) => E.dict([
7976
7984
  ["Synthetic", E.int(0)]
7977
7985
  ]);
7978
7986
  function buildEngineData(layer, template) {
7979
- const e = _optionalChain([template, 'optionalAccess', _210 => _210.t]) === "dict" ? eClone(template) : E.dict([["EngineDict", E.dict()], ["ResourceDict", E.dict()]]);
7980
- if (_optionalChain([eGet, 'call', _211 => _211(e, "EngineDict"), 'optionalAccess', _212 => _212.t]) !== "dict") eSet(e, "EngineDict", E.dict());
7987
+ const e = _optionalChain([template, 'optionalAccess', _213 => _213.t]) === "dict" ? eClone(template) : E.dict([["EngineDict", E.dict()], ["ResourceDict", E.dict()]]);
7988
+ if (_optionalChain([eGet, 'call', _214 => _214(e, "EngineDict"), 'optionalAccess', _215 => _215.t]) !== "dict") eSet(e, "EngineDict", E.dict());
7981
7989
  const dict = eGet(e, "EngineDict");
7982
7990
  const text3 = layer.text.replace(/\n/g, "\r");
7983
7991
  const edText = `${text3}\r`;
@@ -8056,7 +8064,7 @@ function buildEngineData(layer, template) {
8056
8064
  eSet(e, key, rd);
8057
8065
  }
8058
8066
  eSet(rd, "FontSet", fontSet);
8059
- if (!eGet(rd, "StyleSheetSet")) eSet(rd, "StyleSheetSet", E.array([E.dict([["Name", E.str("Normal RGB")], ["StyleSheetData", styleSheetData(_nullishCoalesce(_optionalChain([runs, 'access', _213 => _213[0], 'optionalAccess', _214 => _214.style]), () => ( _chunkEGZM52EOcjs.DEFAULT_TEXT_STYLE)), 0)]])]));
8067
+ if (!eGet(rd, "StyleSheetSet")) eSet(rd, "StyleSheetSet", E.array([E.dict([["Name", E.str("Normal RGB")], ["StyleSheetData", styleSheetData(_nullishCoalesce(_optionalChain([runs, 'access', _216 => _216[0], 'optionalAccess', _217 => _217.style]), () => ( _chunkEGZM52EOcjs.DEFAULT_TEXT_STYLE)), 0)]])]));
8060
8068
  if (!eGet(rd, "ParagraphSheetSet")) eSet(rd, "ParagraphSheetSet", E.array([E.dict([["Name", E.str("Normal RGB")], ["DefaultStyleSheet", E.int(0)], ["Properties", paragraphProperties({})]])]));
8061
8069
  if (!eGet(rd, "TheNormalStyleSheet")) eSet(rd, "TheNormalStyleSheet", E.int(0));
8062
8070
  if (!eGet(rd, "TheNormalParagraphSheet")) eSet(rd, "TheNormalParagraphSheet", E.int(0));
@@ -8077,12 +8085,12 @@ function inkBounds2(layer) {
8077
8085
  return [Math.min(...pts.map((p) => p.x)), Math.min(...pts.map((p) => p.y)), Math.max(...pts.map((p) => p.x)), Math.max(...pts.map((p) => p.y))];
8078
8086
  }
8079
8087
  function tyShForLayer(layer) {
8080
- const raw = _optionalChain([layer, 'access', _215 => _215.psd, 'optionalAccess', _216 => _216.tySh]);
8081
- if (raw && _optionalChain([layer, 'access', _217 => _217.psd, 'optionalAccess', _218 => _218.signature]) === typeSignature(layer)) return raw;
8088
+ const raw = _optionalChain([layer, 'access', _218 => _218.psd, 'optionalAccess', _219 => _219.tySh]);
8089
+ if (raw && _optionalChain([layer, 'access', _220 => _220.psd, 'optionalAccess', _221 => _221.signature]) === typeSignature(layer)) return raw;
8082
8090
  const old = raw ? parseTySh(raw) : null;
8083
8091
  const oldEd = old ? descGet(old.text, "EngineData") : void 0;
8084
8092
  let template = null;
8085
- if (_optionalChain([oldEd, 'optionalAccess', _219 => _219.type]) === "tdta") {
8093
+ if (_optionalChain([oldEd, 'optionalAccess', _222 => _222.type]) === "tdta") {
8086
8094
  try {
8087
8095
  template = parseEngineData(oldEd.data);
8088
8096
  } catch (e19) {
@@ -8114,8 +8122,8 @@ function tyShForLayer(layer) {
8114
8122
  set("boundingBox", rect("boundingBox"));
8115
8123
  if (!descGet(text3, "TextIndex")) set("TextIndex", { type: "long", value: 0 });
8116
8124
  set("EngineData", { type: "tdta", data: writeEngineData(engine) });
8117
- const warpStyle = _optionalChain([old, 'optionalAccess', _220 => _220.warp]) ? descGet(old.warp, "warpStyle") : void 0;
8118
- const warp = _optionalChain([old, 'optionalAccess', _221 => _221.warp]) && _optionalChain([warpStyle, 'optionalAccess', _222 => _222.type]) === "enum" && warpStyle.value === "warpNone" ? old.warp : null;
8125
+ const warpStyle = _optionalChain([old, 'optionalAccess', _223 => _223.warp]) ? descGet(old.warp, "warpStyle") : void 0;
8126
+ const warp = _optionalChain([old, 'optionalAccess', _224 => _224.warp]) && _optionalChain([warpStyle, 'optionalAccess', _225 => _225.type]) === "enum" && warpStyle.value === "warpNone" ? old.warp : null;
8119
8127
  return writeTySh({ transform: textMatrix(layer), text: text3, warp, tail: new Uint8Array(16) });
8120
8128
  }
8121
8129
 
@@ -8315,15 +8323,15 @@ var textV = (value) => ({ type: "TEXT", value });
8315
8323
  var obj2 = (d) => ({ type: "Objc", value: d });
8316
8324
  var text = (d, key) => {
8317
8325
  const v = descGet(d, key);
8318
- return _optionalChain([v, 'optionalAccess', _223 => _223.type]) === "TEXT" ? v.value : void 0;
8326
+ return _optionalChain([v, 'optionalAccess', _226 => _226.type]) === "TEXT" ? v.value : void 0;
8319
8327
  };
8320
8328
  var enumOf2 = (d, key) => {
8321
8329
  const v = descGet(d, key);
8322
- return _optionalChain([v, 'optionalAccess', _224 => _224.type]) === "enum" ? v.value : void 0;
8330
+ return _optionalChain([v, 'optionalAccess', _227 => _227.type]) === "enum" ? v.value : void 0;
8323
8331
  };
8324
8332
  var numbers = (d, key) => {
8325
8333
  const v = descGet(d, key);
8326
- if (_optionalChain([v, 'optionalAccess', _225 => _225.type]) !== "VlLs") return null;
8334
+ if (_optionalChain([v, 'optionalAccess', _228 => _228.type]) !== "VlLs") return null;
8327
8335
  const out = [];
8328
8336
  for (const it of v.items) {
8329
8337
  if (it.type === "doub" || it.type === "UntF" || it.type === "long") out.push(it.value);
@@ -8518,8 +8526,8 @@ function filterMaskItem(placed, mask, area) {
8518
8526
  const painted = _chunkCWM3CUUXcjs.contentBounds.call(void 0, mask.surface);
8519
8527
  let b = _nullishCoalesce(painted, () => ( { x: 0, y: 0, width: 1, height: 1 }));
8520
8528
  if (mask.defaultValue !== 255 && area) {
8521
- const x0 = Math.min(area.x, _nullishCoalesce(_optionalChain([painted, 'optionalAccess', _226 => _226.x]), () => ( area.x)));
8522
- const y0 = Math.min(area.y, _nullishCoalesce(_optionalChain([painted, 'optionalAccess', _227 => _227.y]), () => ( area.y)));
8529
+ const x0 = Math.min(area.x, _nullishCoalesce(_optionalChain([painted, 'optionalAccess', _229 => _229.x]), () => ( area.x)));
8530
+ const y0 = Math.min(area.y, _nullishCoalesce(_optionalChain([painted, 'optionalAccess', _230 => _230.y]), () => ( area.y)));
8523
8531
  const x1 = Math.max(area.x + area.width, painted ? painted.x + painted.width : 0);
8524
8532
  const y1 = Math.max(area.y + area.height, painted ? painted.y + painted.height : 0);
8525
8533
  b = { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
@@ -8539,7 +8547,7 @@ function filterMaskItem(placed, mask, area) {
8539
8547
  }
8540
8548
  var warpStyleOf = (name) => {
8541
8549
  if (!name.startsWith("warp")) return null;
8542
- const s = _optionalChain([name, 'access', _228 => _228[4], 'optionalAccess', _229 => _229.toLowerCase, 'call', _230 => _230()]) + name.slice(5);
8550
+ const s = _optionalChain([name, 'access', _231 => _231[4], 'optionalAccess', _232 => _232.toLowerCase, 'call', _233 => _233()]) + name.slice(5);
8543
8551
  return _chunkEGZM52EOcjs.WARP_STYLES.includes(s) ? s : null;
8544
8552
  };
8545
8553
  function warpFromDescriptor(w, contents) {
@@ -8561,7 +8569,7 @@ function warpFromDescriptor(w, contents) {
8561
8569
  if (!arr || arr.type !== "ObAr") return void 0;
8562
8570
  const xs = descGet(arr.body, "Hrzn");
8563
8571
  const ys = descGet(arr.body, "Vrtc");
8564
- if (_optionalChain([xs, 'optionalAccess', _231 => _231.type]) !== "UnFl" || _optionalChain([ys, 'optionalAccess', _232 => _232.type]) !== "UnFl" || xs.values.length !== 16 || ys.values.length !== 16) return void 0;
8572
+ if (_optionalChain([xs, 'optionalAccess', _234 => _234.type]) !== "UnFl" || _optionalChain([ys, 'optionalAccess', _235 => _235.type]) !== "UnFl" || xs.values.length !== 16 || ys.values.length !== 16) return void 0;
8565
8573
  mesh = { us: [0, 1], vs: [0, 1], points: xs.values.map((x, i) => ({ x, y: ys.values[i] })) };
8566
8574
  const px2 = mesh.points.map((p) => p.x);
8567
8575
  const py = mesh.points.map((p) => p.y);
@@ -8728,13 +8736,13 @@ function blendOptions(f) {
8728
8736
  function smartFiltersFromPsd(fx, newId, notes) {
8729
8737
  const filters = [];
8730
8738
  const list2 = descGet(fx, "filterFXList");
8731
- for (const v of _optionalChain([list2, 'optionalAccess', _233 => _233.type]) === "VlLs" ? list2.items : []) {
8739
+ for (const v of _optionalChain([list2, 'optionalAccess', _236 => _236.type]) === "VlLs" ? list2.items : []) {
8732
8740
  if (v.type !== "Objc" && v.type !== "GlbO") continue;
8733
8741
  const item = v.value;
8734
8742
  const { blend, opacity } = blendOptionsOf(item);
8735
8743
  const enabled = descBool(item, "enab") !== false;
8736
8744
  const fltr = descObject(item, "Fltr");
8737
- const radius = _optionalChain([fltr, 'optionalAccess', _234 => _234.classId]) === BOX_BLUR.classId ? descNumber(fltr, "Rds ") : void 0;
8745
+ const radius = _optionalChain([fltr, 'optionalAccess', _237 => _237.classId]) === BOX_BLUR.classId ? descNumber(fltr, "Rds ") : void 0;
8738
8746
  if (radius !== void 0 && radius >= 0 && radius <= 50) {
8739
8747
  filters.push({ id: newId(), kind: "blur", enabled, radius, blend, opacity });
8740
8748
  continue;
@@ -9087,7 +9095,7 @@ function readPsd(bytes) {
9087
9095
  return { header, colorModeData, resources, layers, mergedAlpha, globalBlocks, imageCompression, imageData: r.rest() };
9088
9096
  }
9089
9097
  function layerBlock(rec, key) {
9090
- return _optionalChain([rec, 'access', _235 => _235.blocks, 'access', _236 => _236.find, 'call', _237 => _237((b) => b.key === key), 'optionalAccess', _238 => _238.data]);
9098
+ return _optionalChain([rec, 'access', _238 => _238.blocks, 'access', _239 => _239.find, 'call', _240 => _240((b) => b.key === key), 'optionalAccess', _241 => _241.data]);
9091
9099
  }
9092
9100
  function layerName(rec) {
9093
9101
  const luni = layerBlock(rec, "luni");
@@ -9118,7 +9126,7 @@ function u8Block(rec, key) {
9118
9126
  function layerTree(file) {
9119
9127
  const stack = [[]];
9120
9128
  file.layers.forEach((rec, index) => {
9121
- const kind = _nullishCoalesce(_optionalChain([sectionDivider, 'call', _239 => _239(rec), 'optionalAccess', _240 => _240.kind]), () => ( SECTION_OTHER));
9129
+ const kind = _nullishCoalesce(_optionalChain([sectionDivider, 'call', _242 => _242(rec), 'optionalAccess', _243 => _243.kind]), () => ( SECTION_OTHER));
9122
9130
  if (kind === SECTION_DIVIDER) {
9123
9131
  stack.push([]);
9124
9132
  } else if (kind === SECTION_OPEN || kind === SECTION_CLOSED) {
@@ -9136,7 +9144,7 @@ function layerTree(file) {
9136
9144
  }
9137
9145
  function channelRect(rec, id) {
9138
9146
  if (id === CHANNEL_USER_MASK && rec.mask) return rec.mask.rect;
9139
- if (id === CHANNEL_REAL_USER_MASK && rec.mask) return _nullishCoalesce(_optionalChain([rec, 'access', _241 => _241.mask, 'access', _242 => _242.real, 'optionalAccess', _243 => _243.rect]), () => ( rec.mask.rect));
9147
+ if (id === CHANNEL_REAL_USER_MASK && rec.mask) return _nullishCoalesce(_optionalChain([rec, 'access', _244 => _244.mask, 'access', _245 => _245.real, 'optionalAccess', _246 => _246.rect]), () => ( rec.mask.rect));
9140
9148
  return rec.rect;
9141
9149
  }
9142
9150
  function decodeLayerChannel(file, rec, id) {
@@ -9154,7 +9162,7 @@ function decodeMergedImage(file) {
9154
9162
  return decodePlanes(file.imageCompression, file.imageData, { planes: channels, width, height, depth, psb });
9155
9163
  }
9156
9164
  function resource(file, id) {
9157
- return _optionalChain([file, 'access', _244 => _244.resources, 'access', _245 => _245.find, 'call', _246 => _246((r) => r.id === id), 'optionalAccess', _247 => _247.data]);
9165
+ return _optionalChain([file, 'access', _247 => _247.resources, 'access', _248 => _248.find, 'call', _249 => _249((r) => r.id === id), 'optionalAccess', _250 => _250.data]);
9158
9166
  }
9159
9167
  function resolution(file) {
9160
9168
  const d = resource(file, 1005);
@@ -9938,7 +9946,7 @@ function importNode(ctx, node, depth) {
9938
9946
  if (node.children) {
9939
9947
  const props2 = baseProps(ctx, rec, name, notes);
9940
9948
  const divider = sectionDivider(rec);
9941
- const key = _nullishCoalesce(_optionalChain([divider, 'optionalAccess', _248 => _248.blendKey]), () => ( rec.blendKey));
9949
+ const key = _nullishCoalesce(_optionalChain([divider, 'optionalAccess', _251 => _251.blendKey]), () => ( rec.blendKey));
9942
9950
  const groupBlend = key === "pass" ? "pass-through" : _nullishCoalesce(PSD_BLEND_KEYS[key], () => ( "normal"));
9943
9951
  const children = [];
9944
9952
  for (const child of node.children) {
@@ -9948,7 +9956,7 @@ function importNode(ctx, node, depth) {
9948
9956
  const group = { type: "group", id: ctx.newId(name), ...props2, blend: groupBlend, children };
9949
9957
  const effects2 = recordEffects(ctx, rec, name, notes, true);
9950
9958
  if (effects2) group.effects = effects2;
9951
- if (_optionalChain([divider, 'optionalAccess', _249 => _249.kind]) === SECTION_CLOSED) group.collapsed = true;
9959
+ if (_optionalChain([divider, 'optionalAccess', _252 => _252.kind]) === SECTION_CLOSED) group.collapsed = true;
9952
9960
  const mask2 = recordMask(ctx, rec, name);
9953
9961
  if (mask2) group.mask = mask2;
9954
9962
  entry.type = "group";
@@ -10171,7 +10179,7 @@ function importSmart(ctx, rec, name, notes, props) {
10171
10179
  const file = ctx.linked.get(placed.idnt);
10172
10180
  contents = {
10173
10181
  id: placed.idnt || ctx.newId(`${name}-contents`),
10174
- name: _optionalChain([file, 'optionalAccess', _250 => _250.name]) || `${name}.png`,
10182
+ name: _optionalChain([file, 'optionalAccess', _253 => _253.name]) || `${name}.png`,
10175
10183
  width,
10176
10184
  height,
10177
10185
  kind: "raster",
@@ -10328,7 +10336,7 @@ function psdToLayers(file, options = {}) {
10328
10336
  if (mode !== "rgb" && header.depth > 8 && header.colorMode !== MODE_INDEXED && header.colorMode !== MODE_BITMAP) {
10329
10337
  warn.extra.push(`The file is ${header.depth}-bit ${mode}; it was converted to ${header.depth}-bit RGB.`);
10330
10338
  } else if (mode !== "rgb" || header.depth !== 8 && header.depth !== 16 && header.depth !== 32) {
10331
- const how = header.colorMode === MODE_CMYK ? ` through ${_nullishCoalesce(_optionalChain([cmykProfile, 'optionalAccess', _251 => _251.name]), () => ( "its profile"))}` : "";
10339
+ const how = header.colorMode === MODE_CMYK ? ` through ${_nullishCoalesce(_optionalChain([cmykProfile, 'optionalAccess', _254 => _254.name]), () => ( "its profile"))}` : "";
10332
10340
  warn.extra.push(`The file is ${header.depth}-bit ${mode}; it was converted to 8-bit RGB${how}.`);
10333
10341
  }
10334
10342
  let layers = [];
@@ -10434,15 +10442,15 @@ var pct = (d, key, fallback) => num3(d, key, fallback * 100) / 100;
10434
10442
  var bool = (d, key) => descBool(d, key) === true;
10435
10443
  var enumOf3 = (d, key) => {
10436
10444
  const v = descGet(d, key);
10437
- return _optionalChain([v, 'optionalAccess', _252 => _252.type]) === "enum" ? v.value : void 0;
10445
+ return _optionalChain([v, 'optionalAccess', _255 => _255.type]) === "enum" ? v.value : void 0;
10438
10446
  };
10439
10447
  var text2 = (d, key) => {
10440
10448
  const v = d ? descGet(d, key) : void 0;
10441
- return _optionalChain([v, 'optionalAccess', _253 => _253.type]) === "TEXT" ? v.value : "";
10449
+ return _optionalChain([v, 'optionalAccess', _256 => _256.type]) === "TEXT" ? v.value : "";
10442
10450
  };
10443
10451
  var list = (d, key) => {
10444
10452
  const v = descGet(d, key);
10445
- if (_optionalChain([v, 'optionalAccess', _254 => _254.type]) !== "VlLs") return [];
10453
+ if (_optionalChain([v, 'optionalAccess', _257 => _257.type]) !== "VlLs") return [];
10446
10454
  return v.items.flatMap((it) => it.type === "Objc" || it.type === "GlbO" ? [it.value] : []);
10447
10455
  };
10448
10456
  var clamp3 = (v, lo, hi) => Number.isFinite(v) ? Math.min(hi, Math.max(lo, v)) : lo;
@@ -10512,8 +10520,8 @@ function contourOf(d, key) {
10512
10520
  return { name, points };
10513
10521
  }
10514
10522
  function contourDesc(c) {
10515
- const name = _nullishCoalesce(_optionalChain([c, 'optionalAccess', _255 => _255.name]), () => ( "Linear"));
10516
- const points = _nullishCoalesce(_optionalChain([c, 'optionalAccess', _256 => _256.points]), () => ( [
10523
+ const name = _nullishCoalesce(_optionalChain([c, 'optionalAccess', _258 => _258.name]), () => ( "Linear"));
10524
+ const points = _nullishCoalesce(_optionalChain([c, 'optionalAccess', _259 => _259.points]), () => ( [
10517
10525
  { input: 0, output: 0 },
10518
10526
  { input: 1, output: 1 }
10519
10527
  ]));
@@ -10548,7 +10556,7 @@ function gradientOf(d, notes) {
10548
10556
  { position: 0, color: "#000000" },
10549
10557
  { position: 1, color: "#ffffff" }
10550
10558
  ],
10551
- style: _nullishCoalesce(_optionalChain([GRADIENT_STYLES, 'access', _257 => _257.find, 'call', _258 => _258(([, id]) => id === enumOf3(d, "Type")), 'optionalAccess', _259 => _259[0]]), () => ( "linear")),
10559
+ style: _nullishCoalesce(_optionalChain([GRADIENT_STYLES, 'access', _260 => _260.find, 'call', _261 => _261(([, id]) => id === enumOf3(d, "Type")), 'optionalAccess', _262 => _262[0]]), () => ( "linear")),
10552
10560
  angle: clamp3(num3(d, "Angl", 90), -360, 360),
10553
10561
  scale: clamp3(pct(d, "Scl ", 1), 0.1, 1.5),
10554
10562
  reverse: bool(d, "Rvrs"),
@@ -10602,7 +10610,7 @@ function gradientItems(g) {
10602
10610
  )
10603
10611
  )
10604
10612
  };
10605
- const op = _optionalChain([g, 'access', _260 => _260.opacityStops, 'optionalAccess', _261 => _261.length]) ? g.opacityStops : g.stops.map((s) => ({ position: s.position, opacity: 1 }));
10613
+ const op = _optionalChain([g, 'access', _263 => _263.opacityStops, 'optionalAccess', _264 => _264.length]) ? g.opacityStops : g.stops.map((s) => ({ position: s.position, opacity: 1 }));
10606
10614
  const trns = {
10607
10615
  type: "VlLs",
10608
10616
  items: op.map(
@@ -11099,9 +11107,9 @@ function prepareNestedLayers(layers) {
11099
11107
  if (l.type === "annotation") continue;
11100
11108
  let next = l;
11101
11109
  if (l.type === "group") next = { ...l, children: prepareNestedLayers(l.children) };
11102
- else if (l.type === "pixel" && (_optionalChain([l, 'access', _262 => _262.filters, 'optionalAccess', _263 => _263.length]) || l.source === "document")) {
11110
+ else if (l.type === "pixel" && (_optionalChain([l, 'access', _265 => _265.filters, 'optionalAccess', _266 => _266.length]) || l.source === "document")) {
11103
11111
  const p = { ...l };
11104
- if (_optionalChain([l, 'access', _264 => _264.filters, 'optionalAccess', _265 => _265.some, 'call', _266 => _266(isActiveFilter)])) {
11112
+ if (_optionalChain([l, 'access', _267 => _267.filters, 'optionalAccess', _268 => _268.some, 'call', _269 => _269(isActiveFilter)])) {
11105
11113
  const b = l.surface.bounds;
11106
11114
  if (b) {
11107
11115
  const r = { x: b.x + l.offset.x - 64, y: b.y + l.offset.y - 64, width: b.width + 128, height: b.height + 128 };
@@ -11118,7 +11126,7 @@ function prepareNestedLayers(layers) {
11118
11126
  delete p.source;
11119
11127
  next = p;
11120
11128
  }
11121
- if (_optionalChain([next, 'access', _267 => _267.mask, 'optionalAccess', _268 => _268.source])) {
11129
+ if (_optionalChain([next, 'access', _270 => _270.mask, 'optionalAccess', _271 => _271.source])) {
11122
11130
  next = { ...next };
11123
11131
  delete next.mask;
11124
11132
  }
@@ -11224,7 +11232,7 @@ function exportPsd(input) {
11224
11232
  return {
11225
11233
  opacity: Math.round(Math.min(1, Math.max(0, layer.opacity)) * 255),
11226
11234
  clipping: layer.clipped ? 1 : 0,
11227
- flags: (layer.visible ? 0 : LAYER_FLAG_HIDDEN) | (_optionalChain([layer, 'access', _269 => _269.locks, 'optionalAccess', _270 => _270.transparency]) ? LAYER_FLAG_TRANSPARENCY_PROTECTED : 0),
11235
+ flags: (layer.visible ? 0 : LAYER_FLAG_HIDDEN) | (_optionalChain([layer, 'access', _272 => _272.locks, 'optionalAccess', _273 => _273.transparency]) ? LAYER_FLAG_TRANSPARENCY_PROTECTED : 0),
11228
11236
  legacyName: name,
11229
11237
  blocks
11230
11238
  };
@@ -11281,7 +11289,7 @@ function exportPsd(input) {
11281
11289
  }
11282
11290
  case "pixel": {
11283
11291
  if (layer.source === "document") throw new PsdError(`Layer "${layer.name}" reads the document image; resolve its pixels before export.`);
11284
- if (_optionalChain([layer, 'access', _271 => _271.filters, 'optionalAccess', _272 => _272.some, 'call', _273 => _273(isActiveFilter)])) throw new PsdError(`Layer "${layer.name}" has live filters; bake them before export.`);
11292
+ if (_optionalChain([layer, 'access', _274 => _274.filters, 'optionalAccess', _275 => _275.some, 'call', _276 => _276(isActiveFilter)])) throw new PsdError(`Layer "${layer.name}" has live filters; bake them before export.`);
11285
11293
  const extra = [];
11286
11294
  if (layer.fillOpacity !== void 0 && layer.fillOpacity < 1) {
11287
11295
  extra.push({ key: "iOpa", data: Uint8Array.from([Math.round(Math.max(0, layer.fillOpacity) * 255), 0, 0, 0]) });
@@ -11313,7 +11321,7 @@ function exportPsd(input) {
11313
11321
  if (c.linked) note("Linked smart objects were embedded (their preview is written as the contents)", layer.name);
11314
11322
  linkedFiles.set(idnt, smartContentsFile(c));
11315
11323
  }
11316
- let placedId = _nullishCoalesce(_optionalChain([layer, 'access', _274 => _274.psd, 'optionalAccess', _275 => _275.placed]), () => ( psdUuid(`${layer.id}:placed`)));
11324
+ let placedId = _nullishCoalesce(_optionalChain([layer, 'access', _277 => _277.psd, 'optionalAccess', _278 => _278.placed]), () => ( psdUuid(`${layer.id}:placed`)));
11317
11325
  if (placedIds.has(placedId)) placedId = psdUuid(`${layer.id}:placed:${placedIds.size}`);
11318
11326
  placedIds.add(placedId);
11319
11327
  if (placedUnchanged(layer, idnt, placedId)) {
@@ -11323,12 +11331,12 @@ function exportPsd(input) {
11323
11331
  const filterFX = layer.smartFilters ? filterFXDescriptor(layer.smartFilters, dropped) : void 0;
11324
11332
  if (dropped.length) note("Develop smart filters have no Photoshop filter and were left out of the filter list (the layer\u2019s pixels still show them)", layer.name);
11325
11333
  const raw = layer.psd && layer.psd.key !== "PlLd" ? parsePlaced(layer.psd.key, layer.psd.data) : null;
11326
- const spec = { idnt, placed: placedId, placement: layer.placement, size: { width: c.width, height: c.height }, filterFX, template: _optionalChain([raw, 'optionalAccess', _276 => _276.descriptor]) };
11334
+ const spec = { idnt, placed: placedId, placement: layer.placement, size: { width: c.width, height: c.height }, filterFX, template: _optionalChain([raw, 'optionalAccess', _279 => _279.descriptor]) };
11327
11335
  const wnotes = [];
11328
11336
  extra.push({ key: "PlLd", data: plldBytes(spec) }, { key: "SoLd", data: soldBytes(spec, wnotes) });
11329
11337
  for (const n2 of wnotes) note(`A smart object: ${n2}`, layer.name);
11330
11338
  }
11331
- const fm = _optionalChain([layer, 'access', _277 => _277.smartFilters, 'optionalAccess', _278 => _278.mask]);
11339
+ const fm = _optionalChain([layer, 'access', _280 => _280.smartFilters, 'optionalAccess', _281 => _281.mask]);
11332
11340
  if (fm && !fm.source) filterItems.push(filterMaskItem(placedId, fm, { x: 0, y: 0, width, height }));
11333
11341
  const rec = { ...common2(layer, extra), rect: EMPTY_RECT, channels: [], blendKey: _nullishCoalesce(BLEND_TO_PSD[layer.blend], () => ( "norm")) };
11334
11342
  const bounds = _chunkCWM3CUUXcjs.contentBounds.call(void 0, layer.surface);
@@ -11356,8 +11364,8 @@ function exportPsd(input) {
11356
11364
  const losses = /* @__PURE__ */ new Set();
11357
11365
  for (const b of shapeBlocks(layer, width, height, _nullishCoalesce(input.resolution, () => ( 72)), losses)) extra.push({ key: b.key, data: padEven(b.data) });
11358
11366
  for (const n2 of losses) note(n2, layer.name);
11359
- if (_optionalChain([layer, 'access', _279 => _279.fill, 'optionalAccess', _280 => _280.type]) === "pattern") patternIds2.add(layer.fill.patternId);
11360
- if (_optionalChain([layer, 'access', _281 => _281.stroke, 'optionalAccess', _282 => _282.paint, 'access', _283 => _283.type]) === "pattern") patternIds2.add(layer.stroke.paint.patternId);
11367
+ if (_optionalChain([layer, 'access', _282 => _282.fill, 'optionalAccess', _283 => _283.type]) === "pattern") patternIds2.add(layer.fill.patternId);
11368
+ if (_optionalChain([layer, 'access', _284 => _284.stroke, 'optionalAccess', _285 => _285.paint, 'access', _286 => _286.type]) === "pattern") patternIds2.add(layer.stroke.paint.patternId);
11361
11369
  } else {
11362
11370
  extra.push({ key: "TySh", data: padEven(tyShForLayer(layer)) });
11363
11371
  }
@@ -11421,7 +11429,7 @@ function exportPsd(input) {
11421
11429
  { id: 1005, name: "", data: rw.result() },
11422
11430
  { id: 1057, name: "", data: version.result() }
11423
11431
  ];
11424
- if (_optionalChain([input, 'access', _284 => _284.iccProfile, 'optionalAccess', _285 => _285.length])) resources.push({ id: 1039, name: "", data: input.iccProfile });
11432
+ if (_optionalChain([input, 'access', _287 => _287.iccProfile, 'optionalAccess', _288 => _288.length])) resources.push({ id: 1039, name: "", data: input.iccProfile });
11425
11433
  if (input.globalLight) {
11426
11434
  const i32 = (v) => {
11427
11435
  const w = new PsdWriter();
@@ -11836,4 +11844,5 @@ function exportPsd(input) {
11836
11844
 
11837
11845
 
11838
11846
 
11839
- 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.SELECTION_MODES = SELECTION_MODES; exports.isSelectionMode = isSelectionMode; exports.parseSelectionMode = parseSelectionMode; exports.computeSelectionBounds = computeSelectionBounds; exports.createSelectionMask = createSelectionMask; exports.fullSelection = fullSelection; exports.isSelectionEmpty = isSelectionEmpty; exports.selectionValueAt = selectionValueAt; exports.coverageToByte = coverageToByte; exports.selectionFromCoverage = selectionFromCoverage; exports.selectionToCoverage = selectionToCoverage; exports.selectionArea = selectionArea; exports.combineSelections = combineSelections; exports.invertSelection = invertSelection; exports.resizeSelection = resizeSelection; exports.selectionFromPixels = selectionFromPixels; exports.selectionToPixels = selectionToPixels; exports.encodeSelectionRle = encodeSelectionRle; exports.decodeSelectionRle = decodeSelectionRle; exports.serializeSelection = serializeSelection; exports.deserializeSelection = deserializeSelection; exports.hashMaskContent = hashMaskContent; exports.EMPTY_DISTANCE = EMPTY_DISTANCE; exports.distanceTransform = distanceTransform; exports.expandCoverage = expandCoverage; exports.contractCoverage = contractCoverage; exports.borderCoverage = borderCoverage; exports.smoothCoverage = smoothCoverage; exports.featherCoverage = featherCoverage; exports.greyMorphology = greyMorphology; exports.shiftCoverage = shiftCoverage; exports.SELECTION_MODIFY_OPS = SELECTION_MODIFY_OPS; exports.modifySelection = modifySelection; 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.TEXT_ALIGNS = TEXT_ALIGNS; 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.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.flattenPath = flattenPath; exports.rasterizeCoverage = rasterizeCoverage; 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.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.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.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.serializeEffects = serializeEffects; exports.deserializeEffects = deserializeEffects; 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.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.decodePlanes = decodePlanes; exports.encodeRle = encodeRle; 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;
11847
+
11848
+ 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.SELECTION_MODES = SELECTION_MODES; exports.isSelectionMode = isSelectionMode; exports.parseSelectionMode = parseSelectionMode; exports.computeSelectionBounds = computeSelectionBounds; exports.createSelectionMask = createSelectionMask; exports.fullSelection = fullSelection; exports.isSelectionEmpty = isSelectionEmpty; exports.selectionValueAt = selectionValueAt; exports.coverageToByte = coverageToByte; exports.selectionFromCoverage = selectionFromCoverage; exports.selectionToCoverage = selectionToCoverage; exports.selectionArea = selectionArea; exports.combineSelections = combineSelections; exports.invertSelection = invertSelection; exports.resizeSelection = resizeSelection; exports.selectionFromPixels = selectionFromPixels; exports.selectionToPixels = selectionToPixels; exports.encodeSelectionRle = encodeSelectionRle; exports.decodeSelectionRle = decodeSelectionRle; exports.serializeSelection = serializeSelection; exports.deserializeSelection = deserializeSelection; exports.hashMaskContent = hashMaskContent; exports.EMPTY_DISTANCE = EMPTY_DISTANCE; exports.distanceTransform = distanceTransform; exports.expandCoverage = expandCoverage; exports.contractCoverage = contractCoverage; exports.borderCoverage = borderCoverage; exports.smoothCoverage = smoothCoverage; exports.featherCoverage = featherCoverage; exports.greyMorphology = greyMorphology; exports.shiftCoverage = shiftCoverage; exports.SELECTION_MODIFY_OPS = SELECTION_MODIFY_OPS; exports.modifySelection = modifySelection; 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.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.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.flattenPath = flattenPath; exports.rasterizeCoverage = rasterizeCoverage; 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.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.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.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.serializeEffects = serializeEffects; exports.deserializeEffects = deserializeEffects; 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.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.decodePlanes = decodePlanes; exports.encodeRle = encodeRle; 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;
@@ -2385,6 +2385,7 @@ function removeAlpha(imageData) {
2385
2385
  var TEXT_ALIGNS = ["left", "center", "right", "justify"];
2386
2386
 
2387
2387
  // src/image-editor/layers/model.ts
2388
+ var MAX_EFFECT_ANIMATION_MS = 6e4;
2388
2389
  var SHAPE_OPERATIONS = ["combine", "subtract", "intersect", "exclude"];
2389
2390
  var LIVE_SHAPE_KINDS = ["rect", "ellipse", "polygon", "star", "line"];
2390
2391
  var idCounter = 0;
@@ -5926,7 +5927,14 @@ function deserializeLayer(raw, ctx) {
5926
5927
  const filters = readFilters(r.filters);
5927
5928
  if (filters) layer.filters = filters;
5928
5929
  const generator = readEffectRef(r.generator);
5929
- if (generator) layer.generator = { ...generator, ...typeof r.generator.time === "number" && r.generator.time > 0 ? { time: r.generator.time } : {} };
5930
+ if (generator) {
5931
+ const duration = r.generator.animate?.duration;
5932
+ layer.generator = {
5933
+ ...generator,
5934
+ ...typeof r.generator.time === "number" && r.generator.time > 0 ? { time: r.generator.time } : {},
5935
+ ...typeof duration === "number" && Number.isFinite(duration) && duration > 0 ? { animate: { duration: Math.min(duration, MAX_EFFECT_ANIMATION_MS) } } : {}
5936
+ };
5937
+ }
5930
5938
  return layer;
5931
5939
  }
5932
5940
  case "adjustment": {
@@ -11609,6 +11617,7 @@ export {
11609
11617
  applyDepthMask,
11610
11618
  removeAlpha,
11611
11619
  TEXT_ALIGNS,
11620
+ MAX_EFFECT_ANIMATION_MS,
11612
11621
  SHAPE_OPERATIONS,
11613
11622
  LIVE_SHAPE_KINDS,
11614
11623
  newLayerId,