@keenthemes/ktui 1.2.2 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/ktui.js +1738 -986
  2. package/dist/ktui.min.js +1 -1
  3. package/dist/ktui.min.js.map +1 -1
  4. package/dist/styles.css +110 -197
  5. package/lib/cjs/components/context-menu/context-menu.d.ts +66 -0
  6. package/lib/cjs/components/context-menu/context-menu.d.ts.map +1 -0
  7. package/lib/cjs/components/context-menu/context-menu.js +423 -0
  8. package/lib/cjs/components/context-menu/context-menu.js.map +1 -0
  9. package/lib/cjs/components/context-menu/index.d.ts +7 -0
  10. package/lib/cjs/components/context-menu/index.d.ts.map +1 -0
  11. package/lib/cjs/components/context-menu/index.js +10 -0
  12. package/lib/cjs/components/context-menu/index.js.map +1 -0
  13. package/lib/cjs/components/context-menu/types.d.ts +30 -0
  14. package/lib/cjs/components/context-menu/types.d.ts.map +1 -0
  15. package/lib/cjs/components/context-menu/types.js +7 -0
  16. package/lib/cjs/components/context-menu/types.js.map +1 -0
  17. package/lib/cjs/components/datatable/datatable-contracts.d.ts +66 -0
  18. package/lib/cjs/components/datatable/datatable-contracts.d.ts.map +1 -0
  19. package/lib/cjs/components/datatable/datatable-contracts.js +7 -0
  20. package/lib/cjs/components/datatable/datatable-contracts.js.map +1 -0
  21. package/lib/cjs/components/datatable/datatable-event-adapter.d.ts +7 -0
  22. package/lib/cjs/components/datatable/datatable-event-adapter.d.ts.map +1 -0
  23. package/lib/cjs/components/datatable/datatable-event-adapter.js +16 -0
  24. package/lib/cjs/components/datatable/datatable-event-adapter.js.map +1 -0
  25. package/lib/cjs/components/datatable/datatable-local-provider.d.ts +25 -0
  26. package/lib/cjs/components/datatable/datatable-local-provider.d.ts.map +1 -0
  27. package/lib/cjs/components/datatable/datatable-local-provider.js +184 -0
  28. package/lib/cjs/components/datatable/datatable-local-provider.js.map +1 -0
  29. package/lib/cjs/components/datatable/datatable-pagination-renderer.d.ts +15 -0
  30. package/lib/cjs/components/datatable/datatable-pagination-renderer.d.ts.map +1 -0
  31. package/lib/cjs/components/datatable/datatable-pagination-renderer.js +128 -0
  32. package/lib/cjs/components/datatable/datatable-pagination-renderer.js.map +1 -0
  33. package/lib/cjs/components/datatable/datatable-remote-provider.d.ts +25 -0
  34. package/lib/cjs/components/datatable/datatable-remote-provider.d.ts.map +1 -0
  35. package/lib/cjs/components/datatable/datatable-remote-provider.js +188 -0
  36. package/lib/cjs/components/datatable/datatable-remote-provider.js.map +1 -0
  37. package/lib/cjs/components/datatable/datatable-state-store.d.ts +21 -0
  38. package/lib/cjs/components/datatable/datatable-state-store.d.ts.map +1 -0
  39. package/lib/cjs/components/datatable/datatable-state-store.js +81 -0
  40. package/lib/cjs/components/datatable/datatable-state-store.js.map +1 -0
  41. package/lib/cjs/components/datatable/datatable-table-renderer.d.ts +16 -0
  42. package/lib/cjs/components/datatable/datatable-table-renderer.d.ts.map +1 -0
  43. package/lib/cjs/components/datatable/datatable-table-renderer.js +133 -0
  44. package/lib/cjs/components/datatable/datatable-table-renderer.js.map +1 -0
  45. package/lib/cjs/components/datatable/datatable.d.ts +9 -87
  46. package/lib/cjs/components/datatable/datatable.d.ts.map +1 -1
  47. package/lib/cjs/components/datatable/datatable.js +115 -687
  48. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  49. package/lib/cjs/components/modal/modal.d.ts.map +1 -1
  50. package/lib/cjs/components/modal/modal.js +19 -13
  51. package/lib/cjs/components/modal/modal.js.map +1 -1
  52. package/lib/cjs/components/select/index.d.ts +1 -1
  53. package/lib/cjs/components/select/index.d.ts.map +1 -1
  54. package/lib/cjs/components/theme-switch/theme-switch.d.ts +3 -0
  55. package/lib/cjs/components/theme-switch/theme-switch.d.ts.map +1 -1
  56. package/lib/cjs/components/theme-switch/theme-switch.js +17 -4
  57. package/lib/cjs/components/theme-switch/theme-switch.js.map +1 -1
  58. package/lib/cjs/components/toggle/toggle.d.ts +2 -0
  59. package/lib/cjs/components/toggle/toggle.d.ts.map +1 -1
  60. package/lib/cjs/components/toggle/toggle.js +11 -2
  61. package/lib/cjs/components/toggle/toggle.js.map +1 -1
  62. package/lib/cjs/index.d.ts +5 -1
  63. package/lib/cjs/index.d.ts.map +1 -1
  64. package/lib/cjs/index.js +7 -7
  65. package/lib/cjs/index.js.map +1 -1
  66. package/lib/cjs/init-all.d.ts +6 -0
  67. package/lib/cjs/init-all.d.ts.map +1 -0
  68. package/lib/cjs/init-all.js +17 -0
  69. package/lib/cjs/init-all.js.map +1 -0
  70. package/lib/cjs/legacy.d.ts +8 -0
  71. package/lib/cjs/legacy.d.ts.map +1 -0
  72. package/lib/cjs/legacy.js +26 -0
  73. package/lib/cjs/legacy.js.map +1 -0
  74. package/lib/esm/components/context-menu/context-menu.d.ts +66 -0
  75. package/lib/esm/components/context-menu/context-menu.d.ts.map +1 -0
  76. package/lib/esm/components/context-menu/context-menu.js +420 -0
  77. package/lib/esm/components/context-menu/context-menu.js.map +1 -0
  78. package/lib/esm/components/context-menu/index.d.ts +7 -0
  79. package/lib/esm/components/context-menu/index.d.ts.map +1 -0
  80. package/lib/esm/components/context-menu/index.js +6 -0
  81. package/lib/esm/components/context-menu/index.js.map +1 -0
  82. package/lib/esm/components/context-menu/types.d.ts +30 -0
  83. package/lib/esm/components/context-menu/types.d.ts.map +1 -0
  84. package/lib/esm/components/context-menu/types.js +6 -0
  85. package/lib/esm/components/context-menu/types.js.map +1 -0
  86. package/lib/esm/components/datatable/datatable-contracts.d.ts +66 -0
  87. package/lib/esm/components/datatable/datatable-contracts.d.ts.map +1 -0
  88. package/lib/esm/components/datatable/datatable-contracts.js +6 -0
  89. package/lib/esm/components/datatable/datatable-contracts.js.map +1 -0
  90. package/lib/esm/components/datatable/datatable-event-adapter.d.ts +7 -0
  91. package/lib/esm/components/datatable/datatable-event-adapter.d.ts.map +1 -0
  92. package/lib/esm/components/datatable/datatable-event-adapter.js +13 -0
  93. package/lib/esm/components/datatable/datatable-event-adapter.js.map +1 -0
  94. package/lib/esm/components/datatable/datatable-local-provider.d.ts +25 -0
  95. package/lib/esm/components/datatable/datatable-local-provider.d.ts.map +1 -0
  96. package/lib/esm/components/datatable/datatable-local-provider.js +181 -0
  97. package/lib/esm/components/datatable/datatable-local-provider.js.map +1 -0
  98. package/lib/esm/components/datatable/datatable-pagination-renderer.d.ts +15 -0
  99. package/lib/esm/components/datatable/datatable-pagination-renderer.d.ts.map +1 -0
  100. package/lib/esm/components/datatable/datatable-pagination-renderer.js +125 -0
  101. package/lib/esm/components/datatable/datatable-pagination-renderer.js.map +1 -0
  102. package/lib/esm/components/datatable/datatable-remote-provider.d.ts +25 -0
  103. package/lib/esm/components/datatable/datatable-remote-provider.d.ts.map +1 -0
  104. package/lib/esm/components/datatable/datatable-remote-provider.js +185 -0
  105. package/lib/esm/components/datatable/datatable-remote-provider.js.map +1 -0
  106. package/lib/esm/components/datatable/datatable-state-store.d.ts +21 -0
  107. package/lib/esm/components/datatable/datatable-state-store.d.ts.map +1 -0
  108. package/lib/esm/components/datatable/datatable-state-store.js +78 -0
  109. package/lib/esm/components/datatable/datatable-state-store.js.map +1 -0
  110. package/lib/esm/components/datatable/datatable-table-renderer.d.ts +16 -0
  111. package/lib/esm/components/datatable/datatable-table-renderer.d.ts.map +1 -0
  112. package/lib/esm/components/datatable/datatable-table-renderer.js +130 -0
  113. package/lib/esm/components/datatable/datatable-table-renderer.js.map +1 -0
  114. package/lib/esm/components/datatable/datatable.d.ts +9 -87
  115. package/lib/esm/components/datatable/datatable.d.ts.map +1 -1
  116. package/lib/esm/components/datatable/datatable.js +115 -687
  117. package/lib/esm/components/datatable/datatable.js.map +1 -1
  118. package/lib/esm/components/modal/modal.d.ts.map +1 -1
  119. package/lib/esm/components/modal/modal.js +19 -13
  120. package/lib/esm/components/modal/modal.js.map +1 -1
  121. package/lib/esm/components/select/index.d.ts +1 -1
  122. package/lib/esm/components/select/index.d.ts.map +1 -1
  123. package/lib/esm/components/theme-switch/theme-switch.d.ts +3 -0
  124. package/lib/esm/components/theme-switch/theme-switch.d.ts.map +1 -1
  125. package/lib/esm/components/theme-switch/theme-switch.js +17 -4
  126. package/lib/esm/components/theme-switch/theme-switch.js.map +1 -1
  127. package/lib/esm/components/toggle/toggle.d.ts +2 -0
  128. package/lib/esm/components/toggle/toggle.d.ts.map +1 -1
  129. package/lib/esm/components/toggle/toggle.js +11 -2
  130. package/lib/esm/components/toggle/toggle.js.map +1 -1
  131. package/lib/esm/index.d.ts +5 -1
  132. package/lib/esm/index.d.ts.map +1 -1
  133. package/lib/esm/index.js +4 -5
  134. package/lib/esm/index.js.map +1 -1
  135. package/lib/esm/init-all.d.ts +6 -0
  136. package/lib/esm/init-all.d.ts.map +1 -0
  137. package/lib/esm/init-all.js +13 -0
  138. package/lib/esm/init-all.js.map +1 -0
  139. package/lib/esm/legacy.d.ts +8 -0
  140. package/lib/esm/legacy.d.ts.map +1 -0
  141. package/lib/esm/legacy.js +8 -0
  142. package/lib/esm/legacy.js.map +1 -0
  143. package/package.json +34 -4
  144. package/src/__tests__/entrypoints.test.ts +71 -0
  145. package/src/components/context-menu/__tests__/context-menu.test.ts +117 -0
  146. package/src/components/context-menu/context-menu.css +32 -0
  147. package/src/components/context-menu/context-menu.ts +529 -0
  148. package/src/components/context-menu/index.ts +10 -0
  149. package/src/components/context-menu/types.ts +32 -0
  150. package/src/components/datatable/__tests__/architecture-boundaries.test.ts +259 -0
  151. package/src/components/datatable/datatable-contracts.ts +96 -0
  152. package/src/components/datatable/datatable-event-adapter.ts +21 -0
  153. package/src/components/datatable/datatable-local-provider.ts +194 -0
  154. package/src/components/datatable/datatable-pagination-renderer.ts +211 -0
  155. package/src/components/datatable/datatable-remote-provider.ts +175 -0
  156. package/src/components/datatable/datatable-state-store.ts +94 -0
  157. package/src/components/datatable/datatable-table-renderer.ts +206 -0
  158. package/src/components/datatable/datatable.ts +128 -839
  159. package/src/components/modal/modal.ts +22 -14
  160. package/src/components/select/index.ts +1 -1
  161. package/src/components/theme-switch/theme-switch.ts +22 -4
  162. package/src/components/toggle/toggle.ts +12 -2
  163. package/src/index.ts +9 -5
  164. package/src/init-all.ts +15 -0
  165. package/src/legacy.ts +9 -0
  166. package/styles.css +1 -0
