@keenthemes/ktui 1.0.20 → 1.0.21

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 (98) hide show
  1. package/dist/ktui.js +418 -144
  2. package/dist/ktui.min.js +1 -1
  3. package/dist/ktui.min.js.map +1 -1
  4. package/dist/styles.css +139 -31
  5. package/examples/image-input/file-upload-example.html +189 -0
  6. package/examples/select/remote-data_.html +5 -0
  7. package/examples/select/test-optimizations.html +227 -0
  8. package/examples/select/test-remote-search.html +151 -0
  9. package/examples/sticky/README.md +158 -0
  10. package/examples/sticky/debug-sticky.html +144 -0
  11. package/examples/sticky/test-runner.html +175 -0
  12. package/examples/sticky/test-sticky-logic.js +369 -0
  13. package/examples/sticky/test-sticky-positioning.html +386 -0
  14. package/examples/toast/example.html +52 -0
  15. package/lib/cjs/components/component.js +5 -3
  16. package/lib/cjs/components/component.js.map +1 -1
  17. package/lib/cjs/components/datatable/datatable-sort.js +4 -0
  18. package/lib/cjs/components/datatable/datatable-sort.js.map +1 -1
  19. package/lib/cjs/components/datatable/datatable.js +9 -3
  20. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  21. package/lib/cjs/components/image-input/image-input.js +10 -2
  22. package/lib/cjs/components/image-input/image-input.js.map +1 -1
  23. package/lib/cjs/components/select/combobox.js +50 -20
  24. package/lib/cjs/components/select/combobox.js.map +1 -1
  25. package/lib/cjs/components/select/dropdown.js +4 -2
  26. package/lib/cjs/components/select/dropdown.js.map +1 -1
  27. package/lib/cjs/components/select/index.js.map +1 -1
  28. package/lib/cjs/components/select/option.js +2 -1
  29. package/lib/cjs/components/select/option.js.map +1 -1
  30. package/lib/cjs/components/select/remote.js +50 -50
  31. package/lib/cjs/components/select/remote.js.map +1 -1
  32. package/lib/cjs/components/select/search.js +7 -5
  33. package/lib/cjs/components/select/search.js.map +1 -1
  34. package/lib/cjs/components/select/select.js +199 -33
  35. package/lib/cjs/components/select/select.js.map +1 -1
  36. package/lib/cjs/components/select/tags.js +3 -1
  37. package/lib/cjs/components/select/tags.js.map +1 -1
  38. package/lib/cjs/components/select/templates.js.map +1 -1
  39. package/lib/cjs/components/select/utils.js +23 -10
  40. package/lib/cjs/components/select/utils.js.map +1 -1
  41. package/lib/cjs/components/sticky/sticky.js +52 -14
  42. package/lib/cjs/components/sticky/sticky.js.map +1 -1
  43. package/lib/esm/components/component.js +5 -3
  44. package/lib/esm/components/component.js.map +1 -1
  45. package/lib/esm/components/datatable/datatable-sort.js +4 -0
  46. package/lib/esm/components/datatable/datatable-sort.js.map +1 -1
  47. package/lib/esm/components/datatable/datatable.js +9 -3
  48. package/lib/esm/components/datatable/datatable.js.map +1 -1
  49. package/lib/esm/components/image-input/image-input.js +10 -2
  50. package/lib/esm/components/image-input/image-input.js.map +1 -1
  51. package/lib/esm/components/select/combobox.js +50 -20
  52. package/lib/esm/components/select/combobox.js.map +1 -1
  53. package/lib/esm/components/select/dropdown.js +4 -2
  54. package/lib/esm/components/select/dropdown.js.map +1 -1
  55. package/lib/esm/components/select/index.js +1 -1
  56. package/lib/esm/components/select/index.js.map +1 -1
  57. package/lib/esm/components/select/option.js +2 -1
  58. package/lib/esm/components/select/option.js.map +1 -1
  59. package/lib/esm/components/select/remote.js +50 -50
  60. package/lib/esm/components/select/remote.js.map +1 -1
  61. package/lib/esm/components/select/search.js +8 -6
  62. package/lib/esm/components/select/search.js.map +1 -1
  63. package/lib/esm/components/select/select.js +199 -33
  64. package/lib/esm/components/select/select.js.map +1 -1
  65. package/lib/esm/components/select/tags.js +3 -1
  66. package/lib/esm/components/select/tags.js.map +1 -1
  67. package/lib/esm/components/select/templates.js.map +1 -1
  68. package/lib/esm/components/select/utils.js +23 -10
  69. package/lib/esm/components/select/utils.js.map +1 -1
  70. package/lib/esm/components/sticky/sticky.js +52 -14
  71. package/lib/esm/components/sticky/sticky.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/components/component.ts +12 -11
  74. package/src/components/datatable/datatable-sort.ts +6 -0
  75. package/src/components/datatable/datatable.ts +90 -81
  76. package/src/components/image-input/image-input.ts +11 -2
  77. package/src/components/image-input/types.ts +1 -0
  78. package/src/components/input/input-group.css +1 -1
  79. package/src/components/input/input.css +1 -1
  80. package/src/components/scrollable/scrollable.css +3 -3
  81. package/src/components/select/combobox.ts +84 -34
  82. package/src/components/select/dropdown.ts +20 -11
  83. package/src/components/select/index.ts +6 -1
  84. package/src/components/select/option.ts +7 -6
  85. package/src/components/select/remote.ts +51 -52
  86. package/src/components/select/search.ts +51 -45
  87. package/src/components/select/select.css +12 -11
  88. package/src/components/select/select.ts +371 -102
  89. package/src/components/select/tags.ts +9 -3
  90. package/src/components/select/templates.ts +1 -4
  91. package/src/components/select/utils.ts +55 -20
  92. package/src/components/select/variants.css +0 -1
  93. package/src/components/sticky/sticky.ts +47 -16
  94. package/src/components/sticky/types.ts +3 -0
  95. package/src/components/table/table.css +1 -1
  96. package/src/components/textarea/textarea.css +1 -1
  97. package/src/components/toast/toast.css +84 -47
  98. package/src/components/toast/types.ts +3 -0
