@uxbertlabs/reportly 1.0.5 → 1.0.7
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/core/init.d.ts +1 -0
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/state.d.ts +3 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/features/annotation.d.ts +1 -1
- package/dist/features/annotation.d.ts.map +1 -1
- package/dist/features/screenshot.d.ts +1 -1
- package/dist/features/screenshot.d.ts.map +1 -1
- package/dist/reportly.cjs.js +191 -39
- package/dist/reportly.cjs.js.map +1 -1
- package/dist/reportly.esm.js +191 -39
- package/dist/reportly.esm.js.map +1 -1
- package/dist/reportly.js +191 -39
- package/dist/reportly.js.map +1 -1
- package/dist/reportly.min.js +2 -2
- package/dist/reportly.min.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/modal.d.ts +1 -0
- package/dist/ui/modal.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/reportly.js
CHANGED
@@ -83,6 +83,7 @@ var Reportly = (function () {
|
|
83
83
|
this.screenshot = null;
|
84
84
|
this.annotations = [];
|
85
85
|
this.listeners = {};
|
86
|
+
this.captureMode = 'viewport';
|
86
87
|
}
|
87
88
|
setState(newState) {
|
88
89
|
this.currentState = newState;
|
@@ -112,11 +113,18 @@ var Reportly = (function () {
|
|
112
113
|
clearAnnotations() {
|
113
114
|
this.annotations = [];
|
114
115
|
}
|
116
|
+
setCaptureMode(mode) {
|
117
|
+
this.captureMode = mode;
|
118
|
+
}
|
119
|
+
getCaptureMode() {
|
120
|
+
return this.captureMode;
|
121
|
+
}
|
115
122
|
reset() {
|
116
123
|
this.currentState = STATE.IDLE;
|
117
124
|
this.currentIssue = null;
|
118
125
|
this.screenshot = null;
|
119
126
|
this.annotations = [];
|
127
|
+
this.captureMode = 'viewport';
|
120
128
|
}
|
121
129
|
// Event system
|
122
130
|
on(event, callback) {
|
@@ -190,6 +198,20 @@ var Reportly = (function () {
|
|
190
198
|
</div>
|
191
199
|
|
192
200
|
<form class="uxbert-form" id="uxbert-issue-form">
|
201
|
+
<div class="uxbert-form-group">
|
202
|
+
<label class="uxbert-form-label">Capture Mode</label>
|
203
|
+
<div class="uxbert-capture-mode">
|
204
|
+
<label class="uxbert-radio-label">
|
205
|
+
<input type="radio" name="capture-mode" value="viewport" id="uxbert-capture-viewport" checked />
|
206
|
+
<span>Current View</span>
|
207
|
+
</label>
|
208
|
+
<label class="uxbert-radio-label">
|
209
|
+
<input type="radio" name="capture-mode" value="fullpage" id="uxbert-capture-fullpage" />
|
210
|
+
<span>Full Page</span>
|
211
|
+
</label>
|
212
|
+
</div>
|
213
|
+
</div>
|
214
|
+
|
193
215
|
<div class="uxbert-form-group">
|
194
216
|
<label class="uxbert-form-label" for="uxbert-title">Issue Title *</label>
|
195
217
|
<input
|
@@ -220,6 +242,12 @@ var Reportly = (function () {
|
|
220
242
|
</select>
|
221
243
|
</div>
|
222
244
|
|
245
|
+
<div class="uxbert-capture-action" id="uxbert-capture-action">
|
246
|
+
<button type="button" class="uxbert-btn uxbert-btn-primary" id="uxbert-capture-btn">
|
247
|
+
📸 Take Screenshot
|
248
|
+
</button>
|
249
|
+
</div>
|
250
|
+
|
223
251
|
<div class="uxbert-screenshot-preview" id="uxbert-screenshot-container" style="display: none;">
|
224
252
|
<img id="uxbert-screenshot-img" src="" alt="Screenshot" />
|
225
253
|
<div class="uxbert-screenshot-actions">
|
@@ -236,7 +264,7 @@ var Reportly = (function () {
|
|
236
264
|
<button type="button" class="uxbert-btn uxbert-btn-secondary" id="uxbert-cancel-btn">
|
237
265
|
Cancel
|
238
266
|
</button>
|
239
|
-
<button type="submit" class="uxbert-btn uxbert-btn-primary">
|
267
|
+
<button type="submit" class="uxbert-btn uxbert-btn-primary" id="uxbert-submit-btn">
|
240
268
|
📥 Download JSON
|
241
269
|
</button>
|
242
270
|
</div>
|
@@ -269,6 +297,13 @@ var Reportly = (function () {
|
|
269
297
|
e.preventDefault();
|
270
298
|
this.handleSubmit();
|
271
299
|
});
|
300
|
+
// Capture button
|
301
|
+
const captureBtn = this.modal.querySelector('#uxbert-capture-btn');
|
302
|
+
captureBtn.addEventListener('click', () => {
|
303
|
+
if (this.callbacks.onCapture) {
|
304
|
+
this.callbacks.onCapture();
|
305
|
+
}
|
306
|
+
});
|
272
307
|
// Annotate button
|
273
308
|
const annotateBtn = this.modal.querySelector('#uxbert-annotate-btn');
|
274
309
|
annotateBtn.addEventListener('click', () => {
|
@@ -321,14 +356,26 @@ var Reportly = (function () {
|
|
321
356
|
return;
|
322
357
|
const container = this.modal.querySelector('#uxbert-screenshot-container');
|
323
358
|
const img = this.modal.querySelector('#uxbert-screenshot-img');
|
359
|
+
const captureAction = this.modal.querySelector('#uxbert-capture-action');
|
360
|
+
const submitBtn = this.modal.querySelector('#uxbert-submit-btn');
|
324
361
|
if (screenshot) {
|
325
362
|
img.src = screenshot;
|
326
363
|
container.style.display = 'block';
|
364
|
+
captureAction.style.display = 'none';
|
365
|
+
submitBtn.disabled = false;
|
327
366
|
}
|
328
367
|
else {
|
329
368
|
container.style.display = 'none';
|
369
|
+
captureAction.style.display = 'block';
|
370
|
+
submitBtn.disabled = true;
|
330
371
|
}
|
331
372
|
}
|
373
|
+
getCaptureMode() {
|
374
|
+
if (!this.modal)
|
375
|
+
return 'viewport';
|
376
|
+
const viewportRadio = this.modal.querySelector('#uxbert-capture-viewport');
|
377
|
+
return viewportRadio.checked ? 'viewport' : 'fullpage';
|
378
|
+
}
|
332
379
|
reset() {
|
333
380
|
if (!this.modal)
|
334
381
|
return;
|
@@ -9403,26 +9450,87 @@ var Reportly = (function () {
|
|
9403
9450
|
constructor() {
|
9404
9451
|
this.currentScreenshot = null;
|
9405
9452
|
}
|
9406
|
-
async capture() {
|
9453
|
+
async capture(mode = 'fullpage') {
|
9407
9454
|
try {
|
9408
9455
|
// Hide UXbert UI elements before capturing
|
9409
9456
|
this.hideUXbertElements();
|
9410
|
-
// Scroll to top to capture full page
|
9411
9457
|
const originalScrollY = window.scrollY;
|
9412
|
-
|
9413
|
-
|
9414
|
-
|
9415
|
-
|
9416
|
-
|
9417
|
-
|
9418
|
-
|
9419
|
-
|
9420
|
-
|
9421
|
-
|
9422
|
-
|
9423
|
-
|
9424
|
-
|
9425
|
-
|
9458
|
+
let canvas;
|
9459
|
+
if (mode === 'viewport') {
|
9460
|
+
// Capture only the current viewport
|
9461
|
+
canvas = await html2canvas(document.body, {
|
9462
|
+
useCORS: true,
|
9463
|
+
allowTaint: false,
|
9464
|
+
logging: false,
|
9465
|
+
width: window.innerWidth,
|
9466
|
+
height: window.innerHeight,
|
9467
|
+
windowWidth: window.innerWidth,
|
9468
|
+
windowHeight: window.innerHeight,
|
9469
|
+
x: window.scrollX,
|
9470
|
+
y: window.scrollY,
|
9471
|
+
ignoreElements: (element) => {
|
9472
|
+
// Skip cross-origin images that might cause issues
|
9473
|
+
if (element.tagName === 'IMG') {
|
9474
|
+
const img = element;
|
9475
|
+
try {
|
9476
|
+
// Test if image is accessible
|
9477
|
+
const canvas = document.createElement('canvas');
|
9478
|
+
const ctx = canvas.getContext('2d');
|
9479
|
+
canvas.width = 1;
|
9480
|
+
canvas.height = 1;
|
9481
|
+
ctx?.drawImage(img, 0, 0, 1, 1);
|
9482
|
+
canvas.toDataURL(); // This will throw if tainted
|
9483
|
+
return false; // Include the image
|
9484
|
+
}
|
9485
|
+
catch (e) {
|
9486
|
+
// Image is tainted, skip it
|
9487
|
+
console.warn('Skipping cross-origin image:', img.src);
|
9488
|
+
return true;
|
9489
|
+
}
|
9490
|
+
}
|
9491
|
+
return false;
|
9492
|
+
},
|
9493
|
+
});
|
9494
|
+
}
|
9495
|
+
else {
|
9496
|
+
// Scroll to top to capture full page
|
9497
|
+
window.scrollTo(0, 0);
|
9498
|
+
// Get full page dimensions
|
9499
|
+
const fullPageHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);
|
9500
|
+
const fullPageWidth = Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);
|
9501
|
+
// Capture the full page
|
9502
|
+
canvas = await html2canvas(document.body, {
|
9503
|
+
useCORS: true,
|
9504
|
+
allowTaint: false,
|
9505
|
+
logging: false,
|
9506
|
+
width: fullPageWidth,
|
9507
|
+
height: fullPageHeight,
|
9508
|
+
ignoreElements: (element) => {
|
9509
|
+
// Skip cross-origin images that might cause issues
|
9510
|
+
if (element.tagName === 'IMG') {
|
9511
|
+
const img = element;
|
9512
|
+
try {
|
9513
|
+
// Test if image is accessible
|
9514
|
+
const canvas = document.createElement('canvas');
|
9515
|
+
const ctx = canvas.getContext('2d');
|
9516
|
+
canvas.width = 1;
|
9517
|
+
canvas.height = 1;
|
9518
|
+
ctx?.drawImage(img, 0, 0, 1, 1);
|
9519
|
+
canvas.toDataURL(); // This will throw if tainted
|
9520
|
+
return false; // Include the image
|
9521
|
+
}
|
9522
|
+
catch (e) {
|
9523
|
+
// Image is tainted, skip it
|
9524
|
+
console.warn('Skipping cross-origin image:', img.src);
|
9525
|
+
return true;
|
9526
|
+
}
|
9527
|
+
}
|
9528
|
+
return false;
|
9529
|
+
},
|
9530
|
+
});
|
9531
|
+
// Restore scroll position
|
9532
|
+
window.scrollTo(0, originalScrollY);
|
9533
|
+
}
|
9426
9534
|
// Show UXbert UI elements again
|
9427
9535
|
this.showUXbertElements();
|
9428
9536
|
// Convert to base64
|
@@ -9498,29 +9606,46 @@ var Reportly = (function () {
|
|
9498
9606
|
document.body.appendChild(this.canvas);
|
9499
9607
|
return this.canvas;
|
9500
9608
|
}
|
9501
|
-
updateCanvasSize() {
|
9609
|
+
updateCanvasSize(mode = 'fullpage') {
|
9502
9610
|
if (!this.canvas)
|
9503
9611
|
return;
|
9504
|
-
|
9505
|
-
|
9506
|
-
|
9507
|
-
|
9508
|
-
|
9612
|
+
if (mode === 'viewport') {
|
9613
|
+
// Set canvas to viewport dimensions
|
9614
|
+
this.canvas.width = window.innerWidth;
|
9615
|
+
this.canvas.height = window.innerHeight;
|
9616
|
+
}
|
9617
|
+
else {
|
9618
|
+
// Get full page dimensions
|
9619
|
+
const fullPageHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);
|
9620
|
+
const fullPageWidth = Math.max(document.body.scrollWidth, document.body.offsetWidth, document.documentElement.clientWidth, document.documentElement.scrollWidth, document.documentElement.offsetWidth);
|
9621
|
+
this.canvas.width = fullPageWidth;
|
9622
|
+
this.canvas.height = fullPageHeight;
|
9623
|
+
}
|
9509
9624
|
}
|
9510
|
-
show() {
|
9625
|
+
show(mode = 'fullpage') {
|
9511
9626
|
if (this.canvas && this.ctx) {
|
9512
9627
|
// Update canvas size to match current page dimensions
|
9513
|
-
this.updateCanvasSize();
|
9628
|
+
this.updateCanvasSize(mode);
|
9514
9629
|
// Reset context properties after resize
|
9515
9630
|
this.ctx.lineCap = 'round';
|
9516
9631
|
this.ctx.lineJoin = 'round';
|
9517
9632
|
this.canvas.classList.add('active');
|
9633
|
+
// If viewport mode, add viewport-mode class
|
9634
|
+
if (mode === 'viewport') {
|
9635
|
+
this.canvas.classList.add('viewport-mode');
|
9636
|
+
// Note: We don't disable scrolling in viewport mode to allow users to scroll
|
9637
|
+
// and annotate different parts of the viewport
|
9638
|
+
}
|
9639
|
+
else {
|
9640
|
+
this.canvas.classList.remove('viewport-mode');
|
9641
|
+
}
|
9518
9642
|
this.redraw();
|
9519
9643
|
}
|
9520
9644
|
}
|
9521
9645
|
hide() {
|
9522
9646
|
if (this.canvas) {
|
9523
9647
|
this.canvas.classList.remove('active');
|
9648
|
+
this.canvas.classList.remove('viewport-mode');
|
9524
9649
|
}
|
9525
9650
|
// Clean up any active text input
|
9526
9651
|
this.removeTextInput();
|
@@ -9533,10 +9658,13 @@ var Reportly = (function () {
|
|
9533
9658
|
this.currentColor = color;
|
9534
9659
|
}
|
9535
9660
|
handleMouseDown(e) {
|
9661
|
+
const isViewportMode = this.canvas?.classList.contains('viewport-mode');
|
9662
|
+
const scrollOffsetX = isViewportMode ? 0 : window.scrollX;
|
9663
|
+
const scrollOffsetY = isViewportMode ? 0 : window.scrollY;
|
9536
9664
|
// Handle text tool separately
|
9537
9665
|
if (this.currentTool === 'text') {
|
9538
|
-
const x = e.clientX +
|
9539
|
-
const y = e.clientY +
|
9666
|
+
const x = e.clientX + scrollOffsetX;
|
9667
|
+
const y = e.clientY + scrollOffsetY;
|
9540
9668
|
// Check if clicking on existing text to edit
|
9541
9669
|
const clickedText = this.getTextAnnotationAt(x, y);
|
9542
9670
|
if (clickedText) {
|
@@ -9548,15 +9676,18 @@ var Reportly = (function () {
|
|
9548
9676
|
return;
|
9549
9677
|
}
|
9550
9678
|
this.isDrawing = true;
|
9551
|
-
this.startX = e.clientX +
|
9552
|
-
this.startY = e.clientY +
|
9679
|
+
this.startX = e.clientX + scrollOffsetX;
|
9680
|
+
this.startY = e.clientY + scrollOffsetY;
|
9553
9681
|
this.currentPath = [{ x: this.startX, y: this.startY }];
|
9554
9682
|
}
|
9555
9683
|
handleMouseMove(e) {
|
9556
9684
|
if (!this.isDrawing || !this.ctx)
|
9557
9685
|
return;
|
9558
|
-
const
|
9559
|
-
const
|
9686
|
+
const isViewportMode = this.canvas?.classList.contains('viewport-mode');
|
9687
|
+
const scrollOffsetX = isViewportMode ? 0 : window.scrollX;
|
9688
|
+
const scrollOffsetY = isViewportMode ? 0 : window.scrollY;
|
9689
|
+
const x = e.clientX + scrollOffsetX;
|
9690
|
+
const y = e.clientY + scrollOffsetY;
|
9560
9691
|
if (this.currentTool === 'pen') {
|
9561
9692
|
this.currentPath.push({ x, y });
|
9562
9693
|
this.redraw();
|
@@ -9576,8 +9707,11 @@ var Reportly = (function () {
|
|
9576
9707
|
if (!this.isDrawing)
|
9577
9708
|
return;
|
9578
9709
|
this.isDrawing = false;
|
9579
|
-
const
|
9580
|
-
const
|
9710
|
+
const isViewportMode = this.canvas?.classList.contains('viewport-mode');
|
9711
|
+
const scrollOffsetX = isViewportMode ? 0 : window.scrollX;
|
9712
|
+
const scrollOffsetY = isViewportMode ? 0 : window.scrollY;
|
9713
|
+
const x = e.clientX + scrollOffsetX;
|
9714
|
+
const y = e.clientY + scrollOffsetY;
|
9581
9715
|
// Save the annotation
|
9582
9716
|
if (this.currentTool === 'pen') {
|
9583
9717
|
this.annotations.push({
|
@@ -10050,7 +10184,7 @@ var Reportly = (function () {
|
|
10050
10184
|
}
|
10051
10185
|
}
|
10052
10186
|
|
10053
|
-
var css_248z = ":root{--uxbert-primary:#4f46e5;--uxbert-primary-hover:#4338ca;--uxbert-danger:#ef4444;--uxbert-success:#10b981;--uxbert-bg:#fff;--uxbert-text:#1f2937;--uxbert-border:#e5e7eb;--uxbert-shadow:0 10px 25px rgba(0,0,0,.1);--uxbert-z-button:999999;--uxbert-z-modal:1000000;--uxbert-z-canvas:1000001;--uxbert-z-toolbar:1000002}[data-theme=dark]{--uxbert-bg:#1f2937;--uxbert-text:#f9fafb;--uxbert-border:#374151}.uxbert-fab{align-items:center;background:var(--uxbert-primary);border:none;border-radius:50%;box-shadow:var(--uxbert-shadow);color:#fff;cursor:pointer;display:flex;font-size:24px;height:56px;justify-content:center;position:fixed;transition:all .3s ease;width:56px;z-index:var(--uxbert-z-button)}.uxbert-fab:hover{background:var(--uxbert-primary-hover);transform:scale(1.1)}.uxbert-fab.bottom-right{bottom:24px;right:24px}.uxbert-fab.bottom-left{bottom:24px;left:24px}.uxbert-fab.top-right{right:24px;top:24px}.uxbert-fab.top-left{left:24px;top:24px}.uxbert-overlay{align-items:center;animation:fadeIn .3s ease;background:rgba(0,0,0,.5);display:none;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:var(--uxbert-z-modal)}.uxbert-overlay.active{display:flex}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.uxbert-modal{animation:slideUp .3s ease;background:var(--uxbert-bg);border-radius:12px;box-shadow:var(--uxbert-shadow);color:var(--uxbert-text);max-height:90vh;max-width:600px;overflow-y:auto;padding:24px;width:90%}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.uxbert-modal-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.uxbert-modal-title{font-size:20px;font-weight:600;margin:0}.uxbert-modal-close{align-items:center;background:none;border:none;border-radius:4px;color:var(--uxbert-text);cursor:pointer;display:flex;font-size:24px;height:32px;justify-content:center;padding:0;width:32px}.uxbert-modal-close:hover{background:var(--uxbert-border)}.uxbert-form-group{margin-bottom:16px}.uxbert-form-label{display:block;font-size:14px;font-weight:500;margin-bottom:8px}.uxbert-form-input,.uxbert-form-select,.uxbert-form-textarea{background:var(--uxbert-bg);border:1px solid var(--uxbert-border);border-radius:6px;box-sizing:border-box;color:var(--uxbert-text);font-family:inherit;font-size:14px;padding:10px;width:100%}.uxbert-form-textarea{min-height:100px;resize:vertical}.uxbert-form-input:focus,.uxbert-form-select:focus,.uxbert-form-textarea:focus{border-color:var(--uxbert-primary);outline:none}.uxbert-screenshot-preview{border:1px solid var(--uxbert-border);border-radius:8px;margin:16px 0;overflow:hidden}.uxbert-screenshot-preview img{display:block;width:100%}.uxbert-screenshot-actions{background:var(--uxbert-border);display:flex;gap:8px;padding:12px}.uxbert-btn{align-items:center;border:none;border-radius:6px;cursor:pointer;display:inline-flex;font-size:14px;font-weight:500;gap:8px;padding:10px 20px;transition:all .2s ease}.uxbert-btn-primary{background:var(--uxbert-primary);color:#fff}.uxbert-btn-primary:hover{background:var(--uxbert-primary-hover)}.uxbert-btn-secondary{background:var(--uxbert-border);color:var(--uxbert-text)}.uxbert-btn-secondary:hover{background:#d1d5db}.uxbert-btn-danger{background:var(--uxbert-danger);color:#fff}.uxbert-btn-danger:hover{background:#dc2626}.uxbert-modal-actions{display:flex;gap:12px;justify-content:flex-end;margin-top:20px}.uxbert-toolbar-toggle{align-items:center;background:var(--uxbert-primary);border:none;border-radius:50%;bottom:24px;box-shadow:var(--uxbert-shadow);color:#fff;cursor:pointer;display:none;font-size:24px;height:56px;justify-content:center;position:fixed;right:24px;transition:all .3s ease;width:56px;z-index:var(--uxbert-z-toolbar)}.uxbert-toolbar-toggle.active{display:flex}.uxbert-toolbar-toggle.hidden{opacity:0;pointer-events:none;transform:scale(.8)}.uxbert-toolbar-toggle:hover{background:var(--uxbert-primary-hover);transform:scale(1.1)}.uxbert-toolbar{background:var(--uxbert-bg);border-radius:12px;bottom:24px;box-shadow:var(--uxbert-shadow);display:none;flex-direction:column;gap:8px;max-height:80vh;opacity:0;overflow-y:auto;padding:16px;pointer-events:none;position:fixed;right:24px;transform:translateY(20px);transition:all .3s ease;z-index:var(--uxbert-z-toolbar)}.uxbert-toolbar.active{display:flex}.uxbert-toolbar.expanded{opacity:1;pointer-events:all;transform:translateY(0)}.uxbert-toolbar-header{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-bottom:8px}.uxbert-toolbar-title{flex:1;font-size:14px;font-weight:600}.uxbert-toolbar-exit,.uxbert-toolbar-minimize{align-items:center;background:var(--uxbert-border);border:none;border-radius:6px;color:var(--uxbert-text);cursor:pointer;display:flex;font-size:20px;font-weight:700;height:32px;justify-content:center;transition:all .2s ease;width:32px}.uxbert-toolbar-exit{background:var(--uxbert-danger);color:#fff}.uxbert-toolbar-minimize:hover{background:#d1d5db;transform:scale(1.1)}.uxbert-toolbar-exit:hover{background:#dc2626;transform:scale(1.1)}.uxbert-toolbar-tools{display:flex;flex-wrap:wrap;gap:8px}.uxbert-tool-btn{align-items:center;background:var(--uxbert-bg);border:2px solid var(--uxbert-border);border-radius:6px;cursor:pointer;display:flex;font-family:Arial,sans-serif;font-size:18px;font-weight:700;height:40px;justify-content:center;transition:all .2s ease;width:40px}.uxbert-tool-btn.active,.uxbert-tool-btn:hover{background:var(--uxbert-primary);border-color:var(--uxbert-primary);color:#fff}.uxbert-color-picker{display:flex;gap:6px;margin:8px 0}.uxbert-color-option{border:2px solid var(--uxbert-border);border-radius:50%;cursor:pointer;height:32px;transition:transform .2s ease;width:32px}.uxbert-color-option:hover{transform:scale(1.1)}.uxbert-color-option.active{border:3px solid var(--uxbert-text)}.uxbert-canvas-overlay{cursor:crosshair;display:none;left:0;position:absolute;top:0;z-index:var(--uxbert-z-canvas)}.uxbert-canvas-overlay.active{display:block}.uxbert-text-input{background:hsla(0,0%,100%,.95);border:2px solid var(--uxbert-primary);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:var(--uxbert-text);font-family:Arial,sans-serif;font-size:16px;font-weight:700;min-width:200px;outline:none;padding:8px 12px;z-index:var(--uxbert-z-toolbar)}.uxbert-text-input:focus{border-color:var(--uxbert-primary-hover);box-shadow:0 4px 16px rgba(79,70,229,.3)}.uxbert-text-input::placeholder{color:#9ca3af;font-weight:400}@media (max-width:768px){.uxbert-modal{max-height:95vh;padding:16px;width:95%}.uxbert-toolbar{bottom:90px;left:16px;max-height:60vh;right:16px;width:auto}.uxbert-toolbar-toggle{bottom:16px;height:56px;right:16px;width:56px}.uxbert-fab{font-size:20px;height:48px;width:48px}.uxbert-color-picker,.uxbert-toolbar-tools{justify-content:center}}";
|
10187
|
+
var css_248z = ":root{--uxbert-primary:#4f46e5;--uxbert-primary-hover:#4338ca;--uxbert-danger:#ef4444;--uxbert-success:#10b981;--uxbert-bg:#fff;--uxbert-text:#1f2937;--uxbert-border:#e5e7eb;--uxbert-shadow:0 10px 25px rgba(0,0,0,.1);--uxbert-z-button:999999;--uxbert-z-modal:1000000;--uxbert-z-canvas:1000001;--uxbert-z-toolbar:1000002}[data-theme=dark]{--uxbert-bg:#1f2937;--uxbert-text:#f9fafb;--uxbert-border:#374151}.uxbert-fab{align-items:center;background:var(--uxbert-primary);border:none;border-radius:50%;box-shadow:var(--uxbert-shadow);color:#fff;cursor:pointer;display:flex;font-size:24px;height:56px;justify-content:center;position:fixed;transition:all .3s ease;width:56px;z-index:var(--uxbert-z-button)}.uxbert-fab:hover{background:var(--uxbert-primary-hover);transform:scale(1.1)}.uxbert-fab.bottom-right{bottom:24px;right:24px}.uxbert-fab.bottom-left{bottom:24px;left:24px}.uxbert-fab.top-right{right:24px;top:24px}.uxbert-fab.top-left{left:24px;top:24px}.uxbert-overlay{align-items:center;animation:fadeIn .3s ease;background:rgba(0,0,0,.5);display:none;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:var(--uxbert-z-modal)}.uxbert-overlay.active{display:flex}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.uxbert-modal{animation:slideUp .3s ease;background:var(--uxbert-bg);border-radius:12px;box-shadow:var(--uxbert-shadow);color:var(--uxbert-text);max-height:90vh;max-width:600px;overflow-y:auto;padding:24px;width:90%}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.uxbert-modal-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.uxbert-modal-title{font-size:20px;font-weight:600;margin:0}.uxbert-modal-close{align-items:center;background:none;border:none;border-radius:4px;color:var(--uxbert-text);cursor:pointer;display:flex;font-size:24px;height:32px;justify-content:center;padding:0;width:32px}.uxbert-modal-close:hover{background:var(--uxbert-border)}.uxbert-form-group{margin-bottom:16px}.uxbert-form-label{display:block;font-size:14px;font-weight:500;margin-bottom:8px}.uxbert-capture-mode{display:flex;flex-wrap:wrap;gap:12px}.uxbert-radio-label{align-items:center;border:2px solid var(--uxbert-border);border-radius:8px;cursor:pointer;display:flex;flex:1;gap:8px;min-width:140px;padding:10px 16px;transition:all .2s ease}.uxbert-radio-label:hover{background:rgba(79,70,229,.05);border-color:var(--uxbert-primary)}.uxbert-radio-label input[type=radio]{cursor:pointer;height:18px;margin:0;width:18px}.uxbert-radio-label input[type=radio]:checked{accent-color:var(--uxbert-primary)}.uxbert-radio-label:has(input[type=radio]:checked){background:rgba(79,70,229,.1);border-color:var(--uxbert-primary)}.uxbert-radio-label span{flex:1;font-size:14px;font-weight:500}.uxbert-form-input,.uxbert-form-select,.uxbert-form-textarea{background:var(--uxbert-bg);border:1px solid var(--uxbert-border);border-radius:6px;box-sizing:border-box;color:var(--uxbert-text);font-family:inherit;font-size:14px;padding:10px;width:100%}.uxbert-form-textarea{min-height:100px;resize:vertical}.uxbert-form-input:focus,.uxbert-form-select:focus,.uxbert-form-textarea:focus{border-color:var(--uxbert-primary);outline:none}.uxbert-capture-action{margin:16px 0;text-align:center}.uxbert-capture-action .uxbert-btn{min-width:200px}.uxbert-screenshot-preview{border:1px solid var(--uxbert-border);border-radius:8px;margin:16px 0;overflow:hidden}.uxbert-screenshot-preview img{display:block;width:100%}.uxbert-screenshot-actions{background:var(--uxbert-border);display:flex;gap:8px;padding:12px}.uxbert-btn{align-items:center;border:none;border-radius:6px;cursor:pointer;display:inline-flex;font-size:14px;font-weight:500;gap:8px;padding:10px 20px;transition:all .2s ease}.uxbert-btn-primary{background:var(--uxbert-primary);color:#fff}.uxbert-btn-primary:hover{background:var(--uxbert-primary-hover)}.uxbert-btn-secondary{background:var(--uxbert-border);color:var(--uxbert-text)}.uxbert-btn-secondary:hover{background:#d1d5db}.uxbert-btn-danger{background:var(--uxbert-danger);color:#fff}.uxbert-btn-danger:hover{background:#dc2626}.uxbert-modal-actions{display:flex;gap:12px;justify-content:flex-end;margin-top:20px}.uxbert-toolbar-toggle{align-items:center;background:var(--uxbert-primary);border:none;border-radius:50%;bottom:24px;box-shadow:var(--uxbert-shadow);color:#fff;cursor:pointer;display:none;font-size:24px;height:56px;justify-content:center;position:fixed;right:24px;transition:all .3s ease;width:56px;z-index:var(--uxbert-z-toolbar)}.uxbert-toolbar-toggle.active{display:flex}.uxbert-toolbar-toggle.hidden{opacity:0;pointer-events:none;transform:scale(.8)}.uxbert-toolbar-toggle:hover{background:var(--uxbert-primary-hover);transform:scale(1.1)}.uxbert-toolbar{background:var(--uxbert-bg);border-radius:12px;bottom:24px;box-shadow:var(--uxbert-shadow);display:none;flex-direction:column;gap:8px;max-height:80vh;opacity:0;overflow-y:auto;padding:16px;pointer-events:none;position:fixed;right:24px;transform:translateY(20px);transition:all .3s ease;z-index:var(--uxbert-z-toolbar)}.uxbert-toolbar.active{display:flex}.uxbert-toolbar.expanded{opacity:1;pointer-events:all;transform:translateY(0)}.uxbert-toolbar-header{align-items:center;display:flex;gap:8px;justify-content:space-between;margin-bottom:8px}.uxbert-toolbar-title{flex:1;font-size:14px;font-weight:600}.uxbert-toolbar-exit,.uxbert-toolbar-minimize{align-items:center;background:var(--uxbert-border);border:none;border-radius:6px;color:var(--uxbert-text);cursor:pointer;display:flex;font-size:20px;font-weight:700;height:32px;justify-content:center;transition:all .2s ease;width:32px}.uxbert-toolbar-exit{background:var(--uxbert-danger);color:#fff}.uxbert-toolbar-minimize:hover{background:#d1d5db;transform:scale(1.1)}.uxbert-toolbar-exit:hover{background:#dc2626;transform:scale(1.1)}.uxbert-toolbar-tools{display:flex;flex-wrap:wrap;gap:8px}.uxbert-tool-btn{align-items:center;background:var(--uxbert-bg);border:2px solid var(--uxbert-border);border-radius:6px;cursor:pointer;display:flex;font-family:Arial,sans-serif;font-size:18px;font-weight:700;height:40px;justify-content:center;transition:all .2s ease;width:40px}.uxbert-tool-btn.active,.uxbert-tool-btn:hover{background:var(--uxbert-primary);border-color:var(--uxbert-primary);color:#fff}.uxbert-color-picker{display:flex;gap:6px;margin:8px 0}.uxbert-color-option{border:2px solid var(--uxbert-border);border-radius:50%;cursor:pointer;height:32px;transition:transform .2s ease;width:32px}.uxbert-color-option:hover{transform:scale(1.1)}.uxbert-color-option.active{border:3px solid var(--uxbert-text)}.uxbert-canvas-overlay{cursor:crosshair;display:none;left:0;position:absolute;top:0;z-index:var(--uxbert-z-canvas)}.uxbert-canvas-overlay.active{display:block}.uxbert-canvas-overlay.viewport-mode{left:0;position:fixed;top:0}.uxbert-text-input{background:hsla(0,0%,100%,.95);border:2px solid var(--uxbert-primary);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);color:var(--uxbert-text);font-family:Arial,sans-serif;font-size:16px;font-weight:700;min-width:200px;outline:none;padding:8px 12px;z-index:var(--uxbert-z-toolbar)}.uxbert-text-input:focus{border-color:var(--uxbert-primary-hover);box-shadow:0 4px 16px rgba(79,70,229,.3)}.uxbert-text-input::placeholder{color:#9ca3af;font-weight:400}@media (max-width:768px){.uxbert-modal{max-height:95vh;padding:16px;width:95%}.uxbert-toolbar{bottom:90px;left:16px;max-height:60vh;right:16px;width:auto}.uxbert-toolbar-toggle{bottom:16px;height:56px;right:16px;width:56px}.uxbert-fab{font-size:20px;height:48px;width:48px}.uxbert-color-picker,.uxbert-toolbar-tools{justify-content:center}}";
|
10054
10188
|
styleInject(css_248z);
|
10055
10189
|
|
10056
10190
|
// Main initialization file
|
@@ -10092,6 +10226,7 @@ var Reportly = (function () {
|
|
10092
10226
|
onClose: () => this.handleModalClose(),
|
10093
10227
|
onAnnotate: () => this.startAnnotation(),
|
10094
10228
|
onRetake: () => this.retakeScreenshot(),
|
10229
|
+
onCapture: () => this.captureWithMode(),
|
10095
10230
|
});
|
10096
10231
|
this.toolbar = new Toolbar({
|
10097
10232
|
onToolChange: (tool) => this.annotation?.setTool(tool),
|
@@ -10122,14 +10257,27 @@ var Reportly = (function () {
|
|
10122
10257
|
});
|
10123
10258
|
}
|
10124
10259
|
async handleButtonClick() {
|
10260
|
+
try {
|
10261
|
+
// Open modal first to let user choose capture mode
|
10262
|
+
this.modal?.open();
|
10263
|
+
}
|
10264
|
+
catch (error) {
|
10265
|
+
console.error("Failed to open modal:", error);
|
10266
|
+
alert("Failed to open modal. Please try again.");
|
10267
|
+
}
|
10268
|
+
}
|
10269
|
+
async captureWithMode() {
|
10125
10270
|
try {
|
10126
10271
|
this.state?.setState(STATE.CAPTURING);
|
10272
|
+
// Get capture mode from modal
|
10273
|
+
const captureMode = this.modal?.getCaptureMode() || 'viewport';
|
10274
|
+
// Save capture mode in state
|
10275
|
+
this.state?.setCaptureMode(captureMode);
|
10127
10276
|
// Capture screenshot
|
10128
|
-
const screenshot = await this.screenshot.capture();
|
10277
|
+
const screenshot = await this.screenshot.capture(captureMode);
|
10129
10278
|
this.state?.setScreenshot(screenshot);
|
10130
10279
|
// Show modal with screenshot
|
10131
10280
|
this.modal?.setScreenshot(screenshot);
|
10132
|
-
this.modal?.open();
|
10133
10281
|
this.state?.setState(STATE.IDLE);
|
10134
10282
|
}
|
10135
10283
|
catch (error) {
|
@@ -10142,7 +10290,8 @@ var Reportly = (function () {
|
|
10142
10290
|
this.state?.setState(STATE.ANNOTATING);
|
10143
10291
|
this.modal?.close();
|
10144
10292
|
this.button?.hide();
|
10145
|
-
this.
|
10293
|
+
const captureMode = this.state?.getCaptureMode() || 'viewport';
|
10294
|
+
this.annotation?.show(captureMode);
|
10146
10295
|
this.toolbar?.show();
|
10147
10296
|
}
|
10148
10297
|
exitAnnotation() {
|
@@ -10178,13 +10327,16 @@ var Reportly = (function () {
|
|
10178
10327
|
}
|
10179
10328
|
async retakeScreenshot() {
|
10180
10329
|
try {
|
10330
|
+
// Get the current capture mode from modal before closing
|
10331
|
+
const captureMode = this.modal?.getCaptureMode() || 'viewport';
|
10181
10332
|
this.modal?.close();
|
10182
10333
|
this.state?.setState(STATE.CAPTURING);
|
10183
10334
|
// Clear previous annotations
|
10184
10335
|
this.annotation?.clear();
|
10185
|
-
// Capture new screenshot
|
10186
|
-
const screenshot = await this.screenshot.capture();
|
10336
|
+
// Capture new screenshot with the same mode
|
10337
|
+
const screenshot = await this.screenshot.capture(captureMode);
|
10187
10338
|
this.state?.setScreenshot(screenshot);
|
10339
|
+
this.state?.setCaptureMode(captureMode);
|
10188
10340
|
// Show modal with new screenshot
|
10189
10341
|
this.modal?.setScreenshot(screenshot);
|
10190
10342
|
this.modal?.open();
|