@makefully/notefully 0.1.35 → 0.1.37

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
@@ -25,7 +25,10 @@ Notefully.init({
25
25
  consoleLogLimit: 10, // most recent console lines attached to each report (0–80)
26
26
  // kinds default to bug / idea / other. Pass kinds to replace the full list:
27
27
  // kinds: ['bug', 'idea', { id: 'polish', label: 'Polish' }, 'other'],
28
- hideLauncher: true // optional; drive open/submit from your own UI
28
+ hideLauncher: true, // optional; drive open/submit from your own UI
29
+ // Optional canvas-game hooks for the automatic (DOM) capture path:
30
+ // onBeforeCapture: async () => { engine.render(); },
31
+ // capture: async () => engine.screenshotCanvas(), // data URL | Blob | HTMLCanvasElement
29
32
  });
30
33
 
31
34
  // Update settings later without remounting (theme, hideLauncher, video, …):
@@ -59,6 +62,10 @@ Or via the IIFE build:
59
62
  Bundlers should prefer the package export `import '@makefully/notefully/notefully.css'` (see Embed above). The `dist/` path is for static / IIFE hosts.
60
63
  With `hideLauncher: true`, call `Notefully.open()` / `Notefully.submit()` from your own UI.
61
64
 
65
+ ### Screenshots
66
+
67
+ On open, Notefully captures the page automatically: optional `onBeforeCapture` / `capture` hooks first, then a canvas-aware DOM rasterize sized to the viewport (so absolutely positioned apps still capture). Empty results are treated as no screenshot—markup tools stay hidden and the camera **Recapture** control sits beside the mic. With a shot, **Discard** and **Recapture** sit on the far right of the edit tools. Recapture hides the dialog and tries the browser share picker (`getDisplayMedia`); if that fails or is cancelled, it falls back to the automatic path.
68
+
62
69
  ### Hosted relay
63
70
 
64
71
  Makefully hosts a relay at **`https://make.makefullystudios.com/notefully`**. Pass that as `endpoint` (no trailing slash required). You still need a project key from your Showfully Notefully settings.