package/dist/styles.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */
2
2
  @layer properties;
3
3
  @layer theme, base, components, utilities;
4
4
  @layer theme {
@@ -25,6 +25,7 @@
25
25
  --color-green-50: oklch(98.2% 0.018 155.826);
26
26
  --color-green-100: oklch(96.2% 0.044 156.743);
27
27
  --color-green-200: oklch(92.5% 0.084 155.995);
28
+ --color-green-400: oklch(79.2% 0.209 151.711);
28
29
  --color-green-500: oklch(72.3% 0.219 149.579);
29
30
  --color-green-600: oklch(62.7% 0.194 149.214);
30
31
  --color-green-700: oklch(52.7% 0.154 150.069);
@@ -48,6 +49,7 @@
48
49
  --color-violet-700: oklch(49.1% 0.27 292.581);
49
50
  --color-violet-800: oklch(43.2% 0.232 292.759);
50
51
  --color-violet-950: oklch(28.3% 0.141 291.089);
52
+ --color-purple-500: oklch(62.7% 0.265 303.9);
51
53
  --color-pink-500: oklch(65.6% 0.241 354.308);
52
54
  --color-gray-50: oklch(98.5% 0.002 247.839);
53
55
  --color-gray-100: oklch(96.7% 0.003 264.542);
@@ -76,6 +78,7 @@
76
78
  --spacing: 0.25rem;
77
79
  --container-sm: 24rem;
78
80
  --container-md: 28rem;
81
+ --container-4xl: 56rem;
79
82
  --text-xs: 0.75rem;
80
83
  --text-xs--line-height: calc(1 / 0.75);
81
84
  --text-sm: 0.875rem;
@@ -86,6 +89,10 @@
86
89
  --text-lg--line-height: calc(1.75 / 1.125);
87
90
  --text-xl: 1.25rem;
88
91
  --text-xl--line-height: calc(1.75 / 1.25);
92
+ --text-2xl: 1.5rem;
93
+ --text-2xl--line-height: calc(2 / 1.5);
94
+ --text-3xl: 1.875rem;
95
+ --text-3xl--line-height: calc(2.25 / 1.875);
89
96
  --font-weight-normal: 400;
90
97
  --font-weight-medium: 500;
91
98
  --font-weight-semibold: 600;
@@ -285,7 +292,7 @@
285
292
  padding: 0;
286
293
  margin: -1px;
287
294
  overflow: hidden;
288
- clip: rect(0, 0, 0, 0);
295
+ clip-path: inset(50%);
289
296
  white-space: nowrap;
290
297
  border-width: 0;
291
298
  }
