@pixodesk/svg-animator-vue 1.0.28 → 1.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -57788,7 +57788,7 @@ ${codeFrame}` : message);
57788
57788
  auto: "auto",
57789
57789
  exact: "exact"
57790
57790
  };
57791
- var PxTrimSubPaths = {
57791
+ var PxStrokeTrimSubPaths = {
57792
57792
  separate: "separate",
57793
57793
  combined: "combined"
57794
57794
  };
@@ -57943,6 +57943,7 @@ ${codeFrame}` : message);
57943
57943
  subject: px.string().optional(),
57944
57944
  smoothing: px.number().optional(),
57945
57945
  pin: px.boolean().optional(),
57946
+ pinAlign: px.enum(["top", "center", "bottom"]).optional(),
57946
57947
  pinTop: px.number().optional(),
57947
57948
  pinDistance: px.number().optional(),
57948
57949
  range: PxScrollRangeSchema.optional()
@@ -58025,10 +58026,10 @@ ${codeFrame}` : message);
58025
58026
  d: PxAnimatableStringSchema.optional(),
58026
58027
  animate: PxPropertyAnimationSchema.optional()
58027
58028
  }));
58028
- var PxTrimPathEffectSchema = implementsInterface()(px.object({
58029
+ var PxStrokeTrimEffectSchema = implementsInterface()(px.object({
58029
58030
  offset: PxAnimatableNumberSchema.optional(),
58030
58031
  range: PxAnimatableVec2Schema.optional(),
58031
- subPaths: px.enum([PxTrimSubPaths.separate, PxTrimSubPaths.combined]).optional()
58032
+ subPaths: px.enum([PxStrokeTrimSubPaths.separate, PxStrokeTrimSubPaths.combined]).optional()
58032
58033
  }));
58033
58034
  var PxRetimeEffectSchema = implementsInterface()(px.object({
58034
58035
  sourceId: px.string().optional(),
@@ -58082,7 +58083,7 @@ ${codeFrame}` : message);
58082
58083
  repeater: PxRepeaterEffectSchema.optional(),
58083
58084
  maskedBy: PxMaskedByEffectSchema.optional(),
58084
58085
  clipPath: PxClipPathEffectSchema.optional(),
58085
- trimPath: PxTrimPathEffectSchema.optional(),
58086
+ strokeTrim: PxStrokeTrimEffectSchema.optional(),
58086
58087
  clone: PxCloneEffectSchema.optional(),
58087
58088
  fillGradient: PxFillGradientEffectSchema.optional(),
58088
58089
  strokeGradient: PxStrokeGradientEffectSchema.optional(),
@@ -61173,6 +61174,19 @@ ${codeFrame}` : message);
61173
61174
  TEXT_CONTENT_ATTR,
61174
61175
  "xml:space"
61175
61176
  ];
61177
+ var PAINT_STATIC_KEYS = [
61178
+ "fillOpacity",
61179
+ "fillRule",
61180
+ "strokeOpacity",
61181
+ "strokeDasharray",
61182
+ "strokeDashoffset",
61183
+ "strokeLinecap",
61184
+ "strokeLinejoin",
61185
+ "strokeMiterlimit",
61186
+ "mixBlendMode",
61187
+ "filter"
61188
+ ];
61189
+ var PAINT_ANIMATE_KEYS = ["fill", "stroke", "strokeWidth", "opacity", "fillOpacity", "strokeOpacity", "strokeDasharray", "strokeDashoffset"];
61176
61190
  function parseLen(v) {
61177
61191
  if (typeof v === "number") return v;
61178
61192
  if (typeof v === "string") {
@@ -61184,17 +61198,39 @@ ${codeFrame}` : message);
61184
61198
  function str(v) {
61185
61199
  return typeof v === "string" ? v : void 0;
61186
61200
  }
