@zoho_apptics/apptics-js-sdk 1.0.2 → 2.0.0-beta.1

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.
Files changed (243) hide show
  1. package/CHANGELOG.md +193 -0
  2. package/LICENSE +13 -0
  3. package/README.md +846 -11
  4. package/dist/apptics.esm.min.js +3 -0
  5. package/dist/apptics.esm.min.js.map +1 -0
  6. package/dist/apptics.min.js +3 -0
  7. package/dist/apptics.min.js.map +1 -0
  8. package/dist/chunks/lifecycle-VYr43KcB.min.js +3 -0
  9. package/dist/chunks/lifecycle-VYr43KcB.min.js.map +1 -0
  10. package/dist/cjs/auto-init.d.ts +8 -0
  11. package/dist/cjs/auto-init.js +32 -0
  12. package/dist/cjs/core/attempts.d.ts +28 -0
  13. package/dist/cjs/core/attempts.js +113 -0
  14. package/dist/cjs/core/batch.d.ts +32 -0
  15. package/dist/cjs/core/batch.js +116 -0
  16. package/dist/cjs/core/callsite.d.ts +34 -0
  17. package/dist/cjs/core/callsite.js +115 -0
  18. package/dist/cjs/core/consent.d.ts +27 -0
  19. package/dist/cjs/core/consent.js +132 -0
  20. package/dist/cjs/core/constants.d.ts +237 -0
  21. package/dist/cjs/core/constants.js +315 -0
  22. package/dist/cjs/core/db.d.ts +48 -0
  23. package/dist/cjs/core/db.js +467 -0
  24. package/dist/cjs/core/debug.d.ts +22 -0
  25. package/dist/cjs/core/debug.js +88 -0
  26. package/dist/cjs/core/env.d.ts +28 -0
  27. package/dist/cjs/core/env.js +267 -0
  28. package/dist/cjs/core/framework-id.d.ts +1 -0
  29. package/dist/cjs/core/framework-id.js +9 -0
  30. package/dist/cjs/core/guard.d.ts +11 -0
  31. package/dist/cjs/core/guard.js +86 -0
  32. package/dist/cjs/core/hooks.d.ts +39 -0
  33. package/dist/cjs/core/hooks.js +22 -0
  34. package/dist/cjs/core/locks.d.ts +9 -0
  35. package/dist/cjs/core/locks.js +22 -0
  36. package/dist/cjs/core/logger.d.ts +15 -0
  37. package/dist/cjs/core/logger.js +50 -0
  38. package/dist/cjs/core/state.d.ts +70 -0
  39. package/dist/cjs/core/state.js +78 -0
  40. package/dist/cjs/core/storage.d.ts +61 -0
  41. package/dist/cjs/core/storage.js +327 -0
  42. package/dist/cjs/core/stylesheet.d.ts +8 -0
  43. package/dist/cjs/core/stylesheet.js +29 -0
  44. package/dist/cjs/core/transport.d.ts +85 -0
  45. package/dist/cjs/core/transport.js +456 -0
  46. package/dist/cjs/core/utils.d.ts +26 -0
  47. package/dist/cjs/core/utils.js +175 -0
  48. package/dist/cjs/core/validate.d.ts +18 -0
  49. package/dist/cjs/core/validate.js +233 -0
  50. package/dist/cjs/device/appversion.d.ts +15 -0
  51. package/dist/cjs/device/appversion.js +170 -0
  52. package/dist/cjs/device/index.d.ts +34 -0
  53. package/dist/cjs/device/index.js +472 -0
  54. package/dist/cjs/engagement/api-rules.d.ts +49 -0
  55. package/dist/cjs/engagement/api-rules.js +206 -0
  56. package/dist/cjs/engagement/auto-api.d.ts +7 -0
  57. package/dist/cjs/engagement/auto-api.js +200 -0
  58. package/dist/cjs/engagement/auto-screen.d.ts +18 -0
  59. package/dist/cjs/engagement/auto-screen.js +305 -0
  60. package/dist/cjs/engagement/defined-events.d.ts +23 -0
  61. package/dist/cjs/engagement/defined-events.js +58 -0
  62. package/dist/cjs/engagement/send.d.ts +6 -0
  63. package/dist/cjs/engagement/send.js +104 -0
  64. package/dist/cjs/engagement/session.d.ts +51 -0
  65. package/dist/cjs/engagement/session.js +463 -0
  66. package/dist/cjs/engagement/track.d.ts +56 -0
  67. package/dist/cjs/engagement/track.js +375 -0
  68. package/dist/cjs/errors/send.d.ts +6 -0
  69. package/dist/cjs/errors/send.js +73 -0
  70. package/dist/cjs/errors/track.d.ts +4 -0
  71. package/dist/cjs/errors/track.js +167 -0
  72. package/dist/cjs/feedback/controls.d.ts +37 -0
  73. package/dist/cjs/feedback/controls.js +316 -0
  74. package/dist/cjs/feedback/index.d.ts +9 -0
  75. package/dist/cjs/feedback/index.js +56 -0
  76. package/dist/cjs/feedback/logs.d.ts +45 -0
  77. package/dist/cjs/feedback/logs.js +241 -0
  78. package/dist/cjs/feedback/quartz.d.ts +18 -0
  79. package/dist/cjs/feedback/quartz.js +105 -0
  80. package/dist/cjs/feedback/send.d.ts +28 -0
  81. package/dist/cjs/feedback/send.js +203 -0
  82. package/dist/cjs/feedback/styles.d.ts +10 -0
  83. package/dist/cjs/feedback/styles.js +8 -0
  84. package/dist/cjs/feedback/template.d.ts +2 -0
  85. package/dist/cjs/feedback/template.js +162 -0
  86. package/dist/cjs/feedback/ui.d.ts +63 -0
  87. package/dist/cjs/feedback/ui.js +709 -0
  88. package/dist/cjs/heatmap/send.d.ts +13 -0
  89. package/dist/cjs/heatmap/send.js +82 -0
  90. package/dist/cjs/heatmap/track.d.ts +4 -0
  91. package/dist/cjs/heatmap/track.js +448 -0
  92. package/dist/cjs/index.d.ts +22 -0
  93. package/dist/cjs/index.js +162 -0
  94. package/dist/cjs/lifecycle.d.ts +21 -0
  95. package/dist/cjs/lifecycle.js +734 -0
  96. package/dist/cjs/package.json +3 -0
  97. package/dist/cjs/remoteconfig/country.d.ts +4 -0
  98. package/dist/cjs/remoteconfig/country.js +73 -0
  99. package/dist/cjs/remoteconfig/custom.d.ts +10 -0
  100. package/dist/cjs/remoteconfig/custom.js +58 -0
  101. package/dist/cjs/remoteconfig/evaluate.d.ts +24 -0
  102. package/dist/cjs/remoteconfig/evaluate.js +184 -0
  103. package/dist/cjs/remoteconfig/fetch.d.ts +24 -0
  104. package/dist/cjs/remoteconfig/fetch.js +200 -0
  105. package/dist/cjs/remoteconfig/index.d.ts +15 -0
  106. package/dist/cjs/remoteconfig/index.js +116 -0
  107. package/dist/cjs/remoteconfig/store.d.ts +18 -0
  108. package/dist/cjs/remoteconfig/store.js +98 -0
  109. package/dist/cjs/remoteconfig/tz-countries.d.ts +8 -0
  110. package/dist/cjs/remoteconfig/tz-countries.js +13 -0
  111. package/dist/cjs/remotelog/gate.d.ts +2 -0
  112. package/dist/cjs/remotelog/gate.js +28 -0
  113. package/dist/cjs/remotelog/index.d.ts +8 -0
  114. package/dist/cjs/remotelog/logger.d.ts +22 -0
  115. package/dist/cjs/remotelog/logger.js +111 -0
  116. package/dist/cjs/remotelog/send.d.ts +13 -0
  117. package/dist/cjs/remotelog/send.js +153 -0
  118. package/dist/cjs/remotelogger/index.d.ts +12 -0
  119. package/dist/cjs/remotelogger/index.js +18 -0
  120. package/dist/cjs/scheduler.d.ts +8 -0
  121. package/dist/cjs/scheduler.js +78 -0
  122. package/dist/cjs/types.d.ts +385 -0
  123. package/dist/cjs/user/index.d.ts +33 -0
  124. package/dist/cjs/user/index.js +183 -0
  125. package/dist/esm/auto-init.d.ts +8 -0
  126. package/dist/esm/auto-init.js +29 -0
  127. package/dist/esm/core/attempts.d.ts +28 -0
  128. package/dist/esm/core/attempts.js +106 -0
  129. package/dist/esm/core/batch.d.ts +32 -0
  130. package/dist/esm/core/batch.js +109 -0
  131. package/dist/esm/core/callsite.d.ts +34 -0
  132. package/dist/esm/core/callsite.js +110 -0
  133. package/dist/esm/core/consent.d.ts +27 -0
  134. package/dist/esm/core/consent.js +122 -0
  135. package/dist/esm/core/constants.d.ts +237 -0
  136. package/dist/esm/core/constants.js +292 -0
  137. package/dist/esm/core/db.d.ts +48 -0
  138. package/dist/esm/core/db.js +453 -0
  139. package/dist/esm/core/debug.d.ts +22 -0
  140. package/dist/esm/core/debug.js +81 -0
  141. package/dist/esm/core/env.d.ts +28 -0
  142. package/dist/esm/core/env.js +251 -0
  143. package/dist/esm/core/framework-id.d.ts +1 -0
  144. package/dist/esm/core/framework-id.js +7 -0
  145. package/dist/esm/core/guard.d.ts +11 -0
  146. package/dist/esm/core/guard.js +83 -0
  147. package/dist/esm/core/hooks.d.ts +39 -0
  148. package/dist/esm/core/hooks.js +20 -0
  149. package/dist/esm/core/locks.d.ts +9 -0
  150. package/dist/esm/core/locks.js +20 -0
  151. package/dist/esm/core/logger.d.ts +15 -0
  152. package/dist/esm/core/logger.js +46 -0
  153. package/dist/esm/core/state.d.ts +70 -0
  154. package/dist/esm/core/state.js +73 -0
  155. package/dist/esm/core/storage.d.ts +61 -0
  156. package/dist/esm/core/storage.js +314 -0
  157. package/dist/esm/core/stylesheet.d.ts +8 -0
  158. package/dist/esm/core/stylesheet.js +27 -0
  159. package/dist/esm/core/transport.d.ts +85 -0
  160. package/dist/esm/core/transport.js +439 -0
  161. package/dist/esm/core/utils.d.ts +26 -0
  162. package/dist/esm/core/utils.js +161 -0
  163. package/dist/esm/core/validate.d.ts +18 -0
  164. package/dist/esm/core/validate.js +226 -0
  165. package/dist/esm/device/appversion.d.ts +15 -0
  166. package/dist/esm/device/appversion.js +164 -0
  167. package/dist/esm/device/index.d.ts +34 -0
  168. package/dist/esm/device/index.js +461 -0
  169. package/dist/esm/engagement/api-rules.d.ts +49 -0
  170. package/dist/esm/engagement/api-rules.js +199 -0
  171. package/dist/esm/engagement/auto-api.d.ts +7 -0
  172. package/dist/esm/engagement/auto-api.js +198 -0
  173. package/dist/esm/engagement/auto-screen.d.ts +18 -0
  174. package/dist/esm/engagement/auto-screen.js +301 -0
  175. package/dist/esm/engagement/defined-events.d.ts +23 -0
  176. package/dist/esm/engagement/defined-events.js +55 -0
  177. package/dist/esm/engagement/send.d.ts +6 -0
  178. package/dist/esm/engagement/send.js +101 -0
  179. package/dist/esm/engagement/session.d.ts +51 -0
  180. package/dist/esm/engagement/session.js +448 -0
  181. package/dist/esm/engagement/track.d.ts +56 -0
  182. package/dist/esm/engagement/track.js +365 -0
  183. package/dist/esm/errors/send.d.ts +6 -0
  184. package/dist/esm/errors/send.js +70 -0
  185. package/dist/esm/errors/track.d.ts +4 -0
  186. package/dist/esm/errors/track.js +163 -0
  187. package/dist/esm/feedback/controls.d.ts +37 -0
  188. package/dist/esm/feedback/controls.js +309 -0
  189. package/dist/esm/feedback/index.d.ts +9 -0
  190. package/dist/esm/feedback/index.js +51 -0
  191. package/dist/esm/feedback/logs.d.ts +45 -0
  192. package/dist/esm/feedback/logs.js +227 -0
  193. package/dist/esm/feedback/quartz.d.ts +18 -0
  194. package/dist/esm/feedback/quartz.js +99 -0
  195. package/dist/esm/feedback/send.d.ts +28 -0
  196. package/dist/esm/feedback/send.js +198 -0
  197. package/dist/esm/feedback/styles.d.ts +10 -0
  198. package/dist/esm/feedback/styles.js +4 -0
  199. package/dist/esm/feedback/template.d.ts +2 -0
  200. package/dist/esm/feedback/template.js +159 -0
  201. package/dist/esm/feedback/ui.d.ts +63 -0
  202. package/dist/esm/feedback/ui.js +703 -0
  203. package/dist/esm/heatmap/send.d.ts +13 -0
  204. package/dist/esm/heatmap/send.js +79 -0
  205. package/dist/esm/heatmap/track.d.ts +4 -0
  206. package/dist/esm/heatmap/track.js +445 -0
  207. package/dist/esm/index.d.ts +22 -0
  208. package/dist/esm/index.js +150 -0
  209. package/dist/esm/lifecycle.d.ts +21 -0
  210. package/dist/esm/lifecycle.js +729 -0
  211. package/dist/esm/package.json +3 -0
  212. package/dist/esm/remoteconfig/country.d.ts +4 -0
  213. package/dist/esm/remoteconfig/country.js +70 -0
  214. package/dist/esm/remoteconfig/custom.d.ts +10 -0
  215. package/dist/esm/remoteconfig/custom.js +54 -0
  216. package/dist/esm/remoteconfig/evaluate.d.ts +24 -0
  217. package/dist/esm/remoteconfig/evaluate.js +179 -0
  218. package/dist/esm/remoteconfig/fetch.d.ts +24 -0
  219. package/dist/esm/remoteconfig/fetch.js +196 -0
  220. package/dist/esm/remoteconfig/index.d.ts +15 -0
  221. package/dist/esm/remoteconfig/index.js +111 -0
  222. package/dist/esm/remoteconfig/store.d.ts +18 -0
  223. package/dist/esm/remoteconfig/store.js +91 -0
  224. package/dist/esm/remoteconfig/tz-countries.d.ts +8 -0
  225. package/dist/esm/remoteconfig/tz-countries.js +11 -0
  226. package/dist/esm/remotelog/gate.d.ts +2 -0
  227. package/dist/esm/remotelog/gate.js +26 -0
  228. package/dist/esm/remotelog/index.d.ts +8 -0
  229. package/dist/esm/remotelog/logger.d.ts +22 -0
  230. package/dist/esm/remotelog/logger.js +108 -0
  231. package/dist/esm/remotelog/send.d.ts +13 -0
  232. package/dist/esm/remotelog/send.js +149 -0
  233. package/dist/esm/remotelogger/index.d.ts +12 -0
  234. package/dist/esm/remotelogger/index.js +13 -0
  235. package/dist/esm/scheduler.d.ts +8 -0
  236. package/dist/esm/scheduler.js +74 -0
  237. package/dist/esm/types.d.ts +385 -0
  238. package/dist/esm/user/index.d.ts +33 -0
  239. package/dist/esm/user/index.js +176 -0
  240. package/dist/feedback.esm.min.js +3 -0
  241. package/dist/feedback.esm.min.js.map +1 -0
  242. package/package.json +122 -7
  243. package/src/appticssdk.js +0 -1
