@fogg/bug-reporter 1.0.0

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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -0
  3. package/dist/chunk-6TCI6T2U.cjs +45 -0
  4. package/dist/chunk-6TCI6T2U.cjs.map +1 -0
  5. package/dist/chunk-S2YRP4GT.js +22 -0
  6. package/dist/chunk-S2YRP4GT.js.map +1 -0
  7. package/dist/index.cjs +1963 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.d.cts +331 -0
  10. package/dist/index.d.ts +331 -0
  11. package/dist/index.js +1956 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/recording-ML63ZQ6A.cjs +120 -0
  14. package/dist/recording-ML63ZQ6A.cjs.map +1 -0
  15. package/dist/recording-YSR6IORT.js +118 -0
  16. package/dist/recording-YSR6IORT.js.map +1 -0
  17. package/dist/screenshot-F4W72WRK.js +176 -0
  18. package/dist/screenshot-F4W72WRK.js.map +1 -0
  19. package/dist/screenshot-FRAZAS6B.cjs +178 -0
  20. package/dist/screenshot-FRAZAS6B.cjs.map +1 -0
  21. package/dist/styles/index.css +495 -0
  22. package/dist/styles/index.css.map +1 -0
  23. package/dist/styles/index.d.cts +2 -0
  24. package/dist/styles/index.d.ts +2 -0
  25. package/docs/backend-local.md +16 -0
  26. package/docs/backend-s3.md +31 -0
  27. package/docs/browser-compatibility.md +8 -0
  28. package/docs/framework-cra.md +10 -0
  29. package/docs/framework-nextjs.md +16 -0
  30. package/docs/framework-remix.md +6 -0
  31. package/docs/framework-vite.md +21 -0
  32. package/docs/known-limitations.md +6 -0
  33. package/docs/quickstart.md +26 -0
  34. package/docs/security.md +9 -0
  35. package/examples/backend-local/README.md +11 -0
  36. package/examples/backend-local/package.json +13 -0
  37. package/examples/backend-local/src/server.mjs +31 -0
  38. package/examples/backend-s3-presign/README.md +14 -0
  39. package/examples/backend-s3-presign/package.json +13 -0
  40. package/examples/backend-s3-presign/src/server.mjs +53 -0
  41. package/examples/sandbox-vite/README.md +25 -0
  42. package/examples/sandbox-vite/index.html +12 -0
  43. package/examples/sandbox-vite/package-lock.json +1880 -0
  44. package/examples/sandbox-vite/package.json +24 -0
  45. package/examples/sandbox-vite/src/App.tsx +200 -0
  46. package/examples/sandbox-vite/src/main.tsx +10 -0
  47. package/examples/sandbox-vite/src/sandbox.css +74 -0
  48. package/examples/sandbox-vite/tsconfig.json +14 -0
  49. package/examples/sandbox-vite/vite.config.ts +9 -0
  50. package/package.json +93 -0