61201
+ function paintAnimateOf(node) {
61202
+ const bag = node.animate;
61203
+ if (!bag || typeof bag !== "object") return void 0;
61204
+ let out;
61205
+ for (const k of PAINT_ANIMATE_KEYS) {
61206
+ if (bag[k] !== void 0) (out != null ? out : out = {})[k] = bag[k];
61207
+ }
61208
+ return out;
61209
+ }
61187
61210
  function resolveStyle2(node, parent) {
61188
- var _a, _b, _c, _d, _e, _f, _g;
61189
- return {
61211
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
61212
+ const isTextRoot = node.type === "text";
61213
+ const nodeStyle = node.style;
61214
+ const own = (key) => {
61215
+ var _a2;
61216
+ return isTextRoot ? void 0 : (_a2 = node[key]) != null ? _a2 : nodeStyle == null ? void 0 : nodeStyle[key];
61217
+ };
61218
+ const res = {
61190
61219
  fontFamily: (_a = str(node.fontFamily)) != null ? _a : parent.fontFamily,
61191
61220
  fontSize: (_b = parseLen(node.fontSize)) != null ? _b : parent.fontSize,
61192
61221
  fill: (_c = node.fill) != null ? _c : parent.fill,
61193
61222
  stroke: (_d = node.stroke) != null ? _d : parent.stroke,
61194
61223
  strokeWidth: (_e = node.strokeWidth) != null ? _e : parent.strokeWidth,
61195
61224
  letterSpacing: (_f = parseLen(node.letterSpacing)) != null ? _f : parent.letterSpacing,
61196
- wordSpacing: (_g = parseLen(node.wordSpacing)) != null ? _g : parent.wordSpacing
61225
+ wordSpacing: (_g = parseLen(node.wordSpacing)) != null ? _g : parent.wordSpacing,
61226
+ opacity: (_h = parseLen(own("opacity"))) != null ? _h : parent.opacity,
61227
+ animate: (_i = isTextRoot ? void 0 : paintAnimateOf(node)) != null ? _i : parent.animate
61197
61228
  };
61229
+ for (const key of PAINT_STATIC_KEYS) {
61230
+ const v = (_j = own(key)) != null ? _j : parent[key];
61231
+ if (v !== void 0) res[key] = v;
61232
+ }
61233
+ return res;
61198
61234
  }
61199
61235
  function rootStyleOf(node) {
61200
61236
  var _a, _b, _c;
@@ -61213,6 +61249,11 @@ ${codeFrame}` : message);
61213
61249
  if (s.fill !== void 0) p.fill = s.fill;
61214
61250
  if (s.stroke !== void 0) p.stroke = s.stroke;
61215
61251
  if (s.strokeWidth !== void 0) p.strokeWidth = s.strokeWidth;
61252
+ if (s.opacity !== void 0 && s.opacity !== 1) p.opacity = s.opacity;
61253
+ for (const key of PAINT_STATIC_KEYS) {
61254
+ if (s[key] !== void 0) p[key] = s[key];
61255
+ }
61256
+ if (s.animate !== void 0) p.animate = s.animate;
61216
61257
  return p;
61217
61258
  }
61218
61259
  function glyphFontFor(s, glyphs, soleFont, warnings) {
@@ -61226,6 +61267,7 @@ ${codeFrame}` : message);
61226
61267
  return names.length === 1 ? glyphs[names[0]] : void 0;
61227
61268
  }
61228
61269
  var MISSING_GLYPH_ADVANCE_EM = 0.6;