@@ -0,0 +1,99 @@
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.1 | (c) Zoho Corporation Private Limited | see LICENSE */
2
+ import { warnAlways, Console } from '../core/logger.js';
3
+
4
+ /**
5
+ * Screen recording's script: Zoho Quartz, loaded by the SDK from the url getsdkconfig gives
6
+ * (`quartz.quartz_cdn_url`), so a page no longer adds it itself.
7
+ *
8
+ * It is a script run on the app's page, from a url the server sent. So only https urls on Zoho's
9
+ * own hosts are loaded: an answer that was wrong, or was tampered with on the way, cannot make
10
+ * the page run a script from anywhere else. Anything else is refused and said once.
11
+ */
12
+ /** Zoho's script hosts: its CDNs and its data centres, local ones included. */
13
+ const ZOHO_SCRIPT_HOST = /(^|\.)(zohocdn\.com|zohostatic\.com|localzohocdn\.com|localzoho\.com|zoho\.(com|eu|in|jp|sa|ae|com\.au|com\.cn)|zohocloud\.ca)$/; // no i18n
14
+ /** quartz_domain as a recording host: zoho.com → https://quartz.zoho.com. '' when it isn't a domain. */
15
+ function recordingDomain(domain) {
16
+ var name = (domain || '').trim().replace(/^\.+|\.+$/g, ''); // no i18n
17
+ if (/^https:\/\//i.test(name)) { // no i18n
18
+ return name.replace(/\/+$/, ''); // no i18n
19
+ }
20
+ return /^[a-z0-9-]+(\.[a-z0-9-]+)+$/i.test(name) ? 'https://quartz.' + name : ''; // no i18n
21
+ }
22
+ /** Where Quartz lives on Zoho's CDNs, the same on both: only the host differs. */
23
+ const QUARTZ_SCRIPT_PATH = '/quartz/feedback/v2/quartz.js'; // no i18n
24
+ /**
25
+ * The Quartz script for an app whose getsdkconfig answer carries no quartz_cdn_url, chosen by
26
+ * the serviceUrl: a localzoho server's apps load it from Zoho's local CDN, every other app from
27
+ * the public one.
28
+ */
29
+ function defaultQuartzScriptUrl(serviceUrl) {
30
+ var host = ''; // no i18n
31
+ try {
32
+ host = new URL(serviceUrl).hostname;
33
+ }
34
+ catch (err) {
35
+ host = serviceUrl || ''; // no i18n
36
+ }
37
+ var cdn = host.indexOf('localzoho') !== -1 ? 'static.localzohocdn.com' : 'static.zohocdn.com'; // no i18n
38
+ return 'https://' + cdn + QUARTZ_SCRIPT_PATH; // no i18n
39
+ }
40
+ /** The script to load: quartz_cdn_url when getsdkconfig gave one, else the CDN the serviceUrl points to. */
41
+ function quartzScriptSource(cdnUrl, serviceUrl) {
42
+ return cdnUrl && cdnUrl.trim() !== '' ? cdnUrl.trim() : defaultQuartzScriptUrl(serviceUrl); // no i18n
43
+ }
44
+ /** The url to load, or '' when it isn't an https url on a Zoho host. */
45
+ function quartzScriptUrl(url) {
46
+ try {
47
+ var parsed = new URL(url);
48
+ return parsed.protocol === 'https:' && ZOHO_SCRIPT_HOST.test(parsed.hostname) ? parsed.href : ''; // no i18n
49
+ }
50
+ catch (err) {
51
+ return ''; // no i18n
52
+ }
53
+ }
54
+ function quartzOnPage() {
55
+ return typeof Quartz !== 'undefined' && !!Quartz; // no i18n
56
+ }
57
+ var loading = null;
58
+ var refused = false;
59
+ /**
60
+ * Makes Quartz available: resolves true once it is on the page, false when it can't be (no url,
61
+ * a url that isn't allowed, or a script that failed to load). Adds the script once; every caller
62
+ * waits on the same load, and a failed one may be tried again on the next open.
63
+ */
64
+ function loadQuartz(url) {
65
+ if (quartzOnPage()) {
66
+ return Promise.resolve(true);
67
+ }
68
+ var src = quartzScriptUrl(url);
69
+ if (src === '') {
70
+ if (url && !refused) {
71
+ refused = true;
72
+ warnAlways('AppticsFeedback: screen recording is off; its script url is not an https url on a Zoho host: ' + url); // no i18n
73
+ }
74
+ return Promise.resolve(false);
75
+ }
76
+ if (loading) {
77
+ return loading;
78
+ }
79
+ loading = new Promise(function (resolve) {
80
+ var script = document.createElement('script'); // no i18n
81
+ script.src = src;
82
+ script.async = true;
83
+ script.setAttribute('data-apptics', 'quartz'); // no i18n
84
+ script.onload = function () {
85
+ Console.log('AppticsFeedback: Quartz loaded from ' + src); // no i18n
86
+ resolve(quartzOnPage());
87
+ };
88
+ script.onerror = function () {
89
+ Console.warn('AppticsFeedback: the Quartz script did not load: ' + src); // no i18n
90
+ loading = null;
91
+ script.remove();
92
+ resolve(false);
93
+ };
94
+ (document.head || document.documentElement).appendChild(script);
95
+ });
96
+ return loading;
97
+ }
98
+
99
+ export { defaultQuartzScriptUrl, loadQuartz, quartzScriptSource, quartzScriptUrl, recordingDomain };
@@ -0,0 +1,28 @@
1
+ import type { FeedbackType, ServerResult } from '../types.js';
2
+ export interface FeedbackRequest {
3
+ type: FeedbackType;
4
+ message: string;
5
+ attachment?: FileList | File[] | null;
6
+ logsFiles?: FileList | File[] | null;
7
+ /** Stored addFeedbackLog() lines: true or unset sends them when there are any, false never does. */
8
+ includeLog?: boolean;
9
+ /**
10
+ * dyninfo.txt, holding addDiagnosticsInfo() entries and the device info dump.
11
+ * True always sends it, false never does, unset sends it when diagnostics are waiting.
12
+ */
13
+ includeDyninfo?: boolean;
14
+ quartzid: string;
15
+ }
16
+ export interface FeedbackResult {
17
+ ok: boolean;
18
+ message: string;
19
+ }
20
+ /**
21
+ * Sends feedback to the Apptics API.
22
+ * Resolves with the outcome, or null when nothing was sent (disabled client or offline).
23
+ */
24
+ /** The form's limits on attachments: at most 5, at most 10 MB in all. */
25
+ export declare const MAX_ATTACHMENTS = 5;
26
+ export declare const MAX_ATTACHMENT_BYTES: number;
27
+ export declare function sendFeedbackData(obj: FeedbackRequest): Promise<FeedbackResult | null>;
28
+ export declare function requestToSendFeedback(_payload: FormData): Promise<ServerResult>;
@@ -0,0 +1,198 @@
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.1 | (c) Zoho Corporation Private Limited | see LICENSE */
2
+ import { _ZAP } from '../core/state.js';
3
+ import { Console } from '../core/logger.js';
4
+ import { isEmpty, nowMs, cloneMapExcludingKeys, sizeof } from '../core/utils.js';
5
+ import { is_apptics_disabled, getBatteryPercent, getConnectionType, getOrientation, getNetworkStatus } from '../core/env.js';
6
+ import { getMetaObj, rejectIfDisabled, rejectIfNoDeviceIds, postToApptics, apiHeaders } from '../core/transport.js';
7
+ import { hasDiagnostics, toLogFile, toDyninfoFile, feedbacklog_transactions_remove } from './logs.js';
8
+
9
+ const SUCCESS_MESSAGE = 'Feedback sent successfully'; // no i18n
10
+ const FAILURE_MESSAGE = 'Something went wrong. Send feedback again'; // no i18n
11
+ /**
12
+ * Ids left out of dyninfo.txt.
13
+ *
14
+ * The file is read by a person looking at a report, and every one of these is a server-side id
15
+ * that the server already has from the request's own params and meta. Repeating them buries the
16
+ * four lines that actually describe the device - browser, OS, screen, timezone - in bookkeeping.
17
+ */
18
+ const DYNINFO_EXCLUDED_KEYS = ['deviceid', 'anonymousid', 'aaid', 'apid', 'mapid', 'devicetypeid', 'osversionid', 'platformid', 'appversionid', 'appreleaseversionid', 'modelid', 'timezoneid', 'frameworkid', 'projectid', 'portalid', 'donottrackenabled', 'uuid', 'hadsession']; // no i18n
19
+ /**
20
+ * Sends feedback to the Apptics API.
21
+ * Resolves with the outcome, or null when nothing was sent (disabled client or offline).
22
+ */
23
+ /** The form's limits on attachments: at most 5, at most 10 MB in all. */
24
+ const MAX_ATTACHMENTS = 5;
25
+ const MAX_ATTACHMENT_BYTES = 10 * 1024 * 1024;
26
+ /** Why these attachments cannot be sent, as the form says it, or '' when they can. */
27
+ function attachmentProblem(files) {
28
+ if (!files || files.length === 0) {
29
+ return ''; // no i18n
30
+ }
31
+ if (files.length > MAX_ATTACHMENTS) {
32
+ return 'Maximum ' + MAX_ATTACHMENTS + ' attachments is allowed'; // no i18n
33
+ }
34
+ var total = 0;
35
+ for (var i = 0; i < files.length; i++) {
36
+ total += Number(files[i].size) || 0;
37
+ }
38
+ return total > MAX_ATTACHMENT_BYTES ? 'Maximum limit reached. The total file size cannot exceed 10MB.' : ''; // no i18n
39
+ }
40
+ function sendFeedbackData(obj) {
41
+ if (is_apptics_disabled()) {
42
+ return Promise.resolve(null);
43
+ }
44
+ if (navigator.onLine == false) {
45
+ Console.warn('sendFeedbackData: No Network'); // no i18n
46
+ return Promise.resolve(null);
47
+ }
48
+ var _attachment = !isEmpty(obj.attachment) ? obj.attachment : null;
49
+ var _attachment_count = _attachment ? _attachment.length : 0;
50
+ // the form's own limits, for sendFeedback() too: past them the files were left out while
51
+ // attachmentcount still said they were there
52
+ var tooMany = attachmentProblem(_attachment);
53
+ if (tooMany !== '') { // no i18n
54
+ return Promise.reject(new Error('sendFeedback: ' + tooMany)); // no i18n
55
+ }
56
+ var _logsFiles = obj && obj.logsFiles ? obj.logsFiles : null;
57
+ var _logsFiles_count = _logsFiles && _logsFiles.length ? _logsFiles.length : 0;
58
+ var time = nowMs();
59
+ // the stored files come first: logfilecount has to count the one we render ourselves.
60
+ // the battery reading is asked for alongside them rather than after, so the extra promise
61
+ // costs nothing - both are waited on once
62
+ return Promise.all([collectStoredFiles(obj), getBatteryPercent()]).then(function ([stored, battery]) {
63
+ var sendformdata = new FormData();
64
+ var feedinfoObj = {
65
+ networkstatus: getNetworkStatus(),
66
+ orientation: getOrientation(),
67
+ edge: getConnectionType(),
68
+ screenname: _ZAP._current_screen.screen || '', // no i18n
69
+ sessionstarttime: _ZAP._current_session.starttime || time,
70
+ report: obj.message,
71
+ type: obj.type,
72
+ source: 0,
73
+ attachmentcount: _attachment_count || 0,
74
+ logfilecount: _logsFiles_count + (stored.logFile ? 1 : 0),
75
+ happendat: time,
76
+ };
77
+ // quartzid, tag and ram are optional, and each is checked against a regex that cannot
78
+ // match an empty string - quartzid and tag against safe_string, ram against ram_rom
79
+ // ('512 MB'). Sending '' is not "leaving it out", it is a value that fails validation,
80
+ // and one refused key loses the whole submission. ram has no browser source at all, so
81
+ // it is never sent; the other two go only when there is something to send.
82
+ if (!isEmpty(obj.quartzid)) {
83
+ feedinfoObj.quartzid = obj.quartzid; // no i18n
84
+ }
85
+ // battery is optional and typed int: sent only where the browser answered, since a
86
+ // missing reading and a flat battery are not the same thing
87
+ if (battery !== null) {
88
+ feedinfoObj.battery = battery; // no i18n
89
+ }
90
+ sendformdata.append('feedinfo', JSON.stringify({ feedinfo: feedinfoObj, meta: getMetaObj() })); // no i18n
91
+ var ready = Promise.resolve();
92
+ if (_attachment && _attachment_count > 0 && _attachment_count <= 5) {
93
+ ready = readAttachments(_attachment).then(function (files) {
94
+ files.forEach(function (file) {
95
+ sendformdata.append('attachment', file); // no i18n
96
+ });
97
+ });
98
+ }
99
+ return ready.then(function () {
100
+ appendLogsAndDyninfo(sendformdata, _logsFiles, stored);
101
+ return readyToSendFeedback(sendformdata, stored.ids);
102
+ });
103
+ }).catch(function (err) {
104
+ Console.error('sendFeedbackData: ' + err); // no i18n
105
+ return { ok: false, message: FAILURE_MESSAGE };
106
+ });
107
+ }
108
+ function readAttachments(fileList) {
109
+ var reads = [];
110
+ for (let i = 0; i < fileList.length; i++) {
111
+ const file = fileList[i];
112
+ reads.push(new Promise(function (resolve, reject) {
113
+ const reader = new FileReader();
114
+ reader.onload = function (event) {
115
+ const fileContent = event.target.result;
116
+ resolve(new File([fileContent], 'image_' + (i + 1), { type: file.type })); // no i18n
117
+ };
118
+ reader.onerror = function () {
119
+ reject(reader.error);
120
+ };
121
+ reader.readAsArrayBuffer(file);
122
+ }));
123
+ }
124
+ return Promise.all(reads);
125
+ }
126
+ /** The device info dump that goes in dyninfo.txt, or null when it can't be serialised. */
127
+ function deviceInfoText() {
128
+ try {
129
+ return JSON.stringify(cloneMapExcludingKeys(_ZAP._device_info, DYNINFO_EXCLUDED_KEYS) || {}, null, 2);
130
+ }
131
+ catch (e) {
132
+ Console.error('Failed to prepare dyninfo file', e); // no i18n
133
+ return null;
134
+ }
135
+ }
136
+ /** Renders whatever addFeedbackLog() and addDiagnosticsInfo() left behind, honouring the flags. */
137
+ function collectStoredFiles(obj) {
138
+ var wantLog = obj.includeLog !== false;
139
+ var dyninfo = obj.includeDyninfo;
140
+ var wantDyninfo = dyninfo === true ? Promise.resolve(true)
141
+ : dyninfo === false ? Promise.resolve(false)
142
+ : hasDiagnostics(); // unset: send it only because there is something to say
143
+ return Promise.all([
144
+ wantLog ? toLogFile() : Promise.resolve(null),
145
+ wantDyninfo.then(function (wanted) {
146
+ return wanted ? toDyninfoFile(deviceInfoText()) : null;
147
+ }),
148
+ ]).then(function ([log, dyn]) {
149
+ return {
150
+ logFile: log ? log.file : null,
151
+ dyninfoFile: dyn ? dyn.file : null,
152
+ ids: (log ? log.ids : []).concat(dyn ? dyn.ids : []),
153
+ };
154
+ });
155
+ }
156
+ function appendLogsAndDyninfo(sendformdata, _logsFiles, stored) {
157
+ // logfile(s): console log text file(s) the caller passed in
158
+ if (_logsFiles && _logsFiles.length > 0) {
159
+ for (let i = 0; i < _logsFiles.length; i++) {
160
+ sendformdata.append('logfile', _logsFiles[i]); // no i18n
161
+ }
162
+ }
163
+ // logfile: the addFeedbackLog() lines, as feedbacklog.txt
164
+ if (stored.logFile) {
165
+ sendformdata.append('logfile', stored.logFile); // no i18n
166
+ }
167
+ // dyninfo: addDiagnosticsInfo() entries plus the device info dump
168
+ if (stored.dyninfoFile) {
169
+ sendformdata.append('dyninfo', stored.dyninfoFile); // no i18n
170
+ }
171
+ }
172
+ function readyToSendFeedback(data, sentIds) {
173
+ // requestToSendFeedback only resolves on success (postToApptics rejects anything else)
174
+ return requestToSendFeedback(data).then(function () {
175
+ _ZAP._sending = false;
176
+ // only now, so entries added while this was in flight stay for the next submission
177
+ if (sentIds.length > 0) {
178
+ feedbacklog_transactions_remove(sentIds);
179
+ }
180
+ return { ok: true, message: SUCCESS_MESSAGE };
181
+ }).catch(function (err) {
182
+ _ZAP._sending = false;
183
+ Console.log('sendFeedbackData:' + err); // no i18n
184
+ return { ok: false, message: FAILURE_MESSAGE };
185
+ });
186
+ }
187
+ // Function to send feedback data to server
188
+ function requestToSendFeedback(_payload) {
189
+ var label = 'requestToFeedback'; // no i18n
190
+ var blocked = rejectIfDisabled(label) || rejectIfNoDeviceIds(label);
191
+ if (blocked) {
192
+ return blocked;
193
+ }
194
+ Console.log(label + ': Feedback Payload size : ' + (sizeof(_payload) / 1024)); // no i18n
195
+ return postToApptics('feedback', _payload, apiHeaders(), label); // no i18n
196
+ }
197
+
198
+ export { MAX_ATTACHMENTS, MAX_ATTACHMENT_BYTES, requestToSendFeedback, sendFeedbackData };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The feedback form's stylesheet, which AppticsFeedback.feedbackFormOpen() adds to the page itself,
3
+ * so no app imports or links a stylesheet.
4
+ *
5
+ * Empty here: the build (scripts/feedback-css.mjs) replaces this module with the minified text of
6
+ * src/styles/apptics.css, for the npm and the CDN builds alike. Run from source, as the tests do,
7
+ * there is nothing to add.
8
+ */
9
+ declare const css: string;
10
+ export default css;
@@ -0,0 +1,4 @@
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.1 | (c) Zoho Corporation Private Limited | see LICENSE */
2
+ const css = ".zasdk-modal{color:var(--zasdk-text-color);margin:0;padding:0;font-family:inherit;line-height:normal}.zasdk-modal p{margin:0}.zasdk-modal ul{margin:0;padding:0;list-style:none}.zasdk-modal,.zasdk-timer-container{--zasdk-background-color:#fff;--zasdk-text-color:#333;--zasdk-border-color:#ddd;--zasdk-modal-background:#0006;--zasdk-close-color:#aaa;--zasdk-close-hover-color:#000;--zasdk-input-background:#fff;--zasdk-button-background:#f0f0f0;--zasdk-primary-color:#007bff;--zasdk-primary-text-color:#000;--zasdk-button-text-color:#fff;--zasdk-secondary-background:#ddd;--zasdk-icon-border-color:#ccc;--zasdk-dropdown-hover:#f0f0f0;--zasdk-selected-background:#f0f0f0;--zasdk-selected-border:#ddd;--zasdk-muted-text:#999;--zasdk-link-color:#0078d4;--zasdk-switch-off:#ccc;--zasdk-viewer-background:#f8f8f8;--zasdk-placeholder-color:#757575;--zasdk-shadow:#0000002e}.zasdk-modal[data-zasdk-theme=dark],.zasdk-timer-container[data-zasdk-theme=dark],.zasdk-modal.zasdk-dark-theme,.zasdk-timer-container.zasdk-dark-theme{--zasdk-background-color:#1a1a1a;--zasdk-text-color:#f0f0f0;--zasdk-border-color:#444;--zasdk-modal-background:#ffffff1a;--zasdk-close-color:#888;--zasdk-close-hover-color:#fff;--zasdk-input-background:#2a2a2a;--zasdk-button-background:#333;--zasdk-primary-color:#2f7bd8;--zasdk-primary-text-color:#fff;--zasdk-secondary-background:#333;--zasdk-icon-border-color:#555;--zasdk-dropdown-hover:#2a2a2a;--zasdk-selected-background:#2a2a2a;--zasdk-selected-border:#555;--zasdk-muted-text:#888;--zasdk-link-color:#5aa9ff;--zasdk-switch-off:#555;--zasdk-viewer-background:#222;--zasdk-placeholder-color:#9a9a9a;--zasdk-shadow:#0009}@media (prefers-color-scheme:dark){.zasdk-modal[data-zasdk-theme=auto],.zasdk-timer-container[data-zasdk-theme=auto]{--zasdk-background-color:#1a1a1a;--zasdk-text-color:#f0f0f0;--zasdk-border-color:#444;--zasdk-modal-background:#ffffff1a;--zasdk-close-color:#888;--zasdk-close-hover-color:#fff;--zasdk-input-background:#2a2a2a;--zasdk-button-background:#333;--zasdk-primary-color:#2f7bd8;--zasdk-primary-text-color:#fff;--zasdk-secondary-background:#333;--zasdk-icon-border-color:#555;--zasdk-dropdown-hover:#2a2a2a;--zasdk-selected-background:#2a2a2a;--zasdk-selected-border:#555;--zasdk-muted-text:#888;--zasdk-link-color:#5aa9ff;--zasdk-switch-off:#555;--zasdk-viewer-background:#222;--zasdk-placeholder-color:#9a9a9a;--zasdk-shadow:#0009}}.zasdk-modal-content *{box-sizing:border-box;font-size:14px}.zasdk-modal{z-index:214748364;pointer-events:none;width:100%;height:100%;color:var(--zasdk-primary-text-color);background:0 0;position:fixed;top:0;left:0;overflow:visible}.zasdk-modal-content{background-color:var(--zasdk-background-color);border:1px solid var(--zasdk-border-color);width:500px;max-width:calc(100% - 40px);max-height:calc(100% - 40px);box-shadow:0 8px 24px var(--zasdk-shadow);pointer-events:auto;-webkit-user-select:none;user-select:none;border-radius:8px;flex-direction:column;padding:10px 0 20px;transition:none;display:flex;position:fixed;inset:auto 20px 20px auto}.zasdk-header{cursor:grab;justify-content:space-between;align-items:center;margin-bottom:20px;padding:0 20px;display:flex}.zasdk-title{margin:0;font-size:24px;font-weight:700}.zasdk-close{color:var(--zasdk-close-color);cursor:pointer;font-size:28px;font-weight:700}.zasdk-close svg path{fill:var(--zasdk-primary-text-color)}.zasdk-close:hover,.zasdk-close:focus{color:var(--zasdk-close-hover-color);cursor:pointer;text-decoration:none}.zasdk-feedback-types{text-align:center;justify-content:space-evenly;margin-bottom:20px;font-size:14px;display:flex}.zasdk-feedback-type{cursor:pointer;display:inline-block}.zasdk-iconcnt{background-color:var(--zasdk-background-color);border-radius:50%;justify-content:center;align-items:center;width:32px;height:32px;margin-bottom:5px;font-weight:700;display:inline-block}.zasdk-form{max-height:calc(100% - 190px);padding:0 20px;position:relative;overflow-y:auto}.zasdk-form select,.zasdk-form input,.zasdk-form textarea{border:1px solid var(--zasdk-border-color);background-color:var(--zasdk-input-background);width:100%;color:var(--zasdk-text-color);border-radius:4px;margin-bottom:15px;padding:8px;font-family:inherit;font-size:14px}.zasdk-form textarea::placeholder,.zasdk-form input::placeholder{color:var(--zasdk-placeholder-color);opacity:1}.zasdk-form textarea{resize:none;height:100px}.zasdkdesclbl{margin-bottom:5px;font-weight:700;display:block}.zasdkmadfeld{color:#f33558;padding-left:3px}.zaleftcharspan{float:right}.zaleftchartxt{margin-left:3px;font-weight:400}.zasdk_submit_btncnt{justify-content:end;align-items:center;margin-top:20px;padding:0 20px;display:flex}.zasdkstsmsg{text-align:end;margin-right:20px;font-size:14px;display:none}.zasdkstserror{color:#f33155}.zasdkstssucs{color:#009c08}.zasdk-buttons{margin-top:20px}.zasdk-btn{cursor:pointer;text-align:center;border:none;border-radius:4px;padding:7px 20px;font-size:14px}.zasdk-send-btn{background-color:var(--zasdk-primary-color);color:var(--zasdk-button-text-color);min-width:81px;height:34px}.zasdk-attach-btn{background-color:var(--zasdk-button-background);vertical-align:middle;justify-content:center;align-items:center;height:40px;margin-bottom:0;margin-right:10px;padding:10px 15px 10px 5px;font-size:14px;font-weight:400;display:inline-flex}.zasdkfilesizeinf{vertical-align:middle;margin-top:10px;font-size:13px;display:inline-block}.zasdkattachinf{vertical-align:middle;margin-bottom:10px;font-size:13px;display:inline-block}input[type=file].zasdk-file-input{display:none}.zasdkfeedback__icon{border:1px solid var(--zasdk-icon-border-color);vertical-align:middle;text-align:center;box-sizing:border-box;border-radius:100%;width:32px;height:32px;transition:all .5s;display:inline-block}.zasdk-feedback-types svg{width:inherit;height:inherit;vertical-align:middle;display:inline-block}.zasdkfeedback__icon-report .zasdkfeedback__icon{fill:#ff4122}.zasdkfeedback__icon-report svg{width:28px;height:100%}.zasdk-feedback-type{text-align:center;border:1px solid #0000;width:90px;padding:10px 0;transition:all .5s}.zasdk-selected{border:1px solid var(--zasdk-selected-border);background-color:var(--zasdk-selected-background);border-radius:6px}.zasdk-selected .zasdkfeedback__icon-report .zasdkfeedback__icon{fill:#fff;background:#ff4122;border-color:#ff4122}.zasdk-feedback-type:hover .zasdkfeedback__icon-report .zasdkfeedback__icon{border-color:#ff4122}.zasdkfeedback__icon-reqest .zasdkfeedback__icon{fill:#a63cff}.zasdkfeedback__icon-reqest svg{width:24px;height:100%}.zasdk-feedback-type:hover .zasdkfeedback__icon-reqest .zasdkfeedback__icon{border-color:#a63cff}.zasdk-selected .zasdkfeedback__icon-reqest .zasdkfeedback__icon{fill:#fff;background:#a63cff;border-color:#a63cff}.zasdkfeedback__icon-help .zasdkfeedback__icon{fill:#fba400}.zasdkfeedback__icon-help svg{width:28px;height:100%}.zasdk-feedback-type:hover .zasdkfeedback__icon-help .zasdkfeedback__icon{border-color:#fba400}.zasdk-selected .zasdkfeedback__icon-help .zasdkfeedback__icon{fill:#fff;background:#fba400;border-color:#fba400}.zasdkfeedback__icon-appreciate .zasdkfeedback__icon{fill:#ff297a}.zasdkfeedback__icon-appreciate svg{width:25px;height:28px}.zasdk-feedback-type:hover .zasdkfeedback__icon-appreciate .zasdkfeedback__icon{border-color:#ff297a}.zasdk-selected .zasdkfeedback__icon-appreciate .zasdkfeedback__icon{fill:#fff;background:#ff297a;border-color:#ff297a}.zasdk-btncnt{margin-bottom:10px}.zasdk-dropdown{width:100%;margin-bottom:15px;position:relative}.zasdk-dropdown-header{border:1px solid var(--zasdk-border-color);cursor:pointer;background-color:var(--zasdk-input-background);color:var(--zasdk-text-color);border-radius:4px;padding:5px 10px}.zasdk-dropdown-options{background-color:var(--zasdk-background-color);border:1px solid var(--zasdk-border-color);z-index:1;border-radius:5px;display:none;position:absolute;top:35px;left:0;right:0}.zasdk-dropdown-option{cursor:pointer;padding:5px 10px}.zasdk-dropdown-option:hover{background-color:var(--zasdk-dropdown-hover)}.zasdkqz-container{width:100%;color:var(--zasdk-text-color);background:var(--zasdk-secondary-background);box-sizing:border-box;border-radius:8px;padding:15px;font-size:14px}.zasdkqz-checkbox-wrapper{align-items:flex-start;display:flex;position:relative}input[type=checkbox].zasdkqz-checkbox{opacity:0;width:auto;margin:0;position:absolute}.zasdkqz-checkbox+label{cursor:pointer;margin:0;padding-left:30px;font-weight:400;line-height:1.5;display:inline-block;position:relative}.zasdkqz-checkbox+label:before{content:\"\";border:1px solid var(--zasdk-primary-color);border-radius:4px;width:18px;height:18px;position:absolute;top:2px;left:0}.zasdkqz-checkbox:focus+label:before{border:2px solid var(--zasdk-primary-color)}.zasdkqz-content .zasdkqz-prop-content{margin-top:10px;padding-left:30px}.zasdkqz-checkbox:checked+label:before{background:var(--zasdk-primary-color)}.zasdkqz-checkbox:checked+label:after{content:\"\";border:0 solid #fff;border-width:0 0 1px 1px;width:10px;height:5px;transition:transform .3s;position:absolute;top:6px;left:10px;transform:rotate(-40deg)translate(-50%,-50%)scale(1)}.zasdkqz-content{max-height:0;transition:max-height .5s;overflow:hidden}.zasdkqz-content.zasdkqz-show{max-height:250px;display:block}.zasdkqz-button{background:var(--zasdk-primary-color);color:var(--zasdk-button-text-color);cursor:pointer;border:none;border-radius:4px;margin-top:16px;padding:10px 20px;text-decoration:none;transition:background-color .3s;display:inline-block}.zasdkqz-button:hover{background:var(--zasdk-primary-color)}.zasdkqz-info{margin-top:5px;font-size:14px}.zasdkqz-icon{vertical-align:middle;width:20px;height:20px;margin-left:4px;display:inline-block}.zasdk-modal .zasakfilelstcnt{margin-top:10px;list-style:none}.zasdk-modal .zasakfilelstcnt li{border:1px solid var(--zasdk-border-color);vertical-align:middle;cursor:default;background:var(--zasdk-secondary-background);border-radius:3px;margin:0 5px 5px 0;padding:2px 20px 2px 5px;font-size:1.1rem;display:inline-flex;position:relative}.zaskFdBckFlName{box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;max-width:120px;display:inline-block;overflow:hidden}.zasdkFdBckFlCls{background:var(--zasdk-secondary-background);cursor:pointer;border-radius:0 3px 3px 0;padding:0 3px;font-size:14px;line-height:22px;position:absolute;top:0;bottom:0;right:2px}.zasdkmaxerror{color:#f33155;font-size:14px}.zasdk-timer-container{background-color:var(--zasdk-secondary-background);z-index:11111;cursor:pointer;border-radius:50px;align-items:center;gap:8px;padding:8px 10px;display:inline-flex;position:fixed;bottom:10px;right:10px;box-shadow:0 4px 15px #0000001a}.zasdk-timer-stopcricle{cursor:pointer;background-color:#f33155;border:none;border-radius:50%;width:12px;height:12px;padding:0;animation:1s infinite alternate blink}@keyframes blink{0%{opacity:1}to{opacity:.3}}.zasdk-timer-control{border:1px solid #f33155;border-radius:100%;padding:3px}.zasdk-timer-display{color:var(--zasdk-text-color);text-align:left;min-width:55px;font-size:14px;font-weight:500}.zasdk_videoPrev{justify-content:center;display:flex}.zasdk_videoPrev video{opacity:.4}.zasdk_recordedClipArea{border:1px solid var(--zasdk-border-color);border-radius:6px;display:none;position:relative}.zasdk_recordedClipArea .zasdk_rec_hdr{background-color:var(--zasdk-secondary-background);color:var(--zasdk-text-color);border-radius:3px 3px 0 0;padding:5px 10px}.zasdk_rec_hdr_icon{vertical-align:middle;display:inline-block;position:relative}.zasdk_rec_hdr i{vertical-align:middle;line-height:normal}.zasdk_rec_hdr svg{width:20px}.zasdk_playEdit{z-index:1;justify-content:space-between;align-items:stretch;width:180px;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.zasdk_clipAreaButtonCnt,.zasdk_submit_btnsubcnt{position:relative}.zasdk_clipAreaButton{background:var(--zasdk-background-color);border:1px solid var(--zasdk-border-color);box-sizing:border-box;cursor:pointer;border-radius:6px;justify-content:center;align-items:center;width:50px;height:40px;display:flex;box-shadow:0 0 9px #0003}.zasdk_clipAreaButton:hover{background:var(--zasdk-dropdown-hover)}.zasdk_clipAreaButton svg{width:28px}.zasdk-send-btn.zasdkbtndisableclr{filter:grayscale();pointer-events:none;opacity:.5}.zasdk-send-btn.zasdkbtndisabled{cursor:not-allowed;position:relative}.zasdkbtndisabled:after{content:\"\";border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:20px;height:20px;margin:auto;animation:1s ease-in-out infinite zasdkbuttonspin;position:absolute;inset:0}@keyframes zasdkbuttonspin{to{transform:rotate(360deg)}}.zasdk-tooltip,.zasdk-tooltip-top{visibility:hidden;color:#fff;opacity:0;z-index:111111;background-color:#000;border-radius:4px;width:max-content;max-width:200px;margin-top:8px;padding:8px 12px;font-size:14px;transition:opacity .2s;position:absolute;top:100%;left:50%;transform:translate(-50%)}.zasdk-tooltip:after,.zasdk-tooltip-top:after{content:\"\";border:5px solid #0000;border-bottom-color:#000;position:absolute;bottom:100%;left:50%;transform:translate(-50%)}.zasdk-tooltip-container:hover .zasdk-tooltip,.zasdk-tooltip-container:hover .zasdk-tooltip-top{visibility:visible;opacity:1}.zasdk-tooltip-top{margin-top:0;margin-bottom:8px;top:auto;bottom:100%}.zasdk-tooltip-top:after{border-color:#000 #0000 #0000;top:100%}.zasdk-prop-info{max-width:320px}.zasdk-prop-info li{font-size:13px}.zasdkqz-content:has(.zasdk_rec_hdr:hover){overflow:visible}@media (width<=450px){.zasdk-modal-content{width:calc(100% - 10px);bottom:5px;left:5px;right:5px}}@media (height<=600px){.zasdk-modal-content{max-height:100%;top:auto}}@media (width<=370px){.zasdk-feedback-type{width:70px}.zasdk-iconcnt,.zasdkfeedback__icon{width:25px;height:25px}.zasdkfeedback__icon-report svg{width:20px;height:100%}.zasdkfeedback__icon-reqest svg{width:18px}.zasdkfeedback__icon-help svg{width:18px;height:22px}.zasdkfeedback__icon-appreciate svg{width:20px;height:20px}.zasdk-feedback-type *{word-break:break-word;font-size:12px}.zasdk-buttons{margin-top:0}}.zasdk-custom-select{width:100%;margin-bottom:15px;font-size:14px;position:relative}.zasdk-select-trigger{border:1px solid var(--zasdk-border-color);background:var(--zasdk-input-background);cursor:pointer;color:var(--zasdk-text-color);-webkit-user-select:none;user-select:none;border-radius:4px;justify-content:space-between;align-items:center;padding:9px 12px;display:flex}.zasdk-select-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.zasdk-select-arrow{flex-shrink:0;margin-left:8px}.zasdk-select-panel{background:var(--zasdk-input-background);border:1px solid var(--zasdk-border-color);box-shadow:0 6px 20px var(--zasdk-shadow);z-index:99;border-radius:8px;position:absolute;top:calc(100% + 3px);left:0;right:0;overflow:hidden}.zasdk-select-list{max-height:180px;margin:0;padding:4px 0;list-style:none;overflow-y:auto}.zasdk-select-option{cursor:pointer;color:var(--zasdk-text-color);justify-content:space-between;align-items:center;padding:10px 16px;font-size:14px;display:flex}.zasdk-select-option:hover{background:var(--zasdk-dropdown-hover)}.zasdk-select-option.zasdk-option-selected{color:var(--zasdk-link-color);font-weight:500}.zasdk-select-empty{color:var(--zasdk-muted-text);text-align:center;padding:10px 16px;font-size:13px;font-style:italic}.zasdk-toggles-section{margin:5px 16px}.zasdk-toggle-row{border-top:1px solid var(--zasdk-border-color);justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;display:flex}.zasdk-toggle-info{flex-direction:row;flex:1;align-items:center;gap:8px;display:flex}.zasdk-toggle-label{color:var(--zasdk-text-color);font-size:14px;font-weight:600}.zasdk-view-link{color:var(--zasdk-link-color);cursor:pointer;white-space:nowrap;font-size:12px}.zasdk-view-link:hover{text-decoration:underline}.zasdk-toggle-separator{background:var(--zasdk-border-color);margin:0 16px}.zasdk-switch{flex-shrink:0;width:44px;height:24px;display:inline-block;position:relative}.zasdk-switch input{opacity:0;width:0;height:0}.zasdk-slider{cursor:pointer;background:var(--zasdk-switch-off);border-radius:24px;transition:all .3s;position:absolute;inset:0}.zasdk-slider:before{content:\"\";background:#fff;border-radius:50%;width:18px;height:18px;transition:all .3s;position:absolute;bottom:3px;left:3px}.zasdk-switch input:checked+.zasdk-slider{background:var(--zasdk-link-color)}.zasdk-switch input:checked+.zasdk-slider:before{transform:translate(20px)}.zasdk-data-viewer{background:var(--zasdk-background-color);z-index:100;border-radius:12px;flex-direction:column;position:absolute;inset:0;overflow:hidden}.zasdk-viewer-hdr{border-bottom:1px solid var(--zasdk-border-color);flex-shrink:0;align-items:center;gap:10px;padding:14px 16px;display:flex}.zasdk-viewer-back{cursor:pointer;flex-shrink:0;align-items:center;padding:2px;display:flex}.zasdk-viewer-back:hover svg path{stroke:var(--zasdk-link-color)}.zasdk-viewer-title{color:var(--zasdk-text-color);flex:1;font-size:16px;font-weight:600}.zasdk-viewer-content{color:var(--zasdk-text-color);white-space:pre-wrap;word-break:break-word;background:var(--zasdk-viewer-background);border-radius:6px;flex:1;margin:8px;padding:16px;font-family:monospace;font-size:12px;overflow-y:auto}.zasdk-modal-content :focus-visible{outline:2px solid var(--zasdk-primary-color);outline-offset:2px}@media (prefers-reduced-motion:reduce){.zasdk-modal *,.zasdk-timer-container *{transition:none!important;animation:none!important}}";
3
+
4
+ export { css as default };
@@ -0,0 +1,2 @@
1
+ export declare const feedbackUIHtml = "<div id=\"zasdkFeedbackconatiner\" class=\"zasdk-modal-content\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"zasdkFeedbackTitle\">\n <div class=\"zasdk-header\">\n <h2 id=\"zasdkFeedbackTitle\" class=\"zasdk-title\">Share feedback</h2>\n <span id=\"appticsfeedbackclose\" class=\"zasdk-close\" role=\"button\" tabindex=\"0\" aria-label=\"Close\"><svg viewBox=\"0 0 24 24\" style=\" width: 20px; \"><path d=\"M19.92,19.08c.23.23.23.61,0,.85-.12.12-.27.18-.42.18s-.31-.06-.42-.18l-7.08-7.08-7.08,7.08c-.12.12-.27.18-.42.18s-.31-.06-.42-.18c-.23-.23-.23-.61,0-.85l7.08-7.08-7.08-7.08c-.23-.23-.23-.61,0-.85s.61-.23.85,0l7.08,7.08,7.08-7.08c.23-.23.61-.23.85,0s.23.61,0,.85l-7.08,7.08,7.08,7.08Z\"/></svg></span>\n </div>\n <div class=\"zasdk-feedback-types\" data-type=\"\">\n <div class=\"zasdk-feedback-type zasdk-selected\" data-type=\"feedback\">\n <div class=\"zasdk-iconcnt zasdkfeedback__icon-reqest\">\n <i class=\"zasdkfeedback__icon\"><svg viewBox=\"0 0 24 24\"><path d=\"M6.69,9.25h10.81c.41,0,.75-.34.75-.75s-.34-.75-.75-.75H6.69c-.41,0-.75.34-.75.75s.34.75.75.75Z\"/><path d=\"M6.69,13.07h8.11c.41,0,.75-.34.75-.75s-.34-.75-.75-.75H6.69c-.41,0-.75.34-.75.75s.34.75.75.75Z\"/><path d=\"M20.72,5.17c0-.68-.55-1.23-1.23-1.23H4.48c-.68,0-1.23.55-1.23,1.23v11.84c0,.68.55,1.23,1.23,1.23h13.49l1.25,1.51c.17.2.41.31.67.31.1,0,.2-.02.3-.05.34-.13.57-.46.56-.83l-.03-14.01ZM19.22,17.39l-.17-.2c-.24-.29-.58-.45-.95-.45H4.75V5.44h14.47v11.95Z\"/></svg></i>\n </div>\n <div>Feedback</div>\n </div>\n <div class=\"zasdk-feedback-type\" data-type=\"bug\">\n <div class=\"zasdk-iconcnt zasdkfeedback__icon-report\">\n <i class=\"zasdkfeedback__icon\"><svg viewBox=\"0 0 24 24\"><path d=\"M15.6,6.58c-.13-.37-.3-.7-.5-.97l1.23-1.18c.24-.23.25-.61.02-.85-.23-.24-.61-.25-.85-.02l-1.26,1.21c-.66-.45-1.37-.62-1.79-.68-.25-.04-.51-.04-.76-.02-.83.08-1.45.35-1.93.7l-1.22-1.2c-.24-.23-.62-.23-.85,0-.23.24-.23.62,0,.85l1.21,1.19c-.24.34-.41.68-.51.96-2.02,1.37-3.27,3.82-3.27,6.44,0,4.18,3.08,7.58,6.87,7.58s6.87-3.4,6.87-7.58c0-2.62-1.25-5.06-3.26-6.44ZM11.82,5.27c.15-.02.31-.01.47.01.69.1,1.86.48,2.26,1.9-.17.17-.51.44-1.14.65-1.08.36-2.31.28-3.36-.23-.24-.11-.44-.23-.6-.36,0-.01,0-.03.01-.04.18-.65.73-1.77,2.36-1.93ZM12,19.4c-3.12,0-5.67-2.86-5.67-6.38,0-1.98.82-3.82,2.19-5.02.26.25.59.48,1.01.68.78.38,1.65.57,2.5.57.6,0,1.19-.09,1.76-.28.88-.29,1.39-.7,1.67-1,1.38,1.2,2.21,3.06,2.21,5.05,0,3.52-2.54,6.38-5.67,6.38ZM9.12,9.86c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM9.12,11.99c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47ZM14.88,9.86c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM14.88,11.99c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47ZM12,14.49c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM12,16.62c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47Z\"/></svg></i>\n </div>\n <div>Bug</div>\n </div>\n <div class=\"zasdk-feedback-type\" data-type=\"help\">\n <div class=\"zasdk-iconcnt zasdkfeedback__icon-help\">\n <i class=\"zasdkfeedback__icon\"><svg viewBox=\"0 0 24 24\"><path d=\"M12.45,16.47c-.33,0-.6-.27-.6-.6v-2.7c0-.43.25-.82.64-.99.95-.42,3.15-1.62,3.15-3.51,0-1.6-1.01-3.03-2.51-3.55-.95-.33-1.97-.28-2.87.16-.91.43-1.59,1.2-1.92,2.14-.11.31-.45.48-.77.37-.31-.11-.48-.45-.37-.77.44-1.25,1.34-2.25,2.54-2.83,1.2-.57,2.54-.65,3.79-.21,1.99.7,3.32,2.58,3.31,4.69,0,2.46-2.34,3.91-3.79,4.57v2.63c0,.33-.27.6-.6.6ZM13.21,19.1c0-.66-.54-1.2-1.2-1.2h-.03c-.66,0-1.19.54-1.19,1.2s.55,1.2,1.21,1.2,1.2-.54,1.2-1.2Z\"/></svg></i>\n </div>\n <div>Help</div>\n </div>\n <div class=\"zasdk-feedback-type\" data-type=\"report\">\n <div class=\"zasdk-iconcnt zasdkfeedback__icon-appreciate\">\n <i class=\"zasdkfeedback__icon\"><svg viewBox=\"0 0 24 24\"><path d=\"M20.47,16.72l-6.66-11.53c-.37-.65-1.07-1.05-1.81-1.05s-1.44.4-1.81,1.05l-6.66,11.53c-.37.65-.37,1.45,0,2.09.37.65,1.07,1.05,1.81,1.05h13.32c.75,0,1.44-.4,1.81-1.05.37-.64.37-1.45,0-2.09ZM19.17,18.06c-.11.18-.3.3-.51.3H5.34c-.21,0-.41-.11-.51-.3-.1-.18-.1-.41,0-.59l6.66-11.53h0c.11-.18.3-.3.51-.3s.41.11.51.3l6.66,11.53c.11.18.11.41,0,.59Z\"/><path d=\"M12.35,13.9s.37-4.72.37-4.72c.05-1.08-1.58-1.06-1.5.02l.48,4.71c.03.38.62.37.64,0Z\"/><path d=\"M11.97,15.06c-.52,0-.94.42-.94.94s.42.94.94.94.94-.42.94-.94-.42-.94-.94-.94Z\"/></svg></i>\n </div>\n <div>Report</div>\n </div>\n </div>\n <div id=\"zasdkFeedbackForm\" class=\"zasdk-form\">\n <label class=\"zasdkdesclbl\">User<span class=\"zasdkmadfeld\">*</span></label>\n <div id=\"zasdkEmailDropdown\" class=\"zasdk-custom-select\">\n <div id=\"zasdkEmailTrigger\" class=\"zasdk-select-trigger\">\n <span id=\"zasdkEmailLabel\" class=\"zasdk-select-label\">Anonymous</span>\n <svg class=\"zasdk-select-arrow\" viewBox=\"0 0 12 8\" width=\"12\" height=\"8\"><path d=\"M1 1l5 5 5-5\" stroke=\"#999\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/></svg>\n </div>\n <div id=\"zasdkEmailPanel\" class=\"zasdk-select-panel\" style=\"display:none\">\n <ul id=\"zasdkEmailList\" class=\"zasdk-select-list\"></ul>\n </div>\n </div>\n <label class=\"zasdkdesclbl\" for=\"zasdkDescription\">Add details here<span class=\"zasdkmadfeld\">*</span> <span class=\"zaleftcharspan\"><span class=\"zaleftcharcnt\">5000</span><span class=\"zaleftchartxt\">characters left</span></span></label>\n <textarea id=\"zasdkDescription\" name=\"description\" placeholder=\"Please provide more details for us to help you better.\" reqname=\"name\" maxlength=\"5000\"></textarea>\n <div id=\"zasdkreccheckcnt\" class=\"zasdkqz-container\">\n <div class=\"zasdkqz-checkbox-wrapper\">\n <input type=\"checkbox\" id=\"zasdkqz-consent\" class=\"zasdkqz-checkbox\">\n <label for=\"zasdkqz-consent\">By agreeing to record screen, I allow the collection of the required information for further analysis.</label>\n </div>\n <div id=\"zasdkqz-content\" class=\"zasdkqz-content\">\n <div class=\"zasdkqz-prop-content\">Data collected while screen recording.\n <div class=\"zasdk_rec_hdr_icon zasdk-tooltip-container zasdk_rec_hdr\">\n <i><svg viewBox=\"0 0 24 24\"><path d=\"M12,20.6c-4.74,0-8.6-3.86-8.6-8.6S7.26,3.4,12,3.4s8.6,3.86,8.6,8.6-3.86,8.6-8.6,8.6ZM12,4.6c-4.08,0-7.4,3.32-7.4,7.4s3.32,7.4,7.4,7.4,7.4-3.32,7.4-7.4-3.32-7.4-7.4-7.4ZM12.6,15.97v-4.91c0-.33-.27-.6-.6-.6s-.6.27-.6.6v4.91c0,.33.27.6.6.6s.6-.27.6-.6ZM12.61,9.03c0-.33-.27-.6-.6-.6h-.01c-.33,0-.59.27-.59.6s.28.6.61.6.6-.27.6-.6Z\"/></svg></i>\n <div class=\"zasdk-tooltip-top zasdk-prop-info\">\n <ul>\n <li>- A recording of the window or region specified.</li>\n <li>- Audio captured during recording. (You can mute or re-record)</li>\n <li>- IP address.</li>\n <li>- Browser console logs generated while recording.</li>\n <li>- Device details (screen resolution, OS, and browser version).</li>\n <li>- Client-side performance metrics (DNS lookup time, TCP connection time, etc.).</li>\n </ul>\n </div>\n </div>\n </div>\n <div id=\"zasdkqz_rec_button\" class=\"zasdkqz-button\">Start screen recording</div>\n </div>\n </div>\n <div id=\"editRecordedVideo\" class=\"zasdk_recordedClipArea\" style=\"\">\n <div id=\"recordScreenDesc\" class=\"zasdk_rec_hdr\"> Recorded Clip\n <div class=\"zasdk_rec_hdr_icon zasdk-tooltip-container\">\n <i><svg viewBox=\"0 0 24 24\"><path d=\"M12,20.6c-4.74,0-8.6-3.86-8.6-8.6S7.26,3.4,12,3.4s8.6,3.86,8.6,8.6-3.86,8.6-8.6,8.6ZM12,4.6c-4.08,0-7.4,3.32-7.4,7.4s3.32,7.4,7.4,7.4,7.4-3.32,7.4-7.4-3.32-7.4-7.4-7.4ZM12.6,15.97v-4.91c0-.33-.27-.6-.6-.6s-.6.27-.6.6v4.91c0,.33.27.6.6.6s.6-.27.6-.6ZM12.61,9.03c0-.33-.27-.6-.6-.6h-.01c-.33,0-.59.27-.59.6s.28.6.61.6.6-.27.6-.6Z\"/></svg></i>\n <div class=\"zasdk-tooltip\">This recording will be sent along with your feedback for further analysis.</div>\n </div>\n </div>\n <div class=\"zasdk_playEdit\">\n <div class=\"zasdk_clipAreaButtonCnt zasdk-tooltip-container\">\n <div id=\"preivewPlayButton\" class=\"zasdk_clipAreaButton\" title=\"Preview\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M6.24,20.6c-.2,0-.39-.05-.57-.15-.38-.21-.62-.61-.62-1.05V4.59c0-.44.24-.84.62-1.05.38-.21.85-.19,1.22.04l11.52,7.41c.34.22.55.6.55,1,0,.41-.2.78-.55,1l-11.52,7.41c-.2.13-.42.19-.64.19ZM6.56,4.1l-.33.5v14.81s11.52-7.41,11.52-7.41L6.23,4.6l.33-.5Z\"/></svg>\n </div>\n <div class=\"zasdk-tooltip\">Preview</div>\n </div>\n <div class=\"zasdk_clipAreaButtonCnt zasdk-tooltip-container\">\n <div id=\"videoEditButton\" class=\"zasdk_clipAreaButton\">\n <svg id=\"Layer_2\" viewBox=\"0 0 24 24\"><path d=\"M20.6,7.18c0-.58-.23-1.13-.65-1.54l-1.53-1.51c-.83-.83-2.29-.83-3.12,0l-1.31,1.3h0S4.88,14.41,4.88,14.41c-.12.12-.21.27-.26.44l-1.19,4.4c-.09.34,0,.7.26.95.19.18.44.29.7.29.09,0,.17-.01.26-.04l4.44-1.2c.16-.05.31-.13.44-.25l8.54-8.43h0s1.88-1.86,1.88-1.86c.06-.06.12-.12.17-.19h0c.31-.39.48-.86.48-1.36ZM8.72,18.12l-4.03,1.09,1.08-3.98L13.97,7.12l2.88,2.97-8.13,8.03ZM17.71,9.25l-2.88-2.97,1.32-1.3c.38-.38,1.04-.38,1.43,0l1.53,1.51c.19.18.29.43.29.69,0,.22-.08.43-.21.6h0s-.04.05-.08.08l-1.4,1.39Z\"/></svg>\n </div>\n <div class=\"zasdk-tooltip\">Edit</div>\n </div>\n <div class=\"zasdk_clipAreaButtonCnt zasdk-tooltip-container\">\n <div id=\"videoDelButton\" class=\"zasdk_clipAreaButton\">\n <svg id=\"Layer_2\" viewBox=\"0 0 24 24\"><path d=\"M19.2,6.6h-3.4v-1c0-1.21-.99-2.2-2.2-2.2h-3.2c-1.21,0-2.2.99-2.2,2.2v1h-3.4c-.33,0-.6.27-.6.6s.27.6.6.6h1v10.6c0,1.21.99,2.2,2.2,2.2h8c1.21,0,2.2-.99,2.2-2.2V7.8h1c.33,0,.6-.27.6-.6s-.27-.6-.6-.6ZM9.4,5.6c0-.55.45-1,1-1h3.2c.55,0,1,.45,1,1v1h-5.2v-1ZM17,18.4c0,.55-.45,1-1,1h-8c-.55,0-1-.45-1-1V7.8h10v10.6ZM11,11.2v4.8c0,.33-.27.6-.6.6s-.6-.27-.6-.6v-4.8c0-.33.27-.6.6-.6s.6.27.6.6ZM14.2,11.2v4.8c0,.33-.27.6-.6.6s-.6-.27-.6-.6v-4.8c0-.33.27-.6.6-.6s.6.27.6.6Z\"/></svg>\n </div>\n <div class=\"zasdk-tooltip\">Delete</div>\n </div>\n </div>\n <div class=\"zasdk_videoPrev\">\n <video id=\"previewVideoElemId\" width=\"320\" height=\"240\" src=\"\"></video>\n </div>\n </div>\n\n <div class=\"zasdk-buttons\">\n <div class=\"zasdk-btncnt\">\n <div id=\"zasdkattachinfo\" class=\"zasdkattachinf\">Maximum 5 attachments with a total file size of 10MB is allowed</div>\n <input type=\"file\" id=\"zasdkFileInput\" class=\"zasdk-file-input\" multiple accept=\".png, .jpg, .txt\">\n <label id=\"zasdkAttachBtn\" class=\"zasdk-btn zasdk-attach-btn\" for=\"zasdkFileInput\">\n <svg id=\"Layer_2\" viewBox=\"0 0 24 24\" style=\" width: 25px; \"><path d=\"M12,20.6c-2.63,0-4.78-2.14-4.78-4.78V6.78c0-1.87,1.52-3.38,3.38-3.38s3.38,1.52,3.38,3.38v9.04c0,1.1-.9,1.99-2,1.99s-1.99-.89-1.99-1.99V7.48c0-.33.27-.6.6-.6h0c.33,0,.6.27.6.6v8.35c0,.44.35.79.79.79s.79-.36.79-.79V6.78c0-1.2-.98-2.18-2.18-2.18s-2.18.98-2.18,2.18v9.04c0,1.97,1.6,3.58,3.58,3.58s3.58-1.6,3.58-3.58V6.78c0-.33.27-.6.6-.6s.6.27.6.6v9.04c0,2.63-2.14,4.78-4.78,4.78Z\"/></svg>\n <span>Attachments</span>\n </label>\n <div id=\"zasdkfilesizeinfo\" class=\"zasdkfilesizeinf\"></div>\n <ul id=\"zasakfileList\" class=\"zasakfilelstcnt\"></ul>\n </div>\n </div>\n </div>\n <div class=\"zasdk-toggles-section\">\n <div class=\"zasdk-toggle-row\">\n <div class=\"zasdk-toggle-info\">\n <span class=\"zasdk-toggle-label\">Include System Logs</span>\n <span class=\"zasdk-view-link\" id=\"zasdkViewLogsBtn\">View</span>\n </div>\n <label class=\"zasdk-switch\">\n <input type=\"checkbox\" id=\"zasdkIncludeLogToggle\">\n <span class=\"zasdk-slider\"></span>\n </label>\n </div>\n <div class=\"zasdk-toggle-separator\"></div>\n <div class=\"zasdk-toggle-row\">\n <div class=\"zasdk-toggle-info\">\n <span class=\"zasdk-toggle-label\">Include Diagnostic Information</span>\n <span class=\"zasdk-view-link\" id=\"zasdkViewDiagBtn\">View</span>\n </div>\n <label class=\"zasdk-switch\">\n <input type=\"checkbox\" id=\"zasdkIncludeDiagToggle\">\n <span class=\"zasdk-slider\"></span>\n </label>\n </div>\n </div>\n <div class=\"zasdk_submit_btncnt\">\n <div id=\"zasdksubmitstatus\" class=\"zasdkstsmsg\" style=\"display:none;\" ></div>\n <div id=\"zasdk_submit_btnsubcnt\" class=\"zasdk_submit_btnsubcnt\">\n <input type=\"button\" id=\"zasdk_submit_btn\" class=\"zasdk-btn zasdk-send-btn zasdkbtndisableclr\" value=\"Send\">\n </div>\n </div>\n <div id=\"zasdkDataViewer\" class=\"zasdk-data-viewer\" style=\"display:none\">\n <div class=\"zasdk-viewer-hdr\">\n <span id=\"zasdkViewerClose\" class=\"zasdk-viewer-back\"><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\"><path d=\"M15 19l-7-7 7-7\" stroke=\"#333\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></span>\n <span id=\"zasdkViewerTitle\" class=\"zasdk-viewer-title\"></span>\n </div>\n <pre id=\"zasdkViewerContent\" class=\"zasdk-viewer-content\"></pre>\n </div>\n </div>";
2
+ export declare const timerHtml = "<div id=\"zasdkrectimer\" class=\"zasdk-timer-container zasdk-tooltip-container\">\n <div class=\"zasdk-timer-control\" id=\"zasdkRecordButton\"><div class=\"zasdk-timer-stopcricle\"></div></div>\n <span class=\"zasdk-timer-display\" id=\"zasdkTimerDisplay\">05:00</span>\n <div class=\"zasdk-tooltip-top\">Stop Recording</div>\n </div>";
@@ -0,0 +1,159 @@
1
+ /*! @zoho_apptics/apptics-js-sdk v2.0.0-beta.1 | (c) Zoho Corporation Private Limited | see LICENSE */
2
+ // Feedback modal markup (moved from js/apptics.js).
3
+ const feedbackUIHtml = `<div id="zasdkFeedbackconatiner" class="zasdk-modal-content" role="dialog" aria-modal="true" aria-labelledby="zasdkFeedbackTitle">
4
+ <div class="zasdk-header">
5
+ <h2 id="zasdkFeedbackTitle" class="zasdk-title">Share feedback</h2>
6
+ <span id="appticsfeedbackclose" class="zasdk-close" role="button" tabindex="0" aria-label="Close"><svg viewBox="0 0 24 24" style=" width: 20px; "><path d="M19.92,19.08c.23.23.23.61,0,.85-.12.12-.27.18-.42.18s-.31-.06-.42-.18l-7.08-7.08-7.08,7.08c-.12.12-.27.18-.42.18s-.31-.06-.42-.18c-.23-.23-.23-.61,0-.85l7.08-7.08-7.08-7.08c-.23-.23-.23-.61,0-.85s.61-.23.85,0l7.08,7.08,7.08-7.08c.23-.23.61-.23.85,0s.23.61,0,.85l-7.08,7.08,7.08,7.08Z"/></svg></span>
7
+ </div>
8
+ <div class="zasdk-feedback-types" data-type="">
9
+ <div class="zasdk-feedback-type zasdk-selected" data-type="feedback">
10
+ <div class="zasdk-iconcnt zasdkfeedback__icon-reqest">
11
+ <i class="zasdkfeedback__icon"><svg viewBox="0 0 24 24"><path d="M6.69,9.25h10.81c.41,0,.75-.34.75-.75s-.34-.75-.75-.75H6.69c-.41,0-.75.34-.75.75s.34.75.75.75Z"/><path d="M6.69,13.07h8.11c.41,0,.75-.34.75-.75s-.34-.75-.75-.75H6.69c-.41,0-.75.34-.75.75s.34.75.75.75Z"/><path d="M20.72,5.17c0-.68-.55-1.23-1.23-1.23H4.48c-.68,0-1.23.55-1.23,1.23v11.84c0,.68.55,1.23,1.23,1.23h13.49l1.25,1.51c.17.2.41.31.67.31.1,0,.2-.02.3-.05.34-.13.57-.46.56-.83l-.03-14.01ZM19.22,17.39l-.17-.2c-.24-.29-.58-.45-.95-.45H4.75V5.44h14.47v11.95Z"/></svg></i>
12
+ </div>
13
+ <div>Feedback</div>
14
+ </div>
15
+ <div class="zasdk-feedback-type" data-type="bug">
16
+ <div class="zasdk-iconcnt zasdkfeedback__icon-report">
17
+ <i class="zasdkfeedback__icon"><svg viewBox="0 0 24 24"><path d="M15.6,6.58c-.13-.37-.3-.7-.5-.97l1.23-1.18c.24-.23.25-.61.02-.85-.23-.24-.61-.25-.85-.02l-1.26,1.21c-.66-.45-1.37-.62-1.79-.68-.25-.04-.51-.04-.76-.02-.83.08-1.45.35-1.93.7l-1.22-1.2c-.24-.23-.62-.23-.85,0-.23.24-.23.62,0,.85l1.21,1.19c-.24.34-.41.68-.51.96-2.02,1.37-3.27,3.82-3.27,6.44,0,4.18,3.08,7.58,6.87,7.58s6.87-3.4,6.87-7.58c0-2.62-1.25-5.06-3.26-6.44ZM11.82,5.27c.15-.02.31-.01.47.01.69.1,1.86.48,2.26,1.9-.17.17-.51.44-1.14.65-1.08.36-2.31.28-3.36-.23-.24-.11-.44-.23-.6-.36,0-.01,0-.03.01-.04.18-.65.73-1.77,2.36-1.93ZM12,19.4c-3.12,0-5.67-2.86-5.67-6.38,0-1.98.82-3.82,2.19-5.02.26.25.59.48,1.01.68.78.38,1.65.57,2.5.57.6,0,1.19-.09,1.76-.28.88-.29,1.39-.7,1.67-1,1.38,1.2,2.21,3.06,2.21,5.05,0,3.52-2.54,6.38-5.67,6.38ZM9.12,9.86c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM9.12,11.99c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47ZM14.88,9.86c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM14.88,11.99c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47ZM12,14.49c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM12,16.62c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47Z"/></svg></i>
18
+ </div>
19
+ <div>Bug</div>
20
+ </div>
21
+ <div class="zasdk-feedback-type" data-type="help">
22
+ <div class="zasdk-iconcnt zasdkfeedback__icon-help">
23
+ <i class="zasdkfeedback__icon"><svg viewBox="0 0 24 24"><path d="M12.45,16.47c-.33,0-.6-.27-.6-.6v-2.7c0-.43.25-.82.64-.99.95-.42,3.15-1.62,3.15-3.51,0-1.6-1.01-3.03-2.51-3.55-.95-.33-1.97-.28-2.87.16-.91.43-1.59,1.2-1.92,2.14-.11.31-.45.48-.77.37-.31-.11-.48-.45-.37-.77.44-1.25,1.34-2.25,2.54-2.83,1.2-.57,2.54-.65,3.79-.21,1.99.7,3.32,2.58,3.31,4.69,0,2.46-2.34,3.91-3.79,4.57v2.63c0,.33-.27.6-.6.6ZM13.21,19.1c0-.66-.54-1.2-1.2-1.2h-.03c-.66,0-1.19.54-1.19,1.2s.55,1.2,1.21,1.2,1.2-.54,1.2-1.2Z"/></svg></i>
24
+ </div>
25
+ <div>Help</div>
26
+ </div>
27
+ <div class="zasdk-feedback-type" data-type="report">
28
+ <div class="zasdk-iconcnt zasdkfeedback__icon-appreciate">
29
+ <i class="zasdkfeedback__icon"><svg viewBox="0 0 24 24"><path d="M20.47,16.72l-6.66-11.53c-.37-.65-1.07-1.05-1.81-1.05s-1.44.4-1.81,1.05l-6.66,11.53c-.37.65-.37,1.45,0,2.09.37.65,1.07,1.05,1.81,1.05h13.32c.75,0,1.44-.4,1.81-1.05.37-.64.37-1.45,0-2.09ZM19.17,18.06c-.11.18-.3.3-.51.3H5.34c-.21,0-.41-.11-.51-.3-.1-.18-.1-.41,0-.59l6.66-11.53h0c.11-.18.3-.3.51-.3s.41.11.51.3l6.66,11.53c.11.18.11.41,0,.59Z"/><path d="M12.35,13.9s.37-4.72.37-4.72c.05-1.08-1.58-1.06-1.5.02l.48,4.71c.03.38.62.37.64,0Z"/><path d="M11.97,15.06c-.52,0-.94.42-.94.94s.42.94.94.94.94-.42.94-.94-.42-.94-.94-.94Z"/></svg></i>
30
+ </div>
31
+ <div>Report</div>
32
+ </div>
33
+ </div>
34
+ <div id="zasdkFeedbackForm" class="zasdk-form">
35
+ <label class="zasdkdesclbl">User<span class="zasdkmadfeld">*</span></label>
36
+ <div id="zasdkEmailDropdown" class="zasdk-custom-select">
37
+ <div id="zasdkEmailTrigger" class="zasdk-select-trigger">
38
+ <span id="zasdkEmailLabel" class="zasdk-select-label">Anonymous</span>
39
+ <svg class="zasdk-select-arrow" viewBox="0 0 12 8" width="12" height="8"><path d="M1 1l5 5 5-5" stroke="#999" stroke-width="1.5" fill="none" stroke-linecap="round"/></svg>
40
+ </div>
41
+ <div id="zasdkEmailPanel" class="zasdk-select-panel" style="display:none">
42
+ <ul id="zasdkEmailList" class="zasdk-select-list"></ul>
43
+ </div>
44
+ </div>
45
+ <label class="zasdkdesclbl" for="zasdkDescription">Add details here<span class="zasdkmadfeld">*</span> <span class="zaleftcharspan"><span class="zaleftcharcnt">5000</span><span class="zaleftchartxt">characters left</span></span></label>
46
+ <textarea id="zasdkDescription" name="description" placeholder="Please provide more details for us to help you better." reqname="name" maxlength="5000"></textarea>
47
+ <div id="zasdkreccheckcnt" class="zasdkqz-container">
48
+ <div class="zasdkqz-checkbox-wrapper">
49
+ <input type="checkbox" id="zasdkqz-consent" class="zasdkqz-checkbox">
50
+ <label for="zasdkqz-consent">By agreeing to record screen, I allow the collection of the required information for further analysis.</label>
51
+ </div>
52
+ <div id="zasdkqz-content" class="zasdkqz-content">
53
+ <div class="zasdkqz-prop-content">Data collected while screen recording.
54
+ <div class="zasdk_rec_hdr_icon zasdk-tooltip-container zasdk_rec_hdr">
55
+ <i><svg viewBox="0 0 24 24"><path d="M12,20.6c-4.74,0-8.6-3.86-8.6-8.6S7.26,3.4,12,3.4s8.6,3.86,8.6,8.6-3.86,8.6-8.6,8.6ZM12,4.6c-4.08,0-7.4,3.32-7.4,7.4s3.32,7.4,7.4,7.4,7.4-3.32,7.4-7.4-3.32-7.4-7.4-7.4ZM12.6,15.97v-4.91c0-.33-.27-.6-.6-.6s-.6.27-.6.6v4.91c0,.33.27.6.6.6s.6-.27.6-.6ZM12.61,9.03c0-.33-.27-.6-.6-.6h-.01c-.33,0-.59.27-.59.6s.28.6.61.6.6-.27.6-.6Z"/></svg></i>
56
+ <div class="zasdk-tooltip-top zasdk-prop-info">
57
+ <ul>
58
+ <li>- A recording of the window or region specified.</li>
59
+ <li>- Audio captured during recording. (You can mute or re-record)</li>
60
+ <li>- IP address.</li>
61
+ <li>- Browser console logs generated while recording.</li>
62
+ <li>- Device details (screen resolution, OS, and browser version).</li>
63
+ <li>- Client-side performance metrics (DNS lookup time, TCP connection time, etc.).</li>
64
+ </ul>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ <div id="zasdkqz_rec_button" class="zasdkqz-button">Start screen recording</div>
69
+ </div>
70
+ </div>
71
+ <div id="editRecordedVideo" class="zasdk_recordedClipArea" style="">
72
+ <div id="recordScreenDesc" class="zasdk_rec_hdr"> Recorded Clip
73
+ <div class="zasdk_rec_hdr_icon zasdk-tooltip-container">
74
+ <i><svg viewBox="0 0 24 24"><path d="M12,20.6c-4.74,0-8.6-3.86-8.6-8.6S7.26,3.4,12,3.4s8.6,3.86,8.6,8.6-3.86,8.6-8.6,8.6ZM12,4.6c-4.08,0-7.4,3.32-7.4,7.4s3.32,7.4,7.4,7.4,7.4-3.32,7.4-7.4-3.32-7.4-7.4-7.4ZM12.6,15.97v-4.91c0-.33-.27-.6-.6-.6s-.6.27-.6.6v4.91c0,.33.27.6.6.6s.6-.27.6-.6ZM12.61,9.03c0-.33-.27-.6-.6-.6h-.01c-.33,0-.59.27-.59.6s.28.6.61.6.6-.27.6-.6Z"/></svg></i>
75
+ <div class="zasdk-tooltip">This recording will be sent along with your feedback for further analysis.</div>
76
+ </div>
77
+ </div>
78
+ <div class="zasdk_playEdit">
79
+ <div class="zasdk_clipAreaButtonCnt zasdk-tooltip-container">
80
+ <div id="preivewPlayButton" class="zasdk_clipAreaButton" title="Preview">
81
+ <svg viewBox="0 0 24 24"><path d="M6.24,20.6c-.2,0-.39-.05-.57-.15-.38-.21-.62-.61-.62-1.05V4.59c0-.44.24-.84.62-1.05.38-.21.85-.19,1.22.04l11.52,7.41c.34.22.55.6.55,1,0,.41-.2.78-.55,1l-11.52,7.41c-.2.13-.42.19-.64.19ZM6.56,4.1l-.33.5v14.81s11.52-7.41,11.52-7.41L6.23,4.6l.33-.5Z"/></svg>
82
+ </div>
83
+ <div class="zasdk-tooltip">Preview</div>
84
+ </div>
85
+ <div class="zasdk_clipAreaButtonCnt zasdk-tooltip-container">
86
+ <div id="videoEditButton" class="zasdk_clipAreaButton">
87
+ <svg id="Layer_2" viewBox="0 0 24 24"><path d="M20.6,7.18c0-.58-.23-1.13-.65-1.54l-1.53-1.51c-.83-.83-2.29-.83-3.12,0l-1.31,1.3h0S4.88,14.41,4.88,14.41c-.12.12-.21.27-.26.44l-1.19,4.4c-.09.34,0,.7.26.95.19.18.44.29.7.29.09,0,.17-.01.26-.04l4.44-1.2c.16-.05.31-.13.44-.25l8.54-8.43h0s1.88-1.86,1.88-1.86c.06-.06.12-.12.17-.19h0c.31-.39.48-.86.48-1.36ZM8.72,18.12l-4.03,1.09,1.08-3.98L13.97,7.12l2.88,2.97-8.13,8.03ZM17.71,9.25l-2.88-2.97,1.32-1.3c.38-.38,1.04-.38,1.43,0l1.53,1.51c.19.18.29.43.29.69,0,.22-.08.43-.21.6h0s-.04.05-.08.08l-1.4,1.39Z"/></svg>
88
+ </div>
89
+ <div class="zasdk-tooltip">Edit</div>
90
+ </div>
91
+ <div class="zasdk_clipAreaButtonCnt zasdk-tooltip-container">
92
+ <div id="videoDelButton" class="zasdk_clipAreaButton">
93
+ <svg id="Layer_2" viewBox="0 0 24 24"><path d="M19.2,6.6h-3.4v-1c0-1.21-.99-2.2-2.2-2.2h-3.2c-1.21,0-2.2.99-2.2,2.2v1h-3.4c-.33,0-.6.27-.6.6s.27.6.6.6h1v10.6c0,1.21.99,2.2,2.2,2.2h8c1.21,0,2.2-.99,2.2-2.2V7.8h1c.33,0,.6-.27.6-.6s-.27-.6-.6-.6ZM9.4,5.6c0-.55.45-1,1-1h3.2c.55,0,1,.45,1,1v1h-5.2v-1ZM17,18.4c0,.55-.45,1-1,1h-8c-.55,0-1-.45-1-1V7.8h10v10.6ZM11,11.2v4.8c0,.33-.27.6-.6.6s-.6-.27-.6-.6v-4.8c0-.33.27-.6.6-.6s.6.27.6.6ZM14.2,11.2v4.8c0,.33-.27.6-.6.6s-.6-.27-.6-.6v-4.8c0-.33.27-.6.6-.6s.6.27.6.6Z"/></svg>
94
+ </div>
95
+ <div class="zasdk-tooltip">Delete</div>
96
+ </div>
97
+ </div>
98
+ <div class="zasdk_videoPrev">
99
+ <video id="previewVideoElemId" width="320" height="240" src=""></video>
100
+ </div>
101
+ </div>
102
+
103
+ <div class="zasdk-buttons">
104
+ <div class="zasdk-btncnt">
105
+ <div id="zasdkattachinfo" class="zasdkattachinf">Maximum 5 attachments with a total file size of 10MB is allowed</div>
106
+ <input type="file" id="zasdkFileInput" class="zasdk-file-input" multiple accept=".png, .jpg, .txt">
107
+ <label id="zasdkAttachBtn" class="zasdk-btn zasdk-attach-btn" for="zasdkFileInput">
108
+ <svg id="Layer_2" viewBox="0 0 24 24" style=" width: 25px; "><path d="M12,20.6c-2.63,0-4.78-2.14-4.78-4.78V6.78c0-1.87,1.52-3.38,3.38-3.38s3.38,1.52,3.38,3.38v9.04c0,1.1-.9,1.99-2,1.99s-1.99-.89-1.99-1.99V7.48c0-.33.27-.6.6-.6h0c.33,0,.6.27.6.6v8.35c0,.44.35.79.79.79s.79-.36.79-.79V6.78c0-1.2-.98-2.18-2.18-2.18s-2.18.98-2.18,2.18v9.04c0,1.97,1.6,3.58,3.58,3.58s3.58-1.6,3.58-3.58V6.78c0-.33.27-.6.6-.6s.6.27.6.6v9.04c0,2.63-2.14,4.78-4.78,4.78Z"/></svg>
109
+ <span>Attachments</span>
110
+ </label>
111
+ <div id="zasdkfilesizeinfo" class="zasdkfilesizeinf"></div>
112
+ <ul id="zasakfileList" class="zasakfilelstcnt"></ul>
113
+ </div>
114
+ </div>
115
+ </div>
116
+ <div class="zasdk-toggles-section">
117
+ <div class="zasdk-toggle-row">
118
+ <div class="zasdk-toggle-info">
119
+ <span class="zasdk-toggle-label">Include System Logs</span>
120
+ <span class="zasdk-view-link" id="zasdkViewLogsBtn">View</span>
121
+ </div>
122
+ <label class="zasdk-switch">
123
+ <input type="checkbox" id="zasdkIncludeLogToggle">
124
+ <span class="zasdk-slider"></span>
125
+ </label>
126
+ </div>
127
+ <div class="zasdk-toggle-separator"></div>
128
+ <div class="zasdk-toggle-row">
129
+ <div class="zasdk-toggle-info">
130
+ <span class="zasdk-toggle-label">Include Diagnostic Information</span>
131
+ <span class="zasdk-view-link" id="zasdkViewDiagBtn">View</span>
132
+ </div>
133
+ <label class="zasdk-switch">
134
+ <input type="checkbox" id="zasdkIncludeDiagToggle">
135
+ <span class="zasdk-slider"></span>
136
+ </label>
137
+ </div>
138
+ </div>
139
+ <div class="zasdk_submit_btncnt">
140
+ <div id="zasdksubmitstatus" class="zasdkstsmsg" style="display:none;" ></div>
141
+ <div id="zasdk_submit_btnsubcnt" class="zasdk_submit_btnsubcnt">
142
+ <input type="button" id="zasdk_submit_btn" class="zasdk-btn zasdk-send-btn zasdkbtndisableclr" value="Send">
143
+ </div>
144
+ </div>
145
+ <div id="zasdkDataViewer" class="zasdk-data-viewer" style="display:none">
146
+ <div class="zasdk-viewer-hdr">
147
+ <span id="zasdkViewerClose" class="zasdk-viewer-back"><svg viewBox="0 0 24 24" width="20" height="20" fill="none"><path d="M15 19l-7-7 7-7" stroke="#333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
148
+ <span id="zasdkViewerTitle" class="zasdk-viewer-title"></span>
149
+ </div>
150
+ <pre id="zasdkViewerContent" class="zasdk-viewer-content"></pre>
151
+ </div>
152
+ </div>`; // no i18n
153
+ const timerHtml = `<div id="zasdkrectimer" class="zasdk-timer-container zasdk-tooltip-container">
154
+ <div class="zasdk-timer-control" id="zasdkRecordButton"><div class="zasdk-timer-stopcricle"></div></div>
155
+ <span class="zasdk-timer-display" id="zasdkTimerDisplay">05:00</span>
156
+ <div class="zasdk-tooltip-top">Stop Recording</div>
157
+ </div>`; // no i18n
158
+
159
+ export { feedbackUIHtml, timerHtml };