sveltekit-ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/README.md +23 -0
  2. package/dist/Components/Alert/index.svelte +88 -0
  3. package/dist/Components/Alert/index.svelte.js +101 -0
  4. package/dist/Components/ArrowToggle/index.svelte +62 -0
  5. package/dist/Components/Attachment/index.svelte +69 -0
  6. package/dist/Components/Attachment/index.svelte.js +119 -0
  7. package/dist/Components/Audio/index.svelte +193 -0
  8. package/dist/Components/Audio/index.svelte.js +463 -0
  9. package/dist/Components/AudioEditor/index.svelte +253 -0
  10. package/dist/Components/AudioEditor/index.svelte.js +973 -0
  11. package/dist/Components/AudioEditor/samples/alloy-voice-sample.mp3 +0 -0
  12. package/dist/Components/AudioEditor/samples/echo-voice-sample.mp3 +0 -0
  13. package/dist/Components/AudioEditor/samples/fable-voice-sample.mp3 +0 -0
  14. package/dist/Components/AudioEditor/samples/nova-voice-sample.mp3 +0 -0
  15. package/dist/Components/AudioEditor/samples/onyx-voice-sample.mp3 +0 -0
  16. package/dist/Components/AudioEditor/samples/shimmer-voice-sample.mp3 +0 -0
  17. package/dist/Components/AuthCodeInput/index.svelte +85 -0
  18. package/dist/Components/AuthCodeInput/index.svelte.js +95 -0
  19. package/dist/Components/Breadcrumbs/index.svelte +27 -0
  20. package/dist/Components/Breadcrumbs/index.svelte.js +88 -0
  21. package/dist/Components/Button/index.svelte +721 -0
  22. package/dist/Components/Button/index.svelte.js +375 -0
  23. package/dist/Components/Chart/Klines/index.svelte +87 -0
  24. package/dist/Components/Chart/index.svelte +226 -0
  25. package/dist/Components/Chart/index.svelte.js +1084 -0
  26. package/dist/Components/ChartInput/DisplayNav/Klines/index.svelte +150 -0
  27. package/dist/Components/ChartInput/DisplayNav/Lines/index.svelte +45 -0
  28. package/dist/Components/ChartInput/DisplayNav/index.svelte +297 -0
  29. package/dist/Components/ChartInput/EditPanel/index.svelte +155 -0
  30. package/dist/Components/ChartInput/index.svelte +21 -0
  31. package/dist/Components/ChartInput/index.svelte.js +671 -0
  32. package/dist/Components/Checkbox/index.svelte +411 -0
  33. package/dist/Components/Checkbox/index.svelte.js +178 -0
  34. package/dist/Components/Code/index.svelte +23 -0
  35. package/dist/Components/Code/index.svelte.js +34 -0
  36. package/dist/Components/Color/index.svelte +51 -0
  37. package/dist/Components/Color/index.svelte.js +31 -0
  38. package/dist/Components/ColorInput/ChromaPicker/index.svelte +50 -0
  39. package/dist/Components/ColorInput/ColorPalette/index.svelte +62 -0
  40. package/dist/Components/ColorInput/OpacityPicker/index.svelte +68 -0
  41. package/dist/Components/ColorInput/ShowcasePicker/index.svelte +136 -0
  42. package/dist/Components/ColorInput/index.svelte +70 -0
  43. package/dist/Components/ColorInput/index.svelte.js +383 -0
  44. package/dist/Components/ConditionsInput/index.svelte +46 -0
  45. package/dist/Components/ConditionsInput/index.svelte.js +201 -0
  46. package/dist/Components/Confetti/index.svelte +98 -0
  47. package/dist/Components/Confetti/index.svelte.js +94 -0
  48. package/dist/Components/Content/index.svelte +471 -0
  49. package/dist/Components/Content/index.svelte.js +903 -0
  50. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Audio/index.svelte +31 -0
  51. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Audio/index.svelte.js +258 -0
  52. package/dist/Components/ContentInput/AttributesInput/CustomConfig/AudioAdvanced/index.svelte +31 -0
  53. package/dist/Components/ContentInput/AttributesInput/CustomConfig/AudioAdvanced/index.svelte.js +258 -0
  54. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Dropdown/index.svelte +58 -0
  55. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Dropdown/index.svelte.js +210 -0
  56. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Image/index.svelte +28 -0
  57. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Image/index.svelte.js +224 -0
  58. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Number/index.svelte +44 -0
  59. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Number/index.svelte.js +273 -0
  60. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Qr/index.svelte +41 -0
  61. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Qr/index.svelte.js +203 -0
  62. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Slider/index.svelte +19 -0
  63. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Slider/index.svelte.js +119 -0
  64. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TableAdvanced/index.svelte +60 -0
  65. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TableAdvanced/index.svelte.js +546 -0
  66. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Tag/index.svelte +47 -0
  67. package/dist/Components/ContentInput/AttributesInput/CustomConfig/Tag/index.svelte.js +185 -0
  68. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TextInput/index.svelte +35 -0
  69. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TextInput/index.svelte.js +224 -0
  70. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TimeInput/index.svelte +20 -0
  71. package/dist/Components/ContentInput/AttributesInput/CustomConfig/TimeInput/index.svelte.js +87 -0
  72. package/dist/Components/ContentInput/AttributesInput/DefinedTypeInput/index.svelte +25 -0
  73. package/dist/Components/ContentInput/AttributesInput/DefinedTypeInput/index.svelte.js +101 -0
  74. package/dist/Components/ContentInput/AttributesInput/index.svelte +338 -0
  75. package/dist/Components/ContentInput/AttributesInput/index.svelte.js +1446 -0
  76. package/dist/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte +64 -0
  77. package/dist/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte.js +97 -0
  78. package/dist/Components/ContentInput/ContentPanelBuilder/ElementList/index.svelte +122 -0
  79. package/dist/Components/ContentInput/ContentPanelBuilder/index.svelte +41 -0
  80. package/dist/Components/ContentInput/index.svelte +50 -0
  81. package/dist/Components/ContentInput/index.svelte.js +1066 -0
  82. package/dist/Components/CronInput/index.svelte +78 -0
  83. package/dist/Components/CronInput/index.svelte.js +199 -0
  84. package/dist/Components/DataTypeInput/index.svelte +174 -0
  85. package/dist/Components/DataTypeInput/index.svelte.js +568 -0
  86. package/dist/Components/Dropdown/index.svelte +116 -0
  87. package/dist/Components/Dropdown/index.svelte.js +403 -0
  88. package/dist/Components/EmailAddress/index.svelte +22 -0
  89. package/dist/Components/EmailAddress/index.svelte.js +45 -0
  90. package/dist/Components/ErrorX/index.svelte +58 -0
  91. package/dist/Components/Eye/index.svelte +57 -0
  92. package/dist/Components/FileInput/index.svelte +146 -0
  93. package/dist/Components/FileInput/index.svelte.js +226 -0
  94. package/dist/Components/FunctionInput/Node/helpers/DefinedTargetInput/index.svelte +110 -0
  95. package/dist/Components/FunctionInput/Node/helpers/Field/index.svelte +109 -0
  96. package/dist/Components/FunctionInput/Node/helpers/Field/index.svelte.js +208 -0
  97. package/dist/Components/FunctionInput/Node/helpers/InlineDropArea/index.svelte +97 -0
  98. package/dist/Components/FunctionInput/Node/helpers/InlineDropArea/index.svelte.js +105 -0
  99. package/dist/Components/FunctionInput/Node/helpers/ObjectInput/index.svelte +198 -0
  100. package/dist/Components/FunctionInput/Node/helpers/StackArea/index.svelte +169 -0
  101. package/dist/Components/FunctionInput/Node/helpers/StackArea/index.svelte.js +152 -0
  102. package/dist/Components/FunctionInput/Node/index.svelte +144 -0
  103. package/dist/Components/FunctionInput/Node/index.svelte.js +130 -0
  104. package/dist/Components/FunctionInput/index.svelte +356 -0
  105. package/dist/Components/FunctionInput/index.svelte.js +1215 -0
  106. package/dist/Components/Hamburger/index.svelte +99 -0
  107. package/dist/Components/HorizScrollBox/index.svelte +145 -0
  108. package/dist/Components/Icon/index.svelte +412 -0
  109. package/dist/Components/Icon/index.svelte.js +117 -0
  110. package/dist/Components/IconInput/index.svelte +77 -0
  111. package/dist/Components/IconInput/index.svelte.js +260 -0
  112. package/dist/Components/Image/index.svelte +121 -0
  113. package/dist/Components/Image/index.svelte.js +114 -0
  114. package/dist/Components/ImageEditor/Image/CropBox/index.svelte +165 -0
  115. package/dist/Components/ImageEditor/Image/index.svelte +104 -0
  116. package/dist/Components/ImageEditor/Panels/AI/index.svelte +36 -0
  117. package/dist/Components/ImageEditor/Panels/Crop/index.svelte +96 -0
  118. package/dist/Components/ImageEditor/Panels/File/QualityPicker/index.svelte +124 -0
  119. package/dist/Components/ImageEditor/Panels/File/index.svelte +74 -0
  120. package/dist/Components/ImageEditor/Panels/Filters/index.svelte +46 -0
  121. package/dist/Components/ImageEditor/Panels/Resize/index.svelte +58 -0
  122. package/dist/Components/ImageEditor/index.svelte +91 -0
  123. package/dist/Components/ImageEditor/index.svelte.js +1907 -0
  124. package/dist/Components/ImageSlider/index.svelte +124 -0
  125. package/dist/Components/ImageSlider/index.svelte.js +99 -0
  126. package/dist/Components/InfoBox/index.svelte +89 -0
  127. package/dist/Components/Json/Nested/index.svelte +157 -0
  128. package/dist/Components/Json/index.svelte +60 -0
  129. package/dist/Components/Json/index.svelte.js +594 -0
  130. package/dist/Components/LabeledItem/index.svelte +102 -0
  131. package/dist/Components/Layout/NavBar/FullNav/index.svelte +53 -0
  132. package/dist/Components/Layout/NavBar/NavGuts/index.svelte +87 -0
  133. package/dist/Components/Layout/NavBar/index.svelte +72 -0
  134. package/dist/Components/Layout/index.svelte +149 -0
  135. package/dist/Components/Layout/index.svelte.js +362 -0
  136. package/dist/Components/Link/index.svelte +46 -0
  137. package/dist/Components/Link/index.svelte.js +126 -0
  138. package/dist/Components/LoadingSuccessDiv/index.svelte +51 -0
  139. package/dist/Components/LoadingWheel/index.svelte +38 -0
  140. package/dist/Components/Location/index.svelte +85 -0
  141. package/dist/Components/Location/index.svelte.js +292 -0
  142. package/dist/Components/LocationInput/index.svelte +200 -0
  143. package/dist/Components/LocationInput/index.svelte.js +950 -0
  144. package/dist/Components/Number/index.svelte +47 -0
  145. package/dist/Components/Number/index.svelte.js +151 -0
  146. package/dist/Components/PhoneCountryCode/index.svelte +7 -0
  147. package/dist/Components/PhoneCountryCode/index.svelte.js +260 -0
  148. package/dist/Components/PhoneNumber/index.svelte +22 -0
  149. package/dist/Components/PhoneNumber/index.svelte.js +41 -0
  150. package/dist/Components/Popover/index.svelte +396 -0
  151. package/dist/Components/Popover/index.svelte.js +319 -0
  152. package/dist/Components/Qr/index.svelte +60 -0
  153. package/dist/Components/Qr/index.svelte.js +295 -0
  154. package/dist/Components/Slider/index.svelte +231 -0
  155. package/dist/Components/Slider/index.svelte.js +468 -0
  156. package/dist/Components/Spacer/index.svelte +41 -0
  157. package/dist/Components/StoragePicker/DisplayFile/index.svelte +15 -0
  158. package/dist/Components/StoragePicker/index.svelte +192 -0
  159. package/dist/Components/StoragePicker/index.svelte.js +593 -0
  160. package/dist/Components/SuccessCheck/index.svelte +56 -0
  161. package/dist/Components/TableAdvanced/ColumnInput/index.svelte +110 -0
  162. package/dist/Components/TableAdvanced/ColumnInput/index.svelte.js +494 -0
  163. package/dist/Components/TableAdvanced/FilterInput/index.svelte +54 -0
  164. package/dist/Components/TableAdvanced/FilterInput/index.svelte.js +247 -0
  165. package/dist/Components/TableAdvanced/Pagination/index.svelte +43 -0
  166. package/dist/Components/TableAdvanced/Pagination/index.svelte.js +97 -0
  167. package/dist/Components/TableAdvanced/SortByInput/index.svelte +79 -0
  168. package/dist/Components/TableAdvanced/SortByInput/index.svelte.js +191 -0
  169. package/dist/Components/TableAdvanced/index.svelte +268 -0
  170. package/dist/Components/TableAdvanced/index.svelte.js +1422 -0
  171. package/dist/Components/Tag/index.svelte +45 -0
  172. package/dist/Components/Tag/index.svelte.js +76 -0
  173. package/dist/Components/TextArrayInput/index.svelte +108 -0
  174. package/dist/Components/TextArrayInput/index.svelte.js +239 -0
  175. package/dist/Components/TextInput/PasswordTooltip/index.svelte +89 -0
  176. package/dist/Components/TextInput/index.svelte +223 -0
  177. package/dist/Components/TextInput/index.svelte.js +434 -0
  178. package/dist/Components/Time/index.svelte +7 -0
  179. package/dist/Components/Time/index.svelte.js +38 -0
  180. package/dist/Components/TimeInput/NumberToggler/index.svelte +34 -0
  181. package/dist/Components/TimeInput/NumberToggler/index.svelte.js +79 -0
  182. package/dist/Components/TimeInput/index.js +699 -0
  183. package/dist/Components/TimeInput/index.svelte +211 -0
  184. package/dist/Components/TimeInput/index.svelte.js +638 -0
  185. package/dist/Components/Tooltip/index.svelte +143 -0
  186. package/dist/Components/TransparentBackground/index.svelte +153 -0
  187. package/dist/Components/TypingDots/index.svelte +84 -0
  188. package/dist/Components/VariablePathInput/index.svelte +109 -0
  189. package/dist/Components/VariablePathInput/index.svelte.js +250 -0
  190. package/dist/Components/VideoTBD/index.svelte +100 -0
  191. package/dist/Components/XFollow/index.svelte +42 -0
  192. package/dist/Components/XPost/index.svelte +52 -0
  193. package/dist/Components/XPost/index.svelte.js +64 -0
  194. package/dist/Components/YoutubeVideo/index.svelte +73 -0
  195. package/dist/Components/YoutubeVideo/index.svelte.js +54 -0
  196. package/dist/actions/draggable.js +49 -0
  197. package/dist/actions/intersection_observer.js +24 -0
  198. package/dist/actions/no_spaces.js +33 -0
  199. package/dist/actions/numbers_only.js +26 -0
  200. package/dist/actions/scroll_y.js +28 -0
  201. package/dist/actions/stop_scroll_propagation_y.js +42 -0
  202. package/dist/actions/swipe_handler.js +295 -0
  203. package/dist/client/astc_formatting/index.js +1167 -0
  204. package/dist/client/docs/index.js +7612 -0
  205. package/dist/client/index.js +729 -0
  206. package/dist/client/types/index.js +4681 -0
  207. package/dist/index.js +161 -0
  208. package/dist/style.css +682 -0
  209. package/package.json +44 -0
  210. package/src/app.html +17 -0
  211. package/src/hooks.server.js +7 -0
  212. package/src/lib/Components/Alert/index.svelte +88 -0
  213. package/src/lib/Components/Alert/index.svelte.js +101 -0
  214. package/src/lib/Components/ArrowToggle/index.svelte +62 -0
  215. package/src/lib/Components/Attachment/index.svelte +69 -0
  216. package/src/lib/Components/Attachment/index.svelte.js +119 -0
  217. package/src/lib/Components/Audio/index.svelte +193 -0
  218. package/src/lib/Components/Audio/index.svelte.js +463 -0
  219. package/src/lib/Components/AudioEditor/index.svelte +253 -0
  220. package/src/lib/Components/AudioEditor/index.svelte.js +973 -0
  221. package/src/lib/Components/AudioEditor/samples/alloy-voice-sample.mp3 +0 -0
  222. package/src/lib/Components/AudioEditor/samples/echo-voice-sample.mp3 +0 -0
  223. package/src/lib/Components/AudioEditor/samples/fable-voice-sample.mp3 +0 -0
  224. package/src/lib/Components/AudioEditor/samples/nova-voice-sample.mp3 +0 -0
  225. package/src/lib/Components/AudioEditor/samples/onyx-voice-sample.mp3 +0 -0
  226. package/src/lib/Components/AudioEditor/samples/shimmer-voice-sample.mp3 +0 -0
  227. package/src/lib/Components/AuthCodeInput/index.svelte +85 -0
  228. package/src/lib/Components/AuthCodeInput/index.svelte.js +95 -0
  229. package/src/lib/Components/Breadcrumbs/index.svelte +27 -0
  230. package/src/lib/Components/Breadcrumbs/index.svelte.js +88 -0
  231. package/src/lib/Components/Button/index.svelte +721 -0
  232. package/src/lib/Components/Button/index.svelte.js +375 -0
  233. package/src/lib/Components/Chart/Klines/index.svelte +87 -0
  234. package/src/lib/Components/Chart/index.svelte +226 -0
  235. package/src/lib/Components/Chart/index.svelte.js +1084 -0
  236. package/src/lib/Components/ChartInput/DisplayNav/Klines/index.svelte +150 -0
  237. package/src/lib/Components/ChartInput/DisplayNav/Lines/index.svelte +45 -0
  238. package/src/lib/Components/ChartInput/DisplayNav/index.svelte +297 -0
  239. package/src/lib/Components/ChartInput/EditPanel/index.svelte +155 -0
  240. package/src/lib/Components/ChartInput/index.svelte +21 -0
  241. package/src/lib/Components/ChartInput/index.svelte.js +671 -0
  242. package/src/lib/Components/Checkbox/index.svelte +411 -0
  243. package/src/lib/Components/Checkbox/index.svelte.js +178 -0
  244. package/src/lib/Components/Code/index.svelte +23 -0
  245. package/src/lib/Components/Code/index.svelte.js +34 -0
  246. package/src/lib/Components/Color/index.svelte +51 -0
  247. package/src/lib/Components/Color/index.svelte.js +31 -0
  248. package/src/lib/Components/ColorInput/ChromaPicker/index.svelte +50 -0
  249. package/src/lib/Components/ColorInput/ColorPalette/index.svelte +62 -0
  250. package/src/lib/Components/ColorInput/OpacityPicker/index.svelte +68 -0
  251. package/src/lib/Components/ColorInput/ShowcasePicker/index.svelte +136 -0
  252. package/src/lib/Components/ColorInput/index.svelte +70 -0
  253. package/src/lib/Components/ColorInput/index.svelte.js +383 -0
  254. package/src/lib/Components/ConditionsInput/index.svelte +46 -0
  255. package/src/lib/Components/ConditionsInput/index.svelte.js +201 -0
  256. package/src/lib/Components/Confetti/index.svelte +98 -0
  257. package/src/lib/Components/Confetti/index.svelte.js +94 -0
  258. package/src/lib/Components/Content/index.svelte +471 -0
  259. package/src/lib/Components/Content/index.svelte.js +903 -0
  260. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Audio/index.svelte +31 -0
  261. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Audio/index.svelte.js +258 -0
  262. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/AudioAdvanced/index.svelte +31 -0
  263. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/AudioAdvanced/index.svelte.js +258 -0
  264. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Dropdown/index.svelte +58 -0
  265. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Dropdown/index.svelte.js +210 -0
  266. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Image/index.svelte +28 -0
  267. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Image/index.svelte.js +224 -0
  268. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Number/index.svelte +44 -0
  269. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Number/index.svelte.js +273 -0
  270. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Qr/index.svelte +41 -0
  271. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Qr/index.svelte.js +203 -0
  272. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Slider/index.svelte +19 -0
  273. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Slider/index.svelte.js +119 -0
  274. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/TableAdvanced/index.svelte +60 -0
  275. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/TableAdvanced/index.svelte.js +546 -0
  276. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Tag/index.svelte +47 -0
  277. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/Tag/index.svelte.js +185 -0
  278. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/TextInput/index.svelte +35 -0
  279. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/TextInput/index.svelte.js +224 -0
  280. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/TimeInput/index.svelte +20 -0
  281. package/src/lib/Components/ContentInput/AttributesInput/CustomConfig/TimeInput/index.svelte.js +87 -0
  282. package/src/lib/Components/ContentInput/AttributesInput/DefinedTypeInput/index.svelte +25 -0
  283. package/src/lib/Components/ContentInput/AttributesInput/DefinedTypeInput/index.svelte.js +101 -0
  284. package/src/lib/Components/ContentInput/AttributesInput/index.svelte +338 -0
  285. package/src/lib/Components/ContentInput/AttributesInput/index.svelte.js +1446 -0
  286. package/src/lib/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte +64 -0
  287. package/src/lib/Components/ContentInput/ContentPanelBuilder/AddElement/index.svelte.js +97 -0
  288. package/src/lib/Components/ContentInput/ContentPanelBuilder/ElementList/index.svelte +122 -0
  289. package/src/lib/Components/ContentInput/ContentPanelBuilder/index.svelte +41 -0
  290. package/src/lib/Components/ContentInput/index.svelte +50 -0
  291. package/src/lib/Components/ContentInput/index.svelte.js +1066 -0
  292. package/src/lib/Components/CronInput/index.svelte +78 -0
  293. package/src/lib/Components/CronInput/index.svelte.js +199 -0
  294. package/src/lib/Components/DataTypeInput/index.svelte +174 -0
  295. package/src/lib/Components/DataTypeInput/index.svelte.js +568 -0
  296. package/src/lib/Components/Dropdown/index.svelte +116 -0
  297. package/src/lib/Components/Dropdown/index.svelte.js +403 -0
  298. package/src/lib/Components/EmailAddress/index.svelte +22 -0
  299. package/src/lib/Components/EmailAddress/index.svelte.js +45 -0
  300. package/src/lib/Components/ErrorX/index.svelte +58 -0
  301. package/src/lib/Components/Eye/index.svelte +57 -0
  302. package/src/lib/Components/FileInput/index.svelte +146 -0
  303. package/src/lib/Components/FileInput/index.svelte.js +226 -0
  304. package/src/lib/Components/FunctionInput/Node/helpers/DefinedTargetInput/index.svelte +110 -0
  305. package/src/lib/Components/FunctionInput/Node/helpers/Field/index.svelte +109 -0
  306. package/src/lib/Components/FunctionInput/Node/helpers/Field/index.svelte.js +208 -0
  307. package/src/lib/Components/FunctionInput/Node/helpers/InlineDropArea/index.svelte +97 -0
  308. package/src/lib/Components/FunctionInput/Node/helpers/InlineDropArea/index.svelte.js +105 -0
  309. package/src/lib/Components/FunctionInput/Node/helpers/ObjectInput/index.svelte +198 -0
  310. package/src/lib/Components/FunctionInput/Node/helpers/StackArea/index.svelte +169 -0
  311. package/src/lib/Components/FunctionInput/Node/helpers/StackArea/index.svelte.js +152 -0
  312. package/src/lib/Components/FunctionInput/Node/index.svelte +144 -0
  313. package/src/lib/Components/FunctionInput/Node/index.svelte.js +130 -0
  314. package/src/lib/Components/FunctionInput/index.svelte +356 -0
  315. package/src/lib/Components/FunctionInput/index.svelte.js +1215 -0
  316. package/src/lib/Components/Hamburger/index.svelte +99 -0
  317. package/src/lib/Components/HorizScrollBox/index.svelte +145 -0
  318. package/src/lib/Components/Icon/index.svelte +412 -0
  319. package/src/lib/Components/Icon/index.svelte.js +117 -0
  320. package/src/lib/Components/IconInput/index.svelte +77 -0
  321. package/src/lib/Components/IconInput/index.svelte.js +260 -0
  322. package/src/lib/Components/Image/index.svelte +121 -0
  323. package/src/lib/Components/Image/index.svelte.js +114 -0
  324. package/src/lib/Components/ImageEditor/Image/CropBox/index.svelte +165 -0
  325. package/src/lib/Components/ImageEditor/Image/index.svelte +104 -0
  326. package/src/lib/Components/ImageEditor/Panels/AI/index.svelte +36 -0
  327. package/src/lib/Components/ImageEditor/Panels/Crop/index.svelte +96 -0
  328. package/src/lib/Components/ImageEditor/Panels/File/QualityPicker/index.svelte +124 -0
  329. package/src/lib/Components/ImageEditor/Panels/File/index.svelte +74 -0
  330. package/src/lib/Components/ImageEditor/Panels/Filters/index.svelte +46 -0
  331. package/src/lib/Components/ImageEditor/Panels/Resize/index.svelte +58 -0
  332. package/src/lib/Components/ImageEditor/index.svelte +91 -0
  333. package/src/lib/Components/ImageEditor/index.svelte.js +1907 -0
  334. package/src/lib/Components/ImageSlider/index.svelte +124 -0
  335. package/src/lib/Components/ImageSlider/index.svelte.js +99 -0
  336. package/src/lib/Components/InfoBox/index.svelte +89 -0
  337. package/src/lib/Components/Json/Nested/index.svelte +157 -0
  338. package/src/lib/Components/Json/index.svelte +60 -0
  339. package/src/lib/Components/Json/index.svelte.js +594 -0
  340. package/src/lib/Components/LabeledItem/index.svelte +102 -0
  341. package/src/lib/Components/Layout/NavBar/FullNav/index.svelte +53 -0
  342. package/src/lib/Components/Layout/NavBar/NavGuts/index.svelte +87 -0
  343. package/src/lib/Components/Layout/NavBar/index.svelte +72 -0
  344. package/src/lib/Components/Layout/index.svelte +149 -0
  345. package/src/lib/Components/Layout/index.svelte.js +362 -0
  346. package/src/lib/Components/Link/index.svelte +46 -0
  347. package/src/lib/Components/Link/index.svelte.js +126 -0
  348. package/src/lib/Components/LoadingSuccessDiv/index.svelte +51 -0
  349. package/src/lib/Components/LoadingWheel/index.svelte +38 -0
  350. package/src/lib/Components/Location/index.svelte +85 -0
  351. package/src/lib/Components/Location/index.svelte.js +292 -0
  352. package/src/lib/Components/LocationInput/index.svelte +200 -0
  353. package/src/lib/Components/LocationInput/index.svelte.js +950 -0
  354. package/src/lib/Components/Number/index.svelte +47 -0
  355. package/src/lib/Components/Number/index.svelte.js +151 -0
  356. package/src/lib/Components/PhoneCountryCode/index.svelte +7 -0
  357. package/src/lib/Components/PhoneCountryCode/index.svelte.js +260 -0
  358. package/src/lib/Components/PhoneNumber/index.svelte +22 -0
  359. package/src/lib/Components/PhoneNumber/index.svelte.js +41 -0
  360. package/src/lib/Components/Popover/index.svelte +396 -0
  361. package/src/lib/Components/Popover/index.svelte.js +319 -0
  362. package/src/lib/Components/Qr/index.svelte +60 -0
  363. package/src/lib/Components/Qr/index.svelte.js +295 -0
  364. package/src/lib/Components/Slider/index.svelte +231 -0
  365. package/src/lib/Components/Slider/index.svelte.js +468 -0
  366. package/src/lib/Components/Spacer/index.svelte +41 -0
  367. package/src/lib/Components/StoragePicker/DisplayFile/index.svelte +15 -0
  368. package/src/lib/Components/StoragePicker/index.svelte +192 -0
  369. package/src/lib/Components/StoragePicker/index.svelte.js +593 -0
  370. package/src/lib/Components/SuccessCheck/index.svelte +56 -0
  371. package/src/lib/Components/TableAdvanced/ColumnInput/index.svelte +110 -0
  372. package/src/lib/Components/TableAdvanced/ColumnInput/index.svelte.js +494 -0
  373. package/src/lib/Components/TableAdvanced/FilterInput/index.svelte +54 -0
  374. package/src/lib/Components/TableAdvanced/FilterInput/index.svelte.js +247 -0
  375. package/src/lib/Components/TableAdvanced/Pagination/index.svelte +43 -0
  376. package/src/lib/Components/TableAdvanced/Pagination/index.svelte.js +97 -0
  377. package/src/lib/Components/TableAdvanced/SortByInput/index.svelte +79 -0
  378. package/src/lib/Components/TableAdvanced/SortByInput/index.svelte.js +191 -0
  379. package/src/lib/Components/TableAdvanced/index.svelte +268 -0
  380. package/src/lib/Components/TableAdvanced/index.svelte.js +1422 -0
  381. package/src/lib/Components/Tag/index.svelte +45 -0
  382. package/src/lib/Components/Tag/index.svelte.js +76 -0
  383. package/src/lib/Components/TextArrayInput/index.svelte +108 -0
  384. package/src/lib/Components/TextArrayInput/index.svelte.js +239 -0
  385. package/src/lib/Components/TextInput/PasswordTooltip/index.svelte +89 -0
  386. package/src/lib/Components/TextInput/index.svelte +223 -0
  387. package/src/lib/Components/TextInput/index.svelte.js +434 -0
  388. package/src/lib/Components/Time/index.svelte +7 -0
  389. package/src/lib/Components/Time/index.svelte.js +38 -0
  390. package/src/lib/Components/TimeInput/NumberToggler/index.svelte +34 -0
  391. package/src/lib/Components/TimeInput/NumberToggler/index.svelte.js +79 -0
  392. package/src/lib/Components/TimeInput/index.js +699 -0
  393. package/src/lib/Components/TimeInput/index.svelte +211 -0
  394. package/src/lib/Components/TimeInput/index.svelte.js +638 -0
  395. package/src/lib/Components/Tooltip/index.svelte +143 -0
  396. package/src/lib/Components/TransparentBackground/index.svelte +153 -0
  397. package/src/lib/Components/TypingDots/index.svelte +84 -0
  398. package/src/lib/Components/VariablePathInput/index.svelte +109 -0
  399. package/src/lib/Components/VariablePathInput/index.svelte.js +250 -0
  400. package/src/lib/Components/VideoTBD/index.svelte +100 -0
  401. package/src/lib/Components/XFollow/index.svelte +42 -0
  402. package/src/lib/Components/XPost/index.svelte +52 -0
  403. package/src/lib/Components/XPost/index.svelte.js +64 -0
  404. package/src/lib/Components/YoutubeVideo/index.svelte +73 -0
  405. package/src/lib/Components/YoutubeVideo/index.svelte.js +54 -0
  406. package/src/lib/actions/draggable.js +49 -0
  407. package/src/lib/actions/intersection_observer.js +24 -0
  408. package/src/lib/actions/no_spaces.js +33 -0
  409. package/src/lib/actions/numbers_only.js +26 -0
  410. package/src/lib/actions/scroll_y.js +28 -0
  411. package/src/lib/actions/stop_scroll_propagation_y.js +42 -0
  412. package/src/lib/actions/swipe_handler.js +295 -0
  413. package/src/lib/client/astc_formatting/index.js +1167 -0
  414. package/src/lib/client/docs/index.js +7612 -0
  415. package/src/lib/client/index.js +729 -0
  416. package/src/lib/client/types/index.js +4681 -0
  417. package/src/lib/index.js +161 -0
  418. package/src/lib/style.css +682 -0
  419. package/src/notlib/assets/static/Logo/index.svelte +27 -0
  420. package/src/routes/+layout.js +8 -0
  421. package/src/routes/+layout.svelte +176 -0
  422. package/src/routes/+page.svelte +83 -0
  423. package/src/routes/[component]/+page.svelte +167 -0
  424. package/src/routes/[component]/Showcase/Alert/index.svelte +26 -0
  425. package/src/routes/[component]/Showcase/Audio/index.svelte +86 -0
  426. package/src/routes/[component]/Showcase/AudioEditor/index.svelte +93 -0
  427. package/src/routes/[component]/Showcase/AuthCodeInput/index.svelte +13 -0
  428. package/src/routes/[component]/Showcase/Breadcrumbs/index.svelte +44 -0
  429. package/src/routes/[component]/Showcase/Button/index.svelte +350 -0
  430. package/src/routes/[component]/Showcase/Chart/index.svelte +11117 -0
  431. package/src/routes/[component]/Showcase/Checkbox/index.svelte +52 -0
  432. package/src/routes/[component]/Showcase/Code/index.svelte +13 -0
  433. package/src/routes/[component]/Showcase/Color/index.svelte +28 -0
  434. package/src/routes/[component]/Showcase/ColorInput/index.svelte +35 -0
  435. package/src/routes/[component]/Showcase/ConditionsInput/index.svelte +18 -0
  436. package/src/routes/[component]/Showcase/Confetti/index.svelte +22 -0
  437. package/src/routes/[component]/Showcase/Content/index.svelte +144 -0
  438. package/src/routes/[component]/Showcase/ContentInput/index.svelte +358 -0
  439. package/src/routes/[component]/Showcase/CronInput/index.svelte +30 -0
  440. package/src/routes/[component]/Showcase/DocsDefinition/index.svelte +155 -0
  441. package/src/routes/[component]/Showcase/Dropdown/index.svelte +88 -0
  442. package/src/routes/[component]/Showcase/FileInput/index.svelte +40 -0
  443. package/src/routes/[component]/Showcase/FunctionInput/index.svelte +77 -0
  444. package/src/routes/[component]/Showcase/Icon/index.svelte +120 -0
  445. package/src/routes/[component]/Showcase/IconInput/index.svelte +15 -0
  446. package/src/routes/[component]/Showcase/Image/index.svelte +119 -0
  447. package/src/routes/[component]/Showcase/ImageEditor/index.svelte +89 -0
  448. package/src/routes/[component]/Showcase/ImageSlider/index.svelte +26 -0
  449. package/src/routes/[component]/Showcase/InfoBox/index.svelte +44 -0
  450. package/src/routes/[component]/Showcase/Json/index.svelte +80 -0
  451. package/src/routes/[component]/Showcase/LabeledItem/index.svelte +18 -0
  452. package/src/routes/[component]/Showcase/Link/index.svelte +15 -0
  453. package/src/routes/[component]/Showcase/LoadingWheel/index.svelte +10 -0
  454. package/src/routes/[component]/Showcase/Location/index.svelte +422 -0
  455. package/src/routes/[component]/Showcase/LocationInput/index.svelte +121 -0
  456. package/src/routes/[component]/Showcase/Number/index.svelte +55 -0
  457. package/src/routes/[component]/Showcase/Popover/index.svelte +225 -0
  458. package/src/routes/[component]/Showcase/Qr/index.svelte +77 -0
  459. package/src/routes/[component]/Showcase/Slider/index.svelte +92 -0
  460. package/src/routes/[component]/Showcase/Spacer/index.svelte +27 -0
  461. package/src/routes/[component]/Showcase/StoragePicker/index.svelte +139 -0
  462. package/src/routes/[component]/Showcase/TableAdvanced/index.svelte +888 -0
  463. package/src/routes/[component]/Showcase/Tag/index.svelte +27 -0
  464. package/src/routes/[component]/Showcase/TextArrayInput/index.svelte +23 -0
  465. package/src/routes/[component]/Showcase/TextInput/index.svelte +95 -0
  466. package/src/routes/[component]/Showcase/Time/index.svelte +43 -0
  467. package/src/routes/[component]/Showcase/TimeInput/index.svelte +100 -0
  468. package/src/routes/[component]/Showcase/Tooltip/index.svelte +37 -0
  469. package/src/routes/[component]/Showcase/TransparentBackground/index.svelte +26 -0
  470. package/src/routes/[component]/Showcase/XFollow/index.svelte +7 -0
  471. package/src/routes/[component]/Showcase/XPost/index.svelte +24 -0
  472. package/src/routes/[component]/Showcase/YoutubeVideo/index.svelte +17 -0
  473. package/src/routes/test/+page.svelte +53 -0
  474. package/static/apple-touch-icon.png +0 -0
  475. package/static/browserconfig.xml +9 -0
  476. package/static/favicon-96x96.png +0 -0
  477. package/static/favicon-inactive.svg +4 -0
  478. package/static/favicon.svg +14 -0
  479. package/static/fonts/ProximaVara.woff2 +0 -0
  480. package/static/fonts/Quicksand-VariableFont.woff2 +0 -0
  481. package/static/fonts/RobotoSerif-VariableFont.woff2 +0 -0
  482. package/static/icon.png +0 -0
  483. package/static/site.webmanifest +21 -0
  484. package/static/web-app-manifest-192x192.png +0 -0
  485. package/static/web-app-manifest-512x512.png +0 -0
  486. package/svelte.config.js +12 -0
  487. package/vite.config.js +6 -0
