appscms-tools-theme 2.7.3 → 2.7.4

Sign up to get free protection for your applications and to get access to all the features.
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
+ })