funuicss 3.8.17 → 3.9.0

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/css/fun.css CHANGED
@@ -2147,12 +2147,14 @@ z-index: 9999 !important;
2147
2147
 
2148
2148
  /* Dropdown Item */
2149
2149
  .dropdown-item {
2150
- padding: 0.6rem 0.8rem;
2150
+ padding: 0.4rem 0.8rem;
2151
2151
  cursor: pointer;
2152
2152
  display: flex;
2153
2153
  align-items: center;
2154
+ border-bottom: var(--border);
2154
2155
  gap: 0.5rem;
2155
2156
  flex-wrap: nowrap;
2157
+ font-size: var(--smallFont);
2156
2158
  transition: background-color 0.15s ease;
2157
2159
  }
2158
2160
 
@@ -11806,12 +11808,15 @@ z-index: 10;
11806
11808
  .fade-in-down { animation: fadeInDown 0.8s ease-out !important; }
11807
11809
  .fade-in-left { animation: fadeInLeft 0.8s ease-out !important; }
11808
11810
  .fade-in-right { animation: fadeInRight 0.8s ease-out !important; }
11811
+ .fade-in-scale { animation: fadeInScale 0.8s ease-out !important; }
11812
+ .fade-in-blur { animation: fadeInBlur 0.8s ease-out !important; }
11809
11813
 
11810
11814
  /* Slide In */
11811
11815
  .slide-in-up { animation: slideInUp 0.8s ease-out !important; }
11812
11816
  .slide-in-down { animation: slideInDown 0.8s ease-out !important; }
11813
11817
  .slide-in-left { animation: slideInLeft 0.8s ease-out !important; }
11814
11818
  .slide-in-right { animation: slideInRight 0.8s ease-out !important; }
11819
+ .slide-in-diagonal { animation: slideInDiagonal 0.8s ease-out !important; }
11815
11820
 
11816
11821
  /* Zoom In */
11817
11822
  .zoom-in { animation: zoomIn 0.6s ease-out !important; }
@@ -11819,6 +11824,7 @@ z-index: 10;
11819
11824
  .zoom-in-down { animation: zoomInDown 0.8s ease-out !important; }
11820
11825
  .zoom-in-left { animation: zoomInLeft 0.8s ease-out !important; }
11821
11826
  .zoom-in-right { animation: zoomInRight 0.8s ease-out !important; }
11827
+ .zoom-in-rotate { animation: zoomInRotate 0.8s ease-out !important; }
11822
11828
 
11823
11829
  /* Bounce In */
11824
11830
  .bounce-in { animation: bounceIn 0.8s ease-out !important; }
@@ -11830,11 +11836,13 @@ z-index: 10;
11830
11836
  /* Flip In */
11831
11837
  .flip-in-x { animation: flipInX 0.8s ease-out !important; }
11832
11838
  .flip-in-y { animation: flipInY 0.8s ease-out !important; }
11839
+ .flip-in-diagonal { animation: flipInDiagonal 0.8s ease-out !important; }
11833
11840
 
11834
11841
  /* Rotate In */
11835
11842
  .rotate-in { animation: rotateIn 0.8s ease-out !important; }
11836
11843
  .rotate-in-up { animation: rotateInUp 0.8s ease-out !important; }
11837
11844
  .rotate-in-down { animation: rotateInDown 0.8s ease-out !important; }
11845
+ .rotate-in-scale { animation: rotateInScale 0.8s ease-out !important; }
11838
11846
 
11839
11847
  /* Special Entrance */
11840
11848
  .roll-in { animation: rollIn 0.8s ease-out !important; }
@@ -11842,42 +11850,99 @@ z-index: 10;
11842
11850
  .swing-in { animation: swingIn 0.8s ease-out !important; }
11843
11851
  .wobble-in { animation: wobbleIn 0.8s ease-out !important; }
11844
11852
  .pulse-in { animation: pulseIn 0.8s ease-out !important; }
11853
+ .unfold-in { animation: unfoldIn 0.8s ease-out !important; }
11854
+ .spiral-in { animation: spiralIn 0.8s ease-out !important; }
11845
11855
 
11846
11856
  /* ===== HOVER ANIMATIONS ===== */
11847
11857
  /* Scale Hover */
