santycss 1.0.0 → 1.2.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/dist/santy.css CHANGED
@@ -11377,16 +11377,43 @@
11377
11377
  .animation-fill-both { animation-fill-mode: both; }
11378
11378
 
11379
11379
  /* ── Timing-function helpers ── */
11380
- .animation-ease { animation-timing-function: ease; }
11381
- .animation-ease-in { animation-timing-function: ease-in; }
11382
- .animation-ease-out { animation-timing-function: ease-out; }
11383
- .animation-ease-in-out { animation-timing-function: ease-in-out; }
11384
- .animation-linear { animation-timing-function: linear; }
11380
+ .animation-ease { animation-timing-function: ease; }
11381
+ .animation-ease-in { animation-timing-function: ease-in; }
11382
+ .animation-ease-out { animation-timing-function: ease-out; }
11383
+ .animation-ease-in-out { animation-timing-function: ease-in-out; }
11384
+ .animation-linear { animation-timing-function: linear; }
11385
+ .animation-ease-bounce { animation-timing-function: cubic-bezier(0.34,1.56,0.64,1); }
11386
+ .animation-ease-elastic { animation-timing-function: cubic-bezier(0.68,-0.55,0.265,1.55); }
11387
+ .animation-ease-spring { animation-timing-function: cubic-bezier(0.175,0.885,0.32,1.275); }
11388
+
11389
+ /* ── Direction helpers ── */
11390
+ .animation-direction-normal { animation-direction: normal; }
11391
+ .animation-direction-reverse { animation-direction: reverse; }
11392
+ .animation-direction-alternate { animation-direction: alternate; }
11393
+ .animation-direction-alternate-reverse { animation-direction: alternate-reverse; }
11394
+
11395
+ /* ── Extra delay helpers ── */
11396
+ .animation-delay-750 { animation-delay: 0.75s; }
11397
+ .animation-delay-1250 { animation-delay: 1.25s; }
11398
+ .animation-delay-1500 { animation-delay: 1.5s; }
11399
+ .animation-delay-2500 { animation-delay: 2.5s; }
11400
+ .animation-delay-3000 { animation-delay: 3s; }
11401
+ .animation-delay-4000 { animation-delay: 4s; }
11402
+ .animation-delay-5000 { animation-delay: 5s; }
11403
+
11404
+ /* ── Extra speed helpers ── */
11405
+ .animation-speed-ultra-fast { animation-duration: 0.15s !important; }
11406
+
11407
+ /* ── Extra iteration helpers ── */
11408
+ .animation-iteration-2 { animation-iteration-count: 2; }
11409
+ .animation-iteration-4 { animation-iteration-count: 4; }
11410
+ .animation-iteration-5 { animation-iteration-count: 5; }
11385
11411
 
11386
11412
  /* ── Pause / play ── */
11387
- .animation-paused { animation-play-state: paused; }
11388
- .animation-running{ animation-play-state: running; }
11389
- .animation-none { animation: none; }
11413
+ .animation-paused { animation-play-state: paused; }
11414
+ .animation-running { animation-play-state: running; }
11415
+ .animation-none { animation: none; }
11416
+ .animation-pause-on-hover:hover { animation-play-state: paused; }
11390
11417
 