61270
+ var MISSING_GLYPH_CLASS_NAME = "px-missing-glyph";
61229
61271
  function missingGlyphBoxEm(advanceEm, ascentEm) {
61230
61272
  if (advanceEm <= 0 || ascentEm <= 0) return "";
61231
61273
  const inset = 0.08;
@@ -61261,7 +61303,7 @@ ${codeFrame}` : message);
61261
61303
  pen.x += g.width * scale;
61262
61304
  } else if (/\S/.test(ch)) {
61263
61305
  const advEm = g && g.width > 0 ? g.width : MISSING_GLYPH_ADVANCE_EM * upm;
61264
- placements.push({ glyphD: missingGlyphBoxEm(advEm, ascentEm), m: [scale, 0, 0, scale, pen.x, pen.y], paint, line, x: pen.x, y: pen.y, scale });
61306
+ placements.push({ glyphD: missingGlyphBoxEm(advEm, ascentEm), m: [scale, 0, 0, scale, pen.x, pen.y], paint, isMissing: true, line, x: pen.x, y: pen.y, scale });
61265
61307
  pen.x += advEm * scale;
61266
61308
  } else {
61267
61309
  pen.x += (g ? g.width : 0) * scale;
@@ -61324,7 +61366,7 @@ ${codeFrame}` : message);
61324
61366
  } else if (/\S/.test(ch)) {
61325
61367
  const wEm = g && g.width > 0 ? g.width : MISSING_GLYPH_ADVANCE_EM * gf.unitsPerEm;
61326
61368
  const boxAdv = wEm * scale;
61327
- cells.push({ glyphD: missingGlyphBoxEm(wEm, ascentEm), widthEm: wEm, scale, paint, midBase: adv + boxAdv / 2 });
61369
+ cells.push({ glyphD: missingGlyphBoxEm(wEm, ascentEm), widthEm: wEm, scale, paint, isMissing: true, midBase: adv + boxAdv / 2 });
61328
61370
  adv += boxAdv;
61329
61371
  } else {
61330
61372
  adv += (g ? g.width : 0) * scale;
@@ -61380,6 +61422,7 @@ ${codeFrame}` : message);
61380
61422
  const placements = placeCells.map((c) => ({
61381
61423
  glyphD: c.glyphD,
61382
61424
  paint: c.paint,
61425
+ isMissing: c.isMissing,
61383
61426
  m: alongAffine(sampler, base + c.midBase * k, c.scale, c.widthEm, perp)
61384
61427
  }));
61385
61428
  return toGroup(node, buildPaths(placements, create, warnings), create);
@@ -61468,12 +61511,13 @@ ${codeFrame}` : message);
61468
61511
  const transform = { keyframes: kfs };
61469
61512
  if (loop !== void 0) transform.loop = loop;
61470
61513
  const animate = { transform };
61514
+ if (c.paint.animate) Object.assign(animate, c.paint.animate);
61471
61515
  if (isClip && opKfs.some((k) => k.value === 0)) {
61472
61516
  const op = { keyframes: opKfs };
61473
61517
  if (loop !== void 0) op.loop = loop;
61474
61518
  animate.opacity = op;
61475
61519
  }
61476
- out.push(create("path", __spreadProps2(__spreadValues2({ d }, paintProps(c.paint)), { animate }), []));
61520
+ out.push(create("path", __spreadProps2(__spreadValues2(__spreadValues2({ d }, paintProps(c.paint)), missingGlyphProps(c.isMissing)), { animate }), []));
61477
61521
  }
61478
61522
  return out;
61479
61523
  }