@@ -355,6 +362,9 @@
355
362
  .ms-auto {
356
363
  margin-inline-start: auto;
357
364
  }
365
+ .mt-1 {
366
+ margin-top: calc(var(--spacing) * 1);
367
+ }
358
368
  .mt-3 {
359
369
  margin-top: calc(var(--spacing) * 3);
360
370
  }
@@ -379,6 +389,9 @@
379
389
  .mb-6 {
380
390
  margin-bottom: calc(var(--spacing) * 6);
381
391
  }
392
+ .mb-8 {
393
+ margin-bottom: calc(var(--spacing) * 8);
394
+ }
382
395
  .-ml-1 {
383
396
  margin-left: calc(var(--spacing) * -1);
384
397
  }
@@ -422,6 +435,10 @@
422
435
  width: calc(var(--spacing) * 6);
423
436
  height: calc(var(--spacing) * 6);
424
437
  }
438
+ .size-16 {
439
+ width: calc(var(--spacing) * 16);
440
+ height: calc(var(--spacing) * 16);
441
+ }
425
442
  .h-5 {
426
443
  height: calc(var(--spacing) * 5);
427
444
  }
@@ -431,6 +448,9 @@
431
448
  .h-8 {
432
449
  height: calc(var(--spacing) * 8);
433
450
  }
451
+ .max-h-96 {
452
+ max-height: calc(var(--spacing) * 96);
453
+ }
434
454
  .max-h-\[250px\] {
435
455
  max-height: 250px;
436
456
  }
@@ -455,6 +475,9 @@
455
475
  .w-full {
456
476
  width: 100%;
457
477
  }
478
+ .max-w-4xl {
479
+ max-width: var(--container-4xl);
480
+ }
458
481
  .max-w-md {
459
482
  max-width: var(--container-md);
460
483
  }
@@ -543,6 +566,20 @@
543
566
  .gap-6 {
544
567
  gap: calc(var(--spacing) * 6);
545
568
  }
569
+ .space-y-2 {
570
+ :where(& > :not(:last-child)) {
571
+ --tw-space-y-reverse: 0;
572
+ margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));
573
+ margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
574
+ }
575
+ }
576
+ .space-y-4 {
577
+ :where(& > :not(:last-child)) {
578
+ --tw-space-y-reverse: 0;
579
+ margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));
580
+ margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));
581
+ }
582
+ }
546
583
  .space-x-2 {
547
584
  :where(& > :not(:last-child)) {
548
585
  --tw-space-x-reverse: 0;
@@ -550,6 +587,13 @@
550
587
  margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)));
551
588
  }
552
589
  }
590
+ .space-x-4 {
591
+ :where(& > :not(:last-child)) {
592
+ --tw-space-x-reverse: 0;
593
+ margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));
594
+ margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)));
595
+ }
596
+ }
553
597
  .overflow-auto {
554
598
  overflow: auto;
555
599
  }
@@ -635,9 +679,21 @@
635
679
  .bg-gray-100 {
636
680
  background-color: var(--color-gray-100);
637
681
  }
