@keenthemes/ktui 1.1.1 → 1.1.3

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 (81) hide show
  1. package/dist/ktui.js +674 -225
  2. package/dist/ktui.min.js +1 -1
  3. package/dist/ktui.min.js.map +1 -1
  4. package/dist/styles.css +13 -1
  5. package/lib/cjs/components/component.js +22 -0
  6. package/lib/cjs/components/component.js.map +1 -1
  7. package/lib/cjs/components/datatable/datatable.js +7 -1
  8. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  9. package/lib/cjs/components/drawer/drawer.js +255 -9
  10. package/lib/cjs/components/drawer/drawer.js.map +1 -1
  11. package/lib/cjs/components/dropdown/dropdown.js +55 -8
  12. package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
  13. package/lib/cjs/components/select/combobox.js +0 -2
  14. package/lib/cjs/components/select/combobox.js.map +1 -1
  15. package/lib/cjs/components/select/config.js +4 -1
  16. package/lib/cjs/components/select/config.js.map +1 -1
  17. package/lib/cjs/components/select/dropdown.js +0 -16
  18. package/lib/cjs/components/select/dropdown.js.map +1 -1
  19. package/lib/cjs/components/select/remote.js +0 -40
  20. package/lib/cjs/components/select/remote.js.map +1 -1
  21. package/lib/cjs/components/select/search.js +93 -22
  22. package/lib/cjs/components/select/search.js.map +1 -1
  23. package/lib/cjs/components/select/select.js +180 -114
  24. package/lib/cjs/components/select/select.js.map +1 -1
  25. package/lib/cjs/components/select/tags.js +0 -2
  26. package/lib/cjs/components/select/tags.js.map +1 -1
  27. package/lib/cjs/components/sticky/sticky.js +44 -5
  28. package/lib/cjs/components/sticky/sticky.js.map +1 -1
  29. package/lib/cjs/helpers/data.js +8 -0
  30. package/lib/cjs/helpers/data.js.map +1 -1
  31. package/lib/cjs/helpers/event-handler.js +6 -5
  32. package/lib/cjs/helpers/event-handler.js.map +1 -1
  33. package/lib/cjs/index.js.map +1 -1
  34. package/lib/esm/components/component.js +22 -0
  35. package/lib/esm/components/component.js.map +1 -1
  36. package/lib/esm/components/datatable/datatable.js +7 -1
  37. package/lib/esm/components/datatable/datatable.js.map +1 -1
  38. package/lib/esm/components/drawer/drawer.js +255 -9
  39. package/lib/esm/components/drawer/drawer.js.map +1 -1
  40. package/lib/esm/components/dropdown/dropdown.js +55 -8
  41. package/lib/esm/components/dropdown/dropdown.js.map +1 -1
  42. package/lib/esm/components/select/combobox.js +0 -2
  43. package/lib/esm/components/select/combobox.js.map +1 -1
  44. package/lib/esm/components/select/config.js +4 -1
  45. package/lib/esm/components/select/config.js.map +1 -1
  46. package/lib/esm/components/select/dropdown.js +0 -16
  47. package/lib/esm/components/select/dropdown.js.map +1 -1
  48. package/lib/esm/components/select/remote.js +0 -40
  49. package/lib/esm/components/select/remote.js.map +1 -1
  50. package/lib/esm/components/select/search.js +93 -22
  51. package/lib/esm/components/select/search.js.map +1 -1
  52. package/lib/esm/components/select/select.js +180 -114
  53. package/lib/esm/components/select/select.js.map +1 -1
  54. package/lib/esm/components/select/tags.js +0 -2
  55. package/lib/esm/components/select/tags.js.map +1 -1
  56. package/lib/esm/components/sticky/sticky.js +44 -5
  57. package/lib/esm/components/sticky/sticky.js.map +1 -1
  58. package/lib/esm/helpers/data.js +8 -0
  59. package/lib/esm/helpers/data.js.map +1 -1
  60. package/lib/esm/helpers/event-handler.js +6 -5
  61. package/lib/esm/helpers/event-handler.js.map +1 -1
  62. package/lib/esm/index.js.map +1 -1
  63. package/package.json +6 -4
  64. package/src/components/component.ts +26 -0
  65. package/src/components/datatable/__tests__/race-conditions.test.ts +7 -7
  66. package/src/components/datatable/datatable.ts +8 -1
  67. package/src/components/drawer/drawer.ts +266 -10
  68. package/src/components/dropdown/dropdown.ts +63 -8
  69. package/src/components/select/__tests__/ux-behaviors.test.ts +997 -0
  70. package/src/components/select/combobox.ts +0 -1
  71. package/src/components/select/config.ts +7 -1
  72. package/src/components/select/dropdown.ts +0 -24
  73. package/src/components/select/remote.ts +0 -49
  74. package/src/components/select/search.ts +97 -24
  75. package/src/components/select/select.css +5 -1
  76. package/src/components/select/select.ts +211 -153
  77. package/src/components/select/tags.ts +0 -1
  78. package/src/components/sticky/sticky.ts +55 -5
  79. package/src/helpers/data.ts +10 -0
  80. package/src/helpers/event-handler.ts +7 -6
  81. package/src/index.ts +2 -0
@@ -44,6 +44,8 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
44
44
  protected _releaseElement: HTMLElement;
45
45
  protected _activateElement: HTMLElement;
46
46
  protected _wrapperElement: HTMLElement;