@@ -49,18 +49,17 @@ export class KTModal extends KTComponent implements KTModalInterface {
49
49
  protected _handlers() {
50
50
  this._element.addEventListener('click', (event: Event) => {
51
51
  const target = event.target as HTMLElement;
52
- const currentTarget = event.currentTarget as HTMLElement;
53
-
54
- // Only proceed if clicking directly on the backdrop (modal element itself)
55
- // This prevents closing when clicking inside modal content or any child elements
56
- // (including dropdowns rendered via dropdownContainer pointing to modal)
57
- if (target !== currentTarget) {
58
- // Stop propagation for clicks inside dropdowns to prevent dropdown from closing
59
- // Check if click is inside a dropdown element (KT Select dropdown)
60
- const dropdownElement = target.closest('[data-kt-select-dropdown]');
61
- if (dropdownElement) {
62
- event.stopPropagation();
63
- }
52
+ const modalContent = this._element.querySelector('.kt-modal-content');
53
+
54
+ // Stop propagation for clicks inside dropdowns rendered within modal content.
55
+ const dropdownElement = target.closest('[data-kt-select-dropdown]');
56
+ if (dropdownElement) {
57
+ event.stopPropagation();
58
+ return;
59
+ }
60
+
61
+ // Dismiss when clicking anywhere outside modal content.
62
+ if (modalContent && modalContent.contains(target)) {
64
63
  return;
65
64
  }
66
65
 
@@ -205,6 +204,14 @@ export class KTModal extends KTComponent implements KTModalInterface {
205
204
  const zindex: number = parseInt(KTDom.getCssProp(this._element, 'z-index'));
206
205
  this._backdropElement = document.createElement('DIV');
207
206
  this._backdropElement.setAttribute('data-kt-modal-backdrop', 'true');
207
+ this._backdropElement.addEventListener('click', () => {
208
+ if (
209
+ this._getOption('backdropStatic') === false &&
210
+ KTUtils.stringToBoolean(this._getOption('persistent')) === false
211
+ ) {
212
+ this._hide();
213
+ }
214
+ });
208
215
  this._backdropElement.style.zIndex = (zindex - 1).toString();
209
216
  document.body.append(this._backdropElement);
210
217
  KTDom.reflow(this._backdropElement);
@@ -280,8 +287,9 @@ export class KTModal extends KTComponent implements KTModalInterface {
280
287
  }
281
288
 
282
289
  public static handleToggle(): void {
290
+ // wire:navigate / morph can replace document.body; <html> stays stable.
283
291
  KTEventHandler.on(
284
- document.body,
292
+ document.documentElement,
285
293
  '[data-kt-modal-toggle]',
286
294
  'click',
287
295
  (event: Event, target: HTMLElement) => {
@@ -301,7 +309,7 @@ export class KTModal extends KTComponent implements KTModalInterface {
301
309
 
302
310
  public static handleDismiss(): void {
303
311
  KTEventHandler.on(
304
- document.body,
312
+ document.documentElement,
305
313
  '[data-kt-modal-dismiss]',
306
314
  'click',
307
315
  (event: Event, target: HTMLElement) => {
@@ -15,4 +15,4 @@ export {
15
15
  EventManager,
16
16
  TypeToSearchBuffer,
17
17
  } from './utils';
18
- export { KTSelectConfigInterface, KTSelectOption } from './config';
18
+ export type { KTSelectConfigInterface, KTSelectOption } from './config';
@@ -20,12 +20,14 @@ export class KTThemeSwitch
20
20
  extends KTComponent
21
21
  implements KTThemeSwitchInterface
22
22
  {
23
- protected override _name: string = 'theme-swtich';
23
+ protected override _name: string = 'theme-switch';
24
24
  protected override _defaultConfig: KTThemeSwitchConfigInterface = {
25
25
  mode: 'light',
26
26
  };
27
27
  protected _mode: KTThemeSwitchModeType | null = null;
28
28
  protected _currentMode: KTThemeSwitchModeType | null = null;
29
+ protected _themeSwitchToggleEventId: string = '';
30
+ protected _themeSwitchSetEventId: string = '';
29
31
 
30
32
  constructor(
31
33
  element: HTMLElement | HTMLHtmlElement,
@@ -48,7 +50,7 @@ export class KTThemeSwitch
48
50
  protected _handlers(): void {
49
51
  if (!this._element) return;
50
52
 
51
- KTEventHandler.on(
53
+ this._themeSwitchToggleEventId = KTEventHandler.on(
52
54
  document.body,
53
55
  '[data-kt-theme-switch-toggle]',
54
56
  'click',
@@ -57,7 +59,7 @@ export class KTThemeSwitch
57
59
  },
58
60
  );
59
61
 
60
- KTEventHandler.on(
62
+ this._themeSwitchSetEventId = KTEventHandler.on(
61
63
  document.body,
62
64
  '[data-kt-theme-switch-set]',
63
65
  'click',
@@ -141,7 +143,23 @@ export class KTThemeSwitch
141
143
  }
142
144
 
143
145
  public setMode(mode: KTThemeSwitchModeType) {
144
- this.setMode(mode);
146
+ this._setMode(mode);
147
+ }
148
+
149
+ public override dispose(): void {
150
+ if (this._themeSwitchToggleEventId) {
151
+ KTEventHandler.off(
152
+ document.body,
153
+ 'click',
154
+ this._themeSwitchToggleEventId,
155
+ );
156
+ this._themeSwitchToggleEventId = '';
157
+ }
158
+ if (this._themeSwitchSetEventId) {
159
+ KTEventHandler.off(document.body, 'click', this._themeSwitchSetEventId);
160
+ this._themeSwitchSetEventId = '';
161
+ }
162
+ super.dispose();
145
163
  }
146
164
 
147
165
  public static getInstance(): KTThemeSwitch {
@@ -25,6 +25,7 @@ export class KTToggle extends KTComponent implements KTToggleInterface {
25
25
  };
26
26
  protected override _config: KTToggleConfigInterface = this._defaultConfig;
27
27
  protected _targetElement: HTMLElement;
28
+ protected _clickHandler: (() => void) | null = null;
28
29
 
29
30
  constructor(
30
31
  element: HTMLElement,
@@ -48,9 +49,18 @@ export class KTToggle extends KTComponent implements KTToggleInterface {
48
49
  protected _handlers(): void {
49
50
  if (!this._element) return;
50
51
 
51
- this._element.addEventListener('click', () => {
52
+ this._clickHandler = () => {
52
53
  this._toggle();
53
- });
54
+ };
55
+ this._element.addEventListener('click', this._clickHandler);
56
+ }
57
+
58
+ public override dispose(): void {
59
+ if (this._element && this._clickHandler) {
60
+ this._element.removeEventListener('click', this._clickHandler);
61
+ this._clickHandler = null;
62
+ }
63
+ super.dispose();
54
64
  }
55
65
 
56
66
  private _getTargetElement(): HTMLElement | null {
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ import KTUtils from './helpers/utils';
8
8
  import KTEventHandler from './helpers/event-handler';
9
9
  import KTData from './helpers/data';
10
10
  import { KTDropdown } from './components/dropdown';
11
+ import { KTContextMenu } from './components/context-menu';
11
12
  import { KTModal } from './components/modal';
12
13
  import { KTDrawer } from './components/drawer';
13
14
  import { KTCollapse } from './components/collapse';
@@ -36,6 +37,7 @@ import { KTPinInput } from './components/pin-input';
36
37
  import { KTCarousel } from './components/carousel';
37
38
 
38
39
  export { KTDropdown } from './components/dropdown';
40
+ export { KTContextMenu } from './components/context-menu';
39
41
  export { KTModal } from './components/modal';
40
42
  export { KTDrawer } from './components/drawer';
41
43
  export { KTCollapse } from './components/collapse';
@@ -96,6 +98,10 @@ export type {
96
98
  KTDropdownConfigInterface,
97
99
  KTDropdownInterface,
98
100
  } from './components/dropdown';
101
+ export type {
102
+ KTContextMenuConfigInterface,
103
+ KTContextMenuInterface,
104
+ } from './components/context-menu';
99
105
  export type {
100
106
  KTImageInputConfigInterface,
101
107
  KTImageInputInterface,
@@ -182,9 +188,10 @@ export type {
182
188
  KTTooltipInterface,
183
189
  } from './components/tooltip';
184
190
 
185
- const KTComponents = {
191
+ export const KTComponents = {
186
192
  init(): void {
187
193
  KTDropdown.init();
194
+ KTContextMenu.init();
188
195
  KTModal.init();
189
196
  KTDrawer.init();
190
197
  KTCollapse.init();
@@ -221,6 +228,7 @@ declare global {
221
228
  KTEventHandler: typeof KTEventHandler;
222
229
  KTData: typeof KTData;
223
230
  KTDropdown: typeof KTDropdown;
231
+ KTContextMenu: typeof KTContextMenu;
224
232
  KTModal: typeof KTModal;
225
233
  KTDrawer: typeof KTDrawer;
226
234
  KTCollapse: typeof KTCollapse;
@@ -252,7 +260,3 @@ declare global {
252
260
  }
253
261
 
254
262
  export default KTComponents;
255
-
256
- KTDom.ready(() => {
257
- KTComponents.init();
258
- });
@@ -0,0 +1,15 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ import KTDom from './helpers/dom';
7
+ import { KTComponents } from './index';
8
+
9
+ export const initAllComponents = (): void => {
10
+ KTDom.ready(() => {
11
+ KTComponents.init();
12
+ });
13
+ };
14
+
15
+ initAllComponents();
package/src/legacy.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ export * from './index';
7
+ export { default } from './index';
8
+
9
+ import './init-all';
package/styles.css CHANGED
@@ -17,6 +17,7 @@
17
17
  @import './src/components/drawer/drawer.css';
18
18
  @import './src/components/dropdown/dropdown.css';
19
19
  @import './src/components/dropdown/dropdown-menu.css';
20
+ @import './src/components/context-menu/context-menu.css';
20
21
  @import './src/components/image-input/image-input.css';
21
22
  @import './src/components/input/input.css';
22
23
  @import './src/components/input/input-group.css';