@@ -0,0 +1,1907 @@
1
+ import {
2
+ create_unique_id,
3
+ set_closurable,
4
+ set_closurable_color,
5
+ clean_custom_identifier,
6
+ mime_type_extensions,
7
+ deep_copy,
8
+ url_to_file,
9
+ } from "../../client/index.js"
10
+ import { create_button_manager } from "../Button/index.svelte.js"
11
+ import { create_popover_manager } from "../Popover/index.svelte.js"
12
+ import { create_text_input_manager } from "../TextInput/index.svelte.js"
13
+ import { create_dropdown_manager } from "../Dropdown/index.svelte.js"
14
+ import { create_slider_manager } from "../Slider/index.svelte.js"
15
+ import { create_file_input_manager } from "../FileInput/index.svelte.js"
16
+ import "context-filter-polyfill" // ctx.filter doesnt work on safari and this should fix
17
+
18
+ export function create_image_editor_manager(config) {
19
+ let id = create_unique_id(null, 20)
20
+
21
+ let is_popover = $state(true)
22
+ let screen_tab = $state("filters")
23
+ let image_sources = $state([])
24
+ let image_source_index = $state(null)
25
+ let file_picker_file = $state(null)
26
+ let file_name = $state(null)
27
+ let mime_type = $state(null)
28
+ let mime_type_input = $state(null)
29
+ let file_size_data = $state(null)
30
+ let is_lock_resize_aspect_ratio = $state(true)
31
+ let resize_width = $state(null)
32
+ let resize_height = $state(null)
33
+ let crop_width = $state(null)
34
+ let crop_height = $state(null)
35
+ let crop_left = $state(0)
36
+ let crop_top = $state(0)
37
+ let crop_aspect_width = $state(null)
38
+ let crop_aspect_height = $state(null)
39
+ let crop_aspect_ratio = $state(null)
40
+ let current_image_width = $state(null)
41
+ let current_image_height = $state(null)
42
+ let current_image_ar = $state(null)
43
+ let image_pixels_crop_width = $state(null)
44
+ let image_pixels_crop_height = $state(null)
45
+ let crop_drag_type = $state("main")
46
+ let crop_top_start = $state(null)
47
+ let crop_left_start = $state(null)
48
+ let crop_width_start = $state(null)
49
+ let crop_height_start = $state(null)
50
+ let start_x = $state(null)
51
+ let start_y = $state(null)
52
+ let last_known_x = $state(null)
53
+ let last_known_y = $state(null)
54
+ let is_loading = $state(false)
55
+ let is_disabled = $state(false)
56
+ let error_message = $state(null)
57
+ let success_message = $state(null)
58
+ let is_show_finish_button = $state(true)
59
+ let is_show_img_slider = $state(true)
60
+ let ai_error_message = $state(null)
61
+ let file_size_kb = $state(null)
62
+
63
+ let popover_manager = $state(null)
64
+ let file_input_manager = $state(null)
65
+ let screen_tab_filters_button_manager = $state(null)
66
+ let screen_tab_crop_button_manager = $state(null)
67
+ let screen_tab_resize_button_manager = $state(null)
68
+ let screen_tab_ai_button_manager = $state(null)
69
+ let screen_tab_file_button_manager = $state(null)
70
+ let undo_button_manager = $state(null)
71
+ let redo_button_manager = $state(null)
72
+ let clear_button_manager = $state(null)
73
+ let finish_button_manager = $state(null)
74
+
75
+ let filter_brightness_slider_manager = $state(null)
76
+ let filter_contrast_slider_manager = $state(null)
77
+ let filter_saturation_slider_manager = $state(null)
78
+ let filter_grayscale_slider_manager = $state(null)
79
+ let filter_hue_slider_manager = $state(null)
80
+ let filter_red_slider_manager = $state(null)
81
+ let filter_green_slider_manager = $state(null)
82
+ let filter_blue_slider_manager = $state(null)
83
+ let filter_blur_slider_manager = $state(null)
84
+ let filter_opacity_slider_manager = $state(null)
85
+ let filters_set_default_button_manager = $state(null)
86
+ let filters_apply_filters_button_manager = $state(null)
87
+
88
+ let crop_free_button_manager = $state(null)
89
+ let crop_one_to_one_button_manager = $state(null)
90
+ let crop_four_to_three_button_manager = $state(null)
91
+ let crop_three_to_two_button_manager = $state(null)
92
+ let crop_sixteen_to_nine_button_manager = $state(null)
93
+ let crop_three_to_four_button_manager = $state(null)
94
+ let crop_two_to_three_button_manager = $state(null)
95
+ let crop_nine_to_sixteen_button_manager = $state(null)
96
+ let crop_width_ratio_text_input_manager = $state(null)
97
+ let crop_height_ratio_text_input_manager = $state(null)
98
+ let crop_image_button_manager = $state(null)
99
+ let crop_aspect_width_loc = $state(null)
100
+ let crop_aspect_height_loc = $state(null)
101
+
102
+ let file_name_text_input_manager = $state(null)
103
+ let mime_type_webp_button_manager = $state(null)
104
+ let mime_type_jpeg_button_manager = $state(null)
105
+ let mime_type_png_button_manager = $state(null)
106
+ let download_image_button_manager = $state(null)
107
+ let set_file_changes_button_manager = $state(null)
108
+ let file_quality_slider_manager = $state(null)
109
+
110
+ let ai_tab_dropdown_manager = $state(null)
111
+ let ai_text_to_image_is_loading = $state(null)
112
+ let ai_generate_image_from_text_text_input_manager = $state(null)
113
+ let ai_generate_image_from_text_button_manager = $state(null)
114
+ let ai_remove_background_is_loading = $state(false)
115
+ let ai_restore_resolution_is_loading = $state(false)
116
+ let ai_restore_face_is_loading = $state(false)
117
+ let ai_remove_bg_button_manager = $state(null)
118
+ let ai_restore_resolution_button_manager = $state(null)
119
+ let ai_restore_face_button_manager = $state(null)
120
+
121
+ let resize_width_dropdown_manager = $state(null)
122
+ let resize_height_dropdown_manager = $state(null)
123
+ let resize_width_text_input_manager = $state(null)
124
+ let resize_height_text_input_manager = $state(null)
125
+ let resize_aspect_ratio_lock_button_manager = $state(null)
126
+ let resize_image_button_manager = $state(null)
127
+
128
+ let selected_image_source = $derived(
129
+ Array.isArray(image_sources) && image_source_index < image_sources.length
130
+ ? image_sources?.[image_source_index]
131
+ : null
132
+ )
133
+
134
+ let file_name_derived = $derived(clean_custom_identifier(file_name_text_input_manager?.val ?? file_name ?? ""))
135
+
136
+ let file_name_derived_with_extension = $derived(
137
+ `${clean_custom_identifier(file_name_text_input_manager?.val ?? file_name ?? "")}.${
138
+ mime_type_extensions?.[mime_type ?? mime_type_input]
139
+ }`
140
+ )
141
+
142
+ let shown_file_size_data = $derived(file_size_data?.[mime_type_input])
143
+
144
+ async function set_file_size_kb() {
145
+ if (!selected_image_source) {
146
+ return
147
+ }
148
+ let data_url = await get_image_data_url(
149
+ selected_image_source,
150
+ mime_type_input ?? mime_type,
151
+ file_quality_slider_manager?.val
152
+ )
153
+ let size = calculate_file_size(data_url, mime_type_input ?? mime_type)
154
+ file_size_kb = size
155
+ }
156
+
157
+ function set_crop_box_loc(w, h) {
158
+ crop_aspect_width_loc = w
159
+ crop_aspect_height_loc = h
160
+ crop_width_ratio_text_input_manager.set_val(crop_aspect_width_loc)
161
+ crop_height_ratio_text_input_manager.set_val(crop_aspect_height_loc)
162
+ set_crop_box(w, h)
163
+ }
164
+
165
+ function on_destroy() {
166
+ if (document) {
167
+ let hidden_image_el = document?.querySelector(`#${id}_hidden_image_el`)
168
+ if (hidden_image_el) {
169
+ hidden_image_el.remove()
170
+ }
171
+ }
172
+ }
173
+
174
+ function set_base_image(new_src) {
175
+ setTimeout(() => {
176
+ let hidden_image_el = document?.querySelector(`#${id}_hidden_image_el`)
177
+ if (hidden_image_el) {
178
+ hidden_image_el.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
179
+ if (new_src) {
180
+ clear_canvas()
181
+ reset_fields()
182
+ hidden_image_el.src = new_src
183
+ }
184
+ }
185
+ })
186
+ }
187
+
188
+ function clear_canvas() {
189
+ let canvas_container_el = document?.querySelector(`#${id}_canvas_container_el`)
190
+ current_image_width = null
191
+ current_image_height = null
192
+ current_image_ar = null
193
+ if (canvas_container_el) {
194
+ canvas_container_el.style.min_width = "auto"
195
+ canvas_container_el.style.min_height = "auto"
196
+ }
197
+ let canvas_el = document?.querySelector(`#${id}_canvas_el`)
198
+ if (!canvas_el) {
199
+ return
200
+ }
201
+ let ctx = canvas_el.getContext("2d", { willReadFrequently: true })
202
+ ctx.clearRect(0, 0, canvas_el.width, canvas_el.height)
203
+ }
204
+
205
+ function reset_fields() {
206
+ filter_brightness_slider_manager.set_val(100)
207
+ filter_contrast_slider_manager.set_val(100)
208
+ filter_saturation_slider_manager.set_val(100)
209
+ filter_grayscale_slider_manager.set_val(0)
210
+ filter_hue_slider_manager.set_val(0)
211
+ filter_red_slider_manager.set_val(100)
212
+ filter_green_slider_manager.set_val(100)
213
+ filter_blue_slider_manager.set_val(100)
214
+ filter_blur_slider_manager.set_val(0)
215
+ filter_opacity_slider_manager.set_val(100)
216
+ file_quality_slider_manager.set_val(75)
217
+ crop_left = 0
218
+ crop_top = 0
219
+ crop_width = null
220
+ crop_height = null
221
+ resize_width = null
222
+ resize_height = null
223
+ is_lock_resize_aspect_ratio = true
224
+ crop_aspect_width = null
225
+ crop_aspect_height = null
226
+ crop_aspect_ratio = null
227
+ }
228
+
229
+ function set_screen_tab(screen_tab_loc) {
230
+ screen_tab = screen_tab_loc
231
+ let hidden_image_el = document?.querySelector(`#${id}_hidden_image_el`)
232
+ reset_fields()
233
+ if (screen_tab != "ai" && !hidden_image_el) {
234
+ set_base_image(selected_image_source)
235
+ }
236
+ if (screen_tab == "filters") {
237
+ main_image_transformer()
238
+ } else if (screen_tab == "file") {
239
+ set_file_data_base()
240
+ } else if (screen_tab == "crop") {
241
+ set_crop_box()
242
+ } else if (screen_tab == "ai") {
243
+ is_show_img_slider = false
244
+ }
245
+ }
246
+
247
+ function main_image_transformer() {
248
+ try {
249
+ let hidden_image_el = document?.querySelector(`#${id}_hidden_image_el`)
250
+ let edit_image_container_el = document?.querySelector(`#${id}_edit_image_container_el`)
251
+ let canvas_container_el = document?.querySelector(`#${id}_canvas_container_el`)
252
+ let canvas_el = document?.querySelector(`#${id}_canvas_el`)
253
+ if (!canvas_el || !hidden_image_el?.height || !(image_sources.length > 0)) {
254
+ return
255
+ }
256
+ let hidden_image_el_width = hidden_image_el?.width
257
+ let hidden_image_el_height = hidden_image_el?.height
258
+ let canv_width = canvas_el.offsetWidth
259
+ let canv_height = canvas_el.offsetHeight
260
+ let edit_image_container_el_width = edit_image_container_el.offsetWidth
261
+ let edit_image_container_el_height = edit_image_container_el.offsetHeight
262
+ clear_canvas()
263
+ current_image_width = hidden_image_el_width
264
+ current_image_height = hidden_image_el_height
265
+ current_image_ar =
266
+ current_image_width && current_image_height
267
+ ? parseFloat((current_image_width / current_image_height).toPrecision(4))
268
+ : null
269
+ let resize_width_loc = resize_width
270
+ let resize_height_loc = resize_height
271
+ if (resize_width_loc < 1) {
272
+ if (crop_width > 0) {
273
+ resize_width_loc = Math.round((crop_width * hidden_image_el_width) / canv_width)
274
+ } else {
275
+ resize_width_loc = hidden_image_el_width
276
+ }
277
+ }
278
+ if (resize_height_loc < 1) {
279
+ if (crop_height > 0) {
280
+ resize_height_loc = Math.round((crop_height * hidden_image_el_height) / canv_height)
281
+ } else {
282
+ resize_height_loc = hidden_image_el_height
283
+ }
284
+ }
285
+ let resize_aspect_ratio = resize_width_loc / resize_height_loc
286
+ let edit_image_frame_aspect_ratio = edit_image_container_el_width / edit_image_container_el_height
287
+ let crop_width_loc = crop_width > 0 ? crop_width : canv_width
288
+ let crop_height_loc = crop_height > 0 ? crop_height : canv_height
289
+ let image_pixels_crop_width = Math.round((crop_width_loc * hidden_image_el_width) / canv_width)
290
+ let image_pixels_crop_left = Math.round((crop_left * hidden_image_el_width) / canv_width)
291
+ let image_pixels_crop_height = Math.round((crop_height_loc * hidden_image_el_height) / canv_height)
292
+ let image_pixels_crop_top = Math.round((crop_top * hidden_image_el_height) / canv_height)
293
+ let display_image_height = edit_image_container_el_height
294
+ let display_image_width = display_image_height * resize_aspect_ratio
295
+ if (edit_image_frame_aspect_ratio < resize_aspect_ratio) {
296
+ display_image_width = edit_image_container_el_width
297
+ display_image_height = display_image_width / resize_aspect_ratio
298
+ }
299
+ canvas_container_el.style.min_width = "auto"
300
+ canvas_container_el.style.min_height = "auto"
301
+ if (resize_width_loc < display_image_width || resize_height_loc < display_image_height) {
302
+ canvas_container_el.style.width = display_image_width + "px"
303
+ canvas_container_el.style.height = display_image_height + "px"
304
+ }
305
+ canvas_el.width = Math.round(resize_width_loc)
306
+ canvas_el.height = Math.round(resize_height_loc)
307
+ let ctx = canvas_el.getContext("2d", { willReadFrequently: true })
308
+ ctx.filter = `brightness(${filter_brightness_slider_manager?.val}%) contrast(${filter_contrast_slider_manager?.val}%) saturate(${filter_saturation_slider_manager?.val}%) grayscale(${filter_grayscale_slider_manager?.val}%) opacity(${filter_opacity_slider_manager?.val}%) hue-rotate(${filter_hue_slider_manager?.val}deg) blur(${filter_blur_slider_manager?.val}px)`
309
+ ctx.drawImage(
310
+ hidden_image_el,
311
+ image_pixels_crop_left,
312
+ image_pixels_crop_top,
313
+ image_pixels_crop_width,
314
+ image_pixels_crop_height,
315
+ 0,
316
+ 0,
317
+ resize_width_loc,
318
+ resize_height_loc
319
+ )
320
+ let canv_image_data = ctx.getImageData(0, 0, image_pixels_crop_width, image_pixels_crop_height)
321
+ for (let i = 0; i < canv_image_data.data.length; i += 4) {
322
+ canv_image_data.data[i] = canv_image_data.data[i] * (filter_red_slider_manager?.val / 100)
323
+ canv_image_data.data[i + 1] = canv_image_data.data[i + 1] * (filter_green_slider_manager?.val / 100)
324
+ canv_image_data.data[i + 2] = canv_image_data.data[i + 2] * (filter_blue_slider_manager?.val / 100)
325
+ }
326
+ ctx.putImageData(canv_image_data, 0, 0)
327
+ ctx.filter = "none"
328
+ if (
329
+ (image_pixels_crop_width > 0 && Math.round(image_pixels_crop_width) != Math.round(hidden_image_el_width)) ||
330
+ (image_pixels_crop_height > 0 && Math.round(image_pixels_crop_height) != Math.round(hidden_image_el_height)) ||
331
+ (resize_width > 0 && resize_height > 0)
332
+ ) {
333
+ reset_fields()
334
+ let new_image_src = canvas_el.toDataURL(mime_type, file_quality_slider_manager?.val)
335
+ image_sources = [new_image_src, ...image_sources.slice(image_source_index)]
336
+ image_source_index = 0
337
+ set_base_image(new_image_src)
338
+ }
339
+ } catch (err) {
340
+ console.log("error updating image", err)
341
+ }
342
+ }
343
+
344
+ function undo() {
345
+ if (Array.isArray(image_sources) && image_sources.length > 1 && image_source_index < image_sources.length - 1) {
346
+ image_source_index++
347
+ set_base_image(selected_image_source)
348
+ }
349
+ }
350
+
351
+ function redo() {
352
+ if (Array.isArray(image_sources) && image_sources.length > 1 && image_source_index > 0) {
353
+ image_source_index--
354
+ set_base_image(selected_image_source)
355
+ }
356
+ }
357
+
358
+ function clear() {
359
+ image_sources = []
360
+ image_source_index = 0
361
+ file_picker_file = null
362
+ file_name_text_input_manager.set_val(null)
363
+ }
364
+
365
+ async function finish() {
366
+ let file_to_return = null
367
+ if (selected_image_source) {
368
+ file_to_return = await url_to_file(selected_image_source, file_name_derived)
369
+ }
370
+ if (typeof config?.on_finish == "function") {
371
+ config?.on_finish(file_to_return)
372
+ }
373
+ popover_manager?.close()
374
+ }
375
+
376
+ function drop_handler(e) {
377
+ let accept = ["image/webp", "image/jpeg", "image/png"]
378
+ let files_loc = []
379
+ if (e.dataTransfer.items) {
380
+ for (let i = 0; i < e.dataTransfer.items.length; i++) {
381
+ if (e.dataTransfer.items[i].kind === "file") {
382
+ let file = e.dataTransfer.items[i].getAsFile()
383
+ if (accept.includes(file?.type)) {
384
+ files_loc = [...files_loc, file]
385
+ }
386
+ }
387
+ }
388
+ } else {
389
+ for (let i = 0; i < e.dataTransfer.files.length; i++) {
390
+ let file = e.dataTransfer.files[i].getAsFile()
391
+ files_loc = [...files_loc, file]
392
+ }
393
+ }
394
+ if (files_loc.length > 0) {
395
+ init_file(files_loc[0])
396
+ }
397
+ }
398
+
399
+ // filters ↓↓↓
400
+
401
+ function apply_filters() {
402
+ let canvas_el = document?.querySelector(`#${id}_canvas_el`)
403
+ if (canvas_el && selected_image_source) {
404
+ let new_image_src = canvas_el.toDataURL(mime_type, file_quality_slider_manager?.val)
405
+ image_sources = [new_image_src, ...image_sources.slice(image_source_index)]
406
+ image_source_index = 0
407
+ reset_fields()
408
+ set_base_image(new_image_src)
409
+ }
410
+ }
411
+
412
+ function reset_filters() {
413
+ filter_brightness_slider_manager.set_val(100)
414
+ filter_contrast_slider_manager.set_val(100)
415
+ filter_saturation_slider_manager.set_val(100)
416
+ filter_grayscale_slider_manager.set_val(0)
417
+ filter_hue_slider_manager.set_val(0)
418
+ filter_red_slider_manager.set_val(100)
419
+ filter_green_slider_manager.set_val(100)
420
+ filter_blue_slider_manager.set_val(100)
421
+ filter_blur_slider_manager.set_val(0)
422
+ filter_opacity_slider_manager.set_val(100)
423
+ set_base_image(selected_image_source)
424
+ }
425
+ // filters ↑↑↑
426
+
427
+ // resize ↓↓↓
428
+ const resize_options = [
429
+ { key: 512, name: "512px" },
430
+ { key: 800, name: "800px" },
431
+ { key: 1000, name: "1000px" },
432
+ { key: 1200, name: "1200px" },
433
+ { key: 1600, name: "1600px" },
434
+ { key: 2000, name: "2000px" },
435
+ { key: 2400, name: "2400px" },
436
+ ]
437
+
438
+ function toggle_is_lock_resize_aspect_ratio() {
439
+ is_lock_resize_aspect_ratio = !is_lock_resize_aspect_ratio
440
+ }
441
+
442
+ function set_resize_dimensions(w, h) {
443
+ if (w == 0 && !h) {
444
+ resize_width = 0
445
+ if (is_lock_resize_aspect_ratio) {
446
+ resize_height = 0
447
+ }
448
+ } else if (h == 0 && !w) {
449
+ resize_height = 0
450
+ if (is_lock_resize_aspect_ratio) {
451
+ resize_width = 0
452
+ }
453
+ } else if (w > 0) {
454
+ resize_width = Math.round(Math.min(w, 10000))
455
+ if (h > 0) {
456
+ resize_height = Math.round(Math.min(h, 10000))
457
+ } else if (is_lock_resize_aspect_ratio) {
458
+ resize_height = Math.round(w / current_image_ar / 10) * 10
459
+ }
460
+ } else if (h > 0) {
461
+ resize_height = Math.round(Math.min(h, 10000))
462
+ if (is_lock_resize_aspect_ratio) {
463
+ resize_width = Math.round((h * current_image_ar) / 10) * 10
464
+ }
465
+ }
466
+ }
467
+ // resize ↑↑↑
468
+
469
+ // crop ↓↓↓
470
+ function set_crop_box(w = null, h = null) {
471
+ let canvas_el = document?.querySelector(`#${id}_canvas_el`)
472
+ if (w != null && w > -1 && h != null && h > -1) {
473
+ crop_aspect_ratio = parseFloat((w / h).toPrecision(4))
474
+ } else {
475
+ crop_aspect_ratio = null
476
+ }
477
+ let canv_height = canvas_el.offsetHeight
478
+ let canv_width = canvas_el.offsetWidth
479
+ let canvas_aspect_ratio = crop_aspect_ratio ? crop_aspect_ratio : canv_width / canv_height
480
+ crop_top = 0
481
+ crop_left = 0
482
+ crop_width = canv_width
483
+ crop_height = canv_height
484
+ if (crop_aspect_ratio <= canvas_aspect_ratio || crop_height > canv_height) {
485
+ crop_height = canv_height
486
+ crop_width = canv_height * canvas_aspect_ratio
487
+ crop_left = (canv_width - crop_width) / 2
488
+ }
489
+ if (crop_aspect_ratio > canvas_aspect_ratio || crop_width > canv_width) {
490
+ crop_left = 0
491
+ crop_width = canv_width
492
+ crop_height = canv_width / canvas_aspect_ratio
493
+ crop_top = (canv_height - crop_height) / 2
494
+ }
495
+ set_image_pixels_crop()
496
+ }
497
+
498
+ function crop_image(w, h) {
499
+ if (crop_aspect_width != w && crop_aspect_height != h) {
500
+ crop_aspect_width = w
501
+ crop_aspect_height = h
502
+ if (w != null && w > 0 && h != null && h > 0) {
503
+ crop_aspect_ratio =
504
+ w > 0 && h > 0 ? JSON.parse((Math.min(w, 10000) / Math.min(h, 10000)).toPrecision(4)).toFixed(2) : null
505
+ } else {
506
+ crop_aspect_ratio = null
507
+ }
508
+ }
509
+ main_image_transformer()
510
+ setTimeout(() => {
511
+ set_crop_box()
512
+ set_image_pixels_crop()
513
+ }, 10)
514
+ }
515
+
516
+ function set_image_pixels_crop() {
517
+ let canvas_el = document?.querySelector(`#${id}_canvas_el`)
518
+ let canv_height = canvas_el.offsetHeight
519
+ let canv_width = canvas_el.offsetWidth
520
+ image_pixels_crop_width =
521
+ crop_width > 0 && current_image_width > 0
522
+ ? Math.round((crop_width * current_image_width) / canv_width)
523
+ : current_image_width
524
+ image_pixels_crop_height =
525
+ crop_height > 0 && current_image_height > 0
526
+ ? Math.round((crop_height * current_image_height) / canv_height)
527
+ : current_image_height
528
+ }
529
+
530
+ function update_crop_values(
531
+ canv_height,
532
+ canv_width,
533
+ crop_drag_type,
534
+ crop_top,
535
+ crop_left,
536
+ crop_width,
537
+ crop_height,
538
+ crop_top_start,
539
+ crop_left_start,
540
+ crop_width_start,
541
+ crop_height_start,
542
+ x_change,
543
+ y_change,
544
+ crop_aspect_ratio
545
+ ) {
546
+ let new_crop_top = crop_top
547
+ let new_crop_left = crop_left
548
+ let new_crop_width = crop_width
549
+ let new_crop_height = crop_height
550
+ if (crop_drag_type == "main") {
551
+ new_crop_left = crop_left_start + x_change
552
+ new_crop_top = crop_top_start + y_change
553
+ if (new_crop_left < 0) {
554
+ new_crop_left = 0
555
+ }
556
+ if (new_crop_top < 0) {
557
+ new_crop_top = 0
558
+ }
559
+ let room_right = canv_width - (new_crop_left + crop_width)
560
+ let room_bottom = canv_height - (new_crop_top + crop_height)
561
+ let room_left = new_crop_left
562
+ let room_top = new_crop_top
563
+ if (room_right < 0) {
564
+ new_crop_left = canv_width - crop_width
565
+ }
566
+ if (room_bottom < 0) {
567
+ new_crop_top = canv_height - crop_height
568
+ }
569
+ }
570
+ // new_crop_width = new_crop_height * crop_aspect_ratio
571
+ // new_crop_height = new_crop_width / crop_aspect_ratio
572
+ let center_vert_start = crop_top_start + crop_height_start / 2
573
+ let center_horiz_start = crop_left_start + crop_width_start / 2
574
+ let shortest_horiz_length_to_wall_start = Math.min(canv_width - center_horiz_start, center_horiz_start)
575
+ let shortest_vert_length_to_wall_start = Math.min(canv_height - center_vert_start, center_vert_start)
576
+ if (["tl", "t", "tr"].includes(crop_drag_type)) {
577
+ let res = linear_low_crop_slide(crop_top_start, crop_height_start, y_change)
578
+ new_crop_top = res.crop_lower
579
+ new_crop_height = res.crop_range
580
+ }
581
+ if (["tl", "l", "bl"].includes(crop_drag_type)) {
582
+ let res = linear_low_crop_slide(crop_left_start, crop_width_start, x_change)
583
+ new_crop_left = res.crop_lower
584
+ new_crop_width = res.crop_range
585
+ }
586
+ if (["bl", "b", "br"].includes(crop_drag_type)) {
587
+ new_crop_height = linear_high_crop_slide(crop_height_start, canv_height - crop_top_start, y_change)
588
+ }
589
+ if (["tr", "r", "br"].includes(crop_drag_type)) {
590
+ new_crop_width = linear_high_crop_slide(crop_width_start, canv_width - crop_left_start, x_change)
591
+ }
592
+ if (crop_aspect_ratio) {
593
+ if (["t", "b"].includes(crop_drag_type)) {
594
+ let crop_width_based_on_change = new_crop_height * crop_aspect_ratio
595
+ if (crop_width_based_on_change / 2 >= shortest_horiz_length_to_wall_start) {
596
+ new_crop_width = shortest_horiz_length_to_wall_start * 2
597
+ new_crop_left = center_horiz_start - shortest_horiz_length_to_wall_start
598
+ new_crop_height = new_crop_width / crop_aspect_ratio
599
+ new_crop_top = crop_top_start
600
+ if (crop_drag_type == "t") {
601
+ new_crop_top = crop_top_start + crop_height_start - new_crop_height
602
+ }
603
+ } else {
604
+ new_crop_width = crop_width_based_on_change
605
+ new_crop_left = center_horiz_start - crop_width_based_on_change / 2
606
+ new_crop_height = new_crop_width / crop_aspect_ratio
607
+ }
608
+ } else if (["l", "r"].includes(crop_drag_type)) {
609
+ let crop_height_based_on_change = new_crop_width / crop_aspect_ratio
610
+ if (crop_height_based_on_change / 2 >= shortest_vert_length_to_wall_start) {
611
+ new_crop_height = shortest_vert_length_to_wall_start * 2
612
+ new_crop_top = center_vert_start - shortest_vert_length_to_wall_start
613
+ new_crop_width = new_crop_height * crop_aspect_ratio
614
+ new_crop_left = crop_left_start
615
+ if (crop_drag_type == "l") {
616
+ new_crop_left = crop_left_start + crop_width_start - new_crop_width
617
+ }
618
+ } else {
619
+ new_crop_height = crop_height_based_on_change
620
+ new_crop_top = center_vert_start - crop_height_based_on_change / 2
621
+ new_crop_width = new_crop_height * crop_aspect_ratio
622
+ }
623
+ } else if (crop_drag_type == "tl") {
624
+ let max_width = crop_left_start + crop_width_start
625
+ let max_height = crop_top_start + crop_height_start
626
+ let is_height_shortest_distance = max_width / crop_aspect_ratio > max_height
627
+ if (is_height_shortest_distance) {
628
+ new_crop_width = new_crop_height * crop_aspect_ratio
629
+ new_crop_left = max_width - new_crop_width
630
+ } else {
631
+ new_crop_height = new_crop_width / crop_aspect_ratio
632
+ new_crop_top = max_height - new_crop_height
633
+ }
634
+ } else if (crop_drag_type == "tr") {
635
+ let max_width = canv_width - crop_left_start
636
+ let max_height = crop_top_start + crop_height_start
637
+ let is_height_shortest_distance = max_width / crop_aspect_ratio > max_height
638
+ if (is_height_shortest_distance) {
639
+ new_crop_width = new_crop_height * crop_aspect_ratio
640
+ new_crop_left = canv_width - max_width
641
+ } else {
642
+ new_crop_height = new_crop_width / crop_aspect_ratio
643
+ new_crop_top = max_height - new_crop_height
644
+ }
645
+ } else if (crop_drag_type == "bl") {
646
+ let max_width = crop_left_start + crop_width_start
647
+ let max_height = canv_height - crop_top_start
648
+ let is_height_shortest_distance = max_width / crop_aspect_ratio > max_height
649
+ if (is_height_shortest_distance) {
650
+ new_crop_width = new_crop_height * crop_aspect_ratio
651
+ new_crop_left = max_width - new_crop_width
652
+ } else {
653
+ new_crop_height = new_crop_width / crop_aspect_ratio
654
+ new_crop_top = crop_top_start
655
+ }
656
+ } else if (crop_drag_type == "br") {
657
+ let max_width = canv_width - crop_left_start
658
+ let max_height = canv_height - crop_top_start
659
+ let is_height_shortest_distance = max_width / crop_aspect_ratio > max_height
660
+ if (is_height_shortest_distance) {
661
+ new_crop_width = new_crop_height * crop_aspect_ratio
662
+ new_crop_left = crop_left_start
663
+ } else {
664
+ new_crop_height = new_crop_width / crop_aspect_ratio
665
+ new_crop_top = crop_top_start
666
+ }
667
+ }
668
+ }
669
+ return {
670
+ crop_top: new_crop_top,
671
+ crop_left: new_crop_left,
672
+ crop_width: new_crop_width,
673
+ crop_height: new_crop_height,
674
+ }
675
+ }
676
+
677
+ function linear_low_crop_slide(crop_lower_start, crop_range_start, lower_change) {
678
+ let new_crop_lower = crop_lower_start + lower_change
679
+ let new_crop_range = crop_range_start - lower_change
680
+ if (new_crop_lower < 0) {
681
+ new_crop_range += new_crop_lower
682
+ new_crop_lower = 0
683
+ }
684
+ let max_crop_lower = crop_lower_start + crop_range_start
685
+ if (new_crop_lower > max_crop_lower) {
686
+ new_crop_range -= new_crop_lower - max_crop_lower
687
+ new_crop_lower = max_crop_lower
688
+ }
689
+ if (new_crop_range < 1) {
690
+ new_crop_range = 1
691
+ }
692
+ let crop_total = new_crop_lower + new_crop_range
693
+ if (crop_total !== crop_lower_start + crop_range_start) {
694
+ if (crop_total > crop_lower_start + crop_range_start) {
695
+ new_crop_range -= crop_total - (crop_lower_start + crop_range_start)
696
+ } else {
697
+ new_crop_range += crop_lower_start + crop_range_start - crop_total
698
+ }
699
+ }
700
+ return { crop_lower: new_crop_lower, crop_range: new_crop_range }
701
+ }
702
+
703
+ function linear_high_crop_slide(crop_range_start, frame_range, lower_change) {
704
+ let new_crop_range = crop_range_start + lower_change
705
+ if (new_crop_range < 1) {
706
+ new_crop_range = 1
707
+ }
708
+ if (new_crop_range > frame_range) {
709
+ new_crop_range = frame_range
710
+ }
711
+ return new_crop_range
712
+ }
713
+
714
+ function crop_on_up(e) {
715
+ if (start_x != null || start_y != null) {
716
+ start_x = null
717
+ start_y = null
718
+ last_known_x = null
719
+ last_known_y = null
720
+ crop_top_start = null
721
+ crop_left_start = null
722
+ crop_width_start = null
723
+ crop_height_start = null
724
+ }
725
+ }
726
+
727
+ function crop_on_down(e, type) {
728
+ e.preventDefault()
729
+ if (e?.touches) {
730
+ start_x = e.touches[0].pageX
731
+ start_y = e.touches[0].pageY
732
+ last_known_x = e.touches[0].pageX
733
+ last_known_y = e.touches[0].pageY
734
+ } else if ((e?.x, e?.y)) {
735
+ start_x = e.x
736
+ start_y = e.y
737
+ last_known_x = e.x
738
+ last_known_y = e.y
739
+ }
740
+ crop_drag_type = type
741
+ crop_top_start = crop_top
742
+ crop_left_start = crop_left
743
+ crop_width_start = crop_width
744
+ crop_height_start = crop_height
745
+ }
746
+
747
+ function crop_on_move(e) {
748
+ let canvas_el = document?.querySelector(`#${id}_canvas_el`)
749
+ if ((start_x != null && !isNaN(start_x)) || (start_y != null && !isNaN(start_y))) {
750
+ if (e?.touches) {
751
+ last_known_x = e.touches[0].pageX
752
+ last_known_y = e.touches[0].pageY
753
+ } else if ((e?.x, e?.y)) {
754
+ last_known_x = e.x
755
+ last_known_y = e.y
756
+ }
757
+ let canv_height = canvas_el.offsetHeight
758
+ let canv_width = canvas_el.offsetWidth
759
+ let x_change = last_known_x - start_x
760
+ let y_change = last_known_y - start_y
761
+ let res = update_crop_values(
762
+ canv_height,
763
+ canv_width,
764
+ crop_drag_type,
765
+ crop_top,
766
+ crop_left,
767
+ crop_width,
768
+ crop_height,
769
+ crop_top_start,
770
+ crop_left_start,
771
+ crop_width_start,
772
+ crop_height_start,
773
+ x_change,
774
+ y_change,
775
+ crop_aspect_ratio
776
+ )
777
+ crop_height = res.crop_height
778
+ crop_width = res.crop_width
779
+ crop_left = res.crop_left
780
+ crop_top = res.crop_top
781
+ }
782
+ set_image_pixels_crop()
783
+ }
784
+
785
+ // crop ↑↑↑
786
+
787
+ // ai ↓↓↓
788
+
789
+ async function ai_text_to_image(input) {
790
+ ai_error_message = null
791
+ if (typeof config?.ai_text_to_image !== "function") {
792
+ ai_error_message = "ai_text_to_image function not provided to config"
793
+ return
794
+ }
795
+ ai_text_to_image_is_loading = true
796
+ const res = await config?.ai_text_to_image(input)
797
+ if (res?.is_success) {
798
+ try {
799
+ const data_url = `data:image/webp;base64,${res?.data?.b64_json}`
800
+ image_sources = [data_url, ...image_sources]
801
+ image_source_index = 0
802
+ set_base_image(data_url)
803
+ mime_type = "image/webp"
804
+ mime_type_input = "image/webp"
805
+ set_file_data_base()
806
+ } catch (error) {
807
+ console.error("Error loading image:", error)
808
+ ai_error_message = "Error generating image"
809
+ }
810
+ } else {
811
+ ai_error_message = res?.error_message ?? "Error generating image"
812
+ }
813
+ ai_text_to_image_is_loading = false
814
+ }
815
+
816
+ async function ai_remove_background(input) {
817
+ ai_error_message = null
818
+ if (typeof config?.ai_remove_image_background !== "function") {
819
+ ai_error_message = "ai_remove_image_background function not provided to config"
820
+ return
821
+ }
822
+ ai_remove_background_is_loading = true
823
+ const res = await config?.ai_remove_image_background(input)
824
+ if (res?.is_success) {
825
+ try {
826
+ let response = await fetch(res?.data)
827
+ let blob = await response.blob()
828
+ let blob_url = URL.createObjectURL(blob)
829
+ let data_url = await get_image_data_url(blob_url, "image/webp")
830
+ image_sources = [data_url, ...image_sources]
831
+ image_source_index = 0
832
+ set_base_image(data_url)
833
+ mime_type = "image/webp"
834
+ mime_type_input = "image/webp"
835
+ set_file_data_base()
836
+ } catch (error) {
837
+ console.error("Error loading image:", error)
838
+ ai_error_message = "Error removing image background"
839
+ }
840
+ } else {
841
+ ai_error_message = res?.error_message ?? "Error removing image background"
842
+ }
843
+ ai_remove_background_is_loading = false
844
+ }
845
+
846
+ async function ai_restore_resolution(input) {
847
+ ai_error_message = null
848
+ if (typeof config?.ai_restore_resolution !== "function") {
849
+ ai_error_message = "ai_restore_resolution function not provided to config"
850
+ return
851
+ }
852
+ ai_restore_resolution_is_loading = true
853
+ const res = await config?.ai_restore_resolution(input)
854
+ if (res?.is_success) {
855
+ try {
856
+ let response = await fetch(res?.data)
857
+ let blob = await response.blob()
858
+ let blob_url = URL.createObjectURL(blob)
859
+ let data_url = await get_image_data_url(blob_url, "image/webp")
860
+ image_sources = [data_url, ...image_sources]
861
+ image_source_index = 0
862
+ set_base_image(data_url)
863
+ mime_type = "image/webp"
864
+ mime_type_input = "image/webp"
865
+ set_file_data_base()
866
+ } catch (error) {
867
+ console.error("Error loading image:", error)
868
+ ai_error_message = "Error removing image background"
869
+ }
870
+ } else {
871
+ ai_error_message = res?.error_message ?? "Error removing image background"
872
+ }
873
+ ai_restore_resolution_is_loading = false
874
+ }
875
+
876
+ async function ai_restore_face(input) {
877
+ ai_error_message = null
878
+ if (typeof config?.ai_restore_face !== "function") {
879
+ ai_error_message = "ai_restore_face function not provided to config"
880
+ return
881
+ }
882
+ ai_restore_face_is_loading = true
883
+ const res = await config?.ai_restore_face(input)
884
+ if (res?.is_success) {
885
+ try {
886
+ let response = await fetch(res?.data)
887
+ let blob = await response.blob()
888
+ let blob_url = URL.createObjectURL(blob)
889
+ let data_url = await get_image_data_url(blob_url, "image/webp")
890
+ image_sources = [data_url, ...image_sources]
891
+ image_source_index = 0
892
+ set_base_image(data_url)
893
+ mime_type = "image/webp"
894
+ mime_type_input = "image/webp"
895
+ set_file_data_base()
896
+ } catch (error) {
897
+ console.error("Error loading image:", error)
898
+ ai_error_message = "Error removing image background"
899
+ }
900
+ } else {
901
+ ai_error_message = res?.error_message ?? "Error removing image background"
902
+ }
903
+ ai_restore_face_is_loading = false
904
+ }
905
+
906
+ // ai ↑↑↑
907
+
908
+ // file ↓↓↓
909
+ let file_size_data_base = {
910
+ "image/png": null,
911
+ "image/webp": null,
912
+ "image/jpeg": null,
913
+ }
914
+
915
+ let base_chart_path = "M5,35 C100,35 93,30 95,5"
916
+
917
+ async function set_file_data_base() {
918
+ if (selected_image_source) {
919
+ file_size_data = deep_copy(file_size_data_base)
920
+ load_file_size_quality_data(mime_type, selected_image_source)
921
+ }
922
+ set_file_size_kb() // prob also run on various slider or image type changes
923
+ }
924
+
925
+ function get_mime_type_from_src(image_src) {
926
+ let re = /^data:(image\/\w+);base64,/
927
+ let result = image_src.match(re)
928
+ return result && result.length > 1 ? result[1] : null
929
+ }
930
+
931
+ async function file_input_change(file_name, mime_type, quality) {
932
+ if (file_name || mime_type) {
933
+ mime_type = mime_type && file_size_data_base.hasOwnProperty(mime_type) ? mime_type : mime_type_input
934
+ mime_type_input = mime_type
935
+ if (mime_type && file_name_text_input_manager?.val != file_name) {
936
+ file_name_text_input_manager.set_val(file_name)
937
+ }
938
+ }
939
+ if (mime_type || quality) {
940
+ quality = quality ? Math.max(1, Math.min(100, quality)) : file_quality_slider_manager?.val
941
+ let image_src = selected_image_source
942
+ if (image_src) {
943
+ if (!file_size_data?.[mime_type] && image_src) {
944
+ load_file_size_quality_data(mime_type, image_src)
945
+ }
946
+ }
947
+ file_quality_slider_manager.set_val(quality)
948
+ }
949
+ set_file_size_kb()
950
+ }
951
+
952
+ async function set_file_from_inputs() {
953
+ if (selected_image_source) {
954
+ let data_url = await get_image_data_url(selected_image_source, mime_type_input, file_quality_slider_manager?.val)
955
+ image_sources = [data_url, ...image_sources]
956
+ mime_type = mime_type_input
957
+ }
958
+ }
959
+
960
+ async function load_file_size_quality_data(mime_type, image_src) {
961
+ if (!file_size_data?.[mime_type]) {
962
+ file_size_data = deep_copy(file_size_data_base)
963
+ }
964
+ file_size_data[mime_type] = {
965
+ is_loading: true,
966
+ }
967
+ if (mime_type == "image/png") {
968
+ let data_url = await get_image_data_url(image_src, "image/png", 100)
969
+ let file_size = calculate_file_size(data_url, "image/png")
970
+ file_size_data[mime_type] = {
971
+ is_loading: false,
972
+ file_size_xy_data: [file_size],
973
+ min_file_size_kb: null,
974
+ max_file_size_kb: null,
975
+ chart_path: base_chart_path,
976
+ }
977
+ } else {
978
+ let x_vals_sets = [
979
+ [1, 80, 100],
980
+ [15, 95],
981
+ [5, 50, 90, 99],
982
+ ]
983
+ let file_size_xy_data = file_size_data?.[mime_type]?.file_size_xy_data || []
984
+ for (let i = 0; i < x_vals_sets.length; i++) {
985
+ let x_vals = x_vals_sets[i]
986
+ for (let x_val of x_vals) {
987
+ let data_url = await get_image_data_url(image_src, mime_type, x_val)
988
+ let file_size = calculate_file_size(data_url, mime_type)
989
+ file_size_xy_data.push([x_val, file_size])
990
+ }
991
+ let chart_data = generate_file_size_chart(file_size_xy_data)
992
+ let updated_data = { file_size_xy_data, ...chart_data }
993
+ file_size_data[mime_type] = {
994
+ is_loading: i < x_vals_sets.length - 1,
995
+ ...updated_data,
996
+ }
997
+ }
998
+ }
999
+ }
1000
+
1001
+ function generate_file_size_chart(file_size_data) {
1002
+ let w = 100
1003
+ let h = 40
1004
+ let x_padding = 5
1005
+ let y_padding = 5
1006
+ let min_file_size_kb
1007
+ let max_file_size_kb
1008
+ if (!file_size_data || file_size_data.length < 1) {
1009
+ min_file_size_kb = null
1010
+ max_file_size_kb = null
1011
+ chart_path = base_chart_path
1012
+ return
1013
+ }
1014
+ let x_values = file_size_data.map(([x, y]) => x)
1015
+ let y_values = file_size_data.map(([x, y]) => y)
1016
+ let min_x = Math.min(...x_values)
1017
+ let max_x = Math.max(...x_values)
1018
+ let min_y = Math.min(...y_values)
1019
+ let max_y = Math.max(...y_values)
1020
+ min_file_size_kb = min_y
1021
+ max_file_size_kb = max_y
1022
+ let x_scale = (w - 2 * x_padding) / w
1023
+ let x_padding_scale = x_padding / w
1024
+ let y_scale = (h - 2 * y_padding) / h
1025
+ let y_padding_scale = y_padding / h
1026
+ let normalized_data_scaled = []
1027
+ for (let [x, y] of file_size_data) {
1028
+ let new_x = ((x - min_x) / (max_x - min_x)) * x_scale + x_padding_scale
1029
+ let new_y = (1 - (y - min_y) / (max_y - min_y)) * y_scale + y_padding_scale
1030
+ normalized_data_scaled.push([new_x, new_y])
1031
+ }
1032
+ normalized_data_scaled.sort((a, b) => b[0] - a[0])
1033
+ let chart_path = "M"
1034
+ for (let item of normalized_data_scaled) {
1035
+ chart_path += " " + Math.floor(item[0] * w) + "," + Math.floor(item[1] * h)
1036
+ }
1037
+ return {
1038
+ min_file_size_kb,
1039
+ max_file_size_kb,
1040
+ chart_path,
1041
+ }
1042
+ }
1043
+
1044
+ function calculate_file_size(data_url, mime_type) {
1045
+ let head = `data:${mime_type};base64,`
1046
+ let file_size = (data_url.length - head.length) * 0.75
1047
+ return Math.round(file_size * 0.001) // size in KB
1048
+ }
1049
+
1050
+ async function get_image_data_url(image_src, mime_type = "image/webp", quality = 100) {
1051
+ return new Promise((resolve, reject) => {
1052
+ let img = new Image()
1053
+ img.crossOrigin = "Anonymous"
1054
+ img.onload = function () {
1055
+ let canvas = document.createElement("canvas")
1056
+ let ctx = canvas.getContext("2d", { willReadFrequently: true })
1057
+ canvas.width = this.naturalWidth
1058
+ canvas.height = this.naturalHeight
1059
+ ctx.drawImage(this, 0, 0)
1060
+ let data_url = canvas.toDataURL(mime_type, quality / 100)
1061
+ resolve(data_url)
1062
+ }
1063
+ img.onerror = reject
1064
+ img.src = image_src
1065
+ })
1066
+ }
1067
+
1068
+ async function download_image() {
1069
+ if (selected_image_source) {
1070
+ get_image_data_url(selected_image_source, mime_type_input ?? "image/webp", file_quality_slider_manager?.val)
1071
+ .then((data_url) => {
1072
+ let temp_link = document.createElement("a")
1073
+ temp_link.download = `${
1074
+ file_name_text_input_manager?.val ? file_name_text_input_manager?.val : create_unique_id("image", 6)
1075
+ }.${mime_type_extensions?.[mime_type_input ?? mime_type]}`
1076
+ temp_link.href = data_url
1077
+ temp_link.click()
1078
+ })
1079
+ .catch((err) => {
1080
+ console.error(`Failed to generate download link: ${err}`)
1081
+ })
1082
+ }
1083
+ }
1084
+
1085
+ // file ↑↑↑
1086
+
1087
+ function init_file(file_input) {
1088
+ let hidden_image_el = document.createElement("img")
1089
+ hidden_image_el.id = `${id}_hidden_image_el`
1090
+ hidden_image_el.style = "display: none;"
1091
+ hidden_image_el.alt = "hidden_image_el"
1092
+ hidden_image_el.onload = () => main_image_transformer()
1093
+ document.body.appendChild(hidden_image_el)
1094
+ if (!file_input?.file) {
1095
+ image_sources = []
1096
+ image_source_index = null
1097
+ file_name = null
1098
+ file_name_text_input_manager.set_val(null)
1099
+ mime_type = null
1100
+ mime_type_input = null
1101
+ set_base_image(null)
1102
+ return
1103
+ }
1104
+ let src_url = URL.createObjectURL(file_input?.file)
1105
+ image_sources = [src_url]
1106
+ image_source_index = 0
1107
+ let clean_file_name = (file_input?.file_name ?? file_input?.file?.name ?? null).replace(/\..+$/, "")
1108
+ file_name = clean_file_name
1109
+ file_name_text_input_manager.set_val(clean_file_name)
1110
+ mime_type = file_input?.mime_type ?? file_input?.file?.type ?? null
1111
+ mime_type_input = file_input?.mime_type ?? file_input?.file?.type ?? null
1112
+ set_base_image(src_url)
1113
+ set_file_data_base()
1114
+ }
1115
+
1116
+ async function init(config) {
1117
+ popover_manager = create_popover_manager({
1118
+ min_width: 320,
1119
+ target_width: 900,
1120
+ min_height: 320,
1121
+ target_height: 700,
1122
+ header: "Edit Image",
1123
+ type: "center",
1124
+ })
1125
+ file_input_manager = create_file_input_manager({
1126
+ is_multiselect: false,
1127
+ is_drop_zone: true,
1128
+ accept: ["image/png", "image/jpeg", "image/webp"],
1129
+ on_get_file: (input) => {
1130
+ init_file({ file: input })
1131
+ file_input_manager.clear_files()
1132
+ },
1133
+ height: "100%",
1134
+ })
1135
+ screen_tab_filters_button_manager = create_button_manager({
1136
+ type: "soft",
1137
+ text: "Filters",
1138
+ icon_sw: 30,
1139
+ is_compressed: true,
1140
+ support_icon: "sliders",
1141
+ selected_type: () => (screen_tab == "filters" ? "selected" : null),
1142
+ on_click: () => set_screen_tab("filters"),
1143
+ })
1144
+ screen_tab_crop_button_manager = create_button_manager({
1145
+ type: "soft",
1146
+ text: "Crop",
1147
+ is_compressed: true,
1148
+ icon_sw: 30,
1149
+ support_icon: "crop",
1150
+ selected_type: () => (screen_tab == "crop" ? "selected" : null),
1151
+ on_click: () => set_screen_tab("crop"),
1152
+ })
1153
+ screen_tab_resize_button_manager = create_button_manager({
1154
+ type: "soft",
1155
+ text: "Resize",
1156
+ icon_sw: 30,
1157
+ is_compressed: true,
1158
+ support_icon: "resize",
1159
+ selected_type: () => (screen_tab == "resize" ? "selected" : null),
1160
+ on_click: () => set_screen_tab("resize"),
1161
+ })
1162
+ screen_tab_ai_button_manager = create_button_manager({
1163
+ type: "soft",
1164
+ text: "AI",
1165
+ icon_sw: 30,
1166
+ is_compressed: true,
1167
+ support_icon: "brain",
1168
+ selected_type: () => (screen_tab == "ai" ? "selected" : null),
1169
+ on_click: () => set_screen_tab("ai"),
1170
+ })
1171
+ screen_tab_file_button_manager = create_button_manager({
1172
+ type: "soft",
1173
+ text: "File",
1174
+ icon_sw: 30,
1175
+ is_compressed: true,
1176
+ support_icon: "file",
1177
+ selected_type: () => (screen_tab == "file" ? "selected" : null),
1178
+ on_click: () => set_screen_tab("file"),
1179
+ })
1180
+ undo_button_manager = create_button_manager({
1181
+ type: "soft",
1182
+ is_no_wrap: true,
1183
+ text: () =>
1184
+ `Undo ${
1185
+ image_sources.length - image_source_index > 1
1186
+ ? "(" + (image_sources.length - image_source_index - 1) + ")"
1187
+ : ""
1188
+ }`,
1189
+ icon_sw: 30,
1190
+ is_compressed: true,
1191
+ support_icon: "undo_arrow",
1192
+ is_disabled: () => image_sources.length < 2 || image_sources.length - image_source_index < 2,
1193
+ on_click: () => undo(),
1194
+ })
1195
+ redo_button_manager = create_button_manager({
1196
+ type: "soft",
1197
+ is_no_wrap: true,
1198
+ text: () => `Redo ${image_source_index > 0 ? "(" + image_source_index + ")" : ""}`,
1199
+ icon_sw: 30,
1200
+ is_compressed: true,
1201
+ support_icon: "redo_arrow",
1202
+ is_disabled: () => image_sources.length < 2 || image_source_index < 1,
1203
+ on_click: () => redo(),
1204
+ })
1205
+ clear_button_manager = create_button_manager({
1206
+ type: "soft",
1207
+ text: "Clear",
1208
+ is_compressed: true,
1209
+ icon_sw: 30,
1210
+ support_icon: "trashcan",
1211
+ is_disabled: () => image_sources.length < 1,
1212
+ on_click: () => clear(),
1213
+ })
1214
+ finish_button_manager = create_button_manager({
1215
+ h: 10,
1216
+ l: 18,
1217
+ c: 14,
1218
+ is_no_wrap: true,
1219
+ text: "Finish",
1220
+ icon_sw: 30,
1221
+ is_compressed: true,
1222
+ support_icon: "check",
1223
+ is_disabled: () => image_sources.length < 1,
1224
+ on_click: () => finish(),
1225
+ })
1226
+ filter_brightness_slider_manager = create_slider_manager({
1227
+ label: "Brightness",
1228
+ label_font_size: 1.4,
1229
+ val: 100,
1230
+ min: 1,
1231
+ max: 200,
1232
+ step: 1,
1233
+ on_change: () => main_image_transformer(),
1234
+ })
1235
+ filter_contrast_slider_manager = create_slider_manager({
1236
+ label: "Contrast",
1237
+ label_font_size: 1.4,
1238
+ val: 100,
1239
+ min: 1,
1240
+ max: 200,
1241
+ step: 1,
1242
+ on_change: () => main_image_transformer(),
1243
+ })
1244
+ filter_saturation_slider_manager = create_slider_manager({
1245
+ label: "Saturation",
1246
+ label_font_size: 1.4,
1247
+ val: 100,
1248
+ min: 1,
1249
+ max: 200,
1250
+ step: 1,
1251
+ on_change: () => main_image_transformer(),
1252
+ })
1253
+ filter_grayscale_slider_manager = create_slider_manager({
1254
+ label: "Grayscale",
1255
+ label_font_size: 1.4,
1256
+ val: 0,
1257
+ min: 1,
1258
+ max: 200,
1259
+ step: 1,
1260
+ on_change: () => main_image_transformer(),
1261
+ })
1262
+ filter_hue_slider_manager = create_slider_manager({
1263
+ label: "Hue",
1264
+ label_font_size: 1.4,
1265
+ val: 0,
1266
+ min: 1,
1267
+ max: 200,
1268
+ step: 1,
1269
+ on_change: () => main_image_transformer(),
1270
+ })
1271
+ filter_red_slider_manager = create_slider_manager({
1272
+ label: "Red",
1273
+ label_font_size: 1.4,
1274
+ val: 100,
1275
+ min: 1,
1276
+ max: 255,
1277
+ step: 1,
1278
+ on_change: () => main_image_transformer(),
1279
+ })
1280
+ filter_green_slider_manager = create_slider_manager({
1281
+ label: "Green",
1282
+ label_font_size: 1.4,
1283
+ val: 100,
1284
+ min: 1,
1285
+ max: 255,
1286
+ step: 1,
1287
+ on_change: () => main_image_transformer(),
1288
+ })
1289
+ filter_blue_slider_manager = create_slider_manager({
1290
+ label: "Blue",
1291
+ label_font_size: 1.4,
1292
+ val: 100,
1293
+ min: 1,
1294
+ max: 100,
1295
+ step: 1,
1296
+ on_change: () => main_image_transformer(),
1297
+ })
1298
+ filter_blur_slider_manager = create_slider_manager({
1299
+ label: "Blur",
1300
+ label_font_size: 1.4,
1301
+ val: 0,
1302
+ min: 0,
1303
+ max: 200,
1304
+ step: 1,
1305
+ on_change: () => main_image_transformer(),
1306
+ })
1307
+ filter_opacity_slider_manager = create_slider_manager({
1308
+ label: "Opacity",
1309
+ label_font_size: 1.4,
1310
+ val: 100,
1311
+ min: 0,
1312
+ max: 100,
1313
+ step: 1,
1314
+ on_change: () => main_image_transformer(),
1315
+ })
1316
+ filters_set_default_button_manager = create_button_manager({
1317
+ type: "outlined",
1318
+ is_no_wrap: true,
1319
+ text: "Set Default Values",
1320
+ on_click: () => reset_filters(),
1321
+ })
1322
+ filters_apply_filters_button_manager = create_button_manager({
1323
+ is_no_wrap: true,
1324
+ text: "Apply Filters",
1325
+ on_click: () => apply_filters(),
1326
+ })
1327
+ crop_free_button_manager = create_button_manager({
1328
+ type: "soft",
1329
+ text: "Free",
1330
+ is_disabled: () => is_disabled,
1331
+ on_click: () => set_crop_box_loc(null, null),
1332
+ })
1333
+ crop_one_to_one_button_manager = create_button_manager({
1334
+ type: "soft",
1335
+ text: "1/1",
1336
+ icon_sw: 30,
1337
+ is_icon_left: true,
1338
+ text_align: "left",
1339
+ support_icon: "ar_one_to_one",
1340
+ is_disabled: () => is_disabled,
1341
+ is_half_selected: () => crop_aspect_ratio == 1,
1342
+ on_click: () => set_crop_box_loc(1, 1),
1343
+ })
1344
+ crop_four_to_three_button_manager = create_button_manager({
1345
+ type: "soft",
1346
+ text: "4/3",
1347
+ icon_sw: 30,
1348
+ is_icon_left: true,
1349
+ text_align: "left",
1350
+ support_icon: "ar_four_to_three",
1351
+ is_disabled: () => is_disabled,
1352
+ is_half_selected: () => crop_aspect_ratio == 1.333,
1353
+ on_click: () => set_crop_box_loc(4, 3),
1354
+ })
1355
+ crop_three_to_two_button_manager = create_button_manager({
1356
+ type: "soft",
1357
+ text: "3/2",
1358
+ icon_sw: 30,
1359
+ is_icon_left: true,
1360
+ text_align: "left",
1361
+ support_icon: "ar_three_to_two",
1362
+ is_disabled: () => is_disabled,
1363
+ is_half_selected: () => crop_aspect_ratio == 1.5,
1364
+ on_click: () => set_crop_box_loc(3, 2),
1365
+ })
1366
+ crop_sixteen_to_nine_button_manager = create_button_manager({
1367
+ type: "soft",
1368
+ text: "16/9",
1369
+ icon_sw: 30,
1370
+ is_icon_left: true,
1371
+ text_align: "left",
1372
+ support_icon: "ar_sixteen_to_nine",
1373
+ is_disabled: () => is_disabled,
1374
+ is_half_selected: () => crop_aspect_ratio == 1.778,
1375
+ on_click: () => set_crop_box_loc(16, 9),
1376
+ })
1377
+ crop_three_to_four_button_manager = create_button_manager({
1378
+ type: "soft",
1379
+ text: "3/4",
1380
+ icon_deg: 90,
1381
+ icon_sw: 30,
1382
+ is_icon_left: true,
1383
+ text_align: "left",
1384
+ support_icon: "ar_four_to_three",
1385
+ is_disabled: () => is_disabled,
1386
+ is_half_selected: () => crop_aspect_ratio == 0.75,
1387
+ on_click: () => set_crop_box_loc(3, 4),
1388
+ })
1389
+ crop_two_to_three_button_manager = create_button_manager({
1390
+ type: "soft",
1391
+ text: "2/3",
1392
+ icon_deg: 90,
1393
+ icon_sw: 30,
1394
+ is_icon_left: true,
1395
+ text_align: "left",
1396
+ support_icon: "ar_three_to_two",
1397
+ is_disabled: () => is_disabled,
1398
+ is_half_selected: () => crop_aspect_ratio == 0.6667,
1399
+ on_click: () => set_crop_box_loc(2, 3),
1400
+ })
1401
+ crop_nine_to_sixteen_button_manager = create_button_manager({
1402
+ type: "soft",
1403
+ text: "9/16",
1404
+ icon_deg: 90,
1405
+ icon_sw: 30,
1406
+ is_icon_left: true,
1407
+ text_align: "left",
1408
+ support_icon: "ar_sixteen_to_nine",
1409
+ is_disabled: () => is_disabled,
1410
+ is_half_selected: () => crop_aspect_ratio == 0.5625,
1411
+ on_click: () => set_crop_box_loc(9, 16),
1412
+ })
1413
+ crop_width_ratio_text_input_manager = create_text_input_manager({
1414
+ type: "number",
1415
+ val: crop_aspect_width_loc,
1416
+ min: 0,
1417
+ mt: 0.5,
1418
+ is_compressed: true,
1419
+ placeholder: "width ratio",
1420
+ is_disabled: () => is_disabled,
1421
+ on_change: (input) => {
1422
+ crop_aspect_width_loc = input
1423
+ set_crop_box(crop_aspect_width_loc, crop_aspect_height_loc)
1424
+ },
1425
+ })
1426
+ crop_height_ratio_text_input_manager = create_text_input_manager({
1427
+ type: "number",
1428
+ val: crop_aspect_height_loc,
1429
+ min: 0,
1430
+ mt: 0.5,
1431
+ is_compressed: true,
1432
+ placeholder: "height ratio",
1433
+ is_disabled: () => is_disabled,
1434
+ on_change: (input) => {
1435
+ crop_aspect_height_loc = input
1436
+ set_crop_box(crop_aspect_width_loc, crop_aspect_height_loc)
1437
+ },
1438
+ })
1439
+ crop_image_button_manager = create_button_manager({
1440
+ text: "Crop Image",
1441
+ mt: 0.5,
1442
+ is_disabled: () => is_disabled,
1443
+ on_click: () => crop_image(),
1444
+ })
1445
+ file_name_text_input_manager = create_text_input_manager({
1446
+ label: "File Name",
1447
+ placeholder: () => (file_name_derived && file_name_derived.length > 0 ? file_name_derived : "some_file_name"),
1448
+ val: file_name_derived,
1449
+ mb: 1,
1450
+ is_disabled: () => is_disabled,
1451
+ on_change: (input) => file_input_change(input, mime_type),
1452
+ })
1453
+ mime_type_webp_button_manager = create_button_manager({
1454
+ type: "outlined",
1455
+ text: "webp",
1456
+ is_disabled: () => is_disabled,
1457
+ selected_type: () => (mime_type_input == "image/webp" ? "selected" : null),
1458
+ on_click: () => file_input_change(file_name_text_input_manager?.val, "image/webp"),
1459
+ })
1460
+ mime_type_jpeg_button_manager = create_button_manager({
1461
+ type: "outlined",
1462
+ text: "jpeg",
1463
+ is_disabled: () => is_disabled,
1464
+ selected_type: () => (mime_type_input == "image/jpeg" ? "selected" : null),
1465
+ on_click: () => file_input_change(file_name_text_input_manager?.val, "image/jpeg"),
1466
+ })
1467
+ mime_type_png_button_manager = create_button_manager({
1468
+ type: "outlined",
1469
+ text: "png",
1470
+ is_disabled: () => is_disabled,
1471
+ selected_type: () => (mime_type_input == "image/png" ? "selected" : null),
1472
+ on_click: () => file_input_change(file_name_text_input_manager?.val, "image/png"),
1473
+ })
1474
+ download_image_button_manager = create_button_manager({
1475
+ type: "outlined",
1476
+ text: "Download",
1477
+ is_disabled: () => is_disabled,
1478
+ on_click: () => download_image(),
1479
+ })
1480
+ set_file_changes_button_manager = create_button_manager({
1481
+ text: "Set File Changes",
1482
+ is_disabled: () => is_disabled,
1483
+ on_click: () => set_file_from_inputs(),
1484
+ })
1485
+ file_quality_slider_manager = create_slider_manager({
1486
+ val: 75,
1487
+ min: 1,
1488
+ max: 100,
1489
+ step: 1,
1490
+ is_disabled: () => is_disabled,
1491
+ on_change: (input) => file_input_change(file_name_text_input_manager?.val, null, input),
1492
+ })
1493
+ ai_tab_dropdown_manager = create_dropdown_manager({
1494
+ type: "horiz_selector",
1495
+ val: "text_to_image",
1496
+ options: [
1497
+ { key: "text_to_image", name: "Text to Image" },
1498
+ { key: "remove_background", name: "Remove Background" },
1499
+ { key: "restore_resolution", name: "Restore Resolution" },
1500
+ { key: "restore_face", name: "Restore Face" },
1501
+ ],
1502
+ })
1503
+ ai_generate_image_from_text_text_input_manager = create_text_input_manager({
1504
+ type: "text_area",
1505
+ rows: 3,
1506
+ placeholder: "Describe what you want your image to be of",
1507
+ is_disabled: () => ai_text_to_image_is_loading,
1508
+ })
1509
+ ai_generate_image_from_text_button_manager = create_button_manager({
1510
+ text: "Generate Image From text",
1511
+ is_compressed: true,
1512
+ mt: 1,
1513
+ is_loading: () => ai_text_to_image_is_loading,
1514
+ is_disabled: () => is_disabled,
1515
+ on_click: () => ai_text_to_image(ai_generate_image_from_text_text_input_manager?.val),
1516
+ })
1517
+ ai_remove_bg_button_manager = create_button_manager({
1518
+ text: "Remove Background",
1519
+ is_compressed: true,
1520
+ is_loading: () => ai_remove_background_is_loading,
1521
+ is_disabled: () => is_disabled,
1522
+ on_click: () => ai_remove_background(selected_image_source),
1523
+ })
1524
+ ai_restore_resolution_button_manager = create_button_manager({
1525
+ text: "Restore Resolution",
1526
+ is_compressed: true,
1527
+ is_loading: () => ai_restore_resolution_is_loading,
1528
+ is_disabled: () => is_disabled,
1529
+ on_click: () => ai_restore_resolution(selected_image_source),
1530
+ })
1531
+ ai_restore_face_button_manager = create_button_manager({
1532
+ text: "Restore Face",
1533
+ is_compressed: true,
1534
+ is_loading: () => ai_restore_face_is_loading,
1535
+ is_disabled: () => is_disabled,
1536
+ on_click: () => ai_restore_face(selected_image_source),
1537
+ })
1538
+ resize_width_dropdown_manager = create_dropdown_manager({
1539
+ type: "horiz_selector",
1540
+ val: resize_width,
1541
+ min_header_width: 9.5,
1542
+ header: "Width",
1543
+ header_icon: "opposing_arrows",
1544
+ header_icon_deg: 90,
1545
+ options: resize_options,
1546
+ is_disabled: () => is_disabled,
1547
+ on_item_click: (input) => {
1548
+ set_resize_dimensions(input.key, null)
1549
+ resize_width_text_input_manager.set_val(resize_width)
1550
+ resize_height_text_input_manager.set_val(resize_height)
1551
+ },
1552
+ })
1553
+ resize_height_dropdown_manager = create_dropdown_manager({
1554
+ type: "horiz_selector",
1555
+ val: resize_height,
1556
+ min_header_width: 9.5,
1557
+ header: "Height",
1558
+ header_icon: "opposing_arrows",
1559
+ header_icon_deg: 0,
1560
+ options: resize_options,
1561
+ is_disabled: () => is_disabled,
1562
+ on_item_click: (input) => {
1563
+ set_resize_dimensions(null, input.key)
1564
+ resize_width_text_input_manager.set_val(resize_width)
1565
+ resize_height_text_input_manager.set_val(resize_height)
1566
+ },
1567
+ })
1568
+ resize_width_text_input_manager = create_text_input_manager({
1569
+ type: "number",
1570
+ val: resize_width,
1571
+ min: 0,
1572
+ mt: 0.5,
1573
+ label: "Resize Width",
1574
+ is_popover: true,
1575
+ is_popover_edit_content: true,
1576
+ is_compressed: true,
1577
+ placeholder: "resize width",
1578
+ is_disabled: () => is_disabled,
1579
+ on_finish: (input) => {
1580
+ set_resize_dimensions(input, null)
1581
+ if (resize_height_text_input_manager?.val != resize_height) {
1582
+ resize_height_text_input_manager.set_val(resize_height)
1583
+ }
1584
+ },
1585
+ })
1586
+ resize_height_text_input_manager = create_text_input_manager({
1587
+ type: "number",
1588
+ val: resize_height,
1589
+ min: 0,
1590
+ mt: 0.5,
1591
+ label: "Resize Height",
1592
+ is_popover: true,
1593
+ is_popover_edit_content: true,
1594
+ is_compressed: true,
1595
+ placeholder: "resize height",
1596
+ is_disabled: () => is_disabled,
1597
+ on_finish: (input) => {
1598
+ set_resize_dimensions(null, input)
1599
+ if (resize_width_text_input_manager?.val != resize_width) {
1600
+ resize_width_text_input_manager.set_val(resize_width)
1601
+ }
1602
+ },
1603
+ })
1604
+ resize_aspect_ratio_lock_button_manager = create_button_manager({
1605
+ type: "outlined",
1606
+ icon_sw: 30,
1607
+ fixed_width: 20,
1608
+ mt: 0.5,
1609
+ support_icon: () => (is_lock_resize_aspect_ratio ? "linked" : "unlinked"),
1610
+ text: () => `${is_lock_resize_aspect_ratio ? "Unlock" : "Lock"} Aspect Ratio`,
1611
+ selected_type: () => (is_lock_resize_aspect_ratio ? "selected" : null),
1612
+ is_disabled: () => is_disabled,
1613
+ on_click: () => toggle_is_lock_resize_aspect_ratio(),
1614
+ })
1615
+ resize_image_button_manager = create_button_manager({
1616
+ text: "Resize Image",
1617
+ is_compressed: true,
1618
+ mt: 0.5,
1619
+ is_success_animation: true,
1620
+ is_disabled: () => is_disabled || !resize_width || !resize_height,
1621
+ on_click: () => main_image_transformer(),
1622
+ })
1623
+ // init_file() issue if called without document defined
1624
+ }
1625
+
1626
+ init(config)
1627
+
1628
+ return {
1629
+ id,
1630
+ get file_picker_file() {
1631
+ return file_picker_file
1632
+ },
1633
+ get image_sources() {
1634
+ return image_sources
1635
+ },
1636
+ get image_source_index() {
1637
+ return image_source_index
1638
+ },
1639
+ get selected_image_source() {
1640
+ return selected_image_source
1641
+ },
1642
+ get screen_tab() {
1643
+ return screen_tab
1644
+ },
1645
+ get crop_left() {
1646
+ return crop_left
1647
+ },
1648
+ get crop_top() {
1649
+ return crop_top
1650
+ },
1651
+ get crop_width() {
1652
+ return crop_width
1653
+ },
1654
+ get crop_height() {
1655
+ return crop_height
1656
+ },
1657
+ get is_disabled() {
1658
+ return is_disabled
1659
+ },
1660
+ get current_image_width() {
1661
+ return current_image_width
1662
+ },
1663
+ get current_image_height() {
1664
+ return current_image_height
1665
+ },
1666
+ get image_pixels_crop_width() {
1667
+ return image_pixels_crop_width
1668
+ },
1669
+ get image_pixels_crop_height() {
1670
+ return image_pixels_crop_height
1671
+ },
1672
+ get current_image_ar() {
1673
+ return current_image_ar
1674
+ },
1675
+ get crop_aspect_ratio() {
1676
+ return crop_aspect_ratio
1677
+ },
1678
+ get is_lock_resize_aspect_ratio() {
1679
+ return is_lock_resize_aspect_ratio
1680
+ },
1681
+ get resize_width() {
1682
+ return resize_width
1683
+ },
1684
+ get resize_height() {
1685
+ return resize_height
1686
+ },
1687
+ get file_size_data() {
1688
+ return file_size_data
1689
+ },
1690
+ get mime_type_input() {
1691
+ return mime_type_input
1692
+ },
1693
+ get file_size_kb() {
1694
+ return file_size_kb
1695
+ },
1696
+ get file_name() {
1697
+ return file_name
1698
+ },
1699
+ get file_name_derived() {
1700
+ return file_name_derived
1701
+ },
1702
+ get file_name_derived_with_extension() {
1703
+ return file_name_derived_with_extension
1704
+ },
1705
+ get ai_error_message() {
1706
+ return ai_error_message
1707
+ },
1708
+ get file_input_manager() {
1709
+ return file_input_manager
1710
+ },
1711
+ get screen_tab_filters_button_manager() {
1712
+ return screen_tab_filters_button_manager
1713
+ },
1714
+ get screen_tab_crop_button_manager() {
1715
+ return screen_tab_crop_button_manager
1716
+ },
1717
+ get screen_tab_resize_button_manager() {
1718
+ return screen_tab_resize_button_manager
1719
+ },
1720
+ get screen_tab_ai_button_manager() {
1721
+ return screen_tab_ai_button_manager
1722
+ },
1723
+ get screen_tab_file_button_manager() {
1724
+ return screen_tab_file_button_manager
1725
+ },
1726
+ get undo_button_manager() {
1727
+ return undo_button_manager
1728
+ },
1729
+ get redo_button_manager() {
1730
+ return redo_button_manager
1731
+ },
1732
+ get clear_button_manager() {
1733
+ return clear_button_manager
1734
+ },
1735
+ get finish_button_manager() {
1736
+ return finish_button_manager
1737
+ },
1738
+ get filter_brightness_slider_manager() {
1739
+ return filter_brightness_slider_manager
1740
+ },
1741
+ get filter_contrast_slider_manager() {
1742
+ return filter_contrast_slider_manager
1743
+ },
1744
+ get filter_saturation_slider_manager() {
1745
+ return filter_saturation_slider_manager
1746
+ },
1747
+ get filter_grayscale_slider_manager() {
1748
+ return filter_grayscale_slider_manager
1749
+ },
1750
+ get filter_hue_slider_manager() {
1751
+ return filter_hue_slider_manager
1752
+ },
1753
+ get filter_red_slider_manager() {
1754
+ return filter_red_slider_manager
1755
+ },
1756
+ get filter_green_slider_manager() {
1757
+ return filter_green_slider_manager
1758
+ },
1759
+ get filter_blue_slider_manager() {
1760
+ return filter_blue_slider_manager
1761
+ },
1762
+ get filter_blur_slider_manager() {
1763
+ return filter_blur_slider_manager
1764
+ },
1765
+ get filter_opacity_slider_manager() {
1766
+ return filter_opacity_slider_manager
1767
+ },
1768
+ get filters_set_default_button_manager() {
1769
+ return filters_set_default_button_manager
1770
+ },
1771
+ get filters_apply_filters_button_manager() {
1772
+ return filters_apply_filters_button_manager
1773
+ },
1774
+ get crop_free_button_manager() {
1775
+ return crop_free_button_manager
1776
+ },
1777
+ get crop_one_to_one_button_manager() {
1778
+ return crop_one_to_one_button_manager
1779
+ },
1780
+ get crop_four_to_three_button_manager() {
1781
+ return crop_four_to_three_button_manager
1782
+ },
1783
+ get crop_three_to_two_button_manager() {
1784
+ return crop_three_to_two_button_manager
1785
+ },
1786
+ get crop_sixteen_to_nine_button_manager() {
1787
+ return crop_sixteen_to_nine_button_manager
1788
+ },
1789
+ get crop_three_to_four_button_manager() {
1790
+ return crop_three_to_four_button_manager
1791
+ },
1792
+ get crop_two_to_three_button_manager() {
1793
+ return crop_two_to_three_button_manager
1794
+ },
1795
+ get crop_nine_to_sixteen_button_manager() {
1796
+ return crop_nine_to_sixteen_button_manager
1797
+ },
1798
+ get crop_width_ratio_text_input_manager() {
1799
+ return crop_width_ratio_text_input_manager
1800
+ },
1801
+ get crop_height_ratio_text_input_manager() {
1802
+ return crop_height_ratio_text_input_manager
1803
+ },
1804
+ get crop_image_button_manager() {
1805
+ return crop_image_button_manager
1806
+ },
1807
+ get crop_aspect_width_loc() {
1808
+ return crop_aspect_width_loc
1809
+ },
1810
+ get crop_aspect_height_loc() {
1811
+ return crop_aspect_height_loc
1812
+ },
1813
+ get file_name_text_input_manager() {
1814
+ return file_name_text_input_manager
1815
+ },
1816
+ get mime_type_webp_button_manager() {
1817
+ return mime_type_webp_button_manager
1818
+ },
1819
+ get mime_type_jpeg_button_manager() {
1820
+ return mime_type_jpeg_button_manager
1821
+ },
1822
+ get mime_type_png_button_manager() {
1823
+ return mime_type_png_button_manager
1824
+ },
1825
+ get download_image_button_manager() {
1826
+ return download_image_button_manager
1827
+ },
1828
+ get set_file_changes_button_manager() {
1829
+ return set_file_changes_button_manager
1830
+ },
1831
+ get shown_file_size_data() {
1832
+ return shown_file_size_data
1833
+ },
1834
+ get file_quality_slider_manager() {
1835
+ return file_quality_slider_manager
1836
+ },
1837
+ get ai_tab_dropdown_manager() {
1838
+ return ai_tab_dropdown_manager
1839
+ },
1840
+ get ai_text_to_image_is_loading() {
1841
+ return ai_text_to_image_is_loading
1842
+ },
1843
+ get ai_generate_image_from_text_text_input_manager() {
1844
+ return ai_generate_image_from_text_text_input_manager
1845
+ },
1846
+ get ai_generate_image_from_text_button_manager() {
1847
+ return ai_generate_image_from_text_button_manager
1848
+ },
1849
+ get ai_remove_bg_button_manager() {
1850
+ return ai_remove_bg_button_manager
1851
+ },
1852
+ get ai_restore_resolution_button_manager() {
1853
+ return ai_restore_resolution_button_manager
1854
+ },
1855
+ get ai_restore_face_button_manager() {
1856
+ return ai_restore_face_button_manager
1857
+ },
1858
+ get resize_width_dropdown_manager() {
1859
+ return resize_width_dropdown_manager
1860
+ },
1861
+ get resize_height_dropdown_manager() {
1862
+ return resize_height_dropdown_manager
1863
+ },
1864
+ get resize_width_text_input_manager() {
1865
+ return resize_width_text_input_manager
1866
+ },
1867
+ get resize_height_text_input_manager() {
1868
+ return resize_height_text_input_manager
1869
+ },
1870
+ get resize_aspect_ratio_lock_button_manager() {
1871
+ return resize_aspect_ratio_lock_button_manager
1872
+ },
1873
+ get resize_image_button_manager() {
1874
+ return resize_image_button_manager
1875
+ },
1876
+ get is_popover() {
1877
+ return is_popover
1878
+ },
1879
+ get popover_manager() {
1880
+ return popover_manager
1881
+ },
1882
+ init,
1883
+ init_file,
1884
+ on_destroy,
1885
+ set_screen_tab,
1886
+ undo,
1887
+ redo,
1888
+ clear,
1889
+ finish,
1890
+ set_base_image,
1891
+ apply_filters,
1892
+ reset_filters,
1893
+ main_image_transformer,
1894
+ crop_on_up,
1895
+ crop_on_move,
1896
+ crop_on_down,
1897
+ set_crop_box,
1898
+ crop_image,
1899
+ toggle_is_lock_resize_aspect_ratio,
1900
+ set_resize_dimensions,
1901
+ main_image_transformer,
1902
+ file_input_change,
1903
+ download_image,
1904
+ set_file_from_inputs,
1905
+ drop_handler,
1906
+ }
1907
+ }