682
+ .bg-gray-500 {
683
+ background-color: var(--color-gray-500);
684
+ }
685
+ .bg-gray-900 {
686
+ background-color: var(--color-gray-900);
687
+ }
688
+ .bg-green-500 {
689
+ background-color: var(--color-green-500);
690
+ }
638
691
  .bg-pink-500 {
639
692
  background-color: var(--color-pink-500);
640
693
  }
694
+ .bg-purple-500 {
695
+ background-color: var(--color-purple-500);
696
+ }
641
697
  .bg-transparent {
642
698
  background-color: transparent;
643
699
  }
@@ -653,6 +709,9 @@
653
709
  .p-2 {
654
710
  padding: calc(var(--spacing) * 2);
655
711
  }
712
+ .p-4 {
713
+ padding: calc(var(--spacing) * 4);
714
+ }
656
715
  .p-6 {
657
716
  padding: calc(var(--spacing) * 6);
658
717
  }
@@ -674,6 +733,9 @@
674
733
  .px-4 {
675
734
  padding-inline: calc(var(--spacing) * 4);
676
735
  }
736
+ .px-6 {
737
+ padding-inline: calc(var(--spacing) * 6);
738
+ }
677
739
  .py-0\.5 {
678
740
  padding-block: calc(var(--spacing) * 0.5);
679
741
  }
@@ -689,6 +751,9 @@
689
751
  .py-3 {
690
752
  padding-block: calc(var(--spacing) * 3);
691
753
  }
754
+ .py-8 {
755
+ padding-block: calc(var(--spacing) * 8);
756
+ }
692
757
  .ps-5 {
693
758
  padding-inline-start: calc(var(--spacing) * 5);
694
759
  }
@@ -710,6 +775,17 @@
710
775
  .text-start {
711
776
  text-align: start;
712
777
  }
778
+ .font-mono {
779
+ font-family: var(--font-mono);
780
+ }
781
+ .text-2xl {
782
+ font-size: var(--text-2xl);
783
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
784
+ }
785
+ .text-3xl {
786
+ font-size: var(--text-3xl);
787
+ line-height: var(--tw-leading, var(--text-3xl--line-height));
788
+ }
713
789
  .text-lg {
714
790
  font-size: var(--text-lg);
715
791
  line-height: var(--tw-leading, var(--text-lg--line-height));
@@ -772,12 +848,21 @@
772
848
  .text-gray-900 {
773
849
  color: var(--color-gray-900);
774
850
  }
851
+ .text-green-400 {
852
+ color: var(--color-green-400);
853
+ }
854
+ .text-green-600 {
855
+ color: var(--color-green-600);
856
+ }
775
857
  .text-muted-foreground {
776
858
  color: var(--muted-foreground);
777
859
  }
778
860
  .text-primary {
779
861
  color: var(--primary);
780
862
  }
863
+ .text-red-600 {
864
+ color: var(--color-red-600);
865
+ }
781
866
  .text-white {
782
867
  color: var(--color-white);
783
868
  }
@@ -811,6 +896,10 @@
811
896
  --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
812
897
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
813
898
  }
899
+ .shadow-md {
900
+ --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
901
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
902
+ }
814
903
  .ring {
815
904
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
816
905
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -834,7 +923,7 @@
834
923
  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
835
924
  }
836
925
  .transition {
837
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events;
926
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
838
927
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
839
928
  transition-duration: var(--tw-duration, var(--default-transition-duration));
840
929
  }
@@ -889,6 +978,13 @@
889
978
  }
890
979
  }
891
980
  }