@@ -1 +1 @@
1
- #notefully{all:initial;--nf-launcher-left: 16px;--nf-launcher-bottom: 16px;--nf-radius: 10px;--nf-z: 2147483000;--nf-accent: #864093;--nf-accent-text: #ffffff;--nf-accent-hot: #e83590;--nf-btn: #864093;--nf-btn-border: #382c74;--nf-btn-text: #ffffff;--nf-panel: #f7f4fb;--nf-text: #2a2140;--nf-muted: rgba(42, 33, 64, .72);--nf-input: #efe8f8;--nf-border: rgba(56, 44, 116, .18);--nf-backdrop: rgba(20, 12, 28, .55);--nf-danger: #e83590;--nf-success: #1a7a3c;--nf-fail: #c2185b;--nf-mark: #fdd341;--nf-mark-text: #2a2140;--nf-canvas-bg: #111;font-family:ui-sans-serif,system-ui,sans-serif;color:var(--nf-text)}#notefully[data-theme=maker]{--nf-accent: #864093;--nf-accent-text: #ffffff;--nf-accent-hot: #e83590;--nf-btn: #864093;--nf-btn-border: #382c74;--nf-btn-text: #ffffff;--nf-panel: #f7f4fb;--nf-text: #2a2140;--nf-muted: rgba(42, 33, 64, .72);--nf-input: #efe8f8;--nf-border: rgba(56, 44, 116, .18);--nf-backdrop: rgba(20, 12, 28, .55);--nf-danger: #e83590;--nf-success: #1a7a3c;--nf-fail: #c2185b;--nf-mark: #fdd341;--nf-mark-text: #2a2140}#notefully[data-theme=all-business]{--nf-accent: #5c6570;--nf-accent-text: #ffffff;--nf-accent-hot: #8a4a4a;--nf-btn: #5c6570;--nf-btn-border: #3a4048;--nf-btn-text: #ffffff;--nf-panel: #ffffff;--nf-text: #1f1f23;--nf-muted: rgba(31, 31, 35, .68);--nf-input: #f0f0f2;--nf-border: rgba(0, 0, 0, .14);--nf-backdrop: rgba(20, 20, 24, .4);--nf-danger: #8a4a4a;--nf-success: #1f7a3a;--nf-fail: #b42318;--nf-mark: #3d6ea8;--nf-mark-text: #ffffff}#notefully[data-theme=brighter-day]{--nf-accent: #5aa8dc;--nf-accent-text: #ffffff;--nf-accent-hot: #f08ab8;--nf-btn: #5aa8dc;--nf-btn-border: #3d7eae;--nf-btn-text: #ffffff;--nf-panel: #fffdf6;--nf-text: #2a2440;--nf-muted: rgba(42, 36, 64, .68);--nf-input: #ffeef5;--nf-border: rgba(90, 168, 220, .28);--nf-backdrop: rgba(60, 40, 70, .35);--nf-danger: #f08ab8;--nf-success: #1f7a3a;--nf-fail: #c4476a;--nf-mark: #5aa8dc;--nf-mark-text: #ffffff}#notefully[data-theme=quiet-night]{--nf-accent: #c4aa5a;--nf-accent-text: #121416;--nf-accent-hot: #6e3a3a;--nf-btn: #3a4048;--nf-btn-border: #0e1012;--nf-btn-text: #d8dbe0;--nf-panel: #1c1f24;--nf-text: #d8dbe0;--nf-muted: rgba(216, 219, 224, .68);--nf-input: #262a30;--nf-border: rgba(255, 255, 255, .12);--nf-backdrop: rgba(0, 0, 0, .65);--nf-danger: #c88888;--nf-success: #7dcea0;--nf-fail: #e89898;--nf-mark: #c4aa5a;--nf-mark-text: #121416}#notefully *{box-sizing:border-box}#notefully .nf-launcher{position:fixed;left:var(--nf-launcher-left);bottom:var(--nf-launcher-bottom);z-index:var(--nf-z);width:48px;height:48px;padding:0;display:grid;place-items:center;background:var(--nf-btn);color:var(--nf-btn-text);border:1px solid var(--nf-btn-border);border-radius:999px;cursor:pointer;box-shadow:0 8px 24px #00000040}#notefully .nf-launcher-icon{width:22px;height:22px;display:block}#notefully .nf-launcher[hidden],#notefully .nf-dialog[hidden],#notefully .nf-stop-video[hidden],#notefully .nf-stage[hidden],#notefully .nf-reset-crop[hidden],#notefully .nf-restore[hidden],#notefully .nf-video[hidden],#notefully .nf-author[hidden]{display:none!important}#notefully .nf-dialog{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--nf-z);background:var(--nf-backdrop);display:flex;align-items:center;justify-content:center;padding:24px}#notefully .nf-panel{width:min(920px,100%);max-height:calc(100vh - 48px);overflow:auto;background:var(--nf-panel);color:var(--nf-text);border:1px solid var(--nf-border);border-radius:var(--nf-radius);padding:16px;display:flex;flex-direction:column;gap:12px}#notefully .nf-panel-body{display:flex;flex-direction:column;gap:12px;min-height:0}#notefully .nf-panel-body[hidden]{display:none!important}#notefully .nf-success-msg{margin:0;text-align:center;font:700 1.35rem/1.2 ui-sans-serif,system-ui,sans-serif;letter-spacing:.01em;color:var(--nf-success)}#notefully .nf-success-msg[hidden]{display:none!important}#notefully .nf-dialog.nf-success{pointer-events:none}#notefully .nf-dialog.nf-success .nf-panel{width:auto;min-width:11rem;max-width:min(280px,90vw);max-height:none;overflow:hidden;padding:1.75rem 2.35rem;align-items:center;justify-content:center;gap:0}@media(prefers-reduced-motion:reduce){#notefully .nf-dialog.nf-success .nf-panel{transform:none!important;transition:none!important}}#notefully .nf-stage{display:flex;flex-direction:column;gap:8px}#notefully .nf-palette{display:flex;flex-wrap:wrap;gap:8px;align-items:center}#notefully .nf-tool,#notefully .nf-reset-crop,#notefully .nf-icon-btn{background:var(--nf-input);color:var(--nf-text);border:1px solid var(--nf-border);border-radius:8px;padding:6px 10px;cursor:pointer;font:13px ui-sans-serif,system-ui,sans-serif}#notefully .nf-icon-btn{width:36px;height:36px;padding:0;display:grid;place-items:center;flex:0 0 36px}#notefully .nf-icon{width:18px;height:18px;display:block}#notefully .nf-tool[data-active=true],#notefully .nf-icon-btn[data-active=true]{border-color:var(--nf-accent);color:var(--nf-accent);box-shadow:inset 0 0 0 1px var(--nf-accent)}#notefully .nf-canvas{position:relative;width:min(100%,calc(48vh * var(--nf-shot-aspect, 16 / 9)));max-height:48vh;aspect-ratio:var(--nf-shot-aspect, auto);margin-inline:auto;background:var(--nf-canvas-bg);border-radius:8px;overflow:hidden;-webkit-user-select:none;user-select:none;touch-action:none}#notefully .nf-canvas[data-draw=true],#notefully .nf-canvas[data-draw=true] .nf-shot{cursor:crosshair}#notefully .nf-sticker{cursor:grab}#notefully .nf-sticker[data-preview=true]{cursor:crosshair}#notefully .nf-sticker.nf-arrow .nf-arrow-hit{cursor:grab}#notefully[data-grabbing=true] .nf-canvas,#notefully[data-grabbing=true] .nf-shot,#notefully[data-grabbing=true] .nf-sticker,#notefully[data-grabbing=true] .nf-sticker *{cursor:grabbing}#notefully .nf-shot{position:absolute;overflow:hidden;--nf-anno-stroke: 3px;--nf-anno-badge: 20px;--nf-anno-badge-font: 11px;--nf-anno-handle: 10px}#notefully .nf-shot img{position:absolute;display:block;max-height:none;pointer-events:none;-webkit-user-drag:none;user-drag:none}#notefully .nf-canvas video.nf-recording-preview{display:block;width:160px;height:auto;max-height:none;object-fit:contain;pointer-events:auto}#notefully .nf-sticker,#notefully .nf-crop{position:absolute;pointer-events:auto;color:var(--nf-mark)}#notefully .nf-sticker[data-selected=true]{z-index:4}#notefully .nf-sticker[data-preview=true],#notefully .nf-sticker.nf-arrow{pointer-events:none}#notefully .nf-sticker.nf-arrow .nf-handle{pointer-events:auto}#notefully .nf-rect,#notefully .nf-circle{border:var(--nf-anno-stroke) solid var(--nf-mark);background:transparent;box-sizing:border-box}#notefully .nf-circle{border-radius:50%}#notefully .nf-arrow-svg{display:block;overflow:visible;pointer-events:none}#notefully .nf-arrow-hit{fill:none;stroke:transparent;stroke-width:16;pointer-events:stroke}#notefully .nf-arrow-shaft{fill:none;stroke:currentColor;stroke-width:var(--nf-anno-stroke);stroke-linecap:round;pointer-events:none}#notefully .nf-arrow-head{fill:currentColor;stroke:none;pointer-events:none}#notefully .nf-badge{position:absolute;left:50%;top:0;transform:translate(-50%,-50%);box-sizing:border-box;min-width:var(--nf-anno-badge);height:var(--nf-anno-badge);padding:0 calc(var(--nf-anno-badge-font) * .35);border-radius:50%;background:var(--nf-mark);color:var(--nf-mark-text);font:700 var(--nf-anno-badge-font)/var(--nf-anno-badge) ui-sans-serif,system-ui,sans-serif;text-align:center;pointer-events:none;z-index:4}#notefully .nf-sticker.nf-arrow .nf-badge{top:50%}#notefully .nf-handle{position:absolute;width:var(--nf-anno-handle);height:var(--nf-anno-handle);background:#fff;border:2px solid var(--nf-mark);border-radius:2px;z-index:5;box-sizing:border-box}#notefully .nf-handle[data-dir=nw]{left:-6px;top:-6px;cursor:nwse-resize}#notefully .nf-handle[data-dir=ne]{right:-6px;top:-6px;cursor:nesw-resize}#notefully .nf-handle[data-dir=sw]{left:-6px;bottom:-6px;cursor:nesw-resize}#notefully .nf-handle[data-dir=se]{right:-6px;bottom:-6px;cursor:nwse-resize}#notefully .nf-handle[data-dir=start],#notefully .nf-handle[data-dir=end]{margin:0;cursor:grab}#notefully .nf-crop{border:2px dashed var(--nf-accent);background:color-mix(in srgb,var(--nf-accent) 14%,transparent);box-shadow:0 0 0 9999px #00000073;pointer-events:none}#notefully .nf-text{width:100%;min-height:96px;resize:vertical;background:var(--nf-input);color:var(--nf-text);border:1px solid var(--nf-border);border-radius:8px;padding:10px;font:14px/1.4 ui-sans-serif,system-ui,sans-serif}#notefully .nf-author{width:100%;box-sizing:border-box;background:var(--nf-input);color:var(--nf-text);border:1px solid var(--nf-border);border-radius:8px;padding:10px;font:14px/1.4 ui-sans-serif,system-ui,sans-serif}#notefully .nf-author::placeholder{color:var(--nf-muted)}#notefully .nf-kind{display:flex;gap:8px}#notefully .nf-kind button{background:var(--nf-input);color:var(--nf-muted);border:1px solid var(--nf-border);border-radius:999px;padding:6px 12px;cursor:pointer}#notefully .nf-kind button[data-active=true]{color:var(--nf-accent-text);background:var(--nf-accent);border-color:var(--nf-accent)}#notefully .nf-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}#notefully .nf-actions button{border:1px solid var(--nf-border);border-radius:8px;padding:8px 12px;cursor:pointer;font:600 13px ui-sans-serif,system-ui,sans-serif;background:var(--nf-input);color:var(--nf-text)}#notefully .nf-actions .nf-icon-btn{padding:0}#notefully .nf-submit{margin-left:auto;background:var(--nf-btn)!important;color:var(--nf-btn-text)!important;border-color:var(--nf-btn-border)!important}#notefully .nf-submit:disabled{opacity:.55;cursor:wait}#notefully .nf-status{color:var(--nf-muted);font:13px ui-sans-serif,system-ui,sans-serif;min-height:1.2em}#notefully .nf-stop-video{position:fixed;top:16px;left:50%;transform:translate(-50%);z-index:calc(var(--nf-z) + 1);background:var(--nf-danger);color:#fff;border:0;border-radius:999px;padding:10px 18px;font:700 14px ui-sans-serif,system-ui,sans-serif;cursor:pointer}#notefully[data-nf-hidden-launcher] .nf-launcher{display:none!important}.nf-capture-chrome{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483645;display:grid;place-items:center;pointer-events:none;background:#140c1c47;animation:nf-capture-fade .16s ease-out both}.nf-capture-chrome-pill{display:inline-flex;align-items:center;gap:.55em;padding:.65em 1.1em;border-radius:999px;background:#f7f4fbf0;color:#2a2140;font:650 14px ui-sans-serif,system-ui,sans-serif;letter-spacing:.01em;box-shadow:0 10px 28px #140c1c38}.nf-capture-chrome-pill:before{content:"";width:.7em;height:.7em;border-radius:50%;border:2px solid rgba(42,33,64,.22);border-top-color:#864093;animation:nf-capture-spin .7s linear infinite}@keyframes nf-capture-fade{0%{opacity:0}to{opacity:1}}@keyframes nf-capture-spin{to{transform:rotate(360deg)}}
1
+ #notefully{all:initial;--nf-launcher-left: 16px;--nf-launcher-bottom: 16px;--nf-radius: 10px;--nf-z: 2147483000;--nf-accent: #864093;--nf-accent-text: #ffffff;--nf-accent-hot: #e83590;--nf-btn: #864093;--nf-btn-border: #382c74;--nf-btn-text: #ffffff;--nf-panel: #f7f4fb;--nf-text: #2a2140;--nf-muted: rgba(42, 33, 64, .72);--nf-input: #efe8f8;--nf-border: rgba(56, 44, 116, .18);--nf-backdrop: rgba(20, 12, 28, .55);--nf-danger: #e83590;--nf-success: #1a7a3c;--nf-fail: #c2185b;--nf-mark: #fdd341;--nf-mark-text: #2a2140;--nf-canvas-bg: #111;font-family:ui-sans-serif,system-ui,sans-serif;color:var(--nf-text)}#notefully[data-theme=maker]{--nf-accent: #864093;--nf-accent-text: #ffffff;--nf-accent-hot: #e83590;--nf-btn: #864093;--nf-btn-border: #382c74;--nf-btn-text: #ffffff;--nf-panel: #f7f4fb;--nf-text: #2a2140;--nf-muted: rgba(42, 33, 64, .72);--nf-input: #efe8f8;--nf-border: rgba(56, 44, 116, .18);--nf-backdrop: rgba(20, 12, 28, .55);--nf-danger: #e83590;--nf-success: #1a7a3c;--nf-fail: #c2185b;--nf-mark: #fdd341;--nf-mark-text: #2a2140}#notefully[data-theme=all-business]{--nf-accent: #5c6570;--nf-accent-text: #ffffff;--nf-accent-hot: #8a4a4a;--nf-btn: #5c6570;--nf-btn-border: #3a4048;--nf-btn-text: #ffffff;--nf-panel: #ffffff;--nf-text: #1f1f23;--nf-muted: rgba(31, 31, 35, .68);--nf-input: #f0f0f2;--nf-border: rgba(0, 0, 0, .14);--nf-backdrop: rgba(20, 20, 24, .4);--nf-danger: #8a4a4a;--nf-success: #1f7a3a;--nf-fail: #b42318;--nf-mark: #3d6ea8;--nf-mark-text: #ffffff}#notefully[data-theme=brighter-day]{--nf-accent: #5aa8dc;--nf-accent-text: #ffffff;--nf-accent-hot: #f08ab8;--nf-btn: #5aa8dc;--nf-btn-border: #3d7eae;--nf-btn-text: #ffffff;--nf-panel: #fffdf6;--nf-text: #2a2440;--nf-muted: rgba(42, 36, 64, .68);--nf-input: #ffeef5;--nf-border: rgba(90, 168, 220, .28);--nf-backdrop: rgba(60, 40, 70, .35);--nf-danger: #f08ab8;--nf-success: #1f7a3a;--nf-fail: #c4476a;--nf-mark: #5aa8dc;--nf-mark-text: #ffffff}#notefully[data-theme=quiet-night]{--nf-accent: #c4aa5a;--nf-accent-text: #121416;--nf-accent-hot: #6e3a3a;--nf-btn: #3a4048;--nf-btn-border: #0e1012;--nf-btn-text: #d8dbe0;--nf-panel: #1c1f24;--nf-text: #d8dbe0;--nf-muted: rgba(216, 219, 224, .68);--nf-input: #262a30;--nf-border: rgba(255, 255, 255, .12);--nf-backdrop: rgba(0, 0, 0, .65);--nf-danger: #c88888;--nf-success: #7dcea0;--nf-fail: #e89898;--nf-mark: #c4aa5a;--nf-mark-text: #121416}#notefully *{box-sizing:border-box}#notefully .nf-launcher{position:fixed;left:var(--nf-launcher-left);bottom:var(--nf-launcher-bottom);z-index:var(--nf-z);width:48px;height:48px;padding:0;display:grid;place-items:center;background:var(--nf-btn);color:var(--nf-btn-text);border:1px solid var(--nf-btn-border);border-radius:999px;cursor:pointer;box-shadow:0 8px 24px #00000040}#notefully .nf-launcher-icon{width:22px;height:22px;display:block}#notefully .nf-launcher[hidden],#notefully .nf-dialog[hidden],#notefully .nf-stop-video[hidden],#notefully .nf-stage[hidden],#notefully .nf-palette[hidden],#notefully .nf-reset-crop[hidden],#notefully .nf-restore[hidden],#notefully .nf-discard-shot[hidden],#notefully .nf-recapture[hidden],#notefully .nf-video[hidden],#notefully .nf-author[hidden]{display:none!important}#notefully .nf-dialog{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--nf-z);background:var(--nf-backdrop);display:flex;align-items:center;justify-content:center;padding:24px}#notefully .nf-panel{width:min(920px,100%);max-height:calc(100vh - 48px);overflow:auto;background:var(--nf-panel);color:var(--nf-text);border:1px solid var(--nf-border);border-radius:var(--nf-radius);padding:16px;display:flex;flex-direction:column;gap:12px}#notefully .nf-panel-body{display:flex;flex-direction:column;gap:12px;min-height:0}#notefully .nf-panel-body[hidden]{display:none!important}#notefully .nf-success-msg{margin:0;text-align:center;font:700 1.35rem/1.2 ui-sans-serif,system-ui,sans-serif;letter-spacing:.01em;color:var(--nf-success)}#notefully .nf-success-msg[hidden]{display:none!important}#notefully .nf-dialog.nf-success{pointer-events:none}#notefully .nf-dialog.nf-success .nf-panel{width:auto;min-width:11rem;max-width:min(280px,90vw);max-height:none;overflow:hidden;padding:1.75rem 2.35rem;align-items:center;justify-content:center;gap:0}@media(prefers-reduced-motion:reduce){#notefully .nf-dialog.nf-success .nf-panel{transform:none!important;transition:none!important}}#notefully .nf-stage{display:flex;flex-direction:column;gap:8px}#notefully .nf-palette{display:flex;flex-wrap:wrap;gap:8px;align-items:center}#notefully .nf-palette .nf-discard-shot{margin-left:auto}#notefully .nf-tool,#notefully .nf-reset-crop,#notefully .nf-icon-btn{background:var(--nf-input);color:var(--nf-text);border:1px solid var(--nf-border);border-radius:8px;padding:6px 10px;cursor:pointer;font:13px ui-sans-serif,system-ui,sans-serif}#notefully .nf-icon-btn{width:36px;height:36px;padding:0;display:grid;place-items:center;flex:0 0 36px}#notefully .nf-icon{width:18px;height:18px;display:block}#notefully .nf-tool[data-active=true],#notefully .nf-icon-btn[data-active=true]{border-color:var(--nf-accent);color:var(--nf-accent);box-shadow:inset 0 0 0 1px var(--nf-accent)}#notefully .nf-canvas{position:relative;width:min(100%,calc(48vh * var(--nf-shot-aspect, 16 / 9)));max-height:48vh;aspect-ratio:var(--nf-shot-aspect, auto);margin-inline:auto;background:var(--nf-canvas-bg);border-radius:8px;overflow:hidden;-webkit-user-select:none;user-select:none;touch-action:none}#notefully .nf-canvas[data-draw=true],#notefully .nf-canvas[data-draw=true] .nf-shot{cursor:crosshair}#notefully .nf-sticker{cursor:grab}#notefully .nf-sticker[data-preview=true]{cursor:crosshair}#notefully .nf-sticker.nf-arrow .nf-arrow-hit{cursor:grab}#notefully[data-grabbing=true] .nf-canvas,#notefully[data-grabbing=true] .nf-shot,#notefully[data-grabbing=true] .nf-sticker,#notefully[data-grabbing=true] .nf-sticker *{cursor:grabbing}#notefully .nf-shot{position:absolute;overflow:hidden;--nf-anno-stroke: 3px;--nf-anno-badge: 20px;--nf-anno-badge-font: 11px;--nf-anno-handle: 10px}#notefully .nf-shot img{position:absolute;display:block;max-height:none;pointer-events:none;-webkit-user-drag:none;user-drag:none}#notefully .nf-canvas video.nf-recording-preview{display:block;width:160px;height:auto;max-height:none;object-fit:contain;pointer-events:auto}#notefully .nf-sticker,#notefully .nf-crop{position:absolute;pointer-events:auto;color:var(--nf-mark)}#notefully .nf-sticker[data-selected=true]{z-index:4}#notefully .nf-sticker[data-preview=true],#notefully .nf-sticker.nf-arrow{pointer-events:none}#notefully .nf-sticker.nf-arrow .nf-handle{pointer-events:auto}#notefully .nf-rect,#notefully .nf-circle{border:var(--nf-anno-stroke) solid var(--nf-mark);background:transparent;box-sizing:border-box}#notefully .nf-circle{border-radius:50%}#notefully .nf-arrow-svg{display:block;overflow:visible;pointer-events:none}#notefully .nf-arrow-hit{fill:none;stroke:transparent;stroke-width:16;pointer-events:stroke}#notefully .nf-arrow-shaft{fill:none;stroke:currentColor;stroke-width:var(--nf-anno-stroke);stroke-linecap:round;pointer-events:none}#notefully .nf-arrow-head{fill:currentColor;stroke:none;pointer-events:none}#notefully .nf-badge{position:absolute;left:50%;top:0;transform:translate(-50%,-50%);box-sizing:border-box;min-width:var(--nf-anno-badge);height:var(--nf-anno-badge);padding:0 calc(var(--nf-anno-badge-font) * .35);border-radius:50%;background:var(--nf-mark);color:var(--nf-mark-text);font:700 var(--nf-anno-badge-font)/var(--nf-anno-badge) ui-sans-serif,system-ui,sans-serif;text-align:center;pointer-events:none;z-index:4}#notefully .nf-sticker.nf-arrow .nf-badge{top:50%}#notefully .nf-handle{position:absolute;width:var(--nf-anno-handle);height:var(--nf-anno-handle);background:#fff;border:2px solid var(--nf-mark);border-radius:2px;z-index:5;box-sizing:border-box}#notefully .nf-handle[data-dir=nw]{left:-6px;top:-6px;cursor:nwse-resize}#notefully .nf-handle[data-dir=ne]{right:-6px;top:-6px;cursor:nesw-resize}#notefully .nf-handle[data-dir=sw]{left:-6px;bottom:-6px;cursor:nesw-resize}#notefully .nf-handle[data-dir=se]{right:-6px;bottom:-6px;cursor:nwse-resize}#notefully .nf-handle[data-dir=start],#notefully .nf-handle[data-dir=end]{margin:0;cursor:grab}#notefully .nf-crop{border:2px dashed var(--nf-accent);background:color-mix(in srgb,var(--nf-accent) 14%,transparent);box-shadow:0 0 0 9999px #00000073;pointer-events:none}#notefully .nf-text{width:100%;min-height:96px;resize:vertical;background:var(--nf-input);color:var(--nf-text);border:1px solid var(--nf-border);border-radius:8px;padding:10px;font:14px/1.4 ui-sans-serif,system-ui,sans-serif}#notefully .nf-author{width:100%;box-sizing:border-box;background:var(--nf-input);color:var(--nf-text);border:1px solid var(--nf-border);border-radius:8px;padding:10px;font:14px/1.4 ui-sans-serif,system-ui,sans-serif}#notefully .nf-author::placeholder{color:var(--nf-muted)}#notefully .nf-kind{display:flex;gap:8px}#notefully .nf-kind button{background:var(--nf-input);color:var(--nf-muted);border:1px solid var(--nf-border);border-radius:999px;padding:6px 12px;cursor:pointer}#notefully .nf-kind button[data-active=true]{color:var(--nf-accent-text);background:var(--nf-accent);border-color:var(--nf-accent)}#notefully .nf-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}#notefully .nf-actions button{border:1px solid var(--nf-border);border-radius:8px;padding:8px 12px;cursor:pointer;font:600 13px ui-sans-serif,system-ui,sans-serif;background:var(--nf-input);color:var(--nf-text)}#notefully .nf-actions .nf-icon-btn{padding:0}#notefully .nf-submit{margin-left:auto;background:var(--nf-btn)!important;color:var(--nf-btn-text)!important;border-color:var(--nf-btn-border)!important}#notefully .nf-submit:disabled{opacity:.55;cursor:wait}#notefully .nf-status{color:var(--nf-muted);font:13px ui-sans-serif,system-ui,sans-serif;min-height:1.2em}#notefully .nf-stop-video{position:fixed;top:16px;left:50%;transform:translate(-50%);z-index:calc(var(--nf-z) + 1);background:var(--nf-danger);color:#fff;border:0;border-radius:999px;padding:10px 18px;font:700 14px ui-sans-serif,system-ui,sans-serif;cursor:pointer}#notefully[data-nf-hidden-launcher] .nf-launcher{display:none!important}.nf-capture-chrome{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483645;display:grid;place-items:center;pointer-events:none;background:#140c1c47;animation:nf-capture-fade .16s ease-out both}.nf-capture-chrome-pill{display:inline-flex;align-items:center;gap:.55em;padding:.65em 1.1em;border-radius:999px;background:#f7f4fbf0;color:#2a2140;font:650 14px ui-sans-serif,system-ui,sans-serif;letter-spacing:.01em;box-shadow:0 10px 28px #140c1c38}.nf-capture-chrome-pill:before{content:"";width:.7em;height:.7em;border-radius:50%;border:2px solid rgba(42,33,64,.22);border-top-color:#864093;animation:nf-capture-spin .7s linear infinite}@keyframes nf-capture-fade{0%{opacity:0}to{opacity:1}}@keyframes nf-capture-spin{to{transform:rotate(360deg)}}
@@ -1,22 +1,23 @@
1
- var Notefully=(function(C){"use strict";function Ie(t,e){if(t.match(/^[a-z]+:\/\//i))return t;if(t.match(/^\/\//))return window.location.protocol+t;if(t.match(/^[a-z]+:/i))return t;const n=document.implementation.createHTMLDocument(),r=n.createElement("base"),o=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(o),e&&(r.href=e),o.href=t,o.href}const Oe=(()=>{let t=0;const e=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${e()}${t}`)})();function k(t){const e=[];for(let n=0,r=t.length;n<r;n++)e.push(t[n]);return e}let N=null;function Dt(t={}){return N||(t.includeStyleProperties?(N=t.includeStyleProperties,N):(N=k(window.getComputedStyle(document.documentElement)),N))}function Z(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function He(t){const e=Z(t,"border-left-width"),n=Z(t,"border-right-width");return t.clientWidth+e+n}function Fe(t){const e=Z(t,"border-top-width"),n=Z(t,"border-bottom-width");return t.clientHeight+e+n}function Bt(t,e={}){const n=e.width||He(t),r=e.height||Fe(t);return{width:n,height:r}}function De(){let t,e;try{e=process}catch{}const n=e&&e.env?e.env.devicePixelRatio:null;return n&&(t=parseInt(n,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}const M=16384;function Be(t){(t.width>M||t.height>M)&&(t.width>M&&t.height>M?t.width>t.height?(t.height*=M/t.width,t.width=M):(t.width*=M/t.height,t.height=M):t.width>M?(t.height*=M/t.width,t.width=M):(t.width*=M/t.height,t.height=M))}function tt(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>e(r))})},r.onerror=n,r.crossOrigin="anonymous",r.decoding="async",r.src=t})}async function Ue(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function je(t,e,n){const r="http://www.w3.org/2000/svg",o=document.createElementNS(r,"svg"),i=document.createElementNS(r,"foreignObject");return o.setAttribute("width",`${e}`),o.setAttribute("height",`${n}`),o.setAttribute("viewBox",`0 0 ${e} ${n}`),i.setAttribute("width","100%"),i.setAttribute("height","100%"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("externalResourcesRequired","true"),o.appendChild(i),i.appendChild(t),Ue(o)}const E=(t,e)=>{if(t instanceof e)return!0;const n=Object.getPrototypeOf(t);return n===null?!1:n.constructor.name===e.name||E(n,e)};function Ne(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function _e(t,e){return Dt(e).map(n=>{const r=t.getPropertyValue(n),o=t.getPropertyPriority(n);return`${n}: ${r}${o?" !important":""};`}).join(" ")}function Ve(t,e,n,r){const o=`.${t}:${e}`,i=n.cssText?Ne(n):_e(n,r);return document.createTextNode(`${o}{${i}}`)}function Ut(t,e,n,r){const o=window.getComputedStyle(t,n),i=o.getPropertyValue("content");if(i===""||i==="none")return;const a=Oe();try{e.className=`${e.className} ${a}`}catch{return}const c=document.createElement("style");c.appendChild(Ve(a,n,o,r)),e.appendChild(c)}function ze(t,e,n){Ut(t,e,":before",n),Ut(t,e,":after",n)}const jt="application/font-woff",Nt="image/jpeg",qe={woff:jt,woff2:jt,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Nt,jpeg:Nt,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function We(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function dt(t){const e=We(t).toLowerCase();return qe[e]||""}function Ke(t){return t.split(/,/)[1]}function ft(t){return t.search(/^(data:)/)!==-1}function Xe(t,e){return`data:${e};base64,${t}`}async function _t(t,e,n){const r=await fetch(t,e);if(r.status===404)throw new Error(`Resource "${r.url}" not found`);const o=await r.blob();return new Promise((i,a)=>{const c=new FileReader;c.onerror=a,c.onloadend=()=>{try{i(n({res:r,result:c.result}))}catch(l){a(l)}},c.readAsDataURL(o)})}const ht={};function Ye(t,e,n){let r=t.replace(/\?.*/,"");return n&&(r=t),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,"")),e?`[${e}]${r}`:r}async function mt(t,e,n){const r=Ye(t,e,n.includeQueryParams);if(ht[r]!=null)return ht[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let o;try{const i=await _t(t,n.fetchRequestInit,({res:a,result:c})=>(e||(e=a.headers.get("Content-Type")||""),Ke(c)));o=Xe(i,e)}catch(i){o=n.imagePlaceholder||"";let a=`Failed to fetch resource: ${t}`;i&&(a=typeof i=="string"?i:i.message),a&&console.warn(a)}return ht[r]=o,o}async function Ge(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):tt(e)}async function Je(t,e){if(t.currentSrc){const i=document.createElement("canvas"),a=i.getContext("2d");i.width=t.clientWidth,i.height=t.clientHeight,a==null||a.drawImage(t,0,0,i.width,i.height);const c=i.toDataURL();return tt(c)}const n=t.poster,r=dt(n),o=await mt(n,r,e);return tt(o)}async function Qe(t,e){var n;try{if(!((n=t==null?void 0:t.contentDocument)===null||n===void 0)&&n.body)return await et(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function Ze(t,e){return E(t,HTMLCanvasElement)?Ge(t):E(t,HTMLVideoElement)?Je(t,e):E(t,HTMLIFrameElement)?Qe(t,e):t.cloneNode(Vt(t))}const tn=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",Vt=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function en(t,e,n){var r,o;if(Vt(e))return e;let i=[];return tn(t)&&t.assignedNodes?i=k(t.assignedNodes()):E(t,HTMLIFrameElement)&&(!((r=t.contentDocument)===null||r===void 0)&&r.body)?i=k(t.contentDocument.body.childNodes):i=k(((o=t.shadowRoot)!==null&&o!==void 0?o:t).childNodes),i.length===0||E(t,HTMLVideoElement)||await i.reduce((a,c)=>a.then(()=>et(c,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function nn(t,e,n){const r=e.style;if(!r)return;const o=window.getComputedStyle(t);o.cssText?(r.cssText=o.cssText,r.transformOrigin=o.transformOrigin):Dt(n).forEach(i=>{let a=o.getPropertyValue(i);i==="font-size"&&a.endsWith("px")&&(a=`${Math.floor(parseFloat(a.substring(0,a.length-2)))-.1}px`),E(t,HTMLIFrameElement)&&i==="display"&&a==="inline"&&(a="block"),i==="d"&&e.getAttribute("d")&&(a=`path(${e.getAttribute("d")})`),r.setProperty(i,a,o.getPropertyPriority(i))})}function rn(t,e){E(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),E(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function on(t,e){if(E(t,HTMLSelectElement)){const r=Array.from(e.children).find(o=>t.value===o.getAttribute("value"));r&&r.setAttribute("selected","")}}function an(t,e,n){return E(e,Element)&&(nn(t,e,n),ze(t,e,n),rn(t,e),on(t,e)),e}async function sn(t,e){const n=t.querySelectorAll?t.querySelectorAll("use"):[];if(n.length===0)return t;const r={};for(let i=0;i<n.length;i++){const c=n[i].getAttribute("xlink:href");if(c){const l=t.querySelector(c),u=document.querySelector(c);!l&&u&&!r[c]&&(r[c]=await et(u,e,!0))}}const o=Object.values(r);if(o.length){const i="http://www.w3.org/1999/xhtml",a=document.createElementNS(i,"svg");a.setAttribute("xmlns",i),a.style.position="absolute",a.style.width="0",a.style.height="0",a.style.overflow="hidden",a.style.display="none";const c=document.createElementNS(i,"defs");a.appendChild(c);for(let l=0;l<o.length;l++)c.appendChild(o[l]);t.appendChild(a)}return t}async function et(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>Ze(r,e)).then(r=>en(t,r,e)).then(r=>an(t,r,e)).then(r=>sn(r,e))}const zt=/url\((['"]?)([^'"]+?)\1\)/g,cn=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,ln=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function un(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function dn(t){const e=[];return t.replace(zt,(n,r,o)=>(e.push(o),n)),e.filter(n=>!ft(n))}async function fn(t,e,n,r,o){try{const i=n?Ie(e,n):e,a=dt(e);let c;return o||(c=await mt(i,a,r)),t.replace(un(e),`$1${c}$3`)}catch{}return t}function hn(t,{preferredFontFormat:e}){return e?t.replace(ln,n=>{for(;;){const[r,,o]=cn.exec(n)||[];if(!o)return"";if(o===e)return`src: ${r};`}}):t}function qt(t){return t.search(zt)!==-1}async function Wt(t,e,n){if(!qt(t))return t;const r=hn(t,n);return dn(r).reduce((i,a)=>i.then(c=>fn(c,a,e,n)),Promise.resolve(r))}async function _(t,e,n){var r;const o=(r=e.style)===null||r===void 0?void 0:r.getPropertyValue(t);if(o){const i=await Wt(o,null,n);return e.style.setProperty(t,i,e.style.getPropertyPriority(t)),!0}return!1}async function mn(t,e){await _("background",t,e)||await _("background-image",t,e),await _("mask",t,e)||await _("-webkit-mask",t,e)||await _("mask-image",t,e)||await _("-webkit-mask-image",t,e)}async function pn(t,e){const n=E(t,HTMLImageElement);if(!(n&&!ft(t.src))&&!(E(t,SVGImageElement)&&!ft(t.href.baseVal)))return;const r=n?t.src:t.href.baseVal,o=await mt(r,dt(r),e);await new Promise((i,a)=>{t.onload=i,t.onerror=e.onImageErrorHandler?(...l)=>{try{i(e.onImageErrorHandler(...l))}catch(u){a(u)}}:a;const c=t;c.decode&&(c.decode=i),c.loading==="lazy"&&(c.loading="eager"),n?(t.srcset="",t.src=o):t.href.baseVal=o})}async function yn(t,e){const r=k(t.childNodes).map(o=>Kt(o,e));await Promise.all(r).then(()=>t)}async function Kt(t,e){E(t,Element)&&(await mn(t,e),await pn(t,e),await yn(t,e))}function gn(t,e){const{style:n}=t;e.backgroundColor&&(n.backgroundColor=e.backgroundColor),e.width&&(n.width=`${e.width}px`),e.height&&(n.height=`${e.height}px`);const r=e.style;return r!=null&&Object.keys(r).forEach(o=>{n[o]=r[o]}),t}const Xt={};async function Yt(t){let e=Xt[t];if(e!=null)return e;const r=await(await fetch(t)).text();return e={url:t,cssText:r},Xt[t]=e,e}async function Gt(t,e){let n=t.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async a=>{let c=a.replace(r,"$1");return c.startsWith("https://")||(c=new URL(c,t.url).href),_t(c,e.fetchRequestInit,({result:l})=>(n=n.replace(a,`url(${l})`),[a,l]))});return Promise.all(i).then(()=>n)}function Jt(t){if(t==null)return[];const e=[],n=/(\/\*[\s\S]*?\*\/)/gi;let r=t.replace(n,"");const o=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const l=o.exec(r);if(l===null)break;e.push(l[0])}r=r.replace(o,"");const i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,a="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",c=new RegExp(a,"gi");for(;;){let l=i.exec(r);if(l===null){if(l=c.exec(r),l===null)break;i.lastIndex=c.lastIndex}else c.lastIndex=i.lastIndex;e.push(l[0])}return e}async function wn(t,e){const n=[],r=[];return t.forEach(o=>{if("cssRules"in o)try{k(o.cssRules||[]).forEach((i,a)=>{if(i.type===CSSRule.IMPORT_RULE){let c=a+1;const l=i.href,u=Yt(l).then(h=>Gt(h,e)).then(h=>Jt(h).forEach(p=>{try{o.insertRule(p,p.startsWith("@import")?c+=1:o.cssRules.length)}catch(y){console.error("Error inserting rule from remote css",{rule:p,error:y})}})).catch(h=>{console.error("Error loading remote css",h.toString())});r.push(u)}})}catch(i){const a=t.find(c=>c.href==null)||document.styleSheets[0];o.href!=null&&r.push(Yt(o.href).then(c=>Gt(c,e)).then(c=>Jt(c).forEach(l=>{a.insertRule(l,a.cssRules.length)})).catch(c=>{console.error("Error loading remote stylesheet",c)})),console.error("Error inlining remote css file",i)}}),Promise.all(r).then(()=>(t.forEach(o=>{if("cssRules"in o)try{k(o.cssRules||[]).forEach(i=>{n.push(i)})}catch(i){console.error(`Error while reading CSS rules from ${o.href}`,i)}}),n))}function bn(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>qt(e.style.getPropertyValue("src")))}async function Sn(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=k(t.ownerDocument.styleSheets),r=await wn(n,e);return bn(r)}function Qt(t){return t.trim().replace(/["']/g,"")}function vn(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(i=>{e.add(Qt(i))}),Array.from(r.children).forEach(i=>{i instanceof HTMLElement&&n(i)})}return n(t),e}async function xn(t,e){const n=await Sn(t,e),r=vn(t);return(await Promise.all(n.filter(i=>r.has(Qt(i.style.fontFamily))).map(i=>{const a=i.parentStyleSheet?i.parentStyleSheet.href:null;return Wt(i.cssText,a,e)}))).join(`
2
- `)}async function En(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await xn(t,e);if(n){const r=document.createElement("style"),o=document.createTextNode(n);r.appendChild(o),t.firstChild?t.insertBefore(r,t.firstChild):t.appendChild(r)}}async function Mn(t,e={}){const{width:n,height:r}=Bt(t,e),o=await et(t,e,!0);return await En(o,e),await Kt(o,e),gn(o,e),await je(o,n,r)}async function Cn(t,e={}){const{width:n,height:r}=Bt(t,e),o=await Mn(t,e),i=await tt(o),a=document.createElement("canvas"),c=a.getContext("2d"),l=e.pixelRatio||De(),u=e.canvasWidth||n,h=e.canvasHeight||r;return a.width=u*l,a.height=h*l,e.skipAutoScale||Be(a),a.style.width=`${u}`,a.style.height=`${h}`,e.backgroundColor&&(c.fillStyle=e.backgroundColor,c.fillRect(0,0,a.width,a.height)),c.drawImage(i,0,0,a.width,a.height),a}async function Zt(t,e={}){return(await Cn(t,e)).toDataURL()}const nt="data-nf-capture-chrome",An="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";function Ln(t){return t instanceof Element&&(t.hasAttribute(nt)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function Rn(){const t=[];return Array.from(document.styleSheets).forEach(e=>{try{e.cssRules}catch{try{if(e.disabled)return;e.disabled=!0,t.push(e)}catch{const n=e.ownerNode;n&&"disabled"in n&&!n.disabled&&(n.disabled=!0,t.push({node:n}))}}}),()=>{t.forEach(e=>{try{e&&e.node?e.node.disabled=!1:e&&(e.disabled=!1)}catch{}})}}function $n(){const t=[];return document.querySelectorAll('input[type="password"], [data-notefully-mask]').forEach(n=>{const r=n.getBoundingClientRect(),o=document.createElement("div");o.setAttribute("data-nf-mask-cover","1"),o.style.cssText=["position:fixed",`left:${r.left}px`,`top:${r.top}px`,`width:${Math.max(r.width,4)}px`,`height:${Math.max(r.height,4)}px`,"background:#111","z-index:2147483646","pointer-events:none"].join(";"),document.body.appendChild(o),t.push(o)}),()=>t.forEach(n=>n.remove())}function Pn(){const t=document.querySelector(`[${nt}]`);if(t)return t;const e=document.createElement("div");return e.setAttribute(nt,"1"),e.className="nf-capture-chrome",e.setAttribute("role","status"),e.setAttribute("aria-live","polite"),e.innerHTML='<span class="nf-capture-chrome-pill">Capturing…</span>',document.body.appendChild(e),e}function Tn(){document.querySelectorAll(`[${nt}]`).forEach(t=>t.remove())}async function kn(){const t=document.getElementById("notefully"),e=t?t.style.display:"",n=Pn(),r=Rn();t&&(t.style.display="none");const o=$n();await new Promise(a=>requestAnimationFrame(()=>requestAnimationFrame(a)));const i={cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:a=>!Ln(a),imagePlaceholder:An,onImageErrorHandler:()=>{}};try{try{return await Zt(document.body,i)}catch{return await Zt(document.body,{...i,skipFonts:!0})}}finally{o(),r(),n.remove(),Tn(),t&&(t.style.display=e)}}function In(t=""){const e=String(t||"");return e?/Windows NT/i.test(e)?"Windows":/iPhone|iPad|iPod/i.test(e)?"iOS":/Mac OS X|Macintosh/i.test(e)?"macOS":/Android/i.test(e)?"Android":/CrOS/i.test(e)?"ChromeOS":/Linux/i.test(e)?"Linux":"Other":""}function On(t=""){const e=String(t||"");return e?/Edg\//i.test(e)?"Edge":/OPR\/|Opera/i.test(e)?"Opera":/Firefox\//i.test(e)?"Firefox":/Chrome\//i.test(e)||/CriOS\//i.test(e)?"Chrome":/Safari\//i.test(e)?"Safari":"Other":""}function Hn(t={}){const e=navigator.userAgent;return{url:location.href,title:document.title,userAgent:e,os:In(e),browser:On(e),language:navigator.language,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,viewport:{width:window.innerWidth,height:window.innerHeight,dpr:window.devicePixelRatio||1},user:{userId:t.userId||null,email:t.email||null,displayName:t.displayName||null}}}const te=new Set(["userId","email","displayName"]),ee={id:"userId",username:"displayName",name:"displayName"},ne=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video","consoleLogLimit","kinds"]),re={slug:"Use init({ name }) for a per-app report prefix (same idea as package.json name). slug is not a widget option.",projectSlug:"Use init({ name }) for a per-app report prefix. projectSlug is not a widget option.",project:"Pass projectKey (nfk_…) from Showfully Notefully settings — there is no project option on the widget.",username:"Pass people via Notefully.identify({ displayName }) (username is an identify alias), not init().",userId:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",email:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",displayName:"Pass people via Notefully.identify({ userId, email, displayName }), not init()."};function Fn(t={},e={}){const n=e.warn||ie,r=t&&typeof t=="object"?t:{},o={},i=[];for(const a of te)Object.prototype.hasOwnProperty.call(r,a)&&(o[a]=r[a]);for(const[a,c]of Object.entries(ee))Object.prototype.hasOwnProperty.call(r,a)&&(Object.prototype.hasOwnProperty.call(o,c)||(o[c]=r[a]));for(const a of Object.keys(r))te.has(a)||Object.prototype.hasOwnProperty.call(ee,a)||i.push(a);if(i.length){const a=i.some(c=>c==="name"||c==="slug"||c==="projectSlug")?" Pass the package/report name via Notefully.init({ name }), not identify().":"";n(`Notefully.identify: ignoring unknown key(s): ${i.join(", ")}. Supported: userId, email, displayName (aliases: id → userId; username/name → displayName).`+a)}return o}function Dn(t={},e={}){const n=e.warn||ie,r=t&&typeof t=="object"?t:{},o=Object.keys(r).filter(i=>!ne.has(i));if(o.length)for(const i of o){if(re[i]){n(`Notefully.init: ignoring "${i}". ${re[i]}`);continue}n(`Notefully.init: ignoring unknown key "${i}". Supported: ${[...ne].join(", ")}.`)}}function ie(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const Bn=80;function Un(){const t=[],e={};let n=!1;const r=(i,a)=>{let c="";try{c=a.map(l=>l instanceof Error?l.stack||l.message:typeof l=="string"?l:JSON.stringify(l)).join(" ")}catch{c=String(a[0])}t.push({level:i,text:c.slice(0,2e3),at:Date.now()}),t.length>Bn&&t.shift()};return{hook:()=>{n||typeof window>"u"||(n=!0,["log","info","warn","error"].forEach(i=>{e[i]=console[i].bind(console),console[i]=(...a)=>{r(i,a),e[i](...a)}}),window.addEventListener("error",i=>{r("error",[i.message||"window.error"])}),window.addEventListener("unhandledrejection",i=>{r("error",[i.reason||"unhandledrejection"])}))},snapshot(){return t.slice()}}}function jn(t){const e=window.SpeechRecognition||window.webkitSpeechRecognition;let n=null,r=!1;const o=()=>{if(r=!1,n)try{n.stop()}catch{}};return{start:()=>{if(!e)throw new Error("Speech recognition is not supported in this browser.");return r?(o(),!1):(n=new e,n.continuous=!0,n.interimResults=!0,n.lang=navigator.language||"en-US",n.onresult=a=>{let c="";for(let l=a.resultIndex;l<a.results.length;l+=1)a.results[l].isFinal&&(c+=a.results[l][0].transcript);c&&t(c)},n.onerror=()=>{r=!1},n.onend=()=>{r=!1},n.start(),r=!0,!0)},stop:o,isSupported:()=>!!e,isActive:()=>r}}const Nn=60*1e3;function _n({onStart:t,onStop:e,onError:n}){let r=null,o=null,i=[],a=null;const c=()=>{if(a&&(clearTimeout(a),a=null),o&&o.state!=="inactive")try{o.stop()}catch{}r&&(r.getTracks().forEach(h=>h.stop()),r=null)},l=()=>{if(o&&o.state==="recording"){o.stop();return}c(),e(null)};return{start:async()=>{var h,p;if(!((h=navigator.mediaDevices)!=null&&h.getDisplayMedia))throw new Error("Screen recording is not supported in this browser.");r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1,preferCurrentTab:!0,selfBrowserSurface:"include"}),i=[],o=new MediaRecorder(r,{mimeType:MediaRecorder.isTypeSupported("video/webm;codecs=vp9")?"video/webm;codecs=vp9":"video/webm"}),o.ondataavailable=y=>{y.data&&y.data.size&&i.push(y.data)},o.onstop=()=>{const y=i.length?new Blob(i,{type:o.mimeType||"video/webm"}):null;c(),e(y)},(p=r.getVideoTracks()[0])==null||p.addEventListener("ended",()=>l()),o.start(),a=setTimeout(l,Nn)},stop:l}}function Vn(){const t=new Set;return{alloc(){let e=1;for(;t.has(e);)e+=1;return t.add(e),e},free(e){const n=Number(e);Number.isInteger(n)&&n>0&&t.delete(n)},peekUsed(){return[...t].sort((e,n)=>e-n)}}}const pt={x:0,y:0,w:1,h:1};function oe(){const t=Vn();let e=[],n={...pt},r=1;return{list:()=>e.filter(i=>qn(i,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(i){return n=zn(i),n},resetCrop(){return n={...pt},n},isCropped(){return n.x>1e-6||n.y>1e-6||n.w<.999999||n.h<.999999},add(i,a){const c={id:`s${r++}`,type:i,number:t.alloc(),x:.2,y:.2,w:i==="arrow"?.2:.22,h:i==="arrow"?.05:.16,x2:.4,y2:.28,...a};return e.push(c),c},update(i,a){const c=e.find(l=>l.id===i);return c?(Object.assign(c,a),c):null},remove(i){const a=e.findIndex(l=>l.id===i);if(a<0)return null;const[c]=e.splice(a,1);return t.free(c.number),c},reset(){for(e=[],n={...pt},r=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function zn(t){const e=Math.min(Math.max(t.x,0),.95),n=Math.min(Math.max(t.y,0),.95),r=Math.min(Math.max(t.w,.05),1-e),o=Math.min(Math.max(t.h,.05),1-n);return{x:e,y:n,w:r,h:o}}function qn(t,e){const n=t.type==="arrow"?(t.x+(t.x2??t.x))/2:t.x+(t.w||0)/2,r=t.type==="arrow"?(t.y+(t.y2??t.y))/2:t.y+(t.h||0)/2;return n>=e.x&&r>=e.y&&n<=e.x+e.w&&r<=e.y+e.h}function yt(t){const e=Math.max(1,Number(t)||1);return{stroke:Math.max(2,e*.0075),badgeRadius:Math.max(8,e*.025),fontSize:Math.max(10,e*.0275),arrowHead:Math.max(8,e*.035),arrowHeadAngle:.4}}function Wn(t,{stickers:e=[],crop:n={x:0,y:0,w:1,h:1},width:r,height:o,colors:i={}}){const a=i.mark||"#fdd341",c=i.markText||"#2a2140",l=yt(r);t.save(),t.lineWidth=l.stroke,t.lineCap="round",t.lineJoin="round",t.strokeStyle=a,t.fillStyle=a,t.font=`700 ${Math.round(l.fontSize)}px ui-sans-serif, system-ui, sans-serif`,e.forEach(u=>{const h=gt(u.x,n,r),p=wt(u.y,n,o),y=u.w/n.w*r,x=u.h/n.h*o,$=l.stroke/2;if(u.type==="rect")t.strokeRect(h+$,p+$,Math.max(0,y-l.stroke),Math.max(0,x-l.stroke));else if(u.type==="circle")t.beginPath(),t.ellipse(h+y/2,p+x/2,Math.max(.5,y/2-$),Math.max(.5,x/2-$),0,0,Math.PI*2),t.stroke();else if(u.type==="arrow"){const z=gt(u.x2??u.x+u.w,n,r),q=wt(u.y2??u.y,n,o);Xn(t,h,p,z,q,l)}if(u.number==null||u.number==="")return;const F=Kn(u,n,r,o,h,p,y),Q=String(u.number);t.beginPath(),t.arc(F.x,F.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=a,t.fill(),t.fillStyle=c,t.textAlign="center",t.textBaseline="middle",t.fillText(Q,F.x,F.y+.5),t.fillStyle=a}),t.restore()}function gt(t,e,n){return(t-e.x)/e.w*n}function wt(t,e,n){return(t-e.y)/e.h*n}function Kn(t,e,n,r,o,i,a){if(t.type==="arrow"){const c=gt(t.x2??t.x+t.w,e,n),l=wt(t.y2??t.y,e,r);return{x:(o+c)/2,y:(i+l)/2}}return{x:o+a/2,y:i}}function ae(t,e,n,r,o){const i=Math.atan2(r-e,n-t),a=o.arrowHead,c=Math.min(o.stroke,a*.2),l=n,u=r,h=n-Math.cos(i)*a,p=r-Math.sin(i)*a,y={x:l-a*Math.cos(i-o.arrowHeadAngle),y:u-a*Math.sin(i-o.arrowHeadAngle)},x={x:l-a*Math.cos(i+o.arrowHeadAngle),y:u-a*Math.sin(i+o.arrowHeadAngle)},$={x:n-Math.cos(i)*c,y:r-Math.sin(i)*c};return{angle:i,tipX:l,tipY:u,baseX:h,baseY:p,left:y,right:x,shaftEnd:$}}function Xn(t,e,n,r,o,i){const a=ae(e,n,r,o,i);t.beginPath(),t.moveTo(e,n),t.lineTo(a.shaftEnd.x,a.shaftEnd.y),t.stroke(),t.beginPath(),t.moveTo(a.tipX,a.tipY),t.lineTo(a.left.x,a.left.y),t.lineTo(a.right.x,a.right.y),t.closePath(),t.fill()}function Yn(t,e,n,r={}){return new Promise((o,i)=>{const a=new Image;a.onload=()=>{const c=Math.round(e.x*a.width),l=Math.round(e.y*a.height),u=Math.max(1,Math.round(e.w*a.width)),h=Math.max(1,Math.round(e.h*a.height)),p=document.createElement("canvas");p.width=u,p.height=h;const y=p.getContext("2d");y.drawImage(a,c,l,u,h,0,0,u,h),Wn(y,{stickers:n,crop:e,width:u,height:h,colors:r}),p.toBlob(x=>{if(!x){i(new Error("Could not encode screenshot"));return}o(x)},"image/png")},a.onerror=()=>i(new Error("Could not load screenshot")),a.src=t})}const B=[{id:"bug",label:"Bug"},{id:"idea",label:"Idea"},{id:"other",label:"Other"}];function se(t){return String(t||"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32)}function bt(t){const e=String(t||"").trim();return e?e.split(/[-_\s]+/).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" "):""}function Gn(t){if(!Array.isArray(t)||!t.length)return B.map(r=>({...r}));const e=new Set,n=[];for(const r of t){let o="",i="";typeof r=="string"||typeof r=="number"?(o=se(r),i=bt(o)):r&&typeof r=="object"&&(o=se(r.id??r.value??r.kind),i=String(r.label||r.name||bt(o)).trim()||bt(o)),!(!o||e.has(o))&&(e.add(o),n.push({id:o,label:i}))}return n.length?n:B.map(r=>({...r}))}function rt(t){var n;const e=Array.isArray(t)&&t.length?t:B;return e.some(r=>r.id==="bug")?"bug":((n=e[0])==null?void 0:n.id)||"other"}const Jn=["maker","all-business","brighter-day","quiet-night"],ce="maker",Qn=new Set(["crop","arrow","rect","circle"]),St=.02,le=.05,Zn=`
1
+ var Notefully=(function(C){"use strict";function _e(t,e){if(t.match(/^[a-z]+:\/\//i))return t;if(t.match(/^\/\//))return window.location.protocol+t;if(t.match(/^[a-z]+:/i))return t;const n=document.implementation.createHTMLDocument(),r=n.createElement("base"),a=n.createElement("a");return n.head.appendChild(r),n.body.appendChild(a),e&&(r.href=e),a.href=t,a.href}const Ve=(()=>{let t=0;const e=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${e()}${t}`)})();function O(t){const e=[];for(let n=0,r=t.length;n<r;n++)e.push(t[n]);return e}let W=null;function Vt(t={}){return W||(t.includeStyleProperties?(W=t.includeStyleProperties,W):(W=O(window.getComputedStyle(document.documentElement)),W))}function rt(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function We(t){const e=rt(t,"border-left-width"),n=rt(t,"border-right-width");return t.clientWidth+e+n}function ze(t){const e=rt(t,"border-top-width"),n=rt(t,"border-bottom-width");return t.clientHeight+e+n}function Wt(t,e={}){const n=e.width||We(t),r=e.height||ze(t);return{width:n,height:r}}function qe(){let t,e;try{e=process}catch{}const n=e&&e.env?e.env.devicePixelRatio:null;return n&&(t=parseInt(n,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}const E=16384;function Ke(t){(t.width>E||t.height>E)&&(t.width>E&&t.height>E?t.width>t.height?(t.height*=E/t.width,t.width=E):(t.width*=E/t.height,t.height=E):t.width>E?(t.height*=E/t.width,t.width=E):(t.width*=E/t.height,t.height=E))}function it(t){return new Promise((e,n)=>{const r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>e(r))})},r.onerror=n,r.crossOrigin="anonymous",r.decoding="async",r.src=t})}async function Xe(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function Ye(t,e,n){const r="http://www.w3.org/2000/svg",a=document.createElementNS(r,"svg"),i=document.createElementNS(r,"foreignObject");return a.setAttribute("width",`${e}`),a.setAttribute("height",`${n}`),a.setAttribute("viewBox",`0 0 ${e} ${n}`),i.setAttribute("width","100%"),i.setAttribute("height","100%"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("externalResourcesRequired","true"),a.appendChild(i),i.appendChild(t),Xe(a)}const x=(t,e)=>{if(t instanceof e)return!0;const n=Object.getPrototypeOf(t);return n===null?!1:n.constructor.name===e.name||x(n,e)};function Ge(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function Je(t,e){return Vt(e).map(n=>{const r=t.getPropertyValue(n),a=t.getPropertyPriority(n);return`${n}: ${r}${a?" !important":""};`}).join(" ")}function Qe(t,e,n,r){const a=`.${t}:${e}`,i=n.cssText?Ge(n):Je(n,r);return document.createTextNode(`${a}{${i}}`)}function zt(t,e,n,r){const a=window.getComputedStyle(t,n),i=a.getPropertyValue("content");if(i===""||i==="none")return;const o=Ve();try{e.className=`${e.className} ${o}`}catch{return}const c=document.createElement("style");c.appendChild(Qe(o,n,a,r)),e.appendChild(c)}function Ze(t,e,n){zt(t,e,":before",n),zt(t,e,":after",n)}const qt="application/font-woff",Kt="image/jpeg",tn={woff:qt,woff2:qt,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Kt,jpeg:Kt,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function en(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function yt(t){const e=en(t).toLowerCase();return tn[e]||""}function nn(t){return t.split(/,/)[1]}function gt(t){return t.search(/^(data:)/)!==-1}function rn(t,e){return`data:${e};base64,${t}`}async function Xt(t,e,n){const r=await fetch(t,e);if(r.status===404)throw new Error(`Resource "${r.url}" not found`);const a=await r.blob();return new Promise((i,o)=>{const c=new FileReader;c.onerror=o,c.onloadend=()=>{try{i(n({res:r,result:c.result}))}catch(l){o(l)}},c.readAsDataURL(a)})}const wt={};function an(t,e,n){let r=t.replace(/\?.*/,"");return n&&(r=t),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,"")),e?`[${e}]${r}`:r}async function bt(t,e,n){const r=an(t,e,n.includeQueryParams);if(wt[r]!=null)return wt[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let a;try{const i=await Xt(t,n.fetchRequestInit,({res:o,result:c})=>(e||(e=o.headers.get("Content-Type")||""),nn(c)));a=rn(i,e)}catch(i){a=n.imagePlaceholder||"";let o=`Failed to fetch resource: ${t}`;i&&(o=typeof i=="string"?i:i.message),o&&console.warn(o)}return wt[r]=a,a}async function on(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):it(e)}async function sn(t,e){if(t.currentSrc){const i=document.createElement("canvas"),o=i.getContext("2d");i.width=t.clientWidth,i.height=t.clientHeight,o==null||o.drawImage(t,0,0,i.width,i.height);const c=i.toDataURL();return it(c)}const n=t.poster,r=yt(n),a=await bt(n,r,e);return it(a)}async function cn(t,e){var n;try{if(!((n=t==null?void 0:t.contentDocument)===null||n===void 0)&&n.body)return await at(t.contentDocument.body,e,!0)}catch{}return t.cloneNode(!1)}async function ln(t,e){return x(t,HTMLCanvasElement)?on(t):x(t,HTMLVideoElement)?sn(t,e):x(t,HTMLIFrameElement)?cn(t,e):t.cloneNode(Yt(t))}const un=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",Yt=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function dn(t,e,n){var r,a;if(Yt(e))return e;let i=[];return un(t)&&t.assignedNodes?i=O(t.assignedNodes()):x(t,HTMLIFrameElement)&&(!((r=t.contentDocument)===null||r===void 0)&&r.body)?i=O(t.contentDocument.body.childNodes):i=O(((a=t.shadowRoot)!==null&&a!==void 0?a:t).childNodes),i.length===0||x(t,HTMLVideoElement)||await i.reduce((o,c)=>o.then(()=>at(c,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function fn(t,e,n){const r=e.style;if(!r)return;const a=window.getComputedStyle(t);a.cssText?(r.cssText=a.cssText,r.transformOrigin=a.transformOrigin):Vt(n).forEach(i=>{let o=a.getPropertyValue(i);i==="font-size"&&o.endsWith("px")&&(o=`${Math.floor(parseFloat(o.substring(0,o.length-2)))-.1}px`),x(t,HTMLIFrameElement)&&i==="display"&&o==="inline"&&(o="block"),i==="d"&&e.getAttribute("d")&&(o=`path(${e.getAttribute("d")})`),r.setProperty(i,o,a.getPropertyPriority(i))})}function hn(t,e){x(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),x(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function pn(t,e){if(x(t,HTMLSelectElement)){const r=Array.from(e.children).find(a=>t.value===a.getAttribute("value"));r&&r.setAttribute("selected","")}}function mn(t,e,n){return x(e,Element)&&(fn(t,e,n),Ze(t,e,n),hn(t,e),pn(t,e)),e}async function yn(t,e){const n=t.querySelectorAll?t.querySelectorAll("use"):[];if(n.length===0)return t;const r={};for(let i=0;i<n.length;i++){const c=n[i].getAttribute("xlink:href");if(c){const l=t.querySelector(c),u=document.querySelector(c);!l&&u&&!r[c]&&(r[c]=await at(u,e,!0))}}const a=Object.values(r);if(a.length){const i="http://www.w3.org/1999/xhtml",o=document.createElementNS(i,"svg");o.setAttribute("xmlns",i),o.style.position="absolute",o.style.width="0",o.style.height="0",o.style.overflow="hidden",o.style.display="none";const c=document.createElementNS(i,"defs");o.appendChild(c);for(let l=0;l<a.length;l++)c.appendChild(a[l]);t.appendChild(o)}return t}async function at(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>ln(r,e)).then(r=>dn(t,r,e)).then(r=>mn(t,r,e)).then(r=>yn(r,e))}const Gt=/url\((['"]?)([^'"]+?)\1\)/g,gn=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,wn=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function bn(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function Sn(t){const e=[];return t.replace(Gt,(n,r,a)=>(e.push(a),n)),e.filter(n=>!gt(n))}async function vn(t,e,n,r,a){try{const i=n?_e(e,n):e,o=yt(e);let c;return a||(c=await bt(i,o,r)),t.replace(bn(e),`$1${c}$3`)}catch{}return t}function xn(t,{preferredFontFormat:e}){return e?t.replace(wn,n=>{for(;;){const[r,,a]=gn.exec(n)||[];if(!a)return"";if(a===e)return`src: ${r};`}}):t}function Jt(t){return t.search(Gt)!==-1}async function Qt(t,e,n){if(!Jt(t))return t;const r=xn(t,n);return Sn(r).reduce((i,o)=>i.then(c=>vn(c,o,e,n)),Promise.resolve(r))}async function z(t,e,n){var r;const a=(r=e.style)===null||r===void 0?void 0:r.getPropertyValue(t);if(a){const i=await Qt(a,null,n);return e.style.setProperty(t,i,e.style.getPropertyPriority(t)),!0}return!1}async function En(t,e){await z("background",t,e)||await z("background-image",t,e),await z("mask",t,e)||await z("-webkit-mask",t,e)||await z("mask-image",t,e)||await z("-webkit-mask-image",t,e)}async function Cn(t,e){const n=x(t,HTMLImageElement);if(!(n&&!gt(t.src))&&!(x(t,SVGImageElement)&&!gt(t.href.baseVal)))return;const r=n?t.src:t.href.baseVal,a=await bt(r,yt(r),e);await new Promise((i,o)=>{t.onload=i,t.onerror=e.onImageErrorHandler?(...l)=>{try{i(e.onImageErrorHandler(...l))}catch(u){o(u)}}:o;const c=t;c.decode&&(c.decode=i),c.loading==="lazy"&&(c.loading="eager"),n?(t.srcset="",t.src=a):t.href.baseVal=a})}async function Mn(t,e){const r=O(t.childNodes).map(a=>Zt(a,e));await Promise.all(r).then(()=>t)}async function Zt(t,e){x(t,Element)&&(await En(t,e),await Cn(t,e),await Mn(t,e))}function An(t,e){const{style:n}=t;e.backgroundColor&&(n.backgroundColor=e.backgroundColor),e.width&&(n.width=`${e.width}px`),e.height&&(n.height=`${e.height}px`);const r=e.style;return r!=null&&Object.keys(r).forEach(a=>{n[a]=r[a]}),t}const te={};async function ee(t){let e=te[t];if(e!=null)return e;const r=await(await fetch(t)).text();return e={url:t,cssText:r},te[t]=e,e}async function ne(t,e){let n=t.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async o=>{let c=o.replace(r,"$1");return c.startsWith("https://")||(c=new URL(c,t.url).href),Xt(c,e.fetchRequestInit,({result:l})=>(n=n.replace(o,`url(${l})`),[o,l]))});return Promise.all(i).then(()=>n)}function re(t){if(t==null)return[];const e=[],n=/(\/\*[\s\S]*?\*\/)/gi;let r=t.replace(n,"");const a=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const l=a.exec(r);if(l===null)break;e.push(l[0])}r=r.replace(a,"");const i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,o="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",c=new RegExp(o,"gi");for(;;){let l=i.exec(r);if(l===null){if(l=c.exec(r),l===null)break;i.lastIndex=c.lastIndex}else c.lastIndex=i.lastIndex;e.push(l[0])}return e}async function Ln(t,e){const n=[],r=[];return t.forEach(a=>{if("cssRules"in a)try{O(a.cssRules||[]).forEach((i,o)=>{if(i.type===CSSRule.IMPORT_RULE){let c=o+1;const l=i.href,u=ee(l).then(f=>ne(f,e)).then(f=>re(f).forEach(p=>{try{a.insertRule(p,p.startsWith("@import")?c+=1:a.cssRules.length)}catch(y){console.error("Error inserting rule from remote css",{rule:p,error:y})}})).catch(f=>{console.error("Error loading remote css",f.toString())});r.push(u)}})}catch(i){const o=t.find(c=>c.href==null)||document.styleSheets[0];a.href!=null&&r.push(ee(a.href).then(c=>ne(c,e)).then(c=>re(c).forEach(l=>{o.insertRule(l,o.cssRules.length)})).catch(c=>{console.error("Error loading remote stylesheet",c)})),console.error("Error inlining remote css file",i)}}),Promise.all(r).then(()=>(t.forEach(a=>{if("cssRules"in a)try{O(a.cssRules||[]).forEach(i=>{n.push(i)})}catch(i){console.error(`Error while reading CSS rules from ${a.href}`,i)}}),n))}function Rn(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Jt(e.style.getPropertyValue("src")))}async function $n(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=O(t.ownerDocument.styleSheets),r=await Ln(n,e);return Rn(r)}function ie(t){return t.trim().replace(/["']/g,"")}function Tn(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(i=>{e.add(ie(i))}),Array.from(r.children).forEach(i=>{i instanceof HTMLElement&&n(i)})}return n(t),e}async function Pn(t,e){const n=await $n(t,e),r=Tn(t);return(await Promise.all(n.filter(i=>r.has(ie(i.style.fontFamily))).map(i=>{const o=i.parentStyleSheet?i.parentStyleSheet.href:null;return Qt(i.cssText,o,e)}))).join(`
2
+ `)}async function kn(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await Pn(t,e);if(n){const r=document.createElement("style"),a=document.createTextNode(n);r.appendChild(a),t.firstChild?t.insertBefore(r,t.firstChild):t.appendChild(r)}}async function In(t,e={}){const{width:n,height:r}=Wt(t,e),a=await at(t,e,!0);return await kn(a,e),await Zt(a,e),An(a,e),await Ye(a,n,r)}async function On(t,e={}){const{width:n,height:r}=Wt(t,e),a=await In(t,e),i=await it(a),o=document.createElement("canvas"),c=o.getContext("2d"),l=e.pixelRatio||qe(),u=e.canvasWidth||n,f=e.canvasHeight||r;return o.width=u*l,o.height=f*l,e.skipAutoScale||Ke(o),o.style.width=`${u}`,o.style.height=`${f}`,e.backgroundColor&&(c.fillStyle=e.backgroundColor,c.fillRect(0,0,o.width,o.height)),c.drawImage(i,0,0,o.width,o.height),o}async function ae(t,e={}){return(await On(t,e)).toDataURL()}const ot="data-nf-capture-chrome",Bn="data-nf-canvas-snap",Hn="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";function oe(t){return t instanceof Element&&(t.hasAttribute(ot)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function Dn(){const t=[];return Array.from(document.styleSheets).forEach(e=>{try{e.cssRules}catch{try{if(e.disabled)return;e.disabled=!0,t.push(e)}catch{const n=e.ownerNode;n&&"disabled"in n&&!n.disabled&&(n.disabled=!0,t.push({node:n}))}}}),()=>{t.forEach(e=>{try{e&&e.node?e.node.disabled=!1:e&&(e.disabled=!1)}catch{}})}}function Fn(){const t=[];return document.querySelectorAll('input[type="password"], [data-notefully-mask]').forEach(n=>{const r=n.getBoundingClientRect(),a=document.createElement("div");a.setAttribute("data-nf-mask-cover","1"),a.style.cssText=["position:fixed",`left:${r.left}px`,`top:${r.top}px`,`width:${Math.max(r.width,4)}px`,`height:${Math.max(r.height,4)}px`,"background:#111","z-index:2147483646","pointer-events:none"].join(";"),document.body.appendChild(a),t.push(a)}),()=>t.forEach(n=>n.remove())}function Un(){const t=document.querySelector(`[${ot}]`);if(t)return t;const e=document.createElement("div");return e.setAttribute(ot,"1"),e.className="nf-capture-chrome",e.setAttribute("role","status"),e.setAttribute("aria-live","polite"),e.innerHTML='<span class="nf-capture-chrome-pill">Capturing…</span>',document.body.appendChild(e),e}function Nn(){document.querySelectorAll(`[${ot}]`).forEach(t=>t.remove())}function St(){return new Promise(t=>{requestAnimationFrame(()=>requestAnimationFrame(t))})}function B(t){if(typeof t!="string"||!t.startsWith("data:image/"))return!1;const e=t.indexOf(",");return e>0&&e<t.length-1}function jn(){const t=document.documentElement,e=document.body,n=Math.max(window.innerWidth||0,(t==null?void 0:t.clientWidth)||0,(t==null?void 0:t.scrollWidth)||0,(e==null?void 0:e.scrollWidth)||0,1),r=Math.max(window.innerHeight||0,(t==null?void 0:t.clientHeight)||0,(t==null?void 0:t.scrollHeight)||0,(e==null?void 0:e.scrollHeight)||0,1);return{width:n,height:r}}async function _n(){const t=[],e=Array.from(document.querySelectorAll("canvas"));for(const n of e){if(n.closest("#notefully")||oe(n))continue;let r="";try{r=n.toDataURL("image/png")}catch{continue}if(!r||r==="data:,")continue;const a=document.createElement("img"),i=getComputedStyle(n);a.setAttribute(Bn,"1"),a.alt="",a.src=r,a.className=n.className,a.style.cssText=n.style.cssText,a.style.width=i.width,a.style.height=i.height,a.style.maxWidth=i.maxWidth,a.style.maxHeight=i.maxHeight,a.style.objectFit="fill",a.style.display=i.display==="inline"?"inline-block":i.display,n.replaceWith(a),t.push({canvas:n,img:a})}return await Promise.all(t.map(({img:n})=>{if(!n.complete)return new Promise(r=>{n.onload=()=>r(),n.onerror=()=>r()})})),()=>{t.forEach(({canvas:n,img:r})=>{try{r.parentNode&&r.replaceWith(n)}catch{}})}}async function Vn(t){if(!t)return null;if(typeof t=="string")return B(t)?t:null;if(typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement)try{const e=t.toDataURL("image/png");return B(e)?e:null}catch{return null}if(typeof Blob<"u"&&t instanceof Blob){const e=await Wn(t);return B(e)?e:null}return null}async function Wn(t){if(typeof FileReader=="function")return new Promise((r,a)=>{const i=new FileReader;i.onload=()=>r(String(i.result||"")),i.onerror=()=>a(i.error||new Error("Could not read capture blob")),i.readAsDataURL(t)});const e=Buffer.from(await t.arrayBuffer());return`data:${t.type||"application/octet-stream"};base64,${e.toString("base64")}`}async function zn(){var e;if(!((e=navigator.mediaDevices)!=null&&e.getDisplayMedia))throw new Error("Screen capture is not supported in this browser.");const t=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1,preferCurrentTab:!0,selfBrowserSurface:"include"});try{const n=document.createElement("video");n.muted=!0,n.playsInline=!0,n.srcObject=t,await n.play(),n.videoWidth||await new Promise(c=>{n.onloadedmetadata=()=>c()}),await St();const r=n.videoWidth||1,a=n.videoHeight||1,i=document.createElement("canvas");i.width=r,i.height=a,i.getContext("2d").drawImage(n,0,0,r,a);const o=i.toDataURL("image/png");if(!B(o))throw new Error("Screen capture produced an empty image.");return o}finally{t.getTracks().forEach(n=>n.stop())}}async function se(t={}){const e=document.getElementById("notefully"),n=e?e.style.display:"",r=Un(),a=Dn();let i=()=>{};e&&(e.style.display="none");const o=Fn();try{if(typeof t.onBeforeCapture=="function"&&await t.onBeforeCapture(),await St(),typeof t.capture=="function"){const p=await Vn(await t.capture());if(p)return p}i=await _n(),await St();const{width:c,height:l}=jn(),u={cacheBust:!0,width:c,height:l,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:p=>!oe(p),imagePlaceholder:Hn,onImageErrorHandler:()=>{}};let f="";try{f=await ae(document.body,u)}catch{f=await ae(document.body,{...u,skipFonts:!0})}if(!B(f))throw new Error("Screenshot capture produced an empty image.");return f}finally{try{i()}catch{}o(),a(),r.remove(),Nn(),e&&(e.style.display=n)}}function qn(t=""){const e=String(t||"");return e?/Windows NT/i.test(e)?"Windows":/iPhone|iPad|iPod/i.test(e)?"iOS":/Mac OS X|Macintosh/i.test(e)?"macOS":/Android/i.test(e)?"Android":/CrOS/i.test(e)?"ChromeOS":/Linux/i.test(e)?"Linux":"Other":""}function Kn(t=""){const e=String(t||"");return e?/Edg\//i.test(e)?"Edge":/OPR\/|Opera/i.test(e)?"Opera":/Firefox\//i.test(e)?"Firefox":/Chrome\//i.test(e)||/CriOS\//i.test(e)?"Chrome":/Safari\//i.test(e)?"Safari":"Other":""}function Xn(t={}){const e=navigator.userAgent;return{url:location.href,title:document.title,userAgent:e,os:qn(e),browser:Kn(e),language:navigator.language,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,viewport:{width:window.innerWidth,height:window.innerHeight,dpr:window.devicePixelRatio||1},user:{userId:t.userId||null,email:t.email||null,displayName:t.displayName||null}}}const ce=new Set(["userId","email","displayName"]),le={id:"userId",username:"displayName",name:"displayName"},ue=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video","consoleLogLimit","kinds","capture","onBeforeCapture"]),de={slug:"Use init({ name }) for a per-app report prefix (same idea as package.json name). slug is not a widget option.",projectSlug:"Use init({ name }) for a per-app report prefix. projectSlug is not a widget option.",project:"Pass projectKey (nfk_…) from Showfully Notefully settings — there is no project option on the widget.",username:"Pass people via Notefully.identify({ displayName }) (username is an identify alias), not init().",userId:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",email:"Pass people via Notefully.identify({ userId, email, displayName }), not init().",displayName:"Pass people via Notefully.identify({ userId, email, displayName }), not init()."};function Yn(t={},e={}){const n=e.warn||fe,r=t&&typeof t=="object"?t:{},a={},i=[];for(const o of ce)Object.prototype.hasOwnProperty.call(r,o)&&(a[o]=r[o]);for(const[o,c]of Object.entries(le))Object.prototype.hasOwnProperty.call(r,o)&&(Object.prototype.hasOwnProperty.call(a,c)||(a[c]=r[o]));for(const o of Object.keys(r))ce.has(o)||Object.prototype.hasOwnProperty.call(le,o)||i.push(o);if(i.length){const o=i.some(c=>c==="name"||c==="slug"||c==="projectSlug")?" Pass the package/report name via Notefully.init({ name }), not identify().":"";n(`Notefully.identify: ignoring unknown key(s): ${i.join(", ")}. Supported: userId, email, displayName (aliases: id → userId; username/name → displayName).`+o)}return a}function Gn(t={},e={}){const n=e.warn||fe,r=t&&typeof t=="object"?t:{},a=Object.keys(r).filter(i=>!ue.has(i));if(a.length)for(const i of a){if(de[i]){n(`Notefully.init: ignoring "${i}". ${de[i]}`);continue}n(`Notefully.init: ignoring unknown key "${i}". Supported: ${[...ue].join(", ")}.`)}}function fe(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const Jn=80;function Qn(){const t=[],e={};let n=!1;const r=(i,o)=>{let c="";try{c=o.map(l=>l instanceof Error?l.stack||l.message:typeof l=="string"?l:JSON.stringify(l)).join(" ")}catch{c=String(o[0])}t.push({level:i,text:c.slice(0,2e3),at:Date.now()}),t.length>Jn&&t.shift()};return{hook:()=>{n||typeof window>"u"||(n=!0,["log","info","warn","error"].forEach(i=>{e[i]=console[i].bind(console),console[i]=(...o)=>{r(i,o),e[i](...o)}}),window.addEventListener("error",i=>{r("error",[i.message||"window.error"])}),window.addEventListener("unhandledrejection",i=>{r("error",[i.reason||"unhandledrejection"])}))},snapshot(){return t.slice()}}}function Zn(t){const e=window.SpeechRecognition||window.webkitSpeechRecognition;let n=null,r=!1;const a=()=>{if(r=!1,n)try{n.stop()}catch{}};return{start:()=>{if(!e)throw new Error("Speech recognition is not supported in this browser.");return r?(a(),!1):(n=new e,n.continuous=!0,n.interimResults=!0,n.lang=navigator.language||"en-US",n.onresult=o=>{let c="";for(let l=o.resultIndex;l<o.results.length;l+=1)o.results[l].isFinal&&(c+=o.results[l][0].transcript);c&&t(c)},n.onerror=()=>{r=!1},n.onend=()=>{r=!1},n.start(),r=!0,!0)},stop:a,isSupported:()=>!!e,isActive:()=>r}}const tr=60*1e3;function er({onStart:t,onStop:e,onError:n}){let r=null,a=null,i=[],o=null;const c=()=>{if(o&&(clearTimeout(o),o=null),a&&a.state!=="inactive")try{a.stop()}catch{}r&&(r.getTracks().forEach(f=>f.stop()),r=null)},l=()=>{if(a&&a.state==="recording"){a.stop();return}c(),e(null)};return{start:async()=>{var f,p;if(!((f=navigator.mediaDevices)!=null&&f.getDisplayMedia))throw new Error("Screen recording is not supported in this browser.");r=await navigator.mediaDevices.getDisplayMedia({video:{displaySurface:"browser"},audio:!1,preferCurrentTab:!0,selfBrowserSurface:"include"}),i=[],a=new MediaRecorder(r,{mimeType:MediaRecorder.isTypeSupported("video/webm;codecs=vp9")?"video/webm;codecs=vp9":"video/webm"}),a.ondataavailable=y=>{y.data&&y.data.size&&i.push(y.data)},a.onstop=()=>{const y=i.length?new Blob(i,{type:a.mimeType||"video/webm"}):null;c(),e(y)},(p=r.getVideoTracks()[0])==null||p.addEventListener("ended",()=>l()),a.start(),o=setTimeout(l,tr)},stop:l}}function nr(){const t=new Set;return{alloc(){let e=1;for(;t.has(e);)e+=1;return t.add(e),e},free(e){const n=Number(e);Number.isInteger(n)&&n>0&&t.delete(n)},peekUsed(){return[...t].sort((e,n)=>e-n)}}}const vt={x:0,y:0,w:1,h:1};function xt(){const t=nr();let e=[],n={...vt},r=1;return{list:()=>e.filter(i=>ir(i,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(i){return n=rr(i),n},resetCrop(){return n={...vt},n},isCropped(){return n.x>1e-6||n.y>1e-6||n.w<.999999||n.h<.999999},add(i,o){const c={id:`s${r++}`,type:i,number:t.alloc(),x:.2,y:.2,w:i==="arrow"?.2:.22,h:i==="arrow"?.05:.16,x2:.4,y2:.28,...o};return e.push(c),c},update(i,o){const c=e.find(l=>l.id===i);return c?(Object.assign(c,o),c):null},remove(i){const o=e.findIndex(l=>l.id===i);if(o<0)return null;const[c]=e.splice(o,1);return t.free(c.number),c},reset(){for(e=[],n={...vt},r=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function rr(t){const e=Math.min(Math.max(t.x,0),.95),n=Math.min(Math.max(t.y,0),.95),r=Math.min(Math.max(t.w,.05),1-e),a=Math.min(Math.max(t.h,.05),1-n);return{x:e,y:n,w:r,h:a}}function ir(t,e){const n=t.type==="arrow"?(t.x+(t.x2??t.x))/2:t.x+(t.w||0)/2,r=t.type==="arrow"?(t.y+(t.y2??t.y))/2:t.y+(t.h||0)/2;return n>=e.x&&r>=e.y&&n<=e.x+e.w&&r<=e.y+e.h}function Et(t){const e=Math.max(1,Number(t)||1);return{stroke:Math.max(2,e*.0075),badgeRadius:Math.max(8,e*.025),fontSize:Math.max(10,e*.0275),arrowHead:Math.max(8,e*.035),arrowHeadAngle:.4}}function ar(t,{stickers:e=[],crop:n={x:0,y:0,w:1,h:1},width:r,height:a,colors:i={}}){const o=i.mark||"#fdd341",c=i.markText||"#2a2140",l=Et(r);t.save(),t.lineWidth=l.stroke,t.lineCap="round",t.lineJoin="round",t.strokeStyle=o,t.fillStyle=o,t.font=`700 ${Math.round(l.fontSize)}px ui-sans-serif, system-ui, sans-serif`,e.forEach(u=>{const f=Ct(u.x,n,r),p=Mt(u.y,n,a),y=u.w/n.w*r,v=u.h/n.h*a,P=l.stroke/2;if(u.type==="rect")t.strokeRect(f+P,p+P,Math.max(0,y-l.stroke),Math.max(0,v-l.stroke));else if(u.type==="circle")t.beginPath(),t.ellipse(f+y/2,p+v/2,Math.max(.5,y/2-P),Math.max(.5,v/2-P),0,0,Math.PI*2),t.stroke();else if(u.type==="arrow"){const X=Ct(u.x2??u.x+u.w,n,r),Y=Mt(u.y2??u.y,n,a);sr(t,f,p,X,Y,l)}if(u.number==null||u.number==="")return;const F=or(u,n,r,a,f,p,y),nt=String(u.number);t.beginPath(),t.arc(F.x,F.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=o,t.fill(),t.fillStyle=c,t.textAlign="center",t.textBaseline="middle",t.fillText(nt,F.x,F.y+.5),t.fillStyle=o}),t.restore()}function Ct(t,e,n){return(t-e.x)/e.w*n}function Mt(t,e,n){return(t-e.y)/e.h*n}function or(t,e,n,r,a,i,o){if(t.type==="arrow"){const c=Ct(t.x2??t.x+t.w,e,n),l=Mt(t.y2??t.y,e,r);return{x:(a+c)/2,y:(i+l)/2}}return{x:a+o/2,y:i}}function he(t,e,n,r,a){const i=Math.atan2(r-e,n-t),o=a.arrowHead,c=Math.min(a.stroke,o*.2),l=n,u=r,f=n-Math.cos(i)*o,p=r-Math.sin(i)*o,y={x:l-o*Math.cos(i-a.arrowHeadAngle),y:u-o*Math.sin(i-a.arrowHeadAngle)},v={x:l-o*Math.cos(i+a.arrowHeadAngle),y:u-o*Math.sin(i+a.arrowHeadAngle)},P={x:n-Math.cos(i)*c,y:r-Math.sin(i)*c};return{angle:i,tipX:l,tipY:u,baseX:f,baseY:p,left:y,right:v,shaftEnd:P}}function sr(t,e,n,r,a,i){const o=he(e,n,r,a,i);t.beginPath(),t.moveTo(e,n),t.lineTo(o.shaftEnd.x,o.shaftEnd.y),t.stroke(),t.beginPath(),t.moveTo(o.tipX,o.tipY),t.lineTo(o.left.x,o.left.y),t.lineTo(o.right.x,o.right.y),t.closePath(),t.fill()}function cr(t,e,n,r={}){return new Promise((a,i)=>{const o=new Image;o.onload=()=>{const c=Math.round(e.x*o.width),l=Math.round(e.y*o.height),u=Math.max(1,Math.round(e.w*o.width)),f=Math.max(1,Math.round(e.h*o.height)),p=document.createElement("canvas");p.width=u,p.height=f;const y=p.getContext("2d");y.drawImage(o,c,l,u,f,0,0,u,f),ar(y,{stickers:n,crop:e,width:u,height:f,colors:r}),p.toBlob(v=>{if(!v){i(new Error("Could not encode screenshot"));return}a(v)},"image/png")},o.onerror=()=>i(new Error("Could not load screenshot")),o.src=t})}const N=[{id:"bug",label:"Bug"},{id:"idea",label:"Idea"},{id:"other",label:"Other"}];function pe(t){return String(t||"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32)}function At(t){const e=String(t||"").trim();return e?e.split(/[-_\s]+/).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" "):""}function lr(t){if(!Array.isArray(t)||!t.length)return N.map(r=>({...r}));const e=new Set,n=[];for(const r of t){let a="",i="";typeof r=="string"||typeof r=="number"?(a=pe(r),i=At(a)):r&&typeof r=="object"&&(a=pe(r.id??r.value??r.kind),i=String(r.label||r.name||At(a)).trim()||At(a)),!(!a||e.has(a))&&(e.add(a),n.push({id:a,label:i}))}return n.length?n:N.map(r=>({...r}))}function st(t){var n;const e=Array.isArray(t)&&t.length?t:N;return e.some(r=>r.id==="bug")?"bug":((n=e[0])==null?void 0:n.id)||"other"}const ur=["maker","all-business","brighter-day","quiet-night"],me="maker",dr=new Set(["crop","arrow","rect","circle"]),Lt=.02,ye=.05,fr=`
3
3
  <svg class="nf-launcher-icon" viewBox="0 0 24 24" aria-hidden="true">
4
4
  <path fill="currentColor" d="M5.2 2.8h9.1A2.7 2.7 0 0 1 17 5.5v8.2c0 .4-.3.7-.7.7h-.1a.7.7 0 0 1-.7-.7V5.5c0-.7-.6-1.3-1.3-1.3H5.2c-.7 0-1.3.6-1.3 1.3v12.2c0 .7.6 1.3 1.3 1.3h6.4a.7.7 0 0 1 0 1.4H5.2A2.7 2.7 0 0 1 2.5 17.7V5.5A2.7 2.7 0 0 1 5.2 2.8zm1.6 4.2a.7.7 0 0 0 0 1.4h6.2a.7.7 0 0 0 0-1.4H6.8zm0 3.2a.7.7 0 0 0 0 1.4h6.2a.7.7 0 0 0 0-1.4H6.8zm0 3.2a.7.7 0 0 0 0 1.4h3.6a.7.7 0 0 0 0-1.4H6.8z"/>
5
5
  <path fill="currentColor" d="M14.7 13.05 20.2 7.55a1.55 1.55 0 0 1 2.2 2.2l-5.5 5.5-.45 1.9a.6.6 0 0 1-.72.45l-1.9-.45.87-1.9z"/>
6
6
  </svg>
7
- `;function I(t){return`<svg class="nf-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${t}</svg>`}const P={crop:I('<path d="M6 3v5H1M18 21v-5h5M8 5h8a2 2 0 0 1 2 2v8M16 19H8a2 2 0 0 1-2-2V8"/>'),resetCrop:I('<path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/>'),arrow:I('<path d="M5 19 19 5"/><path d="M9 5h10v10"/>'),rect:I('<rect x="4" y="6" width="16" height="12" rx="1.5"/>'),circle:I('<circle cx="12" cy="12" r="8"/>'),discard:I('<path d="M4 7h16"/><path d="M9 7V5h6v2"/><path d="M6 7l1 13h10l1-13"/>'),audio:I('<rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><path d="M12 18v3"/>'),video:I('<rect x="3" y="7" width="13" height="10" rx="2"/><path d="M16 10.5 21 8v8l-5-2.5z"/>')},ue=Un();ue.hook();const de=10,tr=80,fe="notefully.author",vt="Anonymous";let d={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:ce,video:!1,consoleLogLimit:de,kinds:B.map(t=>({...t}))},L={},f=null,s={},m=oe(),S="",K="",T=null,U=rt(B),O=null,R=null,w=null,b=null,it=null,j=null,X=null,H={w:0,h:0},xt=!1,Et=!1;function g(t){return f.querySelector(t)}function he(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return Jn.includes(e)?e:ce}function me(t,e){return f&&getComputedStyle(f).getPropertyValue(t).trim()||e}async function er(t){return(await fetch(t)).blob()}function v(t,e=!1){s.status&&(s.status.textContent=t||"",it&&(clearTimeout(it),it=null),t&&!e&&(it=setTimeout(()=>{s.status.textContent=""},4e3)))}function Mt(){return f&&document.body.contains(f)||(f=document.createElement("div"),f.id="notefully",f.innerHTML=`
8
- <button class="nf-launcher" type="button" title="Leave a note…" aria-label="Leave a note…">${Zn}</button>
7
+ `;function k(t){return`<svg class="nf-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${t}</svg>`}const L={crop:k('<path d="M6 3v5H1M18 21v-5h5M8 5h8a2 2 0 0 1 2 2v8M16 19H8a2 2 0 0 1-2-2V8"/>'),resetCrop:k('<path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/>'),arrow:k('<path d="M5 19 19 5"/><path d="M9 5h10v10"/>'),rect:k('<rect x="4" y="6" width="16" height="12" rx="1.5"/>'),circle:k('<circle cx="12" cy="12" r="8"/>'),discard:k('<path d="M4 7h16"/><path d="M9 7V5h6v2"/><path d="M6 7l1 13h10l1-13"/>'),recapture:k('<path d="M4 8h3l2-2h6l2 2h3v11H4z"/><circle cx="12" cy="13" r="3.5"/>'),audio:k('<rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><path d="M12 18v3"/>'),video:k('<rect x="3" y="7" width="13" height="10" rx="2"/><path d="M16 10.5 21 8v8l-5-2.5z"/>')},ge=Qn();ge.hook();const we=10,hr=80,be="notefully.author",Rt="Anonymous";let d={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:me,video:!1,consoleLogLimit:we,kinds:N.map(t=>({...t})),capture:null,onBeforeCapture:null},$t=!1,R={},h=null,s={},m=xt(),$="",q="",T=null,j=st(N),H=null,A=null,w=null,b=null,ct=null,_=null,J=null,I={w:0,h:0},Tt=!1,Pt=!1;function g(t){return h.querySelector(t)}function Se(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return ur.includes(e)?e:me}function ve(t,e){return h&&getComputedStyle(h).getPropertyValue(t).trim()||e}async function pr(t){return(await fetch(t)).blob()}function S(t,e=!1){s.status&&(s.status.textContent=t||"",ct&&(clearTimeout(ct),ct=null),t&&!e&&(ct=setTimeout(()=>{s.status.textContent=""},4e3)))}function kt(){return h&&document.body.contains(h)||(h=document.createElement("div"),h.id="notefully",h.innerHTML=`
8
+ <button class="nf-launcher" type="button" title="Leave a note…" aria-label="Leave a note…">${fr}</button>
9
9
  <div class="nf-dialog" hidden>
10
10
  <div class="nf-panel">
11
11
  <div class="nf-panel-body">
12
- <div class="nf-stage">
12
+ <div class="nf-stage" hidden>
13
13
  <div class="nf-palette">
14
- <button class="nf-tool nf-icon-btn" type="button" data-tool="crop" title="Crop" aria-label="Crop">${P.crop}</button>
15
- <button class="nf-reset-crop nf-icon-btn" type="button" title="Reset crop" aria-label="Reset crop" hidden>${P.resetCrop}</button>
16
- <button class="nf-tool nf-icon-btn" type="button" data-tool="arrow" title="Arrow" aria-label="Arrow">${P.arrow}</button>
17
- <button class="nf-tool nf-icon-btn" type="button" data-tool="rect" title="Rectangle" aria-label="Rectangle">${P.rect}</button>
18
- <button class="nf-tool nf-icon-btn" type="button" data-tool="circle" title="Circle" aria-label="Circle">${P.circle}</button>
19
- <button class="nf-discard-shot nf-icon-btn" type="button" title="Discard screenshot" aria-label="Discard screenshot">${P.discard}</button>
14
+ <button class="nf-tool nf-icon-btn" type="button" data-tool="crop" title="Crop" aria-label="Crop">${L.crop}</button>
15
+ <button class="nf-reset-crop nf-icon-btn" type="button" title="Reset crop" aria-label="Reset crop" hidden>${L.resetCrop}</button>
16
+ <button class="nf-tool nf-icon-btn" type="button" data-tool="arrow" title="Arrow" aria-label="Arrow">${L.arrow}</button>
17
+ <button class="nf-tool nf-icon-btn" type="button" data-tool="rect" title="Rectangle" aria-label="Rectangle">${L.rect}</button>
18
+ <button class="nf-tool nf-icon-btn" type="button" data-tool="circle" title="Circle" aria-label="Circle">${L.circle}</button>
19
+ <button class="nf-discard-shot nf-icon-btn" type="button" title="Discard screenshot" aria-label="Discard screenshot">${L.discard}</button>
20
+ <button class="nf-recapture nf-icon-btn" type="button" title="Recapture screenshot" aria-label="Recapture screenshot">${L.recapture}</button>
20
21
  </div>
21
22
  <div class="nf-canvas"></div>
22
23
  </div>
@@ -24,9 +25,9 @@ var Notefully=(function(C){"use strict";function Ie(t,e){if(t.match(/^[a-z]+:\/\
24
25
  <input class="nf-author" type="text" name="author" autocomplete="nickname" placeholder="Anonymous" aria-label="Author">
25
26
  <div class="nf-kind"></div>
26
27
  <div class="nf-actions">
27
- <button class="nf-restore nf-icon-btn" type="button" title="Restore screenshot" aria-label="Restore screenshot" hidden>${P.resetCrop}</button>
28
- <button class="nf-audio nf-icon-btn" type="button" title="Record audio" aria-label="Record audio">${P.audio}</button>
29
- <button class="nf-video nf-icon-btn" type="button" title="Record video" aria-label="Record video">${P.video}</button>
28
+ <button class="nf-restore nf-icon-btn" type="button" title="Restore screenshot" aria-label="Restore screenshot" hidden>${L.resetCrop}</button>
29
+ <button class="nf-audio nf-icon-btn" type="button" title="Record audio" aria-label="Record audio">${L.audio}</button>
30
+ <button class="nf-video nf-icon-btn" type="button" title="Record video" aria-label="Record video">${L.video}</button>
30
31
  <button class="nf-submit" type="button">Submit</button>
31
32
  </div>
32
33
  <div class="nf-status"></div>
@@ -35,8 +36,8 @@ var Notefully=(function(C){"use strict";function Ie(t,e){if(t.match(/^[a-z]+:\/\
35
36
  </div>
36
37
  </div>
37
38
  <button class="nf-stop-video" type="button" hidden>Stop</button>
38
- `,document.body.appendChild(f),s={launcher:g(".nf-launcher"),dialog:g(".nf-dialog"),panel:g(".nf-panel"),panelBody:g(".nf-panel-body"),successMsg:g(".nf-success-msg"),stage:g(".nf-stage"),canvas:g(".nf-canvas"),text:g(".nf-text"),author:g(".nf-author"),restore:g(".nf-restore"),status:g(".nf-status"),audio:g(".nf-audio"),video:g(".nf-video"),discard:g(".nf-discard-shot"),stop:g(".nf-stop-video"),resetCrop:g(".nf-reset-crop"),submit:g(".nf-submit"),shot:null},nr(),Y()),f}function Y(){var t;f&&(f.dataset.theme=he(d.theme),d.hideLauncher?f.setAttribute("data-nf-hidden-launcher",""):f.removeAttribute("data-nf-hidden-launcher"),s.video&&(s.video.hidden=!d.video),ye(),(t=s.dialog)!=null&&t.hidden&&ot())}function ot(){s.launcher&&(s.launcher.hidden=!!d.hideLauncher)}function nr(){s.launcher.addEventListener("click",()=>It()),g(".nf-dialog").addEventListener("click",e=>{Et||e.target===s.dialog&&V()}),f.querySelectorAll(".nf-tool").forEach(e=>{e.addEventListener("click",()=>At(e.dataset.tool))}),s.resetCrop.addEventListener("click",lr),s.canvas.addEventListener("pointerdown",ir),s.canvas.addEventListener("dragstart",e=>e.preventDefault());const t=g(".nf-kind");t&&t.addEventListener("click",e=>{const n=e.target.closest("[data-kind]");n&&Ct(n.dataset.kind)}),s.discard.addEventListener("click",ur),s.restore.addEventListener("click",dr),s.audio.addEventListener("click",fr),s.video.addEventListener("click",hr),s.stop.addEventListener("click",()=>X==null?void 0:X.stop()),g(".nf-submit").addEventListener("click",()=>{Ot().catch(e=>v(e.message||"Submit failed."))}),ye(),At(null)}function pe(t){return String(t||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function ye(){const t=f==null?void 0:f.querySelector(".nf-kind");if(!t)return;const e=Array.isArray(d.kinds)&&d.kinds.length?d.kinds:B;t.innerHTML=e.map(o=>`<button type="button" data-kind="${pe(o.id)}">${pe(o.label)}</button>`).join("");const r=e.map(o=>o.id).includes(U)?U:rt(e);Ct(r)}function Ct(t){U=(d.kinds||B).map(n=>n.id).includes(t)?t:rt(d.kinds),f==null||f.querySelectorAll("[data-kind]").forEach(n=>{n.dataset.active=String(n.dataset.kind===U)})}function At(t){O=Qn.has(t)?t:null,R=null,f.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===O)}),s.canvas&&(s.canvas.dataset.draw=O?"true":"false"),S&&A()}function ge(t){return Math.min(1,Math.max(0,t))}function G(){return s.shot||s.canvas}function at(t){const e=G().getBoundingClientRect();return{x:ge((t.clientX-e.left)/Math.max(e.width,1)),y:ge((t.clientY-e.top)/Math.max(e.height,1))}}function rr(t){const e=G().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function we(t){const e=at(t),n=m.crop();return{x:n.x+e.x*n.w,y:n.y+e.y*n.h}}function st(t,e){const n=Math.min(t.x,e.x),r=Math.min(t.y,e.y);return{x:n,y:r,w:Math.max(St,Math.abs(e.x-t.x)),h:Math.max(St,Math.abs(e.y-t.y))}}function Lt(t){f&&(t?f.dataset.grabbing="true":delete f.dataset.grabbing)}function Rt(t){try{s.canvas.setPointerCapture(t.pointerId)}catch{}}function $t(){window.addEventListener("pointermove",Se),window.addEventListener("pointerup",ct),window.addEventListener("pointercancel",ct)}function be(){window.removeEventListener("pointermove",Se),window.removeEventListener("pointerup",ct),window.removeEventListener("pointercancel",ct)}function ir(t){if(t.button!==0||!S)return;if(!t.target.closest(".nf-sticker")&&!rr(t)){R=null,A();return}const e=t.target.closest(".nf-handle"),n=t.target.closest(".nf-sticker");if(n&&n.dataset.preview!=="true"){t.preventDefault(),t.stopPropagation(),R=n.dataset.id,Rt(t),or({kind:"sticker",id:R,dir:(e==null?void 0:e.dataset.dir)||"move"},t),A();return}if(R=null,O==="crop"){t.preventDefault(),Rt(t),w={kind:"crop",start:at(t),current:at(t)},$t(),A();return}if(O==="arrow"||O==="rect"||O==="circle"){t.preventDefault(),Rt(t);const r=we(t);w={kind:"sticker",type:O,start:r,current:r},$t(),A();return}A()}function or(t,e){e.preventDefault(),e.stopPropagation();const n=G().getBoundingClientRect(),r=m.list().find(o=>o.id===t.id);b={...t,startX:e.clientX,startY:e.clientY,crop:m.crop(),sticker:r?{...r}:null,rect:n},Lt(t.dir==="move"||t.dir==="start"||t.dir==="end"),$t()}function Se(t){if(w){w.current=w.kind==="crop"?at(t):we(t),A();return}if(!b)return;const e=(t.clientX-b.startX)/b.rect.width*b.crop.w,n=(t.clientY-b.startY)/b.rect.height*b.crop.h,r=b.sticker;if(r){if(b.dir==="end")m.update(r.id,{x2:r.x2+e,y2:r.y2+n});else if(b.dir==="start")m.update(r.id,{x:r.x+e,y:r.y+n});else if(b.dir==="move")m.update(r.id,{x:r.x+e,y:r.y+n,x2:(r.x2||r.x)+e,y2:(r.y2||r.y)+n});else{const o={x:r.x,y:r.y,w:r.w,h:r.h};ar(o,b.dir,e,n),m.update(r.id,o)}A()}}function ar(t,e,n,r){if(e.includes("e")&&(t.w=Math.max(.04,t.w+n)),e.includes("s")&&(t.h=Math.max(.04,t.h+r)),e.includes("w")){const o=Math.max(.04,t.w-n);t.x+=t.w-o,t.w=o}if(e.includes("n")){const o=Math.max(.04,t.h-r);t.y+=t.h-o,t.h=o}}function ct(t){if(be(),Lt(!1),w){sr();return}if(b){if(b.kind==="sticker"){const e=s.canvas.getBoundingClientRect();(t.clientX<e.left-24||t.clientX>e.right+24||t.clientY<e.top-24||t.clientY>e.bottom+24)&&(m.remove(b.id),R=null)}b=null,A()}}function sr(){const t=w;if(w=null,!t)return;if(t.kind==="crop"){const n=st(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<le||Math.abs(t.current.y-t.start.y)<le){A();return}const o=m.crop();m.setCrop({x:o.x+n.x*o.w,y:o.y+n.y*o.h,w:n.w*o.w,h:n.h*o.h}),J();return}const e=cr(t);e&&(R=e.id),A()}function cr(t){if(t.type==="arrow"){const e=t.current.x-t.start.x,n=t.current.y-t.start.y;return Math.hypot(e,n)<St?m.add("arrow",{x:t.start.x,y:t.start.y,x2:t.start.x+.12,y2:t.start.y,w:.12,h:.02}):m.add("arrow",{x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(e),h:Math.abs(n)})}return m.add(t.type,st(t.start,t.current))}function lr(){m.resetCrop(),R=null,J()}function Pt(){s.resetCrop&&(s.resetCrop.hidden=!m.isCropped())}function Tt(t){if(!s.audio)return;const e=t?"Stop audio":"Record audio";s.audio.title=e,s.audio.setAttribute("aria-label",e),s.audio.dataset.active=String(!!t)}function ur(){S&&(K=S),S="",s.stage.hidden=!0,s.restore.hidden=!K}function dr(){K&&(S=K,s.stage.hidden=!1,s.restore.hidden=!0,J())}function fr(){try{if(j||(j=jn(e=>{const n=s.text.value.trim();s.text.value=n?`${n} ${e}`:e})),!j.isSupported()){v("Audio-to-text is not supported in this browser.");return}const t=j.start();Tt(t),v(t?"Listening…":"")}catch(t){v(t.message)}}async function hr(){if(!d.video){v("Video is disabled on this host.");return}s.dialog.hidden=!0,s.stop.hidden=!1,Y(),s.launcher.hidden=!0,X=_n({onStart(){},onStop(t){T=t,s.stop.hidden=!0,ot(),s.dialog.hidden=!1,J(),v(t?"Video attached.":"Recording cancelled.")},onError(t){v(t.message)}});try{await X.start()}catch(t){s.stop.hidden=!0,ot(),s.dialog.hidden=!1,v(t.message)}}function J(){if(s.shot=null,!S){s.canvas.style.removeProperty("--nf-shot-aspect"),s.canvas.style.removeProperty("aspect-ratio"),s.canvas.innerHTML=T?`<video class="nf-recording-preview" controls src="${URL.createObjectURL(T)}"></video>`:"",Pt();return}s.canvas.innerHTML=`<div class="nf-shot"><img alt="Screenshot" src="${S}" draggable="false"></div>`,s.shot=s.canvas.querySelector(".nf-shot");const t=s.shot.querySelector("img");t.draggable=!1,t.addEventListener("dragstart",n=>n.preventDefault());const e=()=>{mr(t),A()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function mr(t){const e=t.naturalWidth||H.w,n=t.naturalHeight||H.h;if(e&&n&&(H={w:e,h:n},s.canvas.style.setProperty("--nf-shot-aspect",String(e/n)),s.canvas.style.aspectRatio=`${e} / ${n}`),!s.shot||!H.w||!H.h)return;const r=m.crop(),o=H.w/H.h,i=r.w/r.h*o,a=Math.min(1,i/o),c=Math.min(1,o/i);s.shot.style.left=`${(1-a)/2*100}%`,s.shot.style.top=`${(1-c)/2*100}%`,s.shot.style.width=`${a*100}%`,s.shot.style.height=`${c*100}%`,t.style.width=`${100/r.w}%`,t.style.height=`${100/r.h}%`,t.style.left=`${-r.x/r.w*100}%`,t.style.top=`${-r.y/r.h*100}%`}function pr(t){return t.type==="arrow"?{id:"preview",type:"arrow",number:"",x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(t.current.x-t.start.x),h:Math.abs(t.current.y-t.start.y)}:{id:"preview",type:t.type,number:"",...st(t.start,t.current)}}function A(){if((s.shot||s.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(i=>i.remove()),!S||!s.shot){Pt();return}const e=m.crop(),n=G(),r=yt(n.clientWidth||400);if(s.shot.style.setProperty("--nf-anno-stroke",`${r.stroke}px`),s.shot.style.setProperty("--nf-anno-badge",`${r.badgeRadius*2}px`),s.shot.style.setProperty("--nf-anno-badge-font",`${r.fontSize}px`),s.shot.style.setProperty("--nf-anno-handle",`${Math.max(8,r.stroke*2.5)}px`),(w==null?void 0:w.kind)==="crop"){const i=document.createElement("div");i.className="nf-crop",ve(i,st(w.start,w.current),{x:0,y:0,w:1,h:1}),s.shot.appendChild(i)}const o=m.list().slice();if((w==null?void 0:w.kind)==="sticker"&&o.push(pr(w)),o.forEach(i=>{const a=i.id==="preview",c=!a&&i.id===R,l=document.createElement("div");if(l.className=`nf-sticker nf-${i.type}`,l.dataset.id=i.id,c&&(l.dataset.selected="true"),a&&(l.dataset.preview="true"),i.type==="arrow"?yr(l,i,e,c,r):(ve(l,i,e),c&&["nw","ne","sw","se"].forEach(u=>kt(l,u))),!a&&i.number){const u=document.createElement("span");u.className="nf-badge",u.textContent=String(i.number),l.appendChild(u)}s.shot.appendChild(l)}),s.canvas.querySelectorAll(":scope > .nf-recording-preview").forEach(i=>i.remove()),T){const i=document.createElement("video");i.className="nf-recording-preview",i.controls=!0,i.src=URL.createObjectURL(T),i.style.position="absolute",i.style.right="8px",i.style.bottom="8px",i.style.width="160px",s.canvas.appendChild(i)}Pt()}function yr(t,e,n,r,o=yt(400)){const i=G(),a=i.clientWidth,c=i.clientHeight,l=(e.x-n.x)/n.w*a,u=(e.y-n.y)/n.h*c,h=((e.x2??e.x+e.w)-n.x)/n.w*a,p=((e.y2??e.y)-n.y)/n.h*c,y=Math.max(18,o.arrowHead+o.stroke*2),x=Math.min(l,h)-y,$=Math.min(u,p)-y,F=Math.max(2,Math.abs(h-l))+y*2,Q=Math.max(2,Math.abs(p-u))+y*2,z=l-x,q=u-$,Ht=h-x,Ft=p-$,D=ae(z,q,Ht,Ft,o),W=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${x}px`,t.style.top=`${$}px`,t.style.width=`${F}px`,t.style.height=`${Q}px`,W.setAttribute("class","nf-arrow-svg"),W.setAttribute("viewBox",`0 0 ${F} ${Q}`),W.setAttribute("width",String(F)),W.setAttribute("height",String(Q)),W.innerHTML=`
39
- <line class="nf-arrow-hit" x1="${z}" y1="${q}" x2="${Ht}" y2="${Ft}" />
40
- <line class="nf-arrow-shaft" x1="${z}" y1="${q}" x2="${D.shaftEnd.x}" y2="${D.shaftEnd.y}" />
41
- <polygon class="nf-arrow-head" points="${D.tipX},${D.tipY} ${D.left.x},${D.left.y} ${D.right.x},${D.right.y}" />
42
- `,t.appendChild(W),r&&(kt(t,"start",{left:z-5,top:q-5}),kt(t,"end",{left:Ht-5,top:Ft-5}))}function kt(t,e,n){const r=document.createElement("span");r.className="nf-handle",r.dataset.dir=e,n&&(r.style.left=`${n.left}px`,r.style.top=`${n.top}px`),t.appendChild(r)}function ve(t,e,n){t.style.left=`${(e.x-n.x)/n.w*100}%`,t.style.top=`${(e.y-n.y)/n.h*100}%`,t.style.width=`${e.w/n.w*100}%`,t.style.height=`${e.h/n.h*100}%`}function gr(){try{return String(localStorage.getItem(fe)||"").trim()}catch{return""}}function wr(t){const e=String(t||"").trim();if(!(!e||e===vt))try{localStorage.setItem(fe,e)}catch{}}function xe(){return!!(String(L.userId||"").trim()||String(L.email||"").trim()||String(L.displayName||"").trim())}function br(){return String(L.displayName||L.email||L.userId||"").trim()}function Sr(){var e;if(xe())return br()||vt;const t=String(((e=s.author)==null?void 0:e.value)||"").trim();return t?(wr(t),t):vt}function Ee(){if(!s.author)return;const t=xe();if(s.author.hidden=t,t){s.author.value="";return}s.author.value=gr()}function Me(t,e=de){const n=Number(t);return Number.isFinite(n)?Math.min(tr,Math.max(0,Math.floor(n))):e}function Ce(t={}){Dn(t);const e=Object.prototype.hasOwnProperty.call(t,"kinds");d={...d,endpoint:String(t.endpoint||d.endpoint||"").replace(/\/$/,""),projectKey:t.projectKey==null?d.projectKey:String(t.projectKey),version:t.version==null?d.version:String(t.version),name:t.name==null?d.name:String(t.name||""),targets:t.targets===void 0?d.targets:t.targets,hideLauncher:t.hideLauncher==null?d.hideLauncher:!!t.hideLauncher,theme:he(t.theme??d.theme),video:t.video==null?d.video:!!t.video,consoleLogLimit:t.consoleLogLimit==null?d.consoleLogLimit:Me(t.consoleLogLimit,d.consoleLogLimit),kinds:e?Gn(t.kinds):d.kinds}}function lt(t={}){return Ce(t),f&&Y(),ut}function Ae(t={}){return Ce(t),Mt(),Y(),ut}function Le(t){return lt({theme:t})}function Re(t){const e=!!t;return!e&&f&&s.dialog&&!s.dialog.hidden&&V(),lt({hideLauncher:!e})}async function It(){Mt(),$e(),Y(),s.launcher.hidden=!0,m=oe(),H={w:0,h:0},T=null,R=null,w=null,b=null,U=rt(d.kinds),Ct(U),At(null),Tt(!1),s.text.value="",Ee(),v("");try{S=await kn(),K=S,s.stage.hidden=!1,s.restore.hidden=!0,v("")}catch{S="",v("Screenshot failed; you can still send text.")}s.dialog.hidden=!1,J(),s.text.focus()}function V(){f&&(j==null||j.stop(),Tt(!1),be(),w=null,b=null,Lt(!1),$e(),s.dialog.hidden=!0,s.stop.hidden=!0,ot())}function vr(){const t=s.dialog,e=s.panel,n=s.panelBody,r=s.successMsg;if(!t||!e||!n||!r)return Promise.resolve();Et=!0,v("");const o=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,i=e.getBoundingClientRect();if(n.hidden=!0,r.hidden=!1,t.classList.add("nf-success"),t.style.opacity="1",o)return new Promise(u=>{window.setTimeout(()=>u(),1e3)});const a=e.getBoundingClientRect(),c=a.width>0?i.width/a.width:1,l=a.height>0?i.height/a.height:1;return e.style.transformOrigin="center center",e.style.transition="none",e.style.transform=`scale(${c}, ${l})`,e.getBoundingClientRect(),new Promise(u=>{let h=!1;const p=()=>{h||(h=!0,e.removeEventListener("transitionend",y),window.setTimeout(()=>{t.style.transition="opacity 0.28s ease",t.style.opacity="0",window.setTimeout(()=>u(),280)},1e3))},y=x=>{x.target!==e||x.propertyName!=="transform"||p()};e.addEventListener("transitionend",y),requestAnimationFrame(()=>{e.style.transition="transform 0.48s cubic-bezier(0.22, 1, 0.36, 1)",e.style.transform="scale(1)"}),window.setTimeout(p,700)})}function $e(){Et=!1,s.dialog&&(s.dialog.classList.remove("nf-success"),s.dialog.style.opacity="",s.dialog.style.transition="",s.panel&&(s.panel.style.transform="",s.panel.style.transition="",s.panel.style.transformOrigin=""),s.panelBody&&(s.panelBody.hidden=!1),s.successMsg&&(s.successMsg.hidden=!0))}function Pe(t={}){L={...L,...Fn(t)},Ee()}async function Ot(){if(Mt(),xt)return null;const t=s.text.value.trim();if(!t&&!S&&!T)return v("Add a note, screenshot, or video first."),null;if(!d.endpoint||!d.projectKey)return v("Notefully is missing endpoint or projectKey."),null;xt=!0,Te(!0),v("Submitting…",!0);try{const e=Sr(),n=new FormData;if(n.append("message",t),n.append("kind",U),n.append("version",d.version||"0.0.0"),n.append("author",e),d.name&&n.append("name",d.name),n.append("context",JSON.stringify({...Hn({...L,displayName:L.displayName||e}),author:e,console:ue.snapshot().slice(-Me(d.consoleLogLimit))})),n.append("annotations",JSON.stringify(m.list())),n.append("crop",JSON.stringify(m.crop())),Array.isArray(d.targets)&&n.append("targets",JSON.stringify(d.targets)),S){const i=await er(S);if(n.append("screenshot",i,"screenshot.png"),m.list().length||m.isCropped()){const a=await Yn(S,m.crop(),m.list(),{mark:me("--nf-mark","#fdd341"),markText:me("--nf-mark-text","#2a2140")});n.append("screenshotBaked",a,"screenshot.baked.png")}}T&&n.append("recording",T,"recording.webm");const r=await fetch(`${d.endpoint}/v1/reports`,{method:"POST",headers:{"X-Notefully-Key":d.projectKey},body:n});let o=null;try{o=await r.json()}catch{o=null}if(!r.ok)throw v((o==null?void 0:o.error)||"Submit failed."),new Error((o==null?void 0:o.error)||`Submit failed (${r.status})`);return await vr(),V(),o}finally{xt=!1,Te(!1)}}function Te(t){s.submit&&(s.submit.disabled=!!t,s.submit.setAttribute("aria-busy",t?"true":"false"))}function ke(){V(),f==null||f.remove(),f=null,s={}}const ut={init:Ae,configure:lt,setTheme:Le,setVisible:Re,open:It,close:V,identify:Pe,submit:Ot,destroy:ke};return typeof window<"u"&&(window.Notefully=ut),C.close=V,C.configure=lt,C.default=ut,C.destroy=ke,C.identify=Pe,C.init=Ae,C.open=It,C.setTheme=Le,C.setVisible=Re,C.submit=Ot,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),C})({});
39
+ `,document.body.appendChild(h),s={launcher:g(".nf-launcher"),dialog:g(".nf-dialog"),panel:g(".nf-panel"),panelBody:g(".nf-panel-body"),successMsg:g(".nf-success-msg"),stage:g(".nf-stage"),palette:g(".nf-palette"),canvas:g(".nf-canvas"),text:g(".nf-text"),author:g(".nf-author"),actions:g(".nf-actions"),restore:g(".nf-restore"),status:g(".nf-status"),audio:g(".nf-audio"),video:g(".nf-video"),discard:g(".nf-discard-shot"),recapture:g(".nf-recapture"),stop:g(".nf-stop-video"),resetCrop:g(".nf-reset-crop"),submit:g(".nf-submit"),shot:null},mr(),Q()),h}function Q(){var t;h&&(h.dataset.theme=Se(d.theme),d.hideLauncher?h.setAttribute("data-nf-hidden-launcher",""):h.removeAttribute("data-nf-hidden-launcher"),s.video&&(s.video.hidden=!d.video),Ee(),(t=s.dialog)!=null&&t.hidden&&lt())}function lt(){s.launcher&&(s.launcher.hidden=!!d.hideLauncher)}function mr(){s.launcher.addEventListener("click",()=>Ut()),g(".nf-dialog").addEventListener("click",e=>{Pt||e.target===s.dialog&&K()}),h.querySelectorAll(".nf-tool").forEach(e=>{e.addEventListener("click",()=>Z(e.dataset.tool))}),s.resetCrop.addEventListener("click",xr),s.canvas.addEventListener("pointerdown",gr),s.canvas.addEventListener("dragstart",e=>e.preventDefault());const t=g(".nf-kind");t&&t.addEventListener("click",e=>{const n=e.target.closest("[data-kind]");n&&It(n.dataset.kind)}),s.discard.addEventListener("click",Er),s.recapture.addEventListener("click",()=>{Mr().catch(e=>S(e.message||"Recapture failed."))}),s.restore.addEventListener("click",Cr),s.audio.addEventListener("click",Ar),s.video.addEventListener("click",Lr),s.stop.addEventListener("click",()=>J==null?void 0:J.stop()),g(".nf-submit").addEventListener("click",()=>{Nt().catch(e=>S(e.message||"Submit failed."))}),Ee(),Z(null)}function xe(t){return String(t||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Ee(){const t=h==null?void 0:h.querySelector(".nf-kind");if(!t)return;const e=Array.isArray(d.kinds)&&d.kinds.length?d.kinds:N;t.innerHTML=e.map(a=>`<button type="button" data-kind="${xe(a.id)}">${xe(a.label)}</button>`).join("");const r=e.map(a=>a.id).includes(j)?j:st(e);It(r)}function It(t){j=(d.kinds||N).map(n=>n.id).includes(t)?t:st(d.kinds),h==null||h.querySelectorAll("[data-kind]").forEach(n=>{n.dataset.active=String(n.dataset.kind===j)})}function Z(t){H=dr.has(t)?t:null,A=null,h.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===H)}),s.canvas&&(s.canvas.dataset.draw=H?"true":"false"),D()&&M()}function Ce(t){return Math.min(1,Math.max(0,t))}function tt(){return s.shot||s.canvas}function ut(t){const e=tt().getBoundingClientRect();return{x:Ce((t.clientX-e.left)/Math.max(e.width,1)),y:Ce((t.clientY-e.top)/Math.max(e.height,1))}}function yr(t){const e=tt().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function Me(t){const e=ut(t),n=m.crop();return{x:n.x+e.x*n.w,y:n.y+e.y*n.h}}function dt(t,e){const n=Math.min(t.x,e.x),r=Math.min(t.y,e.y);return{x:n,y:r,w:Math.max(Lt,Math.abs(e.x-t.x)),h:Math.max(Lt,Math.abs(e.y-t.y))}}function Ot(t){h&&(t?h.dataset.grabbing="true":delete h.dataset.grabbing)}function Bt(t){try{s.canvas.setPointerCapture(t.pointerId)}catch{}}function Ht(){window.addEventListener("pointermove",Le),window.addEventListener("pointerup",ft),window.addEventListener("pointercancel",ft)}function Ae(){window.removeEventListener("pointermove",Le),window.removeEventListener("pointerup",ft),window.removeEventListener("pointercancel",ft)}function gr(t){if(t.button!==0||!D())return;if(!t.target.closest(".nf-sticker")&&!yr(t)){A=null,M();return}const e=t.target.closest(".nf-handle"),n=t.target.closest(".nf-sticker");if(n&&n.dataset.preview!=="true"){t.preventDefault(),t.stopPropagation(),A=n.dataset.id,Bt(t),wr({kind:"sticker",id:A,dir:(e==null?void 0:e.dataset.dir)||"move"},t),M();return}if(A=null,H==="crop"){t.preventDefault(),Bt(t),w={kind:"crop",start:ut(t),current:ut(t)},Ht(),M();return}if(H==="arrow"||H==="rect"||H==="circle"){t.preventDefault(),Bt(t);const r=Me(t);w={kind:"sticker",type:H,start:r,current:r},Ht(),M();return}M()}function wr(t,e){e.preventDefault(),e.stopPropagation();const n=tt().getBoundingClientRect(),r=m.list().find(a=>a.id===t.id);b={...t,startX:e.clientX,startY:e.clientY,crop:m.crop(),sticker:r?{...r}:null,rect:n},Ot(t.dir==="move"||t.dir==="start"||t.dir==="end"),Ht()}function Le(t){if(w){w.current=w.kind==="crop"?ut(t):Me(t),M();return}if(!b)return;const e=(t.clientX-b.startX)/b.rect.width*b.crop.w,n=(t.clientY-b.startY)/b.rect.height*b.crop.h,r=b.sticker;if(r){if(b.dir==="end")m.update(r.id,{x2:r.x2+e,y2:r.y2+n});else if(b.dir==="start")m.update(r.id,{x:r.x+e,y:r.y+n});else if(b.dir==="move")m.update(r.id,{x:r.x+e,y:r.y+n,x2:(r.x2||r.x)+e,y2:(r.y2||r.y)+n});else{const a={x:r.x,y:r.y,w:r.w,h:r.h};br(a,b.dir,e,n),m.update(r.id,a)}M()}}function br(t,e,n,r){if(e.includes("e")&&(t.w=Math.max(.04,t.w+n)),e.includes("s")&&(t.h=Math.max(.04,t.h+r)),e.includes("w")){const a=Math.max(.04,t.w-n);t.x+=t.w-a,t.w=a}if(e.includes("n")){const a=Math.max(.04,t.h-r);t.y+=t.h-a,t.h=a}}function ft(t){if(Ae(),Ot(!1),w){Sr();return}if(b){if(b.kind==="sticker"){const e=s.canvas.getBoundingClientRect();(t.clientX<e.left-24||t.clientX>e.right+24||t.clientY<e.top-24||t.clientY>e.bottom+24)&&(m.remove(b.id),A=null)}b=null,M()}}function Sr(){const t=w;if(w=null,!t)return;if(t.kind==="crop"){const n=dt(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<ye||Math.abs(t.current.y-t.start.y)<ye){M();return}const a=m.crop();m.setCrop({x:a.x+n.x*a.w,y:a.y+n.y*a.h,w:n.w*a.w,h:n.h*a.h}),V();return}const e=vr(t);e&&(A=e.id),M()}function vr(t){if(t.type==="arrow"){const e=t.current.x-t.start.x,n=t.current.y-t.start.y;return Math.hypot(e,n)<Lt?m.add("arrow",{x:t.start.x,y:t.start.y,x2:t.start.x+.12,y2:t.start.y,w:.12,h:.02}):m.add("arrow",{x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(e),h:Math.abs(n)})}return m.add(t.type,dt(t.start,t.current))}function xr(){m.resetCrop(),A=null,V()}function ht(){s.resetCrop&&(s.resetCrop.hidden=!m.isCropped())}function Dt(t){if(!s.audio)return;const e=t?"Stop audio":"Record audio";s.audio.title=e,s.audio.setAttribute("aria-label",e),s.audio.dataset.active=String(!!t)}function D(){return B($)}function et(){if(!s.stage||!s.palette||!s.actions||!s.recapture)return;const t=D();s.stage.hidden=!t&&!T,s.palette.hidden=!t,s.discard&&(s.discard.hidden=!t),s.restore&&(s.restore.hidden=t||!q),t?(s.palette.appendChild(s.discard),s.palette.appendChild(s.recapture)):s.audio?s.audio.after(s.recapture):s.actions.insertBefore(s.recapture,s.submit||null),s.recapture.hidden=!1}function Er(){D()&&(q=$),$="",Z(null),et(),V()}function Cr(){B(q)&&($=q,et(),V())}function Re(){return{capture:typeof d.capture=="function"?d.capture:void 0,onBeforeCapture:typeof d.onBeforeCapture=="function"?d.onBeforeCapture:void 0}}function $e(t){if(!B(t))throw new Error("Screenshot failed; you can still send text.");$=t,q=t,m=xt(),I={w:0,h:0},A=null,w=null,b=null,Z(null)}async function Mr(){if(!($t||!s.dialog||s.dialog.hidden)){$t=!0,s.recapture.disabled=!0,S("Capturing…",!0),s.dialog.hidden=!0;try{let t="";try{t=await zn()}catch{t=await se(Re())}$e(t),S("")}catch(t){S((t==null?void 0:t.message)||"Screenshot failed; you can still send text.")}finally{s.dialog.hidden=!1,s.recapture.disabled=!1,$t=!1,et(),V()}}}function Ar(){try{if(_||(_=Zn(e=>{const n=s.text.value.trim();s.text.value=n?`${n} ${e}`:e})),!_.isSupported()){S("Audio-to-text is not supported in this browser.");return}const t=_.start();Dt(t),S(t?"Listening…":"")}catch(t){S(t.message)}}async function Lr(){if(!d.video){S("Video is disabled on this host.");return}s.dialog.hidden=!0,s.stop.hidden=!1,Q(),s.launcher.hidden=!0,J=er({onStart(){},onStop(t){T=t,s.stop.hidden=!0,lt(),s.dialog.hidden=!1,et(),V(),S(t?"Video attached.":"Recording cancelled.")},onError(t){S(t.message)}});try{await J.start()}catch(t){s.stop.hidden=!0,lt(),s.dialog.hidden=!1,S(t.message)}}function V(){if(s.shot=null,!D()){s.canvas.style.removeProperty("--nf-shot-aspect"),s.canvas.style.removeProperty("aspect-ratio"),s.canvas.innerHTML=T?`<video class="nf-recording-preview" controls src="${URL.createObjectURL(T)}"></video>`:"",ht();return}s.canvas.innerHTML=`<div class="nf-shot"><img alt="Screenshot" src="${$}" draggable="false"></div>`,s.shot=s.canvas.querySelector(".nf-shot");const t=s.shot.querySelector("img");t.draggable=!1,t.addEventListener("dragstart",n=>n.preventDefault());const e=()=>{Rr(t),M()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e(),ht()}function Rr(t){const e=t.naturalWidth||I.w,n=t.naturalHeight||I.h;if(e&&n&&(I={w:e,h:n},s.canvas.style.setProperty("--nf-shot-aspect",String(e/n)),s.canvas.style.aspectRatio=`${e} / ${n}`),!s.shot||!I.w||!I.h)return;const r=m.crop(),a=I.w/I.h,i=r.w/r.h*a,o=Math.min(1,i/a),c=Math.min(1,a/i);s.shot.style.left=`${(1-o)/2*100}%`,s.shot.style.top=`${(1-c)/2*100}%`,s.shot.style.width=`${o*100}%`,s.shot.style.height=`${c*100}%`,t.style.width=`${100/r.w}%`,t.style.height=`${100/r.h}%`,t.style.left=`${-r.x/r.w*100}%`,t.style.top=`${-r.y/r.h*100}%`}function $r(t){return t.type==="arrow"?{id:"preview",type:"arrow",number:"",x:t.start.x,y:t.start.y,x2:t.current.x,y2:t.current.y,w:Math.abs(t.current.x-t.start.x),h:Math.abs(t.current.y-t.start.y)}:{id:"preview",type:t.type,number:"",...dt(t.start,t.current)}}function M(){if((s.shot||s.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(i=>i.remove()),!D()||!s.shot){ht();return}const e=m.crop(),n=tt(),r=Et(n.clientWidth||400);if(s.shot.style.setProperty("--nf-anno-stroke",`${r.stroke}px`),s.shot.style.setProperty("--nf-anno-badge",`${r.badgeRadius*2}px`),s.shot.style.setProperty("--nf-anno-badge-font",`${r.fontSize}px`),s.shot.style.setProperty("--nf-anno-handle",`${Math.max(8,r.stroke*2.5)}px`),(w==null?void 0:w.kind)==="crop"){const i=document.createElement("div");i.className="nf-crop",Te(i,dt(w.start,w.current),{x:0,y:0,w:1,h:1}),s.shot.appendChild(i)}const a=m.list().slice();if((w==null?void 0:w.kind)==="sticker"&&a.push($r(w)),a.forEach(i=>{const o=i.id==="preview",c=!o&&i.id===A,l=document.createElement("div");if(l.className=`nf-sticker nf-${i.type}`,l.dataset.id=i.id,c&&(l.dataset.selected="true"),o&&(l.dataset.preview="true"),i.type==="arrow"?Tr(l,i,e,c,r):(Te(l,i,e),c&&["nw","ne","sw","se"].forEach(u=>Ft(l,u))),!o&&i.number){const u=document.createElement("span");u.className="nf-badge",u.textContent=String(i.number),l.appendChild(u)}s.shot.appendChild(l)}),s.canvas.querySelectorAll(":scope > .nf-recording-preview").forEach(i=>i.remove()),T){const i=document.createElement("video");i.className="nf-recording-preview",i.controls=!0,i.src=URL.createObjectURL(T),i.style.position="absolute",i.style.right="8px",i.style.bottom="8px",i.style.width="160px",s.canvas.appendChild(i)}ht()}function Tr(t,e,n,r,a=Et(400)){const i=tt(),o=i.clientWidth,c=i.clientHeight,l=(e.x-n.x)/n.w*o,u=(e.y-n.y)/n.h*c,f=((e.x2??e.x+e.w)-n.x)/n.w*o,p=((e.y2??e.y)-n.y)/n.h*c,y=Math.max(18,a.arrowHead+a.stroke*2),v=Math.min(l,f)-y,P=Math.min(u,p)-y,F=Math.max(2,Math.abs(f-l))+y*2,nt=Math.max(2,Math.abs(p-u))+y*2,X=l-v,Y=u-P,jt=f-v,_t=p-P,U=he(X,Y,jt,_t,a),G=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${v}px`,t.style.top=`${P}px`,t.style.width=`${F}px`,t.style.height=`${nt}px`,G.setAttribute("class","nf-arrow-svg"),G.setAttribute("viewBox",`0 0 ${F} ${nt}`),G.setAttribute("width",String(F)),G.setAttribute("height",String(nt)),G.innerHTML=`
40
+ <line class="nf-arrow-hit" x1="${X}" y1="${Y}" x2="${jt}" y2="${_t}" />
41
+ <line class="nf-arrow-shaft" x1="${X}" y1="${Y}" x2="${U.shaftEnd.x}" y2="${U.shaftEnd.y}" />
42
+ <polygon class="nf-arrow-head" points="${U.tipX},${U.tipY} ${U.left.x},${U.left.y} ${U.right.x},${U.right.y}" />
43
+ `,t.appendChild(G),r&&(Ft(t,"start",{left:X-5,top:Y-5}),Ft(t,"end",{left:jt-5,top:_t-5}))}function Ft(t,e,n){const r=document.createElement("span");r.className="nf-handle",r.dataset.dir=e,n&&(r.style.left=`${n.left}px`,r.style.top=`${n.top}px`),t.appendChild(r)}function Te(t,e,n){t.style.left=`${(e.x-n.x)/n.w*100}%`,t.style.top=`${(e.y-n.y)/n.h*100}%`,t.style.width=`${e.w/n.w*100}%`,t.style.height=`${e.h/n.h*100}%`}function Pr(){try{return String(localStorage.getItem(be)||"").trim()}catch{return""}}function kr(t){const e=String(t||"").trim();if(!(!e||e===Rt))try{localStorage.setItem(be,e)}catch{}}function Pe(){return!!(String(R.userId||"").trim()||String(R.email||"").trim()||String(R.displayName||"").trim())}function Ir(){return String(R.displayName||R.email||R.userId||"").trim()}function Or(){var e;if(Pe())return Ir()||Rt;const t=String(((e=s.author)==null?void 0:e.value)||"").trim();return t?(kr(t),t):Rt}function ke(){if(!s.author)return;const t=Pe();if(s.author.hidden=t,t){s.author.value="";return}s.author.value=Pr()}function Ie(t,e=we){const n=Number(t);return Number.isFinite(n)?Math.min(hr,Math.max(0,Math.floor(n))):e}function Oe(t={}){Gn(t);const e=Object.prototype.hasOwnProperty.call(t,"kinds");d={...d,endpoint:String(t.endpoint||d.endpoint||"").replace(/\/$/,""),projectKey:t.projectKey==null?d.projectKey:String(t.projectKey),version:t.version==null?d.version:String(t.version),name:t.name==null?d.name:String(t.name||""),targets:t.targets===void 0?d.targets:t.targets,hideLauncher:t.hideLauncher==null?d.hideLauncher:!!t.hideLauncher,theme:Se(t.theme??d.theme),video:t.video==null?d.video:!!t.video,consoleLogLimit:t.consoleLogLimit==null?d.consoleLogLimit:Ie(t.consoleLogLimit,d.consoleLogLimit),kinds:e?lr(t.kinds):d.kinds,capture:t.capture===void 0?d.capture:t.capture,onBeforeCapture:t.onBeforeCapture===void 0?d.onBeforeCapture:t.onBeforeCapture}}function pt(t={}){return Oe(t),h&&Q(),mt}function Be(t={}){return Oe(t),kt(),Q(),mt}function He(t){return pt({theme:t})}function De(t){const e=!!t;return!e&&h&&s.dialog&&!s.dialog.hidden&&K(),pt({hideLauncher:!e})}async function Ut(){kt(),Fe(),Q(),s.launcher.hidden=!0,m=xt(),I={w:0,h:0},T=null,$="",q="",A=null,w=null,b=null,j=st(d.kinds),It(j),Z(null),Dt(!1),s.text.value="",ke(),S("");try{$e(await se(Re())),S("")}catch(t){$="",S((t==null?void 0:t.message)||"Screenshot failed; you can still send text.")}et(),s.dialog.hidden=!1,V(),s.text.focus()}function K(){h&&(_==null||_.stop(),Dt(!1),Ae(),w=null,b=null,Ot(!1),Fe(),s.dialog.hidden=!0,s.stop.hidden=!0,lt())}function Br(){const t=s.dialog,e=s.panel,n=s.panelBody,r=s.successMsg;if(!t||!e||!n||!r)return Promise.resolve();Pt=!0,S("");const a=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,i=e.getBoundingClientRect();if(n.hidden=!0,r.hidden=!1,t.classList.add("nf-success"),t.style.opacity="1",a)return new Promise(u=>{window.setTimeout(()=>u(),1e3)});const o=e.getBoundingClientRect(),c=o.width>0?i.width/o.width:1,l=o.height>0?i.height/o.height:1;return e.style.transformOrigin="center center",e.style.transition="none",e.style.transform=`scale(${c}, ${l})`,e.getBoundingClientRect(),new Promise(u=>{let f=!1;const p=()=>{f||(f=!0,e.removeEventListener("transitionend",y),window.setTimeout(()=>{t.style.transition="opacity 0.28s ease",t.style.opacity="0",window.setTimeout(()=>u(),280)},1e3))},y=v=>{v.target!==e||v.propertyName!=="transform"||p()};e.addEventListener("transitionend",y),requestAnimationFrame(()=>{e.style.transition="transform 0.48s cubic-bezier(0.22, 1, 0.36, 1)",e.style.transform="scale(1)"}),window.setTimeout(p,700)})}function Fe(){Pt=!1,s.dialog&&(s.dialog.classList.remove("nf-success"),s.dialog.style.opacity="",s.dialog.style.transition="",s.panel&&(s.panel.style.transform="",s.panel.style.transition="",s.panel.style.transformOrigin=""),s.panelBody&&(s.panelBody.hidden=!1),s.successMsg&&(s.successMsg.hidden=!0))}function Ue(t={}){R={...R,...Yn(t)},ke()}async function Nt(){if(kt(),Tt)return null;const t=s.text.value.trim();if(!t&&!D()&&!T)return S("Add a note, screenshot, or video first."),null;if(!d.endpoint||!d.projectKey)return S("Notefully is missing endpoint or projectKey."),null;Tt=!0,Ne(!0),S("Submitting…",!0);try{const e=Or(),n=new FormData;if(n.append("message",t),n.append("kind",j),n.append("version",d.version||"0.0.0"),n.append("author",e),d.name&&n.append("name",d.name),n.append("context",JSON.stringify({...Xn({...R,displayName:R.displayName||e}),author:e,console:ge.snapshot().slice(-Ie(d.consoleLogLimit))})),n.append("annotations",JSON.stringify(m.list())),n.append("crop",JSON.stringify(m.crop())),Array.isArray(d.targets)&&n.append("targets",JSON.stringify(d.targets)),D()){const i=await pr($);if(n.append("screenshot",i,"screenshot.png"),m.list().length||m.isCropped()){const o=await cr($,m.crop(),m.list(),{mark:ve("--nf-mark","#fdd341"),markText:ve("--nf-mark-text","#2a2140")});n.append("screenshotBaked",o,"screenshot.baked.png")}}T&&n.append("recording",T,"recording.webm");const r=await fetch(`${d.endpoint}/v1/reports`,{method:"POST",headers:{"X-Notefully-Key":d.projectKey},body:n});let a=null;try{a=await r.json()}catch{a=null}if(!r.ok)throw S((a==null?void 0:a.error)||"Submit failed."),new Error((a==null?void 0:a.error)||`Submit failed (${r.status})`);return await Br(),K(),a}finally{Tt=!1,Ne(!1)}}function Ne(t){s.submit&&(s.submit.disabled=!!t,s.submit.setAttribute("aria-busy",t?"true":"false"))}function je(){K(),h==null||h.remove(),h=null,s={}}const mt={init:Be,configure:pt,setTheme:He,setVisible:De,open:Ut,close:K,identify:Ue,submit:Nt,destroy:je};return typeof window<"u"&&(window.Notefully=mt),C.close=K,C.configure=pt,C.default=mt,C.destroy=je,C.identify=Ue,C.init=Be,C.open=Ut,C.setTheme=He,C.setVisible=De,C.submit=Nt,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),C})({});