@keenthemes/ktui 1.0.28 → 1.1.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 (288) hide show
  1. package/README.md +27 -0
  2. package/dist/ktui.js +8780 -6199
  3. package/dist/ktui.min.js +1 -1
  4. package/dist/ktui.min.js.map +1 -1
  5. package/dist/styles.css +2744 -1367
  6. package/lib/cjs/components/alert/alert.js +1025 -0
  7. package/lib/cjs/components/alert/alert.js.map +1 -0
  8. package/lib/cjs/components/alert/index.js +20 -0
  9. package/lib/cjs/components/alert/index.js.map +1 -0
  10. package/lib/cjs/components/alert/templates.js +120 -0
  11. package/lib/cjs/components/alert/templates.js.map +1 -0
  12. package/lib/cjs/components/alert/types.js +7 -0
  13. package/lib/cjs/components/alert/types.js.map +1 -0
  14. package/lib/cjs/components/datepicker/config/config.js +42 -0
  15. package/lib/cjs/components/datepicker/config/config.js.map +1 -0
  16. package/lib/cjs/components/datepicker/config/index.js +24 -0
  17. package/lib/cjs/components/datepicker/config/index.js.map +1 -0
  18. package/lib/cjs/components/datepicker/config/interfaces.js +7 -0
  19. package/lib/cjs/components/datepicker/config/interfaces.js.map +1 -0
  20. package/lib/cjs/components/datepicker/config/types.js +7 -0
  21. package/lib/cjs/components/datepicker/config/types.js.map +1 -0
  22. package/lib/cjs/components/datepicker/core/event-manager.js +135 -0
  23. package/lib/cjs/components/datepicker/core/event-manager.js.map +1 -0
  24. package/lib/cjs/components/datepicker/core/focus-manager.js +167 -0
  25. package/lib/cjs/components/datepicker/core/focus-manager.js.map +1 -0
  26. package/lib/cjs/components/datepicker/core/helpers.js +219 -0
  27. package/lib/cjs/components/datepicker/core/helpers.js.map +1 -0
  28. package/lib/cjs/components/datepicker/core/index.js +25 -0
  29. package/lib/cjs/components/datepicker/core/index.js.map +1 -0
  30. package/lib/cjs/components/datepicker/core/unified-state-manager.js +394 -0
  31. package/lib/cjs/components/datepicker/core/unified-state-manager.js.map +1 -0
  32. package/lib/cjs/components/datepicker/datepicker.js +2066 -763
  33. package/lib/cjs/components/datepicker/datepicker.js.map +1 -1
  34. package/lib/cjs/components/datepicker/index.js +19 -8
  35. package/lib/cjs/components/datepicker/index.js.map +1 -1
  36. package/lib/cjs/components/datepicker/ui/index.js +23 -0
  37. package/lib/cjs/components/datepicker/ui/index.js.map +1 -0
  38. package/lib/cjs/components/datepicker/ui/input/dropdown.js +489 -0
  39. package/lib/cjs/components/datepicker/ui/input/dropdown.js.map +1 -0
  40. package/lib/cjs/components/datepicker/ui/input/index.js +23 -0
  41. package/lib/cjs/components/datepicker/ui/input/index.js.map +1 -0
  42. package/lib/cjs/components/datepicker/ui/input/segmented-input.js +640 -0
  43. package/lib/cjs/components/datepicker/ui/input/segmented-input.js.map +1 -0
  44. package/lib/cjs/components/datepicker/ui/renderers/calendar.js +446 -0
  45. package/lib/cjs/components/datepicker/ui/renderers/calendar.js.map +1 -0
  46. package/lib/cjs/components/datepicker/ui/renderers/footer.js +42 -0
  47. package/lib/cjs/components/datepicker/ui/renderers/footer.js.map +1 -0
  48. package/lib/cjs/components/datepicker/ui/renderers/header.js +32 -0
  49. package/lib/cjs/components/datepicker/ui/renderers/header.js.map +1 -0
  50. package/lib/cjs/components/datepicker/ui/renderers/index.js +25 -0
  51. package/lib/cjs/components/datepicker/ui/renderers/index.js.map +1 -0
  52. package/lib/cjs/components/datepicker/ui/renderers/time-picker.js +384 -0
  53. package/lib/cjs/components/datepicker/ui/renderers/time-picker.js.map +1 -0
  54. package/lib/cjs/components/datepicker/ui/templates/index.js +22 -0
  55. package/lib/cjs/components/datepicker/ui/templates/index.js.map +1 -0
  56. package/lib/cjs/components/datepicker/ui/templates/templates.js +253 -0
  57. package/lib/cjs/components/datepicker/ui/templates/templates.js.map +1 -0
  58. package/lib/cjs/components/datepicker/utils/date-formatters.js +88 -0
  59. package/lib/cjs/components/datepicker/utils/date-formatters.js.map +1 -0
  60. package/lib/cjs/components/datepicker/utils/date-utils.js +194 -0
  61. package/lib/cjs/components/datepicker/utils/date-utils.js.map +1 -0
  62. package/lib/cjs/components/datepicker/utils/index.js +24 -0
  63. package/lib/cjs/components/datepicker/utils/index.js.map +1 -0
  64. package/lib/cjs/components/datepicker/utils/time-utils.js +213 -0
  65. package/lib/cjs/components/datepicker/utils/time-utils.js.map +1 -0
  66. package/lib/cjs/index.js +6 -1
  67. package/lib/cjs/index.js.map +1 -1
  68. package/lib/esm/components/alert/alert.js +1022 -0
  69. package/lib/esm/components/alert/alert.js.map +1 -0
  70. package/lib/esm/components/alert/index.js +4 -0
  71. package/lib/esm/components/alert/index.js.map +1 -0
  72. package/lib/esm/components/alert/templates.js +112 -0
  73. package/lib/esm/components/alert/templates.js.map +1 -0
  74. package/lib/esm/components/alert/types.js +6 -0
  75. package/lib/esm/components/alert/types.js.map +1 -0
  76. package/lib/esm/components/datepicker/config/config.js +39 -0
  77. package/lib/esm/components/datepicker/config/config.js.map +1 -0
  78. package/lib/esm/components/datepicker/config/index.js +8 -0
  79. package/lib/esm/components/datepicker/config/index.js.map +1 -0
  80. package/lib/esm/components/datepicker/config/interfaces.js +6 -0
  81. package/lib/esm/components/datepicker/config/interfaces.js.map +1 -0
  82. package/lib/esm/components/datepicker/config/types.js +6 -0
  83. package/lib/esm/components/datepicker/config/types.js.map +1 -0
  84. package/lib/esm/components/datepicker/core/event-manager.js +133 -0
  85. package/lib/esm/components/datepicker/core/event-manager.js.map +1 -0
  86. package/lib/esm/components/datepicker/core/focus-manager.js +164 -0
  87. package/lib/esm/components/datepicker/core/focus-manager.js.map +1 -0
  88. package/lib/esm/components/datepicker/core/helpers.js +211 -0
  89. package/lib/esm/components/datepicker/core/helpers.js.map +1 -0
  90. package/lib/esm/components/datepicker/core/index.js +9 -0
  91. package/lib/esm/components/datepicker/core/index.js.map +1 -0
  92. package/lib/esm/components/datepicker/core/unified-state-manager.js +391 -0
  93. package/lib/esm/components/datepicker/core/unified-state-manager.js.map +1 -0
  94. package/lib/esm/components/datepicker/datepicker.js +2065 -763
  95. package/lib/esm/components/datepicker/datepicker.js.map +1 -1
  96. package/lib/esm/components/datepicker/index.js +6 -8
  97. package/lib/esm/components/datepicker/index.js.map +1 -1
  98. package/lib/esm/components/datepicker/ui/index.js +7 -0
  99. package/lib/esm/components/datepicker/ui/index.js.map +1 -0
  100. package/lib/esm/components/datepicker/ui/input/dropdown.js +486 -0
  101. package/lib/esm/components/datepicker/ui/input/dropdown.js.map +1 -0
  102. package/lib/esm/components/datepicker/ui/input/index.js +7 -0
  103. package/lib/esm/components/datepicker/ui/input/index.js.map +1 -0
  104. package/lib/esm/components/datepicker/ui/input/segmented-input.js +637 -0
  105. package/lib/esm/components/datepicker/ui/input/segmented-input.js.map +1 -0
  106. package/lib/esm/components/datepicker/ui/renderers/calendar.js +443 -0
  107. package/lib/esm/components/datepicker/ui/renderers/calendar.js.map +1 -0
  108. package/lib/esm/components/datepicker/ui/renderers/footer.js +39 -0
  109. package/lib/esm/components/datepicker/ui/renderers/footer.js.map +1 -0
  110. package/lib/esm/components/datepicker/ui/renderers/header.js +29 -0
  111. package/lib/esm/components/datepicker/ui/renderers/header.js.map +1 -0
  112. package/lib/esm/components/datepicker/ui/renderers/index.js +9 -0
  113. package/lib/esm/components/datepicker/ui/renderers/index.js.map +1 -0
  114. package/lib/esm/components/datepicker/ui/renderers/time-picker.js +381 -0
  115. package/lib/esm/components/datepicker/ui/renderers/time-picker.js.map +1 -0
  116. package/lib/esm/components/datepicker/ui/templates/index.js +6 -0
  117. package/lib/esm/components/datepicker/ui/templates/index.js.map +1 -0
  118. package/lib/esm/components/datepicker/ui/templates/templates.js +242 -0
  119. package/lib/esm/components/datepicker/ui/templates/templates.js.map +1 -0
  120. package/lib/esm/components/datepicker/utils/date-formatters.js +83 -0
  121. package/lib/esm/components/datepicker/utils/date-formatters.js.map +1 -0
  122. package/lib/esm/components/datepicker/utils/date-utils.js +184 -0
  123. package/lib/esm/components/datepicker/utils/date-utils.js.map +1 -0
  124. package/lib/esm/components/datepicker/utils/index.js +8 -0
  125. package/lib/esm/components/datepicker/utils/index.js.map +1 -0
  126. package/lib/esm/components/datepicker/utils/time-utils.js +201 -0
  127. package/lib/esm/components/datepicker/utils/time-utils.js.map +1 -0
  128. package/lib/esm/index.js +4 -0
  129. package/lib/esm/index.js.map +1 -1
  130. package/package.json +22 -3
  131. package/src/components/alert/alert.css +429 -188
  132. package/src/components/alert/alert.ts +990 -0
  133. package/src/components/alert/index.ts +4 -0
  134. package/src/components/alert/templates.ts +110 -0
  135. package/src/components/alert/tests/accessibility/aria-roles.test.ts +19 -0
  136. package/src/components/alert/tests/accessibility/focus-management.test.ts +19 -0
  137. package/src/components/alert/tests/accessibility/keyboard-nav.test.ts +22 -0
  138. package/src/components/alert/tests/actions/confirm-cancel.test.ts +122 -0
  139. package/src/components/alert/tests/actions/input-field.test.ts +180 -0
  140. package/src/components/alert/tests/alert.basic.test.ts +126 -0
  141. package/src/components/alert/tests/alert.config.test.ts +75 -0
  142. package/src/components/alert/tests/alert.templates.test.ts +17 -0
  143. package/src/components/alert/tests/config/attribute-config.test.ts +94 -0
  144. package/src/components/alert/tests/config/json-config.test.ts +119 -0
  145. package/src/components/alert/tests/config/merging.test.ts +89 -0
  146. package/src/components/alert/tests/dismissal/auto-dismiss.test.ts +96 -0
  147. package/src/components/alert/tests/dismissal/escape-key-dismiss.test.ts +105 -0
  148. package/src/components/alert/tests/dismissal/manual-dismiss.test.ts +90 -0
  149. package/src/components/alert/tests/dismissal/outside-click-dismiss.test.ts +91 -0
  150. package/src/components/alert/tests/edge-cases/invalid-config.test.ts +19 -0
  151. package/src/components/alert/tests/edge-cases/multiple-alerts.test.ts +19 -0
  152. package/src/components/alert/tests/rendering/custom-content.test.ts +81 -0
  153. package/src/components/alert/tests/rendering/info-alert.test.ts +84 -0
  154. package/src/components/alert/tests/rendering/success-alert.test.ts +100 -0
  155. package/src/components/alert/tests/templates/default-templates.test.ts +16 -0
  156. package/src/components/alert/tests/templates/user-templates.test.ts +16 -0
  157. package/src/components/alert/types.ts +145 -0
  158. package/src/components/datepicker/__tests__/datepicker-events.test.ts +356 -0
  159. package/src/components/datepicker/__tests__/datepicker-init.test.ts +343 -0
  160. package/src/components/datepicker/__tests__/datepicker-integration.test.ts +435 -0
  161. package/src/components/datepicker/__tests__/datepicker-timezone.test.ts +220 -0
  162. package/src/components/datepicker/__tests__/segmented-input-focus.test.ts +380 -0
  163. package/src/components/datepicker/__tests__/selective-state-updates.test.ts +400 -0
  164. package/src/components/datepicker/__tests__/state-manager.test.ts +421 -0
  165. package/src/components/datepicker/__tests__/time-preservation.test.ts +387 -0
  166. package/src/components/datepicker/config/config.ts +40 -0
  167. package/src/components/datepicker/config/index.ts +8 -0
  168. package/src/components/datepicker/config/interfaces.ts +82 -0
  169. package/src/components/datepicker/config/types.ts +188 -0
  170. package/src/components/datepicker/core/event-manager.ts +159 -0
  171. package/src/components/datepicker/core/focus-manager.ts +201 -0
  172. package/src/components/datepicker/core/helpers.ts +231 -0
  173. package/src/components/datepicker/core/index.ts +9 -0
  174. package/src/components/datepicker/core/unified-state-manager.ts +459 -0
  175. package/src/components/datepicker/datepicker.css +429 -1
  176. package/src/components/datepicker/datepicker.ts +2538 -1277
  177. package/src/components/datepicker/index.ts +6 -8
  178. package/src/components/datepicker/ui/index.ts +7 -0
  179. package/src/components/datepicker/ui/input/dropdown.ts +552 -0
  180. package/src/components/datepicker/ui/input/index.ts +7 -0
  181. package/src/components/datepicker/ui/input/segmented-input.ts +638 -0
  182. package/src/components/datepicker/ui/renderers/__tests__/calendar-optimizations.test.ts +611 -0
  183. package/src/components/datepicker/ui/renderers/calendar.ts +530 -0
  184. package/src/components/datepicker/ui/renderers/footer.ts +43 -0
  185. package/src/components/datepicker/ui/renderers/header.ts +33 -0
  186. package/src/components/datepicker/ui/renderers/index.ts +9 -0
  187. package/src/components/datepicker/ui/renderers/time-picker.ts +438 -0
  188. package/src/components/datepicker/ui/templates/index.ts +6 -0
  189. package/src/components/datepicker/ui/templates/templates.ts +306 -0
  190. package/src/components/datepicker/utils/__tests__/date-formatters.test.ts +160 -0
  191. package/src/components/datepicker/utils/__tests__/date-utils-keys.test.ts +86 -0
  192. package/src/components/datepicker/utils/__tests__/date-utils-timezone.test.ts +215 -0
  193. package/src/components/datepicker/utils/date-formatters.ts +85 -0
  194. package/src/components/datepicker/utils/date-utils.ts +172 -0
  195. package/src/components/datepicker/utils/index.ts +8 -0
  196. package/src/components/datepicker/utils/time-utils.ts +221 -0
  197. package/src/index.ts +7 -1
  198. package/CONTRIBUTING.md +0 -101
  199. package/examples/datatable/checkbox-events-test.html +0 -400
  200. package/examples/datatable/credentials-test.html +0 -423
  201. package/examples/datatable/remote-checkbox-test.html +0 -365
  202. package/examples/datatable/sorting-test.html +0 -258
  203. package/examples/image-input/file-upload-example.html +0 -189
  204. package/examples/modal/persistent.html +0 -205
  205. package/examples/modal/remote-select-dropdown.html +0 -166
  206. package/examples/modal/select-dropdown-container.html +0 -129
  207. package/examples/select/avatar.html +0 -47
  208. package/examples/select/basic-usage.html +0 -39
  209. package/examples/select/country.html +0 -43
  210. package/examples/select/dark-mode.html +0 -93
  211. package/examples/select/description.html +0 -53
  212. package/examples/select/disable-option.html +0 -37
  213. package/examples/select/disable-select.html +0 -35
  214. package/examples/select/dropdowncontainer.html +0 -111
  215. package/examples/select/dynamic-methods.html +0 -273
  216. package/examples/select/formdata-remote.html +0 -161
  217. package/examples/select/global-config.html +0 -81
  218. package/examples/select/icon-multiple.html +0 -50
  219. package/examples/select/icon.html +0 -48
  220. package/examples/select/max-selection.html +0 -38
  221. package/examples/select/modal-container.html +0 -128
  222. package/examples/select/modal-positioning-test.html +0 -338
  223. package/examples/select/modal.html +0 -80
  224. package/examples/select/multiple.html +0 -40
  225. package/examples/select/native-selected.html +0 -64
  226. package/examples/select/placeholder.html +0 -40
  227. package/examples/select/remote-data-preselected.html +0 -283
  228. package/examples/select/remote-data.html +0 -38
  229. package/examples/select/search.html +0 -57
  230. package/examples/select/sizes.html +0 -94
  231. package/examples/select/tags-enhanced.html +0 -86
  232. package/examples/select/tags-icons.html +0 -57
  233. package/examples/select/template-customization.html +0 -61
  234. package/examples/sticky/README.md +0 -158
  235. package/examples/sticky/debug-sticky.html +0 -144
  236. package/examples/sticky/test-runner.html +0 -175
  237. package/examples/sticky/test-sticky-logic.js +0 -369
  238. package/examples/sticky/test-sticky-positioning.html +0 -386
  239. package/examples/toast/example.html +0 -479
  240. package/lib/cjs/components/datepicker/calendar.js +0 -1061
  241. package/lib/cjs/components/datepicker/calendar.js.map +0 -1
  242. package/lib/cjs/components/datepicker/config.js +0 -332
  243. package/lib/cjs/components/datepicker/config.js.map +0 -1
  244. package/lib/cjs/components/datepicker/dropdown.js +0 -635
  245. package/lib/cjs/components/datepicker/dropdown.js.map +0 -1
  246. package/lib/cjs/components/datepicker/events.js +0 -129
  247. package/lib/cjs/components/datepicker/events.js.map +0 -1
  248. package/lib/cjs/components/datepicker/keyboard.js +0 -536
  249. package/lib/cjs/components/datepicker/keyboard.js.map +0 -1
  250. package/lib/cjs/components/datepicker/locales.js +0 -78
  251. package/lib/cjs/components/datepicker/locales.js.map +0 -1
  252. package/lib/cjs/components/datepicker/templates.js +0 -403
  253. package/lib/cjs/components/datepicker/templates.js.map +0 -1
  254. package/lib/cjs/components/datepicker/types.js +0 -23
  255. package/lib/cjs/components/datepicker/types.js.map +0 -1
  256. package/lib/cjs/components/datepicker/utils.js +0 -524
  257. package/lib/cjs/components/datepicker/utils.js.map +0 -1
  258. package/lib/esm/components/datepicker/calendar.js +0 -1058
  259. package/lib/esm/components/datepicker/calendar.js.map +0 -1
  260. package/lib/esm/components/datepicker/config.js +0 -329
  261. package/lib/esm/components/datepicker/config.js.map +0 -1
  262. package/lib/esm/components/datepicker/dropdown.js +0 -632
  263. package/lib/esm/components/datepicker/dropdown.js.map +0 -1
  264. package/lib/esm/components/datepicker/events.js +0 -126
  265. package/lib/esm/components/datepicker/events.js.map +0 -1
  266. package/lib/esm/components/datepicker/keyboard.js +0 -533
  267. package/lib/esm/components/datepicker/keyboard.js.map +0 -1
  268. package/lib/esm/components/datepicker/locales.js +0 -74
  269. package/lib/esm/components/datepicker/locales.js.map +0 -1
  270. package/lib/esm/components/datepicker/templates.js +0 -390
  271. package/lib/esm/components/datepicker/templates.js.map +0 -1
  272. package/lib/esm/components/datepicker/types.js +0 -20
  273. package/lib/esm/components/datepicker/types.js.map +0 -1
  274. package/lib/esm/components/datepicker/utils.js +0 -508
  275. package/lib/esm/components/datepicker/utils.js.map +0 -1
  276. package/prettier.config.js +0 -9
  277. package/src/components/datepicker/calendar.ts +0 -1397
  278. package/src/components/datepicker/config.ts +0 -368
  279. package/src/components/datepicker/dropdown.ts +0 -757
  280. package/src/components/datepicker/events.ts +0 -149
  281. package/src/components/datepicker/keyboard.ts +0 -646
  282. package/src/components/datepicker/locales.ts +0 -80
  283. package/src/components/datepicker/templates.ts +0 -792
  284. package/src/components/datepicker/types.ts +0 -154
  285. package/src/components/datepicker/utils.ts +0 -631
  286. package/src/components/select/variants.css +0 -4
  287. package/tsconfig.json +0 -17
  288. package/webpack.config.js +0 -118