11391
11418
  /* ════════════════════════════════════════════════════
11392
11419
  ATTENTION SEEKERS
@@ -11855,6 +11882,289 @@
11855
11882
  @keyframes santy-roll-in { from { opacity: 0; transform: translate3d(-100%,0,0) rotate3d(0,0,1,-120deg); } to { opacity: 1; transform: translate3d(0,0,0); } }
11856
11883
  @keyframes santy-roll-out { from { opacity: 1; } to { opacity: 0; transform: translate3d(100%,0,0) rotate3d(0,0,1,120deg); } }
11857
11884
 
11885
+ /* ═══════════════════════════════════════════════════════════════════════
11886
+ SCROLL-TRIGGERED ANIMATIONS
11887
+ Uses Intersection Observer via tiny JS snippet OR animation-timeline.
11888
+ Add class + JS observer, or use with animate-on-scroll-* pattern.
11889
+ Pure CSS fallback: elements start invisible, JS adds .is-visible.
11890
+ ═══════════════════════════════════════════════════════════════════════ */
11891
+
11892
+ /* Base: elements are hidden until .is-visible is toggled by JS */
11893
+ .animate-on-scroll-fade-in { opacity: 0; transition: opacity 0.6s ease, transform 0.6s ease; }
11894
+ .animate-on-scroll-slide-up { opacity: 0; transform: translateY(40px); transition: opacity 0.6s ease, transform 0.6s ease; }
11895
+ .animate-on-scroll-slide-down { opacity: 0; transform: translateY(-40px); transition: opacity 0.6s ease, transform 0.6s ease; }
11896
+ .animate-on-scroll-zoom-in { opacity: 0; transform: scale(0.85); transition: opacity 0.6s ease, transform 0.6s ease; }
11897
+ .animate-on-scroll-from-left { opacity: 0; transform: translateX(-60px); transition: opacity 0.6s ease, transform 0.6s ease; }
11898
+ .animate-on-scroll-from-right { opacity: 0; transform: translateX(60px); transition: opacity 0.6s ease, transform 0.6s ease; }
11899
+ .animate-on-scroll-flip-up { opacity: 0; transform: rotateX(30deg); transition: opacity 0.6s ease, transform 0.6s ease; }
11900
+
11901
+ /* Triggered state — add .is-visible via IntersectionObserver */
11902
+ .animate-on-scroll-fade-in.is-visible,
11903
+ .animate-on-scroll-slide-up.is-visible,
11904
+ .animate-on-scroll-slide-down.is-visible,
11905
+ .animate-on-scroll-zoom-in.is-visible,
11906
+ .animate-on-scroll-from-left.is-visible,
11907
+ .animate-on-scroll-from-right.is-visible,
11908
+ .animate-on-scroll-flip-up.is-visible { opacity: 1; transform: none; }
11909
+
11910
+ /* scroll-reveal-once / scroll-reveal-repeat — same trigger, different JS behaviour */
11911
+ .scroll-reveal-once,
11912
+ .scroll-reveal-repeat { opacity: 0; transform: translateY(30px); transition: opacity 0.55s ease, transform 0.55s ease; }
11913
+ .scroll-reveal-once.is-visible,
11914
+ .scroll-reveal-repeat.is-visible { opacity: 1; transform: none; }
11915
+
11916
+ /* Delay modifiers for scroll reveals */
11917
+ .scroll-reveal-delay-100 { transition-delay: 0.1s; }
11918
+ .scroll-reveal-delay-200 { transition-delay: 0.2s; }
11919
+ .scroll-reveal-delay-300 { transition-delay: 0.3s; }
11920
+ .scroll-reveal-delay-400 { transition-delay: 0.4s; }
11921
+ .scroll-reveal-delay-500 { transition-delay: 0.5s; }
11922
+
11923
+ /* ═══════════════════════════════════════════════════════════════════════
11924
+ HOVER-TRIGGERED ANIMATIONS
11925
+ These override animation only on :hover so they fire on mouse-over.
11926
+ ═══════════════════════════════════════════════════════════════════════ */
11927
+ .on-hover:animate-bounce:hover { animation: santy-bounce 0.8s ease both; }
11928
+ .on-hover:animate-pulse:hover { animation: santy-pulse 1s ease both; }
11929
+ .on-hover:animate-shake-x:hover { animation: santy-shake-x 0.6s ease both; }
11930
+ .on-hover:animate-rubber-band:hover { animation: santy-rubber-band 0.8s ease both; }
11931
+ .on-hover:animate-tada:hover { animation: santy-tada 0.8s ease both; }
11932
+ .on-hover:animate-wobble:hover { animation: santy-wobble 0.8s ease both; }
11933
+ .on-hover:animate-swing:hover { animation: santy-swing 0.8s ease both; transform-origin: top center; }
11934
+ .on-hover:animate-heartbeat:hover { animation: santy-heartbeat 1s ease-in-out both; }
11935
+ .on-hover:animate-spin-once:hover { animation: santy-spin 0.5s linear both; }
11936
+ .on-hover:animate-flip-once:hover { animation: santy-flip-in-y 0.6s ease both; }
11937
+ .on-hover:animate-jello:hover { animation: santy-jelly 0.9s ease both; }
11938
+ .on-hover:animate-zoom-in:hover { animation: santy-zoom-in 0.3s ease both; }
11939
+ .on-hover:animate-fade-in:hover { animation: santy-fade-in 0.4s ease both; }
11940
+
11941
+ /* ═══════════════════════════════════════════════════════════════════════
11942
+ TEXT ANIMATIONS
11943
+ ═══════════════════════════════════════════════════════════════════════ */
11944
+
11945
+ /* Typewriter — pure CSS using steps() */
11946
+ .animate-typewriter {
11947
+ overflow: hidden;
11948
+ white-space: nowrap;
11949
+ border-right: 2px solid currentColor;
11950
+ width: 0;
11951
+ animation: santy-typewriter 2.5s steps(30,end) forwards, santy-blink-caret 0.75s step-end infinite;
11952
+ }
11953
+ /* Blur-in entrance */
11954
+ .animate-text-blur-in { animation: santy-text-blur-in 0.8s ease both; }
11955
+ /* Slide up per-word (apply to the text container) */
11956
+ .animate-text-slide-up { animation: santy-slide-up 0.5s ease both; }
11957
+ /* Gradient flow — animated gradient on text */
11958
+ .animate-text-gradient-flow {
11959
+ background: linear-gradient(90deg, #3b82f6, #8b5cf6, #ec4899, #3b82f6);
11960
+ background-size: 300% 100%;
11961
+ -webkit-background-clip: text;
11962
+ background-clip: text;
11963
+ -webkit-text-fill-color: transparent;
11964
+ animation: santy-gradient-shift 3s linear infinite;
11965
+ }
11966
+ /* Letter wave — each letter must be wrapped in a span via JS */
11967
+ .animate-text-wave span { display: inline-block; animation: santy-text-wave 1s ease infinite; }
11968
+ .animate-text-wave span:nth-child(1) { animation-delay: 0s; }
11969
+ .animate-text-wave span:nth-child(2) { animation-delay: 0.08s; }
11970
+ .animate-text-wave span:nth-child(3) { animation-delay: 0.16s; }
11971
+ .animate-text-wave span:nth-child(4) { animation-delay: 0.24s; }
11972
+ .animate-text-wave span:nth-child(5) { animation-delay: 0.32s; }
11973
+ .animate-text-wave span:nth-child(6) { animation-delay: 0.40s; }
11974
+ .animate-text-wave span:nth-child(7) { animation-delay: 0.48s; }
11975
+ .animate-text-wave span:nth-child(8) { animation-delay: 0.56s; }
11976
+ /* Glitch */
11977
+ .animate-text-glitch { animation: santy-text-glitch 0.5s linear infinite; }
11978
+ /* Neon pulse */
11979
+ .animate-text-neon-pulse { animation: santy-neon-pulse 1.5s ease-in-out infinite alternate; }
11980
+
11981
+ @keyframes santy-typewriter { to { width: 100%; } }
11982
+ @keyframes santy-blink-caret { 50% { border-color: transparent; } }
11983
+ @keyframes santy-text-blur-in { from { filter: blur(12px); opacity: 0; } to { filter: blur(0); opacity: 1; } }
11984
+ @keyframes santy-text-wave { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }
11985
+ @keyframes santy-text-glitch {
11986
+ 0%,100% { text-shadow: none; transform: none; }
11987
+ 20% { text-shadow: -2px 0 #ff00c1, 2px 0 #00fff9; transform: skewX(-2deg); }
11988
+ 40% { text-shadow: 2px 0 #ff00c1, -2px 0 #00fff9; transform: skewX(2deg); }
11989
+ 60% { text-shadow: -2px 0 #00fff9; transform: skewX(0deg); }
11990
+ 80% { text-shadow: 2px 0 #ff00c1; }
11991
+ }
11992
+ @keyframes santy-neon-pulse {
11993
+ from { text-shadow: 0 0 4px currentColor, 0 0 10px currentColor; }
11994
+ to { text-shadow: 0 0 8px currentColor, 0 0 20px currentColor, 0 0 40px currentColor; }
11995
+ }
11996
+
11997
+ /* ═══════════════════════════════════════════════════════════════════════
11998
+ STAGGERED ENTRANCE SEQUENCES
11999
+ Apply parent class; children get incremental delays via nth-child.
12000
+ ═══════════════════════════════════════════════════════════════════════ */
12001
+ .animate-stagger-fade-in > * { animation: santy-fade-in 0.5s ease both; }
12002
+ .animate-stagger-slide-up > * { animation: santy-slide-up 0.5s ease both; }
12003
+ .animate-stagger-zoom-in > * { animation: santy-zoom-in 0.4s ease both; }
12004
+ .animate-stagger-from-left > * { animation: santy-fade-in-from-left 0.5s ease both; }
12005
+ .animate-stagger-from-right > * { animation: santy-fade-in-from-right 0.5s ease both; }
12006
+
12007
+ /* Delay each child — 100ms steps */
12008
+ .animate-stagger-children-100 > *:nth-child(1) { animation-delay: 0.0s; }
12009
+ .animate-stagger-children-100 > *:nth-child(2) { animation-delay: 0.1s; }
12010
+ .animate-stagger-children-100 > *:nth-child(3) { animation-delay: 0.2s; }
12011
+ .animate-stagger-children-100 > *:nth-child(4) { animation-delay: 0.3s; }
12012
+ .animate-stagger-children-100 > *:nth-child(5) { animation-delay: 0.4s; }
12013
+ .animate-stagger-children-100 > *:nth-child(6) { animation-delay: 0.5s; }
12014
+ .animate-stagger-children-100 > *:nth-child(7) { animation-delay: 0.6s; }
12015
+ .animate-stagger-children-100 > *:nth-child(8) { animation-delay: 0.7s; }
12016
+ .animate-stagger-children-100 > *:nth-child(9) { animation-delay: 0.8s; }
12017
+ .animate-stagger-children-100 > *:nth-child(10) { animation-delay: 0.9s; }
12018
+ /* 200ms steps */
12019
+ .animate-stagger-children-200 > *:nth-child(1) { animation-delay: 0.0s; }
12020
+ .animate-stagger-children-200 > *:nth-child(2) { animation-delay: 0.2s; }
12021
+ .animate-stagger-children-200 > *:nth-child(3) { animation-delay: 0.4s; }
12022
+ .animate-stagger-children-200 > *:nth-child(4) { animation-delay: 0.6s; }
12023
+ .animate-stagger-children-200 > *:nth-child(5) { animation-delay: 0.8s; }
12024
+ .animate-stagger-children-200 > *:nth-child(6) { animation-delay: 1.0s; }
12025
+ .animate-stagger-children-200 > *:nth-child(7) { animation-delay: 1.2s; }
12026
+ .animate-stagger-children-200 > *:nth-child(8) { animation-delay: 1.4s; }
12027
+ /* 300ms steps */
12028
+ .animate-stagger-children-300 > *:nth-child(1) { animation-delay: 0.0s; }
12029
+ .animate-stagger-children-300 > *:nth-child(2) { animation-delay: 0.3s; }
12030
+ .animate-stagger-children-300 > *:nth-child(3) { animation-delay: 0.6s; }
12031
+ .animate-stagger-children-300 > *:nth-child(4) { animation-delay: 0.9s; }
12032
+ .animate-stagger-children-300 > *:nth-child(5) { animation-delay: 1.2s; }
12033
+ .animate-stagger-children-300 > *:nth-child(6) { animation-delay: 1.5s; }
12034
+
12035
+ /* ═══════════════════════════════════════════════════════════════════════
12036
+ MORPHING & SHAPE ANIMATIONS
12037
+ ═══════════════════════════════════════════════════════════════════════ */
12038
+ .animate-morph-blob { animation: santy-morph-blob 6s ease-in-out infinite; }
12039
+ .animate-border-spin { animation: santy-border-spin 2s linear infinite; background: conic-gradient(from 0deg, #3b82f6, #8b5cf6, #ec4899, #3b82f6); }
12040
+ .animate-shimmer { overflow: hidden; position: relative; background: #f0f0f0; }
12041
+ .animate-shimmer::after {
12042
+ content: '';
12043
+ position: absolute;
12044
+ inset: 0;
12045
+ background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.7) 50%, transparent 100%);
12046
+ animation: santy-shimmer 1.5s ease-in-out infinite;
12047
+ }
12048
+ .animate-gradient-shift { background-size: 200% 200%; animation: santy-gradient-shift 3s ease infinite; }
12049
+ .animate-morph-circle-to-square { animation: santy-morph-circle-to-square 1.5s ease-in-out infinite alternate; }
12050
+ .animate-liquid { animation: santy-liquid 3s ease-in-out infinite; }
12051
+
12052
+ @keyframes santy-morph-blob {
12053
+ 0%,100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; }
12054
+ 25% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; }
12055
+ 50% { border-radius: 50% 60% 30% 60% / 40% 50% 60% 50%; }
12056
+ 75% { border-radius: 40% 70% 60% 30% / 60% 40% 50% 70%; }
12057
+ }
12058
+ @keyframes santy-border-spin { to { transform: rotate(360deg); } }
12059
+ @keyframes santy-shimmer { from { transform: translateX(-100%); } to { transform: translateX(100%); } }
12060
+ @keyframes santy-gradient-shift { 0%,100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }
12061
+ @keyframes santy-morph-circle-to-square { from { border-radius: 50%; } to { border-radius: 0%; } }
12062
+ @keyframes santy-liquid {
12063
+ 0%,100% { border-radius: 40% 60% 60% 40% / 60% 30% 70% 40%; transform: rotate(0deg); }
12064
+ 50% { border-radius: 60% 40% 30% 70% / 40% 60% 30% 60%; transform: rotate(5deg); }
12065
+ }
12066
+
12067
+ /* ═══════════════════════════════════════════════════════════════════════
12068
+ 3D ANIMATIONS
12069
+ ═══════════════════════════════════════════════════════════════════════ */
12070
+ .animate-flip-3d-x { animation: santy-flip-3d-x 0.7s ease both; }
12071
+ .animate-flip-3d-y { animation: santy-flip-3d-y 0.7s ease both; }
12072
+ .animate-rotate-3d { animation: santy-rotate-3d 1.2s linear infinite; }
12073
+ .animate-tilt-left { animation: santy-tilt-left 0.4s ease both; }
12074
+ .animate-tilt-right { animation: santy-tilt-right 0.4s ease both; }
12075
+ .animate-depth-in { animation: santy-depth-in 0.5s ease both; }
12076
+ .animate-depth-out { animation: santy-depth-out 0.5s ease both; }
12077
+ .animate-swing-3d { animation: santy-swing-3d 1s ease-in-out infinite; transform-origin: top center; perspective: 400px; }
12078
+
12079
+ @keyframes santy-flip-3d-x { from { transform: perspective(400px) rotateX(90deg); opacity: 0; } to { transform: perspective(400px) rotateX(0deg); opacity: 1; } }
12080
+ @keyframes santy-flip-3d-y { from { transform: perspective(400px) rotateY(90deg); opacity: 0; } to { transform: perspective(400px) rotateY(0deg); opacity: 1; } }
12081
+ @keyframes santy-rotate-3d { from { transform: perspective(400px) rotate3d(1,1,0,0deg); } to { transform: perspective(400px) rotate3d(1,1,0,360deg); } }
12082
+ @keyframes santy-tilt-left { from { transform: rotate(0deg); } to { transform: rotate(-6deg); } }
12083
+ @keyframes santy-tilt-right { from { transform: rotate(0deg); } to { transform: rotate(6deg); } }
12084
+ @keyframes santy-depth-in { from { transform: perspective(600px) translateZ(-80px); opacity: 0; } to { transform: perspective(600px) translateZ(0); opacity: 1; } }
12085
+ @keyframes santy-depth-out { from { transform: perspective(600px) translateZ(0); opacity: 1; } to { transform: perspective(600px) translateZ(-80px); opacity: 0; } }
12086
+ @keyframes santy-swing-3d {
12087
+ 0%,100% { transform: perspective(400px) rotateY(0deg); }
12088
+ 25% { transform: perspective(400px) rotateY(15deg); }
12089
+ 75% { transform: perspective(400px) rotateY(-15deg); }
12090
+ }
12091
+
12092
+ /* ═══════════════════════════════════════════════════════════════════════
12093
+ EXIT + PAGE TRANSITION ANIMATIONS
12094
+ ═══════════════════════════════════════════════════════════════════════ */
12095
+ .animate-exit-fade-out { animation: santy-fade-out 0.4s ease both; }
12096
+ .animate-exit-slide-left { animation: santy-exit-slide-left 0.4s ease both; }
12097
+ .animate-exit-slide-right { animation: santy-exit-slide-right 0.4s ease both; }
12098
+ .animate-exit-scale-down { animation: santy-exit-scale-down 0.35s ease both; }
12099
+ .animate-exit-flip-out { animation: santy-flip-out 0.5s ease both; }
12100
+ .animate-page-in-from-right { animation: santy-page-in-right 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
12101
+ .animate-page-in-from-left { animation: santy-page-in-left 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
12102
+ .animate-page-out-to-left { animation: santy-page-out-left 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
12103
+ .animate-page-out-to-right { animation: santy-page-out-right 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
12104
+
12105
+ @keyframes santy-exit-slide-left { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(-60px); } }
12106
+ @keyframes santy-exit-slide-right { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(60px); } }
12107
+ @keyframes santy-exit-scale-down { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.85); } }
12108
+ @keyframes santy-page-in-right { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: translateX(0); } }
12109
+ @keyframes santy-page-in-left { from { opacity: 0; transform: translateX(-100%); } to { opacity: 1; transform: translateX(0); } }
12110
+ @keyframes santy-page-out-left { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(-100%); } }
12111
+ @keyframes santy-page-out-right { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(100%); } }
12112
+
12113
+ /* View Transitions API */
12114
+ .view-transition-fade { view-transition-name: fade-transition; }
12115
+ .view-transition-slide { view-transition-name: slide-transition; }
12116
+ @keyframes santy-vt-fade-in { from { opacity: 0; } }
12117
+ @keyframes santy-vt-fade-out { to { opacity: 0; } }
12118
+ ::view-transition-old(fade-transition) { animation: santy-vt-fade-out 0.3s ease; }
12119
+ ::view-transition-new(fade-transition) { animation: santy-vt-fade-in 0.3s ease; }
12120
+ ::view-transition-old(slide-transition) { animation: santy-page-out-left 0.35s ease; }
12121
+ ::view-transition-new(slide-transition) { animation: santy-page-in-right 0.35s ease; }
12122
+
12123
+ /* ═══════════════════════════════════════════════════════════════════════
12124
+ NOTIFICATION & UI FEEDBACK ANIMATIONS
12125
+ ═══════════════════════════════════════════════════════════════════════ */
12126
+ .animate-toast-in { animation: santy-toast-in 0.4s cubic-bezier(0.25,0.46,0.45,0.94) both; }
12127
+ .animate-toast-out { animation: santy-toast-out 0.3s ease both; }
12128
+ .animate-modal-in { animation: santy-modal-in 0.3s cubic-bezier(0.34,1.56,0.64,1) both; }
12129
+ .animate-modal-out { animation: santy-modal-out 0.25s ease both; }
12130
+ .animate-drawer-in-right { animation: santy-drawer-in-right 0.35s cubic-bezier(0.25,0.46,0.45,0.94) both; }
12131
+ .animate-drawer-out-right { animation: santy-drawer-out-right 0.3s ease both; }
12132
+ .animate-drawer-in-bottom { animation: santy-drawer-in-bottom 0.35s cubic-bezier(0.25,0.46,0.45,0.94) both; }
12133
+ .animate-dropdown-in { animation: santy-dropdown-in 0.2s cubic-bezier(0.34,1.56,0.64,1) both; transform-origin: top center; }
12134
+ .animate-dropdown-out { animation: santy-dropdown-out 0.15s ease both; transform-origin: top center; }
12135
+ .animate-tooltip-in { animation: santy-zoom-in 0.15s ease both; }
12136
+ .animate-badge-pop { animation: santy-badge-pop 0.4s cubic-bezier(0.34,1.56,0.64,1) both; }
12137
+ .animate-success-checkmark { animation: santy-checkmark 0.6s ease both; stroke-dasharray: 50; stroke-dashoffset: 50; }
12138
+ .animate-error-shake { animation: santy-shake-x 0.5s ease both; }
12139
+
12140
+ @keyframes santy-toast-in { from { opacity: 0; transform: translateY(100%) scale(0.9); } to { opacity: 1; transform: translateY(0) scale(1); } }
12141
+ @keyframes santy-toast-out { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(20px); } }
12142
+ @keyframes santy-modal-in { from { opacity: 0; transform: scale(0.85); } to { opacity: 1; transform: scale(1); } }
12143
+ @keyframes santy-modal-out { from { opacity: 1; transform: scale(1); } to { opacity: 0; transform: scale(0.9); } }
12144
+ @keyframes santy-drawer-in-right { from { transform: translateX(100%); } to { transform: translateX(0); } }
12145
+ @keyframes santy-drawer-out-right { from { transform: translateX(0); } to { transform: translateX(100%); } }
12146
+ @keyframes santy-drawer-in-bottom { from { transform: translateY(100%); } to { transform: translateY(0); } }
12147
+ @keyframes santy-dropdown-in { from { opacity: 0; transform: scaleY(0.8); } to { opacity: 1; transform: scaleY(1); } }
12148
+ @keyframes santy-dropdown-out { from { opacity: 1; transform: scaleY(1); } to { opacity: 0; transform: scaleY(0.8); } }
12149
+ @keyframes santy-badge-pop { 0% { transform: scale(0); } 60% { transform: scale(1.15); } 100% { transform: scale(1); } }
12150
+ @keyframes santy-checkmark { to { stroke-dashoffset: 0; } }
12151
+
12152
+ /* ── Scroll-reveal observer snippet (embed in your HTML) ── */
12153
+ /* <script>
12154
+ new IntersectionObserver((entries) => {
12155
+ entries.forEach(e => {
12156
+ if(e.isIntersecting) {
12157
+ e.target.classList.add('is-visible');
12158
+ if(e.target.classList.contains('scroll-reveal-once'))
12159
+ observer.unobserve(e.target);
12160
+ } else {
12161
+ if(e.target.classList.contains('scroll-reveal-repeat'))
12162
+ e.target.classList.remove('is-visible');
12163
+ }
12164
+ });
12165
+ }, { threshold: 0.15 }).observe(...document.querySelectorAll('[class*="animate-on-scroll"],[class*="scroll-reveal"]'));
12166
+ </script> */
12167
+
11858
12168
 
