- Added image optimization with WebP conversion
- Updated Dashboard UI with card layout
- Fixed duplicate domain/email detection
- Increased default items per page to 25
- Added campaign weekend reduction factor field
- Added ember animation effect in footer
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
153 lines
3.9 KiB
PHP
153 lines
3.9 KiB
PHP
<?php
|
|
/**
|
|
* The template for displaying the footer.
|
|
*
|
|
* @package GeneratePress
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
?>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
/**
|
|
* generate_before_footer hook.
|
|
*
|
|
* @since 0.1
|
|
*/
|
|
do_action( 'generate_before_footer' );
|
|
?>
|
|
|
|
<div <?php generate_do_attr( 'footer' ); ?>>
|
|
<?php
|
|
/**
|
|
* generate_before_footer_content hook.
|
|
*
|
|
* @since 0.1
|
|
*/
|
|
do_action( 'generate_before_footer_content' );
|
|
|
|
/**
|
|
* generate_footer hook.
|
|
*
|
|
* @since 1.3.42
|
|
*
|
|
* @hooked generate_construct_footer_widgets - 5
|
|
* @hooked generate_construct_footer - 10
|
|
*/
|
|
do_action( 'generate_footer' );
|
|
|
|
/**
|
|
* generate_after_footer_content hook.
|
|
*
|
|
* @since 0.1
|
|
*/
|
|
do_action( 'generate_after_footer_content' );
|
|
?>
|
|
</div>
|
|
|
|
<?php
|
|
/**
|
|
* generate_after_footer hook.
|
|
*
|
|
* @since 2.1
|
|
*/
|
|
do_action( 'generate_after_footer' );
|
|
|
|
wp_footer();
|
|
?>
|
|
<script>
|
|
class Ember {
|
|
constructor() {
|
|
this.element = document.createElement('div');
|
|
this.element.className = 'ember';
|
|
this.reset();
|
|
document.body.appendChild(this.element);
|
|
}
|
|
|
|
getRandomColor() {
|
|
const colors = [
|
|
// { inner: 'rgb(255, 0, 0)', outer: 'rgb(255, 50, 0)' }, // Red
|
|
{ inner: 'rgb(255, 150, 50)', outer: 'rgb(255, 50, 0)' }, // Red-Orange
|
|
{ inner: 'rgb(255, 200, 50)', outer: 'rgb(255, 100, 0)' }, // Orange
|
|
{ inner: 'rgb(255, 255, 100)', outer: 'rgb(255, 200, 50)' } // Yellow
|
|
];
|
|
return colors[Math.floor(Math.random() * colors.length)];
|
|
}
|
|
|
|
reset() {
|
|
this.x = Math.random() * 100;
|
|
this.y = 100;
|
|
this.size = Math.random() * 4 + 2;
|
|
this.speedY = -(Math.random() * 0.25 + 0.125);
|
|
this.speedX = (Math.random() - 0.25) * 0.125;
|
|
this.opacity = Math.random() * 0.5 + 0.5;
|
|
this.life = Math.random() * 100 * this.size;
|
|
this.color = this.getRandomColor();
|
|
}
|
|
|
|
update() {
|
|
this.x += this.speedX;
|
|
this.y += this.speedY;
|
|
this.life -= 1;
|
|
this.opacity *= 0.99;
|
|
|
|
this.element.style.left = `${this.x}%`;
|
|
this.element.style.top = `${this.y}%`;
|
|
this.element.style.width = `${this.size}px`;
|
|
this.element.style.height = `${this.size}px`;
|
|
this.element.style.opacity = this.opacity;
|
|
this.element.style.background = `radial-gradient(circle at center, ${this.color.inner}, ${this.color.outer})`;
|
|
this.element.style.boxShadow = `0 0 4px ${this.color.inner}`;
|
|
|
|
if (this.life <= 0) {
|
|
this.reset();
|
|
}
|
|
}
|
|
}
|
|
|
|
const minCeiled = Math.ceil(50);
|
|
const maxFloored = Math.floor(100);
|
|
// const emberCount = Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled);
|
|
const emberCount = 100;
|
|
const embers = Array.from({ length: emberCount }, () => new Ember());
|
|
console.log("Created " + emberCount + "embers");
|
|
|
|
function animate() {
|
|
embers.forEach(ember => ember.update());
|
|
requestAnimationFrame(animate);
|
|
}
|
|
|
|
// animate();
|
|
</script>
|
|
<!-- <script>
|
|
// $.noConflict();
|
|
jQuery(document).ready(function(){
|
|
console.log("jQuery Loaded");
|
|
jQuery('.widget_nav_menu .menu-item-has-children > a').hover(
|
|
function() {
|
|
var submenu = jQuery(this).siblings('.sub-menu');
|
|
submenu.removeClass('sliding-up').addClass('sliding-down').show();
|
|
},
|
|
function() {
|
|
var submenu = jQuery(this).siblings('.sub-menu');
|
|
setTimeout(function() {
|
|
if (!submenu.is(':hover')) {
|
|
submenu.removeClass('sliding-down').addClass('sliding-up');
|
|
setTimeout(function() {
|
|
if (submenu.hasClass('sliding-up')) {
|
|
submenu.hide();
|
|
}
|
|
}, 300); // Match animation duration
|
|
}
|
|
}, 200);
|
|
}
|
|
);
|
|
});
|
|
</script> -->
|
|
</body>
|
|
</html>
|