appscms-tools-theme 2.7.3 → 2.7.4

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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -21
  3. data/README.md +50 -50
  4. data/_data/about/en/about.json +16 -16
  5. data/_data/blog/alertbar.yml +3 -3
  6. data/_data/blog/authors.yml +11 -11
  7. data/_data/blog/blog.yml +4 -4
  8. data/_data/blog/nav.json +13 -13
  9. data/_data/blog/share.yml +28 -28
  10. data/_data/calculators/en/biology-calc/bulb-spacing.json +78 -78
  11. data/_data/calculators/en/biology-calc/cat-chocolate-toxicity.json +52 -52
  12. data/_data/calculators/en/chemistry-calc/activation-energy.json +44 -44
  13. data/_data/calculators/en/finance-calc/401k.json +122 -122
  14. data/_data/contact/en/contact.json +38 -38
  15. data/_data/disclaimer/en/disclaimer.json +37 -37
  16. data/_data/download/en/download.json +35 -35
  17. data/_data/feature/en/3_shop_posters.json +351 -351
  18. data/_data/feature/en/allele-frequency.json +246 -246
  19. data/_data/feature/en/batch-conversion.json +77 -77
  20. data/_data/feature/en/compress-pdf.json +202 -202
  21. data/_data/feature/en/face-detection.json +52 -52
  22. data/_data/feature/en/split-pdf.json +115 -115
  23. data/_data/feature/en/theframe.json +56 -56
  24. data/_data/feature/hi/compress-pdf.json +81 -81
  25. data/_data/feature/tr/compress-pdf.json +80 -80
  26. data/_data/filecomparison/en/filecomparison.json +38 -38
  27. data/_data/fileinfo/en/fileinfo.json +15 -15
  28. data/_data/footer/en/data.json +166 -166
  29. data/_data/footer/hi/data.json +68 -68
  30. data/_data/footer/networksites.json +15 -15
  31. data/_data/header/en/data.json +174 -174
  32. data/_data/header/hi/data.json +144 -144
  33. data/_data/home/en/en.json +285 -285
  34. data/_data/home/en/photoeffects.json +23 -23
  35. data/_data/home/en/posters.json +323 -323
  36. data/_data/home/hi/hi.json +86 -86
  37. data/_data/home-1/en/en.json +229 -229
  38. data/_data/languagesupport/compress-pdf-langs.json +11 -11
  39. data/_data/languagesupport/index-langs.json +13 -13
  40. data/_data/photo-categories.json +104 -104
  41. data/_data/photoeffects.json +31 -31
  42. data/_data/privacy/en/privacyPolicy.json +265 -265
  43. data/_data/termAndCondition/en/termAndCondition.json +358 -358
  44. data/_includes/Rating/rating.html +92 -92
  45. data/_includes/Rating/structureddata.html +53 -53
  46. data/_includes/Usp/usp.html +95 -95
  47. data/_includes/adblocker.html +135 -135
  48. data/_includes/adsense/adsense.html +7 -7
  49. data/_includes/alternates/alternates.html +45 -45
  50. data/_includes/author_bio.html +16 -16
  51. data/_includes/authors/authors.html +67 -67
  52. data/_includes/batch-conversion.html +65 -65
  53. data/_includes/cssfile/links.html +11 -11
  54. data/_includes/custom-head.html +136 -136
  55. data/_includes/customblog/recentposts.html +67 -69
  56. data/_includes/customblog/relatedposts.html +203 -203
  57. data/_includes/disqus_comments.html +10 -10
  58. data/_includes/dropdown/langdropdown.html +22 -22
  59. data/_includes/feature.html +37 -37
  60. data/_includes/fileformat/Tabularcompariosn.html +158 -158
  61. data/_includes/fileformat/comparisonfiles.html +151 -151
  62. data/_includes/fileformat/fileformatdetail.html +101 -101
  63. data/_includes/fileformat/fileinfoformat.html +93 -93
  64. data/_includes/footer/index.html +534 -529
  65. data/_includes/google-analytics.html +22 -22
  66. data/_includes/head/index.html +235 -235
  67. data/_includes/header/blogHeader.html +34 -34
  68. data/_includes/header/index.html +188 -188
  69. data/_includes/languages/languages.html +60 -60
  70. data/_includes/monumetric/ads.html +57 -57
  71. data/_includes/monumetric/monumetric.html +57 -57
  72. data/_includes/monumetric/profitablecpmgate.html +51 -51
  73. data/_includes/nofiletransfer/nofiletransfer.html +38 -38
  74. data/_includes/paginationBlogPage.html +71 -71
  75. data/_includes/paginationPostPage.html +14 -14
  76. data/_includes/postauthorbio.html +17 -17
  77. data/_includes/postbox.html +31 -31
  78. data/_includes/script.html +63 -63
  79. data/_includes/section/alertbar.html +11 -11
  80. data/_includes/section/count.html +36 -36
  81. data/_includes/section/recent_posts.html +65 -67
  82. data/_includes/section/related_categories_post.html +198 -198
  83. data/_includes/share/socialshare.html +20 -20
  84. data/_includes/staticfooter.html +67 -67
  85. data/_layouts/aboutUs.html +34 -34
  86. data/_layouts/batch.html +102 -102
  87. data/_layouts/blog-1.html +83 -85
  88. data/_layouts/blog.html +94 -96
  89. data/_layouts/calculator.html +89 -89
  90. data/_layouts/categories.html +33 -33
  91. data/_layouts/contactUs.html +124 -124
  92. data/_layouts/default.html +1 -1
  93. data/_layouts/disclaimer.html +123 -123
  94. data/_layouts/download.html +299 -299
  95. data/_layouts/feature-1.html +320 -320
  96. data/_layouts/feature-download.html +308 -308
  97. data/_layouts/feature.html +258 -259
  98. data/_layouts/featureResultPage.html +58 -58
  99. data/_layouts/fileInfo.html +39 -39
  100. data/_layouts/filecomparison.html +85 -85
  101. data/_layouts/frame.html +434 -434
  102. data/_layouts/help.html +23 -23
  103. data/_layouts/home-1.html +229 -229
  104. data/_layouts/home.html +249 -250
  105. data/_layouts/homeResultPage.html +31 -31
  106. data/_layouts/imagekit.html +125 -125
  107. data/_layouts/page.html +5 -5
  108. data/_layouts/photo-effects-home.html +193 -193
  109. data/_layouts/post.html +177 -177
  110. data/_layouts/privacyPolicy.html +637 -637
  111. data/_layouts/termAndCondition.html +646 -646
  112. data/assets/cross.svg +4 -4
  113. data/assets/css/adblocker.css +187 -187
  114. data/assets/css/batch.css +437 -437
  115. data/assets/css/blog-1.css +65 -65
  116. data/assets/css/blog.css +491 -491
  117. data/assets/css/bootstrap.min.css +6 -6
  118. data/assets/css/calculators.css +47 -47
  119. data/assets/css/common.css +550 -550
  120. data/assets/css/feature-1.css +290 -290
  121. data/assets/css/filecomparison.css +25 -25
  122. data/assets/css/frame.css +781 -781
  123. data/assets/css/home-1.css +187 -187
  124. data/assets/css/imagekit.css +840 -840
  125. data/assets/css/tools.css +1282 -1282
  126. data/assets/facebook.svg +4 -4
  127. data/assets/images/abp.svg +41 -41
  128. data/assets/images/adblock.svg +266 -266
  129. data/assets/images/addimg.svg +2 -2
  130. data/assets/images/convert.svg +8 -8
  131. data/assets/images/safevideoconverter.svg +23 -23
  132. data/assets/images/uo.svg +41 -41
  133. data/assets/images/vectorpaint.svg +5 -5
  134. data/assets/instagram.svg +4 -4
  135. data/assets/js/TopScroll.js +8 -8
  136. data/assets/js/adBlocker.js +44 -44
  137. data/assets/js/ads.js +8 -8
  138. data/assets/js/append-div.js +10 -10
  139. data/assets/js/batch.js +229 -229
  140. data/assets/js/calculator-tooltip.js +3 -3
  141. data/assets/js/face-api.js +38064 -38064
  142. data/assets/js/face-detection.js +303 -303
  143. data/assets/js/featureResult.js +42 -42
  144. data/assets/js/frame.js +262 -262
  145. data/assets/js/googledrive.js +155 -155
  146. data/assets/js/homeResult.js +36 -36
  147. data/assets/js/manifest.json +16 -16
  148. data/assets/js/multiselect.js +157 -157
  149. data/assets/js/perspective.min.js +182 -182
  150. data/assets/js/photo-effects.json +84 -84
  151. data/assets/js/redirectResult.js +9 -9
  152. data/assets/js/testing-batch.js +39 -39
  153. data/assets/js/theme.js +44 -44
  154. data/assets/linkdin.svg +4 -4
  155. data/assets/noserverupload.svg +4 -4
  156. data/assets/pdf.svg +20 -20
  157. data/assets/secure.svg +43 -43
  158. data/assets/star.svg +4 -4
  159. data/assets/twitter.svg +4 -4
  160. data/assets/youtube.svg +4 -4
  161. metadata +7 -7
