Implement robust accordion pattern with proper state management and animations
This commit is contained in:
@ -742,34 +742,47 @@ function wp_allstars_settings_page() {
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
jQuery(document).ready(function($) {
|
jQuery(document).ready(function($) {
|
||||||
// Initialize accordion functionality
|
// Handle accordion functionality
|
||||||
$('.wp-allstars-expand-settings').each(function() {
|
$('.wp-allstars-toggle').each(function() {
|
||||||
var $button = $(this);
|
var $toggle = $(this);
|
||||||
var $panel = $button.closest('.wp-allstars-toggle').find('.wp-allstars-toggle-settings');
|
var $button = $toggle.find('.wp-allstars-expand-settings');
|
||||||
|
var $panel = $toggle.find('.wp-allstars-toggle-settings');
|
||||||
var $icon = $button.find('.dashicons');
|
var $icon = $button.find('.dashicons');
|
||||||
|
|
||||||
// Set initial state
|
// Set initial state
|
||||||
var isExpanded = $button.attr('aria-expanded') === 'true';
|
var isExpanded = $button.attr('aria-expanded') === 'true';
|
||||||
$panel.toggle(isExpanded);
|
$panel.toggle(isExpanded);
|
||||||
$icon.toggleClass('dashicons-arrow-up-alt2', isExpanded)
|
updateIconState($icon, isExpanded);
|
||||||
.toggleClass('dashicons-arrow-down-alt2', !isExpanded);
|
|
||||||
|
|
||||||
// Handle click events
|
// Handle click events
|
||||||
$button.on('click', function(e) {
|
$button.on('click', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
|
||||||
|
// Toggle state
|
||||||
isExpanded = !isExpanded;
|
isExpanded = !isExpanded;
|
||||||
|
|
||||||
|
// Update ARIA state
|
||||||
$button.attr('aria-expanded', isExpanded);
|
$button.attr('aria-expanded', isExpanded);
|
||||||
|
|
||||||
// Update icon classes
|
// Update icon before animation
|
||||||
$icon.removeClass('dashicons-arrow-up-alt2 dashicons-arrow-down-alt2')
|
updateIconState($icon, isExpanded);
|
||||||
.addClass(isExpanded ? 'dashicons-arrow-up-alt2' : 'dashicons-arrow-down-alt2');
|
|
||||||
|
|
||||||
// Animate panel
|
// Animate panel
|
||||||
$panel.slideToggle(200);
|
$panel.stop().slideToggle({
|
||||||
|
duration: 200,
|
||||||
|
queue: false
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Helper function to update icon state
|
||||||
|
function updateIconState($icon, expanded) {
|
||||||
|
$icon
|
||||||
|
.removeClass('dashicons-arrow-up-alt2 dashicons-arrow-down-alt2')
|
||||||
|
.addClass(expanded ? 'dashicons-arrow-up-alt2' : 'dashicons-arrow-down-alt2')
|
||||||
|
.css('transform', expanded ? 'rotate(180deg)' : 'rotate(0deg)');
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -779,7 +792,6 @@ function wp_allstars_settings_page() {
|
|||||||
border: 1px solid #ccd0d4;
|
border: 1px solid #ccd0d4;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
overflow: hidden;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.wp-allstars-toggle-header {
|
.wp-allstars-toggle-header {
|
||||||
@ -830,16 +842,13 @@ function wp_allstars_settings_page() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.wp-allstars-expand-settings .dashicons {
|
.wp-allstars-expand-settings .dashicons {
|
||||||
transition: transform 0.2s ease;
|
|
||||||
display: block;
|
display: block;
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 16px;
|
line-height: 16px;
|
||||||
}
|
transition: transform 0.2s ease;
|
||||||
|
transform-origin: center;
|
||||||
.wp-allstars-expand-settings .dashicons-arrow-up-alt2 {
|
|
||||||
transform: rotate(180deg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.wp-allstars-toggle-settings {
|
.wp-allstars-toggle-settings {
|
||||||
|
Reference in New Issue
Block a user