@limekex/bugreport-widget-sdk 0.1.5 → 0.2.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.
package/README.md CHANGED
@@ -1,11 +1,21 @@
1
- # @bugreport/widget-sdk
1
+ # @limekex/bugreport-widget-sdk
2
2
 
3
3
  Reusable browser SDK for embedding the Stage Bug Reporter widget into staging/UAT applications.
4
4
 
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @limekex/bugreport-widget-sdk
9
+ # or
10
+ pnpm add @limekex/bugreport-widget-sdk
11
+ # or
12
+ yarn add @limekex/bugreport-widget-sdk
13
+ ```
14
+
5
15
  ## Usage
6
16
 
7
17
  ```ts
8
- import { initBugReporter } from '@bugreport/widget-sdk';
18
+ import { initBugReporter } from '@limekex/bugreport-widget-sdk';
9
19
 
10
20
  initBugReporter({
11
21
  apiBaseUrl: 'https://bugreport.betait.no',
@@ -14,10 +24,11 @@ initBugReporter({
14
24
  appVersion: '1.2.3',
15
25
  commitSha: process.env.VITE_COMMIT_SHA,
16
26
  currentUser: { id: 'tester-001', email: 'tester@example.com', role: 'qa' },
27
+ requireAuth: true, // Optional: require testers to log in
17
28
  });
18
29
  ```
19
30
 
20
- This injects a floating **🐛 Report bug** button into the page. Clicking it opens the bug report modal (placeholder).
31
+ This injects a floating **🐛 Report bug** button into the page. Clicking it opens the bug report modal.
21
32
 
22
33
  ## Config
23
34
 
@@ -38,6 +38,8 @@ export interface BugReporterConfig {
38
38
  getTraceContext?: () => TraceContext;
39
39
  /** Optional theme overrides */
40
40
  theme?: WidgetTheme;
41
+ /** Require testers to sign in before submitting bug reports */
42
+ requireAuth?: boolean;
41
43
  }
42
44
  export type BugSeverity = 'blocker' | 'high' | 'medium' | 'low';
43
45
  /** Fields submitted via multipart/form-data. */
@@ -82,4 +84,29 @@ export interface BugReportErrorResponse {
82
84
  details?: unknown;
83
85
  }
84
86
  export type BugReportResponse = BugReportSuccessResponse | BugReportErrorResponse;
87
+ export interface AuthRegisterRequest {
88
+ email: string;
89
+ name: string;
90
+ password: string;
91
+ }
92
+ export interface AuthLoginRequest {
93
+ email: string;
94
+ password: string;
95
+ }
96
+ export interface TesterInfo {
97
+ id: string;
98
+ email: string;
99
+ name: string;
100
+ }
101
+ export interface AuthSuccessResponse {
102
+ success: true;
103
+ token: string;
104
+ tester: TesterInfo;
105
+ }
106
+ export interface AuthErrorResponse {
107
+ success: false;
108
+ error: string;
109
+ details?: unknown;
110
+ }
111
+ export type AuthResponse = AuthSuccessResponse | AuthErrorResponse;
85
112
  //# sourceMappingURL=shared.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.types.d.ts","sourceRoot":"","sources":["../../src/types/shared.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,YAAY,CAAC;IACrC,+BAA+B;IAC/B,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAID,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEhE,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAE/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAG9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAG/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CAInB;AAED,qDAAqD;AACrD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,yCAAyC;AACzC,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GAAG,wBAAwB,GAAG,sBAAsB,CAAC"}
1
+ {"version":3,"file":"shared.types.d.ts","sourceRoot":"","sources":["../../src/types/shared.types.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,16 @@
1
- import type { BugReportSuccessResponse } from '../types/shared.types';
1
+ import type { BugReportSuccessResponse, AuthLoginRequest, AuthRegisterRequest, AuthResponse, TesterInfo } from '../types/shared.types';
2
+ export declare function getAuthToken(): string | null;
3
+ export declare function setAuthToken(token: string): void;
4
+ export declare function removeAuthToken(): void;
5
+ export declare function getTesterInfo(): TesterInfo | null;
6
+ export declare function setTesterInfo(tester: TesterInfo): void;
7
+ export declare function login(apiBaseUrl: string, credentials: AuthLoginRequest): Promise<AuthResponse>;
8
+ export declare function register(apiBaseUrl: string, data: AuthRegisterRequest): Promise<AuthResponse>;
9
+ export declare function verifyToken(apiBaseUrl: string, token: string): Promise<boolean>;
2
10
  export interface SubmitReportOptions {
3
11
  apiBaseUrl: string;
4
12
  formData: FormData;
13
+ authToken?: string | null;
5
14
  }
6
- /**
7
- * Sends the bug report FormData to the backend API.
8
- */
9
15
  export declare function submitReport(options: SubmitReportOptions): Promise<BugReportSuccessResponse>;
10
16
  //# sourceMappingURL=apiClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/utils/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAA0B,MAAM,uBAAuB,CAAC;AAE9F,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,wBAAwB,CAAC,CAkBnC"}
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/utils/apiClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EAExB,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACX,MAAM,uBAAuB,CAAC;AAO/B,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAM5C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMhD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAOtC;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAOjD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAMtD;AAID,wBAAsB,KAAK,CACzB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAavB;AAED,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,YAAY,CAAC,CAavB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAID,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,wBAAwB,CAAC,CA0BnC"}
@@ -1,11 +1,101 @@
1
- /**
2
- * Sends the bug report FormData to the backend API.
3
- */
1
+ // ── Token Management ──────────────────────────────────────────────────────────
2
+ const TOKEN_STORAGE_KEY = '__bugreport_auth_token__';
3
+ const TESTER_STORAGE_KEY = '__bugreport_tester_info__';
4
+ export function getAuthToken() {
5
+ try {
6
+ return localStorage.getItem(TOKEN_STORAGE_KEY);
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ export function setAuthToken(token) {
13
+ try {
14
+ localStorage.setItem(TOKEN_STORAGE_KEY, token);
15
+ }
16
+ catch {
17
+ // Silent fail if localStorage is unavailable
18
+ }
19
+ }
20
+ export function removeAuthToken() {
21
+ try {
22
+ localStorage.removeItem(TOKEN_STORAGE_KEY);
23
+ localStorage.removeItem(TESTER_STORAGE_KEY);
24
+ }
25
+ catch {
26
+ // Silent fail
27
+ }
28
+ }
29
+ export function getTesterInfo() {
30
+ try {
31
+ const stored = localStorage.getItem(TESTER_STORAGE_KEY);
32
+ return stored ? JSON.parse(stored) : null;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ export function setTesterInfo(tester) {
39
+ try {
40
+ localStorage.setItem(TESTER_STORAGE_KEY, JSON.stringify(tester));
41
+ }
42
+ catch {
43
+ // Silent fail
44
+ }
45
+ }
46
+ // ── Auth API Calls ────────────────────────────────────────────────────────────
47
+ export async function login(apiBaseUrl, credentials) {
48
+ const url = `${apiBaseUrl.replace(/\/$/, '')}/api/auth/login`;
49
+ const response = await fetch(url, {
50
+ method: 'POST',
51
+ headers: {
52
+ 'Content-Type': 'application/json',
53
+ },
54
+ body: JSON.stringify(credentials),
55
+ credentials: 'omit',
56
+ });
57
+ return response.json();
58
+ }
59
+ export async function register(apiBaseUrl, data) {
60
+ const url = `${apiBaseUrl.replace(/\/$/, '')}/api/auth/register`;
61
+ const response = await fetch(url, {
62
+ method: 'POST',
63
+ headers: {
64
+ 'Content-Type': 'application/json',
65
+ },
66
+ body: JSON.stringify(data),
67
+ credentials: 'omit',
68
+ });
69
+ return response.json();
70
+ }
71
+ export async function verifyToken(apiBaseUrl, token) {
72
+ const url = `${apiBaseUrl.replace(/\/$/, '')}/api/auth/verify`;
73
+ try {
74
+ const response = await fetch(url, {
75
+ method: 'GET',
76
+ headers: {
77
+ 'Authorization': `Bearer ${token}`,
78
+ },
79
+ credentials: 'omit',
80
+ });
81
+ const data = await response.json();
82
+ return data.success === true;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
4
88
  export async function submitReport(options) {
5
- const { apiBaseUrl, formData } = options;
89
+ const { apiBaseUrl, formData, authToken } = options;
6
90
  const url = `${apiBaseUrl.replace(/\/$/, '')}/api/reports/bug`;
91
+ const headers = {};
92
+ // Add auth token if present
93
+ if (authToken) {
94
+ headers['Authorization'] = `Bearer ${authToken}`;
95
+ }
7
96
  const response = await fetch(url, {
8
97
  method: 'POST',
98
+ headers,
9
99
  body: formData,
10
100
  // Note: do NOT set Content-Type manually — the browser sets it with the boundary.
11
101
  credentials: 'omit',
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/utils/apiClient.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA4B;IAE5B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC;IAE/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,QAAQ;QACd,kFAAkF;QAClF,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsD,CAAC;IAE1F,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAE,IAA+B,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"apiClient.js","sourceRoot":"","sources":["../../src/utils/apiClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Screenshot Region Selector
3
+ *
4
+ * Allows users to select a specific region of the screen to capture,
5
+ * or capture the full screen.
6
+ */
7
+ export type ScreenshotMode = 'fullscreen' | 'region';
8
+ export interface RegionSelection {
9
+ x: number;
10
+ y: number;
11
+ width: number;
12
+ height: number;
13
+ }
14
+ /**
15
+ * Shows a region selector overlay and returns the selected region.
16
+ * Returns null if user cancels.
17
+ */
18
+ export declare function selectScreenRegion(): Promise<RegionSelection | null>;
19
+ /**
20
+ * Captures a specific region of the screen.
21
+ */
22
+ export declare function captureRegion(region: RegionSelection): Promise<string | null>;
23
+ //# sourceMappingURL=regionSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regionSelector.d.ts","sourceRoot":"","sources":["../../src/utils/regionSelector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAqH1E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4CnF"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Screenshot Region Selector
3
+ *
4
+ * Allows users to select a specific region of the screen to capture,
5
+ * or capture the full screen.
6
+ */
7
+ /**
8
+ * Shows a region selector overlay and returns the selected region.
9
+ * Returns null if user cancels.
10
+ */
11
+ export async function selectScreenRegion() {
12
+ return new Promise((resolve) => {
13
+ const overlay = document.createElement('div');
14
+ overlay.id = '__bugreport-region-selector__';
15
+ overlay.style.cssText = `
16
+ position: fixed;
17
+ inset: 0;
18
+ background: rgba(0, 0, 0, 0.5);
19
+ z-index: 2147483647;
20
+ cursor: crosshair;
21
+ user-select: none;
22
+ `;
23
+ const instructions = document.createElement('div');
24
+ instructions.style.cssText = `
25
+ position: fixed;
26
+ top: 20px;
27
+ left: 50%;
28
+ transform: translateX(-50%);
29
+ background: white;
30
+ padding: 12px 20px;
31
+ border-radius: 8px;
32
+ font-family: system-ui, -apple-system, sans-serif;
33
+ font-size: 14px;
34
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
35
+ z-index: 2147483648;
36
+ pointer-events: none;
37
+ `;
38
+ instructions.textContent = 'Click and drag to select a region, or press ESC to cancel';
39
+ const selectionBox = document.createElement('div');
40
+ selectionBox.style.cssText = `
41
+ position: fixed;
42
+ border: 2px solid #3b82f6;
43
+ background: rgba(59, 130, 246, 0.1);
44
+ display: none;
45
+ pointer-events: none;
46
+ z-index: 2147483648;
47
+ `;
48
+ document.body.appendChild(overlay);
49
+ document.body.appendChild(instructions);
50
+ document.body.appendChild(selectionBox);
51
+ let startX = 0;
52
+ let startY = 0;
53
+ let isSelecting = false;
54
+ const cleanup = () => {
55
+ overlay.remove();
56
+ instructions.remove();
57
+ selectionBox.remove();
58
+ };
59
+ const handleMouseDown = (e) => {
60
+ startX = e.clientX;
61
+ startY = e.clientY;
62
+ isSelecting = true;
63
+ selectionBox.style.display = 'block';
64
+ selectionBox.style.left = startX + 'px';
65
+ selectionBox.style.top = startY + 'px';
66
+ selectionBox.style.width = '0px';
67
+ selectionBox.style.height = '0px';
68
+ };
69
+ const handleMouseMove = (e) => {
70
+ if (!isSelecting)
71
+ return;
72
+ const currentX = e.clientX;
73
+ const currentY = e.clientY;
74
+ const left = Math.min(startX, currentX);
75
+ const top = Math.min(startY, currentY);
76
+ const width = Math.abs(currentX - startX);
77
+ const height = Math.abs(currentY - startY);
78
+ selectionBox.style.left = left + 'px';
79
+ selectionBox.style.top = top + 'px';
80
+ selectionBox.style.width = width + 'px';
81
+ selectionBox.style.height = height + 'px';
82
+ };
83
+ const handleMouseUp = (e) => {
84
+ if (!isSelecting)
85
+ return;
86
+ isSelecting = false;
87
+ const currentX = e.clientX;
88
+ const currentY = e.clientY;
89
+ const left = Math.min(startX, currentX);
90
+ const top = Math.min(startY, currentY);
91
+ const width = Math.abs(currentX - startX);
92
+ const height = Math.abs(currentY - startY);
93
+ cleanup();
94
+ // Require minimum 20x20 pixel selection
95
+ if (width < 20 || height < 20) {
96
+ resolve(null);
97
+ return;
98
+ }
99
+ resolve({ x: left, y: top, width, height });
100
+ };
101
+ const handleKeyDown = (e) => {
102
+ if (e.key === 'Escape') {
103
+ cleanup();
104
+ resolve(null);
105
+ }
106
+ };
107
+ overlay.addEventListener('mousedown', handleMouseDown);
108
+ overlay.addEventListener('mousemove', handleMouseMove);
109
+ overlay.addEventListener('mouseup', handleMouseUp);
110
+ document.addEventListener('keydown', handleKeyDown);
111
+ });
112
+ }
113
+ /**
114
+ * Captures a specific region of the screen.
115
+ */
116
+ export async function captureRegion(region) {
117
+ try {
118
+ // Import the full page screenshot utility which handles html2canvas loading
119
+ const { capturePageScreenshot } = await import('./screenshotCapture');
120
+ // Capture the full page first
121
+ const fullPageDataUrl = await capturePageScreenshot();
122
+ if (!fullPageDataUrl)
123
+ return null;
124
+ // Create an image from the data URL
125
+ const img = new Image();
126
+ await new Promise((resolve, reject) => {
127
+ img.onload = resolve;
128
+ img.onerror = reject;
129
+ img.src = fullPageDataUrl;
130
+ });
131
+ // Create a new canvas with just the selected region
132
+ const regionCanvas = document.createElement('canvas');
133
+ const scale = img.width / window.innerWidth;
134
+ regionCanvas.width = region.width * scale;
135
+ regionCanvas.height = region.height * scale;
136
+ const ctx = regionCanvas.getContext('2d');
137
+ if (!ctx)
138
+ return null;
139
+ ctx.drawImage(img, region.x * scale, region.y * scale, region.width * scale, region.height * scale, 0, 0, region.width * scale, region.height * scale);
140
+ return regionCanvas.toDataURL('image/png');
141
+ }
142
+ catch (err) {
143
+ console.error('Failed to capture region:', err);
144
+ return null;
145
+ }
146
+ }
147
+ //# sourceMappingURL=regionSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regionSelector.js","sourceRoot":"","sources":["../../src/utils/regionSelector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Screenshot Annotation Editor
3
+ *
4
+ * Provides a canvas-based editor for annotating screenshots with:
5
+ * - Drawing tools: Arrow, Rectangle, Circle, Pen, Text
6
+ * - Color picker
7
+ * - Undo/redo functionality
8
+ * - Export to PNG
9
+ */
10
+ interface EditorOptions {
11
+ imageDataUrl: string;
12
+ onSave: (annotatedDataUrl: string) => void;
13
+ onCancel: () => void;
14
+ }
15
+ export declare class AnnotationEditor {
16
+ private container;
17
+ private canvas;
18
+ private ctx;
19
+ private image;
20
+ private currentTool;
21
+ private currentColor;
22
+ private lineWidth;
23
+ private annotations;
24
+ private currentAnnotation;
25
+ private isDrawing;
26
+ private startPoint;
27
+ private onSaveCallback;
28
+ private onCancelCallback;
29
+ constructor(options: EditorOptions);
30
+ private loadImage;
31
+ private render;
32
+ private createToolbar;
33
+ private createActions;
34
+ private updateToolbarState;
35
+ private getMousePos;
36
+ private handleMouseDown;
37
+ private handleMouseMove;
38
+ private handleMouseUp;
39
+ private addText;
40
+ private drawCanvas;
41
+ private drawCurrentAnnotation;
42
+ private drawAnnotation;
43
+ private drawArrow;
44
+ private drawRectangle;
45
+ private drawCircle;
46
+ private drawPen;
47
+ private drawText;
48
+ private undo;
49
+ private save;
50
+ private cancel;
51
+ private destroy;
52
+ }
53
+ export declare function openAnnotationEditor(options: EditorOptions): AnnotationEditor;
54
+ export {};
55
+ //# sourceMappingURL=annotationEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotationEditor.d.ts","sourceRoot":"","sources":["../../src/widget/annotationEditor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,UAAU,aAAa;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAKD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,GAAG,CAAyC;IACpD,OAAO,CAAC,KAAK,CAAiC;IAE9C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAsB;IAExC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,gBAAgB,CAAa;gBAEzB,OAAO,EAAE,aAAa;IAMlC,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,MAAM;IAkEd,OAAO,CAAC,aAAa;IAmFrB,OAAO,CAAC,aAAa;IA0CrB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,cAAc;IA0CtB,OAAO,CAAC,SAAS;IA2BjB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,OAAO;CAMhB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,gBAAgB,CAE7E"}