11848
- .hover-scale { transition: transform 0.3s ease !important; }
11858
+ .hover-scale { transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11849
11859
  .hover-scale:hover { transform: scale(1.05) !important; }
11850
- .hover-scale-lg { transition: transform 0.3s ease !important; }
11860
+ .hover-scale-lg { transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11851
11861
  .hover-scale-lg:hover { transform: scale(1.1) !important; }
11852
- .hover-scale-sm { transition: transform 0.3s ease !important; }
11862
+ .hover-scale-sm { transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11853
11863
  .hover-scale-sm:hover { transform: scale(1.02) !important; }
11854
11864
 
11865
+ /* Scale & Rotate Combined */
11866
+ .hover-scale-rotate { transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11867
+ .hover-scale-rotate:hover { transform: scale(1.05) rotate(3deg) !important; }
11868
+ .hover-scale-rotate-rev { transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11869
+ .hover-scale-rotate-rev:hover { transform: scale(1.05) rotate(-3deg) !important; }
11870
+
11855
11871
  /* Lift Hover */
11856
- .hover-lift { transition: all 0.3s ease !important; }
11857
- .hover-lift:hover { transform: translateY(-0.5rem) !important; box-shadow: var(--card) !important; }
11858
- .hover-lift-lg { transition: all 0.3s ease !important; }
11859
- .hover-lift-lg:hover { transform: translateY(-1rem) !important; box-shadow: var(--card) !important; }
11872
+ .hover-lift { transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11873
+ .hover-lift:hover { transform: translateY(-0.5rem) !important; box-shadow: 0 0.5rem 2rem rgba(0, 0, 0, 0.15) !important; }
11874
+ .hover-lift-lg { transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11875
+ .hover-lift-lg:hover { transform: translateY(-1rem) !important; box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.2) !important; }
11876
+
11877
+ /* Lift & Rotate Combined */
11878
+ .hover-lift-rotate { transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11879
+ .hover-lift-rotate:hover { transform: translateY(-0.5rem) rotate(2deg) !important; box-shadow: 0 0.5rem 2rem rgba(0, 0, 0, 0.15) !important; }
11880
+
11881
+ /* Tilt Hover */
11882
+ .hover-tilt-left { transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11883
+ .hover-tilt-left:hover { transform: perspective(1000px) rotateY(-10deg) !important; }
11884
+ .hover-tilt-right { transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11885
+ .hover-tilt-right:hover { transform: perspective(1000px) rotateY(10deg) !important; }
11886
+ .hover-tilt-up { transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11887
+ .hover-tilt-up:hover { transform: perspective(1000px) rotateX(10deg) !important; }
11888
+
11889
+ /* Skew Hover */
11890
+ .hover-skew { transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
11891
+ .hover-skew:hover { transform: skewX(-5deg) scale(1.02) !important; }
11860
11892
 
11861
11893
  /* Glow Hover */
11862
11894
  .hover-glow { transition: all 0.3s ease !important; }
11863
- .hover-glow:hover { box-shadow: 0 0 2rem rgba(var(--primary-rgb), 0.4) !important; transform: translateY(-0.25rem) !important; }
11895
+ .hover-glow:hover { box-shadow: 0 0 2rem rgba(59, 130, 246, 0.5) !important; transform: translateY(-0.25rem) !important; }
11896
+ .hover-glow-intense { transition: all 0.3s ease !important; }
11897
+ .hover-glow-intense:hover { box-shadow: 0 0 3rem rgba(59, 130, 246, 0.8), 0 0 1rem rgba(59, 130, 246, 0.4) inset !important; transform: scale(1.05) !important; }
11898
+
11899
+ /* Bounce & Scale */
11900
+ .hover-bounce-scale:hover { animation: bounceScale 0.6s ease !important; }
11864
11901
 
11865
- /* Shake Hover */
11902
+ /* Shake & Wobble */
11866
11903
  .hover-shake:hover { animation: shake 0.5s ease-in-out !important; }
11867
11904
  .hover-wobble:hover { animation: wobble 0.5s ease-in-out !important; }
11868
11905
  .hover-bounce:hover { animation: bounce 0.5s ease-in-out !important; }
11906
+ .hover-jello:hover { animation: jello 0.6s ease-in-out !important; }
11907
+ .hover-rubber:hover { animation: rubberBand 0.6s ease-in-out !important; }
11869
11908
 
11870
11909
  /* Border Hover */
11871
11910
  .hover-border-grow { transition: all 0.3s ease !important; border: 2px solid transparent !important; }
11872
- .hover-border-grow:hover { border-color: var(--gradient) !important; transform: scale(1.02) !important; }
11911
+ .hover-border-grow:hover { border-color: rgb(59, 130, 246) !important; transform: scale(1.02) !important; }
11912
+ .hover-border-glow { transition: all 0.3s ease !important; }
11913
+ .hover-border-glow:hover { box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3) !important; }
11914
+
11915
+ /* Shadow Hover */
11916
+ .hover-shadow-soft { transition: box-shadow 0.3s ease !important; }
11917
+ .hover-shadow-soft:hover { box-shadow: 0 0.5rem 1.5rem rgba(0, 0, 0, 0.1) !important; }
11918
+ .hover-shadow-hard { transition: box-shadow 0.3s ease !important; }
11919
+ .hover-shadow-hard:hover { box-shadow: 0.5rem 0.5rem 0 rgba(0, 0, 0, 0.2) !important; }
11920
+ .hover-shadow-neon { transition: all 0.3s ease !important; }
11921
+ .hover-shadow-neon:hover { box-shadow: 0 0 1rem rgba(59, 130, 246, 0.6), 0 0 2rem rgba(59, 130, 246, 0.4) !important; }
11873
11922
 
11874
11923
  /* Text Hover */
11875
- .hover-text-glow:hover { text-shadow: 0 0 1rem currentColor !important; }
11876
- .hover-text-lift:hover { transform: translateY(-0.125rem) !important; text-shadow: var(--card) !important; }
11924
+ .hover-text-glow:hover { text-shadow: 0 0 1rem currentColor !important; transition: text-shadow 0.3s ease !important; }
11925
+ .hover-text-lift { transition: all 0.3s ease !important; }
11926
+ .hover-text-lift:hover { transform: translateY(-0.125rem) !important; text-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.2) !important; }
11927
+ .hover-text-scale { transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) !important; display: inline-block !important; }
11928
+ .hover-text-scale:hover { transform: scale(1.1) !important; }
11929
+
11930
+ /* Flip Hover */
11931
+ .hover-flip-x { transition: transform 0.6s ease !important; transform-style: preserve-3d !important; }
11932
+ .hover-flip-x:hover { transform: rotateX(360deg) !important; }
11933
+ .hover-flip-y { transition: transform 0.6s ease !important; transform-style: preserve-3d !important; }
11934
+ .hover-flip-y:hover { transform: rotateY(360deg) !important; }
11935
+
11936
+ /* Swing Hover */
11937
+ .hover-swing:hover { animation: swing 0.8s ease !important; transform-origin: top center !important; }
11938
+
11939
+ /* Pulse Hover */
11940
+ .hover-pulse:hover { animation: pulseHover 0.6s ease !important; }
11941
+ .hover-heartbeat:hover { animation: heartbeat 0.8s ease-in-out !important; }
11877
11942
 
11878
11943
  /* ===== CONTINUOUS ANIMATIONS ===== */
11879
11944
  .animate-float { animation: float 3s ease-in-out infinite !important; }
11880
- .animate-pulse-slow { animation: pulse 3s ease-in-out infinite !important; }
11945
+ .animate-float-slow { animation: float 5s ease-in-out infinite !important; }
11881
11946
  .animate-bounce-slow { animation: bounce 2s ease-in-out infinite !important; }
11882
11947
  .animate-spin-slow { animation: spin 3s linear infinite !important; }
11883
11948
  .animate-ping-slow { animation: ping 3s ease-out infinite !important; }
@@ -11885,8 +11950,14 @@ z-index: 10;
11885
11950
  .animate-breath { animation: breath 4s ease-in-out infinite !important; }
11886
11951
  .animate-wave { animation: wave 2s ease-in-out infinite !important; }
11887
11952
  .animate-glow { animation: glow 2s ease-in-out infinite !important; }
11953
+ .animate-pulse-glow { animation: pulseGlow 2s ease-in-out infinite !important; }
11954
+ .animate-drift { animation: drift 6s ease-in-out infinite !important; }
11955
+ .animate-sway { animation: sway 3s ease-in-out infinite !important; }
11956
+ .animate-rotate-slow { animation: rotateSlow 20s linear infinite !important; }
11957
+ .animate-bob { animation: bob 2s ease-in-out infinite !important; }
11888
11958
 
11889
11959
  /* ===== ANIMATION KEYFRAMES ===== */
11960
+ /* Fade Animations */
11890
11961
  @keyframes fadeIn {
11891
11962
  from { opacity: 0; }
11892
11963
  to { opacity: 1; }
@@ -11912,6 +11983,17 @@ z-index: 10;
11912
11983
  to { opacity: 1; transform: translateX(0); }
11913
11984
  }
11914
11985
 
11986
+ @keyframes fadeInScale {
11987
+ from { opacity: 0; transform: scale(0.8); }
11988
+ to { opacity: 1; transform: scale(1); }
11989
+ }
11990
+
11991
+ @keyframes fadeInBlur {
11992
+ from { opacity: 0; filter: blur(10px); }
11993
+ to { opacity: 1; filter: blur(0); }
11994
+ }
11995
+
11996
+ /* Slide Animations */
11915
11997
  @keyframes slideInUp {
11916
11998
  from { transform: translateY(100%); }
11917
11999
  to { transform: translateY(0); }
@@ -11932,6 +12014,12 @@ z-index: 10;
11932
12014
  to { transform: translateX(0); }
11933
12015
  }
11934
12016
 
12017
+ @keyframes slideInDiagonal {
12018
+ from { transform: translate(-100%, -100%); opacity: 0; }
12019
+ to { transform: translate(0, 0); opacity: 1; }
12020
+ }
12021
+
12022
+ /* Zoom Animations */
11935
12023
  @keyframes zoomIn {
11936
12024
  from { opacity: 0; transform: scale(0.5); }
11937
12025
  to { opacity: 1; transform: scale(1); }
@@ -11942,6 +12030,27 @@ z-index: 10;
11942
12030
  to { opacity: 1; transform: scale(1) translateY(0); }
11943
12031
  }
11944
12032
 
12033
+ @keyframes zoomInDown {
12034
+ from { opacity: 0; transform: scale(0.5) translateY(-2rem); }
12035
+ to { opacity: 1; transform: scale(1) translateY(0); }
12036
+ }
12037
+
12038
+ @keyframes zoomInLeft {
12039
+ from { opacity: 0; transform: scale(0.5) translateX(-2rem); }
12040
+ to { opacity: 1; transform: scale(1) translateX(0); }
12041
+ }
12042
+
12043
+ @keyframes zoomInRight {
12044
+ from { opacity: 0; transform: scale(0.5) translateX(2rem); }
12045
+ to { opacity: 1; transform: scale(1) translateX(0); }
12046
+ }
12047
+
12048
+ @keyframes zoomInRotate {
12049
+ from { opacity: 0; transform: scale(0.5) rotate(-45deg); }
12050
+ to { opacity: 1; transform: scale(1) rotate(0); }
12051
+ }
12052
+
12053
+ /* Bounce Animations */
11945
12054
  @keyframes bounceIn {
11946
12055
  0% { opacity: 0; transform: scale(0.3); }
11947
12056
  50% { opacity: 1; transform: scale(1.05); }
@@ -11956,6 +12065,28 @@ z-index: 10;
11956
12065
  100% { opacity: 1; transform: translateY(0) scale(1); }
11957
12066
  }
11958
12067
 
12068
+ @keyframes bounceInDown {
12069
+ 0% { opacity: 0; transform: translateY(-2rem) scale(0.3); }
12070
+ 50% { opacity: 1; transform: translateY(1rem) scale(1.05); }
12071
+ 70% { transform: translateY(-0.5rem) scale(0.9); }
12072
+ 100% { opacity: 1; transform: translateY(0) scale(1); }
12073
+ }
12074
+
12075
+ @keyframes bounceInLeft {
12076
+ 0% { opacity: 0; transform: translateX(-2rem) scale(0.3); }
12077
+ 50% { opacity: 1; transform: translateX(1rem) scale(1.05); }
12078
+ 70% { transform: translateX(-0.5rem) scale(0.9); }
12079
+ 100% { opacity: 1; transform: translateX(0) scale(1); }
12080
+ }
12081
+
12082
+ @keyframes bounceInRight {
12083
+ 0% { opacity: 0; transform: translateX(2rem) scale(0.3); }
12084
+ 50% { opacity: 1; transform: translateX(-1rem) scale(1.05); }
12085
+ 70% { transform: translateX(0.5rem) scale(0.9); }
12086
+ 100% { opacity: 1; transform: translateX(0) scale(1); }
12087
+ }
12088
+
12089
+ /* Flip Animations */
11959
12090
  @keyframes flipInX {
11960
12091
  from { transform: perspective(400px) rotateX(90deg); opacity: 0; }
11961
12092
  to { transform: perspective(400px) rotateX(0deg); opacity: 1; }
@@ -11966,11 +12097,33 @@ z-index: 10;
11966
12097
  to { transform: perspective(400px) rotateY(0deg); opacity: 1; }
11967
12098
  }
11968
12099
 
12100
+ @keyframes flipInDiagonal {
12101
+ from { transform: perspective(400px) rotate3d(1, 1, 0, 90deg); opacity: 0; }
12102
+ to { transform: perspective(400px) rotate3d(1, 1, 0, 0deg); opacity: 1; }
12103
+ }
12104
+
12105
+ /* Rotate Animations */
11969
12106
  @keyframes rotateIn {
11970
12107
  from { transform: rotate(-180deg); opacity: 0; }
11971
12108
  to { transform: rotate(0deg); opacity: 1; }
11972
12109
  }
11973
12110
 
12111
+ @keyframes rotateInUp {
12112
+ from { transform: rotate(-180deg) translateY(2rem); opacity: 0; }
12113
+ to { transform: rotate(0deg) translateY(0); opacity: 1; }
12114
+ }
12115
+
12116
+ @keyframes rotateInDown {
12117
+ from { transform: rotate(180deg) translateY(-2rem); opacity: 0; }
12118
+ to { transform: rotate(0deg) translateY(0); opacity: 1; }
12119
+ }
12120
+
12121
+ @keyframes rotateInScale {
12122
+ from { transform: rotate(-180deg) scale(0.5); opacity: 0; }
12123
+ to { transform: rotate(0deg) scale(1); opacity: 1; }
12124
+ }
12125
+
12126
+ /* Special Entrance Animations */
11974
12127
  @keyframes rollIn {
11975
12128
  from { opacity: 0; transform: translateX(-100%) rotate(-120deg); }
11976
12129
  to { opacity: 1; transform: translateX(0px) rotate(0deg); }
@@ -12004,7 +12157,18 @@ z-index: 10;
12004
12157
  100% { opacity: 1; transform: scale(1); }
12005
12158
  }
12006
12159
 
12007
- /* Hover Keyframes */
12160
+ @keyframes unfoldIn {
12161
+ 0% { transform: scaleY(0.005) scaleX(0); opacity: 0; }
12162
+ 50% { transform: scaleY(0.005) scaleX(1); opacity: 0.5; }
12163
+ 100% { transform: scaleY(1) scaleX(1); opacity: 1; }
12164
+ }
12165
+
12166
+ @keyframes spiralIn {
12167
+ 0% { transform: rotate(960deg) scale(0); opacity: 0; }
12168
+ 100% { transform: rotate(0deg) scale(1); opacity: 1; }
12169
+ }
12170
+
12171
+ /* Hover Effect Keyframes */
12008
12172
  @keyframes shake {
12009
12173
  0%, 100% { transform: translateX(0); }
12010
12174
  20%, 60% { transform: translateX(-0.5rem); }
@@ -12020,6 +12184,57 @@ z-index: 10;
12020
12184
  75% { transform: translateX(-5%) rotate(-1deg); }
12021
12185
  }
12022
12186
 
12187
+ @keyframes bounce {
12188
+ 0%, 100% { transform: translateY(0); }
12189
+ 50% { transform: translateY(-1rem); }
12190
+ }
12191
+
12192
+ @keyframes jello {
12193
+ 0%, 100% { transform: skewX(0deg) skewY(0deg); }
12194
+ 30% { transform: skewX(25deg) skewY(25deg); }
12195
+ 40% { transform: skewX(-15deg) skewY(-15deg); }
12196
+ 50% { transform: skewX(15deg) skewY(15deg); }
12197
+ 65% { transform: skewX(-5deg) skewY(-5deg); }
12198
+ 75% { transform: skewX(5deg) skewY(5deg); }
12199
+ }
12200
+
12201
+ @keyframes rubberBand {
12202
+ 0% { transform: scale(1); }
12203
+ 30% { transform: scale(1.25, 0.75); }
12204
+ 40% { transform: scale(0.75, 1.25); }
12205
+ 50% { transform: scale(1.15, 0.85); }
12206
+ 65% { transform: scale(0.95, 1.05); }
12207
+ 75% { transform: scale(1.05, 0.95); }
12208
+ 100% { transform: scale(1); }
12209
+ }
12210
+
12211
+ @keyframes bounceScale {
12212
+ 0%, 100% { transform: scale(1); }
12213
+ 50% { transform: scale(1.15); }
12214
+ }
12215
+
12216
+ @keyframes swing {
12217
+ 20% { transform: rotate(15deg); }
12218
+ 40% { transform: rotate(-10deg); }
12219
+ 60% { transform: rotate(5deg); }
12220
+ 80% { transform: rotate(-5deg); }
12221
+ 100% { transform: rotate(0deg); }
12222
+ }
12223
+
12224
+ @keyframes pulseHover {
12225
+ 0% { transform: scale(1); }
12226
+ 50% { transform: scale(1.08); }
12227
+ 100% { transform: scale(1); }
12228
+ }
12229
+
12230
+ @keyframes heartbeat {
12231
+ 0%, 100% { transform: scale(1); }
12232
+ 14% { transform: scale(1.15); }
12233
+ 28% { transform: scale(1); }
12234
+ 42% { transform: scale(1.15); }
12235
+ 70% { transform: scale(1); }
12236
+ }
12237
+
12023
12238
  /* Continuous Animations */
12024
12239
  @keyframes float {
12025
12240
  0%, 100% { transform: translateY(0px); }
@@ -12037,15 +12252,63 @@ z-index: 10;
12037
12252
  }
12038
12253
 
12039
12254
  @keyframes glow {
12040
- 0%, 100% { box-shadow: 0 0 0.5rem rgba(var(--primary-rgb), 0.5); }
12041
- 50% { box-shadow: 0 0 2rem rgba(var(--primary-rgb), 0.8); }
12255
+ 0%, 100% { box-shadow: 0 0 0.5rem rgba(59, 130, 246, 0.5); }
12256
+ 50% { box-shadow: 0 0 2rem rgba(59, 130, 246, 0.8); }
12257
+ }
12258
+
12259
+ @keyframes pulseGlow {
12260
+ 0%, 100% { box-shadow: 0 0 1rem rgba(59, 130, 246, 0.4); transform: scale(1); }
12261
+ 50% { box-shadow: 0 0 2rem rgba(59, 130, 246, 0.8); transform: scale(1.02); }
12042
12262
  }
12043
12263
 
12044
12264
  @keyframes ping {
12045
12265
  75%, 100% { transform: scale(2); opacity: 0; }
12046
12266
  }
12047
12267
 
12268
+ @keyframes drift {
12269
+ 0%, 100% { transform: translate(0, 0); }
12270
+ 25% { transform: translate(0.5rem, -0.5rem); }
12271
+ 50% { transform: translate(0, -1rem); }
12272
+ 75% { transform: translate(-0.5rem, -0.5rem); }
12273
+ }
12274
+
12275
+ @keyframes sway {
12276
+ 0%, 100% { transform: rotate(0deg); }
12277
+ 50% { transform: rotate(5deg); }
12278
+ }
12279
+
12280
+ @keyframes rotateSlow {
12281
+ from { transform: rotate(0deg); }
12282
+ to { transform: rotate(360deg); }
12283
+ }
12284
+
12285
+ @keyframes bob {
12286
+ 0%, 100% { transform: translateY(0); }
12287
+ 50% { transform: translateY(-0.5rem); }
12288
+ }
12289
+
12290
+ @keyframes spin {
12291
+ from { transform: rotate(0deg); }
12292
+ to { transform: rotate(360deg); }
12293
+ }
12294
+
12295
+
12296
+
12297
+ /* ===== UTILITY CLASSES ===== */
12298
+ .delay-100 { animation-delay: 0.1s !important; }
12299
+ .delay-200 { animation-delay: 0.2s !important; }
12300
+ .delay-300 { animation-delay: 0.3s !important; }
12301
+ .delay-500 { animation-delay: 0.5s !important; }
12302
+ .delay-700 { animation-delay: 0.7s !important; }
12303
+ .delay-1000 { animation-delay: 1s !important; }
12304
+
12305
+ .duration-fast { animation-duration: 0.3s !important; }
12306
+ .duration-normal { animation-duration: 0.6s !important; }
12307
+ .duration-slow { animation-duration: 1s !important; }
12308
+ .duration-slower { animation-duration: 1.5s !important; }
12048
12309
 
12310
+ .ease-smooth { animation-timing-function: cubic-bezier(0.34, 1.56, 0.64, 1) !important; }
12311
+ .ease-bounce { animation-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55) !important; }
12049
12312
 
12050
12313
  /* Make all scrollbars thin */
12051
12314
  * {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.8.17",
2
+ "version": "3.9.0",
3
3
  "name": "funuicss",
4
4
  "description": "React and Next.js component UI Library for creating Easy and good looking websites with fewer lines of code. Elevate your web development experience with our cutting-edge React/Next.js component UI Library. Craft stunning websites effortlessly, boasting both seamless functionality and aesthetic appeal—all achieved with minimal lines of code. Unleash the power of simplicity and style in your projects!",
5
5
  "main": "index.js",
@@ -23,6 +23,7 @@ interface DropdownProps {
23
23
  height?: string;
24
24
  minHeight?: string;
25
25
  maxHeight?: string;
26
+ usePortal?: boolean;
26
27
  }
27
28
  declare const Dropdown: React.FC<DropdownProps>;
28
29
  export default Dropdown;
@@ -35,44 +35,226 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  })();
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
37
  var react_1 = __importStar(require("react"));
38
+ var react_dom_1 = require("react-dom");
38
39
  var Dropdown = function (_a) {
39
- var _b = _a.position, position = _b === void 0 ? 'bottom' : _b, button = _a.button, items = _a.items, _c = _a.hoverable, hoverable = _c === void 0 ? true : _c, _d = _a.openOnHover, openOnHover = _d === void 0 ? true : _d, _e = _a.closableOnlyOutside, closableOnlyOutside = _e === void 0 ? false : _e, _f = _a.className, className = _f === void 0 ? '' : _f, _g = _a.menuClassName, menuClassName = _g === void 0 ? '' : _g, width = _a.width, minWidth = _a.minWidth, maxWidth = _a.maxWidth, height = _a.height, minHeight = _a.minHeight, maxHeight = _a.maxHeight;
40
+ var _b = _a.position, position = _b === void 0 ? 'bottom' : _b, button = _a.button, items = _a.items, _c = _a.hoverable, hoverable = _c === void 0 ? true : _c, _d = _a.openOnHover, openOnHover = _d === void 0 ? true : _d, _e = _a.closableOnlyOutside, closableOnlyOutside = _e === void 0 ? false : _e, _f = _a.className, className = _f === void 0 ? '' : _f, _g = _a.menuClassName, menuClassName = _g === void 0 ? '' : _g, width = _a.width, minWidth = _a.minWidth, maxWidth = _a.maxWidth, height = _a.height, minHeight = _a.minHeight, maxHeight = _a.maxHeight, _h = _a.usePortal, usePortal = _h === void 0 ? true : _h;
40
41
  var containerRef = (0, react_1.useRef)(null);
41
- var _h = (0, react_1.useState)(false), open = _h[0], setOpen = _h[1];
42
+ var triggerRef = (0, react_1.useRef)(null);
43
+ var _j = (0, react_1.useState)(false), open = _j[0], setOpen = _j[1];
44
+ var _k = (0, react_1.useState)(null), menuPosition = _k[0], setMenuPosition = _k[1];
45
+ // Calculate menu position
46
+ var calculatePosition = function () {
47
+ if (!triggerRef.current)
48
+ return;
49
+ var rect = triggerRef.current.getBoundingClientRect();
50
+ var scrollY = window.scrollY;
51
+ var scrollX = window.scrollX;
52
+ var menuWidth = width ? (width.includes('px') ? parseInt(width) : 200) : 200;
53
+ var top = rect.bottom + scrollY;
54
+ var left = rect.left + scrollX;
55
+ setMenuPosition({
56
+ top: top,
57
+ left: left,
58
+ width: rect.width
59
+ });
60
+ };
61
+ // Handle clicks outside - SIMPLIFIED
42
62
  (0, react_1.useEffect)(function () {
43
63
  if (openOnHover)
44
64
  return;
45
- var handleClickOutside = function (event) {
46
- if (containerRef.current && !containerRef.current.contains(event.target)) {
47
- setOpen(false);
65
+ var handleDocumentClick = function (event) {
66
+ var _a;
67
+ // If click is inside the trigger, do nothing (it will be handled by trigger click)
68
+ if ((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target)) {
69
+ return;
48
70
  }
71
+ // Close dropdown if click is outside
72
+ setOpen(false);
73
+ setMenuPosition(null);
49
74
  };
50
- document.addEventListener('mousedown', handleClickOutside);
51
- return function () { return document.removeEventListener('mousedown', handleClickOutside); };
52
- }, [openOnHover]);
53
- var showMenu = openOnHover || open;
75
+ // Add event listener with a delay to avoid immediate trigger
76
+ var timer = setTimeout(function () {
77
+ document.addEventListener('click', handleDocumentClick);
78
+ }, 10);
79
+ return function () {
80
+ clearTimeout(timer);
81
+ document.removeEventListener('click', handleDocumentClick);
82
+ };
83
+ }, [openOnHover, open]);
84
+ // Calculate position when opening
85
+ (0, react_1.useEffect)(function () {
86
+ if (open && usePortal) {
87
+ calculatePosition();
88
+ }
89
+ else {
90
+ setMenuPosition(null);
91
+ }
92
+ }, [open, usePortal, position]);
93
+ var showMenu = (openOnHover || open) && (usePortal ? menuPosition !== null : true);
54
94
  var menuStyle = {
55
- width: width,
56
- minWidth: minWidth,
95
+ width: width || ((menuPosition === null || menuPosition === void 0 ? void 0 : menuPosition.width) ? "".concat(menuPosition.width, "px") : 'auto'),
96
+ minWidth: minWidth || '200px',
57
97
  maxWidth: maxWidth,
58
98
  height: height,
59
99
  minHeight: minHeight,
60
100
  maxHeight: maxHeight,
101
+ position: usePortal ? 'fixed' : 'absolute',
102
+ top: usePortal && menuPosition ? menuPosition.top : undefined,
103
+ left: usePortal && menuPosition ? menuPosition.left : undefined,
104
+ zIndex: 9999,
105
+ };
106
+ var handleItemClick = function (item) {
107
+ var _a;
108
+ if (item.disabled)
109
+ return;
110
+ // Execute click handler
111
+ (_a = item.onClick) === null || _a === void 0 ? void 0 : _a.call(item);
112
+ // Close dropdown unless closableOnlyOutside is true
113
+ if (!closableOnlyOutside) {
114
+ setOpen(false);
115
+ setMenuPosition(null);
116
+ }
117
+ };
118
+ var renderMenu = function () { return (react_1.default.createElement("div", { className: "dropdown-menu ".concat(position, " ").concat(menuClassName), style: menuStyle,
119
+ // Prevent clicks inside from closing immediately
120
+ onClick: function (e) {
121
+ e.stopPropagation();
122
+ e.preventDefault();
123
+ } }, items.map(function (item, index) { return (react_1.default.createElement(react_1.default.Fragment, { key: index }, item.divider ? (react_1.default.createElement("div", { className: "dropdown-divider" })) : (react_1.default.createElement("div", { className: "dropdown-item ".concat(item.disabled ? 'disabled' : '', " ").concat(!hoverable ? 'no-hover' : 'hover-lighter'), onClick: function () { return handleItemClick(item); } },
124
+ item.startIcon && (react_1.default.createElement("span", { className: "dropdown-item-icon" }, item.startIcon)),
125
+ react_1.default.createElement("span", { className: "dropdown-item-label" }, item.label),
126
+ item.endIcon && (react_1.default.createElement("span", { className: "dropdown-item-icon" }, item.endIcon)))))); }))); };
127
+ var handleTriggerClick = function () {
128
+ if (!openOnHover) {
129
+ // Toggle open state
130
+ var newOpenState = !open;
131
+ setOpen(newOpenState);
132
+ // If closing, clear position immediately
133
+ if (!newOpenState) {
134
+ setMenuPosition(null);
135
+ }
136
+ }
61
137
  };
62
138
  return (react_1.default.createElement("div", { ref: containerRef, className: "dropdown-container ".concat(className), onMouseEnter: function () { return openOnHover && setOpen(true); }, onMouseLeave: function () { return openOnHover && setOpen(false); } },
63
- react_1.default.createElement("div", { onClick: function () { return !openOnHover && setOpen(!open); }, style: { cursor: !openOnHover ? 'pointer' : undefined } }, button),
64
- showMenu && (react_1.default.createElement("div", { className: "dropdown-menu ".concat(position, " ").concat(menuClassName), style: menuStyle }, items.map(function (item, index) { return (react_1.default.createElement(react_1.default.Fragment, { key: index }, item.divider ? (react_1.default.createElement("div", { className: "dropdown-divider" })) : (react_1.default.createElement("div", { className: "dropdown-item ".concat(item.disabled ? 'disabled' : '', " ").concat(!hoverable ? 'no-hover' : ''), onClick: function () {
65
- var _a;
66
- if (item.disabled)
67
- return;
68
- if (!closableOnlyOutside) {
69
- (_a = item.onClick) === null || _a === void 0 ? void 0 : _a.call(item);
70
- if (!openOnHover)
71
- setOpen(false);
72
- }
73
- } },
74
- item.startIcon && (react_1.default.createElement("span", { className: "dropdown-item-icon" }, item.startIcon)),
75
- react_1.default.createElement("span", { className: "dropdown-item-label" }, item.label),
76
- item.endIcon && (react_1.default.createElement("span", { className: "dropdown-item-icon" }, item.endIcon)))))); })))));
139
+ react_1.default.createElement("div", { ref: triggerRef, onClick: handleTriggerClick, style: { cursor: !openOnHover ? 'pointer' : undefined } }, button),
140
+ showMenu && (react_1.default.createElement(react_1.default.Fragment, null, usePortal ? ((0, react_dom_1.createPortal)(renderMenu(), document.body)) : (renderMenu())))));
77
141
  };
78
142
  exports.default = Dropdown;
143
+ // 'use client';
144
+ // import React, { useState, useRef, useEffect } from 'react';
145
+ // type Position = 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
146
+ // interface DropdownItem {
147
+ // label: React.ReactNode;
148
+ // onClick?: () => void;
149
+ // startIcon?: React.ReactNode;
150
+ // endIcon?: React.ReactNode;
151
+ // disabled?: boolean;
152
+ // divider?: boolean;
153
+ // }
154
+ // interface DropdownProps {
155
+ // position?: Position;
156
+ // button: React.ReactNode;
157
+ // items: DropdownItem[];
158
+ // hoverable?: boolean;
159
+ // openOnHover?: boolean;
160
+ // closableOnlyOutside?: boolean;
161
+ // className?: string;
162
+ // menuClassName?: string;
163
+ // width?: string;
164
+ // minWidth?: string;
165
+ // maxWidth?: string;
166
+ // height?: string;
167
+ // minHeight?: string;
168
+ // maxHeight?: string;
169
+ // }
170
+ // const Dropdown: React.FC<DropdownProps> = ({
171
+ // position = 'bottom',
172
+ // button,
173
+ // items,
174
+ // hoverable = true,
175
+ // openOnHover = true,
176
+ // closableOnlyOutside = false,
177
+ // className = '',
178
+ // menuClassName = '',
179
+ // width,
180
+ // minWidth,
181
+ // maxWidth,
182
+ // height,
183
+ // minHeight,
184
+ // maxHeight,
185
+ // }) => {
186
+ // const containerRef = useRef<HTMLDivElement>(null);
187
+ // const [open, setOpen] = useState(false);
188
+ // useEffect(() => {
189
+ // if (openOnHover) return;
190
+ // const handleClickOutside = (event: MouseEvent) => {
191
+ // if (containerRef.current && !containerRef.current.contains(event.target as Node)) {
192
+ // setOpen(false);
193
+ // }
194
+ // };
195
+ // document.addEventListener('mousedown', handleClickOutside);
196
+ // return () => document.removeEventListener('mousedown', handleClickOutside);
197
+ // }, [openOnHover]);
198
+ // const showMenu = openOnHover || open;
199
+ // const menuStyle: React.CSSProperties = {
200
+ // width,
201
+ // minWidth,
202
+ // maxWidth,
203
+ // height,
204
+ // minHeight,
205
+ // maxHeight,
206
+ // };
207
+ // return (
208
+ // <div
209
+ // ref={containerRef}
210
+ // className={`dropdown-container ${className}`}
211
+ // onMouseEnter={() => openOnHover && setOpen(true)}
212
+ // onMouseLeave={() => openOnHover && setOpen(false)}
213
+ // >
214
+ // <div
215
+ // onClick={() => !openOnHover && setOpen(!open)}
216
+ // style={{ cursor: !openOnHover ? 'pointer' : undefined }}
217
+ // >
218
+ // {button}
219
+ // </div>
220
+ // {showMenu && (
221
+ // <div
222
+ // className={`dropdown-menu ${position} ${menuClassName}`}
223
+ // style={menuStyle}
224
+ // >
225
+ // {items.map((item, index) => (
226
+ // <React.Fragment key={index}>
227
+ // {item.divider ? (
228
+ // <div className="dropdown-divider" />
229
+ // ) : (
230
+ // <div
231
+ // className={`dropdown-item ${item.disabled ? 'disabled' : ''} ${!hoverable ? 'no-hover' : ''}`}
232
+ // onClick={() => {
233
+ // if (item.disabled) return;
234
+ // if (!closableOnlyOutside) {
235
+ // item.onClick?.();
236
+ // if (!openOnHover) setOpen(false);
237
+ // }
238
+ // }}
239
+ // >
240
+ // {item.startIcon && (
241
+ // <span className="dropdown-item-icon">
242
+ // {item.startIcon}
243
+ // </span>
244
+ // )}
245
+ // <span className="dropdown-item-label">{item.label}</span>
246
+ // {item.endIcon && (
247
+ // <span className="dropdown-item-icon">
248
+ // {item.endIcon}
249
+ // </span>
250
+ // )}
251
+ // </div>
252
+ // )}
253
+ // </React.Fragment>
254
+ // ))}
255
+ // </div>
256
+ // )}
257
+ // </div>
258
+ // );
259
+ // };
260
+ // export default Dropdown;
package/ui/form/Form.js CHANGED
@@ -326,8 +326,6 @@ var Form = function (props) {
326
326
  var submitBg = submitBgProp !== undefined ? submitBgProp : mergedProps.submitBg;
327
327
  var submitPrefix = submitPrefixProp !== undefined ? submitPrefixProp : mergedProps.submitPrefix;
328
328
  var submitSuffix = submitSuffixProp !== undefined ? submitSuffixProp : mergedProps.submitSuffix;
329
- var resetText = resetTextProp !== undefined ? resetTextProp : mergedProps.resetText;
330
- var showReset = showResetProp !== undefined ? showResetProp : mergedProps.showReset;
331
329
  var isLoading = isLoadingProp !== undefined ? isLoadingProp : mergedProps.isLoading;
332
330
  var className = classNameProp !== undefined ? classNameProp : mergedProps.className;
333
331
  var layout = layoutProp !== undefined ? layoutProp : mergedProps.layout;
@@ -177,7 +177,7 @@ function SideBar(_a) {
177
177
  else {
178
178
  window.location.href = link.uri;
179
179
  }
180
- }, key: link.uri, className: 'hover-scale' },
180
+ }, key: link.uri, className: 'hover-scale-rotate hover-text-primary' },
181
181
  react_1.default.createElement("span", { className: " pointer ".concat(iconCSS || '', " ").concat(variant === 'standard' || popIcon
182
182
  ? "p-1 ".concat(isActive ? 'text-primary' : 'bg border', " central")
183
183
  : variant === 'minimal' && !isActive
package/ui/table/Table.js CHANGED
@@ -354,7 +354,8 @@ function Table(_a) {
354
354
  var shouldSlice = !searchQuery || results.length > 10;
355
355
  return (shouldSlice ? results.slice(startIndex, endIndex) : results).map(function (mdoc, index) { return (React.createElement("div", { className: "table-row animated slide-up ".concat(trCss), key: index, onClick: onRowClick ? function () { return onRowClick(mdoc); } : undefined, style: {
356
356
  // Match the grid template columns
357
- gridTemplateColumns: gridTemplateColumns
357
+ gridTemplateColumns: gridTemplateColumns,
358
+ position: 'relative', zIndex: ((shouldSlice ? results.slice(startIndex, endIndex) : results).length + 2) - (index)
358
359
  } },
359
360
  data.fields.map(function (fdoc, findex) {
360
361
  var _a, _b;