pushfeedback 0.1.84 → 0.1.85

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.
@@ -14,7 +14,7 @@ const patchEsm = () => {
14
14
  const defineCustomElements = (win, options) => {
15
15
  if (typeof window === 'undefined') return Promise.resolve();
16
16
  return patchEsm().then(() => {
17
- return index.bootstrapLazy([["canvas-editor_3.cjs",[[1,"feedback-button",{"buttonPosition":[1,"button-position"],"buttonStyle":[1,"button-style"],"hideIcon":[4,"hide-icon"],"hideMobile":[4,"hide-mobile"],"sessionId":[1537,"session-id"],"metadata":[1],"submit":[4],"clickOutsideClose":[4,"click-outside-close"],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"historyClose":[4,"history-close"],"isEmailRequired":[4,"is-email-required"],"fetchData":[4,"fetch-data"],"hideEmail":[4,"hide-email"],"hidePrivacyPolicy":[4,"hide-privacy-policy"],"hideRating":[4,"hide-rating"],"hideScreenshotButton":[4,"hide-screenshot-button"],"modalPosition":[1,"modal-position"],"project":[1],"rating":[2],"ratingMode":[1,"rating-mode"],"emailPlaceholder":[1,"email-placeholder"],"errorMessage":[1,"error-message"],"errorMessage403":[1,"error-message-4-0-3"],"errorMessage404":[1,"error-message-4-0-4"],"footerText":[1,"footer-text"],"messagePlaceholder":[1,"message-placeholder"],"modalTitle":[1,"modal-title"],"modalTitleError":[1,"modal-title-error"],"modalTitleSuccess":[1,"modal-title-success"],"privacyPolicyText":[1,"privacy-policy-text"],"ratingPlaceholder":[1,"rating-placeholder"],"ratingStarsPlaceholder":[1,"rating-stars-placeholder"],"sendButtonText":[1,"send-button-text"],"successMessage":[1,"success-message"],"recaptchaText":[1,"recaptcha-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotEditTextButtonText":[1,"screenshot-edit-text-button-text"],"screenshotEditorTitle":[1,"screenshot-editor-title"],"screenshotEditorCancelText":[1,"screenshot-editor-cancel-text"],"screenshotEditorSaveText":[1,"screenshot-editor-save-text"],"screenshotSizeLabelText":[1,"screenshot-size-label-text"],"screenshotBorderLabelText":[1,"screenshot-border-label-text"],"screenshotEditTextPromptText":[1,"screenshot-edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"]}],[1,"feedback-modal",{"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"hideEmail":[4,"hide-email"],"isEmailRequired":[4,"is-email-required"],"ratingMode":[1,"rating-mode"],"hasSelectedElement":[1540,"has-selected-element"],"hidePrivacyPolicy":[4,"hide-privacy-policy"],"hideRating":[4,"hide-rating"],"hideScreenshotButton":[4,"hide-screenshot-button"],"project":[1],"showScreenshotMode":[1540,"show-screenshot-mode"],"showScreenshotTopBar":[1540,"show-screenshot-top-bar"],"showModal":[1540,"show-modal"],"rating":[2],"metadata":[1],"fetchData":[4,"fetch-data"],"embedded":[4],"clickOutsideClose":[4,"click-outside-close"],"historyClose":[4,"history-close"],"emailPlaceholder":[1,"email-placeholder"],"errorMessage":[1,"error-message"],"errorMessage403":[1,"error-message-4-0-3"],"errorMessage404":[1,"error-message-4-0-4"],"messagePlaceholder":[1,"message-placeholder"],"footerText":[1,"footer-text"],"modalPosition":[1,"modal-position"],"modalTitle":[1,"modal-title"],"modalTitleError":[1,"modal-title-error"],"modalTitleSuccess":[1,"modal-title-success"],"privacyPolicyText":[1,"privacy-policy-text"],"ratingPlaceholder":[1,"rating-placeholder"],"ratingStarsPlaceholder":[1,"rating-stars-placeholder"],"sendButtonText":[1,"send-button-text"],"successMessage":[1,"success-message"],"recaptchaText":[1,"recaptcha-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotEditTextButtonText":[1,"screenshot-edit-text-button-text"],"screenshotEditorTitle":[1,"screenshot-editor-title"],"screenshotEditorCancelText":[1,"screenshot-editor-cancel-text"],"screenshotEditorSaveText":[1,"screenshot-editor-save-text"],"screenshotSizeLabelText":[1,"screenshot-size-label-text"],"screenshotBorderLabelText":[1,"screenshot-border-label-text"],"screenshotEditTextPromptText":[1,"screenshot-edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"],"sending":[32],"formMessage":[32],"formEmail":[32],"formSuccess":[32],"formVerification":[32],"formError":[32],"formErrorStatus":[32],"encodedScreenshot":[32],"isPrivacyChecked":[32],"whitelabel":[32],"selectedRating":[32],"overlayVisible":[32],"isAnimating":[32],"recaptchaEnabled":[32],"recaptchaSiteKey":[32],"takingScreenshot":[32],"showScreenshotError":[32],"screenshotError":[32],"showCanvasEditor":[32],"autoStartCapture":[32],"openModal":[64]}],[1,"canvas-editor",{"canvasEditorTitle":[1,"canvas-editor-title"],"canvasEditorCancelText":[1,"canvas-editor-cancel-text"],"canvasEditorSaveText":[1,"canvas-editor-save-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"autoStartScreenshot":[4,"auto-start-screenshot"],"existingScreenshot":[1,"existing-screenshot"],"editTextButtonText":[1,"edit-text-button-text"],"sizeLabelText":[1,"size-label-text"],"borderLabelText":[1,"border-label-text"],"editTextPromptText":[1,"edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"],"takingScreenshot":[32],"showCanvasEditor":[32],"canvasDrawingTool":[32],"canvasDrawingColor":[32],"canvasLineWidth":[32],"canvasTextSize":[32],"isDrawing":[32],"annotations":[32],"currentAnnotation":[32],"isDragging":[32],"draggedAnnotation":[32],"dragStartPos":[32],"showColorPicker":[32],"editingColorIndex":[32],"selectedAnnotation":[32],"isResizing":[32],"resizingAnnotation":[32],"resizeStartSize":[32],"resizeStartDimensions":[32],"hoveredAnnotation":[32],"resizeHandle":[32],"defaultColors":[32]}]]]], options);
17
+ return index.bootstrapLazy([["canvas-editor_3.cjs",[[1,"feedback-button",{"buttonPosition":[1,"button-position"],"buttonStyle":[1,"button-style"],"hideIcon":[4,"hide-icon"],"hideMobile":[4,"hide-mobile"],"sessionId":[1537,"session-id"],"metadata":[1],"submit":[4],"apiKey":[1,"api-key"],"clickOutsideClose":[4,"click-outside-close"],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"historyClose":[4,"history-close"],"isEmailRequired":[4,"is-email-required"],"fetchData":[4,"fetch-data"],"hideEmail":[4,"hide-email"],"hidePrivacyPolicy":[4,"hide-privacy-policy"],"hideRating":[4,"hide-rating"],"hideScreenshotButton":[4,"hide-screenshot-button"],"modalPosition":[1,"modal-position"],"project":[1],"rating":[2],"ratingMode":[1,"rating-mode"],"emailPlaceholder":[1,"email-placeholder"],"errorMessage":[1,"error-message"],"errorMessage401":[1,"error-message-4-0-1"],"errorMessage403":[1,"error-message-4-0-3"],"errorMessage404":[1,"error-message-4-0-4"],"footerText":[1,"footer-text"],"messagePlaceholder":[1,"message-placeholder"],"modalTitle":[1,"modal-title"],"modalTitleError":[1,"modal-title-error"],"modalTitleSuccess":[1,"modal-title-success"],"privacyPolicyText":[1,"privacy-policy-text"],"ratingPlaceholder":[1,"rating-placeholder"],"ratingStarsPlaceholder":[1,"rating-stars-placeholder"],"sendButtonText":[1,"send-button-text"],"successMessage":[1,"success-message"],"recaptchaText":[1,"recaptcha-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotEditTextButtonText":[1,"screenshot-edit-text-button-text"],"screenshotEditorTitle":[1,"screenshot-editor-title"],"screenshotEditorCancelText":[1,"screenshot-editor-cancel-text"],"screenshotEditorSaveText":[1,"screenshot-editor-save-text"],"screenshotSizeLabelText":[1,"screenshot-size-label-text"],"screenshotBorderLabelText":[1,"screenshot-border-label-text"],"screenshotEditTextPromptText":[1,"screenshot-edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"]}],[1,"feedback-modal",{"apiKey":[1,"api-key"],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"hideEmail":[4,"hide-email"],"isEmailRequired":[4,"is-email-required"],"ratingMode":[1,"rating-mode"],"hasSelectedElement":[1540,"has-selected-element"],"hidePrivacyPolicy":[4,"hide-privacy-policy"],"hideRating":[4,"hide-rating"],"hideScreenshotButton":[4,"hide-screenshot-button"],"project":[1],"showScreenshotMode":[1540,"show-screenshot-mode"],"showScreenshotTopBar":[1540,"show-screenshot-top-bar"],"showModal":[1540,"show-modal"],"rating":[2],"metadata":[1],"fetchData":[4,"fetch-data"],"embedded":[4],"clickOutsideClose":[4,"click-outside-close"],"historyClose":[4,"history-close"],"escapeClose":[4,"escape-close"],"emailPlaceholder":[1,"email-placeholder"],"errorMessage":[1,"error-message"],"errorMessage401":[1,"error-message-4-0-1"],"errorMessage403":[1,"error-message-4-0-3"],"errorMessage404":[1,"error-message-4-0-4"],"messagePlaceholder":[1,"message-placeholder"],"footerText":[1,"footer-text"],"modalPosition":[1,"modal-position"],"modalTitle":[1,"modal-title"],"modalTitleError":[1,"modal-title-error"],"modalTitleSuccess":[1,"modal-title-success"],"privacyPolicyText":[1,"privacy-policy-text"],"ratingPlaceholder":[1,"rating-placeholder"],"ratingStarsPlaceholder":[1,"rating-stars-placeholder"],"sendButtonText":[1,"send-button-text"],"closeButtonLabel":[1,"close-button-label"],"ratingPositiveLabel":[1,"rating-positive-label"],"ratingNegativeLabel":[1,"rating-negative-label"],"ratingStarLabel":[1,"rating-star-label"],"successMessage":[1,"success-message"],"recaptchaText":[1,"recaptcha-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotEditTextButtonText":[1,"screenshot-edit-text-button-text"],"screenshotEditorTitle":[1,"screenshot-editor-title"],"screenshotEditorCancelText":[1,"screenshot-editor-cancel-text"],"screenshotEditorSaveText":[1,"screenshot-editor-save-text"],"screenshotSizeLabelText":[1,"screenshot-size-label-text"],"screenshotBorderLabelText":[1,"screenshot-border-label-text"],"screenshotEditTextPromptText":[1,"screenshot-edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"],"sending":[32],"formMessage":[32],"formEmail":[32],"formSuccess":[32],"formVerification":[32],"formError":[32],"formErrorStatus":[32],"encodedScreenshot":[32],"isPrivacyChecked":[32],"whitelabel":[32],"selectedRating":[32],"overlayVisible":[32],"isAnimating":[32],"recaptchaEnabled":[32],"recaptchaSiteKey":[32],"takingScreenshot":[32],"showScreenshotError":[32],"screenshotError":[32],"showCanvasEditor":[32],"autoStartCapture":[32],"openModal":[64]}],[1,"canvas-editor",{"canvasEditorTitle":[1,"canvas-editor-title"],"canvasEditorCancelText":[1,"canvas-editor-cancel-text"],"canvasEditorSaveText":[1,"canvas-editor-save-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"escapeClose":[4,"escape-close"],"clickOutsideClose":[4,"click-outside-close"],"autoStartScreenshot":[4,"auto-start-screenshot"],"existingScreenshot":[1,"existing-screenshot"],"editTextButtonText":[1,"edit-text-button-text"],"sizeLabelText":[1,"size-label-text"],"borderLabelText":[1,"border-label-text"],"editTextPromptText":[1,"edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"],"takingScreenshot":[32],"showCanvasEditor":[32],"canvasDrawingTool":[32],"canvasDrawingColor":[32],"canvasLineWidth":[32],"canvasTextSize":[32],"isDrawing":[32],"annotations":[32],"currentAnnotation":[32],"isDragging":[32],"draggedAnnotation":[32],"dragStartPos":[32],"showColorPicker":[32],"editingColorIndex":[32],"selectedAnnotation":[32],"isResizing":[32],"resizingAnnotation":[32],"resizeStartSize":[32],"resizeStartDimensions":[32],"hoveredAnnotation":[32],"resizeHandle":[32],"defaultColors":[32]}]]]], options);
18
18
  });
19
19
  };
20
20
 
@@ -17,7 +17,7 @@ const patchBrowser = () => {
17
17
  };
18
18
 
19
19
  patchBrowser().then(options => {
20
- return index.bootstrapLazy([["canvas-editor_3.cjs",[[1,"feedback-button",{"buttonPosition":[1,"button-position"],"buttonStyle":[1,"button-style"],"hideIcon":[4,"hide-icon"],"hideMobile":[4,"hide-mobile"],"sessionId":[1537,"session-id"],"metadata":[1],"submit":[4],"clickOutsideClose":[4,"click-outside-close"],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"historyClose":[4,"history-close"],"isEmailRequired":[4,"is-email-required"],"fetchData":[4,"fetch-data"],"hideEmail":[4,"hide-email"],"hidePrivacyPolicy":[4,"hide-privacy-policy"],"hideRating":[4,"hide-rating"],"hideScreenshotButton":[4,"hide-screenshot-button"],"modalPosition":[1,"modal-position"],"project":[1],"rating":[2],"ratingMode":[1,"rating-mode"],"emailPlaceholder":[1,"email-placeholder"],"errorMessage":[1,"error-message"],"errorMessage403":[1,"error-message-4-0-3"],"errorMessage404":[1,"error-message-4-0-4"],"footerText":[1,"footer-text"],"messagePlaceholder":[1,"message-placeholder"],"modalTitle":[1,"modal-title"],"modalTitleError":[1,"modal-title-error"],"modalTitleSuccess":[1,"modal-title-success"],"privacyPolicyText":[1,"privacy-policy-text"],"ratingPlaceholder":[1,"rating-placeholder"],"ratingStarsPlaceholder":[1,"rating-stars-placeholder"],"sendButtonText":[1,"send-button-text"],"successMessage":[1,"success-message"],"recaptchaText":[1,"recaptcha-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotEditTextButtonText":[1,"screenshot-edit-text-button-text"],"screenshotEditorTitle":[1,"screenshot-editor-title"],"screenshotEditorCancelText":[1,"screenshot-editor-cancel-text"],"screenshotEditorSaveText":[1,"screenshot-editor-save-text"],"screenshotSizeLabelText":[1,"screenshot-size-label-text"],"screenshotBorderLabelText":[1,"screenshot-border-label-text"],"screenshotEditTextPromptText":[1,"screenshot-edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"]}],[1,"feedback-modal",{"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"hideEmail":[4,"hide-email"],"isEmailRequired":[4,"is-email-required"],"ratingMode":[1,"rating-mode"],"hasSelectedElement":[1540,"has-selected-element"],"hidePrivacyPolicy":[4,"hide-privacy-policy"],"hideRating":[4,"hide-rating"],"hideScreenshotButton":[4,"hide-screenshot-button"],"project":[1],"showScreenshotMode":[1540,"show-screenshot-mode"],"showScreenshotTopBar":[1540,"show-screenshot-top-bar"],"showModal":[1540,"show-modal"],"rating":[2],"metadata":[1],"fetchData":[4,"fetch-data"],"embedded":[4],"clickOutsideClose":[4,"click-outside-close"],"historyClose":[4,"history-close"],"emailPlaceholder":[1,"email-placeholder"],"errorMessage":[1,"error-message"],"errorMessage403":[1,"error-message-4-0-3"],"errorMessage404":[1,"error-message-4-0-4"],"messagePlaceholder":[1,"message-placeholder"],"footerText":[1,"footer-text"],"modalPosition":[1,"modal-position"],"modalTitle":[1,"modal-title"],"modalTitleError":[1,"modal-title-error"],"modalTitleSuccess":[1,"modal-title-success"],"privacyPolicyText":[1,"privacy-policy-text"],"ratingPlaceholder":[1,"rating-placeholder"],"ratingStarsPlaceholder":[1,"rating-stars-placeholder"],"sendButtonText":[1,"send-button-text"],"successMessage":[1,"success-message"],"recaptchaText":[1,"recaptcha-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotEditTextButtonText":[1,"screenshot-edit-text-button-text"],"screenshotEditorTitle":[1,"screenshot-editor-title"],"screenshotEditorCancelText":[1,"screenshot-editor-cancel-text"],"screenshotEditorSaveText":[1,"screenshot-editor-save-text"],"screenshotSizeLabelText":[1,"screenshot-size-label-text"],"screenshotBorderLabelText":[1,"screenshot-border-label-text"],"screenshotEditTextPromptText":[1,"screenshot-edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"],"sending":[32],"formMessage":[32],"formEmail":[32],"formSuccess":[32],"formVerification":[32],"formError":[32],"formErrorStatus":[32],"encodedScreenshot":[32],"isPrivacyChecked":[32],"whitelabel":[32],"selectedRating":[32],"overlayVisible":[32],"isAnimating":[32],"recaptchaEnabled":[32],"recaptchaSiteKey":[32],"takingScreenshot":[32],"showScreenshotError":[32],"screenshotError":[32],"showCanvasEditor":[32],"autoStartCapture":[32],"openModal":[64]}],[1,"canvas-editor",{"canvasEditorTitle":[1,"canvas-editor-title"],"canvasEditorCancelText":[1,"canvas-editor-cancel-text"],"canvasEditorSaveText":[1,"canvas-editor-save-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"autoStartScreenshot":[4,"auto-start-screenshot"],"existingScreenshot":[1,"existing-screenshot"],"editTextButtonText":[1,"edit-text-button-text"],"sizeLabelText":[1,"size-label-text"],"borderLabelText":[1,"border-label-text"],"editTextPromptText":[1,"edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"],"takingScreenshot":[32],"showCanvasEditor":[32],"canvasDrawingTool":[32],"canvasDrawingColor":[32],"canvasLineWidth":[32],"canvasTextSize":[32],"isDrawing":[32],"annotations":[32],"currentAnnotation":[32],"isDragging":[32],"draggedAnnotation":[32],"dragStartPos":[32],"showColorPicker":[32],"editingColorIndex":[32],"selectedAnnotation":[32],"isResizing":[32],"resizingAnnotation":[32],"resizeStartSize":[32],"resizeStartDimensions":[32],"hoveredAnnotation":[32],"resizeHandle":[32],"defaultColors":[32]}]]]], options);
20
+ return index.bootstrapLazy([["canvas-editor_3.cjs",[[1,"feedback-button",{"buttonPosition":[1,"button-position"],"buttonStyle":[1,"button-style"],"hideIcon":[4,"hide-icon"],"hideMobile":[4,"hide-mobile"],"sessionId":[1537,"session-id"],"metadata":[1],"submit":[4],"apiKey":[1,"api-key"],"clickOutsideClose":[4,"click-outside-close"],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"historyClose":[4,"history-close"],"isEmailRequired":[4,"is-email-required"],"fetchData":[4,"fetch-data"],"hideEmail":[4,"hide-email"],"hidePrivacyPolicy":[4,"hide-privacy-policy"],"hideRating":[4,"hide-rating"],"hideScreenshotButton":[4,"hide-screenshot-button"],"modalPosition":[1,"modal-position"],"project":[1],"rating":[2],"ratingMode":[1,"rating-mode"],"emailPlaceholder":[1,"email-placeholder"],"errorMessage":[1,"error-message"],"errorMessage401":[1,"error-message-4-0-1"],"errorMessage403":[1,"error-message-4-0-3"],"errorMessage404":[1,"error-message-4-0-4"],"footerText":[1,"footer-text"],"messagePlaceholder":[1,"message-placeholder"],"modalTitle":[1,"modal-title"],"modalTitleError":[1,"modal-title-error"],"modalTitleSuccess":[1,"modal-title-success"],"privacyPolicyText":[1,"privacy-policy-text"],"ratingPlaceholder":[1,"rating-placeholder"],"ratingStarsPlaceholder":[1,"rating-stars-placeholder"],"sendButtonText":[1,"send-button-text"],"successMessage":[1,"success-message"],"recaptchaText":[1,"recaptcha-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotEditTextButtonText":[1,"screenshot-edit-text-button-text"],"screenshotEditorTitle":[1,"screenshot-editor-title"],"screenshotEditorCancelText":[1,"screenshot-editor-cancel-text"],"screenshotEditorSaveText":[1,"screenshot-editor-save-text"],"screenshotSizeLabelText":[1,"screenshot-size-label-text"],"screenshotBorderLabelText":[1,"screenshot-border-label-text"],"screenshotEditTextPromptText":[1,"screenshot-edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"]}],[1,"feedback-modal",{"apiKey":[1,"api-key"],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"hideEmail":[4,"hide-email"],"isEmailRequired":[4,"is-email-required"],"ratingMode":[1,"rating-mode"],"hasSelectedElement":[1540,"has-selected-element"],"hidePrivacyPolicy":[4,"hide-privacy-policy"],"hideRating":[4,"hide-rating"],"hideScreenshotButton":[4,"hide-screenshot-button"],"project":[1],"showScreenshotMode":[1540,"show-screenshot-mode"],"showScreenshotTopBar":[1540,"show-screenshot-top-bar"],"showModal":[1540,"show-modal"],"rating":[2],"metadata":[1],"fetchData":[4,"fetch-data"],"embedded":[4],"clickOutsideClose":[4,"click-outside-close"],"historyClose":[4,"history-close"],"escapeClose":[4,"escape-close"],"emailPlaceholder":[1,"email-placeholder"],"errorMessage":[1,"error-message"],"errorMessage401":[1,"error-message-4-0-1"],"errorMessage403":[1,"error-message-4-0-3"],"errorMessage404":[1,"error-message-4-0-4"],"messagePlaceholder":[1,"message-placeholder"],"footerText":[1,"footer-text"],"modalPosition":[1,"modal-position"],"modalTitle":[1,"modal-title"],"modalTitleError":[1,"modal-title-error"],"modalTitleSuccess":[1,"modal-title-success"],"privacyPolicyText":[1,"privacy-policy-text"],"ratingPlaceholder":[1,"rating-placeholder"],"ratingStarsPlaceholder":[1,"rating-stars-placeholder"],"sendButtonText":[1,"send-button-text"],"closeButtonLabel":[1,"close-button-label"],"ratingPositiveLabel":[1,"rating-positive-label"],"ratingNegativeLabel":[1,"rating-negative-label"],"ratingStarLabel":[1,"rating-star-label"],"successMessage":[1,"success-message"],"recaptchaText":[1,"recaptcha-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotEditTextButtonText":[1,"screenshot-edit-text-button-text"],"screenshotEditorTitle":[1,"screenshot-editor-title"],"screenshotEditorCancelText":[1,"screenshot-editor-cancel-text"],"screenshotEditorSaveText":[1,"screenshot-editor-save-text"],"screenshotSizeLabelText":[1,"screenshot-size-label-text"],"screenshotBorderLabelText":[1,"screenshot-border-label-text"],"screenshotEditTextPromptText":[1,"screenshot-edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"],"sending":[32],"formMessage":[32],"formEmail":[32],"formSuccess":[32],"formVerification":[32],"formError":[32],"formErrorStatus":[32],"encodedScreenshot":[32],"isPrivacyChecked":[32],"whitelabel":[32],"selectedRating":[32],"overlayVisible":[32],"isAnimating":[32],"recaptchaEnabled":[32],"recaptchaSiteKey":[32],"takingScreenshot":[32],"showScreenshotError":[32],"screenshotError":[32],"showCanvasEditor":[32],"autoStartCapture":[32],"openModal":[64]}],[1,"canvas-editor",{"canvasEditorTitle":[1,"canvas-editor-title"],"canvasEditorCancelText":[1,"canvas-editor-cancel-text"],"canvasEditorSaveText":[1,"canvas-editor-save-text"],"screenshotTakingText":[1,"screenshot-taking-text"],"screenshotAttachedText":[1,"screenshot-attached-text"],"screenshotButtonText":[1,"screenshot-button-text"],"escapeClose":[4,"escape-close"],"clickOutsideClose":[4,"click-outside-close"],"autoStartScreenshot":[4,"auto-start-screenshot"],"existingScreenshot":[1,"existing-screenshot"],"editTextButtonText":[1,"edit-text-button-text"],"sizeLabelText":[1,"size-label-text"],"borderLabelText":[1,"border-label-text"],"editTextPromptText":[1,"edit-text-prompt-text"],"screenshotErrorGeneral":[1,"screenshot-error-general"],"screenshotErrorPermission":[1,"screenshot-error-permission"],"screenshotErrorNotSupported":[1,"screenshot-error-not-supported"],"screenshotErrorNotFound":[1,"screenshot-error-not-found"],"screenshotErrorCancelled":[1,"screenshot-error-cancelled"],"screenshotErrorBrowserNotSupported":[1,"screenshot-error-browser-not-supported"],"screenshotErrorUnexpected":[1,"screenshot-error-unexpected"],"takingScreenshot":[32],"showCanvasEditor":[32],"canvasDrawingTool":[32],"canvasDrawingColor":[32],"canvasLineWidth":[32],"canvasTextSize":[32],"isDrawing":[32],"annotations":[32],"currentAnnotation":[32],"isDragging":[32],"draggedAnnotation":[32],"dragStartPos":[32],"showColorPicker":[32],"editingColorIndex":[32],"selectedAnnotation":[32],"isResizing":[32],"resizingAnnotation":[32],"resizeStartSize":[32],"resizeStartDimensions":[32],"hoveredAnnotation":[32],"resizeHandle":[32],"defaultColors":[32]}]]]], options);
21
21
  });
22
22
 
23
23
  exports.setNonce = index.setNonce;
@@ -1,6 +1,53 @@
1
1
  import { h } from '@stencil/core';
2
+ // Upper bound on waiting for the capture stream to produce video metadata,
3
+ // after which the stream is stopped so it cannot leak
4
+ const CAPTURE_TIMEOUT_MS = 10000;
2
5
  export class CanvasEditor {
3
6
  constructor() {
7
+ this.handleKeyDown = (event) => {
8
+ if (!this.showCanvasEditor || !this.escapeClose || event.key !== 'Escape') {
9
+ return;
10
+ }
11
+ // While the browser is capturing the screen, the picker owns the keyboard
12
+ if (this.takingScreenshot) {
13
+ return;
14
+ }
15
+ event.preventDefault();
16
+ // The colour picker is a popup on top of the editor, so Escape dismisses
17
+ // that first and leaves the editor (and any annotations) in place
18
+ if (this.showColorPicker) {
19
+ this.showColorPicker = false;
20
+ this.editingColorIndex = -1;
21
+ return;
22
+ }
23
+ // Deselect before closing, the way drawing tools do. Closing throws away
24
+ // every annotation, so someone who has just selected one gets a cheap
25
+ // Escape that only drops the selection rather than their work
26
+ if (this.selectedAnnotation) {
27
+ this.selectedAnnotation = null;
28
+ this.redrawAnnotations();
29
+ return;
30
+ }
31
+ // Same as the Cancel button: discards annotations and returns to the form
32
+ this.closeCanvasEditor();
33
+ };
34
+ // Tracks whether the press that started this click landed on the backdrop.
35
+ // Dragging an annotation and releasing past the edge of the editor fires a
36
+ // click on the backdrop too, and that must not be read as "clicked outside".
37
+ this.pressStartedOnOverlay = false;
38
+ this.handleOverlayMouseDown = (event) => {
39
+ this.pressStartedOnOverlay = event.target === event.currentTarget;
40
+ };
41
+ this.handleOverlayClick = (event) => {
42
+ const startedOutside = this.pressStartedOnOverlay;
43
+ this.pressStartedOnOverlay = false;
44
+ if (!this.clickOutsideClose || !startedOutside || event.target !== event.currentTarget) {
45
+ return;
46
+ }
47
+ // Closes the editor only. The feedback form reopens behind it, so a stray
48
+ // click never dismisses the whole widget
49
+ this.closeCanvasEditor();
50
+ };
4
51
  this.handleWindowResize = () => {
5
52
  // Debounce resize events
6
53
  if (this.resizeTimeout) {
@@ -680,8 +727,16 @@ export class CanvasEditor {
680
727
  if (!this.isDrawing || !this.currentAnnotation)
681
728
  return;
682
729
  this.isDrawing = false;
683
- this.annotations = [...this.annotations, this.currentAnnotation];
730
+ const annotation = this.currentAnnotation;
684
731
  this.currentAnnotation = null;
732
+ // A click with no drag never reaches mousemove, so the shape has no end
733
+ // point or size. Committing it added an invisible annotation that could
734
+ // not be selected, dragged or deleted, and it still consumed an undo step.
735
+ if (this.isDegenerateAnnotation(annotation)) {
736
+ this.redrawAnnotations();
737
+ return;
738
+ }
739
+ this.annotations = [...this.annotations, annotation];
685
740
  this.redrawAnnotations();
686
741
  };
687
742
  // Convert screen coordinates to canvas coordinates
@@ -723,11 +778,28 @@ export class CanvasEditor {
723
778
  }
724
779
  case 'line':
725
780
  case 'arrow': {
726
- // Distance from point to line
727
- const A = annotation.endY - annotation.startY;
728
- const B = annotation.startX - annotation.endX;
729
- const C = annotation.endX * annotation.startY - annotation.startX * annotation.endY;
730
- const distance = Math.abs(A * x + B * y + C) / Math.sqrt(A * A + B * B);
781
+ // Distance from the point to the line *segment*, not to the infinite
782
+ // line through it. The previous formula measured the infinite line, so
783
+ // a click far past either end still counted as a hit, and a zero-length
784
+ // segment divided by zero and gave NaN, leaving that annotation
785
+ // impossible to select, drag or delete.
786
+ // A click with no drag never reaches mousemove, so endX/endY are
787
+ // undefined rather than equal to the start. Treat that as a segment
788
+ // collapsed to its start point instead of letting NaN propagate.
789
+ const endX = Number.isFinite(annotation.endX) ? annotation.endX : annotation.startX;
790
+ const endY = Number.isFinite(annotation.endY) ? annotation.endY : annotation.startY;
791
+ const dx = endX - annotation.startX;
792
+ const dy = endY - annotation.startY;
793
+ const lengthSquared = dx * dx + dy * dy;
794
+ // Zero-length segment: t stays 0 and we measure to the single point
795
+ let t = 0;
796
+ if (lengthSquared > 0) {
797
+ t = ((x - annotation.startX) * dx + (y - annotation.startY) * dy) / lengthSquared;
798
+ t = Math.max(0, Math.min(1, t));
799
+ }
800
+ const closestX = annotation.startX + t * dx;
801
+ const closestY = annotation.startY + t * dy;
802
+ const distance = Math.hypot(x - closestX, y - closestY);
731
803
  return distance <= tolerance;
732
804
  }
733
805
  case 'text': {
@@ -752,6 +824,8 @@ export class CanvasEditor {
752
824
  this.screenshotTakingText = 'Taking screenshot...';
753
825
  this.screenshotAttachedText = 'Screenshot attached';
754
826
  this.screenshotButtonText = 'Add a screenshot';
827
+ this.escapeClose = true;
828
+ this.clickOutsideClose = true;
755
829
  this.autoStartScreenshot = false;
756
830
  this.existingScreenshot = '';
757
831
  this.editTextButtonText = 'Edit Text';
@@ -807,10 +881,12 @@ export class CanvasEditor {
807
881
  // Add window resize listener for canvas adaptation
808
882
  this.handleWindowResize = this.handleWindowResize.bind(this);
809
883
  window.addEventListener('resize', this.handleWindowResize);
884
+ document.addEventListener('keydown', this.handleKeyDown);
810
885
  }
811
886
  disconnectedCallback() {
812
887
  // Clean up resize listener
813
888
  window.removeEventListener('resize', this.handleWindowResize);
889
+ document.removeEventListener('keydown', this.handleKeyDown);
814
890
  }
815
891
  async captureViewportScreenshot() {
816
892
  try {
@@ -834,6 +910,30 @@ export class CanvasEditor {
834
910
  video.autoplay = true;
835
911
  video.muted = true;
836
912
  return new Promise((resolve, reject) => {
913
+ // If neither onloadedmetadata nor onerror ever fires, the promise would
914
+ // never settle: the capture stream would stay live with the browser's
915
+ // recording indicator on, and the widget would sit in "Taking
916
+ // screenshot..." forever with no way back short of a page reload.
917
+ let settled = false;
918
+ const stopStream = () => {
919
+ stream.getTracks().forEach((track) => track.stop());
920
+ };
921
+ const finish = (fn) => {
922
+ if (settled) {
923
+ return;
924
+ }
925
+ settled = true;
926
+ clearTimeout(watchdog);
927
+ video.onloadedmetadata = null;
928
+ video.onerror = null;
929
+ fn();
930
+ };
931
+ const watchdog = setTimeout(() => {
932
+ finish(() => {
933
+ stopStream();
934
+ reject(new Error('Screenshot capture timed out'));
935
+ });
936
+ }, CAPTURE_TIMEOUT_MS);
837
937
  video.onloadedmetadata = () => {
838
938
  video.play();
839
939
  // Wait a moment for video to stabilize
@@ -845,22 +945,26 @@ export class CanvasEditor {
845
945
  canvas.height = video.videoHeight;
846
946
  const ctx = canvas.getContext('2d');
847
947
  ctx.drawImage(video, 0, 0);
848
- // Stop the stream
849
- stream.getTracks().forEach((track) => track.stop());
850
948
  // Convert to data URL
851
949
  const dataUrl = canvas.toDataURL('image/png');
852
- console.log('Screenshot captured successfully using Screen Capture API');
853
- resolve(dataUrl);
950
+ finish(() => {
951
+ stopStream();
952
+ resolve(dataUrl);
953
+ });
854
954
  }
855
955
  catch (error) {
856
- stream.getTracks().forEach((track) => track.stop());
857
- reject(error);
956
+ finish(() => {
957
+ stopStream();
958
+ reject(error);
959
+ });
858
960
  }
859
961
  }, 100);
860
962
  };
861
963
  video.onerror = () => {
862
- stream.getTracks().forEach((track) => track.stop());
863
- reject(new Error('Failed to load video for screenshot capture'));
964
+ finish(() => {
965
+ stopStream();
966
+ reject(new Error('Failed to load video for screenshot capture'));
967
+ });
864
968
  };
865
969
  });
866
970
  }
@@ -869,9 +973,27 @@ export class CanvasEditor {
869
973
  throw error;
870
974
  }
871
975
  }
976
+ // Whether a freshly drawn shape is too small to be worth keeping
977
+ isDegenerateAnnotation(annotation) {
978
+ const MIN_SIZE = 2; // canvas pixels
979
+ if (annotation.type === 'line' || annotation.type === 'arrow') {
980
+ if (!Number.isFinite(annotation.endX) || !Number.isFinite(annotation.endY)) {
981
+ return true;
982
+ }
983
+ return (Math.hypot(annotation.endX - annotation.startX, annotation.endY - annotation.startY) <
984
+ MIN_SIZE);
985
+ }
986
+ if (annotation.type === 'rectangle') {
987
+ if (!Number.isFinite(annotation.width) || !Number.isFinite(annotation.height)) {
988
+ return true;
989
+ }
990
+ return Math.abs(annotation.width) < MIN_SIZE && Math.abs(annotation.height) < MIN_SIZE;
991
+ }
992
+ return false;
993
+ }
872
994
  render() {
873
995
  var _a, _b, _c, _d, _e, _f;
874
- return (h("div", { class: "canvas-editor-wrapper" }, this.showCanvasEditor && (h("div", { class: "canvas-editor-overlay", part: "overlay" }, h("div", { class: "canvas-editor-modal", part: "modal" }, h("div", { class: "canvas-editor-header", part: "header" }, h("div", { class: "canvas-editor-title", part: "title" }, h("h3", null, this.canvasEditorTitle)), h("div", { class: "canvas-editor-toolbar", part: "toolbar" }, h("div", { class: "toolbar-section" }, h("div", { class: "tool-group" }, h("button", { class: `tool-btn ${this.canvasDrawingTool === 'rectangle' ? 'active' : ''}`, part: "tool-button", onClick: () => (this.canvasDrawingTool = 'rectangle'), title: "Rectangle" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-square" }, h("rect", { width: "18", height: "18", x: "3", y: "3", rx: "2" }))), h("button", { class: `tool-btn ${this.canvasDrawingTool === 'line' ? 'active' : ''}`, part: "tool-button", onClick: () => (this.canvasDrawingTool = 'line'), title: "Line" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-minus" }, h("path", { d: "M5 12h14" }))), h("button", { class: `tool-btn ${this.canvasDrawingTool === 'arrow' ? 'active' : ''}`, part: "tool-button", onClick: () => (this.canvasDrawingTool = 'arrow'), title: "Arrow" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-move-up-right" }, h("path", { d: "M13 5H19V11" }), h("path", { d: "M19 5L5 19" }))), h("button", { class: `tool-btn ${this.canvasDrawingTool === 'text' ? 'active' : ''}`, part: "tool-button", onClick: () => (this.canvasDrawingTool = 'text'), title: "Text" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-type" }, h("path", { d: "M12 4v16" }), h("path", { d: "M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2" }), h("path", { d: "M9 20h6" }))), h("div", { class: "toolbar-divider" }), h("button", { class: "tool-btn undo-btn", part: "tool-button", onClick: this.undoLastAnnotation, disabled: this.annotations.length === 0, title: "Undo" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-undo" }, h("path", { d: "M3 7v6h6" }), h("path", { d: "M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13" }))), this.selectedAnnotation && (h("button", { class: "tool-btn delete-btn", part: "tool-button", onClick: this.deleteSelectedAnnotation, title: "Delete" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-trash-2" }, h("path", { d: "M3 6h18" }), h("path", { d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6" }), h("path", { d: "M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2" }), h("line", { x1: "10", x2: "10", y1: "11", y2: "17" }), h("line", { x1: "14", x2: "14", y1: "11", y2: "17" })))))), h("div", { class: "toolbar-section" }, h("div", { class: "color-palette" }, this.defaultColors.map((color, index) => (h("div", { class: "color-slot-wrapper" }, h("button", { class: `color-btn ${this.canvasDrawingColor === color ? 'active' : ''} ${this.editingColorIndex === index ? 'editing' : ''}`, style: { backgroundColor: color }, onClick: () => this.handleColorSlotClick(index), title: `Color ${index + 1} - Click to customize` }, this.editingColorIndex === index && (h("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "white", "stroke-width": "2" }, h("path", { d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z" })))), this.editingColorIndex === index && this.showColorPicker && (h("div", { class: "color-picker-dropdown" }, h("input", { type: "color", value: color, onInput: (e) => this.handleColorPickerInput(e), onClick: (e) => this.handleColorPickerClick(e) })))))))), (this.selectedAnnotation || this.canvasDrawingTool) && (h("div", { class: "toolbar-section selected-annotation-controls" }, (((_a = this.selectedAnnotation) === null || _a === void 0 ? void 0 : _a.type) === 'text' ||
996
+ return (h("div", { class: "canvas-editor-wrapper" }, this.showCanvasEditor && (h("div", { class: "canvas-editor-overlay", part: "overlay", onMouseDown: this.handleOverlayMouseDown, onClick: this.handleOverlayClick }, h("div", { class: "canvas-editor-modal", part: "modal", role: "dialog", "aria-modal": "true", "aria-labelledby": "canvas-editor-title" }, h("div", { class: "canvas-editor-header", part: "header" }, h("div", { class: "canvas-editor-title", part: "title" }, h("h3", { id: "canvas-editor-title" }, this.canvasEditorTitle)), h("div", { class: "canvas-editor-toolbar", part: "toolbar" }, h("div", { class: "toolbar-section" }, h("div", { class: "tool-group" }, h("button", { class: `tool-btn ${this.canvasDrawingTool === 'rectangle' ? 'active' : ''}`, part: "tool-button", onClick: () => (this.canvasDrawingTool = 'rectangle'), title: "Rectangle" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-square" }, h("rect", { width: "18", height: "18", x: "3", y: "3", rx: "2" }))), h("button", { class: `tool-btn ${this.canvasDrawingTool === 'line' ? 'active' : ''}`, part: "tool-button", onClick: () => (this.canvasDrawingTool = 'line'), title: "Line" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-minus" }, h("path", { d: "M5 12h14" }))), h("button", { class: `tool-btn ${this.canvasDrawingTool === 'arrow' ? 'active' : ''}`, part: "tool-button", onClick: () => (this.canvasDrawingTool = 'arrow'), title: "Arrow" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-move-up-right" }, h("path", { d: "M13 5H19V11" }), h("path", { d: "M19 5L5 19" }))), h("button", { class: `tool-btn ${this.canvasDrawingTool === 'text' ? 'active' : ''}`, part: "tool-button", onClick: () => (this.canvasDrawingTool = 'text'), title: "Text" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-type" }, h("path", { d: "M12 4v16" }), h("path", { d: "M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2" }), h("path", { d: "M9 20h6" }))), h("div", { class: "toolbar-divider" }), h("button", { class: "tool-btn undo-btn", part: "tool-button", onClick: this.undoLastAnnotation, disabled: this.annotations.length === 0, title: "Undo" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-undo" }, h("path", { d: "M3 7v6h6" }), h("path", { d: "M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13" }))), this.selectedAnnotation && (h("button", { class: "tool-btn delete-btn", part: "tool-button", onClick: this.deleteSelectedAnnotation, title: "Delete" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "lucide lucide-trash-2" }, h("path", { d: "M3 6h18" }), h("path", { d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6" }), h("path", { d: "M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2" }), h("line", { x1: "10", x2: "10", y1: "11", y2: "17" }), h("line", { x1: "14", x2: "14", y1: "11", y2: "17" })))))), h("div", { class: "toolbar-section" }, h("div", { class: "color-palette" }, this.defaultColors.map((color, index) => (h("div", { class: "color-slot-wrapper" }, h("button", { class: `color-btn ${this.canvasDrawingColor === color ? 'active' : ''} ${this.editingColorIndex === index ? 'editing' : ''}`, style: { backgroundColor: color }, onClick: () => this.handleColorSlotClick(index), title: `Color ${index + 1} - Click to customize` }, this.editingColorIndex === index && (h("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "white", "stroke-width": "2" }, h("path", { d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z" })))), this.editingColorIndex === index && this.showColorPicker && (h("div", { class: "color-picker-dropdown" }, h("input", { type: "color", value: color, onInput: (e) => this.handleColorPickerInput(e), onClick: (e) => this.handleColorPickerClick(e) })))))))), (this.selectedAnnotation || this.canvasDrawingTool) && (h("div", { class: "toolbar-section selected-annotation-controls" }, (((_a = this.selectedAnnotation) === null || _a === void 0 ? void 0 : _a.type) === 'text' ||
875
997
  (!this.selectedAnnotation && this.canvasDrawingTool === 'text')) && (h("div", { class: "text-controls" }, h("div", { class: "font-size-control" }, h("label", null, this.sizeLabelText), h("input", { type: "range", min: "8", max: "72", value: ((_b = this.selectedAnnotation) === null || _b === void 0 ? void 0 : _b.fontSize) || this.canvasTextSize, onInput: (e) => {
876
998
  const newSize = parseInt(e.target.value);
877
999
  if (this.selectedAnnotation) {
@@ -1014,6 +1136,42 @@ export class CanvasEditor {
1014
1136
  "reflect": false,
1015
1137
  "defaultValue": "'Add a screenshot'"
1016
1138
  },
1139
+ "escapeClose": {
1140
+ "type": "boolean",
1141
+ "mutable": false,
1142
+ "complexType": {
1143
+ "original": "boolean",
1144
+ "resolved": "boolean",
1145
+ "references": {}
1146
+ },
1147
+ "required": false,
1148
+ "optional": false,
1149
+ "docs": {
1150
+ "tags": [],
1151
+ "text": ""
1152
+ },
1153
+ "attribute": "escape-close",
1154
+ "reflect": false,
1155
+ "defaultValue": "true"
1156
+ },
1157
+ "clickOutsideClose": {
1158
+ "type": "boolean",
1159
+ "mutable": false,
1160
+ "complexType": {
1161
+ "original": "boolean",
1162
+ "resolved": "boolean",
1163
+ "references": {}
1164
+ },
1165
+ "required": false,
1166
+ "optional": false,
1167
+ "docs": {
1168
+ "tags": [],
1169
+ "text": ""
1170
+ },
1171
+ "attribute": "click-outside-close",
1172
+ "reflect": false,
1173
+ "defaultValue": "true"
1174
+ },
1017
1175
  "autoStartScreenshot": {
1018
1176
  "type": "boolean",
1019
1177
  "mutable": false,
@@ -4,6 +4,20 @@
4
4
  letter-spacing: var(--feedback-button-letter-spacing);
5
5
  z-index: var(--feedback-button-z-index);
6
6
  font-family: var(--feedback-font-family);
7
+
8
+ /* The trigger is a real <button> so it is keyboard reachable. Strip the
9
+ user-agent button styling so the default variant stays plain text; the
10
+ --light and --dark variants below re-apply their own background,
11
+ padding and colour. */
12
+ background: none;
13
+ border: none;
14
+ margin: 0;
15
+ padding: 0;
16
+ color: inherit;
17
+ font-size: inherit;
18
+ font-weight: inherit;
19
+ line-height: inherit;
20
+ text-align: inherit;
7
21
  }
8
22
 
9
23
  .feedback-button-content--custom-font {
@@ -51,14 +65,40 @@
51
65
  right: 10px;
52
66
  }
53
67
 
68
+ .feedback-button-content--bottom-left{
69
+ bottom: 10px;
70
+ left: 10px;
71
+ position: fixed;
72
+ }
73
+
74
+ .feedback-button-content--top-right{
75
+ position: fixed;
76
+ right: 10px;
77
+ top: 10px;
78
+ }
79
+
80
+ .feedback-button-content--top-left{
81
+ left: 10px;
82
+ position: fixed;
83
+ top: 10px;
84
+ }
85
+
54
86
  .feedback-button-content--center-right{
55
87
  position: fixed;
56
88
  transform: rotate(-90deg) translateY(-50%);
57
89
  top: 50%;
58
90
  }
59
91
 
92
+ .feedback-button-content--center-left{
93
+ position: fixed;
94
+ transform: rotate(90deg) translateY(-50%);
95
+ top: 50%;
96
+ }
97
+
60
98
  .feedback-button-content--center-right.feedback-button-content--dark,
61
- .feedback-button-content--center-right.feedback-button-content--light {
99
+ .feedback-button-content--center-right.feedback-button-content--light,
100
+ .feedback-button-content--center-left.feedback-button-content--dark,
101
+ .feedback-button-content--center-left.feedback-button-content--light {
62
102
  border-radius: 4px;
63
103
  border-bottom-left-radius: 0px;
64
104
  border-bottom-right-radius: 0px;
@@ -75,6 +115,10 @@
75
115
  rotate: 90deg;
76
116
  }
77
117
 
118
+ .feedback-button-content--center-left .feedback-button-content-icon {
119
+ rotate: -90deg;
120
+ }
121
+
78
122
  @media screen and (max-width: 767px) {
79
123
  .feedback-button-content--hide-mobile {
80
124
  display: none;
@@ -8,6 +8,7 @@ export class FeedbackButton {
8
8
  this.sessionId = '';
9
9
  this.metadata = '';
10
10
  this.submit = false;
11
+ this.apiKey = '';
11
12
  this.clickOutsideClose = true;
12
13
  this.customFont = false;
13
14
  this.emailAddress = '';
@@ -24,6 +25,7 @@ export class FeedbackButton {
24
25
  this.ratingMode = 'thumbs';
25
26
  this.emailPlaceholder = 'Email address (optional)';
26
27
  this.errorMessage = 'Please try again later.';
28
+ this.errorMessage401 = 'This project requires a valid API key to submit feedback. Check the api-key attribute.';
27
29
  this.errorMessage403 = 'The request URL does not match the one defined in PushFeedback for this project.';
28
30
  this.errorMessage404 = 'We could not find the provided project id in PushFeedback.';
29
31
  this.footerText = '';
@@ -69,13 +71,19 @@ export class FeedbackButton {
69
71
  }
70
72
  }
71
73
  componentDidLoad() {
72
- if (this.buttonPosition === 'center-right') {
74
+ if (this.buttonPosition === 'center-right' || this.buttonPosition === 'center-left') {
73
75
  const buttonContent = this.el.shadowRoot.querySelector('.feedback-button-content');
74
76
  let adjustement = 0;
75
77
  if (this.isSafariBrowser()) {
76
78
  adjustement = 5;
77
79
  }
78
- buttonContent.style.right = `${((buttonContent.offsetWidth + adjustement) / 2) * -1}px`;
80
+ const offset = `${((buttonContent.offsetWidth + adjustement) / 2) * -1}px`;
81
+ if (this.buttonPosition === 'center-right') {
82
+ buttonContent.style.right = offset;
83
+ }
84
+ else {
85
+ buttonContent.style.left = offset;
86
+ }
79
87
  }
80
88
  if (!this.customFont) {
81
89
  this.loadInterFont();
@@ -84,6 +92,7 @@ export class FeedbackButton {
84
92
  connectedCallback() {
85
93
  this.feedbackModal = document.createElement('feedback-modal');
86
94
  const props = [
95
+ 'apiKey',
87
96
  'clickOutsideClose',
88
97
  'customFont',
89
98
  'emailAddress',
@@ -114,6 +123,7 @@ export class FeedbackButton {
114
123
  'screenshotErrorUnexpected',
115
124
  'emailPlaceholder',
116
125
  'errorMessage',
126
+ 'errorMessage401',
117
127
  'errorMessage403',
118
128
  'errorMessage404',
119
129
  'footerText',
@@ -178,12 +188,16 @@ export class FeedbackButton {
178
188
  }
179
189
  }
180
190
  const body = Object.assign({ url: window.location.href, project: this.project, rating: this.rating || -1, ratingMode: this.ratingMode, message: '', metadata: this.metadata, session: localStorage.getItem('pushfeedback_sessionid') || '' }, (recaptchaToken && { recaptchaToken }));
181
- const res = await fetch('https://app.pushfeedback.com/api/feedback/', {
191
+ const headers = {
192
+ 'Content-Type': 'application/json',
193
+ };
194
+ if (this.apiKey) {
195
+ headers['Authorization'] = `Api-Key ${this.apiKey}`;
196
+ }
197
+ const res = await fetch('https://app.pushfeedback.com/api/v1/feedback/', {
182
198
  method: 'POST',
183
199
  body: JSON.stringify(body),
184
- headers: {
185
- 'Content-Type': 'application/json',
186
- },
200
+ headers,
187
201
  });
188
202
  if (res.status === 201) {
189
203
  const feedback_with_id = Object.assign(Object.assign({}, body), { id: await res.json() });
@@ -214,7 +228,7 @@ export class FeedbackButton {
214
228
  }
215
229
  }
216
230
  render() {
217
- return (h(Host, null, h("a", { class: `feedback-button-content feedback-button-content--${this.buttonStyle} feedback-button-content--${this.buttonPosition} ${this.customFont ? 'feedback-button-content--custom-font' : ''} ${this.hideMobile ? 'feedback-button-content--hide-mobile' : ''}`, part: "button", onClick: () => this.showModal() }, !this.hideIcon && this.buttonStyle != 'default' && (h("span", { class: "feedback-button-content-icon", part: "icon" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#fff", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "icon-edit" }, h("path", { d: "M12 20h9" }), h("path", { d: "M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z" })))), h("slot", null))));
231
+ return (h(Host, null, h("button", { type: "button", class: `feedback-button-content feedback-button-content--${this.buttonStyle} feedback-button-content--${this.buttonPosition} ${this.customFont ? 'feedback-button-content--custom-font' : ''} ${this.hideMobile ? 'feedback-button-content--hide-mobile' : ''}`, part: "button", onClick: () => this.showModal() }, !this.hideIcon && this.buttonStyle != 'default' && (h("span", { class: "feedback-button-content-icon", part: "icon" }, h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#fff", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "icon-edit" }, h("path", { d: "M12 20h9" }), h("path", { d: "M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z" })))), h("slot", null))));
218
232
  }
219
233
  static get is() { return "feedback-button"; }
220
234
  static get encapsulation() { return "shadow"; }
@@ -242,7 +256,7 @@ export class FeedbackButton {
242
256
  "optional": false,
243
257
  "docs": {
244
258
  "tags": [],
245
- "text": ""
259
+ "text": "Position of the button on the page. Valid values: `default`, `bottom-right`, `bottom-left`, `top-right`, `top-left`, `center-right` (vertical tab on the right edge) and `center-left` (vertical tab on the left edge). Any other value behaves like `default`."
246
260
  },
247
261
  "attribute": "button-position",
248
262
  "reflect": false,
@@ -356,6 +370,24 @@ export class FeedbackButton {
356
370
  "reflect": false,
357
371
  "defaultValue": "false"
358
372
  },
373
+ "apiKey": {
374
+ "type": "string",
375
+ "mutable": false,
376
+ "complexType": {
377
+ "original": "string",
378
+ "resolved": "string",
379
+ "references": {}
380
+ },
381
+ "required": false,
382
+ "optional": false,
383
+ "docs": {
384
+ "tags": [],
385
+ "text": "Optional API key sent with feedback submissions, for projects that\nrequire one. Sent as `Authorization: Api-Key <key>` on the feedback POST\nrequest only, never on the public config request. Only use keys scoped to\n`feedback:submit`: like any credential used by an embedded widget, the\nvalue is part of the page and readable by any script running on it, so it\nprovides server-side scoping and traceability rather than client-side\nsecrecy. Intended for internal or access-controlled pages."
386
+ },
387
+ "attribute": "api-key",
388
+ "reflect": false,
389
+ "defaultValue": "''"
390
+ },
359
391
  "clickOutsideClose": {
360
392
  "type": "boolean",
361
393
  "mutable": false,
@@ -643,6 +675,24 @@ export class FeedbackButton {
643
675
  "reflect": false,
644
676
  "defaultValue": "'Please try again later.'"
645
677
  },
678
+ "errorMessage401": {
679
+ "type": "string",
680
+ "mutable": false,
681
+ "complexType": {
682
+ "original": "string",
683
+ "resolved": "string",
684
+ "references": {}
685
+ },
686
+ "required": false,
687
+ "optional": false,
688
+ "docs": {
689
+ "tags": [],
690
+ "text": ""
691
+ },
692
+ "attribute": "error-message-4-0-1",
693
+ "reflect": false,
694
+ "defaultValue": "'This project requires a valid API key to submit feedback. Check the api-key attribute.'"
695
+ },
646
696
  "errorMessage403": {
647
697
  "type": "string",
648
698
  "mutable": false,
@@ -70,6 +70,12 @@
70
70
  opacity: 1;
71
71
  }
72
72
 
73
+ /* The dialog receives programmatic focus on open so screen readers announce its
74
+ title; it is not a control, so it should not paint a focus ring */
75
+ .feedback-modal-content:focus {
76
+ outline: none;
77
+ }
78
+
73
79
  .feedback-modal-header {
74
80
  color: var(--feedback-modal-header-text-color);
75
81
  display: flex;