@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.
- package/dist/ktui.js +418 -144
- package/dist/ktui.min.js +1 -1
- package/dist/ktui.min.js.map +1 -1
- package/dist/styles.css +139 -31
- package/examples/image-input/file-upload-example.html +189 -0
- package/examples/select/remote-data_.html +5 -0
- package/examples/select/test-optimizations.html +227 -0
- package/examples/select/test-remote-search.html +151 -0
- package/examples/sticky/README.md +158 -0
- package/examples/sticky/debug-sticky.html +144 -0
- package/examples/sticky/test-runner.html +175 -0
- package/examples/sticky/test-sticky-logic.js +369 -0
- package/examples/sticky/test-sticky-positioning.html +386 -0
- package/examples/toast/example.html +52 -0
- package/lib/cjs/components/component.js +5 -3
- package/lib/cjs/components/component.js.map +1 -1
- package/lib/cjs/components/datatable/datatable-sort.js +4 -0
- package/lib/cjs/components/datatable/datatable-sort.js.map +1 -1
- package/lib/cjs/components/datatable/datatable.js +9 -3
- package/lib/cjs/components/datatable/datatable.js.map +1 -1
- package/lib/cjs/components/image-input/image-input.js +10 -2
- package/lib/cjs/components/image-input/image-input.js.map +1 -1
- package/lib/cjs/components/select/combobox.js +50 -20
- package/lib/cjs/components/select/combobox.js.map +1 -1
- package/lib/cjs/components/select/dropdown.js +4 -2
- package/lib/cjs/components/select/dropdown.js.map +1 -1
- package/lib/cjs/components/select/index.js.map +1 -1
- package/lib/cjs/components/select/option.js +2 -1
- package/lib/cjs/components/select/option.js.map +1 -1
- package/lib/cjs/components/select/remote.js +50 -50
- package/lib/cjs/components/select/remote.js.map +1 -1
- package/lib/cjs/components/select/search.js +7 -5
- package/lib/cjs/components/select/search.js.map +1 -1
- package/lib/cjs/components/select/select.js +199 -33
- package/lib/cjs/components/select/select.js.map +1 -1
- package/lib/cjs/components/select/tags.js +3 -1
- package/lib/cjs/components/select/tags.js.map +1 -1
- package/lib/cjs/components/select/templates.js.map +1 -1
- package/lib/cjs/components/select/utils.js +23 -10
- package/lib/cjs/components/select/utils.js.map +1 -1
- package/lib/cjs/components/sticky/sticky.js +52 -14
- package/lib/cjs/components/sticky/sticky.js.map +1 -1
- package/lib/esm/components/component.js +5 -3
- package/lib/esm/components/component.js.map +1 -1
- package/lib/esm/components/datatable/datatable-sort.js +4 -0
- package/lib/esm/components/datatable/datatable-sort.js.map +1 -1
- package/lib/esm/components/datatable/datatable.js +9 -3
- package/lib/esm/components/datatable/datatable.js.map +1 -1
- package/lib/esm/components/image-input/image-input.js +10 -2
- package/lib/esm/components/image-input/image-input.js.map +1 -1
- package/lib/esm/components/select/combobox.js +50 -20
- package/lib/esm/components/select/combobox.js.map +1 -1
- package/lib/esm/components/select/dropdown.js +4 -2
- package/lib/esm/components/select/dropdown.js.map +1 -1
- package/lib/esm/components/select/index.js +1 -1
- package/lib/esm/components/select/index.js.map +1 -1
- package/lib/esm/components/select/option.js +2 -1
- package/lib/esm/components/select/option.js.map +1 -1
- package/lib/esm/components/select/remote.js +50 -50
- package/lib/esm/components/select/remote.js.map +1 -1
- package/lib/esm/components/select/search.js +8 -6
- package/lib/esm/components/select/search.js.map +1 -1
- package/lib/esm/components/select/select.js +199 -33
- package/lib/esm/components/select/select.js.map +1 -1
- package/lib/esm/components/select/tags.js +3 -1
- package/lib/esm/components/select/tags.js.map +1 -1
- package/lib/esm/components/select/templates.js.map +1 -1
- package/lib/esm/components/select/utils.js +23 -10
- package/lib/esm/components/select/utils.js.map +1 -1
- package/lib/esm/components/sticky/sticky.js +52 -14
- package/lib/esm/components/sticky/sticky.js.map +1 -1
- package/package.json +1 -1
- package/src/components/component.ts +12 -11
- package/src/components/datatable/datatable-sort.ts +6 -0
- package/src/components/datatable/datatable.ts +90 -81
- package/src/components/image-input/image-input.ts +11 -2
- package/src/components/image-input/types.ts +1 -0
- package/src/components/input/input-group.css +1 -1
- package/src/components/input/input.css +1 -1
- package/src/components/scrollable/scrollable.css +3 -3
- package/src/components/select/combobox.ts +84 -34
- package/src/components/select/dropdown.ts +20 -11
- package/src/components/select/index.ts +6 -1
- package/src/components/select/option.ts +7 -6
- package/src/components/select/remote.ts +51 -52
- package/src/components/select/search.ts +51 -45
- package/src/components/select/select.css +12 -11
- package/src/components/select/select.ts +371 -102
- package/src/components/select/tags.ts +9 -3
- package/src/components/select/templates.ts +1 -4
- package/src/components/select/utils.ts +55 -20
- package/src/components/select/variants.css +0 -1
- package/src/components/sticky/sticky.ts +47 -16
- package/src/components/sticky/types.ts +3 -0
- package/src/components/table/table.css +1 -1
- package/src/components/textarea/textarea.css +1 -1
- package/src/components/toast/toast.css +84 -47
- package/src/components/toast/types.ts +3 -0
package/dist/styles.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.
|
|
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:
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
5520
|
-
transition: top 0.28s cubic-bezier(.4,0
|
|
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><div class="kt-image-input size-16" data-kt-image-input="true">
|
|
72
|
+
<input accept=".png, .jpg, .jpeg" name="avatar" type="file">
|
|
73
|
+
<input name="avatar_remove" type="hidden"/>
|
|
74
|
+
<button class="kt-image-input-remove" data-kt-image-input-remove="true" type="button">
|
|
75
|
+
<i class="ki-filled ki-cross"></i>
|
|
76
|
+
</button>
|
|
77
|
+
<div class="kt-image-input-placeholder" data-kt-image-input-placeholder="true">
|
|
78
|
+
<div class="kt-image-input-preview" data-kt-image-input-preview="true"></div>
|
|
79
|
+
</div>
|
|
80
|
+
</div></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>
|