11859
12169
  /* ═══ SANTY COMPONENTS ═══ */
11860
12170
 
@@ -12448,6 +12758,226 @@
12448
12758
  .dropdown-divider { height: 1px; background-color: #e5e7eb; margin: 4px 0; }
12449
12759
  .dropdown-header { padding: 6px 12px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: #9ca3af; }
12450
12760
 
12761
+ /* ── Component Variant System ──────────────────────────────────────────── */
12762
+ /* Usage: make-button style-success size-large shape-pill */
12763
+
12764
+ /* make-button */
12765
+ .make-button {
12766
+ display:inline-flex; align-items:center; justify-content:center;
12767
+ gap:8px; padding:9px 20px; font-size:14px; font-weight:600;
12768
+ border-radius:8px; border:2px solid transparent; cursor:pointer;
12769
+ text-decoration:none; transition:all 0.2s; line-height:1.25; white-space:nowrap;
12770
+ }
12771
+ .make-button:disabled { opacity:.5; cursor:not-allowed; }
12772
+ .make-button.style-primary { background:#3b82f6; color:#fff; border-color:#3b82f6; }
12773
+ .make-button.style-primary:hover { background:#2563eb; border-color:#2563eb; }
12774
+ .make-button.style-secondary { background:#6b7280; color:#fff; border-color:#6b7280; }
12775
+ .make-button.style-secondary:hover { background:#4b5563; border-color:#4b5563; }
12776
+ .make-button.style-success { background:#22c55e; color:#fff; border-color:#22c55e; }
12777
+ .make-button.style-success:hover { background:#16a34a; border-color:#16a34a; }
12778
+ .make-button.style-danger { background:#ef4444; color:#fff; border-color:#ef4444; }
12779
+ .make-button.style-danger:hover { background:#dc2626; border-color:#dc2626; }
12780
+ .make-button.style-warning { background:#f59e0b; color:#fff; border-color:#f59e0b; }
12781
+ .make-button.style-warning:hover { background:#d97706; border-color:#d97706; }
12782
+ .make-button.style-info { background:#06b6d4; color:#fff; border-color:#06b6d4; }
12783
+ .make-button.style-info:hover { background:#0891b2; border-color:#0891b2; }
12784
+ .make-button.style-outline { background:transparent; border-color:currentColor; }
12785
+ .make-button.style-outline:hover { background:rgba(0,0,0,.05); }
12786
+ .make-button.style-ghost { background:transparent; border-color:transparent; }
12787
+ .make-button.style-ghost:hover { background:rgba(0,0,0,.05); }
12788
+ .make-button.style-dark { background:#1e293b; color:#f1f5f9; border-color:#1e293b; }
12789
+ .make-button.style-dark:hover { background:#0f172a; border-color:#0f172a; }
12790
+ .make-button.style-light { background:#f3f4f6; color:#374151; border-color:#e5e7eb; }
12791
+ .make-button.style-light:hover { background:#e5e7eb; }
12792
+ .make-button.size-tiny { padding:2px 8px; font-size:11px; border-radius:4px; }
12793
+ .make-button.size-small { padding:5px 14px; font-size:12px; border-radius:6px; }
12794
+ .make-button.size-large { padding:12px 28px; font-size:16px; border-radius:10px; }
12795
+ .make-button.size-xl { padding:16px 36px; font-size:18px; border-radius:12px; }
12796
+ .make-button.size-full { width:100%; justify-content:center; }
12797
+ .make-button.shape-pill { border-radius:9999px; }
12798
+ .make-button.shape-square { border-radius:0; }
12799
+ .make-button.shape-rounded { border-radius:14px; }
12800
+
12801
+ /* make-card */
12802
+ .make-card { background:#fff; border-radius:12px; box-shadow:var(--santy-shadow); overflow:hidden; }
12803
+ .make-card.style-bordered { border:1px solid #e5e7eb; box-shadow:none; }
12804
+ .make-card.style-elevated { box-shadow:0 10px 40px -8px rgba(0,0,0,.15); }
12805
+ .make-card.style-flat { box-shadow:none; }
12806
+ .make-card.style-dark { background:#1e293b; color:#f1f5f9; }
12807
+ .make-card.shape-pill { border-radius:9999px; }
12808
+ .make-card.shape-square { border-radius:0; }
12809
+ .make-card.shape-rounded { border-radius:20px; }
12810
+ .make-card.size-small { border-radius:8px; }
12811
+ .make-card.size-large { border-radius:20px; }
12812
+
12813
+ /* make-badge */
12814
+ .make-badge { display:inline-flex; align-items:center; gap:4px; padding:3px 10px; font-size:12px; font-weight:600; border-radius:9999px; line-height:1.4; }
12815
+ .make-badge.style-primary { background:#dbeafe; color:#1d4ed8; }
12816
+ .make-badge.style-secondary { background:#f3f4f6; color:#374151; }
12817
+ .make-badge.style-success { background:#dcfce7; color:#15803d; }
12818
+ .make-badge.style-danger { background:#fee2e2; color:#b91c1c; }
12819
+ .make-badge.style-warning { background:#fef3c7; color:#b45309; }
12820
+ .make-badge.style-info { background:#cffafe; color:#0e7490; }
12821
+ .make-badge.style-dark { background:#1e293b; color:#f1f5f9; }
12822
+ .make-badge.style-outline { background:transparent; border:1.5px solid currentColor; }
12823
+ .make-badge.size-small { padding:1px 7px; font-size:10px; }
12824
+ .make-badge.size-large { padding:5px 14px; font-size:14px; }
12825
+ .make-badge.shape-square { border-radius:4px; }
12826
+ .make-badge.shape-rounded { border-radius:6px; }
12827
+
12828
+ /* make-alert */
12829
+ .make-alert { display:flex; align-items:flex-start; gap:12px; padding:14px 16px; border-radius:10px; font-size:14px; border:1px solid transparent; line-height:1.5; }
12830
+ .make-alert.style-info { background:#eff6ff; border-color:#bfdbfe; color:#1d4ed8; }
12831
+ .make-alert.style-success { background:#f0fdf4; border-color:#bbf7d0; color:#15803d; }
12832
+ .make-alert.style-warning { background:#fffbeb; border-color:#fde68a; color:#b45309; }
12833
+ .make-alert.style-danger { background:#fef2f2; border-color:#fecaca; color:#b91c1c; }
12834
+ .make-alert.style-dark { background:#1e293b; border-color:#334155; color:#f1f5f9; }
12835
+ .make-alert.size-small { padding:10px 12px; font-size:13px; border-radius:8px; }
12836
+ .make-alert.size-large { padding:20px; font-size:16px; border-radius:12px; }
12837
+ .make-alert.shape-square { border-radius:0; }
12838
+ .make-alert.shape-pill { border-radius:9999px; padding-left:24px; }
12839
+
12840
+ /* make-input */
12841
+ .make-input { display:block; width:100%; padding:9px 12px; font-size:14px; font-family:inherit; color:#111827; background:#fff; border:1.5px solid #d1d5db; border-radius:8px; transition:border-color .15s,box-shadow .15s; outline:none; line-height:1.5; }
12842
+ .make-input:focus { border-color:#3b82f6; box-shadow:0 0 0 3px rgba(59,130,246,.2); }
12843
+ .make-input.style-error { border-color:#ef4444; }
12844
+ .make-input.style-error:focus { box-shadow:0 0 0 3px rgba(239,68,68,.2); }
12845
+ .make-input.style-success { border-color:#22c55e; }
12846
+ .make-input.size-small { padding:4px 8px; font-size:12px; border-radius:6px; }
12847
+ .make-input.size-large { padding:12px 16px; font-size:16px; border-radius:10px; }
12848
+ .make-input.shape-pill { border-radius:9999px; padding-left:20px; }
12849
+ .make-input.shape-square { border-radius:0; }
12850
+
12851
+ /* make-avatar */
12852
+ .make-avatar { display:inline-flex; align-items:center; justify-content:center; width:40px; height:40px; border-radius:50%; background:#e5e7eb; color:#374151; font-weight:600; font-size:14px; overflow:hidden; flex-shrink:0; }
12853
+ .make-avatar img { width:100%; height:100%; object-fit:cover; }
12854
+ .make-avatar.size-tiny { width:24px; height:24px; font-size:10px; }
12855
+ .make-avatar.size-small { width:32px; height:32px; font-size:12px; }
12856
+ .make-avatar.size-large { width:56px; height:56px; font-size:18px; }
12857
+ .make-avatar.size-xl { width:80px; height:80px; font-size:24px; }
12858
+ .make-avatar.shape-square { border-radius:8px; }
12859
+ .make-avatar.shape-rounded { border-radius:12px; }
12860
+ .make-avatar.style-primary { background:#dbeafe; color:#1d4ed8; }
12861
+ .make-avatar.style-success { background:#dcfce7; color:#15803d; }
12862
+ .make-avatar.style-danger { background:#fee2e2; color:#b91c1c; }
12863
+ .make-avatar.style-warning { background:#fef3c7; color:#b45309; }
12864
+ .make-avatar.style-dark { background:#1e293b; color:#f1f5f9; }
12865
+
12866
+ /* make-spinner */
12867
+ .make-spinner { display:inline-block; width:24px; height:24px; border:3px solid #e5e7eb; border-top-color:#3b82f6; border-radius:50%; animation:santy-spin .75s linear infinite; }
12868
+ .make-spinner.size-tiny { width:14px; height:14px; border-width:2px; }
12869
+ .make-spinner.size-small { width:18px; height:18px; border-width:2px; }
12870
+ .make-spinner.size-large { width:40px; height:40px; border-width:4px; }
12871
+ .make-spinner.size-xl { width:56px; height:56px; border-width:5px; }
12872
+ .make-spinner.style-success { border-top-color:#22c55e; }
12873
+ .make-spinner.style-danger { border-top-color:#ef4444; }
12874
+ .make-spinner.style-warning { border-top-color:#f59e0b; }
12875
+ .make-spinner.style-dark { border-color:#334155; border-top-color:#f1f5f9; }
12876
+
12877
+ /* make-skeleton */
12878
+ .make-skeleton { background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0 50%,#f0f0f0 75%); background-size:200% 100%; animation:santy-shimmer 1.5s infinite; border-radius:6px; }
12879
+ .make-skeleton.shape-circle { border-radius:50%; }
12880
+ .make-skeleton.shape-pill { border-radius:9999px; }
12881
+ .make-skeleton.shape-square { border-radius:0; }
12882
+ .make-skeleton.size-small { height:12px; }
12883
+ .make-skeleton.size-large { height:24px; }
12884
+
12885
+ /* make-progress */
12886
+ .make-progress { width:100%; background:#e5e7eb; border-radius:9999px; overflow:hidden; }
12887
+ .make-progress > .bar { height:8px; background:#3b82f6; border-radius:9999px; transition:width .4s ease; }
12888
+ .make-progress.style-success > .bar { background:#22c55e; }
12889
+ .make-progress.style-danger > .bar { background:#ef4444; }
12890
+ .make-progress.style-warning > .bar { background:#f59e0b; }
12891
+ .make-progress.style-dark > .bar { background:#1e293b; }
12892
+ .make-progress.size-small > .bar { height:4px; }
12893
+ .make-progress.size-large > .bar { height:14px; }
12894
+ .make-progress.shape-square { border-radius:0; }
12895
+ .make-progress.shape-square > .bar { border-radius:0; }
12896
+
12897
+ /* make-table */
12898
+ .make-table { width:100%; border-collapse:collapse; font-size:14px; }
12899
+ .make-table th,.make-table td { padding:10px 12px; text-align:left; border-bottom:1px solid #e5e7eb; }
12900
+ .make-table thead tr { background:#f9fafb; }
12901
+ .make-table thead th { font-weight:600; color:#374151; font-size:12px; text-transform:uppercase; letter-spacing:.05em; }
12902
+ .make-table.style-striped tbody tr:nth-child(even) { background:#f9fafb; }
12903
+ .make-table.style-bordered { border:1px solid #e5e7eb; }
12904
+ .make-table.style-bordered th,.make-table.style-bordered td { border:1px solid #e5e7eb; }
12905
+ .make-table.style-hover tbody tr:hover { background:#f3f4f6; cursor:pointer; }
12906
+ .make-table.style-dark { background:#1e293b; color:#f1f5f9; }
12907
+ .make-table.style-dark th,.make-table.style-dark td { border-color:#334155; }
12908
+ .make-table.style-dark thead tr { background:#0f172a; }
12909
+ .make-table.size-small th,.make-table.size-small td { padding:6px 10px; font-size:13px; }
12910
+ .make-table.size-large th,.make-table.size-large td { padding:14px 16px; font-size:15px; }
12911
+
12912
+ /* make-navbar */
12913
+ .make-navbar { display:flex; align-items:center; justify-content:space-between; padding:12px 24px; background:#fff; border-bottom:1px solid #e5e7eb; gap:16px; }
12914
+ .make-navbar.style-dark { background:#1e293b; border-color:#334155; color:#f1f5f9; }
12915
+ .make-navbar.style-glass { background:rgba(255,255,255,.8); backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px); }
12916
+ .make-navbar.style-transparent { background:transparent; border-color:transparent; }
12917
+ .make-navbar.style-dark.style-glass { background:rgba(15,23,42,.85); }
12918
+ .make-navbar.size-small { padding:8px 16px; }
12919
+ .make-navbar.size-large { padding:20px 32px; }
12920
+ .make-navbar.shape-sticky { position:sticky; top:0; z-index:50; }
12921
+
12922
+ /* make-tooltip */
12923
+ .make-tooltip { position:relative; display:inline-block; }
12924
+ .make-tooltip .tip { visibility:hidden; opacity:0; position:absolute; z-index:100; background:#1f2937; color:#f9fafb; font-size:12px; padding:5px 10px; border-radius:6px; white-space:nowrap; pointer-events:none; transition:opacity .15s; line-height:1.4; }
12925
+ .make-tooltip:hover .tip { visibility:visible; opacity:1; }
12926
+ .make-tooltip.style-top .tip { bottom:calc(100% + 8px); left:50%; transform:translateX(-50%); }
12927
+ .make-tooltip.style-bottom .tip { top:calc(100% + 8px); left:50%; transform:translateX(-50%); }
12928
+ .make-tooltip.style-left .tip { right:calc(100% + 8px); top:50%; transform:translateY(-50%); }
12929
+ .make-tooltip.style-right .tip { left:calc(100% + 8px); top:50%; transform:translateY(-50%); }
12930
+ .make-tooltip.style-light .tip { background:#fff; color:#111827; box-shadow:0 4px 12px rgba(0,0,0,.15); }
12931
+
12932
+ /* make-notification */
12933
+ .make-notification { display:flex; align-items:flex-start; gap:12px; padding:14px 16px; border-radius:10px; font-size:14px; border:1px solid transparent; line-height:1.4; }
12934
+ .make-notification.style-info { background:#eff6ff; border-color:#bfdbfe; color:#1d4ed8; }
12935
+ .make-notification.style-success { background:#f0fdf4; border-color:#bbf7d0; color:#15803d; }
12936
+ .make-notification.style-warning { background:#fffbeb; border-color:#fde68a; color:#b45309; }
12937
+ .make-notification.style-danger { background:#fef2f2; border-color:#fecaca; color:#b91c1c; }
12938
+ .make-notification.style-dark { background:#1e293b; border-color:#334155; color:#f1f5f9; }
12939
+ .make-notification.size-small { padding:10px 12px; font-size:13px; }
12940
+ .make-notification.size-large { padding:20px; font-size:15px; }
12941
+
12942
+ /* make-modal */
12943
+ .make-modal { position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:200; display:none; align-items:center; justify-content:center; padding:16px; }
12944
+ .make-modal:target { display:flex; }
12945
+ .make-modal > .box { background:#fff; border-radius:16px; box-shadow:0 25px 50px -12px rgba(0,0,0,.25); max-width:560px; width:100%; max-height:90vh; overflow-y:auto; animation:santy-zoom-in .25s ease; }
12946
+ .make-modal.size-small > .box { max-width:400px; }
12947
+ .make-modal.size-large > .box { max-width:768px; }
12948
+ .make-modal.size-xl > .box { max-width:1024px; }
12949
+ .make-modal.size-full > .box { max-width:100%; height:100vh; border-radius:0; max-height:100vh; }
12950
+ .make-modal.shape-square > .box { border-radius:0; }
12951
+ .make-modal.style-dark > .box { background:#1e293b; color:#f1f5f9; }
12952
+
12953
+ /* make-drawer */
12954
+ .make-drawer { position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:200; display:none; }
12955
+ .make-drawer:target { display:block; }
12956
+ .make-drawer > .panel { position:fixed; top:0; bottom:0; left:0; width:300px; background:#fff; z-index:201; overflow-y:auto; box-shadow:4px 0 24px rgba(0,0,0,.12); transform:translateX(-100%); transition:transform .3s ease; }
12957
+ .make-drawer:target > .panel { transform:translateX(0); }
12958
+ .make-drawer.style-right > .panel { left:auto; right:0; transform:translateX(100%); box-shadow:-4px 0 24px rgba(0,0,0,.12); }
12959
+ .make-drawer:target.style-right > .panel { transform:translateX(0); }
12960
+ .make-drawer.style-dark > .panel { background:#1e293b; color:#f1f5f9; }
12961
+ .make-drawer.size-small > .panel { width:220px; }
12962
+ .make-drawer.size-large > .panel { width:420px; }
12963
+
12964
+ /* make-accordion */
12965
+ .make-accordion { border:1px solid #e5e7eb; border-radius:10px; overflow:hidden; }
12966
+ .make-accordion.style-flush { border:none; border-radius:0; }
12967
+ .make-accordion.style-dark { background:#1e293b; border-color:#334155; color:#f1f5f9; }
12968
+ .make-accordion.shape-square { border-radius:0; }
12969
+ .make-accordion.shape-rounded { border-radius:16px; }
12970
+
12971
+ /* make-dropdown */
12972
+ .make-dropdown { position:relative; display:inline-block; }
12973
+ .make-dropdown > .menu { display:none; position:absolute; top:calc(100% + 4px); left:0; min-width:180px; background:#fff; border:1px solid #e5e7eb; border-radius:10px; box-shadow:0 8px 24px rgba(0,0,0,.1); z-index:100; overflow:hidden; padding:4px; }
12974
+ .make-dropdown.open > .menu { display:block; }
12975
+ .make-dropdown.style-right > .menu { left:auto; right:0; }
12976
+ .make-dropdown.style-top > .menu { top:auto; bottom:calc(100% + 4px); }
12977
+ .make-dropdown.style-dark > .menu { background:#1e293b; border-color:#334155; }
12978
+ .make-dropdown.size-small > .menu { min-width:140px; font-size:13px; }
12979
+ .make-dropdown.size-large > .menu { min-width:240px; font-size:15px; }
12980
+
12451
12981
  /* ── Dark Mode Component Variants ── */
12452
12982
  @media (prefers-color-scheme: dark) {
12453
12983
  .dark-auto .card { background-color: #1e293b; }