feat(widgets): reviews swiper-tilt, feature countup, tilt/pricing motion
Reviews use swiper-scroll + 3D tilt cards; feature intro stats count-up and tab video pause; tilt showcase hooks effects.js; pricing cards animate.
This commit is contained in:
@@ -50,7 +50,8 @@ class WidgetFeatureIntro extends \WP_Widget {
|
|||||||
$ss = sanitize_text_field((string) ($instance['stat_suffix'] ?? '+'));
|
$ss = sanitize_text_field((string) ($instance['stat_suffix'] ?? '+'));
|
||||||
$sl = sanitize_text_field((string) ($instance['stat_label'] ?? ''));
|
$sl = sanitize_text_field((string) ($instance['stat_label'] ?? ''));
|
||||||
if ($sn !== '') {
|
if ($sn !== '') {
|
||||||
echo '<div class="aksrt-fi__stat"><span class="aksrt-fi__stat-num">' . esc_html($sn) . '</span>';
|
$num_attr = is_numeric($sn) ? ' data-aksrt-countup data-target="' . esc_attr((string) (float) $sn) . '" data-duration="1600"' : '';
|
||||||
|
echo '<div class="aksrt-fi__stat"><span class="aksrt-fi__stat-num"' . $num_attr . '>' . esc_html(is_numeric($sn) ? '0' : $sn) . '</span>';
|
||||||
if ($ss !== '') {
|
if ($ss !== '') {
|
||||||
echo '<span class="aksrt-fi__stat-plus">' . esc_html($ss) . '</span>';
|
echo '<span class="aksrt-fi__stat-plus">' . esc_html($ss) . '</span>';
|
||||||
}
|
}
|
||||||
@@ -83,7 +84,8 @@ class WidgetFeatureIntro extends \WP_Widget {
|
|||||||
echo '<div class="aksrt-fi__browser-body" style="padding-bottom:' . esc_attr((string) $ratio) . '%">';
|
echo '<div class="aksrt-fi__browser-body" style="padding-bottom:' . esc_attr((string) $ratio) . '%">';
|
||||||
if ($s['media_type'] === 'video' && $s['video_url'] !== '') {
|
if ($s['media_type'] === 'video' && $s['video_url'] !== '') {
|
||||||
$poster = $s['video_poster'] !== '' ? ' poster="' . esc_url($s['video_poster']) . '"' : '';
|
$poster = $s['video_poster'] !== '' ? ' poster="' . esc_url($s['video_poster']) . '"' : '';
|
||||||
echo '<video class="aksrt-fi__video" src="' . esc_url($s['video_url']) . '"' . $poster . ' autoplay muted loop playsinline></video>';
|
$auto = $i === 0 ? ' autoplay' : '';
|
||||||
|
echo '<video class="aksrt-fi__video" src="' . esc_url($s['video_url']) . '"' . $poster . $auto . ' muted loop playsinline></video>';
|
||||||
} elseif ($s['image'] !== '') {
|
} elseif ($s['image'] !== '') {
|
||||||
echo '<img class="aksrt-fi__img" src="' . esc_url($s['image']) . '" alt="' . esc_attr($s['tab_label']) . '" loading="lazy" />';
|
echo '<img class="aksrt-fi__img" src="' . esc_url($s['image']) . '" alt="' . esc_attr($s['tab_label']) . '" loading="lazy" />';
|
||||||
}
|
}
|
||||||
@@ -101,7 +103,7 @@ class WidgetFeatureIntro extends \WP_Widget {
|
|||||||
var panels=[].slice.call(root.querySelectorAll('.aksrt-fi__panel'));
|
var panels=[].slice.call(root.querySelectorAll('.aksrt-fi__panel'));
|
||||||
function go(i){
|
function go(i){
|
||||||
tabs.forEach(function(t,idx){t.classList.toggle('is-active',idx===i);});
|
tabs.forEach(function(t,idx){t.classList.toggle('is-active',idx===i);});
|
||||||
panels.forEach(function(p,idx){p.classList.toggle('is-active',idx===i);});
|
panels.forEach(function(p,idx){p.classList.toggle('is-active',idx===i);var v=p.querySelector('video');if(v){if(idx===i){v.play&&v.play().catch(function(){})}else{v.pause&&v.pause()}}});
|
||||||
}
|
}
|
||||||
tabs.forEach(function(t){ t.addEventListener('click', function(){ go(parseInt(t.getAttribute('data-index')||'0',10)); }); });
|
tabs.forEach(function(t){ t.addEventListener('click', function(){ go(parseInt(t.getAttribute('data-index')||'0',10)); }); });
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -41,14 +41,17 @@ class WidgetPricingPlans extends \WP_Widget {
|
|||||||
|
|
||||||
echo '<div class="aksrt-pricing">';
|
echo '<div class="aksrt-pricing">';
|
||||||
echo '<div class="aksrt-pricing__cards">';
|
echo '<div class="aksrt-pricing__cards">';
|
||||||
|
$pi = 0;
|
||||||
foreach ($plans as $plan) {
|
foreach ($plans as $plan) {
|
||||||
$accent = sanitize_key((string) ($plan['color'] ?? 'blue'));
|
$accent = sanitize_key((string) ($plan['color'] ?? 'blue'));
|
||||||
if (!in_array($accent, ['pink', 'purple', 'blue', 'green', 'yellow', 'cyan'], true)) {
|
if (!in_array($accent, ['pink', 'purple', 'blue', 'green', 'yellow', 'cyan'], true)) {
|
||||||
$accent = 'blue';
|
$accent = 'blue';
|
||||||
}
|
}
|
||||||
$featured = !empty($plan['is_featured']);
|
$featured = !empty($plan['is_featured']);
|
||||||
$class = 'aksrt-pricing__card accent-' . $accent . ($featured ? ' is-featured' : '');
|
$pack = function_exists('aksrt_obs_animate_attrs') ? aksrt_obs_animate_attrs('slideup', false, $pi * 0.12) : ['class' => '', 'attr' => ''];
|
||||||
echo '<div class="' . esc_attr($class) . '">';
|
$class = 'aksrt-pricing__card accent-' . $accent . ($featured ? ' is-featured' : '') . $pack['class'];
|
||||||
|
echo '<div class="' . esc_attr(trim($class)) . '"' . $pack['attr'] . '>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
|
$pi++;
|
||||||
if ($featured || !empty($plan['tag'])) {
|
if ($featured || !empty($plan['tag'])) {
|
||||||
$badge = (string) ($plan['tag'] !== '' ? $plan['tag'] : __('推荐', 'aksrt'));
|
$badge = (string) ($plan['tag'] !== '' ? $plan['tag'] : __('推荐', 'aksrt'));
|
||||||
echo '<span class="aksrt-pricing__badge">' . esc_html($badge) . '</span>';
|
echo '<span class="aksrt-pricing__badge">' . esc_html($badge) . '</span>';
|
||||||
|
|||||||
@@ -38,9 +38,10 @@ class WidgetReviews extends \WP_Widget {
|
|||||||
|
|
||||||
$style = sprintf('--aksrt-rev-pc:%s;--aksrt-rev-m:%s;', rtrim(rtrim(number_format($pc, 2, '.', ''), '0'), '.'), rtrim(rtrim(number_format($m, 2, '.', ''), '0'), '.'));
|
$style = sprintf('--aksrt-rev-pc:%s;--aksrt-rev-m:%s;', rtrim(rtrim(number_format($pc, 2, '.', ''), '0'), '.'), rtrim(rtrim(number_format($m, 2, '.', ''), '0'), '.'));
|
||||||
echo '<div class="aksrt-reviews" style="' . esc_attr($style) . '">';
|
echo '<div class="aksrt-reviews" style="' . esc_attr($style) . '">';
|
||||||
echo '<div class="aksrt-reviews__track">';
|
echo '<div class="swiper-container swiper-scroll aksrt-reviews-swiper">';
|
||||||
|
echo '<div class="swiper-wrapper aksrt-reviews__track">';
|
||||||
foreach ($reviews as $r) {
|
foreach ($reviews as $r) {
|
||||||
echo '<div class="aksrt-reviews__slide"><div class="aksrt-reviews__card">';
|
echo '<div class="swiper-slide aksrt-reviews__slide"><div class="aksrt-reviews__card" data-aksrt-tilt data-tilt-max="8">';
|
||||||
echo '<div class="aksrt-reviews__head">';
|
echo '<div class="aksrt-reviews__head">';
|
||||||
if ($r['avatar'] !== '') {
|
if ($r['avatar'] !== '') {
|
||||||
echo '<img class="aksrt-reviews__avatar" src="' . esc_url($r['avatar']) . '" alt="" loading="lazy" width="44" height="44" />';
|
echo '<img class="aksrt-reviews__avatar" src="' . esc_url($r['avatar']) . '" alt="" loading="lazy" width="44" height="44" />';
|
||||||
@@ -70,6 +71,9 @@ class WidgetReviews extends \WP_Widget {
|
|||||||
echo '<i class="fa fa-quote-right aksrt-reviews__quote" aria-hidden="true"></i>';
|
echo '<i class="fa fa-quote-right aksrt-reviews__quote" aria-hidden="true"></i>';
|
||||||
echo '</div></div>';
|
echo '</div></div>';
|
||||||
}
|
}
|
||||||
|
echo '</div>';
|
||||||
|
echo '<div class="swiper-button-prev" aria-label="' . esc_attr__('上一页', 'aksrt') . '"></div>';
|
||||||
|
echo '<div class="swiper-button-next" aria-label="' . esc_attr__('下一页', 'aksrt') . '"></div>';
|
||||||
echo '</div></div>';
|
echo '</div></div>';
|
||||||
|
|
||||||
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ class WidgetTiltCases extends \WP_Widget {
|
|||||||
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
|
|
||||||
echo '<div class="aksrt-tilt">';
|
echo '<div class="aksrt-tilt">';
|
||||||
echo '<div class="aksrt-tilt__text">';
|
$pack = function_exists('aksrt_obs_animate_attrs') ? aksrt_obs_animate_attrs('slideup', false, 0) : ['class' => '', 'attr' => ''];
|
||||||
|
echo '<div class="aksrt-tilt__text' . esc_attr($pack['class']) . '"' . $pack['attr'] . '>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||||||
if ($badge !== '') {
|
if ($badge !== '') {
|
||||||
$icon = sanitize_text_field((string) ($instance['intro_badge_icon'] ?? ''));
|
$icon = sanitize_text_field((string) ($instance['intro_badge_icon'] ?? ''));
|
||||||
echo '<div class="aksrt-tilt__badge">';
|
echo '<div class="aksrt-tilt__badge">';
|
||||||
@@ -82,11 +83,12 @@ class WidgetTiltCases extends \WP_Widget {
|
|||||||
}
|
}
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
|
|
||||||
echo '<div class="aksrt-tilt__showcase">';
|
echo '<div class="aksrt-tilt__showcase" data-aksrt-tilt data-tilt-max="12" data-tilt-glare="1">';
|
||||||
if ($images) {
|
if ($images) {
|
||||||
foreach ($images as $i => $img) {
|
foreach ($images as $i => $img) {
|
||||||
$cls = $i === 0 ? ' is-main' : '';
|
$cls = $i === 0 ? ' is-main' : '';
|
||||||
echo '<div class="aksrt-tilt__img' . esc_attr($cls) . '"><img src="' . esc_url($img) . '" alt="" loading="lazy" /></div>';
|
$placeholder = get_template_directory_uri() . '/assets/img/placeholder.svg';
|
||||||
|
echo '<div class="aksrt-tilt__img' . esc_attr($cls) . '"><img class="aksrt-lazy lazyload" data-src="' . esc_url($img) . '" src="' . esc_url($placeholder) . '" alt="" loading="lazy" /></div>';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
echo '<div class="aksrt-tilt__img is-main is-empty"></div>';
|
echo '<div class="aksrt-tilt__img is-main is-empty"></div>';
|
||||||
|
|||||||
Reference in New Issue
Block a user