@yoamigo.com/core 0.1.8 → 0.1.10

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.js CHANGED
@@ -198,6 +198,11 @@ var BuilderSelectionManager = class {
198
198
  case "CLEAR_SELECTIONS":
199
199
  this.clearAllSelections();
200
200
  break;
201
+ case "REQUEST_REGION_SCREENSHOT":
202
+ if (data.region) {
203
+ this.captureRegionScreenshot(data.region);
204
+ }
205
+ break;
201
206
  }
202
207
  });
203
208
  }
@@ -278,6 +283,9 @@ var BuilderSelectionManager = class {
278
283
  this.sendToParent({ type: "SHIFT_KEY_PRESSED" });
279
284
  }
280
285
  }
286
+ if (e.key === "Escape") {
287
+ this.sendToParent({ type: "ESCAPE_KEY_PRESSED" });
288
+ }
281
289
  };
282
290
  /**
283
291
  * Check if element matches any selectable selector
@@ -564,6 +572,71 @@ var BuilderSelectionManager = class {
564
572
  container.style.height = `${rect.height}px`;
565
573
  });
566
574
  };
575
+ /**
576
+ * Capture a region of the page as a screenshot
577
+ * Uses html2canvas to render the page and then crops to the specified region
578
+ */
579
+ async captureRegionScreenshot(region) {
580
+ try {
581
+ console.log("[BuilderSelection] Capturing region screenshot:", region);
582
+ const html2canvas = (await import("html2canvas-pro")).default;
583
+ const overlays = document.querySelectorAll(".builder-selection-container, #builder-hover-overlay");
584
+ overlays.forEach((el) => {
585
+ ;
586
+ el.style.display = "none";
587
+ });
588
+ const canvas = await html2canvas(document.body, {
589
+ scale: 1,
590
+ logging: false,
591
+ useCORS: true,
592
+ allowTaint: true,
593
+ backgroundColor: null
594
+ // Preserve transparency if any
595
+ });
596
+ overlays.forEach((el) => {
597
+ ;
598
+ el.style.display = "";
599
+ });
600
+ const scaledRegion = {
601
+ x: Math.round(region.x),
602
+ y: Math.round(region.y),
603
+ width: Math.round(region.width),
604
+ height: Math.round(region.height)
605
+ };
606
+ const croppedCanvas = document.createElement("canvas");
607
+ croppedCanvas.width = scaledRegion.width;
608
+ croppedCanvas.height = scaledRegion.height;
609
+ const ctx = croppedCanvas.getContext("2d");
610
+ if (!ctx) {
611
+ throw new Error("Failed to get canvas context");
612
+ }
613
+ ctx.drawImage(
614
+ canvas,
615
+ scaledRegion.x,
616
+ scaledRegion.y,
617
+ scaledRegion.width,
618
+ scaledRegion.height,
619
+ 0,
620
+ 0,
621
+ scaledRegion.width,
622
+ scaledRegion.height
623
+ );
624
+ const dataUrl = croppedCanvas.toDataURL("image/png", 0.9);
625
+ console.log("[BuilderSelection] Region screenshot captured, size:", dataUrl.length);
626
+ this.sendToParent({
627
+ type: "REGION_SCREENSHOT_READY",
628
+ dataUrl,
629
+ region
630
+ });
631
+ } catch (error) {
632
+ console.error("[BuilderSelection] Region screenshot failed:", error);
633
+ this.sendToParent({
634
+ type: "REGION_SCREENSHOT_ERROR",
635
+ error: error instanceof Error ? error.message : "Screenshot capture failed",
636
+ region
637
+ });
638
+ }
639
+ }
567
640
  renderSelectionIndicator(element, selectionId, color) {
568
641
  const rect = element.getBoundingClientRect();
569
642
  const container = document.createElement("div");
package/dist/lib.js CHANGED
@@ -157,6 +157,11 @@ var BuilderSelectionManager = class {
157
157
  case "CLEAR_SELECTIONS":
158
158
  this.clearAllSelections();
159
159
  break;
160
+ case "REQUEST_REGION_SCREENSHOT":
161
+ if (data.region) {
162
+ this.captureRegionScreenshot(data.region);
163
+ }
164
+ break;
160
165
  }
161
166
  });
162
167
  }
@@ -237,6 +242,9 @@ var BuilderSelectionManager = class {
237
242
  this.sendToParent({ type: "SHIFT_KEY_PRESSED" });
238
243
  }
239
244
  }
245
+ if (e.key === "Escape") {
246
+ this.sendToParent({ type: "ESCAPE_KEY_PRESSED" });
247
+ }
240
248
  };