981
+ .hover\:bg-gray-600 {
982
+ &:hover {
983
+ @media (hover: hover) {
984
+ background-color: var(--color-gray-600);
985
+ }
986
+ }
987
+ }
892
988
  .hover\:text-blue-600 {
893
989
  &:hover {
894
990
  @media (hover: hover) {
@@ -2184,7 +2280,7 @@
2184
2280
  border-radius: calc(var(--radius) - 2px);
2185
2281
  --tw-font-weight: var(--font-weight-medium);
2186
2282
  font-weight: var(--font-weight-medium);
2187
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events;
2283
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
2188
2284
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
2189
2285
  transition-duration: var(--tw-duration, var(--default-transition-duration));
2190
2286
  &:focus {
@@ -3185,7 +3281,7 @@
3185
3281
  color: var(--popover-foreground);
3186
3282
  --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
3187
3283
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3188
- transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, visibility, content-visibility, overlay, pointer-events;
3284
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
3189
3285
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
3190
3286
  transition-duration: var(--tw-duration, var(--default-transition-duration));
3191
3287
  --tw-duration: 300ms;
@@ -4059,7 +4155,6 @@
4059
4155
  top: calc(1/2 * 100%);
4060
4156
  display: none;
4061
4157
  --tw-translate-x: calc(calc(1/2 * 100%) * -1);
4062
- translate: var(--tw-translate-x) var(--tw-translate-y);
4063
4158
  --tw-translate-y: calc(calc(1/2 * 100%) * -1);
4064
4159
  translate: var(--tw-translate-x) var(--tw-translate-y);
4065
4160
  overflow: auto;
@@ -4127,7 +4222,6 @@
4127
4222
  inset-inline-start: calc(1/2 * 100%);
4128
4223
  top: calc(1/2 * 100%);
4129
4224
  --tw-translate-x: calc(calc(1/2 * 100%) * -1);
4130
- translate: var(--tw-translate-x) var(--tw-translate-y);
4131
4225
  --tw-translate-y: calc(calc(1/2 * 100%) * -1);
4132
4226
  translate: var(--tw-translate-x) var(--tw-translate-y);
4133
4227
  }
@@ -4494,7 +4588,7 @@
4494
4588
  color: var(--accent-foreground);
4495
4589
  }
4496
4590
  }
4497
- &[aria-disabled=true], &.disabled {
4591
+ &[aria-disabled='true'], &.disabled {
4498
4592
  pointer-events: none;
4499
4593
  opacity: 60%;
4500
4594
  }
@@ -4505,7 +4599,6 @@
4505
4599
  }
4506
4600
  .kt-select-option-text {
4507
4601
  overflow: hidden;
4508
- text-overflow: ellipsis;
4509
4602
  white-space: nowrap;
4510
4603
  text-overflow: ellipsis;
4511
4604
  }
@@ -4524,15 +4617,13 @@
4524
4617
  }
4525
4618
  .kt-select-placeholder {
4526
4619
  overflow: hidden;
4527
- text-overflow: ellipsis;
4528
4620
  white-space: nowrap;
4529
4621
  text-overflow: ellipsis;
4530
4622
  color: var(--muted-foreground);
4531
4623
  }
