@magicfeedback/popup-sdk 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/assets/assets/style.css +9 -2
- package/dist/chunk-D7QAGWGC.mjs +176 -0
- package/dist/{chunk-R4B3K2ZW.mjs.map → chunk-D7QAGWGC.mjs.map} +1 -1
- package/dist/chunk-JSBMP4MI.mjs +197 -0
- package/dist/{chunk-XFA2Y6CK.mjs.map → chunk-JSBMP4MI.mjs.map} +1 -1
- package/dist/index.d.mts +82 -3
- package/dist/index.d.ts +82 -3
- package/dist/index.js +447 -90
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +257 -49
- package/dist/index.mjs.map +1 -1
- package/dist/react-native.d.mts +55 -2
- package/dist/react-native.d.ts +55 -2
- package/dist/react-native.js +447 -90
- package/dist/react-native.js.map +1 -1
- package/dist/react-native.mjs +257 -49
- package/dist/react-native.mjs.map +1 -1
- package/dist/{renderPopup-ZYXOUBCP.mjs → renderPopup-4WZ7V435.mjs} +194 -45
- package/dist/renderPopup-4WZ7V435.mjs.map +1 -0
- package/dist/{renderPopup-NJK7Z46E.mjs → renderPopup-PXJEND4Y.mjs} +194 -45
- package/dist/renderPopup-PXJEND4Y.mjs.map +1 -0
- package/package.json +5 -10
- package/dist/chunk-R4B3K2ZW.mjs +0 -176
- package/dist/chunk-XFA2Y6CK.mjs +0 -197
- package/dist/renderPopup-NJK7Z46E.mjs.map +0 -1
- package/dist/renderPopup-ZYXOUBCP.mjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -185,7 +185,7 @@ var init_font = __esm({
|
|
|
185
185
|
var style_default;
|
|
186
186
|
var init_style = __esm({
|
|
187
187
|
"src/assets/style.css"() {
|
|
188
|
-
style_default = '.magicfeedback-container {\n width: 100%;\n}\n\n\n.magicfeedback-success-message,\n.magicfeedback-info-message,\n.magicfeedback-start-message,\n.magicfeedback-container{\n animation-duration: 0.5s;\n animation-name: animate-fade;\n animation-delay: 0.25s;\n animation-fill-mode: backwards;\n\n font-style: normal;\n text-align: justify;\n font-weight: 400;\n font-size: 1.2rem;\n color: #475569;\n line-height: 1.5;\n}\n\n@keyframes animate-fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n}\n\n.magicfeedback-form {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n}\n.magicfeedback-questions {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n}\n\n.magicfeedback-div {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n margin-bottom: 10px;\n width: 100%;\n}\n\n.magicfeedback-label {\n margin-bottom: 25px;\n margin-top: 20px;\n font-weight: 400;\n font-family: inherit;\n font-size: 1.2rem;\n color: #212529;\n text-align: start;\n word-wrap: break-word;\n white-space: normal;\n\n}\n\n.magicfeedback-checkbox {\n display: flex;\n flex-direction: column;\n flex-wrap: wrap;\n width: 100%;\n}\n\n.magicfeedback-checkbox-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin-bottom: 5px;\n margin-top: 5px;\n}\n\n/* Cualificado con `div`: @magicfeedback/native reutiliza la clase "magicfeedback-radio"\n tambi\xE9n en el <input> de cada opci\xF3n (rating), y sin el tag este selector lo capturaba\n tambi\xE9n, rompiendo su tama\xF1o (el input pasaba a display:flex; width:100%). */\ndiv.magicfeedback-radio {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n flex-wrap: wrap;\n width: 100%;\n margin-right: 5px;\n padding: 5px;\n box-sizing: border-box;\n}\n\n.magicfeedback-checkbox-container,\n.magicfeedback-radio-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin: 5px;\n padding: 5px 0;\n background-color: #fff;\n border-radius: 5px;\n box-shadow: 0 0 3px #ccc;\n}\n\n.deepdots-popup input::-webkit-outer-spin-button,\n.deepdots-popup input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n -moz-appearance: textfield;\n}\n\n.magicfeedback-checkbox input[type="checkbox"] {\n margin-right: 5px;\n margin-left: 5px;\n width: 20px;\n height: 20px;\n cursor: pointer;\n}\n\n\n.magicfeedback-checkbox label,\n.magicfeedback-radio-container label {\n margin-left: 5px;\n font-weight: 400;\n font-family: inherit;\n font-size: 16px;\n color: #212529;\n text-align: start;\n width: 100%;\n}\n\n.deepdots-popup p {\n margin-bottom: 0px;\n font-size: 12px;\n}\n\n.deepdots-popup h2 {\n line-height: 1.66;\n margin: 0;\n padding: 0;\n font-weight: 900;\n color: #222;\n font-family: var(--deepdots-font, \'Montserrat\');\n font-size: 18px;\n text-transform: uppercase;\n text-align: center;\n margin-bottom: 40px;\n}\n\n/* Los controles de formulario no heredan font-family por defecto: cuando hay\n fuente custom (clase deepdots-has-font), los forzamos a usar la del contenedor. */\n.deepdots-popup.deepdots-has-font button,\n.deepdots-popup.deepdots-has-font input,\n.deepdots-popup.deepdots-has-font textarea,\n.deepdots-popup.deepdots-has-font select {\n font-family: var(--deepdots-font, inherit);\n}\n\n.deepdots-popup h6 {\n margin-bottom: 1rem;\n}\n\n.deepdots-popup input[type="date"],\n.deepdots-popup input[type="text"],\n.deepdots-popup input[type="number"],\n.deepdots-popup input[type="email"],\n.deepdots-popup input[type="password"],\n.deepdots-popup textarea,\n.deepdots-popup select {\n box-sizing: border-box;\n padding: 10px;\n margin: 10px 0;\n width: 100%;\n border: 2px solid #ccc; /* Default border color - you can customize this */\n border-radius: 5px;\n font-size: 18px;\n outline: none;\n transition: border-color 0.3s ease;\n min-height: 50px;\n font-family: inherit;\n -webkit-appearance: none;\n}\n\n.deepdots-popup select {\n background-image: linear-gradient(45deg, transparent 50%, gray 50%),\n linear-gradient(135deg, gray 50%, transparent 50%),\n linear-gradient(to right, #ccc, #ccc);\n background-position: calc(100% - 20px) calc(1em + 2px),\n calc(100% - 15px) calc(1em + 2px),\n calc(100% - 2.5em) 0.5em;\n background-size: 5px 5px,\n 5px 5px,\n 1px 1.5em;\n background-repeat: no-repeat;\n}\n\n.magicfeedback-boolean-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin: 10px 0;\n width: 100%;\n}\n\n.magicfeedback-boolean-container label {\n margin-left: 10px;\n font-weight: 400;\n font-size: 16px;\n width: 100%;\n padding-top: 5px;\n}\n\n.magicfeedback-boolean-option {\n margin-right: 10px;\n margin-left: 10px;\n width: 100%;\n height: 38px;\n border-radius: 8px;\n font-size: 16px;\n cursor: pointer;\n border: 1px solid #ced4da !important;\n}\n\n.magicfeedback-boolean-option label {\n font-weight: 400;\n font-size: 16px;\n color: #475569;\n cursor: pointer;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: inherit;\n}\n\n.magicfeedback-boolean-option input[type=radio] + label:hover {\n color: #007bff;\n}\n\n.magicfeedback-boolean-option input[type=radio]:checked + label {\n color: #007bff;\n background-color: #cadff8;\n}\n\n.deepdots-popup input[type="radio"] {\n padding: 20px;\n margin: 10px 0 10px 15px;\n width: 40px;\n background-color: #fff;\n box-shadow: none;\n}\n\n/* Style for focused input/select */\n.deepdots-popup input:focus, .deepdots-popup select:focus {\n border-color: #4CAF50; /* Highlight color when focused - you can customize this */\n}\n\n/* Style for invalid input (example: validation error) */\n.deepdots-popup input.error, .deepdots-popup select.error {\n border-color: #ff3333; /* Red color for error state - you can customize this */\n}\n\n.magicfeedback-action-container {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n margin-top: 10px;\n width: 100%;\n}\n\n.magicfeedback-action-container .magicfeedback-submit {\n cursor: pointer;\n padding: 10px;\n margin: 10px 0;\n width: 100px;\n border-radius: 8px;\n font-size: 16px;\n outline: none;\n transition: border-color 0.3s ease;\n background-color: #1E293B;\n color: white;\n}\n\n.magicfeedback-action-container .magicfeedback-back {\n cursor: pointer;\n padding: 10px;\n margin: 10px 0;\n width: 100px;\n border: 0;\n border-radius: 8px;\n font-size: 16px;\n outline: none;\n transition: border-color 0.3s ease;\n background-color: transparent;\n color: #212529;\n}\n\n\n\n/* Rating styles */\n.magicfeedback-rating {\n width: 100%;\n}\n\n.magicfeedback-rating-container {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n flex-wrap: wrap;\n align-items: center;\n\n margin: 15px 5px;\n padding: 0;\n\n list-style: none;\n font-size: 1.5rem;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.magicfeedback-rating-placeholder-value,\n.magicfeedback-rating-placeholder{\n text-align: center;\n align-content: center;\n justify-content: center;\n text-wrap: wrap;\n}\n\n.magicfeedback-rating-option {\n margin: 0 0.5rem;\n padding: 0;\n}\n\n@media (max-width: 1024px) {\n .magicfeedback-rating-option {\n margin: 10px 0;\n padding: 0;\n width: 20%;\n display: flex;\n justify-content: center;\n }\n\n .magicfeedback-rating-placeholder-value {\n font-size: 0.75rem;\n margin-bottom: 1px;\n }\n .magicfeedback-rating-placeholder{\n justify-content: center;\n }\n\n .magicfeedback-rating-container {\n flex-wrap: wrap;\n justify-content: flex-start;\n }\n}\n\n\n.magicfeedback-rating-option-label-container {\n display: flex;\n flex-direction: column;\n}\n\n\n.magicfeedback-rating-option-label-container label {\n display: inline-block;\n text-align: center;\n margin-bottom: 0;\n font-weight: 600;\n font-size: 18px;\n color: #475569;\n}\n\n.magicfeedback-rating-option-label-container input[type=radio] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n/* IMAGE STYLES */\n.magicfeedback-rating-option-label-container input[type=radio] + img {\n cursor: pointer;\n height: 48px;\n width: 48px;\n}\n\n/* LABEL STYLES */\n.magicfeedback-rating-option-label-container input[type=radio] + label {\n cursor: pointer;\n}\n\n/* CHECKED STYLES */\n.magicfeedback-rating-option-label-container input[type=radio]:checked + img {\n box-shadow: #007bff 0px 1px 4px, #007BFFA0 0px 0px 0px 2px;\n border-radius: 50%;\n}\n\n.magicfeedback-rating-number {\n width: 100%;\n}\n.magicfeedback-rating-container,\n.magicfeedback-rating-number-container {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n\n margin: 15px 0;\n padding: 0;\n\n list-style: none;\n font-size: 1.5rem;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n/* Cuando hay placeholders (Very bad / Very good), el placeholder ocupa\n el 100% de la primera l\xEDnea y los boxes bajan a la siguiente */\n.magicfeedback-rating-number-container--with-placeholder {\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.magicfeedback-rating-number-container--with-placeholder .magicfeedback-rating-placeholder {\n width: 100%;\n margin-bottom: 8px;\n}\n\n.magicfeedback-rating-number-container--with-placeholder .magicfeedback-rating-number-option {\n width: auto;\n flex: 1;\n}\n\n.magicfeedback-rating-number-option {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin: 5px;\n padding: 0;\n list-style: none;\n font-size: 1.5rem;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n width: 100%;\n}\n\n.magicfeedback-rating-number-option-row{\n max-width: 100% !important;\n}\n\n.magicfeedback-rating-number-top-placeholder,\n.magicfeedback-rating-number-bottom-placeholder{\n text-align: center !important;\n align-content: center;\n justify-content: center;\n text-wrap: wrap;\n\n font-size: 15px;\n color: #475569;\n\n width: 100%;\n margin: auto;\n}\n\n@media (min-width: 650px) {\n .magicfeedback-rating-number-option-row +.magicfeedback-rating-number-container-ltr:first-child,\n .magicfeedback-rating-number-option-row + +.magicfeedback-rating-number-container-rtl:last-child {\n margin-left: 0;\n width: calc(100% - 10px);\n }\n\n .magicfeedback-rating-number-option-row +.magicfeedback-rating-number-container-rtl:first-child,\n .magicfeedback-rating-number-option-row + +.magicfeedback-rating-number-container-ltr:last-child {\n margin-right: 0;\n width: calc(100% - 10px);\n }\n}\n\n\n.magicfeedback-rating-number-option-label-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n.magicfeedback-rating-number-option-label-container label {\n display: flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0 10px;\n font-weight: 600;\n font-size: 14px;\n color: #475569;\n cursor: pointer;\n width: 100%;\n height: 100%;\n min-height: 50px;\n text-align: center;\n padding: 0;\n border-radius: 4px;\n border: 1px solid #ced4da;\n background-color: rgba(246, 246, 246, 0.3);\n transition: background-color 0.15s ease-in-out;\n}\n\n.magicfeedback-rating-number-option-label-container input[type=radio] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.magicfeedback-rating-number-option-label-container input[type=radio] + label {\n cursor: pointer;\n}\n\n.magicfeedback-rating-number-option-label-container input[type=radio] + label:hover,\n.magicfeedback-rating-number-option-label-container input[type=radio]:checked + label {\n color: #007bff;\n border: 1px solid #007bff;\n background-color: rgba(86, 168, 253, 0.29);\n}\n\n.magicfeedback-rating-number-container-column{\n align-items: flex-start !important;\n}\n\n@media (max-width: 650px) {\n .magicfeedback-rating-number-container-ltr {\n justify-content: center;\n flex-wrap: wrap;\n }\n\n .magicfeedback-rating-number-container-rtl {\n justify-content: center;\n flex-wrap: wrap-reverse;\n }\n\n .magicfeedback-rating-number-option {\n max-width: 100%;\n height: 55px;\n margin: 5px 0;\n }\n}\n\n.magicfeedback-rating-star {\n width: 100%;\n}\n\n.magicfeedback-rating-star-container {\n display: flex !important;\n flex-direction: row !important;\n justify-content: center !important;\n align-items: center !important;\n flex-wrap: wrap;\n margin: 15px 5px;\n padding: 0;\n list-style: none;\n font-size: 1.5rem;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.magicfeedback-rating-star-option:not(:checked) > .rating__star {\n float: right;\n width: 1em;\n overflow: hidden;\n white-space: nowrap;\n cursor: pointer;\n font-size: 30px;\n color: #ccc;\n margin: 0 10px;\n}\n\n.magicfeedback-rating-star-option:not(:checked) > .rating__star:hover,\n.magicfeedback-rating-star-option:not(:checked) > .rating__star:hover ~ span {\n color: #deb217 !important;\n}\n\n.magicfeedback-rating-star-selected {\n color: #ffc700 !important;\n}\n\n\n/* Style for multiple choice image */\n.magicfeedback-image-option-label-container:hover {\n cursor: pointer;\n border: 0 !important;\n}\n\n.magicfeedback-image-option-label-container input[type=radio]:checked + img,\n.magicfeedback-image-option-label-container input[type=checkbox]:checked + img {\n border: 1px solid #007bff !important;\n box-shadow: 0 0 3px #007bff !important;\n}\n\n.magicfeedback-image-option-label-container input[type=radio] + img,\n.magicfeedback-image-option-label-container input[type=checkbox] + img {\n border: 1px solid transparent !important;\n}\n\n.magicfeedback-image-option-label-container{\n margin: 10px !important;\n height: calc(100% - 20px) !important;\n width: calc(100% - 20px) !important;\n}\n\n.magicfeedback-multiple-choice-image-option {\n display: flex;\n height: auto !important;\n box-shadow: 0 0 3px #ccc;\n}\n\n.magicfeedback-multiple-choice-image-label {\n font-size: 1rem;\n}\n\n.magicfeedback-consent-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin: 10px 0;\n width: 100%;\n}\n\n.magicfeedback-consent-container label {\n margin-left: 10px;\n}\n\n.magicfeedback-start-message-container {\n /* ... add your start message container styles here ... */\n}\n\n.magicfeedback-success-message,\n.magicfeedback-info-message,\n.magicfeedback-start-message {\n margin: 35px 5px;\n}\n\n.magicfeedback-success-message p,\n.magicfeedback-info-message p,\n.magicfeedback-start-message p {\n font-style: normal;\n text-align: start;\n font-weight: 400;\n font-size: 16px;\n color: #475569;\n line-height: 1.5;\n}\n\n.magicfeedback-success-message img,\n.magicfeedback-info-message img,\n.magicfeedback-start-message img {\n width: 400px;\n max-width: 80%;\n height: auto;\n margin: 10px auto;\n}\n\n.magicfeedback-counter,\n.magicfeedback-point-system-total {\n margin: 10px 0 0 0 !important;\n display: flex !important;\n justify-content: right !important;\n align-items: center !important;\n width: 100%;\n}\n\n.magicfeedback-skip-container {\n background-color: transparent !important;\n border: 0 !important;\n color: #999999FF !important;\n padding: 0 !important;\n margin: 0 !important;\n cursor: pointer !important;\n font-size: 0.5em !important;\n font-weight: 400 !important;\n box-shadow: 0 0 0 !important;\n\n &:hover {\n color: #0066ff;\n }\n}\n\n.magicfeedback-skip-container input[type=checkbox] {\n border-color: #999999FF !important;\n border: 0 !important;\n cursor: pointer !important;\n\n}\n\n.magicfeedback-multi-question-matrix,\n.magicfeedback-point-system,\n.magicfeedback-priority-list {\n width: 100% !important;\n}\n\n.magicfeedback-multi-question-matrix-container,\n.magicfeedback-point-system-container,\n.magicfeedback-priority-list-container {\n width: 100% !important;\n overflow-x: auto;\n}\n\n.magicfeedback-point-system-list,\n.magicfeedback-priority-list-list,\n.magicfeedback-multi-question-matrix-table {\n width: 100% !important;\n padding: 0 !important;\n overflow-x: auto;\n}\n\n.magicfeedback-multi-question-matrix {\n position: relative !important;\n}\n\n.magicfeedback-multi-question-matrix-container {\n overflow: auto !important;\n padding-bottom: 10px;\n}\n\n.magicfeedback-multi-question-matrix-label{\n text-align: left !important;\n}\n.magicfeedback-priority-list-item {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 10px 0 10px 10px;\n\n border: 1px solid #ced4da;\n border-radius: 5px;\n margin: 10px 0 !important;\n}\n\n.magicfeedback-point-system-item {\n height: 45px;\n margin: 5px 0 !important;\n}\n\n.magicfeedback-point-system-item label,\n.magicfeedback-priority-list-item-label {\n font-family: inherit;\n font-size: 18px !important;\n color: #212529;\n text-align: start;\n word-wrap: break-word;\n white-space: normal;\n padding: 0 10px 0 0;\n}\n\n.magicfeedback-point-system-input-container {\n padding: 0 10px 0 0;\n border-radius: 5px;\n font-size: 14px;\n border: 1px solid #ced4da;\n height: 42px;\n margin: auto 0;\n}\n\n.magicfeedback-multi-question-matrix-table thead {\n margin-bottom: 20px;\n}\n\n.magicfeedback-multi-question-matrix-table th{\n text-align: center;\n font-weight: 400 !important;\n font-size: 1rem !important;\n padding: 0 10px !important;\n}\n\n.magicfeedback-multi-question-matrix-table th,\n.magicfeedback-multi-question-matrix-table td label,\n.magicfeedback-priority-list-arrow-up,\n.magicfeedback-priority-list-arrow-down {\n font-style: normal !important;\n font-weight: 400 !important;\n font-size: 1rem !important;\n color: #475569 !important;\n cursor: pointer !important;\n margin: 0 !important;\n line-height: inherit;\n}\n\n.magicfeedback-multi-question-matrix-table tr {\n align-items: center;\n margin: 5px 0;\n}\n\n.magicfeedback-multi-question-matrix-row-tr{\n border-radius: 5px;\n margin: 10px 0 !important;\n}\n\n.magicfeedback-multi-question-matrix-row-tr:nth-child(odd) {\n background-color: #f1f6f6; /* Light gray background for odd rows */\n}\n\n.magicfeedback-multi-question-matrix-row-tr:nth-child(even) {\n background-color: #ffffff; /* White background for even rows */\n}\n\n.magicfeedback-multi-question-matrix-row-label {\n text-align: left !important;\n}\n\n.magicfeedback-point-system-item span {\n color: #475569 !important;\n}\n\n.magicfeedback-point-system-item input {\n padding: 0;\n margin: 0 !important;\n width: auto !important;\n min-width: 100px !important;\n height: auto !important;\n min-height: 42px;\n cursor: pointer;\n font-size: 14px;\n text-align: center !important;\n}\n\n.magicfeedback-multi-question-matrix-table input {\n margin: auto !important;\n padding: 20px !important;\n width: 100% !important;\n height: 15px;\n border: 1px solid #ced4da;\n cursor: pointer;\n}\n\n.magicfeedback-image{\n max-height: 400px !important;\n height: auto !important;\n max-width: 100% !important;\n margin: 10px auto !important;\n}\n\n.magicfeedback-error{\n margin-top: 5px;\n}';
|
|
188
|
+
style_default = '.magicfeedback-container {\n width: 100%;\n}\n\n\n.magicfeedback-success-message,\n.magicfeedback-info-message,\n.magicfeedback-start-message,\n.magicfeedback-container{\n animation-duration: 0.5s;\n animation-name: animate-fade;\n animation-delay: 0.25s;\n animation-fill-mode: backwards;\n\n font-style: normal;\n text-align: justify;\n font-weight: 400;\n font-size: 1.2rem;\n color: #475569;\n line-height: 1.5;\n}\n\n@keyframes animate-fade {\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n}\n\n.magicfeedback-form {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n}\n.magicfeedback-questions {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n width: 100%;\n}\n\n.magicfeedback-div {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n margin-bottom: 10px;\n width: 100%;\n}\n\n.magicfeedback-label {\n margin-bottom: 25px;\n margin-top: 20px;\n font-weight: 400;\n font-family: inherit;\n font-size: 1.2rem;\n color: #212529;\n text-align: start;\n word-wrap: break-word;\n white-space: normal;\n\n}\n\n.magicfeedback-checkbox {\n display: flex;\n flex-direction: column;\n flex-wrap: wrap;\n width: 100%;\n}\n\n.magicfeedback-checkbox-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin-bottom: 5px;\n margin-top: 5px;\n}\n\n/* Cualificado con `div`: @magicfeedback/native reutiliza la clase "magicfeedback-radio"\n tambi\xE9n en el <input> de cada opci\xF3n (rating), y sin el tag este selector lo capturaba\n tambi\xE9n, rompiendo su tama\xF1o (el input pasaba a display:flex; width:100%). */\ndiv.magicfeedback-radio {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n flex-wrap: wrap;\n width: 100%;\n margin-right: 5px;\n padding: 5px;\n box-sizing: border-box;\n}\n\n.magicfeedback-checkbox-container,\n.magicfeedback-radio-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin: 5px;\n padding: 5px 0;\n background-color: #fff;\n border-radius: 5px;\n box-shadow: 0 0 3px #ccc;\n}\n\n.deepdots-popup input::-webkit-outer-spin-button,\n.deepdots-popup input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n -moz-appearance: textfield;\n}\n\n.magicfeedback-checkbox input[type="checkbox"] {\n margin-right: 5px;\n margin-left: 5px;\n width: 20px;\n height: 20px;\n cursor: pointer;\n}\n\n\n.magicfeedback-checkbox label,\n.magicfeedback-radio-container label {\n margin-left: 5px;\n font-weight: 400;\n font-family: inherit;\n font-size: 16px;\n color: #212529;\n text-align: start;\n width: 100%;\n}\n\n.deepdots-popup p {\n margin-bottom: 0px;\n font-size: 12px;\n}\n\n.deepdots-popup h2 {\n line-height: 1.66;\n margin: 0;\n padding: 0;\n font-weight: 900;\n color: #222;\n font-family: var(--deepdots-font, \'Montserrat\');\n font-size: 18px;\n text-transform: uppercase;\n text-align: center;\n margin-bottom: 40px;\n}\n\n/* Los controles de formulario no heredan font-family por defecto: cuando hay\n fuente custom (clase deepdots-has-font), los forzamos a usar la del contenedor. */\n.deepdots-popup.deepdots-has-font button,\n.deepdots-popup.deepdots-has-font input,\n.deepdots-popup.deepdots-has-font textarea,\n.deepdots-popup.deepdots-has-font select {\n font-family: var(--deepdots-font, inherit);\n}\n\n.deepdots-popup h6 {\n margin-bottom: 1rem;\n}\n\n.deepdots-popup input[type="date"],\n.deepdots-popup input[type="text"],\n.deepdots-popup input[type="number"],\n.deepdots-popup input[type="email"],\n.deepdots-popup input[type="password"],\n.deepdots-popup textarea,\n.deepdots-popup select {\n box-sizing: border-box;\n padding: 10px;\n margin: 10px 0;\n width: 100%;\n border: 2px solid #ccc; /* Default border color - you can customize this */\n border-radius: 5px;\n font-size: 18px;\n outline: none;\n transition: border-color 0.3s ease;\n min-height: 50px;\n font-family: inherit;\n -webkit-appearance: none;\n}\n\n.deepdots-popup select {\n background-image: linear-gradient(45deg, transparent 50%, gray 50%),\n linear-gradient(135deg, gray 50%, transparent 50%),\n linear-gradient(to right, #ccc, #ccc);\n background-position: calc(100% - 20px) calc(1em + 2px),\n calc(100% - 15px) calc(1em + 2px),\n calc(100% - 2.5em) 0.5em;\n background-size: 5px 5px,\n 5px 5px,\n 1px 1.5em;\n background-repeat: no-repeat;\n}\n\n.magicfeedback-boolean-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin: 10px 0;\n width: 100%;\n}\n\n.magicfeedback-boolean-container label {\n margin-left: 10px;\n font-weight: 400;\n font-size: 16px;\n width: 100%;\n padding-top: 5px;\n}\n\n.magicfeedback-boolean-option {\n margin-right: 10px;\n margin-left: 10px;\n width: 100%;\n height: 38px;\n border-radius: 8px;\n font-size: 16px;\n cursor: pointer;\n border: 1px solid #ced4da !important;\n}\n\n.magicfeedback-boolean-option label {\n font-weight: 400;\n font-size: 16px;\n color: #475569;\n cursor: pointer;\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: inherit;\n}\n\n.magicfeedback-boolean-option input[type=radio] + label:hover {\n color: #007bff;\n}\n\n.magicfeedback-boolean-option input[type=radio]:checked + label {\n color: #007bff;\n background-color: #cadff8;\n}\n\n/* Tama\xF1o expl\xEDcito y sin padding: un radio nativo con `padding: 20px` y solo `width` (sin\n `height`) se dibujaba enorme en WebKit, que s\xED aplica el padding al control. Se ve\xEDa en\n iOS (WebView de React Native y Safari) y no en Chrome. `flex: 0 0 auto` evita que el\n contenedor flex de la opci\xF3n lo estire. */\n.deepdots-popup input[type="radio"] {\n padding: 0;\n margin: 10px 0 10px 15px;\n width: 20px;\n height: 20px;\n min-width: 20px;\n flex: 0 0 auto;\n background-color: #fff;\n box-shadow: none;\n}\n\n/* Style for focused input/select */\n.deepdots-popup input:focus, .deepdots-popup select:focus {\n border-color: #4CAF50; /* Highlight color when focused - you can customize this */\n}\n\n/* Style for invalid input (example: validation error) */\n.deepdots-popup input.error, .deepdots-popup select.error {\n border-color: #ff3333; /* Red color for error state - you can customize this */\n}\n\n.magicfeedback-action-container {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n margin-top: 10px;\n width: 100%;\n}\n\n.magicfeedback-action-container .magicfeedback-submit {\n cursor: pointer;\n padding: 10px;\n margin: 10px 0;\n width: 100px;\n border-radius: 8px;\n font-size: 16px;\n outline: none;\n transition: border-color 0.3s ease;\n background-color: #1E293B;\n color: white;\n}\n\n.magicfeedback-action-container .magicfeedback-back {\n cursor: pointer;\n padding: 10px;\n margin: 10px 0;\n width: 100px;\n border: 0;\n border-radius: 8px;\n font-size: 16px;\n outline: none;\n transition: border-color 0.3s ease;\n background-color: transparent;\n color: #212529;\n}\n\n\n\n/* Rating styles */\n.magicfeedback-rating {\n width: 100%;\n}\n\n.magicfeedback-rating-container {\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n flex-wrap: wrap;\n align-items: center;\n\n margin: 15px 5px;\n padding: 0;\n\n list-style: none;\n font-size: 1.5rem;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.magicfeedback-rating-placeholder-value,\n.magicfeedback-rating-placeholder{\n text-align: center;\n align-content: center;\n justify-content: center;\n text-wrap: wrap;\n}\n\n.magicfeedback-rating-option {\n margin: 0 0.5rem;\n padding: 0;\n}\n\n@media (max-width: 1024px) {\n .magicfeedback-rating-option {\n margin: 10px 0;\n padding: 0;\n width: 20%;\n display: flex;\n justify-content: center;\n }\n\n .magicfeedback-rating-placeholder-value {\n font-size: 0.75rem;\n margin-bottom: 1px;\n }\n .magicfeedback-rating-placeholder{\n justify-content: center;\n }\n\n .magicfeedback-rating-container {\n flex-wrap: wrap;\n justify-content: flex-start;\n }\n}\n\n\n.magicfeedback-rating-option-label-container {\n display: flex;\n flex-direction: column;\n}\n\n\n.magicfeedback-rating-option-label-container label {\n display: inline-block;\n text-align: center;\n margin-bottom: 0;\n font-weight: 600;\n font-size: 18px;\n color: #475569;\n}\n\n.magicfeedback-rating-option-label-container input[type=radio] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n/* IMAGE STYLES */\n.magicfeedback-rating-option-label-container input[type=radio] + img {\n cursor: pointer;\n height: 48px;\n width: 48px;\n}\n\n/* LABEL STYLES */\n.magicfeedback-rating-option-label-container input[type=radio] + label {\n cursor: pointer;\n}\n\n/* CHECKED STYLES */\n.magicfeedback-rating-option-label-container input[type=radio]:checked + img {\n box-shadow: #007bff 0px 1px 4px, #007BFFA0 0px 0px 0px 2px;\n border-radius: 50%;\n}\n\n.magicfeedback-rating-number {\n width: 100%;\n}\n.magicfeedback-rating-container,\n.magicfeedback-rating-number-container {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n\n margin: 15px 0;\n padding: 0;\n\n list-style: none;\n font-size: 1.5rem;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n/* Cuando hay placeholders (Very bad / Very good), el placeholder ocupa\n el 100% de la primera l\xEDnea y los boxes bajan a la siguiente */\n.magicfeedback-rating-number-container--with-placeholder {\n flex-wrap: wrap;\n align-items: flex-start;\n}\n\n.magicfeedback-rating-number-container--with-placeholder .magicfeedback-rating-placeholder {\n width: 100%;\n margin-bottom: 8px;\n}\n\n.magicfeedback-rating-number-container--with-placeholder .magicfeedback-rating-number-option {\n width: auto;\n flex: 1;\n}\n\n.magicfeedback-rating-number-option {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin: 5px;\n padding: 0;\n list-style: none;\n font-size: 1.5rem;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n width: 100%;\n}\n\n.magicfeedback-rating-number-option-row{\n max-width: 100% !important;\n}\n\n.magicfeedback-rating-number-top-placeholder,\n.magicfeedback-rating-number-bottom-placeholder{\n text-align: center !important;\n align-content: center;\n justify-content: center;\n text-wrap: wrap;\n\n font-size: 15px;\n color: #475569;\n\n width: 100%;\n margin: auto;\n}\n\n@media (min-width: 650px) {\n .magicfeedback-rating-number-option-row +.magicfeedback-rating-number-container-ltr:first-child,\n .magicfeedback-rating-number-option-row + +.magicfeedback-rating-number-container-rtl:last-child {\n margin-left: 0;\n width: calc(100% - 10px);\n }\n\n .magicfeedback-rating-number-option-row +.magicfeedback-rating-number-container-rtl:first-child,\n .magicfeedback-rating-number-option-row + +.magicfeedback-rating-number-container-ltr:last-child {\n margin-right: 0;\n width: calc(100% - 10px);\n }\n}\n\n\n.magicfeedback-rating-number-option-label-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n.magicfeedback-rating-number-option-label-container label {\n display: flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0 10px;\n font-weight: 600;\n font-size: 14px;\n color: #475569;\n cursor: pointer;\n width: 100%;\n height: 100%;\n min-height: 50px;\n text-align: center;\n padding: 0;\n border-radius: 4px;\n border: 1px solid #ced4da;\n background-color: rgba(246, 246, 246, 0.3);\n transition: background-color 0.15s ease-in-out;\n}\n\n.magicfeedback-rating-number-option-label-container input[type=radio] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.magicfeedback-rating-number-option-label-container input[type=radio] + label {\n cursor: pointer;\n}\n\n.magicfeedback-rating-number-option-label-container input[type=radio] + label:hover,\n.magicfeedback-rating-number-option-label-container input[type=radio]:checked + label {\n color: #007bff;\n border: 1px solid #007bff;\n background-color: rgba(86, 168, 253, 0.29);\n}\n\n.magicfeedback-rating-number-container-column{\n align-items: flex-start !important;\n}\n\n@media (max-width: 650px) {\n .magicfeedback-rating-number-container-ltr {\n justify-content: center;\n flex-wrap: wrap;\n }\n\n .magicfeedback-rating-number-container-rtl {\n justify-content: center;\n flex-wrap: wrap-reverse;\n }\n\n .magicfeedback-rating-number-option {\n max-width: 100%;\n height: 55px;\n margin: 5px 0;\n }\n}\n\n.magicfeedback-rating-star {\n width: 100%;\n}\n\n.magicfeedback-rating-star-container {\n display: flex !important;\n flex-direction: row !important;\n justify-content: center !important;\n align-items: center !important;\n flex-wrap: wrap;\n margin: 15px 5px;\n padding: 0;\n list-style: none;\n font-size: 1.5rem;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.magicfeedback-rating-star-option:not(:checked) > .rating__star {\n float: right;\n width: 1em;\n overflow: hidden;\n white-space: nowrap;\n cursor: pointer;\n font-size: 30px;\n color: #ccc;\n margin: 0 10px;\n}\n\n.magicfeedback-rating-star-option:not(:checked) > .rating__star:hover,\n.magicfeedback-rating-star-option:not(:checked) > .rating__star:hover ~ span {\n color: #deb217 !important;\n}\n\n.magicfeedback-rating-star-selected {\n color: #ffc700 !important;\n}\n\n\n/* Style for multiple choice image */\n.magicfeedback-image-option-label-container:hover {\n cursor: pointer;\n border: 0 !important;\n}\n\n.magicfeedback-image-option-label-container input[type=radio]:checked + img,\n.magicfeedback-image-option-label-container input[type=checkbox]:checked + img {\n border: 1px solid #007bff !important;\n box-shadow: 0 0 3px #007bff !important;\n}\n\n.magicfeedback-image-option-label-container input[type=radio] + img,\n.magicfeedback-image-option-label-container input[type=checkbox] + img {\n border: 1px solid transparent !important;\n}\n\n.magicfeedback-image-option-label-container{\n margin: 10px !important;\n height: calc(100% - 20px) !important;\n width: calc(100% - 20px) !important;\n}\n\n.magicfeedback-multiple-choice-image-option {\n display: flex;\n height: auto !important;\n box-shadow: 0 0 3px #ccc;\n}\n\n.magicfeedback-multiple-choice-image-label {\n font-size: 1rem;\n}\n\n.magicfeedback-consent-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n margin: 10px 0;\n width: 100%;\n}\n\n.magicfeedback-consent-container label {\n margin-left: 10px;\n}\n\n.magicfeedback-start-message-container {\n /* ... add your start message container styles here ... */\n}\n\n.magicfeedback-success-message,\n.magicfeedback-info-message,\n.magicfeedback-start-message {\n margin: 35px 5px;\n}\n\n.magicfeedback-success-message p,\n.magicfeedback-info-message p,\n.magicfeedback-start-message p {\n font-style: normal;\n text-align: start;\n font-weight: 400;\n font-size: 16px;\n color: #475569;\n line-height: 1.5;\n}\n\n.magicfeedback-success-message img,\n.magicfeedback-info-message img,\n.magicfeedback-start-message img {\n width: 400px;\n max-width: 80%;\n height: auto;\n margin: 10px auto;\n}\n\n.magicfeedback-counter,\n.magicfeedback-point-system-total {\n margin: 10px 0 0 0 !important;\n display: flex !important;\n justify-content: right !important;\n align-items: center !important;\n width: 100%;\n}\n\n.magicfeedback-skip-container {\n background-color: transparent !important;\n border: 0 !important;\n color: #999999FF !important;\n padding: 0 !important;\n margin: 0 !important;\n cursor: pointer !important;\n font-size: 0.5em !important;\n font-weight: 400 !important;\n box-shadow: 0 0 0 !important;\n\n &:hover {\n color: #0066ff;\n }\n}\n\n.magicfeedback-skip-container input[type=checkbox] {\n border-color: #999999FF !important;\n border: 0 !important;\n cursor: pointer !important;\n\n}\n\n.magicfeedback-multi-question-matrix,\n.magicfeedback-point-system,\n.magicfeedback-priority-list {\n width: 100% !important;\n}\n\n.magicfeedback-multi-question-matrix-container,\n.magicfeedback-point-system-container,\n.magicfeedback-priority-list-container {\n width: 100% !important;\n overflow-x: auto;\n}\n\n.magicfeedback-point-system-list,\n.magicfeedback-priority-list-list,\n.magicfeedback-multi-question-matrix-table {\n width: 100% !important;\n padding: 0 !important;\n overflow-x: auto;\n}\n\n.magicfeedback-multi-question-matrix {\n position: relative !important;\n}\n\n.magicfeedback-multi-question-matrix-container {\n overflow: auto !important;\n padding-bottom: 10px;\n}\n\n.magicfeedback-multi-question-matrix-label{\n text-align: left !important;\n}\n.magicfeedback-priority-list-item {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 10px 0 10px 10px;\n\n border: 1px solid #ced4da;\n border-radius: 5px;\n margin: 10px 0 !important;\n}\n\n.magicfeedback-point-system-item {\n height: 45px;\n margin: 5px 0 !important;\n}\n\n.magicfeedback-point-system-item label,\n.magicfeedback-priority-list-item-label {\n font-family: inherit;\n font-size: 18px !important;\n color: #212529;\n text-align: start;\n word-wrap: break-word;\n white-space: normal;\n padding: 0 10px 0 0;\n}\n\n.magicfeedback-point-system-input-container {\n padding: 0 10px 0 0;\n border-radius: 5px;\n font-size: 14px;\n border: 1px solid #ced4da;\n height: 42px;\n margin: auto 0;\n}\n\n.magicfeedback-multi-question-matrix-table thead {\n margin-bottom: 20px;\n}\n\n.magicfeedback-multi-question-matrix-table th{\n text-align: center;\n font-weight: 400 !important;\n font-size: 1rem !important;\n padding: 0 10px !important;\n}\n\n.magicfeedback-multi-question-matrix-table th,\n.magicfeedback-multi-question-matrix-table td label,\n.magicfeedback-priority-list-arrow-up,\n.magicfeedback-priority-list-arrow-down {\n font-style: normal !important;\n font-weight: 400 !important;\n font-size: 1rem !important;\n color: #475569 !important;\n cursor: pointer !important;\n margin: 0 !important;\n line-height: inherit;\n}\n\n.magicfeedback-multi-question-matrix-table tr {\n align-items: center;\n margin: 5px 0;\n}\n\n.magicfeedback-multi-question-matrix-row-tr{\n border-radius: 5px;\n margin: 10px 0 !important;\n}\n\n.magicfeedback-multi-question-matrix-row-tr:nth-child(odd) {\n background-color: #f1f6f6; /* Light gray background for odd rows */\n}\n\n.magicfeedback-multi-question-matrix-row-tr:nth-child(even) {\n background-color: #ffffff; /* White background for even rows */\n}\n\n.magicfeedback-multi-question-matrix-row-label {\n text-align: left !important;\n}\n\n.magicfeedback-point-system-item span {\n color: #475569 !important;\n}\n\n.magicfeedback-point-system-item input {\n padding: 0;\n margin: 0 !important;\n width: auto !important;\n min-width: 100px !important;\n height: auto !important;\n min-height: 42px;\n cursor: pointer;\n font-size: 14px;\n text-align: center !important;\n}\n\n.magicfeedback-multi-question-matrix-table input {\n margin: auto !important;\n padding: 20px !important;\n width: 100% !important;\n height: 15px;\n border: 1px solid #ced4da;\n cursor: pointer;\n}\n\n.magicfeedback-image{\n max-height: 400px !important;\n height: auto !important;\n max-width: 100% !important;\n margin: 10px auto !important;\n}\n\n.magicfeedback-error{\n margin-top: 5px;\n}';
|
|
189
189
|
}
|
|
190
190
|
});
|
|
191
191
|
|
|
@@ -2153,6 +2153,10 @@ function ensureSpinnerStyles(_popup) {
|
|
|
2153
2153
|
const style = document.createElement("style");
|
|
2154
2154
|
style.id = "deepdots-spinner-styles";
|
|
2155
2155
|
style.textContent = `
|
|
2156
|
+
/* El enunciado trae margin-top:20px del CSS de surveys, que sumaba al hueco de la barra
|
|
2157
|
+
de progreso y descompensaba la simetr\xEDa. Solo se anula en el primero: entre preguntas
|
|
2158
|
+
de la misma p\xE1gina sigue separando. */
|
|
2159
|
+
.deepdots-popup .magicfeedback-questions .magicfeedback-div:first-child .magicfeedback-label { margin-top: 0; }
|
|
2156
2160
|
@keyframes ddspin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
|
|
2157
2161
|
.mf-spinner { display:flex; justify-content:center; align-items:center; padding:8px 0; }
|
|
2158
2162
|
.mf-spinner-circle { width:28px; height:28px; border:3px solid #e0e6ed; border-top-color:#1E293B; border-radius:50%; animation: ddspin 0.9s linear infinite; }
|
|
@@ -2179,7 +2183,9 @@ function ensureResponsiveStyles(_popup) {
|
|
|
2179
2183
|
.deepdots-popup button { font-size: 16px !important; }
|
|
2180
2184
|
.deepdots-popup-header button { width:48px; height:48px; }
|
|
2181
2185
|
.deepdots-popup-header button svg { width:26px; height:26px; }
|
|
2182
|
-
|
|
2186
|
+
/* Apilados en el orden del DOM: la acci\xF3n principal (Send/Start/Complete) arriba y
|
|
2187
|
+
Back debajo. */
|
|
2188
|
+
.deepdots-popup-footer { flex-direction: column !important; gap: 4px !important; }
|
|
2183
2189
|
.deepdots-popup-footer button { width: 100%; }
|
|
2184
2190
|
}
|
|
2185
2191
|
@media (max-width: 400px) {
|
|
@@ -2197,6 +2203,18 @@ function ensureResponsiveStyles(_popup) {
|
|
|
2197
2203
|
`;
|
|
2198
2204
|
document.head.appendChild(style);
|
|
2199
2205
|
}
|
|
2206
|
+
function ensureCustomCss(css) {
|
|
2207
|
+
const STYLE_ID = "deepdots-custom-css";
|
|
2208
|
+
const existing = document.getElementById(STYLE_ID);
|
|
2209
|
+
if (!css) {
|
|
2210
|
+
existing?.remove();
|
|
2211
|
+
return;
|
|
2212
|
+
}
|
|
2213
|
+
const el = existing ?? document.createElement("style");
|
|
2214
|
+
el.id = STYLE_ID;
|
|
2215
|
+
if (el.textContent !== css) el.textContent = css;
|
|
2216
|
+
document.head.appendChild(el);
|
|
2217
|
+
}
|
|
2200
2218
|
function ensureFontFace(family, url) {
|
|
2201
2219
|
const css = buildFontFaceCss(family, url);
|
|
2202
2220
|
if (!css) return;
|
|
@@ -2209,9 +2227,11 @@ function ensureFontFace(family, url) {
|
|
|
2209
2227
|
}
|
|
2210
2228
|
if (el.textContent !== css) el.textContent = css;
|
|
2211
2229
|
}
|
|
2212
|
-
async function renderPopup(container, surveyId, productId, actions, emit, onClose, env = "production", userId, style, sessionId, miniService, analyticsFeedbackSessionId) {
|
|
2230
|
+
async function renderPopup(container, surveyId, productId, actions, emit, onClose, env = "production", userId, style, sessionId, miniService, analyticsFeedbackSessionId, options) {
|
|
2213
2231
|
let surveyCompletedEmitted = false;
|
|
2214
2232
|
let stylesInjected = false;
|
|
2233
|
+
let pageDepth = 0;
|
|
2234
|
+
let onStartPage = false;
|
|
2215
2235
|
const isDark = style?.theme === "dark";
|
|
2216
2236
|
const theme = {
|
|
2217
2237
|
popupBg: isDark ? "#1e1e1e" : "#fff",
|
|
@@ -2222,7 +2242,9 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2222
2242
|
colorScheme: isDark ? "dark" : "light",
|
|
2223
2243
|
textPrimary: isDark ? "#f0f0f0" : "#111",
|
|
2224
2244
|
closeBtnHoverBg: isDark ? "rgba(255,255,255,0.10)" : "rgba(0,0,0,0.06)",
|
|
2225
|
-
closeBtnHoverColor: isDark ? "#fff" : "#000000"
|
|
2245
|
+
closeBtnHoverColor: isDark ? "#fff" : "#000000",
|
|
2246
|
+
textMuted: isDark ? "#9ca3af" : "#6b7280",
|
|
2247
|
+
progressTrack: isDark ? "#3f3f46" : "#e5e7eb"
|
|
2226
2248
|
};
|
|
2227
2249
|
const positionMap = {
|
|
2228
2250
|
"center": { justifyContent: "center", alignItems: "center", background: "rgba(0,0,0,0.5)" },
|
|
@@ -2235,6 +2257,7 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2235
2257
|
};
|
|
2236
2258
|
const pos = positionMap[style?.position ?? "center"] ?? positionMap["center"];
|
|
2237
2259
|
const popup = document.createElement("div");
|
|
2260
|
+
popup.id = "dd-popup";
|
|
2238
2261
|
popup.className = "deepdots-popup";
|
|
2239
2262
|
popup.style.cssText = `
|
|
2240
2263
|
position: relative;
|
|
@@ -2248,6 +2271,7 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2248
2271
|
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
|
|
2249
2272
|
max-width: 600px;
|
|
2250
2273
|
width: 90%;
|
|
2274
|
+
max-height: 90vh;
|
|
2251
2275
|
min-height: 200px;
|
|
2252
2276
|
`;
|
|
2253
2277
|
const font = style?.font;
|
|
@@ -2260,8 +2284,21 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2260
2284
|
}
|
|
2261
2285
|
const header = document.createElement("div");
|
|
2262
2286
|
header.className = "deepdots-popup-header";
|
|
2263
|
-
header.style.cssText = "display:flex; justify-content:
|
|
2287
|
+
header.style.cssText = "display:flex; justify-content:space-between; align-items:center; gap:12px; width:100%; flex:0 0 auto;";
|
|
2288
|
+
const titleEl = document.createElement("h2");
|
|
2289
|
+
titleEl.id = "dd-title";
|
|
2290
|
+
titleEl.className = "deepdots-popup-title";
|
|
2291
|
+
titleEl.style.cssText = `margin:0; font-size:17px; font-weight:600; line-height:1.3; color:${theme.textPrimary}; text-transform:none; text-align:left; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;`;
|
|
2292
|
+
titleEl.hidden = true;
|
|
2293
|
+
const setTitle = (value) => {
|
|
2294
|
+
if (!value) return;
|
|
2295
|
+
titleEl.textContent = value;
|
|
2296
|
+
titleEl.hidden = false;
|
|
2297
|
+
};
|
|
2298
|
+
setTitle(options?.title);
|
|
2299
|
+
header.appendChild(titleEl);
|
|
2264
2300
|
const closeBtn = document.createElement("button");
|
|
2301
|
+
closeBtn.id = "dd-close";
|
|
2265
2302
|
closeBtn.type = "button";
|
|
2266
2303
|
closeBtn.setAttribute("aria-label", "Close popup");
|
|
2267
2304
|
closeBtn.innerHTML = `
|
|
@@ -2298,25 +2335,86 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2298
2335
|
emit("popup_clicked", surveyId, { action: "close_icon" });
|
|
2299
2336
|
onClose();
|
|
2300
2337
|
};
|
|
2338
|
+
closeBtn.style.flex = "0 0 auto";
|
|
2339
|
+
closeBtn.style.marginLeft = "auto";
|
|
2301
2340
|
header.appendChild(closeBtn);
|
|
2341
|
+
let progressEnabled = options?.showProgressBar === true;
|
|
2342
|
+
let progressShowUnit = true;
|
|
2343
|
+
let progressUnit = "fraction";
|
|
2344
|
+
const progressEl = document.createElement("div");
|
|
2345
|
+
progressEl.id = "dd-progress";
|
|
2346
|
+
progressEl.className = "deepdots-progress";
|
|
2347
|
+
progressEl.style.cssText = "display:none; flex-direction:column; gap:8px; width:100%; flex:0 0 auto; padding:16px 0; box-sizing:border-box;";
|
|
2348
|
+
const progressHead = document.createElement("div");
|
|
2349
|
+
progressHead.className = "deepdots-progress-head";
|
|
2350
|
+
progressHead.style.cssText = "display:flex; flex-direction:row; justify-content:space-between; align-items:center; width:100%; gap:8px;";
|
|
2351
|
+
const progressLabel = document.createElement("span");
|
|
2352
|
+
progressLabel.id = "dd-progress-label";
|
|
2353
|
+
progressLabel.style.cssText = "font-size:13px; line-height:1.2;";
|
|
2354
|
+
const progressCurrent = document.createElement("span");
|
|
2355
|
+
progressCurrent.id = "dd-progress-current";
|
|
2356
|
+
progressCurrent.style.cssText = `font-weight:700; color:${theme.textPrimary};`;
|
|
2357
|
+
const progressTotal = document.createElement("span");
|
|
2358
|
+
progressTotal.id = "dd-progress-total";
|
|
2359
|
+
progressTotal.style.cssText = `font-weight:400; color:${theme.textMuted};`;
|
|
2360
|
+
progressLabel.appendChild(progressCurrent);
|
|
2361
|
+
progressLabel.appendChild(progressTotal);
|
|
2362
|
+
const progressFollowUp = document.createElement("span");
|
|
2363
|
+
progressFollowUp.id = "dd-progress-followup";
|
|
2364
|
+
progressFollowUp.textContent = "Follow-up";
|
|
2365
|
+
progressFollowUp.style.cssText = "display:none; font-size:12px; font-weight:600; color:#fff; background:rgba(59,130,246,0.44); border-radius:999px; padding:2px 10px;";
|
|
2366
|
+
progressHead.appendChild(progressLabel);
|
|
2367
|
+
progressHead.appendChild(progressFollowUp);
|
|
2368
|
+
const progressTrack = document.createElement("div");
|
|
2369
|
+
progressTrack.className = "deepdots-progress-track";
|
|
2370
|
+
progressTrack.style.cssText = `width:100%; height:4px; border-radius:999px; background:${theme.progressTrack}; overflow:hidden;`;
|
|
2371
|
+
const progressBar = document.createElement("div");
|
|
2372
|
+
progressBar.id = "dd-progress-bar";
|
|
2373
|
+
progressBar.style.cssText = "height:100%; width:0%; background:#22C55E; border-radius:999px; transition:width 450ms ease;";
|
|
2374
|
+
progressTrack.appendChild(progressBar);
|
|
2375
|
+
progressEl.appendChild(progressHead);
|
|
2376
|
+
progressEl.appendChild(progressTrack);
|
|
2377
|
+
function updateProgress(p) {
|
|
2378
|
+
const total = typeof p.total === "number" ? p.total : 0;
|
|
2379
|
+
const progress = typeof p.progress === "number" ? p.progress : 0;
|
|
2380
|
+
if (!progressEnabled || onStartPage || p.completed || total <= 1) {
|
|
2381
|
+
progressEl.style.display = "none";
|
|
2382
|
+
containerContent.style.paddingTop = "16px";
|
|
2383
|
+
return;
|
|
2384
|
+
}
|
|
2385
|
+
progressEl.style.display = "flex";
|
|
2386
|
+
containerContent.style.paddingTop = "0";
|
|
2387
|
+
const current = Math.min(total, Math.max(1, progress + 1));
|
|
2388
|
+
const pct = Math.min(100, Math.max(0, current / total * 100));
|
|
2389
|
+
progressBar.style.width = `${pct}%`;
|
|
2390
|
+
const label = Math.min(total, Math.max(1, Math.floor(progress) + 1));
|
|
2391
|
+
progressLabel.style.display = progressShowUnit ? "block" : "none";
|
|
2392
|
+
if (progressUnit === "percentage") {
|
|
2393
|
+
progressCurrent.textContent = `${Math.round(pct)}%`;
|
|
2394
|
+
progressTotal.textContent = "";
|
|
2395
|
+
} else {
|
|
2396
|
+
progressCurrent.textContent = `Question ${label}`;
|
|
2397
|
+
progressTotal.textContent = ` of ${total}`;
|
|
2398
|
+
}
|
|
2399
|
+
progressFollowUp.style.display = p.followup ? "inline-block" : "none";
|
|
2400
|
+
}
|
|
2302
2401
|
ensureMagicFeedbackStyles(popup);
|
|
2303
2402
|
ensureSpinnerStyles(popup);
|
|
2304
2403
|
ensureResponsiveStyles(popup);
|
|
2404
|
+
ensureCustomCss(options?.surveyCss);
|
|
2305
2405
|
const containerContent = document.createElement("div");
|
|
2306
|
-
containerContent.
|
|
2307
|
-
containerContent.
|
|
2308
|
-
|
|
2309
|
-
flex-direction:column;
|
|
2310
|
-
padding: 0 20px 12px 20px;
|
|
2311
|
-
max-height: 80vh; /* l\xEDmite general del popup */
|
|
2312
|
-
overflow: hidden; /* quita scroll del contenedor principal */
|
|
2313
|
-
`;
|
|
2406
|
+
containerContent.id = "dd-content";
|
|
2407
|
+
containerContent.className = "deepdots-popup-container-content";
|
|
2408
|
+
containerContent.style.cssText = "display:flex; flex-direction:column; flex:1 1 auto; min-height:0; padding:16px 0 0 0; overflow:hidden;";
|
|
2314
2409
|
const main = document.createElement("div");
|
|
2410
|
+
main.id = "dd-main";
|
|
2315
2411
|
main.className = "deepdots-popup-main";
|
|
2316
|
-
main.style.cssText = "display:flex; flex-direction:column; width:100%;
|
|
2412
|
+
main.style.cssText = "display:flex; flex-direction:column; width:100%; flex:1 1 auto; min-height:0; overflow-y:auto;";
|
|
2317
2413
|
const formWrapper = document.createElement("div");
|
|
2414
|
+
formWrapper.id = "dd-form-wrapper";
|
|
2318
2415
|
formWrapper.style.cssText = "width:100%; flex: 1 1 auto;";
|
|
2319
2416
|
const errorHint = document.createElement("div");
|
|
2417
|
+
errorHint.id = "dd-error";
|
|
2320
2418
|
errorHint.className = "deepdots-error-hint";
|
|
2321
2419
|
errorHint.style.cssText = `
|
|
2322
2420
|
display: none;
|
|
@@ -2345,20 +2443,24 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2345
2443
|
main.appendChild(formWrapper);
|
|
2346
2444
|
main.appendChild(errorHint);
|
|
2347
2445
|
const footer = document.createElement("div");
|
|
2446
|
+
footer.id = "dd-footer";
|
|
2348
2447
|
footer.className = "deepdots-popup-footer";
|
|
2349
2448
|
footer.setAttribute("data-actions-wrapper", "true");
|
|
2350
|
-
footer.style.cssText = "display:flex; flex-direction: row-reverse ;justify-content:space-between; align-items:center; gap:
|
|
2449
|
+
footer.style.cssText = "display:flex; flex-direction: row-reverse ;justify-content:space-between; align-items:center; gap:4px; margin-top:auto; width:100%; padding-top:12px;";
|
|
2351
2450
|
const backButton = document.createElement("button");
|
|
2451
|
+
backButton.id = "dd-back";
|
|
2452
|
+
backButton.className = "dd-nav-btn";
|
|
2352
2453
|
backButton.textContent = actions?.back ? actions.back.label : "Back";
|
|
2353
2454
|
backButton.style.cssText = `
|
|
2354
2455
|
background: transparent;
|
|
2355
|
-
color:
|
|
2356
|
-
border:
|
|
2456
|
+
color: ${theme.textMuted};
|
|
2457
|
+
border: none;
|
|
2458
|
+
min-height: 44px;
|
|
2357
2459
|
padding: 12px 24px;
|
|
2358
|
-
border-radius:
|
|
2460
|
+
border-radius: 6px;
|
|
2359
2461
|
cursor: pointer;
|
|
2360
|
-
font-size:
|
|
2361
|
-
|
|
2462
|
+
font-size: 15px;
|
|
2463
|
+
font-weight: 600;
|
|
2362
2464
|
transition: filter .15s ease;
|
|
2363
2465
|
display: inline-flex;
|
|
2364
2466
|
align-items: center;
|
|
@@ -2376,15 +2478,19 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2376
2478
|
formInstance?.back?.();
|
|
2377
2479
|
};
|
|
2378
2480
|
const startButton = document.createElement("button");
|
|
2481
|
+
startButton.id = "dd-start";
|
|
2482
|
+
startButton.className = "dd-nav-btn";
|
|
2379
2483
|
startButton.textContent = actions?.start ? actions.start.label : "Start survey";
|
|
2380
2484
|
startButton.style.cssText = `
|
|
2381
2485
|
background: #1E293B;
|
|
2382
2486
|
color: #fff;
|
|
2383
2487
|
border: none;
|
|
2488
|
+
min-height: 44px;
|
|
2384
2489
|
padding: 12px 24px;
|
|
2385
|
-
border-radius:
|
|
2490
|
+
border-radius: 6px;
|
|
2386
2491
|
cursor: pointer;
|
|
2387
|
-
font-size:
|
|
2492
|
+
font-size: 15px;
|
|
2493
|
+
font-weight: 600;
|
|
2388
2494
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
2389
2495
|
transition: filter .15s ease;
|
|
2390
2496
|
display: inline-flex;
|
|
@@ -2395,17 +2501,23 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2395
2501
|
startButton.onclick = () => {
|
|
2396
2502
|
emit("popup_clicked", surveyId, { action: "start_survey" });
|
|
2397
2503
|
formInstance?.startForm?.();
|
|
2504
|
+
onStartPage = false;
|
|
2505
|
+
updateProgress({ progress: formInstance?.progress, total: formInstance?.total });
|
|
2398
2506
|
};
|
|
2399
2507
|
const closeButton = document.createElement("button");
|
|
2508
|
+
closeButton.id = "dd-complete";
|
|
2509
|
+
closeButton.className = "dd-nav-btn";
|
|
2400
2510
|
closeButton.textContent = actions?.complete ? actions.complete.label : "Complete survey";
|
|
2401
2511
|
closeButton.style.cssText = `
|
|
2402
2512
|
background: #1E293B;
|
|
2403
2513
|
color: #fff;
|
|
2404
2514
|
border: none;
|
|
2515
|
+
min-height: 44px;
|
|
2405
2516
|
padding: 12px 24px;
|
|
2406
|
-
border-radius:
|
|
2517
|
+
border-radius: 6px;
|
|
2407
2518
|
cursor: pointer;
|
|
2408
|
-
font-size:
|
|
2519
|
+
font-size: 15px;
|
|
2520
|
+
font-weight: 600;
|
|
2409
2521
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
2410
2522
|
transition: filter .15s ease;
|
|
2411
2523
|
display: inline-flex;
|
|
@@ -2424,15 +2536,19 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2424
2536
|
onClose();
|
|
2425
2537
|
};
|
|
2426
2538
|
const submitButton = document.createElement("button");
|
|
2539
|
+
submitButton.id = "dd-submit";
|
|
2540
|
+
submitButton.className = "dd-nav-btn";
|
|
2427
2541
|
submitButton.textContent = actions?.accept ? actions.accept.label : "Send";
|
|
2428
2542
|
submitButton.style.cssText = `
|
|
2429
2543
|
background: #1E293B;
|
|
2430
2544
|
color: #fff;
|
|
2431
2545
|
border: none;
|
|
2546
|
+
min-height: 44px;
|
|
2432
2547
|
padding: 12px 24px;
|
|
2433
|
-
border-radius:
|
|
2548
|
+
border-radius: 6px;
|
|
2434
2549
|
cursor: pointer;
|
|
2435
|
-
font-size:
|
|
2550
|
+
font-size: 15px;
|
|
2551
|
+
font-weight: 600;
|
|
2436
2552
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
2437
2553
|
transition: filter .15s ease;
|
|
2438
2554
|
display: inline-flex;
|
|
@@ -2454,8 +2570,9 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2454
2570
|
footer.appendChild(backButton);
|
|
2455
2571
|
footer.appendChild(closeButton);
|
|
2456
2572
|
footer.appendChild(startButton);
|
|
2457
|
-
main.appendChild(footer);
|
|
2458
2573
|
containerContent.appendChild(main);
|
|
2574
|
+
footer.style.flex = "0 0 auto";
|
|
2575
|
+
containerContent.appendChild(footer);
|
|
2459
2576
|
function updateButtons(state) {
|
|
2460
2577
|
backButton.style.display = "none";
|
|
2461
2578
|
startButton.style.display = "none";
|
|
@@ -2492,7 +2609,27 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2492
2609
|
break;
|
|
2493
2610
|
}
|
|
2494
2611
|
}
|
|
2612
|
+
function updateNavButtons() {
|
|
2613
|
+
updateButtons(pageDepth > 0 ? "in_progress_next" : "in_progress_first");
|
|
2614
|
+
}
|
|
2615
|
+
let successMessageHtml = "";
|
|
2616
|
+
function showSuccessScreen() {
|
|
2617
|
+
progressEl.style.display = "none";
|
|
2618
|
+
formWrapper.style.display = "none";
|
|
2619
|
+
let done = main.querySelector(".deepdots-success");
|
|
2620
|
+
if (!done) {
|
|
2621
|
+
done = document.createElement("div");
|
|
2622
|
+
done.className = "deepdots-success";
|
|
2623
|
+
done.style.cssText = `width:100%; text-align:center; padding:24px 0; color:${theme.textPrimary};`;
|
|
2624
|
+
main.insertBefore(done, errorHint);
|
|
2625
|
+
}
|
|
2626
|
+
done.innerHTML = successMessageHtml || "<p>Thank you for your feedback!</p>";
|
|
2627
|
+
done.querySelectorAll("img").forEach((img) => {
|
|
2628
|
+
img.style.cssText = "max-width:100%; height:auto; margin:0 auto 16px auto; display:block;";
|
|
2629
|
+
});
|
|
2630
|
+
}
|
|
2495
2631
|
popup.appendChild(header);
|
|
2632
|
+
popup.appendChild(progressEl);
|
|
2496
2633
|
popup.appendChild(containerContent);
|
|
2497
2634
|
container.innerHTML = "";
|
|
2498
2635
|
container.appendChild(popup);
|
|
@@ -2538,15 +2675,27 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2538
2675
|
formInstance = import_native.default.form(surveyId, productId, profile, metadata);
|
|
2539
2676
|
const generateOptions = {
|
|
2540
2677
|
addButton: false,
|
|
2541
|
-
getMetaData: true
|
|
2678
|
+
getMetaData: true,
|
|
2679
|
+
// La pantalla final la pinta el popup: `renderSuccess` de @magicfeedback/native usa
|
|
2680
|
+
// textContent, así que el mensaje de la plataforma (HTML con imagen) no se vería, y
|
|
2681
|
+
// su fallback es un literal genérico que ignora `style.successMessage`.
|
|
2682
|
+
addSuccessScreen: false
|
|
2542
2683
|
};
|
|
2543
2684
|
generateOptions.onLoadedEvent = ({ formData }) => {
|
|
2544
2685
|
try {
|
|
2545
|
-
} catch
|
|
2686
|
+
} catch {
|
|
2546
2687
|
}
|
|
2547
2688
|
const s = formData?.style;
|
|
2548
2689
|
if (s && !stylesInjected) {
|
|
2549
2690
|
stylesInjected = true;
|
|
2691
|
+
if (s.successMessage) successMessageHtml = s.successMessage;
|
|
2692
|
+
if (options?.showProgressBar === void 0) progressEnabled = s.showProgressBar === true;
|
|
2693
|
+
if (s.showProgressUnit !== void 0) progressShowUnit = s.showProgressUnit !== false;
|
|
2694
|
+
if (s.progressUnit) progressUnit = s.progressUnit;
|
|
2695
|
+
if (s.loadingBarColor) {
|
|
2696
|
+
progressBar.style.background = s.loadingBarColor;
|
|
2697
|
+
progressFollowUp.style.background = s.loadingBarColor;
|
|
2698
|
+
}
|
|
2550
2699
|
if (s.boxBackgroundColor) {
|
|
2551
2700
|
popup.style.background = s.boxBackgroundColor;
|
|
2552
2701
|
}
|
|
@@ -2565,9 +2714,9 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2565
2714
|
closeButton.style.color = "#fff";
|
|
2566
2715
|
}
|
|
2567
2716
|
if (s.buttonSecondaryColor) {
|
|
2568
|
-
backButton.style.background = "
|
|
2717
|
+
backButton.style.background = "transparent";
|
|
2569
2718
|
backButton.style.color = s.buttonSecondaryColor;
|
|
2570
|
-
backButton.style.border =
|
|
2719
|
+
backButton.style.border = "none";
|
|
2571
2720
|
}
|
|
2572
2721
|
if (s.logo) {
|
|
2573
2722
|
if (!document.getElementById("deepdots-popup-logo")) {
|
|
@@ -2612,6 +2761,7 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2612
2761
|
}
|
|
2613
2762
|
if (s.startMessage && s.startMessage !== "") {
|
|
2614
2763
|
sdkLog(s.startMessage);
|
|
2764
|
+
onStartPage = true;
|
|
2615
2765
|
updateButtons("start");
|
|
2616
2766
|
} else {
|
|
2617
2767
|
updateButtons("in_progress_first");
|
|
@@ -2619,6 +2769,7 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2619
2769
|
} else {
|
|
2620
2770
|
updateButtons("in_progress_first");
|
|
2621
2771
|
}
|
|
2772
|
+
updateProgress({ progress: formInstance.progress, total: formInstance.total });
|
|
2622
2773
|
emit("popup_clicked", surveyId, { action: "loaded" });
|
|
2623
2774
|
setLoading(false);
|
|
2624
2775
|
};
|
|
@@ -2626,7 +2777,7 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2626
2777
|
setLoading(true);
|
|
2627
2778
|
emit("popup_clicked", surveyId, { action: "before_submit" });
|
|
2628
2779
|
};
|
|
2629
|
-
generateOptions.afterSubmitEvent = ({ error, completed, total, progress }) => {
|
|
2780
|
+
generateOptions.afterSubmitEvent = ({ error, completed, total, progress, followup }) => {
|
|
2630
2781
|
const errText = error ? typeof error === "string" ? error : error.message ?? String(error) : "";
|
|
2631
2782
|
if (errText) {
|
|
2632
2783
|
setLoading(false);
|
|
@@ -2634,7 +2785,7 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2634
2785
|
errorHint.textContent = "Please answer the required question to continue.";
|
|
2635
2786
|
errorHint.style.display = "block";
|
|
2636
2787
|
emit("popup_clicked", surveyId, { action: "validation_error_required" });
|
|
2637
|
-
|
|
2788
|
+
updateNavButtons();
|
|
2638
2789
|
return;
|
|
2639
2790
|
}
|
|
2640
2791
|
errorHint.textContent = "An error occurred while submitting. Please try again or close the popup.";
|
|
@@ -2647,23 +2798,21 @@ async function renderPopup(container, surveyId, productId, actions, emit, onClos
|
|
|
2647
2798
|
if (completed) {
|
|
2648
2799
|
emit("survey_completed", surveyId, { action: "completed" });
|
|
2649
2800
|
surveyCompletedEmitted = true;
|
|
2801
|
+
showSuccessScreen();
|
|
2650
2802
|
updateButtons("completed");
|
|
2803
|
+
updateProgress({ progress, total, completed: true });
|
|
2651
2804
|
return;
|
|
2652
2805
|
}
|
|
2653
2806
|
emit("popup_clicked", surveyId, { action: "partial" });
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
updateButtons("in_progress_first");
|
|
2658
|
-
}
|
|
2807
|
+
pageDepth++;
|
|
2808
|
+
updateNavButtons();
|
|
2809
|
+
updateProgress({ progress, total, followup });
|
|
2659
2810
|
};
|
|
2660
|
-
generateOptions.onBackEvent = ({ progress }) => {
|
|
2811
|
+
generateOptions.onBackEvent = ({ progress, error, followup }) => {
|
|
2661
2812
|
emit("popup_clicked", surveyId, { action: "back" });
|
|
2662
|
-
if (
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
updateButtons("in_progress_next");
|
|
2666
|
-
}
|
|
2813
|
+
if (!error) pageDepth = Math.max(0, pageDepth - 1);
|
|
2814
|
+
updateNavButtons();
|
|
2815
|
+
updateProgress({ progress, total: formInstance.total, followup });
|
|
2667
2816
|
};
|
|
2668
2817
|
formInstance.generate(formDivId, generateOptions).catch((err) => {
|
|
2669
2818
|
sdkError("[MagicFeedback] Error generating form:", err);
|
|
@@ -2720,6 +2869,10 @@ var POPUP_TRIGGER_CONDITION_STATUSES = [
|
|
|
2720
2869
|
];
|
|
2721
2870
|
|
|
2722
2871
|
// src/triggers/index.ts
|
|
2872
|
+
function toNumericValue(value, fallback) {
|
|
2873
|
+
const n = Number(value);
|
|
2874
|
+
return Number.isFinite(n) ? n : fallback;
|
|
2875
|
+
}
|
|
2723
2876
|
function setupTrigger(popups, trigger) {
|
|
2724
2877
|
switch (trigger.type) {
|
|
2725
2878
|
case "time":
|
|
@@ -2740,14 +2893,14 @@ function setupTrigger(popups, trigger) {
|
|
|
2740
2893
|
}
|
|
2741
2894
|
}
|
|
2742
2895
|
function setupTimeTrigger(popups, trigger) {
|
|
2743
|
-
const delay = trigger.value
|
|
2896
|
+
const delay = toNumericValue(trigger.value, 5e3);
|
|
2744
2897
|
setTimeout(() => {
|
|
2745
2898
|
popups.triggerSurvey(trigger.surveyId, trigger.popupId);
|
|
2746
2899
|
}, delay);
|
|
2747
2900
|
popups.debug(`Time trigger set for ${delay}ms`);
|
|
2748
2901
|
}
|
|
2749
2902
|
function setupScrollTrigger(popups, trigger) {
|
|
2750
|
-
const threshold = trigger.value
|
|
2903
|
+
const threshold = toNumericValue(trigger.value, 50);
|
|
2751
2904
|
const handler = () => {
|
|
2752
2905
|
const scrollPercentage = window.scrollY / (document.documentElement.scrollHeight - window.innerHeight) * 100;
|
|
2753
2906
|
if (scrollPercentage >= threshold) {
|
|
@@ -2911,14 +3064,17 @@ var POSITION_MAP = {
|
|
|
2911
3064
|
"top-right": { justifyContent: "flex-end", alignItems: "flex-start", padding: "16px", background: "transparent" },
|
|
2912
3065
|
"top-left": { justifyContent: "flex-start", alignItems: "flex-start", padding: "16px", background: "transparent" }
|
|
2913
3066
|
};
|
|
3067
|
+
function jsonForScript(value) {
|
|
3068
|
+
return JSON.stringify(value ?? null).replace(/</g, "\\u003C").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
|
|
3069
|
+
}
|
|
2914
3070
|
function buildSurveyHtml(opts) {
|
|
2915
3071
|
const env = opts.env === "development" ? "dev" : "prod";
|
|
2916
3072
|
const version = opts.version ?? "2.2.4";
|
|
2917
3073
|
const cdn = `https://cdn.jsdelivr.net/npm/@magicfeedback/native@${version}/dist/magicfeedback-sdk.browser.js`;
|
|
2918
|
-
const sid =
|
|
2919
|
-
const pid =
|
|
2920
|
-
const profileJson =
|
|
2921
|
-
const metaJson =
|
|
3074
|
+
const sid = jsonForScript(opts.surveyId);
|
|
3075
|
+
const pid = jsonForScript(opts.productId);
|
|
3076
|
+
const profileJson = jsonForScript(opts.profile ?? []);
|
|
3077
|
+
const metaJson = jsonForScript(opts.metadata ?? []);
|
|
2922
3078
|
const fontFaceCss = opts.font ? buildFontFaceCss(opts.font.family, opts.font.url) : "";
|
|
2923
3079
|
const fontFamilyValue = opts.font ? buildFontFamilyValue(opts.font.family) : "-apple-system,system-ui,sans-serif";
|
|
2924
3080
|
const popupClass = opts.font?.family ? "deepdots-popup deepdots-has-font" : "deepdots-popup";
|
|
@@ -2926,11 +3082,29 @@ function buildSurveyHtml(opts) {
|
|
|
2926
3082
|
const popupBg = isDark ? "#1e1e1e" : "#fff";
|
|
2927
3083
|
const colorScheme = isDark ? "dark" : "light";
|
|
2928
3084
|
const textPrimary = isDark ? "#f0f0f0" : "#111";
|
|
3085
|
+
const textMuted = isDark ? "#9ca3af" : "#6b7280";
|
|
3086
|
+
const trackBg = isDark ? "#3f3f46" : "#e5e7eb";
|
|
2929
3087
|
const pos = POSITION_MAP[opts.position ?? "center"] ?? POSITION_MAP.center;
|
|
2930
|
-
const
|
|
2931
|
-
const
|
|
2932
|
-
const
|
|
2933
|
-
const
|
|
3088
|
+
const chrome = opts.chrome !== false;
|
|
3089
|
+
const bodyBg = chrome ? pos.background : "transparent";
|
|
3090
|
+
const bodyPadding = chrome ? pos.padding : "0";
|
|
3091
|
+
const bodyDisplay = chrome ? "flex" : "block";
|
|
3092
|
+
const cardBg = chrome ? popupBg : "transparent";
|
|
3093
|
+
const cardShadow = chrome ? "0 4px 6px rgba(0,0,0,0.1)" : "none";
|
|
3094
|
+
const cardRadius = chrome ? "8px" : "0";
|
|
3095
|
+
const cardMaxWidth = chrome ? "600px" : "none";
|
|
3096
|
+
const cardWidth = chrome ? "90%" : "100%";
|
|
3097
|
+
const cardMinHeight = chrome ? "200px" : "0";
|
|
3098
|
+
const cardHeight = chrome ? "auto" : "100%";
|
|
3099
|
+
const cardMaxHeight = chrome ? "90vh" : "100%";
|
|
3100
|
+
const mobileCard = chrome ? `.deepdots-popup{width:calc(100% - 24px);max-width:calc(100% - 24px);border-radius:12px;padding:calc(16px + env(safe-area-inset-top)) 16px calc(16px + env(safe-area-inset-bottom)) 16px}` : `.deepdots-popup{width:100%;max-width:100%;border-radius:0;padding:16px}`;
|
|
3101
|
+
const titleJson = jsonForScript(opts.title ?? "");
|
|
3102
|
+
const customCss = (opts.surveyCss ?? "").replace(/<\/\s*style/gi, "<\\/style");
|
|
3103
|
+
const progressPref = opts.showProgressBar === void 0 ? "null" : String(opts.showProgressBar);
|
|
3104
|
+
const backLabel = jsonForScript(opts.actions?.back?.label ?? "Back");
|
|
3105
|
+
const startLabel = jsonForScript(opts.actions?.start?.label ?? "Start survey");
|
|
3106
|
+
const completeLabel = jsonForScript(opts.actions?.complete?.label ?? "Complete survey");
|
|
3107
|
+
const submitLabel = jsonForScript(opts.actions?.accept?.label ?? "Send");
|
|
2934
3108
|
return `<!DOCTYPE html><html><head>
|
|
2935
3109
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
2936
3110
|
<meta name="color-scheme" content="${colorScheme}"/>
|
|
@@ -2938,57 +3112,98 @@ function buildSurveyHtml(opts) {
|
|
|
2938
3112
|
${style_default}
|
|
2939
3113
|
${fontFaceCss}
|
|
2940
3114
|
html,body{margin:0;padding:0;height:100%;font-family:${fontFamilyValue}}
|
|
2941
|
-
body{display
|
|
2942
|
-
.deepdots-popup{position:relative;display:flex;flex-direction:column;justify-content:flex-start;background:${
|
|
2943
|
-
.deepdots-popup-header{display:flex;justify-content:
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
3115
|
+
body{display:${bodyDisplay};justify-content:${pos.justifyContent};align-items:${pos.alignItems};background:${bodyBg};padding:${bodyPadding};box-sizing:border-box}
|
|
3116
|
+
.deepdots-popup{position:relative;display:flex;flex-direction:column;justify-content:flex-start;background:${cardBg};color-scheme:${colorScheme};border-radius:${cardRadius};padding:24px;box-shadow:${cardShadow};max-width:${cardMaxWidth};width:${cardWidth};min-height:${cardMinHeight};height:${cardHeight};max-height:${cardMaxHeight};box-sizing:border-box}
|
|
3117
|
+
.deepdots-popup-header{display:flex;justify-content:space-between;align-items:center;gap:12px;width:100%;flex:0 0 auto}
|
|
3118
|
+
/* Neutraliza la regla \`.deepdots-popup h2\` del CSS del survey (uppercase, centrado y
|
|
3119
|
+
margin-bottom 40px), pensada para los enunciados y no para el t\xEDtulo de la cabecera. */
|
|
3120
|
+
#dd-title{margin:0;font-family:var(--deepdots-font,'Montserrat',inherit);font-size:17px;font-weight:600;line-height:1.3;color:${textPrimary};text-transform:none;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
3121
|
+
#dd-close{background:transparent;border:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:8px;cursor:pointer;color:${textPrimary};padding:4px;flex:0 0 auto;margin-left:auto}
|
|
3122
|
+
/* Progreso alineado con la cabecera: sin padding horizontal propio, lo marca la tarjeta.
|
|
3123
|
+
El vertical es el mismo arriba y abajo, y del mismo valor que el padding de la tarjeta. */
|
|
3124
|
+
.deepdots-progress{display:none;flex-direction:column;gap:8px;width:100%;flex:0 0 auto;padding:16px 0;box-sizing:border-box}
|
|
3125
|
+
.deepdots-progress-head{display:flex;flex-direction:row;justify-content:space-between;align-items:center;width:100%;gap:8px}
|
|
3126
|
+
#dd-progress-label{font-size:13px;line-height:1.2}
|
|
3127
|
+
/* "Question 1" en negrita y "of 3" en regular gris, como el mockup. */
|
|
3128
|
+
#dd-progress-current{font-weight:700;color:${textPrimary}}
|
|
3129
|
+
#dd-progress-total{font-weight:400;color:${textMuted}}
|
|
3130
|
+
#dd-progress-followup{display:none;font-size:12px;font-weight:600;color:#fff;background:rgba(59,130,246,0.44);border-radius:999px;padding:2px 10px}
|
|
3131
|
+
.deepdots-progress-track{width:100%;height:4px;border-radius:999px;background:${trackBg};overflow:hidden}
|
|
3132
|
+
#dd-progress-bar{height:100%;width:0%;background:#22C55E;border-radius:999px;transition:width 450ms ease}
|
|
3133
|
+
/* El popup es una columna: solo el bloque de preguntas hace scroll, para que el footer
|
|
3134
|
+
con las acciones quede siempre visible en el borde inferior (antes viv\xEDa dentro del
|
|
3135
|
+
\xE1rea scrollable y hab\xEDa que bajar hasta el final para ver "Send"). */
|
|
3136
|
+
/* Sin sangrado extra: el contenido se alinea con el t\xEDtulo y con la barra de progreso (antes
|
|
3137
|
+
sumaba 20px a los lados sobre el padding de la tarjeta y quedaba m\xE1s adentro que la cabecera). */
|
|
3138
|
+
/* Sin barra de progreso, este padding-top es el que separa la cabecera de la pregunta. Con
|
|
3139
|
+
barra, el JS lo pone a 0 y el hueco lo aporta el padding inferior del bloque de progreso,
|
|
3140
|
+
de modo que el espacio por arriba y por abajo de la barra es id\xE9ntico. */
|
|
3141
|
+
.deepdots-popup-container-content{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;padding:16px 0 0 0;overflow:hidden;box-sizing:border-box}
|
|
3142
|
+
/* El enunciado trae margin-top:20px del CSS de surveys, que sumaba al hueco de la barra y
|
|
3143
|
+
descompensaba la simetr\xEDa. Solo se anula en el primero: entre preguntas sigue separando. */
|
|
3144
|
+
.deepdots-popup .magicfeedback-questions .magicfeedback-div:first-child .magicfeedback-label{margin-top:0}
|
|
3145
|
+
.deepdots-popup-main{display:flex;flex-direction:column;width:100%;flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;position:relative}
|
|
2947
3146
|
#dd-form-wrapper{width:100%;flex:1 1 auto}
|
|
2948
3147
|
#mf{width:100%;box-sizing:border-box;visibility:hidden}
|
|
2949
3148
|
.deepdots-popup-main *{max-width:100%;box-sizing:border-box}
|
|
2950
3149
|
#dd-logo{max-height:40px;max-width:100%;object-fit:contain}
|
|
2951
3150
|
.deepdots-error-hint{display:none;margin:12px 0 0 0;padding:10px 12px;border-radius:6px;background:#FEF3C7;color:#92400E;border:1px solid #FCD34D;font-size:13px}
|
|
2952
|
-
.
|
|
2953
|
-
.
|
|
2954
|
-
|
|
3151
|
+
/* Pantalla final: el HTML del editor de la plataforma (imagen + texto), centrado. */
|
|
3152
|
+
.deepdots-success{display:none;width:100%;text-align:center;padding:24px 0;color:${textPrimary}}
|
|
3153
|
+
.deepdots-success img{max-width:100%;height:auto;margin:0 auto 16px auto;display:block}
|
|
3154
|
+
.deepdots-success p{margin:0;font-size:16px;font-weight:600;line-height:1.4}
|
|
3155
|
+
.deepdots-popup-footer{display:flex;flex-direction:row-reverse;justify-content:space-between;align-items:center;gap:4px;margin-top:auto;width:100%;padding-top:12px}
|
|
3156
|
+
.dd-nav-btn{display:none;border:none;min-height:44px;padding:12px 24px;border-radius:6px;cursor:pointer;font-size:15px;font-weight:600;align-items:center;justify-content:center;text-align:center}
|
|
3157
|
+
/* Secundario como bot\xF3n de texto: sin borde ni fondo, para que el primario sea la \xFAnica CTA. */
|
|
3158
|
+
#dd-back{background:transparent;color:${textMuted};border:none}
|
|
2955
3159
|
#dd-start,#dd-complete,#dd-submit{background:#1E293B;color:#fff;border:none}
|
|
2956
3160
|
#dd-submit:disabled,#dd-start:disabled,#dd-back:disabled,#dd-complete:disabled{opacity:0.6;cursor:not-allowed}
|
|
2957
3161
|
.mf-spinner{display:none;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
|
|
2958
3162
|
.mf-spinner-circle{width:28px;height:28px;border:3px solid #e0e6ed;border-top-color:#1E293B;border-radius:50%;animation:ddspin 0.9s linear infinite}
|
|
2959
3163
|
@keyframes ddspin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
|
|
2960
3164
|
@media (max-width:640px){
|
|
2961
|
-
|
|
2962
|
-
.
|
|
3165
|
+
${mobileCard}
|
|
3166
|
+
/* Apilados: la acci\xF3n principal (Send/Start/Complete) arriba y Back debajo. El orden del
|
|
3167
|
+
DOM ya es ese, as\xED que \`column\` (no \`column-reverse\`) es lo que lo respeta. */
|
|
3168
|
+
.deepdots-popup-footer{flex-direction:column;gap:4px}
|
|
2963
3169
|
.dd-nav-btn{width:100%}
|
|
2964
3170
|
.magicfeedback-checkbox-container,.magicfeedback-radio-container{margin:4px 0;padding:4px 8px}
|
|
2965
3171
|
.magicfeedback-checkbox label,.magicfeedback-radio-container label{font-size:15px}
|
|
2966
3172
|
.deepdots-popup input[type="radio"]{margin:6px 0 6px 8px}
|
|
2967
3173
|
.deepdots-popup input[type="checkbox"]{width:16px;height:16px}
|
|
2968
3174
|
}
|
|
3175
|
+
${customCss}
|
|
2969
3176
|
</style>
|
|
2970
3177
|
</head><body>
|
|
2971
3178
|
<div class="${popupClass}" id="dd-popup">
|
|
2972
3179
|
<div class="deepdots-popup-header">
|
|
3180
|
+
<h2 id="dd-title" class="deepdots-popup-title" hidden></h2>
|
|
2973
3181
|
<button type="button" id="dd-close" aria-label="Close popup">
|
|
2974
3182
|
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2975
3183
|
<path d="M6 6L18 18M6 18L18 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
2976
3184
|
</svg>
|
|
2977
3185
|
</button>
|
|
2978
3186
|
</div>
|
|
2979
|
-
<div class="deepdots-
|
|
3187
|
+
<div class="deepdots-progress" id="dd-progress">
|
|
3188
|
+
<div class="deepdots-progress-head">
|
|
3189
|
+
<span id="dd-progress-label"><span id="dd-progress-current"></span><span id="dd-progress-total"></span></span>
|
|
3190
|
+
<span id="dd-progress-followup">Follow-up</span>
|
|
3191
|
+
</div>
|
|
3192
|
+
<div class="deepdots-progress-track"><div id="dd-progress-bar"></div></div>
|
|
3193
|
+
</div>
|
|
3194
|
+
<div class="deepdots-popup-container-content" id="dd-content">
|
|
2980
3195
|
<div class="deepdots-popup-main" id="dd-main">
|
|
2981
3196
|
<div id="dd-form-wrapper">
|
|
2982
3197
|
<div class="mf-spinner" id="dd-spinner" role="status" aria-label="Loading survey"><div class="mf-spinner-circle"></div></div>
|
|
2983
3198
|
<div id="mf"></div>
|
|
2984
3199
|
</div>
|
|
2985
3200
|
<div class="deepdots-error-hint" id="dd-error" role="alert" aria-live="polite"></div>
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
</
|
|
3201
|
+
</div>
|
|
3202
|
+
<div class="deepdots-popup-footer" id="dd-footer">
|
|
3203
|
+
<button type="button" class="dd-nav-btn" id="dd-submit">Send</button>
|
|
3204
|
+
<button type="button" class="dd-nav-btn" id="dd-back">Back</button>
|
|
3205
|
+
<button type="button" class="dd-nav-btn" id="dd-complete">Complete survey</button>
|
|
3206
|
+
<button type="button" class="dd-nav-btn" id="dd-start">Start survey</button>
|
|
2992
3207
|
</div>
|
|
2993
3208
|
</div>
|
|
2994
3209
|
</div>
|
|
@@ -2997,9 +3212,11 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
2997
3212
|
function emit(s){ try{ if(window.ReactNativeWebView){ window.ReactNativeWebView.postMessage(s); } }catch(e){} }
|
|
2998
3213
|
function emitJSON(n,p){ try{ emit(JSON.stringify({name:n,payload:p||{}})); }catch(e){} }
|
|
2999
3214
|
window.DeepdotsClose = function(){ emitJSON('popup_close'); };
|
|
3215
|
+
var chromeOn=${chrome ? "true" : "false"};
|
|
3000
3216
|
|
|
3001
3217
|
var popup=document.getElementById('dd-popup');
|
|
3002
3218
|
var main=document.getElementById('dd-main');
|
|
3219
|
+
var content=document.getElementById('dd-content');
|
|
3003
3220
|
var footer=document.getElementById('dd-footer');
|
|
3004
3221
|
var spinner=document.getElementById('dd-spinner');
|
|
3005
3222
|
var formHost=document.getElementById('mf');
|
|
@@ -3008,6 +3225,58 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
3008
3225
|
var startBtn=document.getElementById('dd-start');
|
|
3009
3226
|
var completeBtn=document.getElementById('dd-complete');
|
|
3010
3227
|
var submitBtn=document.getElementById('dd-submit');
|
|
3228
|
+
var titleEl=document.getElementById('dd-title');
|
|
3229
|
+
var progressEl=document.getElementById('dd-progress');
|
|
3230
|
+
var progressLabel=document.getElementById('dd-progress-label');
|
|
3231
|
+
var progressCurrent=document.getElementById('dd-progress-current');
|
|
3232
|
+
var progressTotal=document.getElementById('dd-progress-total');
|
|
3233
|
+
var progressFollowUp=document.getElementById('dd-progress-followup');
|
|
3234
|
+
var progressBar=document.getElementById('dd-progress-bar');
|
|
3235
|
+
|
|
3236
|
+
function setTitle(t){
|
|
3237
|
+
if(!t) return;
|
|
3238
|
+
titleEl.textContent=t;
|
|
3239
|
+
titleEl.hidden=false;
|
|
3240
|
+
}
|
|
3241
|
+
setTitle(${titleJson});
|
|
3242
|
+
|
|
3243
|
+
// Estado de la barra de progreso. \`progressPref\` null = manda la plataforma (style).
|
|
3244
|
+
var progressPref=${progressPref};
|
|
3245
|
+
var progressEnabled=progressPref===true;
|
|
3246
|
+
var progressShowUnit=true;
|
|
3247
|
+
var progressUnit='fraction';
|
|
3248
|
+
var onStartPage=false;
|
|
3249
|
+
|
|
3250
|
+
function updateProgress(p){
|
|
3251
|
+
var total=p&&typeof p.total==='number'?p.total:0;
|
|
3252
|
+
var progress=p&&typeof p.progress==='number'?p.progress:0;
|
|
3253
|
+
// Solo tiene sentido con m\xE1s de una p\xE1gina, fuera de la pantalla de inicio y sin completar.
|
|
3254
|
+
if(!progressEnabled||onStartPage||p&&p.completed||total<=1){
|
|
3255
|
+
progressEl.style.display='none';
|
|
3256
|
+
// Sin barra, el hueco cabecera\u2192pregunta lo pone el contenido.
|
|
3257
|
+
content.style.paddingTop='16px';
|
|
3258
|
+
return;
|
|
3259
|
+
}
|
|
3260
|
+
progressEl.style.display='flex';
|
|
3261
|
+
// Con barra, el hueco inferior ya lo pone el bloque de progreso: no duplicarlo.
|
|
3262
|
+
content.style.paddingTop='0';
|
|
3263
|
+
// Espejo de LineProgressQuestion (MagicSurvey): la barra usa el valor real (las follow-up
|
|
3264
|
+
// suman +0.5 y avanzan media casilla) y la etiqueta redondea hacia abajo, porque una
|
|
3265
|
+
// follow-up es un paso DENTRO de la misma pregunta, no la siguiente.
|
|
3266
|
+
var current=Math.min(total,Math.max(1,progress+1));
|
|
3267
|
+
var pct=Math.min(100,Math.max(0,(current/total)*100));
|
|
3268
|
+
progressBar.style.width=pct+'%';
|
|
3269
|
+
var label=Math.min(total,Math.max(1,Math.floor(progress)+1));
|
|
3270
|
+
progressLabel.style.display=progressShowUnit?'block':'none';
|
|
3271
|
+
if(progressUnit==='percentage'){
|
|
3272
|
+
progressCurrent.textContent=Math.round(pct)+'%';
|
|
3273
|
+
progressTotal.textContent='';
|
|
3274
|
+
} else {
|
|
3275
|
+
progressCurrent.textContent='Question '+label;
|
|
3276
|
+
progressTotal.textContent=' of '+total;
|
|
3277
|
+
}
|
|
3278
|
+
progressFollowUp.style.display=p&&p.followup?'inline-block':'none';
|
|
3279
|
+
}
|
|
3011
3280
|
|
|
3012
3281
|
backBtn.textContent=${backLabel};
|
|
3013
3282
|
startBtn.textContent=${startLabel};
|
|
@@ -3016,7 +3285,13 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
3016
3285
|
|
|
3017
3286
|
document.getElementById('dd-close').onclick=function(){ emitJSON('popup_close'); };
|
|
3018
3287
|
backBtn.onclick=function(){ if(window.DeepdotsForm && window.DeepdotsForm.back){ window.DeepdotsForm.back(); } };
|
|
3019
|
-
startBtn.onclick=function(){
|
|
3288
|
+
startBtn.onclick=function(){
|
|
3289
|
+
if(window.DeepdotsForm && window.DeepdotsForm.startForm){
|
|
3290
|
+
window.DeepdotsForm.startForm();
|
|
3291
|
+
onStartPage=false;
|
|
3292
|
+
updateProgress({ progress:window.DeepdotsForm.progress, total:window.DeepdotsForm.total, completed:false, followup:false });
|
|
3293
|
+
}
|
|
3294
|
+
};
|
|
3020
3295
|
completeBtn.onclick=function(){ emitJSON('popup_close'); };
|
|
3021
3296
|
var surveyCompletedEmitted=false;
|
|
3022
3297
|
submitBtn.onclick=function(){
|
|
@@ -3024,6 +3299,36 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
3024
3299
|
if(window.DeepdotsForm && window.DeepdotsForm.send){ window.DeepdotsForm.send(); }
|
|
3025
3300
|
};
|
|
3026
3301
|
|
|
3302
|
+
// Mensaje final configurado en la plataforma (\`style.successMessage\`). Se guarda al cargar
|
|
3303
|
+
// y se pinta al completar. Va por innerHTML porque es HTML del editor de la plataforma
|
|
3304
|
+
// (imagen + texto), igual que ya hace \`renderStartMessage\` con el mensaje de inicio.
|
|
3305
|
+
var successMessageHtml='';
|
|
3306
|
+
function showSuccessScreen(){
|
|
3307
|
+
progressEl.style.display='none';
|
|
3308
|
+
var wrapper=document.getElementById('dd-form-wrapper');
|
|
3309
|
+
if(wrapper){ wrapper.style.display='none'; }
|
|
3310
|
+
var done=document.getElementById('dd-success');
|
|
3311
|
+
if(!done){
|
|
3312
|
+
done=document.createElement('div');
|
|
3313
|
+
done.id='dd-success';
|
|
3314
|
+
done.className='deepdots-success';
|
|
3315
|
+
main.insertBefore(done, errorHint);
|
|
3316
|
+
}
|
|
3317
|
+
done.innerHTML=successMessageHtml || '<p>Thank you for your feedback!</p>';
|
|
3318
|
+
done.style.display='block';
|
|
3319
|
+
}
|
|
3320
|
+
|
|
3321
|
+
// Profundidad de navegaci\xF3n DENTRO del survey: +1 por p\xE1gina avanzada, -1 al volver.
|
|
3322
|
+
// Sustituye a la condici\xF3n \`total>1 && progress>0 && progress<total\`, que escond\xEDa el
|
|
3323
|
+
// Back siempre que la siguiente pantalla era una follow-up din\xE1mica: las follow-up no
|
|
3324
|
+
// entran en el grafo (suman +0.5 al progress y no tocan el total), as\xED que un survey de
|
|
3325
|
+
// una pregunta con follow-up tiene total=1 y nunca cumpl\xEDa \`total>1\`.
|
|
3326
|
+
var pageDepth=0;
|
|
3327
|
+
|
|
3328
|
+
function updateNavButtons(){
|
|
3329
|
+
updateButtons(pageDepth>0?'in_progress_next':'in_progress_first');
|
|
3330
|
+
}
|
|
3331
|
+
|
|
3027
3332
|
function updateButtons(state){
|
|
3028
3333
|
backBtn.style.display='none';
|
|
3029
3334
|
startBtn.style.display='none';
|
|
@@ -3068,11 +3373,21 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
3068
3373
|
form.generate('mf', {
|
|
3069
3374
|
addButton:false,
|
|
3070
3375
|
getMetaData:true,
|
|
3376
|
+
// La pantalla final la pinta el popup: renderSuccess de @magicfeedback/native usa
|
|
3377
|
+
// textContent, as\xED que el mensaje de la plataforma (HTML con imagen) no se ver\xEDa, y su
|
|
3378
|
+
// fallback es un literal gen\xE9rico que ignora style.successMessage.
|
|
3379
|
+
addSuccessScreen:false,
|
|
3071
3380
|
onLoadedEvent:function(args){
|
|
3072
3381
|
var s=args && args.formData ? args.formData.style : null;
|
|
3073
3382
|
if(s && !stylesInjected){
|
|
3074
3383
|
stylesInjected=true;
|
|
3075
|
-
if(s.
|
|
3384
|
+
if(s.successMessage){ successMessageHtml=s.successMessage; }
|
|
3385
|
+
// La barra de progreso la decide el host (init) y, si no se pronuncia, la plataforma.
|
|
3386
|
+
if(progressPref===null){ progressEnabled=s.showProgressBar===true; }
|
|
3387
|
+
if(s.showProgressUnit!==undefined){ progressShowUnit=s.showProgressUnit!==false; }
|
|
3388
|
+
if(s.progressUnit){ progressUnit=s.progressUnit; }
|
|
3389
|
+
if(s.loadingBarColor){ progressBar.style.background=s.loadingBarColor; progressFollowUp.style.background=s.loadingBarColor; }
|
|
3390
|
+
if(chromeOn && s.boxBackgroundColor){ popup.style.background=s.boxBackgroundColor; }
|
|
3076
3391
|
if(s.contentAlign){ main.style.justifyContent = s.contentAlign==='center' ? 'center' : 'flex-start'; }
|
|
3077
3392
|
if(s.buttonPrimaryColor){
|
|
3078
3393
|
submitBtn.style.background=s.buttonPrimaryColor; submitBtn.style.border='none'; submitBtn.style.color='#fff';
|
|
@@ -3080,7 +3395,8 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
3080
3395
|
completeBtn.style.background=s.buttonPrimaryColor; completeBtn.style.border='none'; completeBtn.style.color='#fff';
|
|
3081
3396
|
}
|
|
3082
3397
|
if(s.buttonSecondaryColor){
|
|
3083
|
-
|
|
3398
|
+
// Bot\xF3n de texto: solo ti\xF1e la etiqueta, sin recuperar fondo ni borde.
|
|
3399
|
+
backBtn.style.background='transparent'; backBtn.style.color=s.buttonSecondaryColor; backBtn.style.border='none';
|
|
3084
3400
|
}
|
|
3085
3401
|
if(s.logo && !document.getElementById('dd-logo')){
|
|
3086
3402
|
var logoImg=document.createElement('img');
|
|
@@ -3093,11 +3409,13 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
3093
3409
|
else if(s.logoPosition==='center'){ logoImg.style.margin='0 auto 20px auto'; logoImg.style.display='block'; }
|
|
3094
3410
|
main.insertBefore(logoImg, document.getElementById('dd-form-wrapper'));
|
|
3095
3411
|
}
|
|
3096
|
-
if(s.startMessage && s.startMessage!==''){ updateButtons('start'); }
|
|
3412
|
+
if(s.startMessage && s.startMessage!==''){ onStartPage=true; updateButtons('start'); }
|
|
3097
3413
|
else { updateButtons('in_progress_first'); }
|
|
3098
3414
|
} else {
|
|
3099
3415
|
updateButtons('in_progress_first');
|
|
3100
3416
|
}
|
|
3417
|
+
// El total solo se conoce una vez montado el form; sin \xE9l no hay barra que pintar.
|
|
3418
|
+
updateProgress({ progress:form.progress, total:form.total, completed:false, followup:false });
|
|
3101
3419
|
emitJSON('loaded');
|
|
3102
3420
|
setLoading(false);
|
|
3103
3421
|
},
|
|
@@ -3110,9 +3428,10 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
3110
3428
|
if(error){
|
|
3111
3429
|
setLoading(false);
|
|
3112
3430
|
if(error.toLowerCase().indexOf('no response')!==-1){
|
|
3431
|
+
// La p\xE1gina no ha cambiado: el estado de navegaci\xF3n se queda como estaba.
|
|
3113
3432
|
errorHint.textContent='Please answer the required question to continue.';
|
|
3114
3433
|
errorHint.style.display='block';
|
|
3115
|
-
|
|
3434
|
+
updateNavButtons();
|
|
3116
3435
|
return;
|
|
3117
3436
|
}
|
|
3118
3437
|
errorHint.textContent='An error occurred while submitting. Please try again or close the popup.';
|
|
@@ -3123,17 +3442,23 @@ body{display:flex;justify-content:${pos.justifyContent};align-items:${pos.alignI
|
|
|
3123
3442
|
setLoading(false);
|
|
3124
3443
|
if(p && p.completed){
|
|
3125
3444
|
surveyCompletedEmitted=true;
|
|
3445
|
+
showSuccessScreen();
|
|
3126
3446
|
updateButtons('completed');
|
|
3447
|
+
updateProgress(p);
|
|
3127
3448
|
emitJSON('survey_completed', p);
|
|
3128
3449
|
return;
|
|
3129
3450
|
}
|
|
3130
|
-
|
|
3131
|
-
|
|
3451
|
+
pageDepth++;
|
|
3452
|
+
updateNavButtons();
|
|
3453
|
+
updateProgress(p);
|
|
3132
3454
|
emitJSON('after_submit', p);
|
|
3133
3455
|
},
|
|
3134
3456
|
onBackEvent:function(p){
|
|
3135
|
-
|
|
3136
|
-
|
|
3457
|
+
// Con error ("No page found") no hubo navegaci\xF3n: la profundidad no se toca.
|
|
3458
|
+
if(!(p&&p.error)){ pageDepth=Math.max(0,pageDepth-1); }
|
|
3459
|
+
updateNavButtons();
|
|
3460
|
+
// onBackEvent no trae \`total\`: se lee del form, que es su due\xF1o.
|
|
3461
|
+
updateProgress({ progress:p&&p.progress, total:form.total, completed:false, followup:p&&p.followup });
|
|
3137
3462
|
emitJSON('back', p);
|
|
3138
3463
|
}
|
|
3139
3464
|
}).catch(function(e){ setLoading(false); emit('error:init'); });
|
|
@@ -3162,7 +3487,7 @@ var ReactNativePopupRenderer = class {
|
|
|
3162
3487
|
}
|
|
3163
3488
|
init() {
|
|
3164
3489
|
}
|
|
3165
|
-
show(surveyId, productId, actions, emit, onClose, env = "production", userId, style, sessionId, miniService, analyticsFeedbackSessionId) {
|
|
3490
|
+
show(surveyId, productId, actions, emit, onClose, env = "production", userId, style, sessionId, miniService, analyticsFeedbackSessionId, renderChrome, options) {
|
|
3166
3491
|
this.emitFn = emit;
|
|
3167
3492
|
this.onCloseFn = onClose;
|
|
3168
3493
|
this.currentSurveyId = surveyId;
|
|
@@ -3177,7 +3502,12 @@ var ReactNativePopupRenderer = class {
|
|
|
3177
3502
|
font: style?.font,
|
|
3178
3503
|
theme: style?.theme,
|
|
3179
3504
|
position: style?.position,
|
|
3180
|
-
actions
|
|
3505
|
+
actions,
|
|
3506
|
+
// renderChrome:false (init) → HTML sin tarjeta/overlay: el host lo envuelve en su Modal.
|
|
3507
|
+
chrome: renderChrome,
|
|
3508
|
+
title: options?.title,
|
|
3509
|
+
showProgressBar: options?.showProgressBar,
|
|
3510
|
+
surveyCss: options?.surveyCss
|
|
3181
3511
|
});
|
|
3182
3512
|
if (this.options.onShow) {
|
|
3183
3513
|
this.options.onShow({ surveyId, productId, html });
|
|
@@ -3217,7 +3547,6 @@ var ReactNativePopupRenderer = class {
|
|
|
3217
3547
|
break;
|
|
3218
3548
|
case "survey_completed":
|
|
3219
3549
|
this.emitFn("survey_completed", surveyId);
|
|
3220
|
-
this.onCloseFn?.();
|
|
3221
3550
|
break;
|
|
3222
3551
|
case "popup_close":
|
|
3223
3552
|
this.onCloseFn?.();
|
|
@@ -3268,14 +3597,14 @@ var BrowserPopupRenderer = class {
|
|
|
3268
3597
|
document.body.appendChild(this.container);
|
|
3269
3598
|
}
|
|
3270
3599
|
}
|
|
3271
|
-
show(surveyId, productId, actions, emit, onClose, env = "production", userId, style, sessionId, miniService, analyticsFeedbackSessionId) {
|
|
3600
|
+
show(surveyId, productId, actions, emit, onClose, env = "production", userId, style, sessionId, miniService, analyticsFeedbackSessionId, _renderChrome, options) {
|
|
3272
3601
|
if (this.visible) return;
|
|
3273
3602
|
if (!this.container || !document.body.contains(this.container)) this.init();
|
|
3274
3603
|
if (!this.container) return;
|
|
3275
3604
|
this.visible = true;
|
|
3276
3605
|
const container = this.container;
|
|
3277
3606
|
void Promise.resolve().then(() => (init_renderPopup(), renderPopup_exports)).then(({ renderPopup: renderPopup2 }) => {
|
|
3278
|
-
renderPopup2(container, surveyId, productId, actions, emit, onClose, env, userId, style, sessionId, miniService, analyticsFeedbackSessionId);
|
|
3607
|
+
renderPopup2(container, surveyId, productId, actions, emit, onClose, env, userId, style, sessionId, miniService, analyticsFeedbackSessionId, options);
|
|
3279
3608
|
});
|
|
3280
3609
|
}
|
|
3281
3610
|
hide() {
|
|
@@ -4129,6 +4458,12 @@ var DeepdotsPopups = class {
|
|
|
4129
4458
|
this.deferredExitTimers = [];
|
|
4130
4459
|
this.baseUrl = "";
|
|
4131
4460
|
this.env = "production";
|
|
4461
|
+
/** Si el SDK pinta el "modal" del popup (RN). Default true; false = el host lo envuelve. */
|
|
4462
|
+
this.renderChrome = true;
|
|
4463
|
+
/** Barra de progreso. undefined = la decide la plataforma (style.showProgressBar). */
|
|
4464
|
+
this.showProgressBar = void 0;
|
|
4465
|
+
/** CSS del host inyectado al final de los estilos del popup. */
|
|
4466
|
+
this.surveyCss = void 0;
|
|
4132
4467
|
/** Identidad + sesión (Fase 1 tracking). Null hasta init(). */
|
|
4133
4468
|
this.tracking = null;
|
|
4134
4469
|
/** Capa de analytics (canal separado del feedback). Null hasta init(). */
|
|
@@ -4179,6 +4514,9 @@ var DeepdotsPopups = class {
|
|
|
4179
4514
|
const env = resolveEnvironment(config.nodeEnv);
|
|
4180
4515
|
this.baseUrl = env.apiBaseUrl;
|
|
4181
4516
|
this.env = config.nodeEnv || "production";
|
|
4517
|
+
this.renderChrome = config.renderChrome ?? true;
|
|
4518
|
+
this.showProgressBar = config.showProgressBar;
|
|
4519
|
+
this.surveyCss = config.surveyCss;
|
|
4182
4520
|
this.config = {
|
|
4183
4521
|
apiKey: config.apiKey || void 0,
|
|
4184
4522
|
debug: config.debug || false,
|
|
@@ -4364,6 +4702,22 @@ var DeepdotsPopups = class {
|
|
|
4364
4702
|
trackFunnelStep(funnel, step, taskId, params) {
|
|
4365
4703
|
this.track("deepdots_funnel_step", { funnel, step, task_id: taskId, ...params ?? {} });
|
|
4366
4704
|
}
|
|
4705
|
+
/**
|
|
4706
|
+
* Product Effectiveness: una interacción significativa del usuario (`interaction_type` es la
|
|
4707
|
+
* dimensión de agrupación, p. ej. `get_help`, `homepage`, `contact_support`).
|
|
4708
|
+
*
|
|
4709
|
+
* Existe como evento RESERVADO para que la convención no la invente cada host: un `track()`
|
|
4710
|
+
* custom acaba como `deepdots_event_…` y no lo cuenta la analítica de effectiveness.
|
|
4711
|
+
* Un `interactionType` vacío se descarta con warning (no aporta dato agrupable).
|
|
4712
|
+
*/
|
|
4713
|
+
trackMeaningfulInteraction(interactionType, params) {
|
|
4714
|
+
const type = typeof interactionType === "string" ? interactionType.trim() : "";
|
|
4715
|
+
if (!type) {
|
|
4716
|
+
console.warn("[DeepdotsPopups] trackMeaningfulInteraction discarded: empty interaction_type");
|
|
4717
|
+
return;
|
|
4718
|
+
}
|
|
4719
|
+
this.track("deepdots_meaningful_interaction", { interaction_type: type, ...params ?? {} });
|
|
4720
|
+
}
|
|
4367
4721
|
/**
|
|
4368
4722
|
* Messaging (#18–22): registra una etapa del funnel de una notificación (push/in-app).
|
|
4369
4723
|
* No-op si tracking off. El evento se descarta (con warning) si el `channel` no es válido,
|
|
@@ -4608,7 +4962,7 @@ var DeepdotsPopups = class {
|
|
|
4608
4962
|
this.log("Showing popup (definition)", def);
|
|
4609
4963
|
this.surveyToPopupId.set(def.surveyId, def.id);
|
|
4610
4964
|
this.lastShown.set(def.id, Date.now());
|
|
4611
|
-
this.renderPopup(def.surveyId, def.productId, def.actions, def.style);
|
|
4965
|
+
this.renderPopup(def.surveyId, def.productId, def.actions, def.style, def.title);
|
|
4612
4966
|
this.emitEvent("popup_shown", def.surveyId, { popupId: def.id });
|
|
4613
4967
|
}
|
|
4614
4968
|
shouldShow(def, pathUrl, skipPathCheck = false) {
|
|
@@ -4946,7 +5300,7 @@ var DeepdotsPopups = class {
|
|
|
4946
5300
|
document.body.appendChild(this.popupContainer);
|
|
4947
5301
|
}
|
|
4948
5302
|
/** Render the popup UI */
|
|
4949
|
-
renderPopup(surveyId, productId, actions, style) {
|
|
5303
|
+
renderPopup(surveyId, productId, actions, style, title) {
|
|
4950
5304
|
const userId = this.tracking?.getUserId() ?? this.config?.userId;
|
|
4951
5305
|
const sessionId = this.tracking?.getSessionId() ?? void 0;
|
|
4952
5306
|
const miniService = this.analytics?.getMiniService() ?? void 0;
|
|
@@ -4964,7 +5318,9 @@ var DeepdotsPopups = class {
|
|
|
4964
5318
|
style,
|
|
4965
5319
|
sessionId,
|
|
4966
5320
|
miniService,
|
|
4967
|
-
analyticsFeedbackSessionId
|
|
5321
|
+
analyticsFeedbackSessionId,
|
|
5322
|
+
this.renderChrome,
|
|
5323
|
+
{ title, showProgressBar: this.showProgressBar, surveyCss: this.surveyCss }
|
|
4968
5324
|
);
|
|
4969
5325
|
return;
|
|
4970
5326
|
}
|
|
@@ -4983,7 +5339,8 @@ var DeepdotsPopups = class {
|
|
|
4983
5339
|
style,
|
|
4984
5340
|
sessionId,
|
|
4985
5341
|
miniService,
|
|
4986
|
-
analyticsFeedbackSessionId
|
|
5342
|
+
analyticsFeedbackSessionId,
|
|
5343
|
+
{ title, showProgressBar: this.showProgressBar, surveyCss: this.surveyCss }
|
|
4987
5344
|
);
|
|
4988
5345
|
});
|
|
4989
5346
|
}
|