@makefully/notefully 0.1.36 → 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
@@ -64,7 +64,7 @@ With `hideLauncher: true`, call `Notefully.open()` / `Notefully.submit()` from y
64
64
 
65
65
  ### Screenshots
66
66
 
67
- On open, Notefully captures the page automatically: optional `onBeforeCapture` / `capture` hooks first, then a canvas-aware DOM rasterize. Use the camera **Recapture** control to hide the dialog and grab a fresh frame via the browser share picker (`getDisplayMedia`); if that fails or is cancelled, it falls back to the same automatic path.
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
68
 
69
69
  ### Hosted relay
70
70
 
@@ -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-palette .nf-recapture{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
+ #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,23 +1,23 @@
1
- var Notefully=(function(M){"use strict";function Fe(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 Ue=(()=>{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 j=null;function Nt(t={}){return j||(t.includeStyleProperties?(j=t.includeStyleProperties,j):(j=O(window.getComputedStyle(document.documentElement)),j))}function Z(t,e){const r=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return r?parseFloat(r.replace("px","")):0}function Ne(t){const e=Z(t,"border-left-width"),n=Z(t,"border-right-width");return t.clientWidth+e+n}function je(t){const e=Z(t,"border-top-width"),n=Z(t,"border-bottom-width");return t.clientHeight+e+n}function jt(t,e={}){const n=e.width||Ne(t),r=e.height||je(t);return{width:n,height:r}}function _e(){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 C=16384;function Ve(t){(t.width>C||t.height>C)&&(t.width>C&&t.height>C?t.width>t.height?(t.height*=C/t.width,t.width=C):(t.width*=C/t.height,t.height=C):t.width>C?(t.height*=C/t.width,t.width=C):(t.width*=C/t.height,t.height=C))}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 We(t){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(t)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function ze(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),We(a)}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 qe(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}function Ke(t,e){return Nt(e).map(n=>{const r=t.getPropertyValue(n),a=t.getPropertyPriority(n);return`${n}: ${r}${a?" !important":""};`}).join(" ")}function Xe(t,e,n,r){const a=`.${t}:${e}`,i=n.cssText?qe(n):Ke(n,r);return document.createTextNode(`${a}{${i}}`)}function _t(t,e,n,r){const a=window.getComputedStyle(t,n),i=a.getPropertyValue("content");if(i===""||i==="none")return;const o=Ue();try{e.className=`${e.className} ${o}`}catch{return}const c=document.createElement("style");c.appendChild(Xe(o,n,a,r)),e.appendChild(c)}function Ye(t,e,n){_t(t,e,":before",n),_t(t,e,":after",n)}const Vt="application/font-woff",Wt="image/jpeg",Ge={woff:Vt,woff2:Vt,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Wt,jpeg:Wt,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function Je(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}function ft(t){const e=Je(t).toLowerCase();return Ge[e]||""}function Qe(t){return t.split(/,/)[1]}function ht(t){return t.search(/^(data:)/)!==-1}function Ze(t,e){return`data:${e};base64,${t}`}async function zt(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 pt={};function tn(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=tn(t,e,n.includeQueryParams);if(pt[r]!=null)return pt[r];n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+new Date().getTime());let a;try{const i=await zt(t,n.fetchRequestInit,({res:o,result:c})=>(e||(e=o.headers.get("Content-Type")||""),Qe(c)));a=Ze(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 pt[r]=a,a}async function en(t){const e=t.toDataURL();return e==="data:,"?t.cloneNode(!1):tt(e)}async function nn(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 tt(c)}const n=t.poster,r=ft(n),a=await mt(n,r,e);return tt(a)}async function rn(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 an(t,e){return E(t,HTMLCanvasElement)?en(t):E(t,HTMLVideoElement)?nn(t,e):E(t,HTMLIFrameElement)?rn(t,e):t.cloneNode(qt(t))}const on=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SLOT",qt=t=>t.tagName!=null&&t.tagName.toUpperCase()==="SVG";async function sn(t,e,n){var r,a;if(qt(e))return e;let i=[];return on(t)&&t.assignedNodes?i=O(t.assignedNodes()):E(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||E(t,HTMLVideoElement)||await i.reduce((o,c)=>o.then(()=>et(c,n)).then(l=>{l&&e.appendChild(l)}),Promise.resolve()),e}function cn(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):Nt(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`),E(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 ln(t,e){E(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),E(t,HTMLInputElement)&&e.setAttribute("value",t.value)}function un(t,e){if(E(t,HTMLSelectElement)){const r=Array.from(e.children).find(a=>t.value===a.getAttribute("value"));r&&r.setAttribute("selected","")}}function dn(t,e,n){return E(e,Element)&&(cn(t,e,n),Ye(t,e,n),ln(t,e),un(t,e)),e}async function fn(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 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 et(t,e,n){return!n&&e.filter&&!e.filter(t)?null:Promise.resolve(t).then(r=>an(r,e)).then(r=>sn(t,r,e)).then(r=>dn(t,r,e)).then(r=>fn(r,e))}const Kt=/url\((['"]?)([^'"]+?)\1\)/g,hn=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,pn=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function mn(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}function yn(t){const e=[];return t.replace(Kt,(n,r,a)=>(e.push(a),n)),e.filter(n=>!ht(n))}async function gn(t,e,n,r,a){try{const i=n?Fe(e,n):e,o=ft(e);let c;return a||(c=await mt(i,o,r)),t.replace(mn(e),`$1${c}$3`)}catch{}return t}function wn(t,{preferredFontFormat:e}){return e?t.replace(pn,n=>{for(;;){const[r,,a]=hn.exec(n)||[];if(!a)return"";if(a===e)return`src: ${r};`}}):t}function Xt(t){return t.search(Kt)!==-1}async function Yt(t,e,n){if(!Xt(t))return t;const r=wn(t,n);return yn(r).reduce((i,o)=>i.then(c=>gn(c,o,e,n)),Promise.resolve(r))}async function _(t,e,n){var r;const a=(r=e.style)===null||r===void 0?void 0:r.getPropertyValue(t);if(a){const i=await Yt(a,null,n);return e.style.setProperty(t,i,e.style.getPropertyPriority(t)),!0}return!1}async function bn(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 vn(t,e){const n=E(t,HTMLImageElement);if(!(n&&!ht(t.src))&&!(E(t,SVGImageElement)&&!ht(t.href.baseVal)))return;const r=n?t.src:t.href.baseVal,a=await mt(r,ft(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 Sn(t,e){const r=O(t.childNodes).map(a=>Gt(a,e));await Promise.all(r).then(()=>t)}async function Gt(t,e){E(t,Element)&&(await bn(t,e),await vn(t,e),await Sn(t,e))}function xn(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 Jt={};async function Qt(t){let e=Jt[t];if(e!=null)return e;const r=await(await fetch(t)).text();return e={url:t,cssText:r},Jt[t]=e,e}async function Zt(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),zt(c,e.fetchRequestInit,({result:l})=>(n=n.replace(o,`url(${l})`),[o,l]))});return Promise.all(i).then(()=>n)}function te(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 En(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=Qt(l).then(h=>Zt(h,e)).then(h=>te(h).forEach(m=>{try{a.insertRule(m,m.startsWith("@import")?c+=1:a.cssRules.length)}catch(y){console.error("Error inserting rule from remote css",{rule:m,error:y})}})).catch(h=>{console.error("Error loading remote css",h.toString())});r.push(u)}})}catch(i){const o=t.find(c=>c.href==null)||document.styleSheets[0];a.href!=null&&r.push(Qt(a.href).then(c=>Zt(c,e)).then(c=>te(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 Cn(t){return t.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Xt(e.style.getPropertyValue("src")))}async function Mn(t,e){if(t.ownerDocument==null)throw new Error("Provided element is not within a Document");const n=O(t.ownerDocument.styleSheets),r=await En(n,e);return Cn(r)}function ee(t){return t.trim().replace(/["']/g,"")}function An(t){const e=new Set;function n(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(i=>{e.add(ee(i))}),Array.from(r.children).forEach(i=>{i instanceof HTMLElement&&n(i)})}return n(t),e}async function Ln(t,e){const n=await Mn(t,e),r=An(t);return(await Promise.all(n.filter(i=>r.has(ee(i.style.fontFamily))).map(i=>{const o=i.parentStyleSheet?i.parentStyleSheet.href:null;return Yt(i.cssText,o,e)}))).join(`
2
- `)}async function Rn(t,e){const n=e.fontEmbedCSS!=null?e.fontEmbedCSS:e.skipFonts?null:await Ln(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 $n(t,e={}){const{width:n,height:r}=jt(t,e),a=await et(t,e,!0);return await Rn(a,e),await Gt(a,e),xn(a,e),await ze(a,n,r)}async function Tn(t,e={}){const{width:n,height:r}=jt(t,e),a=await $n(t,e),i=await tt(a),o=document.createElement("canvas"),c=o.getContext("2d"),l=e.pixelRatio||_e(),u=e.canvasWidth||n,h=e.canvasHeight||r;return o.width=u*l,o.height=h*l,e.skipAutoScale||Ve(o),o.style.width=`${u}`,o.style.height=`${h}`,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 ne(t,e={}){return(await Tn(t,e)).toDataURL()}const nt="data-nf-capture-chrome",Pn="data-nf-canvas-snap",kn="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";function re(t){return t instanceof Element&&(t.hasAttribute(nt)||t.hasAttribute("data-nf-mask-cover")||t.id==="notefully")}function In(){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 On(){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 Bn(){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 Hn(){document.querySelectorAll(`[${nt}]`).forEach(t=>t.remove())}function yt(){return new Promise(t=>{requestAnimationFrame(()=>requestAnimationFrame(t))})}async function Dn(){const t=[],e=Array.from(document.querySelectorAll("canvas"));for(const n of e){if(n.closest("#notefully")||re(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(Pn,"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 Fn(t){if(!t)return null;if(typeof t=="string")return t.startsWith("data:")?t:null;if(typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement)try{return t.toDataURL("image/png")}catch{return null}return typeof Blob<"u"&&t instanceof Blob?Un(t):null}async function Un(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 Nn(){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(o=>{n.onloadedmetadata=()=>o()}),await yt();const r=n.videoWidth||1,a=n.videoHeight||1,i=document.createElement("canvas");return i.width=r,i.height=a,i.getContext("2d").drawImage(n,0,0,r,a),i.toDataURL("image/png")}finally{t.getTracks().forEach(n=>n.stop())}}async function ie(t={}){const e=document.getElementById("notefully"),n=e?e.style.display:"",r=Bn(),a=In();let i=()=>{};e&&(e.style.display="none");const o=On();try{if(typeof t.onBeforeCapture=="function"&&await t.onBeforeCapture(),await yt(),typeof t.capture=="function"){const l=await Fn(await t.capture());if(l)return l}i=await Dn(),await yt();const c={cacheBust:!0,pixelRatio:Math.min(window.devicePixelRatio||1,2),filter:l=>!re(l),imagePlaceholder:kn,onImageErrorHandler:()=>{}};try{return await ne(document.body,c)}catch{return await ne(document.body,{...c,skipFonts:!0})}}finally{try{i()}catch{}o(),a(),r.remove(),Hn(),e&&(e.style.display=n)}}function jn(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 _n(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 Vn(t={}){const e=navigator.userAgent;return{url:location.href,title:document.title,userAgent:e,os:jn(e),browser:_n(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 ae=new Set(["userId","email","displayName"]),oe={id:"userId",username:"displayName",name:"displayName"},se=new Set(["endpoint","projectKey","version","name","targets","hideLauncher","theme","video","consoleLogLimit","kinds","capture","onBeforeCapture"]),ce={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 Wn(t={},e={}){const n=e.warn||le,r=t&&typeof t=="object"?t:{},a={},i=[];for(const o of ae)Object.prototype.hasOwnProperty.call(r,o)&&(a[o]=r[o]);for(const[o,c]of Object.entries(oe))Object.prototype.hasOwnProperty.call(r,o)&&(Object.prototype.hasOwnProperty.call(a,c)||(a[c]=r[o]));for(const o of Object.keys(r))ae.has(o)||Object.prototype.hasOwnProperty.call(oe,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 zn(t={},e={}){const n=e.warn||le,r=t&&typeof t=="object"?t:{},a=Object.keys(r).filter(i=>!se.has(i));if(a.length)for(const i of a){if(ce[i]){n(`Notefully.init: ignoring "${i}". ${ce[i]}`);continue}n(`Notefully.init: ignoring unknown key "${i}". Supported: ${[...se].join(", ")}.`)}}function le(t){typeof console<"u"&&typeof console.warn=="function"&&console.warn(t)}const qn=80;function Kn(){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>qn&&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 Xn(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 Yn=60*1e3;function Gn({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(h=>h.stop()),r=null)},l=()=>{if(a&&a.state==="recording"){a.stop();return}c(),e(null)};return{start:async()=>{var h,m;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=[],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)},(m=r.getVideoTracks()[0])==null||m.addEventListener("ended",()=>l()),a.start(),o=setTimeout(l,Yn)},stop:l}}function Jn(){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 gt={x:0,y:0,w:1,h:1};function wt(){const t=Jn();let e=[],n={...gt},r=1;return{list:()=>e.filter(i=>Zn(i,n)),all:()=>e.slice(),crop:()=>({...n}),setCrop(i){return n=Qn(i),n},resetCrop(){return n={...gt},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={...gt},r=1;t.peekUsed().length;)t.free(t.peekUsed()[0])}}}function Qn(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 Zn(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 bt(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 tr(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=bt(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 h=vt(u.x,n,r),m=St(u.y,n,a),y=u.w/n.w*r,x=u.h/n.h*a,T=l.stroke/2;if(u.type==="rect")t.strokeRect(h+T,m+T,Math.max(0,y-l.stroke),Math.max(0,x-l.stroke));else if(u.type==="circle")t.beginPath(),t.ellipse(h+y/2,m+x/2,Math.max(.5,y/2-T),Math.max(.5,x/2-T),0,0,Math.PI*2),t.stroke();else if(u.type==="arrow"){const q=vt(u.x2??u.x+u.w,n,r),K=St(u.y2??u.y,n,a);nr(t,h,m,q,K,l)}if(u.number==null||u.number==="")return;const H=er(u,n,r,a,h,m,y),Q=String(u.number);t.beginPath(),t.arc(H.x,H.y,l.badgeRadius,0,Math.PI*2),t.fillStyle=o,t.fill(),t.fillStyle=c,t.textAlign="center",t.textBaseline="middle",t.fillText(Q,H.x,H.y+.5),t.fillStyle=o}),t.restore()}function vt(t,e,n){return(t-e.x)/e.w*n}function St(t,e,n){return(t-e.y)/e.h*n}function er(t,e,n,r,a,i,o){if(t.type==="arrow"){const c=vt(t.x2??t.x+t.w,e,n),l=St(t.y2??t.y,e,r);return{x:(a+c)/2,y:(i+l)/2}}return{x:a+o/2,y:i}}function ue(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,h=n-Math.cos(i)*o,m=r-Math.sin(i)*o,y={x:l-o*Math.cos(i-a.arrowHeadAngle),y:u-o*Math.sin(i-a.arrowHeadAngle)},x={x:l-o*Math.cos(i+a.arrowHeadAngle),y:u-o*Math.sin(i+a.arrowHeadAngle)},T={x:n-Math.cos(i)*c,y:r-Math.sin(i)*c};return{angle:i,tipX:l,tipY:u,baseX:h,baseY:m,left:y,right:x,shaftEnd:T}}function nr(t,e,n,r,a,i){const o=ue(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 rr(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)),h=Math.max(1,Math.round(e.h*o.height)),m=document.createElement("canvas");m.width=u,m.height=h;const y=m.getContext("2d");y.drawImage(o,c,l,u,h,0,0,u,h),tr(y,{stickers:n,crop:e,width:u,height:h,colors:r}),m.toBlob(x=>{if(!x){i(new Error("Could not encode screenshot"));return}a(x)},"image/png")},o.onerror=()=>i(new Error("Could not load screenshot")),o.src=t})}const F=[{id:"bug",label:"Bug"},{id:"idea",label:"Idea"},{id:"other",label:"Other"}];function de(t){return String(t||"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32)}function xt(t){const e=String(t||"").trim();return e?e.split(/[-_\s]+/).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" "):""}function ir(t){if(!Array.isArray(t)||!t.length)return F.map(r=>({...r}));const e=new Set,n=[];for(const r of t){let a="",i="";typeof r=="string"||typeof r=="number"?(a=de(r),i=xt(a)):r&&typeof r=="object"&&(a=de(r.id??r.value??r.kind),i=String(r.label||r.name||xt(a)).trim()||xt(a)),!(!a||e.has(a))&&(e.add(a),n.push({id:a,label:i}))}return n.length?n:F.map(r=>({...r}))}function rt(t){var n;const e=Array.isArray(t)&&t.length?t:F;return e.some(r=>r.id==="bug")?"bug":((n=e[0])==null?void 0:n.id)||"other"}const ar=["maker","all-business","brighter-day","quiet-night"],fe="maker",or=new Set(["crop","arrow","rect","circle"]),Et=.02,he=.05,sr=`
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 P(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 R={crop:P('<path d="M6 3v5H1M18 21v-5h5M8 5h8a2 2 0 0 1 2 2v8M16 19H8a2 2 0 0 1-2-2V8"/>'),resetCrop:P('<path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/>'),arrow:P('<path d="M5 19 19 5"/><path d="M9 5h10v10"/>'),rect:P('<rect x="4" y="6" width="16" height="12" rx="1.5"/>'),circle:P('<circle cx="12" cy="12" r="8"/>'),discard:P('<path d="M4 7h16"/><path d="M9 7V5h6v2"/><path d="M6 7l1 13h10l1-13"/>'),recapture:P('<path d="M4 8h3l2-2h6l2 2h3v11H4z"/><circle cx="12" cy="13" r="3.5"/>'),audio:P('<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:P('<rect x="3" y="7" width="13" height="10" rx="2"/><path d="M16 10.5 21 8v8l-5-2.5z"/>')},pe=Kn();pe.hook();const me=10,cr=80,ye="notefully.author",Ct="Anonymous";let d={endpoint:"",projectKey:"",version:"0.0.0",name:"",targets:null,hideLauncher:!1,theme:fe,video:!1,consoleLogLimit:me,kinds:F.map(t=>({...t})),capture:null,onBeforeCapture:null},Mt=!1,$={},f=null,s={},p=wt(),S="",V="",k=null,U=rt(F),B=null,L=null,w=null,b=null,it=null,N=null,Y=null,I={w:0,h:0},At=!1,Lt=!1;function g(t){return f.querySelector(t)}function ge(t){const e=String(t||"").trim().toLowerCase().replace(/\s+/g,"-");return ar.includes(e)?e:fe}function we(t,e){return f&&getComputedStyle(f).getPropertyValue(t).trim()||e}async function lr(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 Rt(){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…">${sr}</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">${R.crop}</button>
15
- <button class="nf-reset-crop nf-icon-btn" type="button" title="Reset crop" aria-label="Reset crop" hidden>${R.resetCrop}</button>
16
- <button class="nf-tool nf-icon-btn" type="button" data-tool="arrow" title="Arrow" aria-label="Arrow">${R.arrow}</button>
17
- <button class="nf-tool nf-icon-btn" type="button" data-tool="rect" title="Rectangle" aria-label="Rectangle">${R.rect}</button>
18
- <button class="nf-tool nf-icon-btn" type="button" data-tool="circle" title="Circle" aria-label="Circle">${R.circle}</button>
19
- <button class="nf-discard-shot nf-icon-btn" type="button" title="Discard screenshot" aria-label="Discard screenshot">${R.discard}</button>
20
- <button class="nf-recapture nf-icon-btn" type="button" title="Recapture screenshot" aria-label="Recapture screenshot">${R.recapture}</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>
21
21
  </div>
22
22
  <div class="nf-canvas"></div>
23
23
  </div>
@@ -25,9 +25,9 @@ var Notefully=(function(M){"use strict";function Fe(t,e){if(t.match(/^[a-z]+:\/\
25
25
  <input class="nf-author" type="text" name="author" autocomplete="nickname" placeholder="Anonymous" aria-label="Author">
26
26
  <div class="nf-kind"></div>
27
27
  <div class="nf-actions">
28
- <button class="nf-restore nf-icon-btn" type="button" title="Restore screenshot" aria-label="Restore screenshot" hidden>${R.resetCrop}</button>
29
- <button class="nf-audio nf-icon-btn" type="button" title="Record audio" aria-label="Record audio">${R.audio}</button>
30
- <button class="nf-video nf-icon-btn" type="button" title="Record video" aria-label="Record video">${R.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>
31
31
  <button class="nf-submit" type="button">Submit</button>
32
32
  </div>
33
33
  <div class="nf-status"></div>
@@ -36,8 +36,8 @@ var Notefully=(function(M){"use strict";function Fe(t,e){if(t.match(/^[a-z]+:\/\
36
36
  </div>
37
37
  </div>
38
38
  <button class="nf-stop-video" type="button" hidden>Stop</button>
39
- `,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"),recapture:g(".nf-recapture"),stop:g(".nf-stop-video"),resetCrop:g(".nf-reset-crop"),submit:g(".nf-submit"),shot:null},ur(),G()),f}function G(){var t;f&&(f.dataset.theme=ge(d.theme),d.hideLauncher?f.setAttribute("data-nf-hidden-launcher",""):f.removeAttribute("data-nf-hidden-launcher"),s.video&&(s.video.hidden=!d.video),ve(),(t=s.dialog)!=null&&t.hidden&&at())}function at(){s.launcher&&(s.launcher.hidden=!!d.hideLauncher)}function ur(){s.launcher.addEventListener("click",()=>Ht()),g(".nf-dialog").addEventListener("click",e=>{Lt||e.target===s.dialog&&z()}),f.querySelectorAll(".nf-tool").forEach(e=>{e.addEventListener("click",()=>ot(e.dataset.tool))}),s.resetCrop.addEventListener("click",gr),s.canvas.addEventListener("pointerdown",fr),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&&$t(n.dataset.kind)}),s.discard.addEventListener("click",wr),s.recapture.addEventListener("click",()=>{vr().catch(e=>v(e.message||"Recapture failed."))}),s.restore.addEventListener("click",br),s.audio.addEventListener("click",Sr),s.video.addEventListener("click",xr),s.stop.addEventListener("click",()=>Y==null?void 0:Y.stop()),g(".nf-submit").addEventListener("click",()=>{Dt().catch(e=>v(e.message||"Submit failed."))}),ve(),ot(null)}function be(t){return String(t||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function ve(){const t=f==null?void 0:f.querySelector(".nf-kind");if(!t)return;const e=Array.isArray(d.kinds)&&d.kinds.length?d.kinds:F;t.innerHTML=e.map(a=>`<button type="button" data-kind="${be(a.id)}">${be(a.label)}</button>`).join("");const r=e.map(a=>a.id).includes(U)?U:rt(e);$t(r)}function $t(t){U=(d.kinds||F).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 ot(t){B=or.has(t)?t:null,L=null,f.querySelectorAll(".nf-tool").forEach(e=>{e.dataset.active=String(e.dataset.tool===B)}),s.canvas&&(s.canvas.dataset.draw=B?"true":"false"),S&&A()}function Se(t){return Math.min(1,Math.max(0,t))}function J(){return s.shot||s.canvas}function st(t){const e=J().getBoundingClientRect();return{x:Se((t.clientX-e.left)/Math.max(e.width,1)),y:Se((t.clientY-e.top)/Math.max(e.height,1))}}function dr(t){const e=J().getBoundingClientRect();return t.clientX>=e.left&&t.clientX<=e.right&&t.clientY>=e.top&&t.clientY<=e.bottom}function xe(t){const e=st(t),n=p.crop();return{x:n.x+e.x*n.w,y:n.y+e.y*n.h}}function ct(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(Et,Math.abs(e.x-t.x)),h:Math.max(Et,Math.abs(e.y-t.y))}}function Tt(t){f&&(t?f.dataset.grabbing="true":delete f.dataset.grabbing)}function Pt(t){try{s.canvas.setPointerCapture(t.pointerId)}catch{}}function kt(){window.addEventListener("pointermove",Ce),window.addEventListener("pointerup",lt),window.addEventListener("pointercancel",lt)}function Ee(){window.removeEventListener("pointermove",Ce),window.removeEventListener("pointerup",lt),window.removeEventListener("pointercancel",lt)}function fr(t){if(t.button!==0||!S)return;if(!t.target.closest(".nf-sticker")&&!dr(t)){L=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(),L=n.dataset.id,Pt(t),hr({kind:"sticker",id:L,dir:(e==null?void 0:e.dataset.dir)||"move"},t),A();return}if(L=null,B==="crop"){t.preventDefault(),Pt(t),w={kind:"crop",start:st(t),current:st(t)},kt(),A();return}if(B==="arrow"||B==="rect"||B==="circle"){t.preventDefault(),Pt(t);const r=xe(t);w={kind:"sticker",type:B,start:r,current:r},kt(),A();return}A()}function hr(t,e){e.preventDefault(),e.stopPropagation();const n=J().getBoundingClientRect(),r=p.list().find(a=>a.id===t.id);b={...t,startX:e.clientX,startY:e.clientY,crop:p.crop(),sticker:r?{...r}:null,rect:n},Tt(t.dir==="move"||t.dir==="start"||t.dir==="end"),kt()}function Ce(t){if(w){w.current=w.kind==="crop"?st(t):xe(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")p.update(r.id,{x2:r.x2+e,y2:r.y2+n});else if(b.dir==="start")p.update(r.id,{x:r.x+e,y:r.y+n});else if(b.dir==="move")p.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};pr(a,b.dir,e,n),p.update(r.id,a)}A()}}function pr(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 lt(t){if(Ee(),Tt(!1),w){mr();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)&&(p.remove(b.id),L=null)}b=null,A()}}function mr(){const t=w;if(w=null,!t)return;if(t.kind==="crop"){const n=ct(t.start,t.current);if(Math.abs(t.current.x-t.start.x)<he||Math.abs(t.current.y-t.start.y)<he){A();return}const a=p.crop();p.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}),W();return}const e=yr(t);e&&(L=e.id),A()}function yr(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)<Et?p.add("arrow",{x:t.start.x,y:t.start.y,x2:t.start.x+.12,y2:t.start.y,w:.12,h:.02}):p.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 p.add(t.type,ct(t.start,t.current))}function gr(){p.resetCrop(),L=null,W()}function It(){s.resetCrop&&(s.resetCrop.hidden=!p.isCropped())}function Ot(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 wr(){S&&(V=S),S="",s.stage.hidden=!0,s.restore.hidden=!V}function br(){V&&(S=V,s.stage.hidden=!1,s.restore.hidden=!0,W())}function Me(){return{capture:typeof d.capture=="function"?d.capture:void 0,onBeforeCapture:typeof d.onBeforeCapture=="function"?d.onBeforeCapture:void 0}}async function vr(){if(!(Mt||!s.dialog||s.dialog.hidden)){Mt=!0,s.recapture.disabled=!0,v("Capturing…",!0),s.dialog.hidden=!0;try{let t="";try{t=await Nn()}catch{t=await ie(Me())}S=t,V=t,p=wt(),I={w:0,h:0},L=null,w=null,b=null,ot(null),s.stage.hidden=!1,s.restore.hidden=!0,v("")}catch(t){v((t==null?void 0:t.message)||"Screenshot failed; you can still send text.")}finally{s.dialog.hidden=!1,s.recapture.disabled=!1,Mt=!1,W()}}}function Sr(){try{if(N||(N=Xn(e=>{const n=s.text.value.trim();s.text.value=n?`${n} ${e}`:e})),!N.isSupported()){v("Audio-to-text is not supported in this browser.");return}const t=N.start();Ot(t),v(t?"Listening…":"")}catch(t){v(t.message)}}async function xr(){if(!d.video){v("Video is disabled on this host.");return}s.dialog.hidden=!0,s.stop.hidden=!1,G(),s.launcher.hidden=!0,Y=Gn({onStart(){},onStop(t){k=t,s.stop.hidden=!0,at(),s.dialog.hidden=!1,W(),v(t?"Video attached.":"Recording cancelled.")},onError(t){v(t.message)}});try{await Y.start()}catch(t){s.stop.hidden=!0,at(),s.dialog.hidden=!1,v(t.message)}}function W(){if(s.shot=null,!S){s.canvas.style.removeProperty("--nf-shot-aspect"),s.canvas.style.removeProperty("aspect-ratio"),s.canvas.innerHTML=k?`<video class="nf-recording-preview" controls src="${URL.createObjectURL(k)}"></video>`:"",It();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=()=>{Er(t),A()};t.addEventListener("load",e),t.complete&&t.naturalWidth&&e()}function Er(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=p.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 Cr(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:"",...ct(t.start,t.current)}}function A(){if((s.shot||s.canvas).querySelectorAll(".nf-sticker, .nf-crop").forEach(i=>i.remove()),!S||!s.shot){It();return}const e=p.crop(),n=J(),r=bt(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",Ae(i,ct(w.start,w.current),{x:0,y:0,w:1,h:1}),s.shot.appendChild(i)}const a=p.list().slice();if((w==null?void 0:w.kind)==="sticker"&&a.push(Cr(w)),a.forEach(i=>{const o=i.id==="preview",c=!o&&i.id===L,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"?Mr(l,i,e,c,r):(Ae(l,i,e),c&&["nw","ne","sw","se"].forEach(u=>Bt(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()),k){const i=document.createElement("video");i.className="nf-recording-preview",i.controls=!0,i.src=URL.createObjectURL(k),i.style.position="absolute",i.style.right="8px",i.style.bottom="8px",i.style.width="160px",s.canvas.appendChild(i)}It()}function Mr(t,e,n,r,a=bt(400)){const i=J(),o=i.clientWidth,c=i.clientHeight,l=(e.x-n.x)/n.w*o,u=(e.y-n.y)/n.h*c,h=((e.x2??e.x+e.w)-n.x)/n.w*o,m=((e.y2??e.y)-n.y)/n.h*c,y=Math.max(18,a.arrowHead+a.stroke*2),x=Math.min(l,h)-y,T=Math.min(u,m)-y,H=Math.max(2,Math.abs(h-l))+y*2,Q=Math.max(2,Math.abs(m-u))+y*2,q=l-x,K=u-T,Ft=h-x,Ut=m-T,D=ue(q,K,Ft,Ut,a),X=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.left=`${x}px`,t.style.top=`${T}px`,t.style.width=`${H}px`,t.style.height=`${Q}px`,X.setAttribute("class","nf-arrow-svg"),X.setAttribute("viewBox",`0 0 ${H} ${Q}`),X.setAttribute("width",String(H)),X.setAttribute("height",String(Q)),X.innerHTML=`
40
- <line class="nf-arrow-hit" x1="${q}" y1="${K}" x2="${Ft}" y2="${Ut}" />
41
- <line class="nf-arrow-shaft" x1="${q}" y1="${K}" x2="${D.shaftEnd.x}" y2="${D.shaftEnd.y}" />
42
- <polygon class="nf-arrow-head" points="${D.tipX},${D.tipY} ${D.left.x},${D.left.y} ${D.right.x},${D.right.y}" />
43
- `,t.appendChild(X),r&&(Bt(t,"start",{left:q-5,top:K-5}),Bt(t,"end",{left:Ft-5,top:Ut-5}))}function Bt(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 Ae(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 Ar(){try{return String(localStorage.getItem(ye)||"").trim()}catch{return""}}function Lr(t){const e=String(t||"").trim();if(!(!e||e===Ct))try{localStorage.setItem(ye,e)}catch{}}function Le(){return!!(String($.userId||"").trim()||String($.email||"").trim()||String($.displayName||"").trim())}function Rr(){return String($.displayName||$.email||$.userId||"").trim()}function $r(){var e;if(Le())return Rr()||Ct;const t=String(((e=s.author)==null?void 0:e.value)||"").trim();return t?(Lr(t),t):Ct}function Re(){if(!s.author)return;const t=Le();if(s.author.hidden=t,t){s.author.value="";return}s.author.value=Ar()}function $e(t,e=me){const n=Number(t);return Number.isFinite(n)?Math.min(cr,Math.max(0,Math.floor(n))):e}function Te(t={}){zn(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:ge(t.theme??d.theme),video:t.video==null?d.video:!!t.video,consoleLogLimit:t.consoleLogLimit==null?d.consoleLogLimit:$e(t.consoleLogLimit,d.consoleLogLimit),kinds:e?ir(t.kinds):d.kinds,capture:t.capture===void 0?d.capture:t.capture,onBeforeCapture:t.onBeforeCapture===void 0?d.onBeforeCapture:t.onBeforeCapture}}function ut(t={}){return Te(t),f&&G(),dt}function Pe(t={}){return Te(t),Rt(),G(),dt}function ke(t){return ut({theme:t})}function Ie(t){const e=!!t;return!e&&f&&s.dialog&&!s.dialog.hidden&&z(),ut({hideLauncher:!e})}async function Ht(){Rt(),Oe(),G(),s.launcher.hidden=!0,p=wt(),I={w:0,h:0},k=null,L=null,w=null,b=null,U=rt(d.kinds),$t(U),ot(null),Ot(!1),s.text.value="",Re(),v("");try{S=await ie(Me()),V=S,s.stage.hidden=!1,s.restore.hidden=!0,v("")}catch{S="",v("Screenshot failed; you can still send text.")}s.dialog.hidden=!1,W(),s.text.focus()}function z(){f&&(N==null||N.stop(),Ot(!1),Ee(),w=null,b=null,Tt(!1),Oe(),s.dialog.hidden=!0,s.stop.hidden=!0,at())}function Tr(){const t=s.dialog,e=s.panel,n=s.panelBody,r=s.successMsg;if(!t||!e||!n||!r)return Promise.resolve();Lt=!0,v("");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 h=!1;const m=()=>{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"||m()};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(m,700)})}function Oe(){Lt=!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 Be(t={}){$={...$,...Wn(t)},Re()}async function Dt(){if(Rt(),At)return null;const t=s.text.value.trim();if(!t&&!S&&!k)return v("Add a note, screenshot, or video first."),null;if(!d.endpoint||!d.projectKey)return v("Notefully is missing endpoint or projectKey."),null;At=!0,He(!0),v("Submitting…",!0);try{const e=$r(),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({...Vn({...$,displayName:$.displayName||e}),author:e,console:pe.snapshot().slice(-$e(d.consoleLogLimit))})),n.append("annotations",JSON.stringify(p.list())),n.append("crop",JSON.stringify(p.crop())),Array.isArray(d.targets)&&n.append("targets",JSON.stringify(d.targets)),S){const i=await lr(S);if(n.append("screenshot",i,"screenshot.png"),p.list().length||p.isCropped()){const o=await rr(S,p.crop(),p.list(),{mark:we("--nf-mark","#fdd341"),markText:we("--nf-mark-text","#2a2140")});n.append("screenshotBaked",o,"screenshot.baked.png")}}k&&n.append("recording",k,"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 v((a==null?void 0:a.error)||"Submit failed."),new Error((a==null?void 0:a.error)||`Submit failed (${r.status})`);return await Tr(),z(),a}finally{At=!1,He(!1)}}function He(t){s.submit&&(s.submit.disabled=!!t,s.submit.setAttribute("aria-busy",t?"true":"false"))}function De(){z(),f==null||f.remove(),f=null,s={}}const dt={init:Pe,configure:ut,setTheme:ke,setVisible:Ie,open:Ht,close:z,identify:Be,submit:Dt,destroy:De};return typeof window<"u"&&(window.Notefully=dt),M.close=z,M.configure=ut,M.default=dt,M.destroy=De,M.identify=Be,M.init=Pe,M.open=Ht,M.setTheme=ke,M.setVisible=Ie,M.submit=Dt,Object.defineProperties(M,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),M})({});
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})({});