diff --git a/themes/Ying/assets/css/aos.css b/themes/Ying/assets/css/aos.css new file mode 100644 index 00000000..0b8ebcb4 --- /dev/null +++ b/themes/Ying/assets/css/aos.css @@ -0,0 +1 @@ +[data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[data-aos-delay="750"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="850"],body[data-aos-duration="850"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay="850"],body[data-aos-delay="850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="850"].aos-animate,body[data-aos-delay="850"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration="900"],body[data-aos-duration="900"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay="900"],body[data-aos-delay="900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="900"].aos-animate,body[data-aos-delay="900"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration="950"],body[data-aos-duration="950"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay="950"],body[data-aos-delay="950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="950"].aos-animate,body[data-aos-delay="950"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration="1050"],body[data-aos-duration="1050"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay="1050"],body[data-aos-delay="1050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1050"].aos-animate,body[data-aos-delay="1050"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration="1100"],body[data-aos-duration="1100"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay="1100"],body[data-aos-delay="1100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1100"].aos-animate,body[data-aos-delay="1100"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration="1150"],body[data-aos-duration="1150"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay="1150"],body[data-aos-delay="1150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1150"].aos-animate,body[data-aos-delay="1150"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration="1200"],body[data-aos-duration="1200"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay="1200"],body[data-aos-delay="1200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1200"].aos-animate,body[data-aos-delay="1200"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration="1250"],body[data-aos-duration="1250"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay="1250"],body[data-aos-delay="1250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1250"].aos-animate,body[data-aos-delay="1250"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration="1300"],body[data-aos-duration="1300"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay="1300"],body[data-aos-delay="1300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1300"].aos-animate,body[data-aos-delay="1300"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration="1350"],body[data-aos-duration="1350"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay="1350"],body[data-aos-delay="1350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1350"].aos-animate,body[data-aos-delay="1350"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration="1400"],body[data-aos-duration="1400"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay="1400"],body[data-aos-delay="1400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1400"].aos-animate,body[data-aos-delay="1400"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration="1450"],body[data-aos-duration="1450"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay="1450"],body[data-aos-delay="1450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1450"].aos-animate,body[data-aos-delay="1450"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration="1500"],body[data-aos-duration="1500"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay="1500"],body[data-aos-delay="1500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1500"].aos-animate,body[data-aos-delay="1500"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration="1550"],body[data-aos-duration="1550"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay="1550"],body[data-aos-delay="1550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1550"].aos-animate,body[data-aos-delay="1550"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration="1600"],body[data-aos-duration="1600"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay="1600"],body[data-aos-delay="1600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1600"].aos-animate,body[data-aos-delay="1600"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration="1650"],body[data-aos-duration="1650"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay="1650"],body[data-aos-delay="1650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1650"].aos-animate,body[data-aos-delay="1650"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration="1700"],body[data-aos-duration="1700"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay="1700"],body[data-aos-delay="1700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1700"].aos-animate,body[data-aos-delay="1700"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration="1750"],body[data-aos-duration="1750"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay="1750"],body[data-aos-delay="1750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1750"].aos-animate,body[data-aos-delay="1750"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration="1800"],body[data-aos-duration="1800"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay="1800"],body[data-aos-delay="1800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1800"].aos-animate,body[data-aos-delay="1800"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration="1850"],body[data-aos-duration="1850"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay="1850"],body[data-aos-delay="1850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1850"].aos-animate,body[data-aos-delay="1850"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration="1900"],body[data-aos-duration="1900"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay="1900"],body[data-aos-delay="1900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1900"].aos-animate,body[data-aos-delay="1900"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration="1950"],body[data-aos-duration="1950"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay="1950"],body[data-aos-delay="1950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1950"].aos-animate,body[data-aos-delay="1950"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration="2000"],body[data-aos-duration="2000"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay="2000"],body[data-aos-delay="2000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2000"].aos-animate,body[data-aos-delay="2000"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration="2050"],body[data-aos-duration="2050"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay="2050"],body[data-aos-delay="2050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2050"].aos-animate,body[data-aos-delay="2050"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration="2100"],body[data-aos-duration="2100"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay="2100"],body[data-aos-delay="2100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2100"].aos-animate,body[data-aos-delay="2100"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration="2150"],body[data-aos-duration="2150"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay="2150"],body[data-aos-delay="2150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2150"].aos-animate,body[data-aos-delay="2150"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration="2200"],body[data-aos-duration="2200"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay="2200"],body[data-aos-delay="2200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2200"].aos-animate,body[data-aos-delay="2200"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration="2250"],body[data-aos-duration="2250"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay="2250"],body[data-aos-delay="2250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2250"].aos-animate,body[data-aos-delay="2250"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration="2300"],body[data-aos-duration="2300"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay="2300"],body[data-aos-delay="2300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2300"].aos-animate,body[data-aos-delay="2300"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration="2350"],body[data-aos-duration="2350"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay="2350"],body[data-aos-delay="2350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2350"].aos-animate,body[data-aos-delay="2350"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration="2400"],body[data-aos-duration="2400"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay="2400"],body[data-aos-delay="2400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2400"].aos-animate,body[data-aos-delay="2400"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration="2450"],body[data-aos-duration="2450"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay="2450"],body[data-aos-delay="2450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2450"].aos-animate,body[data-aos-delay="2450"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration="2500"],body[data-aos-duration="2500"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay="2500"],body[data-aos-delay="2500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2500"].aos-animate,body[data-aos-delay="2500"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration="2550"],body[data-aos-duration="2550"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay="2550"],body[data-aos-delay="2550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2550"].aos-animate,body[data-aos-delay="2550"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration="2600"],body[data-aos-duration="2600"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay="2600"],body[data-aos-delay="2600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2600"].aos-animate,body[data-aos-delay="2600"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration="2650"],body[data-aos-duration="2650"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay="2650"],body[data-aos-delay="2650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2650"].aos-animate,body[data-aos-delay="2650"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration="2700"],body[data-aos-duration="2700"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay="2700"],body[data-aos-delay="2700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2700"].aos-animate,body[data-aos-delay="2700"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration="2750"],body[data-aos-duration="2750"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay="2750"],body[data-aos-delay="2750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2750"].aos-animate,body[data-aos-delay="2750"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration="2800"],body[data-aos-duration="2800"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay="2800"],body[data-aos-delay="2800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2800"].aos-animate,body[data-aos-delay="2800"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration="2850"],body[data-aos-duration="2850"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay="2850"],body[data-aos-delay="2850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2850"].aos-animate,body[data-aos-delay="2850"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration="2900"],body[data-aos-duration="2900"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay="2900"],body[data-aos-delay="2900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2900"].aos-animate,body[data-aos-delay="2900"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration="2950"],body[data-aos-duration="2950"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay="2950"],body[data-aos-delay="2950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2950"].aos-animate,body[data-aos-delay="2950"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration="3000"],body[data-aos-duration="3000"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay="3000"],body[data-aos-delay="3000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="3000"].aos-animate,body[data-aos-delay="3000"] [data-aos].aos-animate{transition-delay:3s}[data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,transform}[data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;transform:translateZ(0)}[data-aos=fade-up]{transform:translate3d(0,100px,0)}[data-aos=fade-down]{transform:translate3d(0,-100px,0)}[data-aos=fade-right]{transform:translate3d(-100px,0,0)}[data-aos=fade-left]{transform:translate3d(100px,0,0)}[data-aos=fade-up-right]{transform:translate3d(-100px,100px,0)}[data-aos=fade-up-left]{transform:translate3d(100px,100px,0)}[data-aos=fade-down-right]{transform:translate3d(-100px,-100px,0)}[data-aos=fade-down-left]{transform:translate3d(100px,-100px,0)}[data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,transform}[data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;transform:translateZ(0) scale(1)}[data-aos=zoom-in]{transform:scale(.6)}[data-aos=zoom-in-up]{transform:translate3d(0,100px,0) scale(.6)}[data-aos=zoom-in-down]{transform:translate3d(0,-100px,0) scale(.6)}[data-aos=zoom-in-right]{transform:translate3d(-100px,0,0) scale(.6)}[data-aos=zoom-in-left]{transform:translate3d(100px,0,0) scale(.6)}[data-aos=zoom-out]{transform:scale(1.2)}[data-aos=zoom-out-up]{transform:translate3d(0,100px,0) scale(1.2)}[data-aos=zoom-out-down]{transform:translate3d(0,-100px,0) scale(1.2)}[data-aos=zoom-out-right]{transform:translate3d(-100px,0,0) scale(1.2)}[data-aos=zoom-out-left]{transform:translate3d(100px,0,0) scale(1.2)}[data-aos^=slide][data-aos^=slide]{transition-property:transform}[data-aos^=slide][data-aos^=slide].aos-animate{transform:translateZ(0)}[data-aos=slide-up]{transform:translate3d(0,100%,0)}[data-aos=slide-down]{transform:translate3d(0,-100%,0)}[data-aos=slide-right]{transform:translate3d(-100%,0,0)}[data-aos=slide-left]{transform:translate3d(100%,0,0)}[data-aos^=flip][data-aos^=flip]{backface-visibility:hidden;transition-property:transform}[data-aos=flip-left]{transform:perspective(2500px) rotateY(-100deg)}[data-aos=flip-left].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-right]{transform:perspective(2500px) rotateY(100deg)}[data-aos=flip-right].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-up]{transform:perspective(2500px) rotateX(-100deg)}[data-aos=flip-up].aos-animate{transform:perspective(2500px) rotateX(0)}[data-aos=flip-down]{transform:perspective(2500px) rotateX(100deg)}[data-aos=flip-down].aos-animate{transform:perspective(2500px) rotateX(0)} diff --git a/themes/Ying/assets/css/main.css b/themes/Ying/assets/css/main.css index 3ba5b819..48d241aa 100644 --- a/themes/Ying/assets/css/main.css +++ b/themes/Ying/assets/css/main.css @@ -3085,6 +3085,63 @@ input[type=submit] { --at-color-bg-grey: #f9f9f9 !important; } +/* Loading Skeleton */ +.atk-loading-placeholder { + padding: 20px 0; +} + +.atk-loading-item { + display: flex; + margin-bottom: 20px; + padding: 10px 0; + /* border-bottom: 1px dashed var(--at-color-border); */ /* Optional */ +} + +.atk-loading-avatar { + width: 32px; + height: 32px; + border-radius: 50%; + background-color: #f2f2f2; + margin-right: 15px; + margin-top: 5px; + flex-shrink: 0; +} + +.atk-loading-content { + flex: 1; +} + +.atk-loading-line { + height: 10px; + background-color: #f2f2f2; + border-radius: 4px; + margin-bottom: 8px; +} + +.atk-loading-line.width-name { width: 100px; height: 12px; margin-bottom: 12px; } +.atk-loading-line.width-80 { width: 80%; } +.atk-loading-line.width-60 { width: 60%; } +.atk-loading-line.width-40 { width: 40%; } + +/* Shimmer Effect */ +@keyframes atk-skeleton-shimmer { + 0% { background-position: -200% 0; } + 100% { background-position: 200% 0; } +} + +.atk-loading-avatar, .atk-loading-line { + background: linear-gradient(90deg, #f0f0f0 25%, #f8f8f8 50%, #f0f0f0 75%); + background-size: 200% 100%; + animation: atk-skeleton-shimmer 1.5s infinite; +} + +/* Dark Mode Skeleton */ +[data-theme="dark"] .atk-loading-avatar, +[data-theme="dark"] .atk-loading-line { + background: linear-gradient(90deg, #2a2a2a 25%, #333 50%, #2a2a2a 75%); + background-size: 200% 100%; +} + /* Layout & Spacing */ .atk-comment { padding: 10px 0 !important; } .atk-list-read-more { padding-bottom: 0 !important; } diff --git a/themes/Ying/assets/js/aos.js b/themes/Ying/assets/js/aos.js new file mode 100644 index 00000000..4f8f6dec --- /dev/null +++ b/themes/Ying/assets/js/aos.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,j),(0,b.default)(w,j.once),w},_=function(){w=(0,h.default)(),O()},S=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},z=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},A=function(e){return j=i(j,e),w=(0,h.default)(),z(j.disable)||x?S():(document.querySelector("body").setAttribute("data-aos-easing",j.easing),document.querySelector("body").setAttribute("data-aos-duration",j.duration),document.querySelector("body").setAttribute("data-aos-delay",j.delay),"DOMContentLoaded"===j.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?O(!0):"load"===j.startEvent?window.addEventListener(j.startEvent,function(){O(!0)}):document.addEventListener(j.startEvent,function(){O(!0)}),window.addEventListener("resize",(0,f.default)(O,j.debounceDelay,!0)),window.addEventListener("orientationchange",(0,f.default)(O,j.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,j.once)},j.throttleDelay)),j.disableMutationObserver||(0,d.default)("[data-aos]",_),w)};e.exports={init:A,refresh:O,refreshHard:_}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(f);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return s;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f="Expected a function",s=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==s}function a(e){if("number"==typeof e)return e;if(r(e))return f;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",f=NaN,s="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e,t){var n=new r(o);a=t,n.observe(i.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function o(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),n=Array.prototype.slice.call(e.removedNodes),o=t.concat(n).filter(function(e){return e.hasAttribute&&e.hasAttribute("data-aos")}).length;o&&a()})}Object.defineProperty(t,"__esModule",{value:!0});var i=window.document,r=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=function(){};t.default=n},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;ne.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])}); diff --git a/themes/Ying/assets/js/main.js b/themes/Ying/assets/js/main.js index 40bd93f1..4b10feac 100644 --- a/themes/Ying/assets/js/main.js +++ b/themes/Ying/assets/js/main.js @@ -55,6 +55,8 @@ $(document).ready(function () { $("#loader").addClass("hide"); }, 30000); }); + + // 点击进入按钮 $("#closeloader").click(function () { $("#loader").addClass("hide"); @@ -98,938 +100,91 @@ window.initArtalk = function() { // Optional: Retry logic could be added here if needed, but usually bundle is loaded by now return; } - - var isDark = document.documentElement.getAttribute('data-theme') === 'dark'; - // Initialize Artalk - window.artalk = Artalk.init({ - el: window.artalkConfig.el || '#Comments', - server: window.artalkConfig.server, - site: window.artalkConfig.site, - pageKey: window.artalkConfig.pageKey, // Dynamic pageKey from config - flatMode: true, - darkMode: isDark, - emoticons: window.artalkConfig.emoticons - }); + // Check if Artalk is already initialized on this container to avoid duplicates + // But Artalk.init usually handles this or we create a new instance. + // Since we want to re-bind to the new DOM after PJAX, we create a new instance. + + // Clean up previous instance if needed? Artalk doesn't strictly require explicit destroy if DOM is removed, + // but it's good practice. For now, we assume simple re-init is fine. - // Inject AI Comment & Lazy Load & Animation - window.artalk.on('list-loaded', function() { - // 1. Lazy Load Logic - var artalkImages = document.querySelectorAll('.atk-list-body img'); - artalkImages.forEach(function (img) { - var src = img.getAttribute('src'); - // Check if it's already lazy loaded or placeholder - if (src && !img.getAttribute('data-lazy-src') && src.indexOf('data:image') !== 0) { - img.setAttribute('data-lazy-src', src); - img.setAttribute('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='); - } - }); + try { + var artalk = Artalk.init(window.artalkConfig); + window.artalk = artalk; // Expose to window for other scripts - // 2. Animation Logic - var comments = document.querySelectorAll('.atk-list-body .atk-comment'); - if (comments) { - comments.forEach(function (comment, index) { - comment.classList.add('atk-comment-animate'); - comment.style.animationDelay = (index * 0.04) + 's'; - }); - } - - // 3. Trigger global lazy load update - if (window.lazyLoadAgain) { - window.lazyLoadAgain(); - } - - // 4. AI Comment Logic - if (window.artalkConfig.aiComment) { - // Force hide "No comments" message via CSS class - var list = document.querySelector('.atk-list'); - if (list) { - list.classList.add('has-ai-comment'); - } - - if (!document.querySelector('.atk-ai-comment')) { - var listBody = document.querySelector('.atk-list-body') || document.querySelector('.atk-list'); - if (listBody) { - var aiData = window.artalkConfig.aiComment; - var aiDiv = document.createElement('div'); - aiDiv.className = 'atk-comment atk-ai-comment'; - // Initially empty content for typewriter effect - aiDiv.innerHTML = ` -
- -
-
-
- ${aiData.name} - BOT - ${aiData.date} -
-
-
-

+ // Handle list-loaded event for lazy loading avatars and animations + artalk.on('list-loaded', function() { + // Restore AI Comment if configured + if (window.artalkConfig.aiComment) { + var ai = window.artalkConfig.aiComment; + var listBody = document.querySelector('.atk-list .atk-list-body'); + if (listBody && !listBody.querySelector('.atk-ai-comment')) { + var aiCommentHtml = ` +
+
+ ${ai.name} +
+
+
+ ${ai.name} + AI + ${ai.date} +
+
+
${ai.content}
+
-
- `; - listBody.prepend(aiDiv); - - // Typewriter Effect - const contentEl = aiDiv.querySelector('.ai-content-text'); - const text = aiData.content; - let i = 0; - - function type() { - if (i < text.length) { - contentEl.textContent += text.charAt(i); - i++; - // Random delay for more natural typing (20-50ms) - setTimeout(type, Math.random() * 30 + 20); + `; + listBody.insertAdjacentHTML('afterbegin', aiCommentHtml); + + // Hide "No Comment" placeholder if it exists + var noComment = document.querySelector('.atk-list-no-comment'); + if (noComment) { + noComment.style.display = 'none'; } } + } + + // Add staggered animation to the comment list + var list = document.querySelector('.atk-list'); + if (list) { + list.setAttribute('uk-scrollspy', 'target: > .atk-comment-wrap; cls: uk-animation-slide-bottom-small; delay: 50'); + } + + // Apply granular animations to inner elements (Avatar, Nickname, Main Content) + // Note: We already added attributes to AI comment above, but this loop ensures all other comments get it too. + // Duplicate attributes on AI comment are harmless or we can skip it. + document.querySelectorAll('.atk-comment-wrap:not(.atk-ai-comment)').forEach(function(wrap) { + var avatar = wrap.querySelector('.atk-avatar'); + if (avatar) avatar.setAttribute('uk-scrollspy', 'cls: uk-animation-scale-up; delay: 200'); - // Start typing after a short delay - setTimeout(type, 500); - } - } - } -}); + var main = wrap.querySelector('.atk-main'); + if (main) main.setAttribute('uk-scrollspy', 'cls: uk-animation-slide-right-small; delay: 300'); + + var nick = wrap.querySelector('.atk-nick'); + if (nick) nick.setAttribute('uk-scrollspy', 'cls: uk-animation-slide-top-small; delay: 350'); + }); - // Artalk 初始化完成后,再加载弹幕 (If available) - if (typeof isMobile === 'function' && !isMobile() && window.loadBarrager) { - window.loadBarrager(); - } -}; - -async function fetchHitokoto() { - try { - const response = await fetch('https://v1.hitokoto.cn/?c=d&c=i'); // 获取句子 - const data = await response.json(); - return data.hitokoto; - } catch (error) { - console.error('获取一言失败:', error); - return null; - } -} - -// 代码块复制功能 -function initCodeCopy() { - const codeBlocks = document.querySelectorAll('.post-content pre code'); - - codeBlocks.forEach(codeBlock => { - // 检查是否已经添加了复制按钮,避免重复添加 - if (codeBlock.parentNode.querySelector('.copy-code-btn')) return; - - const pre = codeBlock.parentNode; - pre.style.position = 'relative'; - - const copyBtn = document.createElement('button'); - copyBtn.className = 'copy-code-btn'; - copyBtn.innerHTML = ''; // 使用 RemixIcon - copyBtn.title = '复制代码'; - - // 样式 (建议放到 CSS 文件中) - copyBtn.style.position = 'absolute'; - copyBtn.style.top = '5px'; - copyBtn.style.right = '5px'; - copyBtn.style.border = 'none'; - copyBtn.style.background = 'transparent'; - copyBtn.style.color = '#999'; - copyBtn.style.cursor = 'pointer'; - copyBtn.style.padding = '5px'; - copyBtn.style.borderRadius = '4px'; - copyBtn.style.transition = 'all 0.3s'; - - // Hover 效果 - copyBtn.addEventListener('mouseenter', () => { - copyBtn.style.color = '#333'; - copyBtn.style.background = 'rgba(0,0,0,0.1)'; - }); - copyBtn.addEventListener('mouseleave', () => { - copyBtn.style.color = '#999'; - copyBtn.style.background = 'transparent'; - }); - - copyBtn.addEventListener('click', () => { - const code = codeBlock.innerText; - navigator.clipboard.writeText(code).then(() => { - copyBtn.innerHTML = ''; - setTimeout(() => { - copyBtn.innerHTML = ''; - }, 2000); - - Qmsg.success("代码复制成功"); - }).catch(err => { - console.error('复制失败:', err); - copyBtn.innerHTML = ''; - Qmsg.error("复制失败"); - }); - }); - - pre.appendChild(copyBtn); - }); -} - -// 代码折叠功能 -function initCodeFold() { - const threshold = 360; - - // Helper to wrap element - const wrap = (el, wrapper) => { - el.parentNode.insertBefore(wrapper, el); - wrapper.appendChild(el); - }; - - // 1. Process .highlight blocks (Hugo generated) - document.querySelectorAll('.highlight').forEach(hl => { - if (hl.closest('.code-fold-container')) return; // Avoid double processing - - // Check height - if (hl.scrollHeight > threshold) { - const wrapper = document.createElement('div'); - wrapper.className = 'code-fold-container collapsed'; - - // Wrap the highlight block - wrap(hl, wrapper); - - const btn = document.createElement('button'); - btn.className = 'code-expand-btn'; - // Use FontAwesome for reliability - btn.innerHTML = ' 展开代码'; - - btn.addEventListener('click', () => { - wrapper.classList.remove('collapsed'); - btn.remove(); - }); - - wrapper.appendChild(btn); - } - }); - - // 2. Process bare pre blocks (Fallback) - document.querySelectorAll('.post-content > pre').forEach(pre => { - if (pre.parentNode.classList.contains('highlight')) return; - if (pre.closest('.code-fold-container')) return; - if (pre.closest('.code-wrapper')) return; // Old wrapper check - - if (pre.scrollHeight > threshold) { - const wrapper = document.createElement('div'); - wrapper.className = 'code-fold-container collapsed'; - - wrap(pre, wrapper); - - const btn = document.createElement('button'); - btn.className = 'code-expand-btn'; - btn.innerHTML = ' 展开代码'; - - btn.addEventListener('click', () => { - wrapper.classList.remove('collapsed'); - btn.remove(); - }); - wrapper.appendChild(btn); - } - }); -} - -// 页面加载完成后初始化 -document.addEventListener('DOMContentLoaded', function() { - initCodeCopy(); - initCodeFold(); - initDescriptionHitokoto(); -}); - -// 初始化个人描述一言切换 -function initDescriptionHitokoto() { - const descEl = document.querySelector('.yiyandes'); - if (!descEl) return; - - descEl.title = '点击切换一言'; - - descEl.addEventListener('click', async () => { - if (descEl.dataset.loading === 'true') return; - - descEl.dataset.loading = 'true'; - const originalText = descEl.innerText; - descEl.innerText = '正在获取灵感...'; - - const hitokoto = await fetchHitokoto(); - - if (hitokoto) { - typeWriter(descEl, hitokoto); - } else { - descEl.innerText = originalText; - descEl.dataset.loading = 'false'; - } - }); -} - -// 打字机效果 -function typeWriter(element, text, speed = 100) { - element.innerText = ''; - element.classList.add('typing'); - let i = 0; - - function type() { - if (i < text.length) { - element.innerText += text.charAt(i); - i++; - setTimeout(type, speed); - } else { - element.dataset.loading = 'false'; - element.classList.remove('typing'); - } - } - - type(); -} - -// 友链信息一键复制 -function copySzhContent() { - var szhElement = document.getElementById('szh'); - if (szhElement) { - var textToCopy = szhElement.innerText; - navigator.clipboard.writeText(textToCopy).then(function() { - Qmsg.success("复制成功"); - }).catch(function(err) { - console.error('Could not copy text: ', err); - Qmsg.error("复制失败"); - }); - } -} - -// Update Theme Icon -function updateThemeIcon(isDark) { - const toggleBtns = document.querySelectorAll('#theme-toggle'); - toggleBtns.forEach(btn => { - const icon = btn.querySelector('i'); - if (icon) { - // Add rotation class for animation - btn.classList.add('rotate'); - setTimeout(() => btn.classList.remove('rotate'), 500); - - // Switch icon - if (isDark) { - icon.className = 'ri-moon-line'; - } else { - icon.className = 'ri-sun-line'; - } - } - }); -} - -// Theme Toggle Logic -function toggleTheme() { - const currentTheme = document.documentElement.getAttribute('data-theme'); - const newTheme = currentTheme === 'dark' ? 'light' : 'dark'; - const isDark = newTheme === 'dark'; - - document.documentElement.setAttribute('data-theme', newTheme); - localStorage.setItem('theme', newTheme); - - // Update Icon - updateThemeIcon(isDark); - - // Optimize: Defer heavy Artalk update to avoid blocking UI animation - setTimeout(() => { - // Notify Artalk if present (Instance or Static) - if (window.artalk && typeof window.artalk.setDarkMode === 'function') { - window.artalk.setDarkMode(isDark); - } else if (window.Artalk && typeof Artalk.setDarkMode === 'function') { - Artalk.setDarkMode(isDark); - } - }, 50); -} - -// Listen for system theme changes -try { - const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); - const handleSystemThemeChange = (e) => { - // Only follow system if user hasn't manually set a preference - if (!localStorage.getItem('theme')) { - const newTheme = e.matches ? 'dark' : 'light'; - document.documentElement.setAttribute('data-theme', newTheme); + // Find all avatars in the comment list + var avatars = document.querySelectorAll('.atk-list .atk-avatar img'); + avatars.forEach(function(img) { + var src = img.getAttribute('src'); + if (src) { + img.setAttribute('data-lazy-src', src); + img.removeAttribute('src'); + img.classList.add('lazyload'); // Add class if your lazyloader needs it + } + }); - updateThemeIcon(newTheme === 'dark'); - - // Notify Artalk - if (window.artalk && typeof window.artalk.setDarkMode === 'function') { - window.artalk.setDarkMode(newTheme === 'dark'); - } else if (window.Artalk && typeof Artalk.setDarkMode === 'function') { - Artalk.setDarkMode(newTheme === 'dark'); - } - } - }; - - // Modern browsers - if (mediaQuery.addEventListener) { - mediaQuery.addEventListener('change', handleSystemThemeChange); - } else if (mediaQuery.addListener) { - // Old Safari/IE - mediaQuery.addListener(handleSystemThemeChange); - } -} catch (e) { - console.warn('System theme detection not supported', e); -} - -// Update Floating Tools Visibility based on current page -function updateFloatingToolsVisibility() { - const tools = document.querySelector('.floating-tools'); - if (!tools) return; - - // Hide on Homepage - const isHome = window.location.pathname === '/' || window.location.pathname === '/index.html'; - if (isHome) { - tools.style.display = 'none'; - } else { - tools.style.display = 'flex'; - } - - // Hide Comment button if no comments section - const commentBtn = document.getElementById('to-comments'); - if (commentBtn) { - const commentsSection = document.getElementById('Comments'); - commentBtn.style.display = commentsSection ? 'flex' : 'none'; - } -} - -// Floating Tools Initialization -function initFloatingTools() { - // Initialize Theme Icon based on current theme - const currentTheme = document.documentElement.getAttribute('data-theme'); - const isDark = currentTheme === 'dark'; - const toggleBtns = document.querySelectorAll('#theme-toggle'); - toggleBtns.forEach(btn => { - const icon = btn.querySelector('i'); - if (icon) { - if (isDark) { - icon.className = 'ri-moon-line'; - } else { - icon.className = 'ri-sun-line'; - } - } - }); - - // Initial visibility check - updateFloatingToolsVisibility(); - - // Prevent multiple event bindings - if (window.floatingToolsInitialized) return; - window.floatingToolsInitialized = true; - - // Use Event Delegation for robust handling - document.addEventListener('click', function(e) { - // Theme Toggle - const toggleBtn = e.target.closest('#theme-toggle'); - if (toggleBtn) { - e.preventDefault(); - toggleTheme(); - } - - // Jump to Comments - const commentBtn = e.target.closest('#to-comments'); - if (commentBtn) { - e.preventDefault(); - const commentsSection = document.getElementById('Comments'); - if (commentsSection) { - commentsSection.scrollIntoView({ behavior: 'smooth' }); - } - } - }); - - // Theme Toggle (Avatar) - const avatar = document.querySelector('.head_author_img'); - if (avatar) { - avatar.addEventListener('click', function(e) { - e.preventDefault(); - toggleTheme(); - }); - } -} - -// Listen for PJAX complete to update visibility -document.addEventListener('pjax:complete', function() { - updateFloatingToolsVisibility(); - hideSelectionPopup(); - // PJAX 跳转后重新加载弹幕 (Moved to barrage.js) -}); - -document.addEventListener('DOMContentLoaded', function() { - initFloatingTools(); - initSelectionPopup(); - initCodeCopy(); - initDescriptionHitokoto(); - // 页面首次加载时启动弹幕 (Moved to barrage.js) -}); - -// Selection Popup Logic -let selectionPopup = null; -let selectionTimeout; - -function initSelectionPopup() { - if (document.getElementById('selection-popup')) return; - - selectionPopup = document.createElement('div'); - selectionPopup.id = 'selection-popup'; - selectionPopup.innerHTML = ' 引用评论'; - document.body.appendChild(selectionPopup); - - // Prevent mousedown on popup from clearing selection - selectionPopup.addEventListener('mousedown', function(e) { - e.preventDefault(); - e.stopPropagation(); - }); - - // Handle click on popup - selectionPopup.addEventListener('click', function(e) { - e.preventDefault(); - e.stopPropagation(); - - let selection = window.getSelection().toString(); - // Optimize: Remove extra whitespace and limit length - if (selection) { - // Collapse multiple empty lines into max 2 newlines, and trim each line - selection = selection.split('\n') - .map(line => line.trim()) - .filter(line => line !== '') - .join('\n'); - - if (selection.length > 500) { - selection = selection.substring(0, 500) + '...'; - } - - scrollToCommentsAndQuote(selection); - hideSelectionPopup(); - window.getSelection().removeAllRanges(); - } - }); - - // Global listeners for selection - document.addEventListener('mouseup', handleSelectionChange); - document.addEventListener('keyup', handleSelectionChange); -} - -function hideSelectionPopup() { - if (selectionPopup) { - selectionPopup.style.display = 'none'; - } -} - -function handleSelectionChange(e) { - // Debounce to avoid rapid firing - clearTimeout(selectionTimeout); - selectionTimeout = setTimeout(() => { - const selection = window.getSelection(); - const text = selection.toString().trim(); - const content = document.querySelector('.post-content'); // Main article container - - if (!selectionPopup || !content) return; - - // Check if selection is empty - if (!text || selection.rangeCount === 0) { - hideSelectionPopup(); - return; - } - - const range = selection.getRangeAt(0); - - // Check if the common ancestor is inside .post-content - // Optimization: Check container existence before heavy contains check - if (!content.contains(range.commonAncestorContainer)) { - hideSelectionPopup(); - return; - } - - // Optimization: Use requestAnimationFrame for UI updates - requestAnimationFrame(() => { - // Show first to ensure measurements if needed (though we set top/left directly) - selectionPopup.style.display = 'flex'; - - // Position logic: Follow mouse if available (mouseup), else fallback to selection rect (keyup) - if (e && e.type === 'mouseup') { - // Optimization: Avoid getBoundingClientRect on mouseup - // Position above the mouse cursor - selectionPopup.style.top = `${e.clientY - 40}px`; - selectionPopup.style.left = `${e.clientX}px`; - } else { - // Fallback for keyboard selection (needs rect) - const rect = range.getBoundingClientRect(); - // Check if visible and valid - if (rect.width === 0 || rect.height === 0) { - hideSelectionPopup(); - return; - } - selectionPopup.style.top = `${rect.top}px`; - selectionPopup.style.left = `${rect.left + rect.width / 2}px`; + // Trigger lazy load update + // Assuming window.lazyLoadInstance is available or using the global function + if (window.lazyLoadAgain) { + window.lazyLoadAgain(); } }); - }, 150); -} - -function scrollToCommentsAndQuote(text) { - const comments = document.getElementById('Comments'); - if (comments) { - comments.scrollIntoView({ behavior: 'smooth' }); - // Wait for scroll to complete (approximate) - setTimeout(() => { - // Find Artalk textarea - const textarea = document.querySelector('.atk-textarea'); - if (textarea) { - const quote = `> ${text}\n\n`; - // Overwrite existing content as requested - textarea.value = quote; - textarea.focus(); - - // Trigger input event for Vue/React binding (Artalk uses Vue) - textarea.dispatchEvent(new Event('input', { bubbles: true })); - textarea.dispatchEvent(new Event('change', { bubbles: true })); - - if (window.Qmsg) { - Qmsg.success('引用成功'); - } - } - }, 500); - } -} - -/* Search Functionality */ -function initSearchFunctionality() { - const searchBtn = document.getElementById('search-btn'); - const searchModal = document.getElementById('search-modal'); - const closeSearch = document.querySelector('.close-search'); - const searchInput = document.getElementById('search-input'); - const searchResults = document.getElementById('search-results'); - const searchSubmit = document.getElementById('search-submit'); - - // Global variables (window scope) to persist across re-inits if needed, - // but better to keep them scoped if we re-fetch. - // For simplicity, we keep index loading check. - if (!window.searchIndex) window.searchIndex = []; - if (!window.isIndexLoaded) window.isIndexLoaded = false; - - if (!searchBtn || !searchModal) return; - - // Open Modal - // Use named function to avoid duplicate listeners if we didn't clean up (though init is usually called once per page load/pjax) - function openModal() { - searchModal.classList.add('show'); - if (!window.isIndexLoaded) { - loadSearchIndex(); - } - setTimeout(() => searchInput.focus(), 100); + } catch (e) { + console.error('Artalk init failed:', e); } - searchBtn.removeEventListener('click', openModal); // Prevent duplicates - searchBtn.addEventListener('click', openModal); - - // Close Modal - function closeModal() { - searchModal.classList.remove('show'); - } - - if (closeSearch) { - closeSearch.onclick = closeModal; - } - - // Close when clicking outside - window.onclick = function(e) { - if (e.target === searchModal) { - closeModal(); - } - }; - - // Close on Escape key - document.onkeydown = function(e) { - if (e.key === 'Escape' && searchModal.classList.contains('show')) { - closeModal(); - } - }; - - // Load Index - function loadSearchIndex() { - fetch('/index.json') - .then(response => response.json()) - .then(data => { - window.searchIndex = data; - window.isIndexLoaded = true; - }) - .catch(error => { - console.error('Error loading search index:', error); - if(searchResults) searchResults.innerHTML = '

搜索索引加载失败

'; - }); - } - - // Perform Search - function performSearch() { - if(!searchInput) return; - const query = searchInput.value.trim().toLowerCase(); - if (query === '') { - searchResults.innerHTML = '

输入关键词并回车进行搜索

'; - return; - } - - if (!window.isIndexLoaded) { - searchResults.innerHTML = '

正在加载索引...

'; - // Retry after a short delay if index is loading - setTimeout(performSearch, 500); - return; - } - - const results = window.searchIndex.filter(item => { - const title = item.title ? item.title.toLowerCase() : ''; - const summary = item.summary ? item.summary.toLowerCase() : ''; - return title.includes(query) || summary.includes(query); - }); - - displayResults(results); - } - - // Display Results - function displayResults(results) { - if (results.length === 0) { - searchResults.innerHTML = '

未找到相关文章

'; - return; - } - - let html = ''; - results.forEach(item => { - html += ` - - ${item.title} - ${item.date} -
${item.summary}
-
- `; - }); - searchResults.innerHTML = html; - if (window.pjax) window.pjax.refresh(searchResults); - - // Add click listener to close modal on result click - const resultLinks = searchResults.querySelectorAll('.search-result-item'); - resultLinks.forEach(link => { - link.addEventListener('click', function() { - closeModal(); - }); - }); - } - - // Event Listeners for Search - if (searchSubmit) { - searchSubmit.onclick = performSearch; - } - - if (searchInput) { - searchInput.onkeypress = function(e) { - if (e.key === 'Enter') { - performSearch(); - } - }; - - // Optional: Live search with debounce - let debounceTimer; - searchInput.oninput = function() { - clearTimeout(debounceTimer); - debounceTimer = setTimeout(performSearch, 300); - }; - } - - /* Inline Search Logic */ - const essayHeader = document.getElementById('essay-header'); - const searchContainer = document.getElementById('search-container'); - const inlineSearchInput = document.getElementById('inline-search-input'); - const inlineSearchResults = document.getElementById('inline-search-results'); - - if (essayHeader && searchContainer && inlineSearchInput) { - window.toggleSearchMode = function(show) { - if (show) { - essayHeader.style.display = 'none'; - searchContainer.style.display = 'block'; - inlineSearchInput.focus(); - if (!window.isIndexLoaded) { - loadSearchIndex(); - } - } else { - essayHeader.style.display = 'block'; - searchContainer.style.display = 'none'; - inlineSearchInput.value = ''; - inlineSearchResults.style.display = 'none'; - } - }; - - // Close when clicking outside - delegated to document body to handle pjax updates - document.body.onclick = function(e) { - const isClickInside = essayHeader.contains(e.target) || - searchContainer.contains(e.target) || - inlineSearchResults.contains(e.target); - - if (!isClickInside && searchContainer.style.display === 'block') { - window.toggleSearchMode(false); - } - // Also handle modal outside click here if needed, but window.onclick handles that - if (e.target === searchModal) { - closeModal(); - } - }; - - // Inline Search Function - function performInlineSearch() { - const query = inlineSearchInput.value.trim().toLowerCase(); - if (query === '') { - inlineSearchResults.style.display = 'none'; - return; - } - - if (!window.isIndexLoaded) { - // Wait if loading - setTimeout(performInlineSearch, 500); - return; - } - - const results = window.searchIndex.filter(item => { - const title = item.title ? item.title.toLowerCase() : ''; - const summary = item.summary ? item.summary.toLowerCase() : ''; - return title.includes(query) || summary.includes(query); - }); - - displayInlineResults(results); - } - - function displayInlineResults(results) { - if (results.length === 0) { - inlineSearchResults.innerHTML = '
未找到相关文章
'; - inlineSearchResults.style.display = 'block'; - return; - } - - let html = ''; - results.slice(0, 5).forEach(item => { // Limit to 5 inline results - html += ` - - ${item.title} -
${item.summary}
-
- `; - }); - inlineSearchResults.innerHTML = html; - inlineSearchResults.style.display = 'block'; - if (window.pjax) window.pjax.refresh(inlineSearchResults); - } - - let inlineDebounce; - inlineSearchInput.oninput = function() { - clearTimeout(inlineDebounce); - inlineDebounce = setTimeout(performInlineSearch, 300); - }; - - // Handle Escape key - inlineSearchInput.onkeydown = function(e) { - if (e.key === 'Escape') { - window.toggleSearchMode(false); - } - }; - } -} - -document.addEventListener('DOMContentLoaded', initSearchFunctionality); -// Re-init on Pjax complete -document.addEventListener('pjax:complete', initSearchFunctionality); - -// Call on ready -$(document).ready(function() { - window.initLinkStatus(); -}); - -// Link Status Check -window.initLinkStatus = function() { - console.log('initLinkStatus called'); - - // Selectors for both Card View (.links-item) and List View (.links li) - var $cardLinks = $('.links-item a'); - var $listLinks = $('.links ul > li > a'); - - console.log('Found card links:', $cardLinks.length); - console.log('Found list links:', $listLinks.length); - - // Only run if there are any links to check - if ($cardLinks.length === 0 && $listLinks.length === 0) return; - - console.log('Fetching /link_status.json...'); - fetch('/link_status.json?t=' + new Date().getTime()) - .then(response => { - console.log('Fetch response status:', response.status); - if (!response.ok) throw new Error('Status file not found'); - return response.json(); - }) - .then(data => { - console.log('Link status data loaded, keys:', Object.keys(data).length); - let activeCount = 0; - let deadCount = 0; - - // Helper function to check URL status - const getUrlStatus = (url) => { - if (!url) return 'unknown'; - var cleanUrl = url.replace(/\/$/, ''); - var httpsUrl = cleanUrl.replace(/^http:/, 'https:'); - var httpUrl = cleanUrl.replace(/^https:/, 'http:'); - - const keys = [ - url, - cleanUrl, - cleanUrl + '/', - httpsUrl, - httpUrl, - httpsUrl + '/', - httpUrl + '/' - ]; - - let isDead = false; - for (const key of keys) { - if (data[key] === true) return 'alive'; - if (data[key] === false) isDead = true; - } - - return isDead ? 'dead' : 'unknown'; - }; - - // Process Card View Links - $cardLinks.each(function() { - var $link = $(this); - var url = $link.attr('href'); - var status = getUrlStatus(url); - - if (status === 'alive') { - var $item = $link.closest('.links-item'); - if ($item.find('.link-active-badge').length === 0) { - $item.append(''); - activeCount++; - } - } else if (status === 'dead') { - var $item = $link.closest('.links-item'); - if ($item.find('.link-dead-badge').length === 0) { - $item.append(''); - deadCount++; - } - } - }); - - // Process List View Links - $listLinks.each(function() { - var $link = $(this); - var url = $link.attr('href'); - var status = getUrlStatus(url); - - if (status === 'alive') { - var $li = $link.closest('li'); - $li.addClass('link-active-li'); - $li.attr('title', '可访问'); - activeCount++; - } else if (status === 'dead') { - var $li = $link.closest('li'); - $li.addClass('link-dead-li'); - $li.attr('title', '无法访问'); - deadCount++; - } - }); - - console.log('Link status updated. Active:', activeCount, 'Dead:', deadCount); - }) - .catch(err => console.error('Link status check failed:', err)); }; diff --git a/themes/Ying/layouts/_default/about.html b/themes/Ying/layouts/_default/about.html index d711b48c..299df58e 100644 --- a/themes/Ying/layouts/_default/about.html +++ b/themes/Ying/layouts/_default/about.html @@ -1,12 +1,12 @@ {{ define "main" }}
-
+
{{ .Content }}
03 / 光影 (Album)
-
+
{{ range site.Data.album }}
diff --git a/themes/Ying/layouts/_default/circles.html b/themes/Ying/layouts/_default/circles.html index cbb0d8e0..cfd6c347 100644 --- a/themes/Ying/layouts/_default/circles.html +++ b/themes/Ying/layouts/_default/circles.html @@ -395,15 +395,16 @@ let html = ""; posts.forEach((post, index) => { const dateStr = this.timeAgo(post.date); - // 减少延迟时间,避免动画积压 - const delay = index * 0.05; // 背景图固定使用头像,以获得一致的装饰效果 const bgImageSrc = post.avatar; // Escape quotes for data attribute const description = post.description ? post.description.replace(/"/g, '"') : ''; + + // Calculate delay for staggered animation + const delay = index * 100; html += ` - +
${post.title}
diff --git a/themes/Ying/layouts/_default/home.html b/themes/Ying/layouts/_default/home.html index ef5a90d8..6b7d8e42 100644 --- a/themes/Ying/layouts/_default/home.html +++ b/themes/Ying/layouts/_default/home.html @@ -18,7 +18,7 @@
-
+
{{ $posts := sort (where (where .Site.RegularPages "Type" "post") "Params.status" "ne" "hidden") "Weight" }} diff --git a/themes/Ying/layouts/_default/list.html b/themes/Ying/layouts/_default/list.html index 9b1e2359..5d7d9023 100644 --- a/themes/Ying/layouts/_default/list.html +++ b/themes/Ying/layouts/_default/list.html @@ -1,7 +1,7 @@ {{ define "main" }}
-
+
{{ $paginator := .Paginate (where (where .Site.RegularPages "Type" "post") "Params.status" "ne" "hidden") }} {{ range $paginator.Pages }}
diff --git a/themes/Ying/layouts/_default/new-links-lite.html b/themes/Ying/layouts/_default/new-links-lite.html index e38e60b9..d577651c 100644 --- a/themes/Ying/layouts/_default/new-links-lite.html +++ b/themes/Ying/layouts/_default/new-links-lite.html @@ -70,7 +70,7 @@