pushfeedback 0.1.79 → 0.1.81

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.
@@ -922,7 +922,7 @@ const FeedbackButton = class {
922
922
  this.errorMessage403 = 'The request URL does not match the one defined in PushFeedback for this project.';
923
923
  this.errorMessage404 = 'We could not find the provided project id in PushFeedback.';
924
924
  this.footerText = '';
925
- this.messagePlaceholder = 'Comments';
925
+ this.messagePlaceholder = 'Share your thoughts...';
926
926
  this.modalTitle = 'Share your feedback';
927
927
  this.modalTitleError = 'Oops!';
928
928
  this.modalTitleSuccess = 'Thanks for your feedback!';
@@ -931,6 +931,7 @@ const FeedbackButton = class {
931
931
  this.ratingStarsPlaceholder = 'How would you rate this page?';
932
932
  this.sendButtonText = 'Send';
933
933
  this.successMessage = '';
934
+ this.recaptchaText = 'This form is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Privacy Policy</a> and <a href="https://policies.google.com/terms" target="_blank" rel="noopener noreferrer">Terms of Service</a> apply.';
934
935
  this.screenshotAttachedText = 'Screenshot attached';
935
936
  this.screenshotButtonText = 'Add a screenshot';
936
937
  this.screenshotTakingText = 'Taking screenshot...';
@@ -1022,6 +1023,7 @@ const FeedbackButton = class {
1022
1023
  'screenshotTakingText',
1023
1024
  'sendButtonText',
1024
1025
  'successMessage',
1026
+ 'recaptchaText',
1025
1027
  ];
1026
1028
  props.forEach((prop) => {
1027
1029
  this.feedbackModal[prop] = this[prop];
@@ -1054,15 +1056,21 @@ const FeedbackButton = class {
1054
1056
  }
1055
1057
  async submitRatingFeedback() {
1056
1058
  try {
1057
- const body = {
1058
- url: window.location.href,
1059
- project: this.project,
1060
- rating: this.rating || -1,
1061
- ratingMode: this.ratingMode,
1062
- message: '',
1063
- metadata: this.metadata,
1064
- session: localStorage.getItem('pushfeedback_sessionid') || '',
1065
- };
1059
+ // Get reCAPTCHA token if enabled
1060
+ let recaptchaToken = null;
1061
+ if (this.feedbackModal.recaptchaEnabled) {
1062
+ recaptchaToken = await this.feedbackModal.getRecaptchaToken();
1063
+ if (!recaptchaToken) {
1064
+ // If reCAPTCHA is enabled but token retrieval failed, emit error
1065
+ const response = {
1066
+ status: 500,
1067
+ message: 'Failed to verify reCAPTCHA. Please try again.',
1068
+ };
1069
+ this.feedbackError.emit({ error: response });
1070
+ return;
1071
+ }
1072
+ }
1073
+ 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 }));
1066
1074
  const res = await fetch('https://app.pushfeedback.com/api/feedback/', {
1067
1075
  method: 'POST',
1068
1076
  body: JSON.stringify(body),
@@ -1105,7 +1113,7 @@ const FeedbackButton = class {
1105
1113
  };
1106
1114
  FeedbackButton.style = feedbackButtonCss;
1107
1115
 
1108
- const feedbackModalCss = ".text-center{flex-grow:1;text-align:center}.feedback-modal-wrapper *{font-family:var(--feedback-font-family)}.feedback-modal-wrapper--custom-font *{font-family:inherit}.feedback-modal-wrapper{position:absolute;z-index:var(--feedback-modal-modal-wrapper-z-index)}.feedback-overlay{background-color:var(--feedback-modal-screenshot-bg-color);height:100%;left:0;opacity:0;position:fixed;top:0;width:100%;z-index:var(--feedback-modal-screnshot-z-index);transition:opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.feedback-overlay--visible{opacity:1}.feedback-modal{display:inline-block;position:relative}.feedback-modal-content{background-color:var(--feedback-modal-content-bg-color);border:1px solid rgba(0, 0, 0, 0.08);border-radius:var(--feedback-modal-content-border-radius);box-shadow:0px 0px 0px 1px rgba(0, 0, 0, 0.02),\n 0px 2px 4px rgba(0, 0, 0, 0.04),\n 0px 8px 16px rgba(0, 0, 0, 0.06),\n 0px 16px 32px rgba(0, 0, 0, 0.04);box-sizing:border-box;color:var(--feedback-modal-content-text-color);display:flex;flex-direction:column;left:50%;max-width:90%;padding:24px;position:fixed;top:50%;transform:translate(-50%, -50%) scale(0.96);opacity:0;width:100%;z-index:var(--feedback-modal-content-z-index);transition:transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1)}.feedback-modal-content--open{transform:translate(-50%, -50%) scale(1);opacity:1}.feedback-modal-header{align-items:center;color:var(--feedback-modal-header-text-color);display:flex;font-size:var(--feedback-header-font-size);font-weight:var(--feedback-modal-header-font-weight);justify-content:space-between;margin-bottom:24px;letter-spacing:-0.01em}.feedback-modal-header--no-content{margin-bottom:0}.feedback-modal-rating-buttons{width:100%;margin-bottom:24px;display:flex;gap:4px}.feedback-modal-rating-button{padding:0;background-color:transparent;border:transparent;margin-right:8px;cursor:pointer}.feedback-modal-rating-buttons--stars .feedback-modal-rating-button{transition:transform 0.15s ease, opacity 0.15s ease}.feedback-modal-rating-buttons--stars .feedback-modal-rating-button:hover{transform:scale(1.1)}.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button{border:1.5px solid var(--feedback-modal-button-border-color);border-radius:var(--feedback-modal-button-border-radius);color:var(--feedback-modal-button-text-color);font-size:var(--feedback-modal-button-font-size);font-weight:500;margin-right:12px;justify-content:center;padding:10px 16px;transition:all 0.2s cubic-bezier(0.4, 0, 0.2, 1);box-shadow:0 1px 2px rgba(0, 0, 0, 0.04)}.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button:hover{transform:translateY(-2px);box-shadow:0 4px 8px rgba(0, 0, 0, 0.12)}.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button:hover,.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button--selected{background-color:var(--feedback-modal-button-bg-color-active);border:1.5px solid var(--feedback-modal-button-border-color-active);color:var(--feedback-modal-button-text-color-active)}.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button:hover svg,.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button--selected svg{stroke:var(--feedback-modal-rating-button-selected-color)}.feedback-modal-rating-buttons svg{stroke:var(--feedback-modal-rating-button-color);cursor:pointer}.feedback-modal-rating-buttons--stars .feedback-modal-rating-button--selected svg{fill:var(--feedback-modal-rating-button-stars-selected-color);stroke:var(--feedback-modal-rating-button-stars-selected-color)}.feedback-modal-text textarea{background-color:var(--feedback-modal-input-bg-color);border:1.5px solid var(--feedback-modal-input-border-color);border-radius:var(--feedback-modal-input-border-radius);box-sizing:border-box;color:var(--feedback-modal-input-text-color);font-size:var(--feedback-modal-input-font-size);margin-bottom:20px;height:100px;min-height:100px;padding:12px;resize:vertical;width:100%;transition:border-color 0.2s ease, box-shadow 0.2s ease;line-height:1.5}.feedback-modal-text textarea:hover{border-color:rgba(0, 0, 0, 0.2)}.feedback-modal-email input{background-color:var(--feedback-modal-input-bg-color);border:1.5px solid var(--feedback-modal-input-border-color);border-radius:var(--feedback-modal-input-border-radius);box-sizing:border-box;color:var(--feedback-modal-input-text-color);font-size:var(--feedback-modal-input-font-size);margin-bottom:20px;height:44px;padding:12px;width:100%;transition:border-color 0.2s ease, box-shadow 0.2s ease}.feedback-modal-email input:hover{border-color:rgba(0, 0, 0, 0.2)}.feedback-modal-privacy{font-size:var(--feedback-modal-input-font-size);margin-bottom:20px}.feedback-modal-text textarea:focus,.feedback-modal-email input:focus{border:1.5px solid var(--feedback-modal-input-border-color-focused);outline:none;box-shadow:0 0 0 3px rgba(59, 130, 246, 0.1)}.feedback-modal-buttons{display:flex;flex-direction:column}.feedback-modal-buttons .feedback-modal-button{margin-bottom:20px}.feedback-modal-button{align-items:center;background-color:transparent;border:1.5px solid var(--feedback-modal-button-border-color);border-radius:var(--feedback-modal-button-border-radius);color:var(--feedback-modal-button-text-color);cursor:pointer;display:flex;font-size:var(--feedback-modal-button-font-size);font-weight:500;justify-content:center;min-height:44px;padding:10px 16px;transition:all 0.2s cubic-bezier(0.4, 0, 0.2, 1);box-shadow:0 1px 2px rgba(0, 0, 0, 0.04)}.feedback-modal-button svg{margin-right:6px}.feedback-modal-button path{fill:var(--feedback-modal-button-icon-color)}.feedback-modal-button:hover path,.feedback-modal-button--active path{fill:var(--feedback-modal-button-icon-color-active)}.feedback-modal-button--submit{background-color:var(--feedback-modal-button-submit-bg-color);border:1.5px solid var(--feedback-modal-button-border-color-active);color:var(--feedback-modal-button-submit-text-color);box-shadow:0 2px 4px rgba(0, 0, 0, 0.1)}.feedback-modal-button:hover,.feedback-modal-button--active{background-color:var(--feedback-modal-button-bg-color-active);border:1.5px solid var(--feedback-modal-button-border-color-active);color:var(--feedback-modal-button-text-color-active);transform:translateY(-1px);box-shadow:0 4px 8px rgba(0, 0, 0, 0.12)}.feedback-modal-button--submit:hover{background-color:var(--feedback-modal-button-submit-bg-color-hover);border:1.5px solid var(--feedback-modal-button-submit-border-color-hover);color:var(--feedback-modal-button-submit-text-color-hover);transform:translateY(-1px);box-shadow:0 6px 12px rgba(0, 0, 0, 0.15)}.feedback-modal-button--submit:active{transform:translateY(0);box-shadow:0 2px 4px rgba(0, 0, 0, 0.1)}.feedback-modal-input-heading{display:block;font-size:14px;font-weight:500;padding-bottom:12px;color:var(--feedback-modal-header-text-color);letter-spacing:-0.01em}.feedback-modal-footer{font-size:12px;text-align:center}.feedback-modal-footer a{color:var(--feedback-modal-footer-link);font-weight:500;text-decoration:none}.feedback-logo,.feedback-footer-text{display:block;text-align:center;margin-top:5px}.feedback-footer-text{margin-top:10px;line-height:1.5}.feedback-modal-close{background-color:var(--feedback-modal-close-bg-color);border:0;border-radius:6px;cursor:pointer;height:32px;width:32px;margin-left:auto;padding:0;display:flex;align-items:center;justify-content:center;transition:all 0.2s ease}.feedback-modal-close:hover{background-color:rgba(0, 0, 0, 0.06);transform:scale(1.05)}.feedback-modal-close:active{transform:scale(0.95)}.feedback-modal-close svg{stroke:var(--feedback-modal-close-color)}.feedback-modal-screenshot{background-color:var(--feedback-modal-screenshot-bg-color);height:100%;left:0;position:fixed;top:0;width:100%;z-index:var(--feedback-modal-screnshot-z-index)}.feedback-modal-screenshot-header{align-items:center;background-color:var(--feedback-modal-screenshot-header-bg-color);border-radius:var(--feedback-modal-content-border-radius);box-shadow:0px 1px 2px 0px rgba(60, 64, 67, .30), 0px 2px 6px 2px rgba(60, 64, 67, .15);box-sizing:border-box;color:var(--feedback-modal-screenshot-header-text-color);cursor:pointer;display:flex;left:50%;top:20px;transform:translateX(-50%);padding:10px;position:fixed;width:max-content;z-index:var(--feedback-modal-screenshot-header-z-index)}.feedback-modal-screenshot-close{height:24px;padding-left:10px;width:24px}.feedback-modal-screenshot-close svg{stroke:var(--feedback-modal-close-color)}.feedback-modal-message{font-size:var(--feedback-modal-message-font-size);margin:0;line-height:1.6;color:var(--feedback-modal-content-text-color)}.feedback-modal-element-hover{background-color:transparent;cursor:pointer;border:1px solid var(--feedback-modal-element-hover-border-color)}.feedback-modal-element-selected{background-color:transparent;border:3px solid var(--feedback-modal-element-selected-border-color) !important;box-shadow:0 0 0 2px rgba(0, 123, 255, 0.3) !important}.screenshot-preview{display:inline-block;width:32px;height:32px;overflow:hidden;border-radius:6px;margin-right:10px;box-shadow:0 2px 4px rgba(0, 0, 0, 0.1);cursor:pointer;transition:all 0.2s cubic-bezier(0.4, 0, 0.2, 1);border:2px solid rgba(255, 255, 255, 0.8)}.screenshot-preview:hover{transform:scale(1.15);box-shadow:0 4px 8px rgba(0, 0, 0, 0.15)}.screenshot-preview img{width:100%;height:100%;object-fit:cover}.screenshot-loading{display:inline-flex;align-items:center;margin-right:8px}@media screen and (min-width: 768px){.feedback-modal-content{max-width:var(--feedback-modal-content-max-width)}.feedback-modal-content.feedback-modal-content--bottom-right{bottom:var(--feedback-modal-content-position-bottom);left:initial;right:var(--feedback-modal-content-position-right);top:initial;transform:initial}.feedback-modal-content.feedback-modal-content--bottom-left{bottom:var(--feedback-modal-content-position-bottom);left:var(--feedback-modal-content-position-left);top:initial;transform:initial}.feedback-modal-content.feedback-modal-content--top-right{right:var(--feedback-modal-content-position-right);top:var(--feedback-modal-content-position-top);transform:initial}.feedback-modal-content.feedback-modal-content--top-left{left:var(--feedback-modal-content-position-left);top:var(--feedback-modal-content-position-top);transform:initial}.feedback-modal-content.feedback-modal-content--center-left{left:5px;right:auto;top:50%;transform:translateY(-50%)}.feedback-modal-content.feedback-modal-content--center-right{left:auto;right:5px;top:50%;transform:translateY(-50%)}.feedback-modal-content.feedback-modal-content--sidebar-left.feedback-modal-content--open,.feedback-modal-content.feedback-modal-content--sidebar-right.feedback-modal-content--open{transform:translateX(0)}.feedback-modal-content.feedback-modal-content--sidebar-left{max-width:var(--feedback-modal-content-sidebar-max-width);left:0;right:auto;height:100vh;top:0;transform:translateX(-100%);transition:transform 0.5s ease-in-out;border-radius:0}.feedback-modal-content.feedback-modal-content--sidebar-right{max-width:var(--feedback-modal-content-sidebar-max-width);left:auto;right:0;height:100vh;top:0;transform:translateX(100%);transition:transform 0.5s ease-in-out;border-radius:0}.feedback-modal-text textarea{height:150px;min-height:150px}.feedback-modal-content.feedback-modal-content--bottom-right{transform:translateY(20px)}.feedback-modal-content.feedback-modal-content--bottom-right.feedback-modal-content--open{transform:translateY(0)}.feedback-modal-content.feedback-modal-content--bottom-left{transform:translateY(20px)}.feedback-modal-content.feedback-modal-content--bottom-left.feedback-modal-content--open{transform:translateY(0)}.feedback-modal-content.feedback-modal-content--top-right{transform:translateY(-20px)}.feedback-modal-content.feedback-modal-content--top-right.feedback-modal-content--open{transform:translateY(0)}.feedback-modal-content.feedback-modal-content--top-left{transform:translateY(-20px)}.feedback-modal-content.feedback-modal-content--top-left.feedback-modal-content--open{transform:translateY(0)}}@keyframes feather-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.feather-loader{animation:feather-spin 1s linear infinite;display:block}.screenshot-error-notification{position:fixed;top:20px;left:50%;transform:translateX(-50%);z-index:10001;max-width:500px;width:90%;animation:slideDown 0.3s ease-out}@keyframes slideDown{from{opacity:0;transform:translateX(-50%) translateY(-20px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}.screenshot-error-content{background:#fee;border:1.5px solid #fcc;border-radius:10px;padding:14px 18px;display:flex;align-items:center;gap:12px;box-shadow:0 0 0 1px rgba(197, 48, 48, 0.05),\n 0 4px 6px rgba(0, 0, 0, 0.07),\n 0 10px 20px rgba(0, 0, 0, 0.1);color:#c53030}.screenshot-error-content svg:first-child{color:#e53e3e;flex-shrink:0}.screenshot-error-content span{flex:1;font-size:14px;line-height:1.4;font-weight:500}.error-close-btn{background:none;border:none;cursor:pointer;padding:6px;border-radius:6px;color:#c53030;flex-shrink:0;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center}.error-close-btn:hover{background:rgba(197, 48, 48, 0.15);transform:scale(1.1)}.error-close-btn:active{transform:scale(0.95)}@media screen and (max-width: 768px){.feedback-modal-content{width:100vw;height:100dvh;max-width:none;border-radius:0;top:0;left:0;transform:scale(0.95);padding:24px 20px;display:flex;flex-direction:column}.feedback-modal-content--open{transform:scale(1)}.feedback-modal-buttons{display:flex;flex-direction:column;gap:12px}.feedback-modal-button--screenshot{display:none !important}.feedback-modal-button--submit{width:100%}.feedback-modal-text textarea{flex:1;min-height:120px;resize:none}}";
1116
+ const feedbackModalCss = ".text-center{flex-grow:1;text-align:center}.feedback-modal-wrapper *{font-family:var(--feedback-font-family)}.feedback-modal-wrapper--custom-font *{font-family:inherit}.feedback-modal-wrapper{position:absolute;z-index:var(--feedback-modal-modal-wrapper-z-index)}.feedback-overlay{background-color:var(--feedback-modal-screenshot-bg-color);height:100%;left:0;opacity:0;position:fixed;top:0;width:100%;z-index:var(--feedback-modal-screnshot-z-index);transition:opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.feedback-overlay--visible{opacity:1}.feedback-modal{display:inline-block;position:relative}.feedback-modal-content{background-color:var(--feedback-modal-content-bg-color);border:1px solid rgba(0, 0, 0, 0.08);border-radius:var(--feedback-modal-content-border-radius);box-shadow:0px 0px 0px 1px rgba(0, 0, 0, 0.02),\n 0px 2px 4px rgba(0, 0, 0, 0.04),\n 0px 8px 16px rgba(0, 0, 0, 0.06),\n 0px 16px 32px rgba(0, 0, 0, 0.04);box-sizing:border-box;color:var(--feedback-modal-content-text-color);display:flex;flex-direction:column;left:50%;max-width:90%;padding:24px;position:fixed;top:50%;transform:translate(-50%, -50%) scale(0.96);opacity:0;width:100%;z-index:var(--feedback-modal-content-z-index);transition:transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1)}.feedback-modal-content--open{transform:translate(-50%, -50%) scale(1);opacity:1}.feedback-modal-header{color:var(--feedback-modal-header-text-color);display:flex;font-size:var(--feedback-modal-header-font-size);font-weight:var(--feedback-modal-header-font-weight);justify-content:space-between;align-items:flex-start;margin-bottom:24px;letter-spacing:-0.01em}.feedback-modal-header-content{flex:1}.feedback-modal-header-text{display:flex;flex-direction:column;gap:6px}.feedback-modal-title{display:block}.feedback-modal-powered-by{display:block;font-size:13px;font-weight:400;color:var(--feedback-color-gray-500);line-height:1.4}.feedback-modal-powered-by a{color:var(--feedback-modal-header-text-color);text-decoration:none;font-weight:500}.feedback-modal-powered-by a:hover{text-decoration:underline}.feedback-modal-header--no-content{margin-bottom:0}.feedback-modal-rating-buttons{width:100%;margin-bottom:24px;display:flex;gap:4px}.feedback-modal-rating-button{padding:0;background-color:transparent;border:transparent;margin-right:8px;cursor:pointer}.feedback-modal-rating-buttons--stars .feedback-modal-rating-button{transition:transform 0.15s ease, opacity 0.15s ease}.feedback-modal-rating-buttons--stars .feedback-modal-rating-button:hover{transform:scale(1.1)}.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button{border:1.5px solid var(--feedback-modal-button-border-color);border-radius:var(--feedback-modal-button-border-radius);color:var(--feedback-modal-button-text-color);font-size:var(--feedback-modal-button-font-size);font-weight:500;margin-right:12px;justify-content:center;padding:10px 16px;transition:all 0.2s cubic-bezier(0.4, 0, 0.2, 1);box-shadow:0 1px 2px rgba(0, 0, 0, 0.04)}.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button:hover{transform:translateY(-2px);box-shadow:0 4px 8px rgba(0, 0, 0, 0.12)}.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button:hover,.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button--selected{background-color:var(--feedback-modal-button-bg-color-active);border:1.5px solid var(--feedback-modal-button-border-color-active);color:var(--feedback-modal-button-text-color-active)}.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button:hover svg,.feedback-modal-rating-buttons--thumbs .feedback-modal-rating-button--selected svg{stroke:var(--feedback-modal-rating-button-selected-color)}.feedback-modal-rating-buttons svg{stroke:var(--feedback-modal-rating-button-color);cursor:pointer}.feedback-modal-rating-buttons--stars .feedback-modal-rating-button--selected svg{fill:var(--feedback-modal-rating-button-stars-selected-color);stroke:var(--feedback-modal-rating-button-stars-selected-color)}.feedback-modal-text textarea{background-color:var(--feedback-modal-input-bg-color);border:1.5px solid var(--feedback-modal-input-border-color);border-radius:var(--feedback-modal-input-border-radius);box-sizing:border-box;color:var(--feedback-modal-input-text-color);font-size:var(--feedback-modal-input-font-size);margin-bottom:20px;height:100px;min-height:100px;padding:12px;resize:vertical;width:100%;transition:border-color 0.2s ease, box-shadow 0.2s ease;line-height:1.5}.feedback-modal-text textarea:hover{border-color:var(--feedback-modal-input-border-color-hover)}.feedback-modal-email input{background-color:var(--feedback-modal-input-bg-color);border:1.5px solid var(--feedback-modal-input-border-color);border-radius:var(--feedback-modal-input-border-radius);box-sizing:border-box;color:var(--feedback-modal-input-text-color);font-size:var(--feedback-modal-input-font-size);margin-bottom:20px;height:44px;padding:12px;width:100%;transition:border-color 0.2s ease, box-shadow 0.2s ease}.feedback-modal-email input:hover{border-color:var(--feedback-modal-input-border-color-hover)}.feedback-modal-text textarea:-webkit-autofill,.feedback-modal-email input:-webkit-autofill,.feedback-modal-email input:-webkit-autofill:hover,.feedback-modal-email input:-webkit-autofill:focus,.feedback-modal-email input:-webkit-autofill:active{-webkit-box-shadow:0 0 0 1000px var(--feedback-modal-input-bg-color) inset !important;-webkit-text-fill-color:var(--feedback-modal-input-text-color) !important;transition:background-color 5000s ease-in-out 0s}.feedback-modal-privacy{font-size:var(--feedback-modal-input-font-size);margin-bottom:20px}.feedback-modal-text textarea:focus,.feedback-modal-email input:focus{border:1.5px solid var(--feedback-modal-input-border-color-focused);outline:none;box-shadow:0 0 0 3px rgba(59, 130, 246, 0.1)}.feedback-modal-buttons{display:flex;flex-direction:column}.feedback-modal-buttons .feedback-modal-button{margin-bottom:20px}.feedback-modal-button{align-items:center;background-color:transparent;border:1.5px solid var(--feedback-modal-button-border-color);border-radius:var(--feedback-modal-button-border-radius);color:var(--feedback-modal-button-text-color);cursor:pointer;display:flex;font-size:var(--feedback-modal-button-font-size);font-weight:500;justify-content:center;min-height:44px;padding:10px 16px;transition:all 0.2s cubic-bezier(0.4, 0, 0.2, 1);box-shadow:0 1px 2px rgba(0, 0, 0, 0.04)}.feedback-modal-button svg{margin-right:6px}.feedback-modal-button path{fill:var(--feedback-modal-button-icon-color)}.feedback-modal-button:hover path,.feedback-modal-button--active path{fill:var(--feedback-modal-button-icon-color-active)}.feedback-modal-button--submit{background-color:var(--feedback-modal-button-submit-bg-color);border:1.5px solid var(--feedback-modal-button-border-color-active);color:var(--feedback-modal-button-submit-text-color);box-shadow:0 2px 4px rgba(0, 0, 0, 0.1)}.feedback-modal-button:hover,.feedback-modal-button--active{background-color:var(--feedback-modal-button-bg-color-active);border:1.5px solid var(--feedback-modal-button-border-color-active);color:var(--feedback-modal-button-text-color-active);transform:translateY(-1px);box-shadow:0 4px 8px rgba(0, 0, 0, 0.12)}.feedback-modal-button--submit:hover{background-color:var(--feedback-modal-button-submit-bg-color-hover);border:1.5px solid var(--feedback-modal-button-submit-border-color-hover);color:var(--feedback-modal-button-submit-text-color-hover);transform:translateY(-1px);box-shadow:0 6px 12px rgba(0, 0, 0, 0.15)}.feedback-modal-button--submit:active{transform:translateY(0);box-shadow:0 2px 4px rgba(0, 0, 0, 0.1)}.feedback-modal-input-heading{display:block;font-size:14px;font-weight:500;padding-bottom:12px;color:var(--feedback-modal-header-text-color);letter-spacing:-0.01em}.feedback-modal-footer{font-size:12px;text-align:center}.feedback-modal-footer a{color:var(--feedback-modal-footer-link);font-weight:500;text-decoration:none}.feedback-logo,.feedback-footer-text{display:block;text-align:center;margin-top:5px}.feedback-footer-text{margin-top:10px;line-height:1.5}.feedback-footer-combined{display:block;text-align:center;font-size:11px;color:#666;line-height:1.5}.feedback-footer-combined a{color:#666;text-decoration:underline}.feedback-recaptcha-notice{display:block;text-align:center;margin-bottom:10px;font-size:11px;color:#666;line-height:1.4}.feedback-recaptcha-notice a{color:#666;text-decoration:underline}.feedback-modal-close{background-color:var(--feedback-modal-close-bg-color);border:0;border-radius:6px;cursor:pointer;height:32px;width:32px;margin-left:auto;padding:0;display:flex;align-items:center;justify-content:center;transition:all 0.2s ease}.feedback-modal-close:hover{background-color:rgba(0, 0, 0, 0.06);transform:scale(1.05)}.feedback-modal-close:active{transform:scale(0.95)}.feedback-modal-close svg{stroke:var(--feedback-modal-close-color)}.feedback-modal-screenshot{background-color:var(--feedback-modal-screenshot-bg-color);height:100%;left:0;position:fixed;top:0;width:100%;z-index:var(--feedback-modal-screnshot-z-index)}.feedback-modal-screenshot-header{align-items:center;background-color:var(--feedback-modal-screenshot-header-bg-color);border-radius:var(--feedback-modal-content-border-radius);box-shadow:0px 1px 2px 0px rgba(60, 64, 67, .30), 0px 2px 6px 2px rgba(60, 64, 67, .15);box-sizing:border-box;color:var(--feedback-modal-screenshot-header-text-color);cursor:pointer;display:flex;left:50%;top:20px;transform:translateX(-50%);padding:10px;position:fixed;width:max-content;z-index:var(--feedback-modal-screenshot-header-z-index)}.feedback-modal-screenshot-close{height:24px;padding-left:10px;width:24px}.feedback-modal-screenshot-close svg{stroke:var(--feedback-modal-close-color)}.feedback-modal-message{font-size:var(--feedback-modal-message-font-size);margin:0;line-height:1.6;color:var(--feedback-modal-content-text-color)}.feedback-modal-element-hover{background-color:transparent;cursor:pointer;border:1px solid var(--feedback-modal-element-hover-border-color)}.feedback-modal-element-selected{background-color:transparent;border:3px solid var(--feedback-modal-element-selected-border-color) !important;box-shadow:0 0 0 2px rgba(0, 123, 255, 0.3) !important}.screenshot-preview{display:inline-block;width:32px;height:32px;overflow:hidden;border-radius:6px;margin-right:10px;box-shadow:0 2px 4px rgba(0, 0, 0, 0.1);cursor:pointer;transition:all 0.2s cubic-bezier(0.4, 0, 0.2, 1);border:2px solid rgba(255, 255, 255, 0.8)}.screenshot-preview:hover{transform:scale(1.15);box-shadow:0 4px 8px rgba(0, 0, 0, 0.15)}.screenshot-preview img{width:100%;height:100%;object-fit:cover}.screenshot-loading{display:inline-flex;align-items:center;margin-right:8px}@media screen and (min-width: 768px){.feedback-modal-content{max-width:var(--feedback-modal-content-max-width)}.feedback-modal-content.feedback-modal-content--bottom-right{bottom:var(--feedback-modal-content-position-bottom);left:initial;right:var(--feedback-modal-content-position-right);top:initial;transform:initial}.feedback-modal-content.feedback-modal-content--bottom-left{bottom:var(--feedback-modal-content-position-bottom);left:var(--feedback-modal-content-position-left);top:initial;transform:initial}.feedback-modal-content.feedback-modal-content--top-right{right:var(--feedback-modal-content-position-right);top:var(--feedback-modal-content-position-top);transform:initial}.feedback-modal-content.feedback-modal-content--top-left{left:var(--feedback-modal-content-position-left);top:var(--feedback-modal-content-position-top);transform:initial}.feedback-modal-content.feedback-modal-content--center-left{left:5px;right:auto;top:50%;transform:translateY(-50%)}.feedback-modal-content.feedback-modal-content--center-right{left:auto;right:5px;top:50%;transform:translateY(-50%)}.feedback-modal-content.feedback-modal-content--sidebar-left.feedback-modal-content--open,.feedback-modal-content.feedback-modal-content--sidebar-right.feedback-modal-content--open{transform:translateX(0)}.feedback-modal-content.feedback-modal-content--sidebar-left{max-width:var(--feedback-modal-content-sidebar-max-width);left:0;right:auto;height:100vh;top:0;transform:translateX(-100%);transition:transform 0.5s ease-in-out;border-radius:0}.feedback-modal-content.feedback-modal-content--sidebar-right{max-width:var(--feedback-modal-content-sidebar-max-width);left:auto;right:0;height:100vh;top:0;transform:translateX(100%);transition:transform 0.5s ease-in-out;border-radius:0}.feedback-modal-text textarea{height:150px;min-height:150px}.feedback-modal-content.feedback-modal-content--bottom-right{transform:translateY(20px)}.feedback-modal-content.feedback-modal-content--bottom-right.feedback-modal-content--open{transform:translateY(0)}.feedback-modal-content.feedback-modal-content--bottom-left{transform:translateY(20px)}.feedback-modal-content.feedback-modal-content--bottom-left.feedback-modal-content--open{transform:translateY(0)}.feedback-modal-content.feedback-modal-content--top-right{transform:translateY(-20px)}.feedback-modal-content.feedback-modal-content--top-right.feedback-modal-content--open{transform:translateY(0)}.feedback-modal-content.feedback-modal-content--top-left{transform:translateY(-20px)}.feedback-modal-content.feedback-modal-content--top-left.feedback-modal-content--open{transform:translateY(0)}}@keyframes feather-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.feather-loader{animation:feather-spin 1s linear infinite;display:block}.screenshot-error-notification{position:fixed;top:20px;left:50%;transform:translateX(-50%);z-index:10001;max-width:500px;width:90%;animation:slideDown 0.3s ease-out}@keyframes slideDown{from{opacity:0;transform:translateX(-50%) translateY(-20px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}.screenshot-error-content{background:#fee;border:1.5px solid #fcc;border-radius:10px;padding:14px 18px;display:flex;align-items:center;gap:12px;box-shadow:0 0 0 1px rgba(197, 48, 48, 0.05),\n 0 4px 6px rgba(0, 0, 0, 0.07),\n 0 10px 20px rgba(0, 0, 0, 0.1);color:#c53030}.screenshot-error-content svg:first-child{color:#e53e3e;flex-shrink:0}.screenshot-error-content span{flex:1;font-size:14px;line-height:1.4;font-weight:500}.error-close-btn{background:none;border:none;cursor:pointer;padding:6px;border-radius:6px;color:#c53030;flex-shrink:0;transition:all 0.2s ease;display:flex;align-items:center;justify-content:center}.error-close-btn:hover{background:rgba(197, 48, 48, 0.15);transform:scale(1.1)}.error-close-btn:active{transform:scale(0.95)}@media screen and (max-width: 768px){.feedback-modal-content{width:100vw;height:100dvh;max-width:none;border-radius:0;top:0;left:0;transform:scale(0.95);padding:24px 20px;display:flex;flex-direction:column}.feedback-modal-content--open{transform:scale(1)}.feedback-modal-buttons{display:flex;flex-direction:column;gap:12px}.feedback-modal-button--screenshot{display:none !important}.feedback-modal-button--submit{width:100%}.feedback-modal-text textarea{flex:1;min-height:120px;resize:none}}";
1109
1117
 
1110
1118
  const FeedbackModal = class {
1111
1119
  constructor(hostRef) {
@@ -1131,18 +1139,21 @@ const FeedbackModal = class {
1131
1139
  this.showModal = false;
1132
1140
  this.sending = true;
1133
1141
  try {
1134
- const body = {
1135
- url: window.location.href,
1136
- message: this.formMessage,
1137
- email: this.formEmail,
1138
- project: this.project,
1139
- screenshot: this.encodedScreenshot,
1140
- rating: this.selectedRating,
1141
- ratingMode: this.ratingMode,
1142
- metadata: this.metadata,
1143
- verification: this.formVerification,
1144
- session: localStorage.getItem('pushfeedback_sessionid') || '',
1145
- };
1142
+ // Get reCAPTCHA token if enabled
1143
+ let recaptchaToken = null;
1144
+ if (this.recaptchaEnabled) {
1145
+ recaptchaToken = await this.getRecaptchaToken();
1146
+ if (!recaptchaToken) {
1147
+ // If reCAPTCHA is enabled but token retrieval failed, show error
1148
+ this.formSuccess = false;
1149
+ this.formError = true;
1150
+ this.formErrorStatus = 500;
1151
+ this.sending = false;
1152
+ this.showModal = true;
1153
+ return;
1154
+ }
1155
+ }
1156
+ const body = Object.assign({ url: window.location.href, message: this.formMessage, email: this.formEmail, project: this.project, screenshot: this.encodedScreenshot, rating: this.selectedRating, ratingMode: this.ratingMode, metadata: this.metadata, verification: this.formVerification, session: localStorage.getItem('pushfeedback_sessionid') || '' }, (recaptchaToken && { recaptchaToken }));
1146
1157
  const res = await fetch('https://app.pushfeedback.com/api/feedback/', {
1147
1158
  method: 'POST',
1148
1159
  body: JSON.stringify(body),
@@ -1272,6 +1283,8 @@ const FeedbackModal = class {
1272
1283
  this.selectedRating = -1;
1273
1284
  this.overlayVisible = false;
1274
1285
  this.isAnimating = false;
1286
+ this.recaptchaEnabled = false;
1287
+ this.recaptchaSiteKey = null;
1275
1288
  this.takingScreenshot = false;
1276
1289
  this.showScreenshotError = false;
1277
1290
  this.screenshotError = '';
@@ -1297,7 +1310,7 @@ const FeedbackModal = class {
1297
1310
  this.errorMessage = 'Please try again later.';
1298
1311
  this.errorMessage403 = 'The request URL does not match the one defined in PushFeedback for this project.';
1299
1312
  this.errorMessage404 = 'We could not find the provided project ID in PushFeedback.';
1300
- this.messagePlaceholder = 'Comments';
1313
+ this.messagePlaceholder = 'Share your thoughts...';
1301
1314
  this.footerText = '';
1302
1315
  this.modalPosition = 'center';
1303
1316
  this.modalTitle = 'Share your feedback';
@@ -1308,6 +1321,7 @@ const FeedbackModal = class {
1308
1321
  this.ratingStarsPlaceholder = 'How would you rate this page?';
1309
1322
  this.sendButtonText = 'Send';
1310
1323
  this.successMessage = '';
1324
+ this.recaptchaText = 'This form is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Privacy Policy</a> and <a href="https://policies.google.com/terms" target="_blank" rel="noopener noreferrer">Terms of Service</a> apply.';
1311
1325
  this.screenshotAttachedText = 'Screenshot attached';
1312
1326
  this.screenshotButtonText = 'Add a screenshot';
1313
1327
  this.screenshotTakingText = 'Taking screenshot...';
@@ -1342,11 +1356,64 @@ const FeedbackModal = class {
1342
1356
  const response = await fetch('https://app.pushfeedback.com/api/projects/' + this.project + '/');
1343
1357
  const data = await response.json();
1344
1358
  this.whitelabel = data.whitelabel;
1359
+ this.recaptchaEnabled = data.recaptcha_enabled || false;
1360
+ this.recaptchaSiteKey = data.recaptcha_site_key || null;
1361
+ // Load reCAPTCHA script if enabled
1362
+ if (this.recaptchaEnabled && this.recaptchaSiteKey) {
1363
+ this.loadRecaptchaScript();
1364
+ }
1345
1365
  }
1346
1366
  catch (error) {
1347
1367
  console.log(error);
1348
1368
  }
1349
1369
  }
1370
+ loadRecaptchaScript() {
1371
+ // Check if script already loaded
1372
+ if (document.querySelector('script[src*="google.com/recaptcha"]')) {
1373
+ return;
1374
+ }
1375
+ const script = document.createElement('script');
1376
+ script.src = `https://www.google.com/recaptcha/api.js?render=${this.recaptchaSiteKey}`;
1377
+ script.async = true;
1378
+ script.defer = true;
1379
+ document.head.appendChild(script);
1380
+ }
1381
+ async getRecaptchaToken() {
1382
+ if (!this.recaptchaEnabled || !this.recaptchaSiteKey) {
1383
+ return null;
1384
+ }
1385
+ try {
1386
+ // Wait for grecaptcha to be available
1387
+ let attempts = 0;
1388
+ while (!window['grecaptcha'] && attempts < 50) {
1389
+ await new Promise(resolve => setTimeout(resolve, 100));
1390
+ attempts++;
1391
+ }
1392
+ if (!window['grecaptcha']) {
1393
+ console.error('reCAPTCHA script not loaded');
1394
+ return null;
1395
+ }
1396
+ // Use ready() to ensure grecaptcha is fully initialized before executing
1397
+ return await new Promise((resolve, reject) => {
1398
+ window['grecaptcha'].ready(async () => {
1399
+ try {
1400
+ const token = await window['grecaptcha'].execute(this.recaptchaSiteKey, {
1401
+ action: 'submit_feedback'
1402
+ });
1403
+ resolve(token);
1404
+ }
1405
+ catch (error) {
1406
+ console.error('reCAPTCHA execution error:', error);
1407
+ reject(error);
1408
+ }
1409
+ });
1410
+ });
1411
+ }
1412
+ catch (error) {
1413
+ console.error('reCAPTCHA error:', error);
1414
+ return null;
1415
+ }
1416
+ }
1350
1417
  resetOverflow() {
1351
1418
  // Just clean up any stray classes, don't add/remove during screenshot
1352
1419
  document.documentElement.classList.remove('feedback-modal-screenshot-open');
@@ -1369,7 +1436,7 @@ const FeedbackModal = class {
1369
1436
  this.selectedRating = newRating;
1370
1437
  }
1371
1438
  render() {
1372
- return (index.h("div", { class: `feedback-modal-wrapper ${this.customFont ? 'feedback-modal-wrapper--custom-font' : ''}` }, this.showCanvasEditor && (index.h("canvas-editor", { ref: (el) => this.canvasEditorRef = el, "canvas-editor-title": this.screenshotEditorTitle, "canvas-editor-cancel-text": this.screenshotEditorCancelText, "canvas-editor-save-text": this.screenshotEditorSaveText, "screenshot-taking-text": this.screenshotTakingText, "screenshot-attached-text": this.screenshotAttachedText, "screenshot-button-text": this.screenshotButtonText, "auto-start-screenshot": this.autoStartCapture, "existing-screenshot": this.encodedScreenshot || '', "edit-text-button-text": this.screenshotEditTextButtonText, "size-label-text": this.screenshotSizeLabelText, "border-label-text": this.screenshotBorderLabelText, "edit-text-prompt-text": this.screenshotEditTextPromptText, "screenshot-error-general": this.screenshotErrorGeneral, "screenshot-error-permission": this.screenshotErrorPermission, "screenshot-error-not-supported": this.screenshotErrorNotSupported, "screenshot-error-not-found": this.screenshotErrorNotFound, "screenshot-error-cancelled": this.screenshotErrorCancelled, "screenshot-error-browser-not-supported": this.screenshotErrorBrowserNotSupported, "screenshot-error-unexpected": this.screenshotErrorUnexpected, onScreenshotReady: this.handleScreenshotReady, onScreenshotCancelled: this.handleScreenshotCancelled, onScreenshotFailed: this.handleScreenshotError })), this.showScreenshotError && (index.h("div", { class: "screenshot-error-notification" }, index.h("div", { class: "screenshot-error-content" }, index.h("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, index.h("circle", { cx: "12", cy: "12", r: "10" }), index.h("line", { x1: "15", y1: "9", x2: "9", y2: "15" }), index.h("line", { x1: "9", y1: "9", x2: "15", y2: "15" })), index.h("span", null, this.screenshotError), index.h("button", { class: "error-close-btn", onClick: () => this.showScreenshotError = false, title: "Close" }, index.h("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, index.h("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), index.h("line", { x1: "6", y1: "6", x2: "18", y2: "18" })))))), this.showModal && (index.h("div", { class: `feedback-overlay ${this.isAnimating ? 'feedback-overlay--visible' : ''}` })), this.showModal && (index.h("div", { class: `feedback-modal-content feedback-modal-content--${this.modalPosition} ${this.isAnimating ? 'feedback-modal-content--open' : ''}`, ref: (el) => (this.modalContent = el) }, index.h("div", { class: `feedback-modal-header ${(this.formSuccess && !this.successMessage) || (this.formError && !this.errorMessage) ? 'feedback-modal-header--no-content' : ''}` }, !this.formSuccess && !this.formError ? (index.h("span", null, this.modalTitle)) : this.formSuccess ? (index.h("span", null, this.modalTitleSuccess)) : (index.h("span", null, this.modalTitleError)), index.h("button", { class: "feedback-modal-close", onClick: this.close }, index.h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "#191919", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "feather feather-x" }, index.h("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), index.h("line", { x1: "6", y1: "6", x2: "18", y2: "18" })))), index.h("div", { class: "feedback-modal-body" }, !this.formSuccess && !this.formError ? (index.h("form", { onSubmit: this.handleSubmit }, !this.hideRating && (index.h("div", { class: "feedback-modal-rating" }, this.ratingMode === 'thumbs' ? (index.h("div", { class: "feedback-modal-rating-content" }, index.h("span", { class: "feedback-modal-input-heading" }, this.ratingPlaceholder), index.h("div", { class: "feedback-modal-rating-buttons feedback-modal-rating-buttons--thumbs" }, index.h("button", { title: "Yes", class: `feedback-modal-rating-button ${this.selectedRating === 1
1439
+ return (index.h("div", { class: `feedback-modal-wrapper ${this.customFont ? 'feedback-modal-wrapper--custom-font' : ''}` }, this.showCanvasEditor && (index.h("canvas-editor", { ref: (el) => this.canvasEditorRef = el, "canvas-editor-title": this.screenshotEditorTitle, "canvas-editor-cancel-text": this.screenshotEditorCancelText, "canvas-editor-save-text": this.screenshotEditorSaveText, "screenshot-taking-text": this.screenshotTakingText, "screenshot-attached-text": this.screenshotAttachedText, "screenshot-button-text": this.screenshotButtonText, "auto-start-screenshot": this.autoStartCapture, "existing-screenshot": this.encodedScreenshot || '', "edit-text-button-text": this.screenshotEditTextButtonText, "size-label-text": this.screenshotSizeLabelText, "border-label-text": this.screenshotBorderLabelText, "edit-text-prompt-text": this.screenshotEditTextPromptText, "screenshot-error-general": this.screenshotErrorGeneral, "screenshot-error-permission": this.screenshotErrorPermission, "screenshot-error-not-supported": this.screenshotErrorNotSupported, "screenshot-error-not-found": this.screenshotErrorNotFound, "screenshot-error-cancelled": this.screenshotErrorCancelled, "screenshot-error-browser-not-supported": this.screenshotErrorBrowserNotSupported, "screenshot-error-unexpected": this.screenshotErrorUnexpected, onScreenshotReady: this.handleScreenshotReady, onScreenshotCancelled: this.handleScreenshotCancelled, onScreenshotFailed: this.handleScreenshotError })), this.showScreenshotError && (index.h("div", { class: "screenshot-error-notification" }, index.h("div", { class: "screenshot-error-content" }, index.h("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, index.h("circle", { cx: "12", cy: "12", r: "10" }), index.h("line", { x1: "15", y1: "9", x2: "9", y2: "15" }), index.h("line", { x1: "9", y1: "9", x2: "15", y2: "15" })), index.h("span", null, this.screenshotError), index.h("button", { class: "error-close-btn", onClick: () => this.showScreenshotError = false, title: "Close" }, index.h("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, index.h("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), index.h("line", { x1: "6", y1: "6", x2: "18", y2: "18" })))))), this.showModal && (index.h("div", { class: `feedback-overlay ${this.isAnimating ? 'feedback-overlay--visible' : ''}` })), this.showModal && (index.h("div", { class: `feedback-modal-content feedback-modal-content--${this.modalPosition} ${this.isAnimating ? 'feedback-modal-content--open' : ''}`, ref: (el) => (this.modalContent = el) }, index.h("div", { class: `feedback-modal-header ${(this.formSuccess && !this.successMessage) || (this.formError && !this.errorMessage) ? 'feedback-modal-header--no-content' : ''}` }, index.h("div", { class: "feedback-modal-header-content" }, !this.formSuccess && !this.formError ? (index.h("div", { class: "feedback-modal-header-text" }, index.h("span", { class: "feedback-modal-title" }, this.modalTitle), !this.whitelabel && (index.h("span", { class: "feedback-modal-powered-by" }, "Powered by", ' ', index.h("a", { target: "_blank", href: "https://pushfeedback.com" }, "PushFeedback"))))) : this.formSuccess ? (index.h("span", { class: "feedback-modal-title" }, this.modalTitleSuccess)) : (index.h("span", { class: "feedback-modal-title" }, this.modalTitleError))), index.h("button", { class: "feedback-modal-close", onClick: this.close }, index.h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "#191919", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "feather feather-x" }, index.h("line", { x1: "18", y1: "6", x2: "6", y2: "18" }), index.h("line", { x1: "6", y1: "6", x2: "18", y2: "18" })))), index.h("div", { class: "feedback-modal-body" }, !this.formSuccess && !this.formError ? (index.h("form", { onSubmit: this.handleSubmit }, !this.hideRating && (index.h("div", { class: "feedback-modal-rating" }, this.ratingMode === 'thumbs' ? (index.h("div", { class: "feedback-modal-rating-content" }, index.h("span", { class: "feedback-modal-input-heading" }, this.ratingPlaceholder), index.h("div", { class: "feedback-modal-rating-buttons feedback-modal-rating-buttons--thumbs" }, index.h("button", { title: "Yes", class: `feedback-modal-rating-button ${this.selectedRating === 1
1373
1440
  ? 'feedback-modal-rating-button--selected'
1374
1441
  : ''}`, onClick: (event) => {
1375
1442
  event.preventDefault();
@@ -1385,7 +1452,7 @@ const FeedbackModal = class {
1385
1452
  event.preventDefault();
1386
1453
  this.handleRatingChange(rating);
1387
1454
  } }, index.h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: "#5F6368", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, index.h("polygon", { points: "12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" })))))))))), index.h("div", { class: "feedback-modal-text" }, index.h("textarea", { placeholder: this.messagePlaceholder, value: this.formMessage, onInput: (event) => this.handleMessageInput(event) })), !this.hideEmail && (index.h("div", { class: "feedback-modal-email" }, index.h("input", { placeholder: this.emailPlaceholder, type: "email", onInput: (event) => this.handleEmailInput(event), value: this.formEmail, required: this.isEmailRequired }))), index.h("div", { class: "feedback-verification" }, index.h("input", { type: "text", name: "verification", style: { display: 'none' }, onInput: (event) => this.handleVerification(event), value: this.formVerification })), !this.hidePrivacyPolicy && (index.h("div", { class: "feedback-modal-privacy" }, index.h("input", { type: "checkbox", id: "privacyPolicy", onChange: (ev) => this.handleCheckboxChange(ev), required: true }), index.h("span", { innerHTML: this.privacyPolicyText }))), index.h("div", { class: `feedback-modal-buttons ${this.hideScreenshotButton ? 'single' : ''}` }, !this.hideScreenshotButton && (index.h("button", { type: "button", class: `feedback-modal-button feedback-modal-button--screenshot ${this.encodedScreenshot ? 'feedback-modal-button--active' : ''}`, onClick: this.openScreenShot, disabled: this.sending || this.takingScreenshot }, this.encodedScreenshot && (index.h("div", { class: "screenshot-preview", onClick: this.openCanvasEditor }, index.h("img", { src: this.encodedScreenshot, alt: "Screenshot Preview" }))), !this.encodedScreenshot && !this.takingScreenshot && (index.h("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24", viewBox: "0 -960 960 960", width: "24" }, index.h("path", { d: "M680-80v-120H560v-80h120v-120h80v120h120v80H760v120h-80ZM200-200v-200h80v120h120v80H200Zm0-360v-200h200v80H280v120h-80Zm480 0v-120H560v-80h200v200h-80Z" }))), this.takingScreenshot && (index.h("div", { class: "screenshot-loading" }, index.h("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "#666", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", class: "feather-loader" }, index.h("line", { x1: "12", y1: "2", x2: "12", y2: "6" }), index.h("line", { x1: "12", y1: "18", x2: "12", y2: "22" }), index.h("line", { x1: "4.93", y1: "4.93", x2: "7.76", y2: "7.76" }), index.h("line", { x1: "16.24", y1: "16.24", x2: "19.07", y2: "19.07" }), index.h("line", { x1: "2", y1: "12", x2: "6", y2: "12" }), index.h("line", { x1: "18", y1: "12", x2: "22", y2: "12" }), index.h("line", { x1: "4.93", y1: "19.07", x2: "7.76", y2: "16.24" }), index.h("line", { x1: "16.24", y1: "7.76", x2: "19.07", y2: "4.93" })))), this.takingScreenshot ? this.screenshotTakingText :
1388
- this.encodedScreenshot ? this.screenshotAttachedText : this.screenshotButtonText)), index.h("button", { class: "feedback-modal-button feedback-modal-button--submit", type: "submit", disabled: this.sending }, this.sendButtonText)))) : this.formSuccess && !this.formError ? (index.h("div", { class: "feedback-modal-success" }, index.h("p", { class: "feedback-modal-message" }, this.successMessage))) : this.formError && this.formErrorStatus == 404 ? (index.h("p", { class: "feedback-modal-message" }, this.errorMessage404)) : this.formError && this.formErrorStatus == 403 ? (index.h("p", { class: "feedback-modal-message" }, this.errorMessage403)) : this.formError ? (index.h("p", { class: "feedback-modal-message" }, this.errorMessage)) : (index.h("span", null))), !this.formSuccess && !this.formError && (index.h("div", { class: "feedback-modal-footer" }, index.h("div", { class: "feedback-logo", style: { display: this.whitelabel ? 'none' : 'block' } }, "Powered by", ' ', index.h("a", { target: "_blank", href: "https://pushfeedback.com" }, "PushFeedback.com")), this.footerText && (index.h("div", { class: "feedback-footer-text" }, index.h("span", { innerHTML: this.footerText })))))))));
1455
+ this.encodedScreenshot ? this.screenshotAttachedText : this.screenshotButtonText)), index.h("button", { class: "feedback-modal-button feedback-modal-button--submit", type: "submit", disabled: this.sending }, this.sendButtonText)))) : this.formSuccess && !this.formError ? (index.h("div", { class: "feedback-modal-success" }, index.h("p", { class: "feedback-modal-message" }, this.successMessage))) : this.formError && this.formErrorStatus == 404 ? (index.h("p", { class: "feedback-modal-message" }, this.errorMessage404)) : this.formError && this.formErrorStatus == 403 ? (index.h("p", { class: "feedback-modal-message" }, this.errorMessage403)) : this.formError ? (index.h("p", { class: "feedback-modal-message" }, this.errorMessage)) : (index.h("span", null))), !this.formSuccess && !this.formError && (this.recaptchaEnabled || this.footerText) && (index.h("div", { class: "feedback-modal-footer" }, index.h("div", { class: "feedback-footer-combined" }, this.recaptchaEnabled && (index.h("span", { innerHTML: this.recaptchaText })), this.recaptchaEnabled && this.footerText && ' ', this.footerText && (index.h("span", { innerHTML: this.footerText })))))))));
1389
1456
  }
1390
1457
  componentDidRender() {
1391
1458
  if (this.showModal) {
@@ -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],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"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"],"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"],"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"],"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],"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],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"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"],"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);
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],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"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"],"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"],"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"],"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],"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],"customFont":[4,"custom-font"],"emailAddress":[1,"email-address"],"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"],"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);
21
21
  });
22
22
 
23
23
  exports.setNonce = index.setNonce;
@@ -25,7 +25,7 @@ export class FeedbackButton {
25
25
  this.errorMessage403 = 'The request URL does not match the one defined in PushFeedback for this project.';
26
26
  this.errorMessage404 = 'We could not find the provided project id in PushFeedback.';
27
27
  this.footerText = '';
28
- this.messagePlaceholder = 'Comments';
28
+ this.messagePlaceholder = 'Share your thoughts...';
29
29
  this.modalTitle = 'Share your feedback';
30
30
  this.modalTitleError = 'Oops!';
31
31
  this.modalTitleSuccess = 'Thanks for your feedback!';
@@ -34,6 +34,7 @@ export class FeedbackButton {
34
34
  this.ratingStarsPlaceholder = 'How would you rate this page?';
35
35
  this.sendButtonText = 'Send';
36
36
  this.successMessage = '';
37
+ this.recaptchaText = 'This form is protected by reCAPTCHA and the Google <a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Privacy Policy</a> and <a href="https://policies.google.com/terms" target="_blank" rel="noopener noreferrer">Terms of Service</a> apply.';
37
38
  this.screenshotAttachedText = 'Screenshot attached';
38
39
  this.screenshotButtonText = 'Add a screenshot';
39
40
  this.screenshotTakingText = 'Taking screenshot...';
@@ -125,6 +126,7 @@ export class FeedbackButton {
125
126
  'screenshotTakingText',
126
127
  'sendButtonText',
127
128
  'successMessage',
129
+ 'recaptchaText',
128
130
  ];
129
131
  props.forEach((prop) => {
130
132
  this.feedbackModal[prop] = this[prop];
@@ -157,15 +159,21 @@ export class FeedbackButton {
157
159
  }
158
160
  async submitRatingFeedback() {
159
161
  try {
160
- const body = {
161
- url: window.location.href,
162
- project: this.project,
163
- rating: this.rating || -1,
164
- ratingMode: this.ratingMode,
165
- message: '',
166
- metadata: this.metadata,
167
- session: localStorage.getItem('pushfeedback_sessionid') || '',
168
- };
162
+ // Get reCAPTCHA token if enabled
163
+ let recaptchaToken = null;
164
+ if (this.feedbackModal.recaptchaEnabled) {
165
+ recaptchaToken = await this.feedbackModal.getRecaptchaToken();
166
+ if (!recaptchaToken) {
167
+ // If reCAPTCHA is enabled but token retrieval failed, emit error
168
+ const response = {
169
+ status: 500,
170
+ message: 'Failed to verify reCAPTCHA. Please try again.',
171
+ };
172
+ this.feedbackError.emit({ error: response });
173
+ return;
174
+ }
175
+ }
176
+ 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 }));
169
177
  const res = await fetch('https://app.pushfeedback.com/api/feedback/', {
170
178
  method: 'POST',
171
179
  body: JSON.stringify(body),
@@ -665,7 +673,7 @@ export class FeedbackButton {
665
673
  },
666
674
  "attribute": "message-placeholder",
667
675
  "reflect": false,
668
- "defaultValue": "'Comments'"
676
+ "defaultValue": "'Share your thoughts...'"
669
677
  },
670
678
  "modalTitle": {
671
679
  "type": "string",
@@ -811,6 +819,24 @@ export class FeedbackButton {
811
819
  "reflect": false,
812
820
  "defaultValue": "''"
813
821
  },
822
+ "recaptchaText": {
823
+ "type": "string",
824
+ "mutable": false,
825
+ "complexType": {
826
+ "original": "string",
827
+ "resolved": "string",
828
+ "references": {}
829
+ },
830
+ "required": false,
831
+ "optional": false,
832
+ "docs": {
833
+ "tags": [],
834
+ "text": ""
835
+ },
836
+ "attribute": "recaptcha-text",
837
+ "reflect": false,
838
+ "defaultValue": "'This form is protected by reCAPTCHA and the Google <a href=\"https://policies.google.com/privacy\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy</a> and <a href=\"https://policies.google.com/terms\" target=\"_blank\" rel=\"noopener noreferrer\">Terms of Service</a> apply.'"
839
+ },
814
840
  "screenshotAttachedText": {
815
841
  "type": "string",
816
842
  "mutable": false,
@@ -71,16 +71,48 @@
71
71
  }
72
72
 
73
73
  .feedback-modal-header {
74
- align-items: center;
75
74
  color: var(--feedback-modal-header-text-color);
76
75
  display: flex;
77
- font-size: var(--feedback-header-font-size);
76
+ font-size: var(--feedback-modal-header-font-size);
78
77
  font-weight: var(--feedback-modal-header-font-weight);
79
78
  justify-content: space-between;
79
+ align-items: flex-start;
80
80
  margin-bottom: 24px;
81
81
  letter-spacing: -0.01em;
82
82
  }
83
83
 
84
+ .feedback-modal-header-content {
85
+ flex: 1;
86
+ }
87
+
88
+ .feedback-modal-header-text {
89
+ display: flex;
90
+ flex-direction: column;
91
+ gap: 6px;
92
+ }
93
+
94
+ .feedback-modal-title {
95
+ display: block;
96
+ }
97
+
98
+ .feedback-modal-powered-by {
99
+ display: block;
100
+ font-size: 13px;
101
+ font-weight: 400;
102
+ color: var(--feedback-color-gray-500);
103
+ line-height: 1.4;
104
+ }
105
+
106
+ .feedback-modal-powered-by a {
107
+ color: var(--feedback-modal-header-text-color);
108
+ text-decoration: none;
109
+ font-weight: 500;
110
+ }
111
+
112
+ .feedback-modal-powered-by a:hover {
113
+ text-decoration: underline;
114
+ }
115
+
84
116
  .feedback-modal-header--no-content {
85
117
  margin-bottom: 0;
86
118
  }
@@ -167,7 +199,7 @@
167
199
  }
168
200
 
169
201
  .feedback-modal-text textarea:hover {
170
- border-color: rgba(0, 0, 0, 0.2);
202
+ border-color: var(--feedback-modal-input-border-color-hover);
171
203
  }
172
204
 
173
205
 
@@ -186,7 +218,17 @@
186
218
  }
187
219
 
188
220
  .feedback-modal-email input:hover {
189
- border-color: rgba(0, 0, 0, 0.2);
221
+ border-color: var(--feedback-modal-input-border-color-hover);
222
+ }
223
+
224
+ .feedback-modal-text textarea:-webkit-autofill,
225
+ .feedback-modal-email input:-webkit-autofill,
226
+ .feedback-modal-email input:-webkit-autofill:hover,
227
+ .feedback-modal-email input:-webkit-autofill:focus,
228
+ .feedback-modal-email input:-webkit-autofill:active {
229
+ -webkit-box-shadow: 0 0 0 1000px var(--feedback-modal-input-bg-color) inset !important;
230
+ -webkit-text-fill-color: var(--feedback-modal-input-text-color) !important;
231
+ transition: background-color 5000s ease-in-out 0s;
190
232
  }
191
233
 
192
234
  .feedback-modal-privacy {
@@ -302,6 +344,33 @@
302
344
  line-height: 1.5;
303
345
  }
304
346
 
347
+ .feedback-footer-combined {
348
+ display: block;
349
+ text-align: center;
350
+ font-size: 11px;
351
+ color: #666;
352
+ line-height: 1.5;
353
+ }
354
+
355
+ .feedback-footer-combined a {
356
+ color: #666;
357
+ text-decoration: underline;
358
+ }
359
+
360
+ .feedback-recaptcha-notice {
361
+ display: block;
362
+ text-align: center;
363
+ margin-bottom: 10px;
364
+ font-size: 11px;
365
+ color: #666;
366
+ line-height: 1.4;
367
+ }
368
+
369
+ .feedback-recaptcha-notice a {
370
+ color: #666;
371
+ text-decoration: underline;
372
+ }
373
+
305
374
  .feedback-modal-close {
306
375
  background-color: var(--feedback-modal-close-bg-color);
307
376
  border: 0;