@loupekit/sdk 0.10.1-next.42 → 0.10.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.
@@ -2455,7 +2455,6 @@ var Loupe = (() => {
2455
2455
  };
2456
2456
 
2457
2457
  // src/app.ts
2458
- var SDK_VERSION = true ? "0.10.1" : "dev";
2459
2458
  var DOCK_MODES = ["left", "right", "bottom", "float"];
2460
2459
  var RECORD_MAX_MS = 2e4;
2461
2460
  var MAX_FILES = 10;
@@ -2469,23 +2468,11 @@ var Loupe = (() => {
2469
2468
  }
2470
2469
  function isTouchDevice() {
2471
2470
  try {
2472
- if (window.matchMedia("(pointer: coarse)").matches) return true;
2473
- if (window.matchMedia("(hover: none)").matches) return true;
2474
- } catch {
2475
- }
2476
- if (typeof navigator !== "undefined" && (navigator.maxTouchPoints ?? 0) > 0) return true;
2477
- return typeof window !== "undefined" && "ontouchstart" in window;
2478
- }
2479
- function coarsePointer() {
2480
- try {
2481
- return window.matchMedia("(pointer: coarse)").matches;
2471
+ return typeof window.matchMedia === "function" && window.matchMedia("(pointer: coarse)").matches;
2482
2472
  } catch {
2483
2473
  return false;
2484
2474
  }
2485
2475
  }
2486
- function canShareScreen() {
2487
- return typeof navigator.mediaDevices?.getDisplayMedia === "function";
2488
- }
2489
2476
  function dataUrlToFile(dataUrl, name) {
2490
2477
  const m = /^data:([^;,]+)(;base64)?,([\s\S]*)$/.exec(dataUrl);
2491
2478
  if (!m) return null;
@@ -2867,16 +2854,8 @@ var Loupe = (() => {
2867
2854
  const recordBtn = this.toolBtn(RECORD_ICON, "Record", "record");
2868
2855
  recordBtn.title = isTouchDevice() ? "Record your screen, then describe the issue" : "Drag a box, record a screen video of it, and comment";
2869
2856
  recordBtn.onclick = () => this.setMode(this.mode === "record" ? "off" : "record");
2870
- if (canShareScreen()) {
2871
- tools.append(inspectBtn, freeBtn, regionBtn, recordBtn);
2872
- } else if (isTouchDevice()) {
2873
- const cameraBtn = this.toolBtn(CAMERA_ICON, "Camera", "camera");
2874
- cameraBtn.title = "Record a video with the camera and comment";
2875
- cameraBtn.onclick = () => this.pickCameraVideo();
2876
- tools.append(inspectBtn, freeBtn, regionBtn, cameraBtn);
2877
- } else {
2878
- tools.append(inspectBtn, freeBtn, regionBtn);
2879
- }
2857
+ const canRecord = typeof navigator.mediaDevices?.getDisplayMedia === "function";
2858
+ tools.append(inspectBtn, freeBtn, regionBtn, ...canRecord ? [recordBtn] : []);
2880
2859
  const listHead = el("div", "listhead");
2881
2860
  listHead.append(document.createTextNode("Comments"));
2882
2861
  this.countEl = el("span", "count", "0");
@@ -3051,37 +3030,6 @@ var Loupe = (() => {
3051
3030
  file ? [file] : []
3052
3031
  );
3053
3032
  }
3054
- /**
3055
- * Touch devices with no screen recorder (every iOS browser) can still report a video:
3056
- * record one with the camera. Opens the native recorder and hands the clip to the
3057
- * composer exactly like the screen capture does.
3058
- */
3059
- pickCameraVideo() {
3060
- this.setMode("off");
3061
- const input = document.createElement("input");
3062
- input.type = "file";
3063
- input.accept = "video/*";
3064
- input.setAttribute("capture", "environment");
3065
- input.style.display = "none";
3066
- input.onchange = () => {
3067
- const file = input.files?.[0];
3068
- input.remove();
3069
- if (!file) return;
3070
- const docX = window.scrollX + window.innerWidth / 2;
3071
- const docY = window.scrollY + window.innerHeight / 2;
3072
- const docW = Math.max(1, document.documentElement.scrollWidth);
3073
- const docH = Math.max(1, document.documentElement.scrollHeight);
3074
- const offset = { x: clamp(docX / docW), y: clamp(docY / docH) };
3075
- this.openComposer(
3076
- { kind: "free", offset, point: { x: docX, y: docY }, label: "Camera video \xB7 attached" },
3077
- 8,
3078
- window.innerHeight / 2,
3079
- [file]
3080
- );
3081
- };
3082
- this.shadow.appendChild(input);
3083
- input.click();
3084
- }
3085
3033
  /** Capture the selected viewport rect, then open the composer for a region comment. */
3086
3034
  async finishRegion(vp) {
3087
3035
  this.selbox.style.display = "none";
@@ -3335,16 +3283,8 @@ var Loupe = (() => {
3335
3283
  screenshot,
3336
3284
  recording,
3337
3285
  attachments: await this.uploadAttachments(files),
3338
- // The screen this was captured on, plus enough to tell a stale bundle from a real
3339
- // bug when someone reports "it still doesn't work" (see Comment.viewport).
3340
- viewport: {
3341
- w: window.innerWidth,
3342
- h: window.innerHeight,
3343
- v: SDK_VERSION,
3344
- touch: isTouchDevice(),
3345
- coarse: coarsePointer(),
3346
- gdm: canShareScreen()
3347
- },
3286
+ // Record the screen the feedback was captured on (desktop / tablet / mobile).
3287
+ viewport: { w: window.innerWidth, h: window.innerHeight },
3348
3288
  createdAt: (/* @__PURE__ */ new Date()).toISOString()
3349
3289
  };
3350
3290
  await this.store.save(comment);
@@ -3729,7 +3669,6 @@ var Loupe = (() => {
3729
3669
  var REGION_ICON = `<svg width="15" height="15" viewBox="0 0 15 15" fill="none" aria-hidden="true"><rect x="1.5" y="2.5" width="12" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4" stroke-dasharray="2.4 1.8"/></svg>`;
3730
3670
  var NOTE_ICON = `<svg width="15" height="15" viewBox="0 0 15 15" fill="none" aria-hidden="true"><path d="M2 2.5h11v7.5H6l-3 2.5v-2.5H2z" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/></svg>`;
3731
3671
  var RECORD_ICON = `<svg width="15" height="15" viewBox="0 0 15 15" fill="none" aria-hidden="true"><rect x="1.5" y="2.5" width="12" height="10" rx="1.5" stroke="currentColor" stroke-width="1.4" stroke-dasharray="2.4 1.8"/><circle cx="7.5" cy="7.5" r="2.4" fill="currentColor"/></svg>`;
3732
- var CAMERA_ICON = `<svg width="15" height="15" viewBox="0 0 15 15" fill="none" aria-hidden="true"><rect x="1.2" y="3.8" width="9.2" height="7.4" rx="1.6" stroke="currentColor" stroke-width="1.3"/><path d="M10.4 7.3l3.4-2v4.4l-3.4-2z" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/></svg>`;
3733
3672
  var I_GITHUB = `<svg width="18" height="18" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 .2a8 8 0 0 0-2.5 15.6c.4.07.55-.17.55-.38v-1.3c-2.2.48-2.67-1.07-2.67-1.07-.36-.92-.88-1.16-.88-1.16-.72-.5.05-.48.05-.48.8.056 1.22.82 1.22.82.71 1.22 1.87.87 2.33.66.07-.52.28-.87.5-1.07-1.76-.2-3.6-.88-3.6-3.9 0-.86.3-1.57.82-2.12-.08-.2-.36-1 .08-2.1 0 0 .67-.21 2.2.8a7.6 7.6 0 0 1 4 0c1.53-1.02 2.2-.8 2.2-.8.44 1.1.16 1.9.08 2.1.5.55.82 1.26.82 2.12 0 3.03-1.85 3.7-3.61 3.9.28.24.54.72.54 1.46v2.16c0 .21.14.46.55.38A8 8 0 0 0 8 .2z"/></svg>`;
3734
3673
  var I_SLACK = `<svg width="18" height="18" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M3.4 10.1a1.6 1.6 0 1 1-1.6-1.6h1.6v1.6zm.8 0a1.6 1.6 0 0 1 3.2 0v4a1.6 1.6 0 1 1-3.2 0v-4zM5.8 3.4a1.6 1.6 0 1 1 1.6-1.6v1.6H5.8zm0 .8a1.6 1.6 0 0 1 0 3.2h-4a1.6 1.6 0 1 1 0-3.2h4zm6.7 1.6a1.6 1.6 0 1 1 1.6 1.6h-1.6V5.8zm-.8 0a1.6 1.6 0 0 1-3.2 0v-4a1.6 1.6 0 1 1 3.2 0v4zm-1.6 6.7a1.6 1.6 0 1 1-1.6 1.6v-1.6h1.6zm0-.8a1.6 1.6 0 0 1 0-3.2h4a1.6 1.6 0 1 1 0 3.2h-4z"/></svg>`;
3735
3674
  var I_TELEGRAM = `<svg width="18" height="18" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0zm3.7 5.4-1.24 5.85c-.09.41-.34.51-.69.32l-1.9-1.4-.92.88c-.1.1-.19.19-.38.19l.14-1.93 3.5-3.17c.15-.13-.03-.2-.24-.07l-4.32 2.72-1.86-.58c-.4-.13-.41-.4.09-.6l7.26-2.8c.34-.12.63.08.52.6z"/></svg>`;