@@ -61482,24 +61526,34 @@ ${codeFrame}` : message);
61482
61526
  if (paint.fill !== void 0) p.fill = paint.fill;
61483
61527
  if (paint.stroke !== void 0) p.stroke = paint.stroke;
61484
61528
  if (paint.strokeWidth !== void 0) p.strokeWidth = paint.strokeWidth;
61529
+ if (paint.opacity !== void 0) p.opacity = paint.opacity;
61530
+ for (const key of PAINT_STATIC_KEYS) {
61531
+ if (paint[key] !== void 0) p[key] = paint[key];
61532
+ }
61485
61533
  return p;
61486
61534
  }
61535
+ function missingGlyphProps(isMissing) {
61536
+ return isMissing ? { class: MISSING_GLYPH_CLASS_NAME } : {};
61537
+ }
61487
61538
  function buildPaths(placements, create, warnings) {
61488
- var _a, _b, _c;
61489
61539
  if (!placements.length) {
61490
61540
  warnings == null ? void 0 : warnings.push("textGlyphs: nothing to render");
61491
61541
  return [];
61492
61542
  }
61493
61543
  const byPaint = /* @__PURE__ */ new Map();
61494
61544
  for (const p of placements) {
61495
- const key = JSON.stringify([(_a = p.paint.fill) != null ? _a : null, (_b = p.paint.stroke) != null ? _b : null, (_c = p.paint.strokeWidth) != null ? _c : null]);
61545
+ const key = JSON.stringify([p.paint, !!p.isMissing]);
61496
61546
  const baked = transformPathData(p.glyphD, p.m);
61497
61547
  const entry = byPaint.get(key);
61498
61548
  if (entry) entry.d += baked;
61499
- else byPaint.set(key, { paint: p.paint, d: baked });
61549
+ else byPaint.set(key, { paint: p.paint, d: baked, isMissing: p.isMissing });
61500
61550
  }
61501
61551
  const out = [];
61502
- for (const { paint, d } of byPaint.values()) out.push(create("path", __spreadValues2({ d }, paintProps(paint)), []));
61552
+ for (const { paint, d, isMissing } of byPaint.values()) {
61553
+ out.push(create("path", __spreadValues2(__spreadValues2(__spreadValues2({
61554
+ d
61555
+ }, paintProps(paint)), missingGlyphProps(isMissing)), paint.animate !== void 0 ? { animate: __spreadValues2({}, paint.animate) } : {}), []));
61556
+ }
61503
61557
  return out;
61504
61558
  }
61505
61559
  function toGroup(node, children, create) {
@@ -61531,9 +61585,9 @@ ${codeFrame}` : message);
61531
61585
  }
61532
61586
  return materialiseGlyphTextAlongPath(node, pathD, startOffset, { glyphs: ctx.glyphs, warnings: ctx.warnings }, textLength, pathOverflow);
61533
61587
  }
