@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,368 +0,0 @@
1
- /**
2
- * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
- * Copyright 2025 by Keenthemes Inc
4
- */
5
-
6
- import { DefaultLocales } from './locales';
7
- import {
8
- KTDatepickerConfigInterface,
9
- KTDatepickerStateInterface,
10
- DateRangeInterface,
11
- TimeConfigInterface,
12
- } from './types';
13
- import { isSameDay, isDateDisabled } from './utils';
14
- import { KTDatepickerEventManager, KTDatepickerEventName } from './events';
15
-
16
- export const DefaultConfig: KTDatepickerConfigInterface = {
17
- locale: 'en-US',
18
- locales: DefaultLocales, // all locales
19
-
20
- weekDays: 'min',
21
- forceLeadingZero: true,
22
-
23
- // 0-indexed month
24
- // minDate: new Date(2024, 7, 20),
25
- // maxDate: new Date(2024, 8, 10),
26
-
27
- // supported formats: refer to dateFormat
28
- // minDate: '20/08/2024',
29
- // maxDate: '10/09/2024',
30
-
31
- // Calendar
32
- visibleMonths: 1, // visible months calendar to show
33
- visibleYears: 10, // visible years span to show on year selection
34
- keepViewModeOnSelection: false, // automatically switch view modes when selecting month/year
35
-
36
- // Date
37
- format: 'dd/MM/yyyy',
38
-
39
- // Time
40
- enableTime: false,
41
- timeFormat: 'hh:mm:ss A ZZZ', // 12-hours time format
42
- // timeFormat: 'HH:mm:ss ZZZ', // 24-hours time format
43
- am: 'AM',
44
- pm: 'PM',
45
- hourStep: 1,
46
- // minuteStep: 5,
47
- // secondStep: 10,
48
- // disabledHours: [0, 1, 2, 3, 4, 5, 6, 22, 23],
49
- // disabledMinutes: [0, 1, 2, 3],
50
-
51
- // Date range
52
- range: false,
53
- rangeSeparator: ' - ',
54
-
55
- // Multi-date selection
56
- multiDateSelection: false,
57
- maxDates: 0, // 0 means unlimited
58
-
59
- // Date blocking patterns
60
- disabledDates: [],
61
- enableNaturalLanguage: true,
62
-
63
- // Animation settings
64
- animationDuration: 250,
65
- animationEasing: '',
66
- animationEnterClass: '',
67
- animationExitClass: '',
68
- };
69
-
70
- /**
71
- * State manager class for KTDatepicker
72
- * Handles state management and configuration
73
- */
74
- export class KTDatepickerStateManager {
75
- private _element: HTMLElement;
76
- private _config: KTDatepickerConfigInterface;
77
- private _state: KTDatepickerStateInterface;
78
- private _events: KTDatepickerEventManager;
79
-
80
- /**
81
- * Constructor for the KTDatepickerStateManager class
82
- *
83
- * @param element - The datepicker element
84
- * @param config - Configuration object
85
- */
86
- constructor(
87
- element: HTMLElement,
88
- config?: Partial<KTDatepickerConfigInterface>,
89
- ) {
90
- this._element = element;
91
- this._config = this._mergeConfig(config || {});
92
- this._state = this._initializeState();
93
- this._events = new KTDatepickerEventManager(element);
94
- }
95
-
96
- /**
97
- * Merge provided configuration with default configuration
98
- *
99
- * @param config - User provided configuration
100
- * @returns Merged configuration
101
- */
102
- private _mergeConfig(
103
- config: Partial<KTDatepickerConfigInterface>,
104
- ): KTDatepickerConfigInterface {
105
- return { ...DefaultConfig, ...config };
106
- }
107
-
108
- /**
109
- * Initialize the state object with default values
110
- */
111
- private _initializeState(): KTDatepickerStateInterface {
112
- const now = new Date();
113
- const state: KTDatepickerStateInterface = {
114
- currentDate: now,
115
- selectedDate: null,
116
- selectedDateRange: null,
117
- selectedDates: [],
118
- viewMode: 'days',
119
- isOpen: false,
120
- isFocused: false,
121
- isRangeSelectionStart: true,
122
- isRangeSelectionInProgress: false,
123
- selectedTime: null,
124
- prevIsOpen: false,
125
- };
126
-
127
- return state;
128
- }
129
-
130
- /**
131
- * Get the current configuration
132
- *
133
- * @returns Current configuration
134
- */
135
- public getConfig(): KTDatepickerConfigInterface {
136
- return this._config;
137
- }
138
-
139
- /**
140
- * Get the current state
141
- *
142
- * @returns Current state
143
- */
144
- public getState(): KTDatepickerStateInterface {
145
- return this._state;
146
- }
147
-
148
- /**
149
- * Set the selected date
150
- *
151
- * @param date - Date to select
152
- */
153
- public setSelectedDate(date: Date | null): void {
154
- const state = this._state;
155
- const config = this._config;
156
-
157
- if (date === null) {
158
- // Clear selection
159
- state.selectedDate = null;
160
- state.selectedDateRange = null;
161
- state.isRangeSelectionInProgress = false;
162
- this._dispatchChangeEvent();
163
- return;
164
- }
165
-
166
- // Check if the date is disabled (outside min/max range or explicitly disabled)
167
- // We add this check here as a second defense layer beyond the UI checks
168
- if (isDateDisabled(date, config)) {
169
- console.log(
170
- 'Date is disabled in setSelectedDate, ignoring selection:',
171
- date.toISOString(),
172
- );
173
- return;
174
- }
175
-
176
- if (config.range) {
177
- // Handle range selection
178
- if (!state.selectedDateRange) {
179
- // Initialize range object if it doesn't exist
180
- state.selectedDateRange = { startDate: null, endDate: null };
181
- }
182
-
183
- // If start date isn't set or if we're resetting the range, set the start date
184
- if (
185
- !state.selectedDateRange.startDate ||
186
- state.isRangeSelectionStart ||
187
- state.selectedDateRange.endDate
188
- ) {
189
- // Reset the range with a new start date
190
- state.selectedDateRange.startDate = date;
191
- state.selectedDateRange.endDate = null;
192
- state.isRangeSelectionStart = false; // We've selected the start, next will be end
193
-
194
- // Set the flag to keep dropdown open during range selection
195
- state.isRangeSelectionInProgress = true;
196
- console.log(
197
- 'Range start selected - setting isRangeSelectionInProgress to true',
198
- );
199
- } else {
200
- // Set the end date if the start date is already set
201
- // Ensure that start is before end (swap if needed)
202
- if (date < state.selectedDateRange.startDate) {
203
- // Swap dates if the selected date is before the start date
204
- state.selectedDateRange.endDate = state.selectedDateRange.startDate;
205
- state.selectedDateRange.startDate = date;
206
- } else {
207
- state.selectedDateRange.endDate = date;
208
- }
209
- state.isRangeSelectionStart = true; // Reset for next range selection
210
-
211
- // Clear the flag as range selection is complete
212
- state.isRangeSelectionInProgress = false;
213
- console.log(
214
- 'Range end selected - setting isRangeSelectionInProgress to false',
215
- );
216
- }
217
-
218
- // For date range, we still set selectedDate for current focus
219
- state.selectedDate = date;
220
-
221
- // Trigger event with range data
222
- this._dispatchChangeEvent();
223
- } else {
224
- // Single date selection
225
- state.selectedDate = date;
226
-
227
- // Multi-date selection
228
- if (config.multiDateSelection) {
229
- // Add or remove the date from the array
230
- const existingIndex = state.selectedDates.findIndex((d) =>
231
- isSameDay(d, date),
232
- );
233
- if (existingIndex !== -1) {
234
- // Remove if already selected
235
- state.selectedDates.splice(existingIndex, 1);
236
- } else if (state.selectedDates.length < config.maxDates) {
237
- // Add if not exceeding max
238
- state.selectedDates.push(date);
239
- }
240
- }
241
-
242
- // Trigger event with single date data
243
- this._dispatchChangeEvent();
244
- }
245
- }
246
-
247
- /**
248
- * Set the current view date (month/year being viewed)
249
- *
250
- * @param date - Date to set as current view
251
- */
252
- public setCurrentDate(date: Date): void {
253
- this._state.currentDate = date;
254
- this._dispatchEvent('month-change', {
255
- month: date.getMonth(),
256
- year: date.getFullYear(),
257
- });
258
- }
259
-
260
- /**
261
- * Set the selected time
262
- *
263
- * @param time - Time configuration to set
264
- */
265
- public setSelectedTime(time: TimeConfigInterface | null): void {
266
- this._state.selectedTime = time;
267
- this._dispatchChangeEvent();
268
- }
269
-
270
- /**
271
- * Set the view mode (days, months, years)
272
- *
273
- * @param mode - View mode to set
274
- */
275
- public setViewMode(mode: 'days' | 'months' | 'years'): void {
276
- this._state.viewMode = mode;
277
- this._dispatchEvent('view-mode-change', { mode });
278
- }
279
-
280
- /**
281
- * Set the open state of the datepicker
282
- *
283
- * @param isOpen - Whether the datepicker is open
284
- */
285
- public setOpen(isOpen: boolean): void {
286
- this._state.isOpen = isOpen;
287
- this._dispatchEvent(isOpen ? 'open' : 'close');
288
-
289
- // Call callback if defined
290
- if (isOpen && this._config.onOpen) {
291
- this._config.onOpen();
292
- } else if (!isOpen && this._config.onClose) {
293
- this._config.onClose();
294
- }
295
- }
296
-
297
- /**
298
- * Set the focus state of the datepicker
299
- *
300
- * @param isFocused - Whether the datepicker is focused
301
- */
302
- public setFocused(isFocused: boolean): void {
303
- this._state.isFocused = isFocused;
304
- this._dispatchEvent(isFocused ? 'focus' : 'blur');
305
- }
306
-
307
- /**
308
- * Reset the state to initial values
309
- */
310
- public resetState(): void {
311
- this._state = this._initializeState();
312
- this._dispatchEvent('reset');
313
- }
314
-
315
- /**
316
- * Dispatch change event with current date/time selection
317
- */
318
- private _dispatchChangeEvent(): void {
319
- let payload: any = {};
320
-
321
- if (this._config.range && this._state.selectedDateRange) {
322
- payload.selectedDateRange = this._state.selectedDateRange;
323
- } else if (this._config.multiDateSelection) {
324
- payload.selectedDates = [...this._state.selectedDates];
325
- } else {
326
- payload.selectedDate = this._state.selectedDate;
327
- }
328
-
329
- if (this._config.enableTime && this._state.selectedTime) {
330
- payload.selectedTime = { ...this._state.selectedTime };
331
- }
332
-
333
- this._events.dispatchDateChangeEvent(payload);
334
-
335
- // Call onChange callback if defined
336
- if (this._config.onChange) {
337
- let value: Date | null | DateRangeInterface;
338
-
339
- if (this._config.range) {
340
- value = this._state.selectedDateRange || {
341
- startDate: null,
342
- endDate: null,
343
- };
344
- } else {
345
- value = this._state.selectedDate;
346
- }
347
-
348
- this._config.onChange(value);
349
- }
350
- }
351
-
352
- /**
353
- * Dispatch custom event
354
- *
355
- * @param eventName - Name of the event
356
- * @param payload - Optional payload data
357
- */
358
- private _dispatchEvent(eventName: string, payload?: any): void {
359
- this._events.dispatchEvent(eventName, payload);
360
- }
361
-
362
- /**
363
- * Get the event manager instance
364
- */
365
- public getEventManager(): KTDatepickerEventManager {
366
- return this._events;
367
- }
368
- }