@@ -0,0 +1,495 @@
1
+ /* src/styles/index.css */
2
+ :root {
3
+ --br-bg: rgba(7, 10, 14, 0.84);
4
+ --br-text: #e9eff8;
5
+ --br-muted: #a8b5c7;
6
+ --br-border: rgba(202, 219, 243, 0.22);
7
+ --br-primary: #3b82f6;
8
+ --br-danger: #ef4444;
9
+ --br-overlay:
10
+ linear-gradient(
11
+ to left,
12
+ rgba(0, 0, 0, 0.32),
13
+ rgba(0, 0, 0, 0.08) 45%,
14
+ transparent 72%);
15
+ --br-radius: 14px;
16
+ --br-shadow: -14px 0 40px rgba(0, 0, 0, 0.42);
17
+ --br-font:
18
+ "IBM Plex Sans",
19
+ "Segoe UI",
20
+ sans-serif;
21
+ }
22
+ .br-launcher {
23
+ position: fixed;
24
+ color: #f8fbff;
25
+ border: 0;
26
+ padding: 12px 18px;
27
+ font: 600 14px var(--br-font);
28
+ cursor: pointer;
29
+ box-shadow: 0 10px 28px rgba(0, 0, 0, 0.35);
30
+ }
31
+ .br-launcher.br-theme-light {
32
+ color: #fff;
33
+ box-shadow: 0 10px 24px rgba(15, 23, 42, 0.24);
34
+ }
35
+ .br-launcher.is-bottom-right {
36
+ right: 24px;
37
+ bottom: 24px;
38
+ }
39
+ .br-launcher.is-bottom-left {
40
+ left: 24px;
41
+ bottom: 24px;
42
+ }
43
+ .br-launcher.is-top-right {
44
+ right: 24px;
45
+ top: 24px;
46
+ }
47
+ .br-launcher.is-top-left {
48
+ left: 24px;
49
+ top: 24px;
50
+ }
51
+ .br-modal-overlay {
52
+ position: fixed;
53
+ inset: 0;
54
+ background: var(--br-overlay);
55
+ display: flex;
56
+ pointer-events: none;
57
+ }
58
+ .br-modal-overlay.br-theme-light {
59
+ background:
60
+ linear-gradient(
61
+ to left,
62
+ rgba(15, 23, 42, 0.16),
63
+ rgba(15, 23, 42, 0.06) 45%,
64
+ transparent 72%);
65
+ }
66
+ .br-modal-overlay.is-right {
67
+ align-items: stretch;
68
+ justify-content: flex-end;
69
+ }
70
+ .br-modal-overlay.is-left {
71
+ align-items: stretch;
72
+ justify-content: flex-start;
73
+ }
74
+ .br-modal-overlay.is-top {
75
+ align-items: flex-start;
76
+ justify-content: stretch;
77
+ background:
78
+ linear-gradient(
79
+ to bottom,
80
+ rgba(0, 0, 0, 0.34),
81
+ rgba(0, 0, 0, 0.1) 45%,
82
+ transparent 72%);
83
+ }
84
+ .br-modal-overlay.is-top.br-theme-light {
85
+ background:
86
+ linear-gradient(
87
+ to bottom,
88
+ rgba(15, 23, 42, 0.16),
89
+ rgba(15, 23, 42, 0.06) 45%,
90
+ transparent 72%);
91
+ }
92
+ .br-modal-overlay.is-bottom {
93
+ align-items: flex-end;
94
+ justify-content: stretch;
95
+ background:
96
+ linear-gradient(
97
+ to top,
98
+ rgba(0, 0, 0, 0.34),
99
+ rgba(0, 0, 0, 0.1) 45%,
100
+ transparent 72%);
101
+ }
102
+ .br-modal-overlay.is-bottom.br-theme-light {
103
+ background:
104
+ linear-gradient(
105
+ to top,
106
+ rgba(15, 23, 42, 0.16),
107
+ rgba(15, 23, 42, 0.06) 45%,
108
+ transparent 72%);
109
+ }
110
+ .br-modal {
111
+ pointer-events: auto;
112
+ width: min(430px, 100vw);
113
+ height: 100vh;
114
+ overflow: auto;
115
+ background: var(--br-bg);
116
+ color: var(--br-text);
117
+ box-shadow: var(--br-shadow);
118
+ font-family: var(--br-font);
119
+ backdrop-filter: blur(8px);
120
+ }
121
+ .br-modal.br-theme-light {
122
+ --br-bg: rgba(248, 250, 252, 0.96);
123
+ --br-text: #0f172a;
124
+ --br-muted: #475569;
125
+ --br-border: rgba(15, 23, 42, 0.18);
126
+ background: var(--br-bg);
127
+ color: var(--br-text);
128
+ }
129
+ .br-modal.is-right {
130
+ border-left: 1px solid var(--br-border);
131
+ }
132
+ .br-modal.is-left {
133
+ border-right: 1px solid var(--br-border);
134
+ box-shadow: 14px 0 40px rgba(0, 0, 0, 0.42);
135
+ }
136
+ .br-modal.is-top,
137
+ .br-modal.is-bottom {
138
+ width: 100vw;
139
+ max-height: 100vh;
140
+ height: min(460px, 100vh);
141
+ }
142
+ .br-modal.is-top {
143
+ border-bottom: 1px solid var(--br-border);
144
+ box-shadow: 0 14px 40px rgba(0, 0, 0, 0.42);
145
+ }
146
+ .br-modal.is-bottom {
147
+ border-top: 1px solid var(--br-border);
148
+ box-shadow: 0 -14px 40px rgba(0, 0, 0, 0.42);
149
+ }
150
+ .br-modal.is-top .br-preview-wrapper,
151
+ .br-modal.is-bottom .br-preview-wrapper {
152
+ justify-items: center;
153
+ }
154
+ .br-modal.is-top .br-annotation-canvas,
155
+ .br-modal.is-bottom .br-annotation-canvas {
156
+ width: auto;
157
+ max-width: 100%;
158
+ height: auto;
159
+ max-height: min(48vh, 360px);
160
+ display: block;
161
+ margin: 0 auto;
162
+ }
163
+ .br-modal-header {
164
+ position: sticky;
165
+ top: 0;
166
+ z-index: 2;
167
+ display: flex;
168
+ justify-content: space-between;
169
+ align-items: center;
170
+ padding: 14px 16px;
171
+ border-bottom: 1px solid var(--br-border);
172
+ background: rgba(5, 8, 12, 0.72);
173
+ }
174
+ .br-modal.br-theme-light .br-modal-header {
175
+ background: rgba(241, 245, 249, 0.9);
176
+ }
177
+ .br-modal-header-actions {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 8px;
181
+ }
182
+ .br-dock-controls {
183
+ display: flex;
184
+ gap: 6px;
185
+ }
186
+ .br-icon-btn {
187
+ display: inline-flex;
188
+ align-items: center;
189
+ justify-content: center;
190
+ border: 1px solid var(--br-border);
191
+ border-radius: 8px;
192
+ background: rgba(255, 255, 255, 0.03);
193
+ color: var(--br-text);
194
+ width: 30px;
195
+ height: 30px;
196
+ padding: 0;
197
+ cursor: pointer;
198
+ }
199
+ .br-modal.br-theme-light .br-icon-btn {
200
+ background: rgba(15, 23, 42, 0.06);
201
+ }
202
+ .br-icon-btn svg {
203
+ width: 14px;
204
+ height: 14px;
205
+ fill: none;
206
+ stroke: currentColor;
207
+ stroke-width: 1.8;
208
+ stroke-linecap: round;
209
+ }
210
+ .br-dock-btn svg path:last-child {
211
+ fill: currentColor;
212
+ stroke: none;
213
+ opacity: 0.85;
214
+ }
215
+ .br-dock-btn.is-active {
216
+ border-color: var(--br-primary);
217
+ color: #bfdbfe;
218
+ background: rgba(59, 130, 246, 0.2);
219
+ }
220
+ .br-modal.br-theme-light .br-dock-btn.is-active {
221
+ border-color: var(--br-primary);
222
+ color: #ffffff;
223
+ background: var(--br-primary);
224
+ box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.35) inset;
225
+ }
226
+ .br-step {
227
+ padding: 16px;
228
+ }
229
+ .br-step h2 {
230
+ margin: 0 0 8px;
231
+ }
232
+ .br-step p {
233
+ margin: 0 0 16px;
234
+ color: var(--br-muted);
235
+ }
236
+ .br-field {
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: 8px;
240
+ margin-bottom: 14px;
241
+ font-size: 13px;
242
+ font-weight: 600;
243
+ }
244
+ .br-field input,
245
+ .br-field textarea,
246
+ .br-field select {
247
+ border: 1px solid var(--br-border);
248
+ border-radius: 10px;
249
+ font: 400 14px var(--br-font);
250
+ color: var(--br-text);
251
+ background: rgba(255, 255, 255, 0.03);
252
+ padding: 10px;
253
+ }
254
+ .br-modal.br-theme-light .br-field input,
255
+ .br-modal.br-theme-light .br-field textarea,
256
+ .br-modal.br-theme-light .br-field select {
257
+ background: rgba(15, 23, 42, 0.04);
258
+ }
259
+ .br-field input::placeholder,
260
+ .br-field textarea::placeholder {
261
+ color: #8fa1b7;
262
+ }
263
+ .br-modal.br-theme-light .br-field input::placeholder,
264
+ .br-modal.br-theme-light .br-field textarea::placeholder {
265
+ color: #64748b;
266
+ }
267
+ .br-grid-2 {
268
+ display: grid;
269
+ grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
270
+ gap: 12px;
271
+ }
272
+ .br-actions {
273
+ display: flex;
274
+ gap: 10px;
275
+ flex-wrap: wrap;
276
+ margin-top: 16px;
277
+ }
278
+ .br-capture-row {
279
+ display: flex;
280
+ gap: 10px;
281
+ flex-wrap: wrap;
282
+ margin-top: 10px;
283
+ }
284
+ .br-capture-item {
285
+ flex: 1 1 190px;
286
+ }
287
+ .br-capture-btn {
288
+ width: 100%;
289
+ display: inline-flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ gap: 8px;
293
+ }
294
+ .br-capture-icon {
295
+ width: 14px;
296
+ height: 14px;
297
+ fill: none;
298
+ stroke: currentColor;
299
+ stroke-width: 1.7;
300
+ stroke-linejoin: round;
301
+ }
302
+ .br-capture-done {
303
+ font-size: 11px;
304
+ color: #bfdbfe;
305
+ }
306
+ .br-capture-note {
307
+ margin: 10px 0 0;
308
+ color: var(--br-muted);
309
+ font-size: 13px;
310
+ }
311
+ .br-capture-inline-error {
312
+ margin-top: 8px;
313
+ }
314
+ .br-btn {
315
+ border: 1px solid transparent;
316
+ border-radius: 10px;
317
+ padding: 8px 12px;
318
+ cursor: pointer;
319
+ font: 600 13px var(--br-font);
320
+ }
321
+ .br-btn:disabled {
322
+ opacity: 0.6;
323
+ cursor: not-allowed;
324
+ }
325
+ .br-btn-primary {
326
+ background: var(--br-primary);
327
+ color: #fff;
328
+ }
329
+ .br-btn-secondary {
330
+ background: rgba(255, 255, 255, 0.05);
331
+ border-color: var(--br-border);
332
+ color: var(--br-text);
333
+ }
334
+ .br-modal.br-theme-light .br-btn-secondary {
335
+ background: rgba(15, 23, 42, 0.06);
336
+ }
337
+ .br-btn-secondary.is-active {
338
+ border-color: var(--br-primary);
339
+ color: #bfdbfe;
340
+ }
341
+ .br-modal.br-theme-light .br-btn-secondary.is-active {
342
+ color: #1d4ed8;
343
+ background: rgba(59, 130, 246, 0.16);
344
+ }
345
+ .br-btn-danger {
346
+ background: var(--br-danger);
347
+ color: #fff;
348
+ }
349
+ .br-preview-wrapper,
350
+ .br-assets {
351
+ display: grid;
352
+ gap: 12px;
353
+ margin-top: 14px;
354
+ }
355
+ .br-assets {
356
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
357
+ }
358
+ .br-asset-card {
359
+ border: 1px solid var(--br-border);
360
+ border-radius: 10px;
361
+ padding: 10px;
362
+ background: rgba(255, 255, 255, 0.02);
363
+ }
364
+ .br-asset-type {
365
+ font-size: 12px;
366
+ text-transform: uppercase;
367
+ color: var(--br-muted);
368
+ }
369
+ .br-preview {
370
+ width: 100%;
371
+ max-height: 240px;
372
+ border-radius: 10px;
373
+ border: 1px solid var(--br-border);
374
+ object-fit: contain;
375
+ background: rgba(255, 255, 255, 0.02);
376
+ }
377
+ .br-modal.br-theme-light .br-preview {
378
+ background: rgba(15, 23, 42, 0.03);
379
+ }
380
+ .br-checkbox {
381
+ display: flex;
382
+ align-items: center;
383
+ gap: 8px;
384
+ font-size: 13px;
385
+ margin-bottom: 12px;
386
+ }
387
+ .br-upload-progress {
388
+ margin-top: 12px;
389
+ font-size: 14px;
390
+ }
391
+ .br-progress-track {
392
+ height: 8px;
393
+ border-radius: 999px;
394
+ background: rgba(148, 163, 184, 0.25);
395
+ overflow: hidden;
396
+ margin-top: 6px;
397
+ }
398
+ .br-progress-fill {
399
+ height: 100%;
400
+ background: var(--br-primary);
401
+ }
402
+ .br-summary,
403
+ .br-diagnostics {
404
+ border: 1px solid var(--br-border);
405
+ border-radius: 10px;
406
+ padding: 12px;
407
+ margin-top: 12px;
408
+ background: rgba(255, 255, 255, 0.02);
409
+ }
410
+ .br-modal.br-theme-light .br-summary,
411
+ .br-modal.br-theme-light .br-diagnostics {
412
+ background: rgba(15, 23, 42, 0.03);
413
+ }
414
+ .br-diagnostics ul {
415
+ margin: 0;
416
+ padding-left: 16px;
417
+ }
418
+ .br-diagnostics-list {
419
+ margin: 0;
420
+ padding-left: 16px;
421
+ max-height: 180px;
422
+ overflow: auto;
423
+ }
424
+ .br-diagnostics-list li {
425
+ margin: 6px 0;
426
+ font-size: 12px;
427
+ line-height: 1.35;
428
+ }
429
+ .br-diagnostics-list code {
430
+ color: #fca5a5;
431
+ margin-right: 6px;
432
+ font-size: 11px;
433
+ }
434
+ .br-modal .br-diagnostics-list,
435
+ .br-modal .br-diagnostics-list li,
436
+ .br-modal .br-diagnostics-list li::marker,
437
+ .br-modal .br-diagnostics-list li code,
438
+ .br-modal .br-diagnostics-list li a {
439
+ color: #fca5a5 !important;
440
+ }
441
+ .br-error {
442
+ color: #fca5a5;
443
+ font-size: 14px;
444
+ margin-top: 10px;
445
+ }
446
+ .br-annotation {
447
+ border: 1px solid var(--br-border);
448
+ border-radius: 10px;
449
+ padding: 10px;
450
+ background: rgba(255, 255, 255, 0.02);
451
+ }
452
+ .br-modal.br-theme-light .br-annotation {
453
+ background: rgba(15, 23, 42, 0.03);
454
+ }
455
+ .br-annotation-tools {
456
+ display: flex;
457
+ gap: 8px;
458
+ margin-bottom: 10px;
459
+ flex-wrap: wrap;
460
+ }
461
+ .br-annotation-canvas {
462
+ width: 100%;
463
+ border: 1px solid var(--br-border);
464
+ border-radius: 8px;
465
+ max-height: 300px;
466
+ }
467
+ @media (max-width: 820px) {
468
+ .br-modal-overlay {
469
+ background: rgba(0, 0, 0, 0.34);
470
+ }
471
+ .br-modal {
472
+ width: 100vw;
473
+ height: 100vh;
474
+ max-height: 100vh;
475
+ border: 0;
476
+ box-shadow: none;
477
+ }
478
+ .br-launcher.is-bottom-right {
479
+ bottom: 16px;
480
+ right: 16px;
481
+ }
482
+ .br-launcher.is-bottom-left {
483
+ bottom: 16px;
484
+ left: 16px;
485
+ }
486
+ .br-launcher.is-top-right {
487
+ top: 16px;
488
+ right: 16px;
489
+ }
490
+ .br-launcher.is-top-left {
491
+ top: 16px;
492
+ left: 16px;
493
+ }
494
+ }
495
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/styles/index.css"],"sourcesContent":[":root {\n --br-bg: rgba(7, 10, 14, 0.84);\n --br-text: #e9eff8;\n --br-muted: #a8b5c7;\n --br-border: rgba(202, 219, 243, 0.22);\n --br-primary: #3b82f6;\n --br-danger: #ef4444;\n --br-overlay: linear-gradient(to left, rgba(0, 0, 0, 0.32), rgba(0, 0, 0, 0.08) 45%, transparent 72%);\n --br-radius: 14px;\n --br-shadow: -14px 0 40px rgba(0, 0, 0, 0.42);\n --br-font: \"IBM Plex Sans\", \"Segoe UI\", sans-serif;\n}\n\n.br-launcher {\n position: fixed;\n color: #f8fbff;\n border: 0;\n padding: 12px 18px;\n font: 600 14px var(--br-font);\n cursor: pointer;\n box-shadow: 0 10px 28px rgba(0, 0, 0, 0.35);\n}\n\n.br-launcher.br-theme-light {\n color: #fff;\n box-shadow: 0 10px 24px rgba(15, 23, 42, 0.24);\n}\n\n.br-launcher.is-bottom-right {\n right: 24px;\n bottom: 24px;\n}\n\n.br-launcher.is-bottom-left {\n left: 24px;\n bottom: 24px;\n}\n\n.br-launcher.is-top-right {\n right: 24px;\n top: 24px;\n}\n\n.br-launcher.is-top-left {\n left: 24px;\n top: 24px;\n}\n\n.br-modal-overlay {\n position: fixed;\n inset: 0;\n background: var(--br-overlay);\n display: flex;\n pointer-events: none;\n}\n\n.br-modal-overlay.br-theme-light {\n background: linear-gradient(to left, rgba(15, 23, 42, 0.16), rgba(15, 23, 42, 0.06) 45%, transparent 72%);\n}\n\n.br-modal-overlay.is-right {\n align-items: stretch;\n justify-content: flex-end;\n}\n\n.br-modal-overlay.is-left {\n align-items: stretch;\n justify-content: flex-start;\n}\n\n.br-modal-overlay.is-top {\n align-items: flex-start;\n justify-content: stretch;\n background: linear-gradient(to bottom, rgba(0, 0, 0, 0.34), rgba(0, 0, 0, 0.1) 45%, transparent 72%);\n}\n\n.br-modal-overlay.is-top.br-theme-light {\n background: linear-gradient(to bottom, rgba(15, 23, 42, 0.16), rgba(15, 23, 42, 0.06) 45%, transparent 72%);\n}\n\n.br-modal-overlay.is-bottom {\n align-items: flex-end;\n justify-content: stretch;\n background: linear-gradient(to top, rgba(0, 0, 0, 0.34), rgba(0, 0, 0, 0.1) 45%, transparent 72%);\n}\n\n.br-modal-overlay.is-bottom.br-theme-light {\n background: linear-gradient(to top, rgba(15, 23, 42, 0.16), rgba(15, 23, 42, 0.06) 45%, transparent 72%);\n}\n\n.br-modal {\n pointer-events: auto;\n width: min(430px, 100vw);\n height: 100vh;\n overflow: auto;\n background: var(--br-bg);\n color: var(--br-text);\n box-shadow: var(--br-shadow);\n font-family: var(--br-font);\n backdrop-filter: blur(8px);\n}\n\n.br-modal.br-theme-light {\n --br-bg: rgba(248, 250, 252, 0.96);\n --br-text: #0f172a;\n --br-muted: #475569;\n --br-border: rgba(15, 23, 42, 0.18);\n background: var(--br-bg);\n color: var(--br-text);\n}\n\n.br-modal.is-right {\n border-left: 1px solid var(--br-border);\n}\n\n.br-modal.is-left {\n border-right: 1px solid var(--br-border);\n box-shadow: 14px 0 40px rgba(0, 0, 0, 0.42);\n}\n\n.br-modal.is-top,\n.br-modal.is-bottom {\n width: 100vw;\n max-height: 100vh;\n height: min(460px, 100vh);\n}\n\n.br-modal.is-top {\n border-bottom: 1px solid var(--br-border);\n box-shadow: 0 14px 40px rgba(0, 0, 0, 0.42);\n}\n\n.br-modal.is-bottom {\n border-top: 1px solid var(--br-border);\n box-shadow: 0 -14px 40px rgba(0, 0, 0, 0.42);\n}\n\n.br-modal.is-top .br-preview-wrapper,\n.br-modal.is-bottom .br-preview-wrapper {\n justify-items: center;\n}\n\n.br-modal.is-top .br-annotation-canvas,\n.br-modal.is-bottom .br-annotation-canvas {\n width: auto;\n max-width: 100%;\n height: auto;\n max-height: min(48vh, 360px);\n display: block;\n margin: 0 auto;\n}\n\n.br-modal-header {\n position: sticky;\n top: 0;\n z-index: 2;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n border-bottom: 1px solid var(--br-border);\n background: rgba(5, 8, 12, 0.72);\n}\n\n.br-modal.br-theme-light .br-modal-header {\n background: rgba(241, 245, 249, 0.9);\n}\n\n.br-modal-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.br-dock-controls {\n display: flex;\n gap: 6px;\n}\n\n.br-icon-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--br-border);\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.03);\n color: var(--br-text);\n width: 30px;\n height: 30px;\n padding: 0;\n cursor: pointer;\n}\n\n.br-modal.br-theme-light .br-icon-btn {\n background: rgba(15, 23, 42, 0.06);\n}\n\n.br-icon-btn svg {\n width: 14px;\n height: 14px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.8;\n stroke-linecap: round;\n}\n\n.br-dock-btn svg path:last-child {\n fill: currentColor;\n stroke: none;\n opacity: 0.85;\n}\n\n.br-dock-btn.is-active {\n border-color: var(--br-primary);\n color: #bfdbfe;\n background: rgba(59, 130, 246, 0.2);\n}\n\n.br-modal.br-theme-light .br-dock-btn.is-active {\n border-color: var(--br-primary);\n color: #ffffff;\n background: var(--br-primary);\n box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.35) inset;\n}\n\n.br-step {\n padding: 16px;\n}\n\n.br-step h2 {\n margin: 0 0 8px;\n}\n\n.br-step p {\n margin: 0 0 16px;\n color: var(--br-muted);\n}\n\n.br-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 14px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.br-field input,\n.br-field textarea,\n.br-field select {\n border: 1px solid var(--br-border);\n border-radius: 10px;\n font: 400 14px var(--br-font);\n color: var(--br-text);\n background: rgba(255, 255, 255, 0.03);\n padding: 10px;\n}\n\n.br-modal.br-theme-light .br-field input,\n.br-modal.br-theme-light .br-field textarea,\n.br-modal.br-theme-light .br-field select {\n background: rgba(15, 23, 42, 0.04);\n}\n\n.br-field input::placeholder,\n.br-field textarea::placeholder {\n color: #8fa1b7;\n}\n\n.br-modal.br-theme-light .br-field input::placeholder,\n.br-modal.br-theme-light .br-field textarea::placeholder {\n color: #64748b;\n}\n\n.br-grid-2 {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));\n gap: 12px;\n}\n\n.br-actions {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n margin-top: 16px;\n}\n\n.br-capture-row {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n margin-top: 10px;\n}\n\n.br-capture-item {\n flex: 1 1 190px;\n}\n\n.br-capture-btn {\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.br-capture-icon {\n width: 14px;\n height: 14px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.7;\n stroke-linejoin: round;\n}\n\n.br-capture-done {\n font-size: 11px;\n color: #bfdbfe;\n}\n\n.br-capture-note {\n margin: 10px 0 0;\n color: var(--br-muted);\n font-size: 13px;\n}\n\n.br-capture-inline-error {\n margin-top: 8px;\n}\n\n.br-btn {\n border: 1px solid transparent;\n border-radius: 10px;\n padding: 8px 12px;\n cursor: pointer;\n font: 600 13px var(--br-font);\n}\n\n.br-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.br-btn-primary {\n background: var(--br-primary);\n color: #fff;\n}\n\n.br-btn-secondary {\n background: rgba(255, 255, 255, 0.05);\n border-color: var(--br-border);\n color: var(--br-text);\n}\n\n.br-modal.br-theme-light .br-btn-secondary {\n background: rgba(15, 23, 42, 0.06);\n}\n\n.br-btn-secondary.is-active {\n border-color: var(--br-primary);\n color: #bfdbfe;\n}\n\n.br-modal.br-theme-light .br-btn-secondary.is-active {\n color: #1d4ed8;\n background: rgba(59, 130, 246, 0.16);\n}\n\n.br-btn-danger {\n background: var(--br-danger);\n color: #fff;\n}\n\n.br-preview-wrapper,\n.br-assets {\n display: grid;\n gap: 12px;\n margin-top: 14px;\n}\n\n.br-assets {\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n}\n\n.br-asset-card {\n border: 1px solid var(--br-border);\n border-radius: 10px;\n padding: 10px;\n background: rgba(255, 255, 255, 0.02);\n}\n\n.br-asset-type {\n font-size: 12px;\n text-transform: uppercase;\n color: var(--br-muted);\n}\n\n.br-preview {\n width: 100%;\n max-height: 240px;\n border-radius: 10px;\n border: 1px solid var(--br-border);\n object-fit: contain;\n background: rgba(255, 255, 255, 0.02);\n}\n\n.br-modal.br-theme-light .br-preview {\n background: rgba(15, 23, 42, 0.03);\n}\n\n.br-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n margin-bottom: 12px;\n}\n\n.br-upload-progress {\n margin-top: 12px;\n font-size: 14px;\n}\n\n.br-progress-track {\n height: 8px;\n border-radius: 999px;\n background: rgba(148, 163, 184, 0.25);\n overflow: hidden;\n margin-top: 6px;\n}\n\n.br-progress-fill {\n height: 100%;\n background: var(--br-primary);\n}\n\n.br-summary,\n.br-diagnostics {\n border: 1px solid var(--br-border);\n border-radius: 10px;\n padding: 12px;\n margin-top: 12px;\n background: rgba(255, 255, 255, 0.02);\n}\n\n.br-modal.br-theme-light .br-summary,\n.br-modal.br-theme-light .br-diagnostics {\n background: rgba(15, 23, 42, 0.03);\n}\n\n.br-diagnostics ul {\n margin: 0;\n padding-left: 16px;\n}\n\n.br-diagnostics-list {\n margin: 0;\n padding-left: 16px;\n max-height: 180px;\n overflow: auto;\n}\n\n.br-diagnostics-list li {\n margin: 6px 0;\n font-size: 12px;\n line-height: 1.35;\n}\n\n.br-diagnostics-list code {\n color: #fca5a5;\n margin-right: 6px;\n font-size: 11px;\n}\n\n.br-modal .br-diagnostics-list,\n.br-modal .br-diagnostics-list li,\n.br-modal .br-diagnostics-list li::marker,\n.br-modal .br-diagnostics-list li code,\n.br-modal .br-diagnostics-list li a {\n color: #fca5a5 !important;\n}\n\n.br-error {\n color: #fca5a5;\n font-size: 14px;\n margin-top: 10px;\n}\n\n.br-annotation {\n border: 1px solid var(--br-border);\n border-radius: 10px;\n padding: 10px;\n background: rgba(255, 255, 255, 0.02);\n}\n\n.br-modal.br-theme-light .br-annotation {\n background: rgba(15, 23, 42, 0.03);\n}\n\n.br-annotation-tools {\n display: flex;\n gap: 8px;\n margin-bottom: 10px;\n flex-wrap: wrap;\n}\n\n.br-annotation-canvas {\n width: 100%;\n border: 1px solid var(--br-border);\n border-radius: 8px;\n max-height: 300px;\n}\n\n@media (max-width: 820px) {\n .br-modal-overlay {\n background: rgba(0, 0, 0, 0.34);\n }\n\n .br-modal {\n width: 100vw;\n height: 100vh;\n max-height: 100vh;\n border: 0;\n box-shadow: none;\n }\n\n .br-launcher.is-bottom-right {\n bottom: 16px;\n right: 16px;\n }\n\n .br-launcher.is-bottom-left {\n bottom: 16px;\n left: 16px;\n }\n\n .br-launcher.is-top-right {\n top: 16px;\n right: 16px;\n }\n\n .br-launcher.is-top-left {\n top: 16px;\n left: 16px;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,16 @@
1
+ # Local Public Backend
2
+
3
+ Use `storage.mode = "local-public"`.
4
+
5
+ The SDK posts multipart form data to `storage.local.uploadEndpoint` with fields:
6
+ - `file`
7
+ - `id`
8
+ - `type`
9
+
10
+ Expected JSON response:
11
+
12
+ ```json
13
+ { "url": "https://app.example.com/uploads/file.png", "key": "uploads/file.png" }
14
+ ```
15
+
16
+ See `examples/backend-local` for a runnable server.
@@ -0,0 +1,31 @@
1
+ # S3 Presigned Backend
2
+
3
+ Use `storage.mode = "s3-presigned"` and provide a `presignEndpoint`.
4
+
5
+ Expected request body:
6
+
7
+ ```json
8
+ {
9
+ "files": [{ "id": "...", "name": "...", "type": "screenshot", "mimeType": "image/png", "size": 1234 }]
10
+ }
11
+ ```
12
+
13
+ Expected response:
14
+
15
+ ```json
16
+ {
17
+ "uploads": [
18
+ {
19
+ "id": "...",
20
+ "method": "PUT",
21
+ "uploadUrl": "https://bucket.s3.amazonaws.com/key",
22
+ "headers": { "content-type": "image/png" },
23
+ "key": "reports/...",
24
+ "publicUrl": "https://cdn.example.com/reports/...",
25
+ "type": "screenshot"
26
+ }
27
+ ]
28
+ }
29
+ ```
30
+
31
+ See `examples/backend-s3-presign` for a runnable reference server.
@@ -0,0 +1,8 @@
1
+ # Browser Compatibility
2
+
3
+ - React 16.8+
4
+ - Chromium: supported for screenshot and recording.
5
+ - Firefox: screenshot and recording supported (MediaRecorder limitations may vary).
6
+ - Safari: screenshot supported; recording support depends on version and permissions.
7
+
8
+ Screen recording requires `navigator.mediaDevices.getDisplayMedia`.
@@ -0,0 +1,10 @@
1
+ # Create React App
2
+
3
+ Import CSS once and mount `BugReporter` in `App.tsx`.
4
+
5
+ ```tsx
6
+ import { BugReporter } from "@fogg/bug-reporter";
7
+ import "@fogg/bug-reporter/styles.css";
8
+ ```
9
+
10
+ Use `storage.mode: "proxy"` or `"local-public"` for easiest CRA integration.
@@ -0,0 +1,16 @@
1
+ # Next.js (App Router)
2
+
3
+ Use in a client component:
4
+
5
+ ```tsx
6
+ "use client";
7
+
8
+ import { BugReporter } from "@fogg/bug-reporter";
9
+ import "@fogg/bug-reporter/styles.css";
10
+
11
+ export function BugReporterMount() {
12
+ return <BugReporter config={{ apiEndpoint: "/api/bug-reports", storage: { mode: "proxy", proxy: { uploadEndpoint: "/api/bug-assets" } } }} />;
13
+ }
14
+ ```
15
+
16
+ Render this component in `app/layout.tsx` or a global client wrapper.
@@ -0,0 +1,6 @@
1
+ # Remix
2
+
3
+ Mount `BugReporter` in `root.tsx` (client-rendered area).
4
+
5
+ - Ensure upload/report endpoints are exposed as Remix actions/routes.
6
+ - Keep `BugReporter` behind user interaction only (default behavior).
@@ -0,0 +1,21 @@
1
+ # Vite
2
+
3
+ ```tsx
4
+ import { BugReporter } from "@fogg/bug-reporter";
5
+ import "@fogg/bug-reporter/styles.css";
6
+
7
+ export function App() {
8
+ return (
9
+ <>
10
+ <BugReporter
11
+ config={{
12
+ apiEndpoint: "/api/bug-reports",
13
+ storage: { mode: "local-public", local: { uploadEndpoint: "/api/uploads" } }
14
+ }}
15
+ />
16
+ </>
17
+ );
18
+ }
19
+ ```
20
+
21
+ No framework-specific setup is required.
@@ -0,0 +1,6 @@
1
+ # Known Limitations
2
+
3
+ - Screenshot capture depends on `html2canvas` and may not perfectly render cross-origin iframes.
4
+ - Screen recording format defaults to `video/webm`; unsupported codecs fall back best-effort.
5
+ - Annotation tools are basic in v1 (rectangle, arrow, text).
6
+ - Mobile browsers may restrict screen capture APIs.
@@ -0,0 +1,26 @@
1
+ # Quickstart
2
+
3
+ 1. Install: `npm install @fogg/bug-reporter`
4
+ 2. Add component near app root.
5
+ 3. Configure API and storage mode.
6
+
7
+ ```tsx
8
+ import { BugReporter } from "@fogg/bug-reporter";
9
+ import "@fogg/bug-reporter/styles.css";
10
+
11
+ <BugReporter
12
+ config={{
13
+ apiEndpoint: "https://api.example.com/bug-reports",
14
+ projectId: "web-app",
15
+ appVersion: "1.2.0",
16
+ environment: "production",
17
+ storage: {
18
+ mode: "s3-presigned",
19
+ s3: {
20
+ presignEndpoint: "https://api.example.com/bug-assets/presign",
21
+ publicBaseUrl: "https://cdn.example.com"
22
+ }
23
+ }
24
+ }}
25
+ />;
26
+ ```
@@ -0,0 +1,9 @@
1
+ # Security Guidelines
2
+
3
+ - Always require explicit user action before capture (SDK default).
4
+ - Keep feature flags off for capabilities you do not need.
5
+ - Use short presigned URL expirations.
6
+ - Restrict upload/report endpoints with authentication and rate limits.
7
+ - Use `privacy.maskSelectors` to blur sensitive DOM regions.
8
+ - Mark sensitive nodes with `data-bug-reporter-mask="true"`.
9
+ - Avoid sending secrets in diagnostics or hooks.