kedhar-ui 0.2.1 → 0.3.1

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.
@@ -44,6 +44,7 @@
44
44
  --ks-leading-tight: 1.25;
45
45
  --ks-leading-normal: 1.5;
46
46
  --ks-leading-relaxed: 1.625;
47
+ --ks-leading-body: 1.7;
47
48
 
48
49
  --ks-weight-normal: 400;
49
50
  --ks-weight-medium: 500;
@@ -110,7 +111,7 @@ body {
110
111
  padding: 0;
111
112
  font-family: var(--ks-font-sans);
112
113
  font-size: var(--ks-text-base);
113
- line-height: var(--ks-leading-normal);
114
+ line-height: var(--ks-leading-body);
114
115
  color: var(--ks-color-text);
115
116
  background-color: var(--ks-color-bg);
116
117
  -webkit-font-smoothing: antialiased;
@@ -131,6 +132,20 @@ a:hover {
131
132
  color: var(--ks-color-primary-hover);
132
133
  }
133
134
 
135
+ /* Underline animation for inline links */
136
+ .ks-link-underline {
137
+ background-image: linear-gradient(var(--ks-color-primary), var(--ks-color-primary));
138
+ background-size: 0% 2px;
139
+ background-repeat: no-repeat;
140
+ background-position: left bottom;
141
+ transition: background-size var(--ks-duration-normal) var(--ks-ease-out);
142
+ padding-bottom: 2px;
143
+ }
144
+
145
+ .ks-link-underline:hover {
146
+ background-size: 100% 2px;
147
+ }
148
+
134
149
  /* ─── Images ───────────────────────────────────────────────── */
135
150
  img {
136
151
  max-width: 100%;
@@ -333,9 +348,11 @@ pre {
333
348
  transition: transform var(--ks-duration-normal) var(--ks-ease-spring);
334
349
  }
335
350
 
336
- .dark .ks-toggle-knob svg {
337
- transform: rotate(90deg);
338
- }
351
+ /* Sun icon visible in light mode, hidden in dark mode */
352
+ .ks-toggle-knob .ks-icon-sun { display: inline; }
353
+ .ks-toggle-knob .ks-icon-moon { display: none; }
354
+ .dark .ks-toggle-knob .ks-icon-sun { display: none; }
355
+ .dark .ks-toggle-knob .ks-icon-moon { display: inline; }
339
356
 
340
357
  /* Track background halves */
341
358
  .ks-toggle-track {
@@ -354,6 +371,14 @@ pre {
354
371
  transition: color var(--ks-duration-fast) var(--ks-ease-out);
355
372
  }
356
373
 
374
+ .ks-toggle-track span svg {
375
+ stroke: currentColor;
376
+ stroke-width: 2;
377
+ stroke-linecap: round;
378
+ stroke-linejoin: round;
379
+ fill: none;
380
+ }
381
+
357
382
  .dark .ks-toggle-track span:first-child {
358
383
  color: transparent;
359
384
  }
@@ -381,6 +406,7 @@ pre {
381
406
  border: 1px solid var(--ks-color-border);
382
407
  border-radius: var(--ks-radius-lg);
383
408
  padding: var(--ks-space-6);
409
+ box-shadow: var(--ks-shadow-sm);
384
410
  transition:
385
411
  box-shadow var(--ks-duration-normal) var(--ks-ease-out),
386
412
  border-color var(--ks-duration-normal) var(--ks-ease-out),
@@ -389,8 +415,8 @@ pre {
389
415
 
390
416
  .ks-card-hover:hover {
391
417
  border-color: var(--ks-color-primary-alpha);
392
- box-shadow: var(--ks-shadow-md);
393
- transform: translateY(-2px);
418
+ box-shadow: var(--ks-shadow-lg);
419
+ transform: translateY(-3px);
394
420
  }
395
421
 
396
422
 
@@ -733,3 +759,201 @@ pre {
733
759
  white-space: nowrap;
734
760
  border: 0;
735
761
  }
762
+
763
+
764
+ /* ══════════════════════════════════════════════════════════════
765
+ 11. Reveal Animations
766
+ ══════════════════════════════════════════════════════════════
767
+ Scroll-triggered reveal via IntersectionObserver + .visible class.
768
+ ══════════════════════════════════════════════════════════════ */
769
+ .ks-reveal {
770
+ opacity: 0;
771
+ transform: translateY(24px);
772
+ transition:
773
+ opacity var(--ks-duration-slow) var(--ks-ease-out),
774
+ transform var(--ks-duration-slow) var(--ks-ease-out);
775
+ }
776
+
777
+ .ks-reveal-up {
778
+ opacity: 0;
779
+ transform: translateY(40px);
780
+ transition:
781
+ opacity var(--ks-duration-slow) var(--ks-ease-out),
782
+ transform var(--ks-duration-slow) var(--ks-ease-out);
783
+ }
784
+
785
+ .ks-reveal.visible,
786
+ .ks-reveal-up.visible {
787
+ opacity: 1;
788
+ transform: translateY(0);
789
+ }
790
+
791
+ /* Stagger children */
792
+ .ks-stagger > * {
793
+ opacity: 0;
794
+ transform: translateY(20px);
795
+ transition:
796
+ opacity var(--ks-duration-slow) var(--ks-ease-out),
797
+ transform var(--ks-duration-slow) var(--ks-ease-out);
798
+ }
799
+
800
+ .ks-stagger.visible > *:nth-child(1) { transition-delay: 0ms; }
801
+ .ks-stagger.visible > *:nth-child(2) { transition-delay: 80ms; }
802
+ .ks-stagger.visible > *:nth-child(3) { transition-delay: 160ms; }
803
+ .ks-stagger.visible > *:nth-child(4) { transition-delay: 240ms; }
804
+ .ks-stagger.visible > *:nth-child(5) { transition-delay: 320ms; }
805
+ .ks-stagger.visible > *:nth-child(6) { transition-delay: 400ms; }
806
+ .ks-stagger.visible > *:nth-child(7) { transition-delay: 480ms; }
807
+ .ks-stagger.visible > *:nth-child(8) { transition-delay: 560ms; }
808
+ .ks-stagger.visible > *:nth-child(9) { transition-delay: 640ms; }
809
+ .ks-stagger.visible > *:nth-child(10) { transition-delay: 720ms; }
810
+
811
+ .ks-stagger.visible > * {
812
+ opacity: 1;
813
+ transform: translateY(0);
814
+ }
815
+
816
+
817
+ /* ══════════════════════════════════════════════════════════════
818
+ 12. Hero Section
819
+ ══════════════════════════════════════════════════════════════ */
820
+ .ks-hero {
821
+ min-height: 70vh;
822
+ display: flex;
823
+ align-items: center;
824
+ justify-content: center;
825
+ text-align: center;
826
+ padding: var(--ks-space-16) var(--ks-space-4);
827
+ position: relative;
828
+ overflow: hidden;
829
+ }
830
+
831
+ .ks-hero-gradient {
832
+ position: absolute;
833
+ inset: 0;
834
+ pointer-events: none;
835
+ z-index: 0;
836
+ }
837
+
838
+ .ks-hero-gradient::before {
839
+ content: '';
840
+ position: absolute;
841
+ top: -50%;
842
+ left: -50%;
843
+ width: 200%;
844
+ height: 200%;
845
+ background: radial-gradient(ellipse at 30% 50%, var(--ks-color-primary-alpha) 0%, transparent 60%),
846
+ radial-gradient(ellipse at 70% 50%, var(--ks-color-primary-light) 0%, transparent 50%);
847
+ opacity: 0.6;
848
+ }
849
+
850
+ .dark .ks-hero-gradient::before {
851
+ opacity: 0.3;
852
+ }
853
+
854
+ .ks-hero-content {
855
+ position: relative;
856
+ z-index: 1;
857
+ max-width: 720px;
858
+ }
859
+
860
+ .ks-hero-badge {
861
+ display: inline-flex;
862
+ align-items: center;
863
+ gap: var(--ks-space-1);
864
+ padding: var(--ks-space-1) var(--ks-space-3);
865
+ border-radius: var(--ks-radius-full);
866
+ font-size: var(--ks-text-sm);
867
+ font-weight: var(--ks-weight-medium);
868
+ color: var(--ks-color-primary);
869
+ background: var(--ks-color-primary-alpha);
870
+ margin-bottom: var(--ks-space-4);
871
+ }
872
+
873
+ .ks-hero h1 {
874
+ font-size: clamp(2rem, 5vw, 3.5rem);
875
+ font-weight: var(--ks-weight-bold);
876
+ letter-spacing: -0.03em;
877
+ line-height: 1.1;
878
+ color: var(--ks-color-text);
879
+ margin: 0 0 var(--ks-space-4);
880
+ }
881
+
882
+ .ks-hero p {
883
+ font-size: clamp(1rem, 2vw, 1.2rem);
884
+ color: var(--ks-color-text-muted);
885
+ line-height: var(--ks-leading-relaxed);
886
+ max-width: 560px;
887
+ margin: 0 auto var(--ks-space-8);
888
+ }
889
+
890
+ .ks-hero-actions {
891
+ display: flex;
892
+ gap: var(--ks-space-3);
893
+ justify-content: center;
894
+ flex-wrap: wrap;
895
+ }
896
+
897
+
898
+ /* ══════════════════════════════════════════════════════════════
899
+ 13. Section Header
900
+ ══════════════════════════════════════════════════════════════ */
901
+ .ks-section-header {
902
+ text-align: center;
903
+ margin-bottom: var(--ks-space-10);
904
+ }
905
+
906
+ .ks-section-header h2 {
907
+ font-size: var(--ks-text-3xl);
908
+ font-weight: var(--ks-weight-bold);
909
+ color: var(--ks-color-text);
910
+ letter-spacing: -0.02em;
911
+ margin: 0 0 var(--ks-space-2);
912
+ }
913
+
914
+ @media (min-width: 640px) {
915
+ .ks-section-header h2 {
916
+ font-size: var(--ks-text-4xl);
917
+ }
918
+ }
919
+
920
+ .ks-section-header p {
921
+ color: var(--ks-color-text-muted);
922
+ max-width: 480px;
923
+ margin: 0 auto;
924
+ }
925
+
926
+ .ks-section-divider {
927
+ width: 48px;
928
+ height: 3px;
929
+ border-radius: var(--ks-radius-full);
930
+ background: var(--ks-color-primary);
931
+ margin: var(--ks-space-3) auto 0;
932
+ }
933
+
934
+
935
+ /* ══════════════════════════════════════════════════════════════
936
+ 14. Button Active State
937
+ ══════════════════════════════════════════════════════════════ */
938
+ .ks-btn:active {
939
+ transform: scale(0.97);
940
+ }
941
+
942
+
943
+ /* ══════════════════════════════════════════════════════════════
944
+ 15. Nav Link Active Indicator
945
+ ══════════════════════════════════════════════════════════════ */
946
+ .ks-nav-links a.active,
947
+ .ks-nav-links a[aria-current="page"] {
948
+ color: var(--ks-color-text);
949
+ }
950
+
951
+ .ks-nav-links a.active::after,
952
+ .ks-nav-links a[aria-current="page"]::after {
953
+ content: '';
954
+ display: block;
955
+ height: 2px;
956
+ border-radius: var(--ks-radius-full);
957
+ background: var(--ks-color-primary);
958
+ margin-top: 2px;
959
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kedhar-ui",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "Shared design system for Kedhar's projects — CSS tokens, components, and themes.",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -36,7 +36,7 @@ import '../styles/components.css';
36
36
  </span>
37
37
  </div>
38
38
  <div class="ks-toggle-knob" aria-hidden="true">
39
- <svg viewBox="0 0 24 24" fill="none">
39
+ <svg class="ks-icon-sun" viewBox="0 0 24 24" fill="none">
40
40
  <circle cx="12" cy="12" r="5" />
41
41
  <line x1="12" y1="1" x2="12" y2="3" />
42
42
  <line x1="12" y1="21" x2="12" y2="23" />
@@ -47,6 +47,9 @@ import '../styles/components.css';
47
47
  <line x1="4.22" y1="19.78" x2="5.64" y2="18.36" />
48
48
  <line x1="18.36" y1="5.64" x2="19.78" y2="4.22" />
49
49
  </svg>
50
+ <svg class="ks-icon-moon" viewBox="0 0 24 24" fill="none" style="display:none">
51
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" />
52
+ </svg>
50
53
  </div>
51
54
  </div>
52
55
 
@@ -22,7 +22,7 @@ body {
22
22
  padding: 0;
23
23
  font-family: var(--ks-font-sans);
24
24
  font-size: var(--ks-text-base);
25
- line-height: var(--ks-leading-normal);
25
+ line-height: var(--ks-leading-body);
26
26
  color: var(--ks-color-text);
27
27
  background-color: var(--ks-color-bg);
28
28
  -webkit-font-smoothing: antialiased;
@@ -43,6 +43,20 @@ a:hover {
43
43
  color: var(--ks-color-primary-hover);
44
44
  }
45
45
 
46
+ /* Underline animation for inline links */
47
+ .ks-link-underline {
48
+ background-image: linear-gradient(var(--ks-color-primary), var(--ks-color-primary));
49
+ background-size: 0% 2px;
50
+ background-repeat: no-repeat;
51
+ background-position: left bottom;
52
+ transition: background-size var(--ks-duration-normal) var(--ks-ease-out);
53
+ padding-bottom: 2px;
54
+ }
55
+
56
+ .ks-link-underline:hover {
57
+ background-size: 100% 2px;
58
+ }
59
+
46
60
  /* ─── Images ───────────────────────────────────────────────── */
47
61
  img {
48
62
  max-width: 100%;
@@ -167,9 +167,11 @@
167
167
  transition: transform var(--ks-duration-normal) var(--ks-ease-spring);
168
168
  }
169
169
 
170
- .dark .ks-toggle-knob svg {
171
- transform: rotate(90deg);
172
- }
170
+ /* Sun icon visible in light mode, hidden in dark mode */
171
+ .ks-toggle-knob .ks-icon-sun { display: inline; }
172
+ .ks-toggle-knob .ks-icon-moon { display: none; }
173
+ .dark .ks-toggle-knob .ks-icon-sun { display: none; }
174
+ .dark .ks-toggle-knob .ks-icon-moon { display: inline; }
173
175
 
174
176
  /* Track background halves */
175
177
  .ks-toggle-track {
@@ -188,6 +190,14 @@
188
190
  transition: color var(--ks-duration-fast) var(--ks-ease-out);
189
191
  }
190
192
 
193
+ .ks-toggle-track span svg {
194
+ stroke: currentColor;
195
+ stroke-width: 2;
196
+ stroke-linecap: round;
197
+ stroke-linejoin: round;
198
+ fill: none;
199
+ }
200
+
191
201
  .dark .ks-toggle-track span:first-child {
192
202
  color: transparent;
193
203
  }
@@ -215,6 +225,7 @@
215
225
  border: 1px solid var(--ks-color-border);
216
226
  border-radius: var(--ks-radius-lg);
217
227
  padding: var(--ks-space-6);
228
+ box-shadow: var(--ks-shadow-sm);
218
229
  transition:
219
230
  box-shadow var(--ks-duration-normal) var(--ks-ease-out),
220
231
  border-color var(--ks-duration-normal) var(--ks-ease-out),
@@ -223,8 +234,8 @@
223
234
 
224
235
  .ks-card-hover:hover {
225
236
  border-color: var(--ks-color-primary-alpha);
226
- box-shadow: var(--ks-shadow-md);
227
- transform: translateY(-2px);
237
+ box-shadow: var(--ks-shadow-lg);
238
+ transform: translateY(-3px);
228
239
  }
229
240
 
230
241
 
@@ -567,3 +578,201 @@
567
578
  white-space: nowrap;
568
579
  border: 0;
569
580
  }
581
+
582
+
583
+ /* ══════════════════════════════════════════════════════════════
584
+ 11. Reveal Animations
585
+ ══════════════════════════════════════════════════════════════
586
+ Scroll-triggered reveal via IntersectionObserver + .visible class.
587
+ ══════════════════════════════════════════════════════════════ */
588
+ .ks-reveal {
589
+ opacity: 0;
590
+ transform: translateY(24px);
591
+ transition:
592
+ opacity var(--ks-duration-slow) var(--ks-ease-out),
593
+ transform var(--ks-duration-slow) var(--ks-ease-out);
594
+ }
595
+
596
+ .ks-reveal-up {
597
+ opacity: 0;
598
+ transform: translateY(40px);
599
+ transition:
600
+ opacity var(--ks-duration-slow) var(--ks-ease-out),
601
+ transform var(--ks-duration-slow) var(--ks-ease-out);
602
+ }
603
+
604
+ .ks-reveal.visible,
605
+ .ks-reveal-up.visible {
606
+ opacity: 1;
607
+ transform: translateY(0);
608
+ }
609
+
610
+ /* Stagger children */
611
+ .ks-stagger > * {
612
+ opacity: 0;
613
+ transform: translateY(20px);
614
+ transition:
615
+ opacity var(--ks-duration-slow) var(--ks-ease-out),
616
+ transform var(--ks-duration-slow) var(--ks-ease-out);
617
+ }
618
+
619
+ .ks-stagger.visible > *:nth-child(1) { transition-delay: 0ms; }
620
+ .ks-stagger.visible > *:nth-child(2) { transition-delay: 80ms; }
621
+ .ks-stagger.visible > *:nth-child(3) { transition-delay: 160ms; }
622
+ .ks-stagger.visible > *:nth-child(4) { transition-delay: 240ms; }
623
+ .ks-stagger.visible > *:nth-child(5) { transition-delay: 320ms; }
624
+ .ks-stagger.visible > *:nth-child(6) { transition-delay: 400ms; }
625
+ .ks-stagger.visible > *:nth-child(7) { transition-delay: 480ms; }
626
+ .ks-stagger.visible > *:nth-child(8) { transition-delay: 560ms; }
627
+ .ks-stagger.visible > *:nth-child(9) { transition-delay: 640ms; }
628
+ .ks-stagger.visible > *:nth-child(10) { transition-delay: 720ms; }
629
+
630
+ .ks-stagger.visible > * {
631
+ opacity: 1;
632
+ transform: translateY(0);
633
+ }
634
+
635
+
636
+ /* ══════════════════════════════════════════════════════════════
637
+ 12. Hero Section
638
+ ══════════════════════════════════════════════════════════════ */
639
+ .ks-hero {
640
+ min-height: 70vh;
641
+ display: flex;
642
+ align-items: center;
643
+ justify-content: center;
644
+ text-align: center;
645
+ padding: var(--ks-space-16) var(--ks-space-4);
646
+ position: relative;
647
+ overflow: hidden;
648
+ }
649
+
650
+ .ks-hero-gradient {
651
+ position: absolute;
652
+ inset: 0;
653
+ pointer-events: none;
654
+ z-index: 0;
655
+ }
656
+
657
+ .ks-hero-gradient::before {
658
+ content: '';
659
+ position: absolute;
660
+ top: -50%;
661
+ left: -50%;
662
+ width: 200%;
663
+ height: 200%;
664
+ background: radial-gradient(ellipse at 30% 50%, var(--ks-color-primary-alpha) 0%, transparent 60%),
665
+ radial-gradient(ellipse at 70% 50%, var(--ks-color-primary-light) 0%, transparent 50%);
666
+ opacity: 0.6;
667
+ }
668
+
669
+ .dark .ks-hero-gradient::before {
670
+ opacity: 0.3;
671
+ }
672
+
673
+ .ks-hero-content {
674
+ position: relative;
675
+ z-index: 1;
676
+ max-width: 720px;
677
+ }
678
+
679
+ .ks-hero-badge {
680
+ display: inline-flex;
681
+ align-items: center;
682
+ gap: var(--ks-space-1);
683
+ padding: var(--ks-space-1) var(--ks-space-3);
684
+ border-radius: var(--ks-radius-full);
685
+ font-size: var(--ks-text-sm);
686
+ font-weight: var(--ks-weight-medium);
687
+ color: var(--ks-color-primary);
688
+ background: var(--ks-color-primary-alpha);
689
+ margin-bottom: var(--ks-space-4);
690
+ }
691
+
692
+ .ks-hero h1 {
693
+ font-size: clamp(2rem, 5vw, 3.5rem);
694
+ font-weight: var(--ks-weight-bold);
695
+ letter-spacing: -0.03em;
696
+ line-height: 1.1;
697
+ color: var(--ks-color-text);
698
+ margin: 0 0 var(--ks-space-4);
699
+ }
700
+
701
+ .ks-hero p {
702
+ font-size: clamp(1rem, 2vw, 1.2rem);
703
+ color: var(--ks-color-text-muted);
704
+ line-height: var(--ks-leading-relaxed);
705
+ max-width: 560px;
706
+ margin: 0 auto var(--ks-space-8);
707
+ }
708
+
709
+ .ks-hero-actions {
710
+ display: flex;
711
+ gap: var(--ks-space-3);
712
+ justify-content: center;
713
+ flex-wrap: wrap;
714
+ }
715
+
716
+
717
+ /* ══════════════════════════════════════════════════════════════
718
+ 13. Section Header
719
+ ══════════════════════════════════════════════════════════════ */
720
+ .ks-section-header {
721
+ text-align: center;
722
+ margin-bottom: var(--ks-space-10);
723
+ }
724
+
725
+ .ks-section-header h2 {
726
+ font-size: var(--ks-text-3xl);
727
+ font-weight: var(--ks-weight-bold);
728
+ color: var(--ks-color-text);
729
+ letter-spacing: -0.02em;
730
+ margin: 0 0 var(--ks-space-2);
731
+ }
732
+
733
+ @media (min-width: 640px) {
734
+ .ks-section-header h2 {
735
+ font-size: var(--ks-text-4xl);
736
+ }
737
+ }
738
+
739
+ .ks-section-header p {
740
+ color: var(--ks-color-text-muted);
741
+ max-width: 480px;
742
+ margin: 0 auto;
743
+ }
744
+
745
+ .ks-section-divider {
746
+ width: 48px;
747
+ height: 3px;
748
+ border-radius: var(--ks-radius-full);
749
+ background: var(--ks-color-primary);
750
+ margin: var(--ks-space-3) auto 0;
751
+ }
752
+
753
+
754
+ /* ══════════════════════════════════════════════════════════════
755
+ 14. Button Active State
756
+ ══════════════════════════════════════════════════════════════ */
757
+ .ks-btn:active {
758
+ transform: scale(0.97);
759
+ }
760
+
761
+
762
+ /* ══════════════════════════════════════════════════════════════
763
+ 15. Nav Link Active Indicator
764
+ ══════════════════════════════════════════════════════════════ */
765
+ .ks-nav-links a.active,
766
+ .ks-nav-links a[aria-current="page"] {
767
+ color: var(--ks-color-text);
768
+ }
769
+
770
+ .ks-nav-links a.active::after,
771
+ .ks-nav-links a[aria-current="page"]::after {
772
+ content: '';
773
+ display: block;
774
+ height: 2px;
775
+ border-radius: var(--ks-radius-full);
776
+ background: var(--ks-color-primary);
777
+ margin-top: 2px;
778
+ }
@@ -42,6 +42,7 @@
42
42
  --ks-leading-tight: 1.25;
43
43
  --ks-leading-normal: 1.5;
44
44
  --ks-leading-relaxed: 1.625;
45
+ --ks-leading-body: 1.7;
45
46
 
46
47
  --ks-weight-normal: 400;
47
48
  --ks-weight-medium: 500;