@@ -1,42 +1,42 @@
1
- let script = document.currentScript
2
- const params = new URLSearchParams(window.location.search)
3
- let type = params.get('fileName')
4
- let jsonFileName = atob(type)
5
- let folderName = script.dataset.foldername
6
- let fileName = jsonFileName
7
- let lang = script.dataset.lang
8
- let feature_h1 = document.querySelector('.feature-h1')
9
- let feature_h2 = document.querySelector('.feature-h2')
10
- let feature_img = document.querySelector('.features-img')
11
-
12
- const getSeodata = async () => {
13
- let URL = '/data' + '/' + folderName + '/' + lang + '/' + fileName + '.json'
14
- const data = await fetch(URL)
15
- const seoData = await data.json()
16
-
17
- feature_h1.innerHTML = seoData.H1
18
- feature_h2.innerHTML = seoData.H2
19
-
20
- document.head
21
- .querySelector('meta[property="og:title"]')
22
- .setAttribute('content', seoData.TITLE)
23
- document.head
24
- .querySelector('meta[name="description"]')
25
- .setAttribute('content', seoData.META)
26
- document.head
27
- .querySelector('meta[name="twitter:title"]')
28
- .setAttribute('content', seoData.TITLE)
29
- document.head
30
- .querySelector('meta[name="twitter:description"]')
31
- .setAttribute('content', seoData.META)
32
-
33
- if (seoData.img) {
34
- feature_img.src = seoData.img
35
- feature_img.setAttribute('alt', seoData.imgalt)
36
- feature_img.style.width = seoData.imgwidth
37
- feature_img.style.height = seoData.imgheight
38
- }
39
-
40
- document.title = seoData.TITLE
41
- }
42
- getSeodata()
1
+ let script = document.currentScript
2
+ const params = new URLSearchParams(window.location.search)
3
+ let type = params.get('fileName')
4
+ let jsonFileName = atob(type)
5
+ let folderName = script.dataset.foldername
6
+ let fileName = jsonFileName
7
+ let lang = script.dataset.lang
8
+ let feature_h1 = document.querySelector('.feature-h1')
9
+ let feature_h2 = document.querySelector('.feature-h2')
10
+ let feature_img = document.querySelector('.features-img')
11
+
12
+ const getSeodata = async () => {
13
+ let URL = '/data' + '/' + folderName + '/' + lang + '/' + fileName + '.json'
14
+ const data = await fetch(URL)
15
+ const seoData = await data.json()
16
+
17
+ feature_h1.innerHTML = seoData.H1
18
+ feature_h2.innerHTML = seoData.H2
19
+
20
+ document.head
21
+ .querySelector('meta[property="og:title"]')
22
+ .setAttribute('content', seoData.TITLE)
23
+ document.head
24
+ .querySelector('meta[name="description"]')
25
+ .setAttribute('content', seoData.META)
26
+ document.head
27
+ .querySelector('meta[name="twitter:title"]')
28
+ .setAttribute('content', seoData.TITLE)
29
+ document.head
30
+ .querySelector('meta[name="twitter:description"]')
31
+ .setAttribute('content', seoData.META)
32
+
33
+ if (seoData.img) {
34
+ feature_img.src = seoData.img
35
+ feature_img.setAttribute('alt', seoData.imgalt)
36
+ feature_img.style.width = seoData.imgwidth
37
+ feature_img.style.height = seoData.imgheight
38
+ }
39
+
40
+ document.title = seoData.TITLE
41
+ }
42
+ getSeodata()
data/assets/js/frame.js CHANGED
@@ -1,262 +1,262 @@
1
- const getScript = document.currentScript
2
- const pageTool = getScript.dataset.tool
3
- const lang = getScript.dataset.lang
4
- const inputBox = document.querySelector('#Inputbox')
5
- const fileDropBox = document.querySelector('.custom-box')
6
- const cropModal = document.querySelector('.crop-image-modal-container')
7
- const exampleModal = document.querySelector('.example-images-modal-container')
8
- const workspace = document.getElementById('workspace')
9
- const canvasPanel = document.getElementById('canvas-panel')
10
- const download = document.querySelector('#download-button')
11
- const form = document.querySelector('#effect-form')
12
- let files = []
13
- let cropWidth = null
14
- let cropHeight = null
15
- let cropper = null
16
- let cropInputWidth = null
17
- let index = 0
18
- let cropInputHeight = null
19
- let image = null
20
- const showLoader = () => {
21
- showLoading()
22
- }
23
- const closeLoader = () => {}
24
- const clickInput = (e) => {
25
- console.log(`#file-${e.dataset.index}`)
26
- document.querySelector(`#file-${e.dataset.index}`).click()
27
- }
28
- let featureData = null
29
-
30
- fetch('/assets/js/photo-effects.json')
31
- .then((response) => response.json())
32
- .then((data) => {
33
- featureData = data.find((i) => i.name === form.dataset.featureName)
34
- console.log(featureData)
35
- })
36
- const fileOnChange = (e) => {
37
- index = Number(e.dataset.index)
38
- let reader = new FileReader()
39
- reader.onload = (event) => {
40
- cropModal.style.display = 'flex'
41
- if (cropper === null) {
42
- cropImage(event.target.result, e.id)
43
- } else {
44
- updateCropper(event.target.result, e.id)
45
- }
46
- }
47
- reader.readAsDataURL(e.files[0])
48
- }
49
- const closeModal = () => {
50
- cropModal.style.display = 'none'
51
- }
52
- const closeExamplesModal = () => {
53
- exampleModal.style.display = 'none'
54
- }
55
- form.addEventListener('submit', (e) => {
56
- e.preventDefault()
57
- drawImage()
58
- })
59
- const drawInputImage = (ctx, item, indexValue) => {
60
- return new Promise((resolve, reject) => {
61
- let image = document.createElement('img')
62
- image.src = files[indexValue]
63
- image.onload = () => {
64
- ctx.save()
65
- image.width = Number(item.width)
66
- image.height = Number(item.height)
67
- if (item.filter) {
68
- ctx.filter = item.filter
69
- }
70
- if (item.rotate) {
71
- ctx.rotate((item.rotate * Math.PI) / 180)
72
- }
73
- let perspectiveKey = 'perspective' in item
74
- if (!perspectiveKey) {
75
- ctx.drawImage(
76
- image,
77
- Number(item.x),
78
- Number(item.y),
79
- image.width,
80
- image.height
81
- )
82
- }
83
- if (item.translate) {
84
- ctx.translate(item.translate.x, item.translate.y)
85
- }
86
- if (perspectiveKey) {
87
- let p = new Perspective(ctx, image)
88
- p.draw([
89
- [item.perspective.topLeft.x, item.perspective.topLeft.y],
90
- [item.perspective.topRight.x, item.perspective.topRight.y],
91
- [item.perspective.bottomRight.x, item.perspective.bottomRight.y],
92
- [item.perspective.bottomLeft.x, item.perspective.bottomLeft.y],
93
- ])
94
- }
95
-
96
- if (item.skew) {
97
- ctx.setTransform(1, item.skew.x, item.skew.y, 1, 0, 0)
98
- }
99
-
100
- ctx.restore()
101
- resolve()
102
- }
103
- })
104
- }
105
-
106
- const drawImage = () => {
107
- workspace.style.display = 'block'
108
- document.querySelector('#upper-panel').style.display = 'none'
109
- document.querySelector('#saving-data').style.display = 'flex'
110
- let img = new Image()
111
- img.src = featureData.effectImagePath
112
- var canvas = document.createElement('canvas')
113
- var ctx = canvas.getContext('2d')
114
- img.onload = () => {
115
- canvas.width = img.width
116
- canvas.height = img.height
117
- Promise.all(
118
- featureData.elements.map((item, indexValue) => {
119
- if (item.type === 'image') {
120
- return new Promise((resolve, reject) => {
121
- drawInputImage(ctx, item, indexValue, canvas).then(() => {
122
- resolve()
123
- })
124
- })
125
- }
126
- })
127
- ).then(() => {
128
- ctx.filter = 'none'
129
- ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
130
- featureData.elements.map((item, indexValue) => {
131
- if (item.type === 'text') {
132
- let myFont = new FontFace(item.font, `url(${item.fontPath})`)
133
- myFont.load().then(function (font) {
134
- ctx.save()
135
- document.fonts.add(font)
136
- let textValue = document.querySelector(`#${item.id}`).value
137
- if (textValue.length > 10 && item.fontSizeOption1) {
138
- item.fontSize = item.fontSizeOption1
139
- }
140
- if (textValue.length > 12 && item.fontSizeOption2) {
141
- item.fontSize = item.fontSizeOption2
142
- }
143
- if (textValue.length > 15 && item.fontSizeOption3) {
144
- item.fontSize = item.fontSizeOption3
145
- }
146
- if (textValue.length > 20 && item.fontSizeOption4) {
147
- item.fontSize = item.fontSizeOption4
148
- }
149
- ctx.font = `${item.fontSize}px ${item.font}`
150
- if (item.shadowColor) {
151
- ctx.shadowColor = `${item.shadowColor}`
152
- }
153
-
154
- if (item.shadowOffsetX) {
155
- ctx.shadowOffsetX = 3
156
- }
157
- if (item.shadowOffsetY) {
158
- ctx.shadowOffsetY = 3
159
- }
160
- if (item.shadowBlur) {
161
- ctx.shadowBlur = 2
162
- }
163
- if (item.rotate) {
164
- ctx.rotate((item.rotate * Math.PI) / 180)
165
- }
166
- ctx.textAlign = 'center'
167
- ctx.fillStyle = `${item.color}`
168
- ctx.fillText(textValue, item.x, item.y)
169
- ctx.restore()
170
- })
171
- }
172
- if (item.type === 'rectangle') {
173
- }
174
- })
175
- canvasPanel.innerHTML = ''
176
- document.querySelector('#saving-data').style.display = 'none'
177
- canvasPanel.appendChild(canvas)
178
- })
179
- }
180
- }
181
- const cropImage = (result, id) => {
182
- let image = new Image()
183
- image.onload = () => {
184
- let img = document.createElement('img')
185
- img.src = result
186
- img.id = 'image'
187
- document.querySelector('.crop-image-modal-body').appendChild(img)
188
- cropper = new Cropper(img, {
189
- viewMode: 3,
190
- ready() {
191
- let find = featureData.elements.find((i) => i.id === id)
192
- console.log(find)
193
- cropper.setAspectRatio(Number(find.width) / Number(find.height))
194
- cropModal.style.display = 'flex'
195
- this.cropper.crop()
196
- },
197
- crop(event) {
198
- cropWidth = Math.round(event.detail.width)
199
- cropHeight = Math.round(event.detail.height)
200
- },
201
- })
202
- }
203
- image.src = result
204
- }
205
- const updateCropper = (result, id) => {
206
- cropper.destroy()
207
- document.querySelector('.crop-image-modal-body').innerHTML = ''
208
- cropImage(result, id)
209
- }
210
- document.querySelector('#crop').addEventListener('click', () => {
211
- let cropperImg = cropper
212
- .getCroppedCanvas({
213
- width: cropWidth,
214
- height: cropHeight,
215
- })
216
- .toDataURL()
217
- files[index - 1] = cropperImg
218
- document.querySelector(`#image-pre-${index}`).src = cropperImg
219
- document.querySelector(`#image-pre-${index}`).style.display = 'block'
220
- document.querySelector(`#cam-${index}`).style.display = 'none'
221
- cropModal.style.display = 'none'
222
- })
223
- const openExamplesModal = () => {
224
- exampleModal.style.display = 'flex'
225
- }
226
- let inputFile = ''
227
- const handleFile = (file) => {
228
- cropModal.style.display = 'flex'
229
- document.querySelector('#file-loader').style.display = 'flex'
230
- document.querySelector('.file-input').style.display = 'none'
231
- inputFile = file
232
- if (file) {
233
- const reader = new FileReader()
234
- reader.onload = (e) => {
235
- if (e.target.result) {
236
- cropImage(e.target.result)
237
- }
238
- }
239
- reader.readAsDataURL(file)
240
- }
241
- }
242
- const showLoading = () => {
243
- document.querySelector('#file-loader').style.display = 'flex'
244
- document.querySelector('.file-input').style.display = 'none'
245
- }
246
- const stopLoading = () => {
247
- fileDropBox.style.display = 'none'
248
- }
249
- download.addEventListener('click', () => {
250
- let canvas = document.querySelector('canvas')
251
- let url = canvas.toDataURL(`image/png`)
252
- let a = document.createElement('a')
253
- a.href = url
254
- a.download = `safeimagekit-photo-effect-image.png`
255
- document.body.appendChild(a)
256
- a.click()
257
- if (lang === 'en') {
258
- window.location.href = `/download?tool=${pageTool}`
259
- } else {
260
- window.location.href = `/${lang}/download?tool=${pageTool}`
261
- }
262
- })
1
+ const getScript = document.currentScript
2
+ const pageTool = getScript.dataset.tool
3
+ const lang = getScript.dataset.lang
4
+ const inputBox = document.querySelector('#Inputbox')
5
+ const fileDropBox = document.querySelector('.custom-box')
6
+ const cropModal = document.querySelector('.crop-image-modal-container')
7
+ const exampleModal = document.querySelector('.example-images-modal-container')
8
+ const workspace = document.getElementById('workspace')
9
+ const canvasPanel = document.getElementById('canvas-panel')
10
+ const download = document.querySelector('#download-button')
11
+ const form = document.querySelector('#effect-form')
12
+ let files = []
13
+ let cropWidth = null
14
+ let cropHeight = null
15
+ let cropper = null
16
+ let cropInputWidth = null
17
+ let index = 0
18
+ let cropInputHeight = null
19
+ let image = null
20
+ const showLoader = () => {
21
+ showLoading()
22
+ }
23
+ const closeLoader = () => {}
24
+ const clickInput = (e) => {
25
+ console.log(`#file-${e.dataset.index}`)
26
+ document.querySelector(`#file-${e.dataset.index}`).click()
27
+ }
28
+ let featureData = null
29
+
30
+ fetch('/assets/js/photo-effects.json')
31
+ .then((response) => response.json())
32
+ .then((data) => {
33
+ featureData = data.find((i) => i.name === form.dataset.featureName)
34
+ console.log(featureData)
35
+ })
36
+ const fileOnChange = (e) => {
37
+ index = Number(e.dataset.index)
38
+ let reader = new FileReader()
39
+ reader.onload = (event) => {
40
+ cropModal.style.display = 'flex'
41
+ if (cropper === null) {
42
+ cropImage(event.target.result, e.id)
43
+ } else {
44
+ updateCropper(event.target.result, e.id)
45
+ }
46
+ }
47
+ reader.readAsDataURL(e.files[0])
48
+ }
49
+ const closeModal = () => {
50
+ cropModal.style.display = 'none'
51
+ }
52
+ const closeExamplesModal = () => {
53
+ exampleModal.style.display = 'none'
54
+ }
55
+ form.addEventListener('submit', (e) => {
56
+ e.preventDefault()
57
+ drawImage()
58
+ })
59
+ const drawInputImage = (ctx, item, indexValue) => {
60
+ return new Promise((resolve, reject) => {
61
+ let image = document.createElement('img')
62
+ image.src = files[indexValue]
63
+ image.onload = () => {
64
+ ctx.save()
65
+ image.width = Number(item.width)
66
+ image.height = Number(item.height)
67
+ if (item.filter) {
68
+ ctx.filter = item.filter
69
+ }
70
+ if (item.rotate) {
71
+ ctx.rotate((item.rotate * Math.PI) / 180)
72
+ }
73
+ let perspectiveKey = 'perspective' in item
74
+ if (!perspectiveKey) {
75
+ ctx.drawImage(
76
+ image,
77
+ Number(item.x),
78
+ Number(item.y),
79
+ image.width,
80
+ image.height
81
+ )
82
+ }
83
+ if (item.translate) {
84
+ ctx.translate(item.translate.x, item.translate.y)
85
+ }
86
+ if (perspectiveKey) {
87
+ let p = new Perspective(ctx, image)
88
+ p.draw([
89
+ [item.perspective.topLeft.x, item.perspective.topLeft.y],
90
+ [item.perspective.topRight.x, item.perspective.topRight.y],
91
+ [item.perspective.bottomRight.x, item.perspective.bottomRight.y],
92
+ [item.perspective.bottomLeft.x, item.perspective.bottomLeft.y],
93
+ ])
94
+ }
95
+
96
+ if (item.skew) {
97
+ ctx.setTransform(1, item.skew.x, item.skew.y, 1, 0, 0)
98
+ }
99
+
100
+ ctx.restore()
101
+ resolve()
102
+ }
103
+ })
104
+ }
105
+
106
+ const drawImage = () => {
107
+ workspace.style.display = 'block'
108
+ document.querySelector('#upper-panel').style.display = 'none'
109
+ document.querySelector('#saving-data').style.display = 'flex'
110
+ let img = new Image()
111
+ img.src = featureData.effectImagePath
112
+ var canvas = document.createElement('canvas')
113
+ var ctx = canvas.getContext('2d')
114
+ img.onload = () => {
115
+ canvas.width = img.width
116
+ canvas.height = img.height
117
+ Promise.all(
118
+ featureData.elements.map((item, indexValue) => {
119
+ if (item.type === 'image') {
120
+ return new Promise((resolve, reject) => {
121
+ drawInputImage(ctx, item, indexValue, canvas).then(() => {
122
+ resolve()
123
+ })
124
+ })
125
+ }
126
+ })
127
+ ).then(() => {
128
+ ctx.filter = 'none'
129
+ ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
130
+ featureData.elements.map((item, indexValue) => {
131
+ if (item.type === 'text') {
132
+ let myFont = new FontFace(item.font, `url(${item.fontPath})`)
133
+ myFont.load().then(function (font) {
134
+ ctx.save()
135
+ document.fonts.add(font)
136
+ let textValue = document.querySelector(`#${item.id}`).value
137
+ if (textValue.length > 10 && item.fontSizeOption1) {
138
+ item.fontSize = item.fontSizeOption1
139
+ }
140
+ if (textValue.length > 12 && item.fontSizeOption2) {
141
+ item.fontSize = item.fontSizeOption2
142
+ }
143
+ if (textValue.length > 15 && item.fontSizeOption3) {
144
+ item.fontSize = item.fontSizeOption3
145
+ }
146
+ if (textValue.length > 20 && item.fontSizeOption4) {
147
+ item.fontSize = item.fontSizeOption4
148
+ }
149
+ ctx.font = `${item.fontSize}px ${item.font}`
150
+ if (item.shadowColor) {
151
+ ctx.shadowColor = `${item.shadowColor}`
152
+ }
153
+
154
+ if (item.shadowOffsetX) {
155
+ ctx.shadowOffsetX = 3
156
+ }
157
+ if (item.shadowOffsetY) {
158
+ ctx.shadowOffsetY = 3
159
+ }
160
+ if (item.shadowBlur) {
161
+ ctx.shadowBlur = 2
162
+ }
163
+ if (item.rotate) {
164
+ ctx.rotate((item.rotate * Math.PI) / 180)
165
+ }
166
+ ctx.textAlign = 'center'
167
+ ctx.fillStyle = `${item.color}`
168
+ ctx.fillText(textValue, item.x, item.y)
169
+ ctx.restore()
170
+ })
171
+ }
172
+ if (item.type === 'rectangle') {
173
+ }
174
+ })
175
+ canvasPanel.innerHTML = ''
176
+ document.querySelector('#saving-data').style.display = 'none'
177
+ canvasPanel.appendChild(canvas)
178
+ })
179
+ }
180
+ }
181
+ const cropImage = (result, id) => {
182
+ let image = new Image()
183
+ image.onload = () => {
184
+ let img = document.createElement('img')
185
+ img.src = result
186
+ img.id = 'image'
187
+ document.querySelector('.crop-image-modal-body').appendChild(img)
188
+ cropper = new Cropper(img, {
189
+ viewMode: 3,
190
+ ready() {
191
+ let find = featureData.elements.find((i) => i.id === id)
192
+ console.log(find)
193
+ cropper.setAspectRatio(Number(find.width) / Number(find.height))
194
+ cropModal.style.display = 'flex'
195
+ this.cropper.crop()
196
+ },
197
+ crop(event) {
198
+ cropWidth = Math.round(event.detail.width)
199
+ cropHeight = Math.round(event.detail.height)
200
+ },
201
+ })
202
+ }
203
+ image.src = result
204
+ }
205
+ const updateCropper = (result, id) => {
206
+ cropper.destroy()
207
+ document.querySelector('.crop-image-modal-body').innerHTML = ''
208
+ cropImage(result, id)
209
+ }
210
+ document.querySelector('#crop').addEventListener('click', () => {
211
+ let cropperImg = cropper
212
+ .getCroppedCanvas({
213
+ width: cropWidth,
214
+ height: cropHeight,
215
+ })
216
+ .toDataURL()
217
+ files[index - 1] = cropperImg
218
+ document.querySelector(`#image-pre-${index}`).src = cropperImg
219
+ document.querySelector(`#image-pre-${index}`).style.display = 'block'
220
+ document.querySelector(`#cam-${index}`).style.display = 'none'
221
+ cropModal.style.display = 'none'
222
+ })
223
+ const openExamplesModal = () => {
224
+ exampleModal.style.display = 'flex'
225
+ }
226
+ let inputFile = ''
227
+ const handleFile = (file) => {
228
+ cropModal.style.display = 'flex'
229
+ document.querySelector('#file-loader').style.display = 'flex'
230
+ document.querySelector('.file-input').style.display = 'none'
231
+ inputFile = file
232
+ if (file) {
233
+ const reader = new FileReader()
234
+ reader.onload = (e) => {
235
+ if (e.target.result) {
236
+ cropImage(e.target.result)
237
+ }
238
+ }
239
+ reader.readAsDataURL(file)
240
+ }
241
+ }
242
+ const showLoading = () => {
243
+ document.querySelector('#file-loader').style.display = 'flex'
244
+ document.querySelector('.file-input').style.display = 'none'
245
+ }
246
+ const stopLoading = () => {
247
+ fileDropBox.style.display = 'none'
248
+ }
249
+ download.addEventListener('click', () => {
250
+ let canvas = document.querySelector('canvas')
251
+ let url = canvas.toDataURL(`image/png`)
252
+ let a = document.createElement('a')
253
+ a.href = url
254
+ a.download = `safeimagekit-photo-effect-image.png`
255
+ document.body.appendChild(a)
256
+ a.click()
257
+ if (lang === 'en') {
258
+ window.location.href = `/download?tool=${pageTool}`
259
+ } else {
260
+ window.location.href = `/${lang}/download?tool=${pageTool}`
261
+ }
262
+ })