241
249
  /**
242
250
  * Check if element matches any selectable selector
@@ -523,6 +531,71 @@ var BuilderSelectionManager = class {
523
531
  container.style.height = `${rect.height}px`;
524
532
  });
525
533
  };
534
+ /**
535
+ * Capture a region of the page as a screenshot
536
+ * Uses html2canvas to render the page and then crops to the specified region
537
+ */
538
+ async captureRegionScreenshot(region) {
539
+ try {
540
+ console.log("[BuilderSelection] Capturing region screenshot:", region);
541
+ const html2canvas = (await import("html2canvas-pro")).default;
542
+ const overlays = document.querySelectorAll(".builder-selection-container, #builder-hover-overlay");
543
+ overlays.forEach((el) => {
544
+ ;
545
+ el.style.display = "none";
546
+ });
547
+ const canvas = await html2canvas(document.body, {
548
+ scale: 1,
549
+ logging: false,
550
+ useCORS: true,
551
+ allowTaint: true,
552
+ backgroundColor: null
553
+ // Preserve transparency if any
554
+ });
555
+ overlays.forEach((el) => {
556
+ ;
557
+ el.style.display = "";
558
+ });
559
+ const scaledRegion = {
560
+ x: Math.round(region.x),
561
+ y: Math.round(region.y),
562
+ width: Math.round(region.width),
563
+ height: Math.round(region.height)
564
+ };
565
+ const croppedCanvas = document.createElement("canvas");
566
+ croppedCanvas.width = scaledRegion.width;
567
+ croppedCanvas.height = scaledRegion.height;
568
+ const ctx = croppedCanvas.getContext("2d");
569
+ if (!ctx) {
570
+ throw new Error("Failed to get canvas context");
571
+ }
572
+ ctx.drawImage(
573
+ canvas,
574
+ scaledRegion.x,
575
+ scaledRegion.y,
576
+ scaledRegion.width,
577
+ scaledRegion.height,
578
+ 0,
579
+ 0,
580
+ scaledRegion.width,
581
+ scaledRegion.height
582
+ );
583
+ const dataUrl = croppedCanvas.toDataURL("image/png", 0.9);
584
+ console.log("[BuilderSelection] Region screenshot captured, size:", dataUrl.length);
585
+ this.sendToParent({
586
+ type: "REGION_SCREENSHOT_READY",
587
+ dataUrl,
588
+ region
589
+ });
590
+ } catch (error) {
591
+ console.error("[BuilderSelection] Region screenshot failed:", error);
592
+ this.sendToParent({
593
+ type: "REGION_SCREENSHOT_ERROR",
594
+ error: error instanceof Error ? error.message : "Screenshot capture failed",
595
+ region
596
+ });
597
+ }
598
+ }
526
599
  renderSelectionIndicator(element, selectionId, color) {
527
600
  const rect = element.getBoundingClientRect();
528
601
  const container = document.createElement("div");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoamigo.com/core",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "Core components, router, and utilities for YoAmigo templates",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -63,6 +63,7 @@
63
63
  },
64
64
  "dependencies": {
65
65
  "clsx": "^2.1.1",
66
+ "html2canvas-pro": "^1.6.1",
66
67
  "preact": "^10.27.2",
67
68
  "wouter": "^3.8.0"
68
69
  },
@@ -87,18 +88,18 @@
87
88
  "vite": "^7.2.4"
88
89
  },
89
90
  "peerDependencies": {
90
- "@vitejs/plugin-react": "^5.0.0",
91
91
  "@preact/preset-vite": "^2.0.0",
92
- "react": "^18.0.0 || ^19.0.0",
93
- "react-dom": "^18.0.0 || ^19.0.0",
94
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0",
95
92
  "@tiptap/core": "^3.0.0",
96
93
  "@tiptap/extension-link": "^3.0.0",
97
94
  "@tiptap/extension-text-style": "^3.0.0",
98
95
  "@tiptap/pm": "^3.0.0",
99
96
  "@tiptap/react": "^3.0.0",
100
97
  "@tiptap/starter-kit": "^3.0.0",
101
- "dompurify": "^3.0.0"
98
+ "@vitejs/plugin-react": "^5.0.0",
99
+ "dompurify": "^3.0.0",
100
+ "react": "^18.0.0 || ^19.0.0",
101
+ "react-dom": "^18.0.0 || ^19.0.0",
102
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
102
103
  },
103
104
  "peerDependenciesMeta": {
104
105
  "react": {