Implement robust accordion pattern with proper state management and animations

This commit is contained in:
Marcus Quinn
2025-03-16 02:01:35 +00:00
parent d95aa88176
commit ad8a95cd0c

View File

@ -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 {