sketchmark 1.4.0 → 1.4.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAiB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC1C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;IACzC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,CAgG9D"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAiB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAGlD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC1C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,eAAe,CAAC;IACzC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,CAiG9D"}
@@ -11402,8 +11402,11 @@ var AIDiagram = (function (exports) {
11402
11402
  * 4. After guide finishes → fade in rough.js element, remove guide
11403
11403
  */
11404
11404
  _animateAnnotation(roughEl, guideD, silent) {
11405
- if (silent)
11405
+ if (silent) {
11406
+ roughEl.style.opacity = "1";
11407
+ roughEl.style.transition = "none";
11406
11408
  return;
11409
+ }
11407
11410
  // Hide rough.js element — will be revealed after guide draws
11408
11411
  roughEl.style.opacity = "0";
11409
11412
  roughEl.style.transition = "none";
@@ -11693,10 +11696,74 @@ var AIDiagram = (function (exports) {
11693
11696
  .skm-caption { pointer-events: none; user-select: none; }
11694
11697
  `;
11695
11698
 
11699
+ const exportAnimationState = new WeakMap();
11700
+ function bindExportAnimationState(svg, state) {
11701
+ exportAnimationState.set(svg, state);
11702
+ }
11703
+ function getExportAnimationState(svg) {
11704
+ return exportAnimationState.get(svg);
11705
+ }
11706
+
11696
11707
  // ============================================================
11697
11708
  // sketchmark — Export System
11698
11709
  // SVG, PNG, Canvas, GIF (stub), MP4 (stub)
11699
11710
  // ============================================================
11711
+ const EXPORT_SVG_STYLE_ID = "sketchmark-export-state";
11712
+ const EXPORT_SVG_STATE_CSS = `
11713
+ .ng, .gg, .tg, .ntg, .cg, .eg, .mdg {
11714
+ animation: none !important;
11715
+ transition: none !important;
11716
+ }
11717
+
11718
+ .ng.hidden { opacity: 0 !important; pointer-events: none !important; }
11719
+ .gg.gg-hidden,
11720
+ .tg.gg-hidden,
11721
+ .ntg.gg-hidden,
11722
+ .cg.gg-hidden,
11723
+ .eg.gg-hidden,
11724
+ .mdg.gg-hidden { opacity: 0 !important; }
11725
+
11726
+ .ng.faded,
11727
+ .gg.faded,
11728
+ .tg.faded,
11729
+ .ntg.faded,
11730
+ .cg.faded,
11731
+ .eg.faded,
11732
+ .mdg.faded { opacity: 0.22 !important; }
11733
+
11734
+ .ng.hl path, .ng.hl rect, .ng.hl ellipse, .ng.hl polygon,
11735
+ .tg.hl path, .tg.hl rect,
11736
+ .ntg.hl path, .ntg.hl polygon,
11737
+ .cg.hl path, .cg.hl rect,
11738
+ .mdg.hl text,
11739
+ .eg.hl path, .eg.hl line, .eg.hl polygon { stroke-width: 2.8 !important; }
11740
+ `;
11741
+ function buildExportSnapshot(svg) {
11742
+ const snapshot = svg.cloneNode(true);
11743
+ const animationState = getExportAnimationState(svg);
11744
+ if (animationState?.steps.length) {
11745
+ snapshot.querySelector("#annotation-layer")?.remove();
11746
+ let rc = null;
11747
+ try {
11748
+ rc = rough.svg(snapshot);
11749
+ }
11750
+ catch {
11751
+ rc = null;
11752
+ }
11753
+ const anim = new AnimationController(snapshot, animationState.steps, undefined, rc, animationState.config);
11754
+ anim.goTo(animationState.steps.length - 1);
11755
+ }
11756
+ injectExportStyles(snapshot);
11757
+ return snapshot;
11758
+ }
11759
+ function injectExportStyles(svg) {
11760
+ if (svg.querySelector(`#${EXPORT_SVG_STYLE_ID}`))
11761
+ return;
11762
+ const style = document.createElementNS(SVG_NS$1, "style");
11763
+ style.setAttribute("id", EXPORT_SVG_STYLE_ID);
11764
+ style.textContent = EXPORT_SVG_STATE_CSS;
11765
+ svg.insertBefore(style, svg.firstChild);
11766
+ }
11700
11767
  // ── Trigger browser download ──────────────────────────────
11701
11768
  function download(blob, filename) {
11702
11769
  const url = URL.createObjectURL(blob);
@@ -11710,15 +11777,15 @@ var AIDiagram = (function (exports) {
11710
11777
  }
11711
11778
  // ── SVG export ────────────────────────────────────────────
11712
11779
  function exportSVG(svg, opts = {}) {
11713
- const str = svgToString(svg);
11780
+ const str = svgToString(buildExportSnapshot(svg));
11714
11781
  const blob = new Blob([str], { type: 'image/svg+xml;charset=utf-8' });
11715
11782
  download(blob, opts.filename ?? 'diagram.svg');
11716
11783
  }
11717
11784
  function getSVGString(svg) {
11718
- return svgToString(svg);
11785
+ return svgToString(buildExportSnapshot(svg));
11719
11786
  }
11720
11787
  function getSVGBlob(svg) {
11721
- return new Blob([svgToString(svg)], { type: 'image/svg+xml;charset=utf-8' });
11788
+ return new Blob([svgToString(buildExportSnapshot(svg))], { type: 'image/svg+xml;charset=utf-8' });
11722
11789
  }
11723
11790
  // ── PNG export (from SVG via Canvas) ─────────────────────
11724
11791
  async function exportPNG(svg, opts = {}) {
@@ -11744,7 +11811,7 @@ var AIDiagram = (function (exports) {
11744
11811
  ctx.fillStyle = EXPORT.fallbackBg;
11745
11812
  ctx.fillRect(0, 0, w, h);
11746
11813
  }
11747
- const svgStr = svgToString(svg);
11814
+ const svgStr = svgToString(buildExportSnapshot(svg));
11748
11815
  const blob = new Blob([svgStr], { type: 'image/svg+xml;charset=utf-8' });
11749
11816
  const url = URL.createObjectURL(blob);
11750
11817
  await new Promise((resolve, reject) => {
@@ -11762,7 +11829,7 @@ var AIDiagram = (function (exports) {
11762
11829
  }
11763
11830
  // ── HTML export (self-contained) ──────────────────────────
11764
11831
  function exportHTML(svg, dslSource, opts = {}) {
11765
- const svgStr = svgToString(svg);
11832
+ const svgStr = svgToString(buildExportSnapshot(svg));
11766
11833
  const html = `<!DOCTYPE html>
11767
11834
  <html lang="en">
11768
11835
  <head>
@@ -11943,6 +12010,7 @@ var AIDiagram = (function (exports) {
11943
12010
  }
11944
12011
  const containerEl = el instanceof SVGSVGElement ? undefined : el;
11945
12012
  anim = new AnimationController(svg, ast.steps, containerEl, rc, ast.config);
12013
+ bindExportAnimationState(svg, { steps: ast.steps, config: ast.config });
11946
12014
  }
11947
12015
  if (typeof tts === "boolean") {
11948
12016
  anim.tts = tts;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sketchmark",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "A plain-text DSL for hand-drawn diagrams. Write boxes, edges, and groups as code — renders sketchy SVG/Canvas via rough.js with a built-in step-by-step animation system.",
5
5
  "keywords": [
6
6
  "diagram",