array( 'label' => __( 'Ring', 'aerospin-css-loading-spinners' ), 'description' => __( 'A clean rotating ring, the classic loading indicator.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'dual-ring' => array( 'label' => __( 'Dual Ring', 'aerospin-css-loading-spinners' ), 'description' => __( 'Two concentric rings rotating in opposite directions.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'circle' => array( 'label' => __( 'Circle', 'aerospin-css-loading-spinners' ), 'description' => __( 'A segmented circle that spins smoothly.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'dots' => array( 'label' => __( 'Bouncing Dots', 'aerospin-css-loading-spinners' ), 'description' => __( 'Three dots that bounce in sequence.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'pulse-dots' => array( 'label' => __( 'Pulse Dots', 'aerospin-css-loading-spinners' ), 'description' => __( 'Three dots that pulse with a wave effect.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'dot-spin' => array( 'label' => __( 'Dot Spin', 'aerospin-css-loading-spinners' ), 'description' => __( 'Dots orbiting around a center point.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'bars' => array( 'label' => __( 'Bars', 'aerospin-css-loading-spinners' ), 'description' => __( 'Five bars that animate in a wave pattern.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Bars', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'equalizer' => array( 'label' => __( 'Equalizer', 'aerospin-css-loading-spinners' ), 'description' => __( 'Bars that animate like an audio equalizer.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Bars', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'ripple' => array( 'label' => __( 'Ripple', 'aerospin-css-loading-spinners' ), 'description' => __( 'Expanding ripple rings radiating outward.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'roller' => array( 'label' => __( 'Roller', 'aerospin-css-loading-spinners' ), 'description' => __( 'Dots rolling along a circular track.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'hourglass' => array( 'label' => __( 'Hourglass', 'aerospin-css-loading-spinners' ), 'description' => __( 'An hourglass shape that rotates continuously.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'heart' => array( 'label' => __( 'Heart', 'aerospin-css-loading-spinners' ), 'description' => __( 'A pulsing heart shape.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'square-spin' => array( 'label' => __( 'Square Spin', 'aerospin-css-loading-spinners' ), 'description' => __( 'A square that flips in 3D.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'fold' => array( 'label' => __( 'Fold', 'aerospin-css-loading-spinners' ), 'description' => __( 'Four squares that fold in sequence.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'wave-dots' => array( 'label' => __( 'Wave Dots', 'aerospin-css-loading-spinners' ), 'description' => __( 'A wave of expanding dots.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'orbit' => array( 'label' => __( 'Orbit', 'aerospin-css-loading-spinners' ), 'description' => __( 'A dot orbiting a central sphere.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'flip' => array( 'label' => __( 'Flip', 'aerospin-css-loading-spinners' ), 'description' => __( 'A square that flips on both axes.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'bounce' => array( 'label' => __( 'Bounce', 'aerospin-css-loading-spinners' ), 'description' => __( 'Two balls that bounce and cross paths.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'gradient-ring' => array( 'label' => __( 'Gradient Ring', 'aerospin-css-loading-spinners' ), 'description' => __( 'A ring with a smooth gradient sweep.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'chase' => array( 'label' => __( 'Chase', 'aerospin-css-loading-spinners' ), 'description' => __( 'Dots chasing each other in a circle.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'text-blink' => array( 'label' => __( 'Text: Blinking Dots', 'aerospin-css-loading-spinners' ), 'description' => __( 'Classic loading text with blinking ellipsis.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Text', 'aerospin-css-loading-spinners' ), 'html' => '', ), 'text-wave' => array( 'label' => __( 'Text: Wave', 'aerospin-css-loading-spinners' ), 'description' => __( 'Individual letters jumping in a wave sequence.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Text', 'aerospin-css-loading-spinners' ), 'html' => self::get_text_wave_html( __( 'Loading', 'aerospin-css-loading-spinners' ) ), ), 'text-glow' => array( 'label' => __( 'Text: Neon Glow', 'aerospin-css-loading-spinners' ), 'description' => __( 'Text that pulses with a bright neon outline.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Text', 'aerospin-css-loading-spinners' ), 'html' => '
' . esc_html__( 'Loading', 'aerospin-css-loading-spinners' ) . '
', ), 'rainbow-circle' => array( 'label' => __( 'Rainbow Circle', 'aerospin-css-loading-spinners' ), 'description' => __( 'A spinning circle cycling through vivid colors.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'rainbow-dots' => array( 'label' => __( 'Rainbow Dots', 'aerospin-css-loading-spinners' ), 'description' => __( 'Bouncing dots, each assigned a different vibrant color.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'rainbow-bar' => array( 'label' => __( 'Rainbow Progress Bar', 'aerospin-css-loading-spinners' ), 'description' => __( 'A horizontal bar smoothly sweeping through the color spectrum.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'color-pulse' => array( 'label' => __( 'Color Pulse', 'aerospin-css-loading-spinners' ), 'description' => __( 'A radiating circle that changes color on every beat.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'color-wheel' => array( 'label' => __( 'Color Wheel', 'aerospin-css-loading-spinners' ), 'description' => __( 'A multicolored segmented wheel rotating.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'cube-grid' => array( 'label' => __( 'Cube Grid', 'aerospin-css-loading-spinners' ), 'description' => __( 'A 3x3 grid of cubes pulsing diagonally.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'diamond-fold' => array( 'label' => __( 'Diamond Fold', 'aerospin-css-loading-spinners' ), 'description' => __( 'Four diamonds converging and unfolding.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'gear' => array( 'label' => __( 'Gear', 'aerospin-css-loading-spinners' ), 'description' => __( 'A mechanical cog slowly turning.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'sun' => array( 'label' => __( 'Sunburst', 'aerospin-css-loading-spinners' ), 'description' => __( 'A central circle with rotating outer rays.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'clock' => array( 'label' => __( 'Clock', 'aerospin-css-loading-spinners' ), 'description' => __( 'A clock face with rapidly spinning hour and minute hands.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'target' => array( 'label' => __( 'Target Rings', 'aerospin-css-loading-spinners' ), 'description' => __( 'Concentric rings collapsing inward.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'radar' => array( 'label' => __( 'Radar Sweep', 'aerospin-css-loading-spinners' ), 'description' => __( 'A scanner sweeping across a circular radar.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'wifi' => array( 'label' => __( 'Wi-Fi Signal', 'aerospin-css-loading-spinners' ), 'description' => __( 'Curved arcs broadcasting outward.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'heartbeat' => array( 'label' => __( 'Heartbeat EKG', 'aerospin-css-loading-spinners' ), 'description' => __( 'An animated EKG line drawing back and forth.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'battery' => array( 'label' => __( 'Battery Charge', 'aerospin-css-loading-spinners' ), 'description' => __( 'A battery outline filling with energy blocks.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'music-bars' => array( 'label' => __( 'Multicolor EQ', 'aerospin-css-loading-spinners' ), 'description' => __( 'Audio equalizer bars that feature distinct colors.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'hourglass-color' => array( 'label' => __( 'Sand Timer', 'aerospin-css-loading-spinners' ), 'description' => __( 'A solid sand timer that drains and flips.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'infinity' => array( 'label' => __( 'Infinity Loop', 'aerospin-css-loading-spinners' ), 'description' => __( 'A continuous figure-eight path pulsing in smooth motion.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'atom' => array( 'label' => __( 'Atom', 'aerospin-css-loading-spinners' ), 'description' => __( 'An atomic nucleus orbited by three 3D elliptical electron rings.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'dna' => array( 'label' => __( 'DNA Helix', 'aerospin-css-loading-spinners' ), 'description' => __( 'Intertwined strands undulating in a double-helix wave sequence.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'hexagon' => array( 'label' => __( 'Hexagon', 'aerospin-css-loading-spinners' ), 'description' => __( 'Geometric concentric hexagons pulsing and morphing inward.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'gyroscope' => array( 'label' => __( 'Gyroscope', 'aerospin-css-loading-spinners' ), 'description' => __( 'Concentric rings rotating smoothly on multi-axis gimbals.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'soundwave' => array( 'label' => __( 'Soundwave', 'aerospin-css-loading-spinners' ), 'description' => __( 'Dynamic audio frequency bars pulsing outward in stereo symmetry.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Bars', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'pulsar' => array( 'label' => __( 'Pulsar', 'aerospin-css-loading-spinners' ), 'description' => __( 'A luminous core projecting synchronized acoustic ripples.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'meteor' => array( 'label' => __( 'Meteor', 'aerospin-css-loading-spinners' ), 'description' => __( 'A bright celestial spark orbiting with a smooth glowing trail.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'matrix' => array( 'label' => __( 'Digital Matrix', 'aerospin-css-loading-spinners' ), 'description' => __( 'Cascading cyber data blocks streaming downward in parallel.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'gem' => array( 'label' => __( 'Crystal Gem', 'aerospin-css-loading-spinners' ), 'description' => __( 'A faceted polygonal gem rotating with shimmering refractions.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'newtons-cradle' => array( 'label' => __( "Newton's Cradle", 'aerospin-css-loading-spinners' ), 'description' => __( 'Four suspended spheres striking and transferring momentum.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'droplet' => array( 'label' => __( 'Water Droplet', 'aerospin-css-loading-spinners' ), 'description' => __( 'A liquid droplet descending and generating fluid ripples.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'infinity-dots' => array( 'label' => __( 'Infinity Dots', 'aerospin-css-loading-spinners' ), 'description' => __( 'Sequential dots orbiting along a lemniscate curve.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'eclipse' => array( 'label' => __( 'Solar Eclipse', 'aerospin-css-loading-spinners' ), 'description' => __( 'A dark celestial body passing across a radiant stellar corona.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'vortex' => array( 'label' => __( 'Spiral Vortex', 'aerospin-css-loading-spinners' ), 'description' => __( 'Swirling logarithmic vortex rings converging inward.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'sonar' => array( 'label' => __( 'Sonar Ping', 'aerospin-css-loading-spinners' ), 'description' => __( 'Submarine acoustic sweep detecting pulsating radar blips.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'prism' => array( 'label' => __( 'Prism Light', 'aerospin-css-loading-spinners' ), 'description' => __( 'Light refracting through a triangular prism into rainbow dispersion.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'hypercube' => array( 'label' => __( 'Tesseract Hypercube', 'aerospin-css-loading-spinners' ), 'description' => __( 'A four-dimensional hypercube folding through isometric space.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'signal-beacon' => array( 'label' => __( 'Signal Beacon', 'aerospin-css-loading-spinners' ), 'description' => __( 'Transmission antenna broadcasting rhythmic radio waves.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'sandflow' => array( 'label' => __( 'Sandflow', 'aerospin-css-loading-spinners' ), 'description' => __( 'Hourglass chamber with a continuous stream of falling sand.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'text-typewriter' => array( 'label' => __( 'Text: Typewriter', 'aerospin-css-loading-spinners' ), 'description' => __( 'Loading text typing out letter by letter with a flashing cursor.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Text', 'aerospin-css-loading-spinners' ), 'html' => '
' . esc_html__( 'Loading', 'aerospin-css-loading-spinners' ) . '_
', ), 'pendulum' => array( 'label' => __( 'Pendulum Wave', 'aerospin-css-loading-spinners' ), 'description' => __( 'Harmonic pendulums oscillating smoothly in phase-delayed arc motion.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'kaleidoscope' => array( 'label' => __( 'Kaleidoscope', 'aerospin-css-loading-spinners' ), 'description' => __( 'Mandala petals shifting through kaleidoscopic color symmetry.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'neon-ring' => array( 'label' => __( 'Neon Ring', 'aerospin-css-loading-spinners' ), 'description' => __( 'A glowing neon ring spinning with vivid hue-shifting bloom.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'crosshair' => array( 'label' => __( 'Crosshair Lock', 'aerospin-css-loading-spinners' ), 'description' => __( 'Precision targeting reticle rotating with pulsing lock-on crosshairs.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'glitch' => array( 'label' => __( 'Cyber Glitch', 'aerospin-css-loading-spinners' ), 'description' => __( 'Futuristic digital HUD box with chromatic aberration glitches.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'pinwheel' => array( 'label' => __( 'Origami Pinwheel', 'aerospin-css-loading-spinners' ), 'description' => __( 'Folded paper-craft wind blades spinning in circular rotation.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'staircase' => array( 'label' => __( 'Staircase Bars', 'aerospin-css-loading-spinners' ), 'description' => __( 'Ascending steps animating with alternating rhythmic wave scaling.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Bars', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'planetary' => array( 'label' => __( 'Planetary Rings', 'aerospin-css-loading-spinners' ), 'description' => __( 'A celestial sphere encircled by tilted, sweeping orbital rings.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'hive' => array( 'label' => __( 'Honeycomb Hive', 'aerospin-css-loading-spinners' ), 'description' => __( 'A cluster of seven hexagonal cells pulsing in a radial wave.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'black-hole' => array( 'label' => __( 'Black Hole', 'aerospin-css-loading-spinners' ), 'description' => __( 'A gravitational singularity warped by a swirling accretion disk.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'yin-yang' => array( 'label' => __( 'Yin Yang', 'aerospin-css-loading-spinners' ), 'description' => __( 'Complementary swirling forces rotating in harmonious equilibrium.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'quantum-orbit' => array( 'label' => __( 'Quantum Orbit', 'aerospin-css-loading-spinners' ), 'description' => __( 'Three elliptical orbital rings spinning with quantum electron particles at varying inclinations.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'cyber-hexagon' => array( 'label' => __( 'Cyber Hexagon', 'aerospin-css-loading-spinners' ), 'description' => __( 'Concentric rotating cyberpunk hexagon rings with glowing node accents.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'galaxy-spiral' => array( 'label' => __( 'Galaxy Spiral', 'aerospin-css-loading-spinners' ), 'description' => __( 'Two spiral arms revolving around a dense luminous galactic core.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'portal-vortex' => array( 'label' => __( 'Portal Vortex', 'aerospin-css-loading-spinners' ), 'description' => __( 'Multi-layered interdimensional gateway rotating with pulsating gradient horizons.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'metronome' => array( 'label' => __( 'Metronome Tick', 'aerospin-css-loading-spinners' ), 'description' => __( 'An inverted tempo needle swinging rhythmically with pendulum weight physics.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'dna-cascade' => array( 'label' => __( 'Chromatic Helix', 'aerospin-css-loading-spinners' ), 'description' => __( 'Color-shifting nucleotide rungs spiraling in an illuminated 3D ladder.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'liquid-bubble' => array( 'label' => __( 'Liquid Bubbles', 'aerospin-css-loading-spinners' ), 'description' => __( 'Organic buoyant liquid bubbles rising and coalescing in fluid suspension.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'origami-crane' => array( 'label' => __( 'Origami Crane', 'aerospin-css-loading-spinners' ), 'description' => __( 'Geometric folded paper wings flapping in synchronized polyhedral origami motion.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'compass-rose' => array( 'label' => __( 'Compass Rose', 'aerospin-css-loading-spinners' ), 'description' => __( 'Navigational mariner compass dial searching and calibrating magnetic north.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'hyper-tunnel' => array( 'label' => __( 'Hyper Tunnel', 'aerospin-css-loading-spinners' ), 'description' => __( 'Consecutive geometric squares zooming infinitely towards the observer in warp speed.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'sound-equalizer-radial' => array( 'label' => __( 'Radial Equalizer', 'aerospin-css-loading-spinners' ), 'description' => __( 'Circular arrangement of audio VU spectrum bars pulsing outward from the center.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Bars', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'shuriken' => array( 'label' => __( 'Ninja Shuriken', 'aerospin-css-loading-spinners' ), 'description' => __( 'Four-bladed curved ninja star spinning at high velocity with metallic luster.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'firefly-swarm' => array( 'label' => __( 'Firefly Swarm', 'aerospin-css-loading-spinners' ), 'description' => __( 'Bioluminescent fireflies flickering and floating in randomized organic orbits.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'cube-flip-3d' => array( 'label' => __( 'Isometric Cube', 'aerospin-css-loading-spinners' ), 'description' => __( '3D isometric cube rotating across isometric axes with illuminated faces.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'solar-flare' => array( 'label' => __( 'Solar Flare', 'aerospin-css-loading-spinners' ), 'description' => __( 'Radiant chromatic sun with corona plasma arcs expanding and dissipating.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'biohazard' => array( 'label' => __( 'Biohazard Sign', 'aerospin-css-loading-spinners' ), 'description' => __( 'Stylized tripartite hazard bio-rings interlocked and turning in warning sequence.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'text-shimmer' => array( 'label' => __( 'Text: Shimmer Stream', 'aerospin-css-loading-spinners' ), 'description' => __( 'Typography with a continuous luminous beam sweeping across the text.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Text', 'aerospin-css-loading-spinners' ), 'html' => '
' . esc_html__( 'Loading', 'aerospin-css-loading-spinners' ) . '
', ), 'text-flip' => array( 'label' => __( 'Text: 3D Flip', 'aerospin-css-loading-spinners' ), 'description' => __( '3D perspective tumbling loading text with depth and backface shadows.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Text', 'aerospin-css-loading-spinners' ), 'html' => '
' . esc_html__( 'Loading', 'aerospin-css-loading-spinners' ) . '
', ), 'orbiting-moons' => array( 'label' => __( 'Lunar Orbiters', 'aerospin-css-loading-spinners' ), 'description' => __( 'Two celestial satellites circling around a planet on counter-rotating orbital planes.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'infinity-gear' => array( 'label' => __( 'Dual Synchro Gears', 'aerospin-css-loading-spinners' ), 'description' => __( 'Two interlocking meshed mechanical cogs counter-rotating in synchronicity.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'digital-clockwork' => array( 'label' => __( 'Digital Chrono', 'aerospin-css-loading-spinners' ), 'description' => __( 'High-tech stopwatch HUD dial with rapid second ticks and sweeping millisecond arc.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'neon-hex' => array( 'label' => __( 'Neon Cyber Ring', 'aerospin-css-loading-spinners' ), 'description' => __( 'Vivid neon gradient polygon pulsing with laser scan line animations.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'ripple-matrix' => array( 'label' => __( 'Dot Matrix Wave', 'aerospin-css-loading-spinners' ), 'description' => __( '3x3 matrix grid of dots undulating in a diagonal 2D ripple matrix.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Dots', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'constellation' => array( 'label' => __( 'Star Constellation', 'aerospin-css-loading-spinners' ), 'description' => __( 'Interconnected stellar nodes drawing shimmering astral geometric lines.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Animated', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'plasma-ball' => array( 'label' => __( 'Tesla Plasma Ball', 'aerospin-css-loading-spinners' ), 'description' => __( 'Glowing electromagnetic sphere with discharging electrical plasma arcs.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Colorful', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'satellite-dish' => array( 'label' => __( 'Orbital Satellite', 'aerospin-css-loading-spinners' ), 'description' => __( 'Space telemetry dish tracking satellite pulses across orbital radar beams.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Indicators', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'card-shuffle' => array( 'label' => __( 'Card Stack Shuffle', 'aerospin-css-loading-spinners' ), 'description' => __( 'Stack of isometric deck cards smoothly sliding and fanning in cardistry loop.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Shapes', 'aerospin-css-loading-spinners' ), 'html' => '
', ), 'cascade-rings' => array( 'label' => __( 'Cascading Halos', 'aerospin-css-loading-spinners' ), 'description' => __( 'Triple concentric glowing halo rings expanding and collapsing in harmonic cascade.', 'aerospin-css-loading-spinners' ), 'category' => __( 'Classic', 'aerospin-css-loading-spinners' ), 'html' => '
', ), ); } /** * Build translated text wave spinner markup. * * @since 1.1.4 * * @param string $text Loading text. * @return string */ private static function get_text_wave_html( $text ) { $text = is_string( $text ) ? $text : ''; $characters = preg_split( '//u', $text, -1, PREG_SPLIT_NO_EMPTY ); $html = '
'; // Provide fallback array if splitting fails. if ( false === $characters || empty( $characters ) || ! is_array( $characters ) ) { $characters = str_split( 'Loading' ); } // Iterate over characters and safely escape each piece. foreach ( $characters as $character ) { $html .= '' . esc_html( $character ) . ''; } $html .= '
'; return $html; } /* |-------------------------------------------------------------------------- | SECTION 3: Registry Normalization |-------------------------------------------------------------------------- */ /** * Normalize spinner definitions after filtering. * * @since 1.1.4 * * @param mixed $spinners Raw spinner definitions. * @return array */ private static function normalize_spinners( $spinners ) { if ( ! is_array( $spinners ) ) { return array(); } $normalized = array(); // Cleanse structure and values of user-provided configurations. foreach ( $spinners as $key => $spinner ) { $key = sanitize_key( self::safe_scalar( $key ) ); if ( '' === $key || ! is_array( $spinner ) ) { continue; } $label = isset( $spinner['label'] ) ? sanitize_text_field( self::safe_scalar( $spinner['label'] ) ) : ''; $description = isset( $spinner['description'] ) ? sanitize_text_field( self::safe_scalar( $spinner['description'] ) ) : ''; $category = isset( $spinner['category'] ) ? sanitize_text_field( self::safe_scalar( $spinner['category'] ) ) : ''; $html = isset( $spinner['html'] ) ? self::sanitize_spinner_html( $spinner['html'] ) : ''; if ( '' === $label ) { $label = ucwords( str_replace( '-', ' ', $key ) ); } if ( '' === $category ) { $category = __( 'Custom', 'aerospin-css-loading-spinners' ); } if ( '' === $html ) { continue; } $normalized[ $key ] = array( 'label' => $label, 'description' => $description, 'category' => $category, 'html' => $html, ); } return $normalized; } /** * Safely cast scalar values. * * This prevents warnings if third-party filters provide arrays, objects, * or unexpected values for labels, descriptions, categories, or keys. * * @since 1.1.4 * * @param mixed $value Raw value. * @return string */ private static function safe_scalar( $value ) { if ( is_array( $value ) || is_object( $value ) ) { return ''; } return is_string( $value ) ? $value : (string) $value; } /** * Sanitize spinner HTML. * * @since 1.1.4 * * @param mixed $html Raw spinner markup. * @return string */ private static function sanitize_spinner_html( $html ) { if ( ! is_string( $html ) || '' === $html ) { return ''; } // Updated function call to strictly use the updated correct prefix. if ( function_exists( 'aerospin_css_loading_spinners_kses_spinner_html' ) ) { return aerospin_css_loading_spinners_kses_spinner_html( $html ); } elseif ( function_exists( 'Pure_CSS_Spinners_kses_spinner_html' ) ) { return Pure_CSS_Spinners_kses_spinner_html( $html ); } if ( ( class_exists( 'AeroSpin_CSS_Loading_Spinners_Helpers' ) && is_callable( array( 'AeroSpin_CSS_Loading_Spinners_Helpers', 'kses_spinner_html' ) ) ) || class_exists( 'Pure_CSS_Spinners_Helpers' ) && is_callable( array( 'Pure_CSS_Spinners_Helpers', 'kses_spinner_html' ) ) ) { return Pure_CSS_Spinners_Helpers::kses_spinner_html( $html ); } // Failsafe kses pass guaranteeing tight control over tags/attributes. return wp_kses( $html, array( 'div' => array( 'aria-hidden' => true, 'class' => true, 'role' => true, ), 'span' => array( 'aria-hidden' => true, 'class' => true, 'role' => true, ), ) ); } /* |-------------------------------------------------------------------------- | SECTION 4: Category Extraction |-------------------------------------------------------------------------- */ /** * Retrieve a unique list of spinner categories. * * @since 1.0.0 * * @return array */ public static function get_categories() { if ( null !== self::$categories_cache ) { return self::$categories_cache; } // Serve from persistent transient cache if available. $cached_transient = get_transient( 'acls_spinner_categories' ); if ( ! is_array( $cached_transient ) || empty( $cached_transient ) ) { $cached_transient = get_transient( 'Pure_CSS_Spinners_spinner_categories' ); } if ( is_array( $cached_transient ) && ! empty( $cached_transient ) ) { self::$categories_cache = $cached_transient; return self::$categories_cache; } $spinners = self::get_spinners(); $categories = array(); // Gather distinct categories into an array. foreach ( $spinners as $spinner ) { if ( empty( $spinner['category'] ) ) { continue; } $category = sanitize_text_field( self::safe_scalar( $spinner['category'] ) ); if ( '' !== $category && ! in_array( $category, $categories, true ) ) { $categories[] = $category; } } // Organize alphabetically. sort( $categories, SORT_NATURAL | SORT_FLAG_CASE ); self::$categories_cache = $categories; // Store in persistent transient cache (24 hours TTL as verified in diagnostics). set_transient( 'acls_spinner_categories', self::$categories_cache, 24 * HOUR_IN_SECONDS ); set_transient( 'Pure_CSS_Spinners_spinner_categories', self::$categories_cache, 24 * HOUR_IN_SECONDS ); return self::$categories_cache; } /** * Clear spinner registry and category caches. * * @since 1.1.4 * * @return void */ public static function clear_cache() { self::$spinners_cache = null; self::$categories_cache = null; // Safe cleanup for both modern and legacy database transient records. delete_transient( 'acls_spinner_categories' ); delete_transient( 'AeroSpin_CSS_Loading_Spinners_spinner_categories' ); delete_transient( 'Pure_CSS_Spinners_spinner_categories' ); delete_transient( 'cp_spinners_spinner_categories' ); } } } if ( ! class_exists( 'AeroSpin_CSS_Loading_Spinners_List' ) ) { class_alias( 'ACLS_Spinners_List', 'AeroSpin_CSS_Loading_Spinners_List' ); } if ( ! class_exists( 'Pure_CSS_Spinners_List' ) ) { class_alias( 'ACLS_Spinners_List', 'Pure_CSS_Spinners_List' ); } if ( ! class_exists( 'AreoSpin_Css_Loading_Spinners_List' ) ) { class_alias( 'ACLS_Spinners_List', 'AreoSpin_Css_Loading_Spinners_List' ); } /* |-------------------------------------------------------------------------- | SECTION 5: Procedural Standard Wrappers |-------------------------------------------------------------------------- | | These functions provide procedural access to AeroSpin CSS Loading Spinners list methods, | adhering strictly to WordPress.org prefixing requirements. | */ if ( ! function_exists( 'aerospin_css_loading_spinners_get_spinners' ) ) { function aerospin_css_loading_spinners_get_spinners() { return ACLS_Spinners_List::get_spinners(); } } if ( ! function_exists( 'aerospin_css_loading_spinners_get_spinner' ) ) { function aerospin_css_loading_spinners_get_spinner( $key, $default_value = 'ring' ) { return ACLS_Spinners_List::get_spinner( $key, $default_value ); } } if ( ! function_exists( 'aerospin_css_loading_spinners_get_categories' ) ) { function aerospin_css_loading_spinners_get_categories() { return ACLS_Spinners_List::get_categories(); } } if ( ! function_exists( 'aerospin_css_loading_spinners_clear_spinner_cache' ) ) { function aerospin_css_loading_spinners_clear_spinner_cache() { ACLS_Spinners_List::clear_cache(); } } // Backward-compatibility wrappers for legacy pure_css_spinners_* functions if ( ! function_exists( 'pure_css_spinners_get_spinners' ) ) { function pure_css_spinners_get_spinners() { return aerospin_css_loading_spinners_get_spinners(); } } if ( ! function_exists( 'pure_css_spinners_get_spinner' ) ) { function pure_css_spinners_get_spinner( $key, $default_value = 'ring' ) { return aerospin_css_loading_spinners_get_spinner( $key, $default_value ); } } if ( ! function_exists( 'pure_css_spinners_get_categories' ) ) { function pure_css_spinners_get_categories() { return aerospin_css_loading_spinners_get_categories(); } } if ( ! function_exists( 'pure_css_spinners_clear_spinner_cache' ) ) { function pure_css_spinners_clear_spinner_cache() { aerospin_css_loading_spinners_clear_spinner_cache(); } }