@@ -1,189 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>KTUI Image Input - File Upload Example</title>
7
- <link rel="stylesheet" href="../../dist/styles.css">
8
- <style>
9
- body { padding: 2rem; font-family: Arial, sans-serif; }
10
- .example-section { margin: 2rem 0; padding: 1rem; border: 1px solid #ddd; }
11
- .test-result { margin: 0.5rem 0; padding: 0.5rem; background: #f5f5f5; }
12
- .success { background: #d4edda; color: #155724; }
13
- .error { background: #f8d7da; color: #721c24; }
14
- .info { background: #d1ecf1; color: #0c5460; }
15
- .code-block { background: #f8f9fa; padding: 1rem; border-radius: 4px; margin: 1rem 0; }
16
- </style>
17
- </head>
18
- <body>
19
- <h1>KTUI Image Input - File Upload Example</h1>
20
- <p>This example demonstrates how to use the KTUI Image Input component with proper file upload functionality.</p>
21
-
22
- <div class="example-section">
23
- <h2>Image Input Component</h2>
24
- <div class="kt-image-input size-16" data-kt-image-input="true">
25
- <input accept=".png, .jpg, .jpeg" name="avatar" type="file">
26
- <input name="avatar_remove" type="hidden"/>
27
- <button class="kt-image-input-remove" data-kt-image-input-remove="true" type="button">
28
- <i class="ki-filled ki-cross"></i>
29
- </button>
30
- <div class="kt-image-input-placeholder" data-kt-image-input-placeholder="true">
31
- <div class="kt-image-input-preview" data-kt-image-input-preview="true"></div>
32
- </div>
33
- </div>
34
- </div>
35
-
36
- <div class="example-section">
37
- <h2>Testing Controls</h2>
38
- <button onclick="testFileAccess()">Test File Access</button>
39
- <button onclick="testPublicMethods()">Test Public Methods</button>
40
- <button onclick="testFormSubmission()">Test Form Submission</button>
41
- <button onclick="clearResults()">Clear Results</button>
42
- </div>
43
-
44
- <div class="example-section">
45
- <h2>Test Results</h2>
46
- <div id="test-results"></div>
47
- </div>
48
-
49
- <div class="example-section">
50
- <h2>Form Submission Example</h2>
51
- <p>This form demonstrates how to properly handle file uploads with KTUI Image Input:</p>
52
- <form id="test-form" onsubmit="handleFormSubmit(event)">
53
- <div class="kt-image-input size-16" data-kt-image-input="true">
54
- <input accept=".png, .jpg, .jpeg" name="test_image" type="file">
55
- <input name="test_image_remove" type="hidden"/>
56
- <button class="kt-image-input-remove" data-kt-image-input-remove="true" type="button">
57
- <i class="ki-filled ki-cross"></i>
58
- </button>
59
- <div class="kt-image-input-placeholder" data-kt-image-input-placeholder="true">
60
- <div class="kt-image-input-preview" data-kt-image-input-preview="true"></div>
61
- </div>
62
- </div>
63
- <button type="submit">Submit Form</button>
64
- </form>
65
- </div>
66
-
67
- <div class="example-section">
68
- <h2>Usage Code Example</h2>
69
- <div class="code-block">
70
- <h3>HTML Structure</h3>
71
- <pre><code>&lt;div class="kt-image-input size-16" data-kt-image-input="true"&gt;
72
- &lt;input accept=".png, .jpg, .jpeg" name="avatar" type="file"&gt;
73
- &lt;input name="avatar_remove" type="hidden"/&gt;
74
- &lt;button class="kt-image-input-remove" data-kt-image-input-remove="true" type="button"&gt;
75
- &lt;i class="ki-filled ki-cross"&gt;&lt;/i&gt;
76
- &lt;/button&gt;
77
- &lt;div class="kt-image-input-placeholder" data-kt-image-input-placeholder="true"&gt;
78
- &lt;div class="kt-image-input-preview" data-kt-image-input-preview="true"&gt;&lt;/div&gt;
79
- &lt;/div&gt;
80
- &lt;/div&gt;</code></pre>
81
-
82
- <h3>JavaScript - File Upload</h3>
83
- <pre><code>// Get the KTUI Image Input instance
84
- const imageInput = KTImageInput.getInstance(element);
85
-
86
- // Access the selected file for form submission
87
- const selectedFile = imageInput.getSelectedFile();
88
- if (selectedFile) {
89
- const formData = new FormData();
90
- formData.append('image', selectedFile);
91
- // Submit formData to server
92
- }
93
-
94
- // Check component state
95
- if (imageInput.isEmpty()) {
96
- console.log('No file selected');
97
- }
98
-
99
- if (imageInput.isChanged()) {
100
- console.log('File has been selected');
101
- }</code></pre>
102
- </div>
103
- </div>
104
-
105
- <script src="../../dist/ktui.min.js"></script>
106
- <script>
107
- let imageInputInstance = null;
108
-
109
- // Initialize when DOM is ready
110
- document.addEventListener('DOMContentLoaded', function() {
111
- const element = document.querySelector('[data-kt-image-input]');
112
- if (element) {
113
- imageInputInstance = KTImageInput.getInstance(element);
114
- addResult('Component initialized successfully', 'success');
115
- }
116
- });
117
-
118
- function addResult(message, type = 'info') {
119
- const results = document.getElementById('test-results');
120
- const div = document.createElement('div');
121
- div.className = `test-result ${type}`;
122
- div.textContent = `${new Date().toLocaleTimeString()}: ${message}`;
123
- results.appendChild(div);
124
- }
125
-
126
- function testFileAccess() {
127
- if (!imageInputInstance) {
128
- addResult('Image input instance not found', 'error');
129
- return;
130
- }
131
-
132
- const file = imageInputInstance.getSelectedFile();
133
- if (file) {
134
- addResult(`File access successful: ${file.name} (${file.size} bytes)`, 'success');
135
- } else {
136
- addResult('No file selected', 'info');
137
- }
138
- }
139
-
140
- function testPublicMethods() {
141
- if (!imageInputInstance) {
142
- addResult('Image input instance not found', 'error');
143
- return;
144
- }
145
-
146
- const isEmpty = imageInputInstance.isEmpty();
147
- const isChanged = imageInputInstance.isChanged();
148
-
149
- addResult(`isEmpty(): ${isEmpty}`, isEmpty ? 'info' : 'success');
150
- addResult(`isChanged(): ${isChanged}`, isChanged ? 'success' : 'info');
151
- }
152
-
153
- function testFormSubmission() {
154
- const form = document.getElementById('test-form');
155
- const fileInput = form.querySelector('input[type="file"]');
156
- const formData = new FormData(form);
157
-
158
- addResult('Form data created', 'info');
159
-
160
- if (fileInput.files.length > 0) {
161
- addResult(`File in form: ${fileInput.files[0].name}`, 'success');
162
- } else {
163
- addResult('No file in form data (expected - input is cleared for UI)', 'info');
164
- }
165
-
166
- // Test with KTUI instance
167
- const formImageInput = KTImageInput.getInstance(form.querySelector('[data-kt-image-input]'));
168
- if (formImageInput) {
169
- const selectedFile = formImageInput.getSelectedFile();
170
- if (selectedFile) {
171
- addResult(`KTUI file access: ${selectedFile.name}`, 'success');
172
- } else {
173
- addResult('No file in KTUI instance', 'error');
174
- }
175
- }
176
- }
177
-
178
- function handleFormSubmit(event) {
179
- event.preventDefault();
180
- addResult('Form submission intercepted for testing', 'info');
181
- testFormSubmission();
182
- }
183
-
184
- function clearResults() {
185
- document.getElementById('test-results').innerHTML = '';
186
- }
187
- </script>
188
- </body>
189
- </html>
@@ -1,205 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Modal Persistent Property Test</title>
7
- <script src="https://cdn.tailwindcss.com"></script>
8
- <link rel="stylesheet" href="../../dist/styles.css">
9
- <style>
10
- .test-case {
11
- margin: 1rem 0;
12
- padding: 1.5rem;
13
- border: 1px solid #e5e7eb;
14
- border-radius: 0.5rem;
15
- background: #fafafa;
16
- }
17
- .expected {
18
- color: #374151;
19
- font-weight: 500;
20
- }
21
- </style>
22
- </head>
23
- <body class="p-8 bg-white min-h-screen flex items-start justify-center">
24
- <div class="w-full max-w-3xl">
25
- <h1 class="text-3xl font-bold mb-2 text-gray-900">Modal Persistent Property Test</h1>
26
- <p class="text-gray-600 mb-8">Testing the interaction between <code class="bg-gray-100 px-2 py-1 rounded text-sm">persistent</code> and <code class="bg-gray-100 px-2 py-1 rounded text-sm">backdropStatic</code> properties.</p>
27
-
28
- <div class="mb-8 p-4 border border-gray-200 rounded bg-gray-50">
29
- <h2 class="text-lg font-semibold mb-3 text-gray-900">Test Instructions</h2>
30
- <ol class="list-decimal list-inside space-y-2 text-gray-700">
31
- <li>Click each "Open Modal" button below</li>
32
- <li>Try clicking on the modal backdrop (gray area around the modal content)</li>
33
- <li>Try clicking on the invisible area below the modal content</li>
34
- <li>Verify the behavior matches the expected result</li>
35
- </ol>
36
- </div>
37
-
38
- <!-- Test Case 1: persistent=false, backdropStatic=false -->
39
- <div class="test-case">
40
- <h3 class="text-base font-semibold mb-3 text-gray-900">Test Case 1</h3>
41
- <p class="mb-2 text-sm text-gray-700">
42
- <code class="bg-white px-2 py-1 rounded border border-gray-200">persistent: false</code>,
43
- <code class="bg-white px-2 py-1 rounded border border-gray-200">backdropStatic: false</code>
44
- </p>
45
- <p class="expected mb-4 text-sm">✓ Expected: Modal SHOULD close when clicking on backdrop or invisible area</p>
46
- <button
47
- data-kt-modal-toggle="#modal-test-1"
48
- class="px-4 py-2 bg-gray-900 text-white rounded hover:bg-gray-700 text-sm font-medium">
49
- Open Modal
50
- </button>
51
- </div>
52
-
53
- <!-- Test Case 2: persistent=true, backdropStatic=false -->
54
- <div class="test-case">
55
- <h3 class="text-base font-semibold mb-3 text-gray-900">Test Case 2 <span class="text-xs font-normal text-gray-500">(Bug Fix Verification)</span></h3>
56
- <p class="mb-2 text-sm text-gray-700">
57
- <code class="bg-white px-2 py-1 rounded border border-gray-200">persistent: true</code>,
58
- <code class="bg-white px-2 py-1 rounded border border-gray-200">backdropStatic: false</code>
59
- </p>
60
- <p class="expected mb-4 text-sm">✓ Expected: Modal should NOT close when clicking on backdrop or invisible area</p>
61
- <button
62
- data-kt-modal-toggle="#modal-test-2"
63
- class="px-4 py-2 bg-gray-900 text-white rounded hover:bg-gray-700 text-sm font-medium">
64
- Open Modal
65
- </button>
66
- </div>
67
-
68
- <!-- Test Case 3: persistent=false, backdropStatic=true -->
69
- <div class="test-case">
70
- <h3 class="text-base font-semibold mb-3 text-gray-900">Test Case 3</h3>
71
- <p class="mb-2 text-sm text-gray-700">
72
- <code class="bg-white px-2 py-1 rounded border border-gray-200">persistent: false</code>,
73
- <code class="bg-white px-2 py-1 rounded border border-gray-200">backdropStatic: true</code>
74
- </p>
75
- <p class="expected mb-4 text-sm">✓ Expected: Modal should NOT close when clicking on backdrop (backdropStatic takes precedence)</p>
76
- <button
77
- data-kt-modal-toggle="#modal-test-3"
78
- class="px-4 py-2 bg-gray-900 text-white rounded hover:bg-gray-700 text-sm font-medium">
79
- Open Modal
80
- </button>
81
- </div>
82
-
83
- <!-- Test Case 4: persistent=true, backdropStatic=true -->
84
- <div class="test-case">
85
- <h3 class="text-base font-semibold mb-3 text-gray-900">Test Case 4</h3>
86
- <p class="mb-2 text-sm text-gray-700">
87
- <code class="bg-white px-2 py-1 rounded border border-gray-200">persistent: true</code>,
88
- <code class="bg-white px-2 py-1 rounded border border-gray-200">backdropStatic: true</code>
89
- </p>
90
- <p class="expected mb-4 text-sm">✓ Expected: Modal should NOT close when clicking on backdrop or invisible area</p>
91
- <button
92
- data-kt-modal-toggle="#modal-test-4"
93
- class="px-4 py-2 bg-gray-900 text-white rounded hover:bg-gray-700 text-sm font-medium">
94
- Open Modal
95
- </button>
96
- </div>
97
- </div>
98
-
99
- <!-- Modal 1: persistent=false, backdropStatic=false -->
100
- <div
101
- id="modal-test-1"
102
- class="hidden fixed inset-0 z-50 flex items-center justify-center"
103
- data-kt-modal="true"
104
- data-kt-modal-persistent="false"
105
- data-kt-modal-backdrop-static="false">
106
- <div class="bg-white rounded-lg shadow-xl p-6 max-w-md w-full mx-4 border border-gray-200">
107
- <h2 class="text-lg font-semibold mb-4 text-gray-900">Test Case 1</h2>
108
- <p class="mb-3 text-sm text-gray-700">
109
- This modal has <code class="bg-gray-100 px-1 text-xs">persistent: false</code> and
110
- <code class="bg-gray-100 px-1 text-xs">backdropStatic: false</code>.
111
- </p>
112
- <p class="mb-4 text-sm text-gray-600">
113
- Click on the gray area around this modal or below it. The modal should close.
114
- </p>
115
- <button
116
- data-kt-modal-dismiss="true"
117
- class="px-4 py-2 bg-gray-900 text-white rounded hover:bg-gray-700 text-sm">
118
- Close
119
- </button>
120
- </div>
121
- </div>
122
-
123
- <!-- Modal 2: persistent=true, backdropStatic=false -->
124
- <div
125
- id="modal-test-2"
126
- class="hidden fixed inset-0 z-50 flex items-center justify-center"
127
- data-kt-modal="true"
128
- data-kt-modal-persistent="true"
129
- data-kt-modal-backdrop-static="false">
130
- <div class="bg-white rounded-lg shadow-xl p-6 max-w-md w-full mx-4 border border-gray-200">
131
- <h2 class="text-lg font-semibold mb-4 text-gray-900">Test Case 2 <span class="text-xs font-normal text-gray-500">(Bug Fix)</span></h2>
132
- <p class="mb-3 text-sm text-gray-700">
133
- This modal has <code class="bg-gray-100 px-1 text-xs">persistent: true</code> and
134
- <code class="bg-gray-100 px-1 text-xs">backdropStatic: false</code>.
135
- </p>
136
- <p class="mb-4 text-sm text-gray-600 border-l-2 border-gray-400 pl-3">
137
- Click on the gray area around this modal or below it. The modal should NOT close.
138
- </p>
139
- <button
140
- data-kt-modal-dismiss="true"
141
- class="px-4 py-2 bg-gray-900 text-white rounded hover:bg-gray-700 text-sm">
142
- Close
143
- </button>
144
- </div>
145
- </div>
146
-
147
- <!-- Modal 3: persistent=false, backdropStatic=true -->
148
- <div
149
- id="modal-test-3"
150
- class="hidden fixed inset-0 z-50 flex items-center justify-center"
151
- data-kt-modal="true"
152
- data-kt-modal-persistent="false"
153
- data-kt-modal-backdrop-static="true">
154
- <div class="bg-white rounded-lg shadow-xl p-6 max-w-md w-full mx-4 border border-gray-200">
155
- <h2 class="text-lg font-semibold mb-4 text-gray-900">Test Case 3</h2>
156
- <p class="mb-3 text-sm text-gray-700">
157
- This modal has <code class="bg-gray-100 px-1 text-xs">persistent: false</code> and
158
- <code class="bg-gray-100 px-1 text-xs">backdropStatic: true</code>.
159
- </p>
160
- <p class="mb-4 text-sm text-gray-600">
161
- Click on the gray area around this modal or below it. The modal should NOT close (backdropStatic prevents it).
162
- </p>
163
- <button
164
- data-kt-modal-dismiss="true"
165
- class="px-4 py-2 bg-gray-900 text-white rounded hover:bg-gray-700 text-sm">
166
- Close
167
- </button>
168
- </div>
169
- </div>
170
-
171
- <!-- Modal 4: persistent=true, backdropStatic=true -->
172
- <div
173
- id="modal-test-4"
174
- class="hidden fixed inset-0 z-50 flex items-center justify-center"
175
- data-kt-modal="true"
176
- data-kt-modal-persistent="true"
177
- data-kt-modal-backdrop-static="true">
178
- <div class="bg-white rounded-lg shadow-xl p-6 max-w-md w-full mx-4 border border-gray-200">
179
- <h2 class="text-lg font-semibold mb-4 text-gray-900">Test Case 4</h2>
180
- <p class="mb-3 text-sm text-gray-700">
181
- This modal has <code class="bg-gray-100 px-1 text-xs">persistent: true</code> and
182
- <code class="bg-gray-100 px-1 text-xs">backdropStatic: true</code>.
183
- </p>
184
- <p class="mb-4 text-sm text-gray-600">
185
- Click on the gray area around this modal or below it. The modal should NOT close (both properties prevent it).
186
- </p>
187
- <button
188
- data-kt-modal-dismiss="true"
189
- class="px-4 py-2 bg-gray-900 text-white rounded hover:bg-gray-700 text-sm">
190
- Close
191
- </button>
192
- </div>
193
- </div>
194
-
195
- <script src="../../dist/ktui.js"></script>
196
- <script>
197
- // Initialize modals
198
- document.addEventListener('DOMContentLoaded', function() {
199
- KTModal.init();
200
- console.log('Modal test page loaded. All modals initialized.');
201
- });
202
- </script>
203
- </body>
204
- </html>
205
-
@@ -1,166 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
-
4
- <head>
5
- <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>Issue #63: Remote Select Dropdown in Centered Modal</title>
8
- <link rel="stylesheet" href="../../dist/styles.css">
9
- </head>
10
-
11
- <body class="bg-gray-50 min-h-screen">
12
- <!-- Test Case 1: Remote Select in Centered Modal (Issue #63) -->
13
- <div class="bg-white rounded-lg shadow p-8 w-full max-w-sm mt-10 mx-auto mb-6">
14
- <button class="px-3 py-1.5 bg-gray-900 text-white rounded text-sm hover:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-gray-400" data-kt-modal-toggle="#remoteSelectModal">
15
- Open Remote Select Modal (Issue #63)
16
- </button>
17
- </div>
18
-
19
- <!-- Test Case 2: Remote Select with dropdownContainer -->
20
- <div class="bg-white rounded-lg shadow p-8 w-full max-w-sm mx-auto mb-6">
21
- <button class="px-3 py-1.5 bg-gray-900 text-white rounded text-sm hover:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-gray-400" data-kt-modal-toggle="#remoteSelectWithContainer">
22
- Open Remote Select with Container
23
- </button>
24
- </div>
25
-
26
- <!-- Test Case 3: Regular Select (Control) -->
27
- <div class="bg-white rounded-lg shadow p-8 w-full max-w-sm mx-auto mb-6">
28
- <button class="px-3 py-1.5 bg-gray-900 text-white rounded text-sm hover:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-gray-400" data-kt-modal-toggle="#regularSelectModal">
29
- Open Regular Select Modal
30
- </button>
31
- </div>
32
-
33
- <!-- Modal 1: Remote Select in Centered Modal (Issue #63) -->
34
- <div class="kt-modal kt-modal-center" data-kt-modal="true" id="remoteSelectModal">
35
- <div class="kt-modal-content max-w-md">
36
- <div class="kt-modal-header">
37
- <h3 class="kt-modal-title">Remote Select in Centered Modal</h3>
38
- <button
39
- type="button"
40
- class="kt-modal-close"
41
- aria-label="Close modal"
42
- data-kt-modal-dismiss="#remoteSelectModal"
43
- >
44
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
45
- <path d="M18 6 6 18"/>
46
- <path d="m6 6 12 12"/>
47
- </svg>
48
- </button>
49
- </div>
50
- <div class="kt-modal-body space-y-6">
51
- <div>
52
- <label class="block mb-2 font-medium text-gray-700">Remote Select (Issue #63 Test)</label>
53
- <select
54
- class="kt-select"
55
- data-kt-select="true"
56
- data-kt-select-remote="true"
57
- data-kt-select-data-url="https://jsonplaceholder.typicode.com/users"
58
- data-kt-select-data-field-value="id"
59
- data-kt-select-data-field-text="name"
60
- data-kt-select-enable-search="true"
61
- data-kt-select-search-param="q"
62
- data-kt-select-search-min-length="2"
63
- data-kt-select-search-debounce="300"
64
- data-kt-select-placeholder="Search and select a user..."
65
- ></select>
66
- </div>
67
- </div>
68
- </div>
69
- </div>
70
-
71
- <!-- Modal 2: Remote Select with dropdownContainer -->
72
- <div class="kt-modal kt-modal-center" data-kt-modal="true" id="remoteSelectWithContainer">
73
- <div class="kt-modal-content max-w-md">
74
- <div class="kt-modal-header">
75
- <h3 class="kt-modal-title">Remote Select with dropdownContainer</h3>
76
- <button
77
- type="button"
78
- class="kt-modal-close"
79
- aria-label="Close modal"
80
- data-kt-modal-dismiss="#remoteSelectWithContainer"
81
- >
82
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
83
- <path d="M18 6 6 18"/>
84
- <path d="m6 6 12 12"/>
85
- </svg>
86
- </button>
87
- </div>
88
- <div class="kt-modal-body space-y-6">
89
- <div>
90
- <label class="block mb-2 font-medium text-gray-700">Remote Select with dropdownContainer</label>
91
- <select
92
- class="kt-select"
93
- data-kt-select="true"
94
- data-kt-select-remote="true"
95
- data-kt-select-data-url="https://jsonplaceholder.typicode.com/users"
96
- data-kt-select-data-field-value="id"
97
- data-kt-select-data-field-text="name"
98
- data-kt-select-enable-search="true"
99
- data-kt-select-search-param="q"
100
- data-kt-select-search-min-length="2"
101
- data-kt-select-search-debounce="300"
102
- data-kt-select-placeholder="Search and select a user..."
103
- data-kt-select-config='{
104
- "dropdownContainer": "#remoteSelectWithContainer"
105
- }'
106
- ></select>
107
- </div>
108
- </div>
109
- </div>
110
- </div>
111
-
112
- <!-- Modal 3: Regular Select (Control) -->
113
- <div class="kt-modal kt-modal-center" data-kt-modal="true" id="regularSelectModal">
114
- <div class="kt-modal-content max-w-md">
115
- <div class="kt-modal-header">
116
- <h3 class="kt-modal-title">Regular Select (Control)</h3>
117
- <button
118
- type="button"
119
- class="kt-modal-close"
120
- aria-label="Close modal"
121
- data-kt-modal-dismiss="#regularSelectModal"
122
- >
123
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
124
- <path d="M18 6 6 18"/>
125
- <path d="m6 6 12 12"/>
126
- </svg>
127
- </button>
128
- </div>
129
- <div class="kt-modal-body space-y-6">
130
- <div>
131
- <label class="block mb-2 font-medium text-gray-700">Regular Select (Control)</label>
132
- <select
133
- class="kt-select"
134
- data-kt-select="true"
135
- data-kt-select-placeholder="Select an option..."
136
- >
137
- <option value="">Select an option...</option>
138
- <option value="1">Option 1</option>
139
- <option value="2">Option 2</option>
140
- <option value="3">Option 3</option>
141
- <option value="4">Option 4</option>
142
- <option value="5">Option 5</option>
143
- <option value="6">Option 6</option>
144
- <option value="7">Option 7</option>
145
- <option value="8">Option 8</option>
146
- </select>
147
- </div>
148
- </div>
149
- </div>
150
- </div>
151
-
152
- <script src="../../dist/ktui.js"></script>
153
- <script>
154
- document.addEventListener('DOMContentLoaded', function() {
155
- if (window.KTModal) {
156
- KTModal.init();
157
- }
158
- if (window.KTSelect) {
159
- KTSelect.init();
160
- }
161
- });
162
- </script>
163
- </body>
164
-
165
- </html>
166
-