61534
- function applyTrimPathEffect(node, trimPath, ctx) {
61535
- if (!trimPath) return node;
61536
- const combined = trimPath.subPaths === PxTrimSubPaths.combined;
61588
+ function applyStrokeTrimEffect(node, strokeTrim, ctx) {
61589
+ if (!strokeTrim) return node;
61590
+ const combined = strokeTrim.subPaths === PxStrokeTrimSubPaths.combined;
61537
61591
  const leafEntries = [];
61538
61592
  const measure = (n) => {
61539
61593
  if (Array.isArray(n.children) && n.children.length > 0) {
@@ -61564,9 +61618,9 @@ ${codeFrame}` : message);
61564
61618
  }
61565
61619
  const chainLengthPx = acc;
61566
61620
  if (combined && chainLengthPx < 1e-3) return node;
61567
- const offsetReadRaw = readAnimatable(trimPath.offset);
61621
+ const offsetReadRaw = readAnimatable(strokeTrim.offset);
61568
61622
  const offsetRead = offsetReadRaw.kind === "absent" ? { kind: "static", value: 0 } : offsetReadRaw;
61569
- const rangeReadRaw = readRangeWithCrossings(trimPath.range);
61623
+ const rangeReadRaw = readRangeWithCrossings(strokeTrim.range);
61570
61624
  const rangeRead = rangeReadRaw.kind === "absent" ? { kind: "static", value: [0, 1] } : rangeReadRaw;
61571
61625
  const offsetValues = readScalarValues(offsetRead);
61572
61626
  const minOffset = offsetValues.length ? Math.min(...offsetValues) : 0;
@@ -61896,7 +61950,7 @@ ${codeFrame}` : message);
61896
61950
  const originalId = typeof node.id === "string" ? node.id : void 0;
61897
61951
  const innerIdForContentRef = originalId ? ctx.contentRefInnerIds.get(originalId) : void 0;
61898
61952
  if (!fx && !innerIdForContentRef) return node;
61899
- const { transformBy, repeater, maskedBy, clipPath, trimPath, clone: cloneFx, fillGradient, strokeGradient, textPath, text } = fx != null ? fx : {};
61953
+ const { transformBy, repeater, maskedBy, clipPath, strokeTrim, clone: cloneFx, fillGradient, strokeGradient, textPath, text } = fx != null ? fx : {};
61900
61954
  if (fx) delete node.effects;
61901
61955
  let n = node;
61902
61956
  let consumedByGlyphs = false;
@@ -61916,7 +61970,7 @@ ${codeFrame}` : message);
61916
61970
  if (!consumedByGlyphs) n = applyTextPathEffect(n, textPath, ctx);
61917
61971
  n = applyFillGradientEffect(n, fillGradient, ctx);
61918
61972
  n = applyStrokeGradientEffect(n, strokeGradient, ctx);
61919
- n = applyTrimPathEffect(n, trimPath, ctx);
61973
+ n = applyStrokeTrimEffect(n, strokeTrim, ctx);
61920
61974
  n = applyRepeaterEffect(n, repeater, ctx);
61921
61975
  n = applyMaskedByEffect(n, maskedBy, transformBy, ctx);
61922
61976
  n = applyClipPathEffect(n, clipPath, ctx);
@@ -63000,8 +63054,11 @@ ${codeFrame}` : message);
63000
63054
  driver.refresh();
63001
63055
  return driver;
63002
63056
  }
63057
+ function pinScrollportHeight(svgRoot) {
63058
+ const scroller = findNearestScroller(svgRoot, "y");
63059
+ return scroller ? scroller.clientHeight : document.documentElement.clientHeight;
63060
+ }
63003
63061
  function applyScrollPin(svgRoot, scroll) {
63004
- var _a;
63005
63062
  const styled = svgRoot;
63006
63063
  if (!(scroll == null ? void 0 : scroll.pin) || !styled.style) return () => {
63007
63064
  };
@@ -63009,7 +63066,28 @@ ${codeFrame}` : message);
63009
63066
  const prevPosition = style.position;
63010
63067
  const prevTop = style.top;
63011
63068
  style.position = "sticky";
63012
- style.top = ((_a = scroll.pinTop) != null ? _a : 0) + "px";
63069
+ const alignFactor = scroll.pinAlign === "center" ? 0.5 : scroll.pinAlign === "bottom" ? 1 : 0;
63070
+ const applyTop = () => {
63071
+ var _a;
63072
+ const extra = (_a = scroll.pinTop) != null ? _a : 0;
63073
+ if (!alignFactor) {
63074
+ style.top = extra + "px";
63075
+ return;
63076
+ }
63077
+ const portSize = pinScrollportHeight(svgRoot);
63078
+ const ownSize = svgRoot.getBoundingClientRect().height;
63079
+ style.top = Math.round((portSize - ownSize) * alignFactor + extra) + "px";
63080
+ };
63081
+ applyTop();
63082
+ let resizeObserver = null;
63083
+ const onWindowResize = alignFactor ? applyTop : null;
63084
+ if (alignFactor) {
63085
+ if (onWindowResize) window.addEventListener("resize", onWindowResize);
63086
+ if (typeof ResizeObserver !== "undefined") {
63087
+ resizeObserver = new ResizeObserver(applyTop);
63088
+ resizeObserver.observe(svgRoot);
63089
+ }
63090
+ }
63013
63091
  let wrapper = null;
63014
63092
  const parent = svgRoot.parentElement;
63015
63093
  if (scroll.pinDistance && scroll.pinDistance > 0 && parent) {
@@ -63020,6 +63098,8 @@ ${codeFrame}` : message);
63020
63098
  wrapper.appendChild(svgRoot);
63021
63099
  }
63022
63100
  return () => {
63101
+ if (onWindowResize) window.removeEventListener("resize", onWindowResize);
63102
+ resizeObserver == null ? void 0 : resizeObserver.disconnect();
63023
63103
  style.position = prevPosition;
63024
63104
  style.top = prevTop;
63025
63105
  if (wrapper == null ? void 0 : wrapper.parentElement) {