4532
- .kt-select-display:not([data-multiple=true]) {
4624
+ .kt-select-display:not([data-multiple='true']) {
4533
4625
  width: 100%;
4534
4626
  overflow: hidden;
4535
- text-overflow: ellipsis;
4536
4627
  white-space: nowrap;
4537
4628
  text-overflow: ellipsis;
4538
4629
  }
@@ -4548,7 +4639,7 @@
4548
4639
  --tw-leading: var(--text-sm--line-height);
4549
4640
  line-height: var(--text-sm--line-height);
4550
4641
  background-position: right 0.5rem center;
4551
- &[data-multiple=true] {
4642
+ &[data-multiple='true'] {
4552
4643
  height: auto;
4553
4644
  min-height: calc(var(--spacing) * 8.5);
4554
4645
  flex-wrap: wrap;
@@ -4565,7 +4656,7 @@
4565
4656
  font-size: var(--text-xs);
4566
4657
  line-height: var(--tw-leading, var(--text-xs--line-height));
4567
4658
  background-position: right 0.5rem center;
4568
- &[data-multiple=true] {
4659
+ &[data-multiple='true'] {
4569
4660
  height: auto;
4570
4661
  min-height: calc(var(--spacing) * 7);
4571
4662
  background-position: right 0.5rem top 0.575rem;
@@ -4581,7 +4672,7 @@
4581
4672
  font-size: var(--text-sm);
4582
4673
  line-height: var(--tw-leading, var(--text-sm--line-height));
4583
4674
  background-position: right 0.6rem center;
4584
- &[data-multiple=true] {
4675
+ &[data-multiple='true'] {
4585
4676
  height: auto;
4586
4677
  min-height: calc(var(--spacing) * 10);
4587
4678
  padding-block: calc(var(--spacing) * 2);
@@ -4593,19 +4684,19 @@
4593
4684
  [dir='rtl'] {
4594
4685
  .kt-select {
4595
4686
  background-position: left 0.5rem center;
4596
- &[data-multiple=true] {
4687
+ &[data-multiple='true'] {
4597
4688
  background-position: left 0.5rem top 0.675rem;
4598
4689
  }
4599
4690
  }
4600
4691
  .kt-select-sm {
4601
4692
  background-position: left 0.5rem center;
4602
- &[data-multiple=true] {
4693
+ &[data-multiple='true'] {
4603
4694
  background-position: left 0.5rem top 0.575rem;
4604
4695
  }
4605
4696
  }
4606
4697
  .kt-select-lg {
4607
4698
  background-position: left 0.75rem center;
4608
- &[data-multiple=true] {
4699
+ &[data-multiple='true'] {
4609
4700
  background-position: left 0.75rem top 0.85rem;
4610
4701
  }
4611
4702
  }
@@ -4683,13 +4774,11 @@
4683
4774
  top: calc(1/2 * 100%);
4684
4775
  display: block;
4685
4776
  --tw-translate-x: calc(var(--spacing) * 1);
4686
- translate: var(--tw-translate-x) var(--tw-translate-y);
4687
4777
  --tw-translate-y: calc(calc(1/2 * 100%) * -1);
4688
4778
  translate: var(--tw-translate-x) var(--tw-translate-y);
4689
4779
  border-radius: calc(infinity * 1px);
4690
4780
  background-color: var(--color-white);
4691
4781
  --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));
4692
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4693
4782
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
4694
4783
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4695
4784
  transition-property: transform, translate, scale, rotate;
@@ -5125,7 +5214,7 @@
5125
5214
  }
5126
5215
  }
5127
5216
  td, th {
5128
- input[type=checkbox] {
5217
+ input[type='checkbox'] {
5129
5218
  vertical-align: inherit;
5130
5219
  }
5131
5220
  }
@@ -5516,17 +5605,17 @@
5516
5605
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
5517
5606
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
5518
5607
  opacity: 0;
5519
- animation: kt-toast-in 0.28s cubic-bezier(.4,0,.2,1) forwards;
5520
- transition: top 0.28s cubic-bezier(.4,0,.2,1), opacity 0.28s cubic-bezier(.4,0,.2,1);
5608
+ animation: kt-toast-in 0.28s cubic-bezier(0.4, 0, 0.2, 1) forwards;
5609
+ transition: top 0.28s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.28s cubic-bezier(0.4, 0, 0.2, 1);
5521
5610
  &.kt-toast-top-end {
5522
5611
  inset-inline-end: calc(var(--spacing) * 0);
5523
5612
  top: calc(var(--spacing) * 0);
5524
5613
  bottom: auto;
5525
5614
  }
5526
5615
  &.kt-toast-top-center {
5527
- inset-inline-start: calc(1/2 * 100%);
5528
5616
  top: calc(var(--spacing) * 0);
5529
5617
  bottom: auto;
5618
+ left: calc(1/2 * 100%);
5530
5619
  --tw-translate-x: calc(calc(1/2 * 100%) * -1);
5531
5620
  translate: var(--tw-translate-x) var(--tw-translate-y);
5532
5621
  }
@@ -5535,15 +5624,34 @@
5535
5624
  top: calc(var(--spacing) * 0);
5536
5625
  bottom: auto;
5537
5626
  }
5627
+ &.kt-toast-middle-end {
5628
+ inset-inline-end: calc(var(--spacing) * 0);
5629
+ top: calc(1/2 * 100%);
5630
+ --tw-translate-y: calc(calc(1/2 * 100%) * -1);
5631
+ translate: var(--tw-translate-x) var(--tw-translate-y);
5632
+ }
5633
+ &.kt-toast-middle-center {
5634
+ top: calc(1/2 * 100%);
5635
+ left: calc(1/2 * 100%);
5636
+ --tw-translate-x: calc(calc(1/2 * 100%) * -1);
5637
+ --tw-translate-y: calc(calc(1/2 * 100%) * -1);
5638
+ translate: var(--tw-translate-x) var(--tw-translate-y);
5639
+ }
5640
+ &.kt-toast-middle-start {
5641
+ inset-inline-start: calc(var(--spacing) * 0);
5642
+ top: calc(1/2 * 100%);
5643
+ --tw-translate-y: calc(calc(1/2 * 100%) * -1);
5644
+ translate: var(--tw-translate-x) var(--tw-translate-y);
5645
+ }
5538
5646
  &.kt-toast-bottom-end {
5539
5647
  inset-inline-end: calc(var(--spacing) * 0);
5540
5648
  top: auto;
5541
5649
  bottom: calc(var(--spacing) * 0);
5542
5650
  }
5543
5651
  &.kt-toast-bottom-center {
5544
- inset-inline-start: calc(1/2 * 100%);
5545
5652
  top: auto;
5546
5653
  bottom: calc(var(--spacing) * 0);
5654
+ left: calc(1/2 * 100%);
5547
5655
  --tw-translate-x: calc(calc(1/2 * 100%) * -1);
5548
5656
  translate: var(--tw-translate-x) var(--tw-translate-y);
5549
5657
  }
@@ -5632,6 +5740,11 @@
5632
5740
  syntax: "*";
5633
5741
  inherits: false;
5634
5742
  }
5743
+ @property --tw-space-y-reverse {
5744
+ syntax: "*";
5745
+ inherits: false;
5746
+ initial-value: 0;
5747
+ }
5635
5748
  @property --tw-space-x-reverse {
5636
5749
  syntax: "*";
5637
5750
  inherits: false;
@@ -5777,11 +5890,6 @@
5777
5890
  syntax: "*";
5778
5891
  inherits: false;
5779
5892
  }
5780
- @property --tw-space-y-reverse {
5781
- syntax: "*";
5782
- inherits: false;
5783
- initial-value: 0;
5784
- }
5785
5893
  @property --tw-tracking {
5786
5894
  syntax: "*";
5787
5895
  inherits: false;
@@ -5816,6 +5924,7 @@
5816
5924
  --tw-rotate-z: initial;
5817
5925
  --tw-skew-x: initial;
5818
5926
  --tw-skew-y: initial;
5927
+ --tw-space-y-reverse: 0;
5819
5928
  --tw-space-x-reverse: 0;
5820
5929
  --tw-border-style: solid;
5821
5930
  --tw-leading: initial;
@@ -5849,7 +5958,6 @@
5849
5958
  --tw-drop-shadow-alpha: 100%;
5850
5959
  --tw-drop-shadow-size: initial;
5851
5960
  --tw-duration: initial;
5852
- --tw-space-y-reverse: 0;
5853
5961
  --tw-tracking: initial;
5854
5962
  --tw-ease: initial;
5855
5963
  --tw-content: "";
@@ -0,0 +1,189 @@
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>
@@ -21,6 +21,11 @@
21
21
  data-kt-select-data-field-value="id"
22
22
  data-kt-select-data-field-text="name"
23
23
  data-kt-select-enable-search="true"
24
+ data-kt-select-search-param="q"
25
+ data-kt-select-search-min-length="2"
26
+ data-kt-select-search-debounce="300"
27
+ data-kt-select-debug="true"
28
+ placeholder="Search users..."
24
29
  ></select>
25
30
 
26
31
  </div>