47
+ private _resizeHandler: (() => void) | null = null;
48
+ private _scrollHandler: (() => void) | null = null;
47
49
 
48
50
  constructor(
49
51
  element: HTMLElement,
@@ -51,7 +53,10 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
51
53
  ) {
52
54
  super();
53
55
 
54
- if (KTData.has(element as HTMLElement, this._name)) return;
56
+ // Check if element already has an instance and is still connected
57
+ if (this._shouldSkipInit(element)) {
58
+ return;
59
+ }
55
60
 
56
61
  this._init(element);
57
62
  this._buildConfig(config);
@@ -88,7 +93,8 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
88
93
  }
89
94
 
90
95
  protected _handlers(): void {
91
- window.addEventListener('resize', () => {
96
+ // Store resize handler reference for cleanup
97
+ this._resizeHandler = () => {
92
98
  let timer;
93
99
 
94
100
  KTUtils.throttle(
@@ -98,11 +104,25 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
98
104
  },
99
105
  200,
100
106
  );
101
- });
107
+ };
102
108
 
103
- this._targetElement.addEventListener('scroll', () => {
109
+ window.addEventListener('resize', this._resizeHandler);
110
+
111
+ // Store scroll handler reference for cleanup
112
+ this._scrollHandler = () => {
104
113
  this._process();
105
- });
114
+ };
115
+
116
+ if (this._targetElement) {
117
+ if (this._targetElement === document) {
118
+ window.addEventListener('scroll', this._scrollHandler);
119
+ } else {
120
+ (this._targetElement as HTMLElement).addEventListener(
121
+ 'scroll',
122
+ this._scrollHandler,
123
+ );
124
+ }
125
+ }
106
126
  }
107
127
 
108
128
  protected _process(): void {
@@ -373,6 +393,36 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
373
393
  return this._isActive();
374
394
  }
375
395
 
396
+ public override dispose(): void {
397
+ // Remove resize event listener
398
+ if (this._resizeHandler) {
399
+ window.removeEventListener('resize', this._resizeHandler);
400
+ this._resizeHandler = null;
401
+ }
402
+
403
+ // Remove scroll event listener
404
+ if (this._scrollHandler) {
405
+ if (this._targetElement === document) {
406
+ window.removeEventListener('scroll', this._scrollHandler);
407
+ } else if (this._targetElement) {
408
+ (this._targetElement as HTMLElement).removeEventListener(
409
+ 'scroll',
410
+ this._scrollHandler,
411
+ );
412
+ }
413
+ this._scrollHandler = null;
414
+ }
415
+
416
+ // Clean up state
417
+ this._disable();
418
+ if (this._attributeRoot && document.body.hasAttribute(this._attributeRoot)) {
419
+ document.body.removeAttribute(this._attributeRoot);
420
+ }
421
+
422
+ // Call parent dispose to clean up data attributes and KTData
423
+ super.dispose();
424
+ }
425
+
376
426
  public static getInstance(element: HTMLElement): KTSticky {
377
427
  if (!element) return null;
378
428
 
@@ -41,6 +41,16 @@ const KTData = {
41
41
  KTElementMap.delete(element);
42
42
  }
43
43
  },
44
+
45
+ // Clear all data for a specific element (useful for reinitialization)
46
+ clear(element: HTMLElement): void {
47
+ KTElementMap.delete(element);
48
+ },
44
49
  };
45
50
 
51
+ // Expose KTData on window for external access (useful for Livewire wire:navigate)
52
+ if (typeof window !== 'undefined') {
53
+ window.KTData = KTData;
54
+ }
55
+
46
56
  export default KTData;
@@ -28,14 +28,15 @@ const KTEventHandler = {
28
28
  KTDelegatedEventHandlers[eventId] = (
29
29
  event: Event & { target: HTMLElement },
30
30
  ) => {
31
- const targets = element.querySelectorAll(selector);
32
- let target = event.target;
31
+ // Fix: Check selector dynamically instead of pre-computing targets
32
+ // This allows event delegation to work with dynamically added elements
33
+ let target = event.target as HTMLElement;
33
34
 
34
35
  while (target && target !== element) {
35
- for (let i = 0, j = targets.length; i < j; i++) {
36
- if (target === targets[i]) {
37
- handler.call(this, event, target);
38
- }
36
+ // Check if current target matches the selector
37
+ if (target.matches && target.matches(selector)) {
38
+ handler.call(this, event, target);
39
+ return; // Stop bubbling once we've handled it
39
40
  }
40
41
 
41
42
  target = target.parentNode as HTMLElement;
package/src/index.ts CHANGED
@@ -6,6 +6,7 @@
6
6
  import KTDom from './helpers/dom';
7
7
  import KTUtils from './helpers/utils';
8
8
  import KTEventHandler from './helpers/event-handler';
9
+ import KTData from './helpers/data';
9
10
  import { KTDropdown } from './components/dropdown';
10
11
  import { KTModal } from './components/modal';
11
12
  import { KTDrawer } from './components/drawer';
@@ -81,6 +82,7 @@ declare global {
81
82
  KTUtils: typeof KTUtils;
82
83
  KTDom: typeof KTDom;
83
84
  KTEventHandler: typeof KTEventHandler;
85
+ KTData: typeof KTData;
84
86
  KTDropdown: typeof KTDropdown;
85
87
  KTModal: typeof KTModal;
86
88
  KTDrawer: typeof KTDrawer;