=== EffortLess Carousel with Gallery ===
Contributors: domclic
Tags: carousel, gallery, slideshow, animation
Requires at least: 6.2
Tested up to: 7.0
Stable tag: 1.3.20
Requires PHP: 7.4
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Transform your WordPress galleries into responsive carousels with autoplay.

== Description ==

Effortless Carousel with Gallery enhances your WordPress site by turning standard galleries into responsive, user-friendly carousels. It also provides customizable text animations to make your content pop. Ideal for creating engaging slideshows and dynamic text effects without complex setup.

Features:

    Responsive Carousel: Converts WordPress galleries with the `elcwg_carousel_active` class into smooth, infinite-looping carousels with autoplay, navigation arrows, dots, and swipe support.
    Text Animations: Apply animations to text elements with adjustable delays.
    Admin Settings: Configure carousel options via an intuitive settings page.
    Lightweight & Secure: Sanitized inputs and escaped outputs for performance and security.

== Installation ==

1. Upload the `effortless-carousel-with-gallery` folder to the `/wp-content/plugins/` directory.
2. Activate the plugin through the 'Plugins' menu in WordPress.
3. Navigate to Settings > Carousel Settings to configure options:
    - Enable/disable carousel and autoplay for galleries.
    - Adjust carousel autoplay delay and text animation delay.
    - Enable/disable infinite looping for carousels.
4. Add the `elcwg_carousel_active` class to any WordPress gallery block to enable the carousel.

= Additional CSS Classes =

You can add these additional CSS classes to your gallery block for enhanced functionality:

* `elcwg-full-width` - Makes the carousel extend to full browser width, breaking out of content containers.
* `elcwg-overlay-dots` - Positions the navigation dots as an overlay on top of the images instead of below.
* `elcwg-no-arrows` - Hides the previous/next navigation arrows.
* `elcwg-no-dots` - Hides the navigation dots.
* `elcwg-no-captions` - Hides image captions.

Example: Add `elcwg_carousel_active elcwg-full-width elcwg-overlay-dots` to create a full-width carousel with overlay navigation dots.

== Frequently Asked Questions ==

= How do I enable the carousel for a gallery? =
Add the `elcwg_carousel_active` class to a WordPress gallery block in the block editor or via custom CSS/HTML. Ensure the "Enable Carousel" option is checked in the plugin settings.

= Can I customize the autoplay speed? =
Yes, go to Settings > Carousel Settings and adjust the "Autoplay Delay (ms)" field. The minimum is 1000ms (1 second).

= Does the carousel support mobile devices? =
Yes, the carousel is responsive and includes swipe gestures for touch devices. It adjusts to single-slide view on screens smaller than 480px.

= Is the plugin secure? =
Yes, all settings are sanitized on input and escaped on output to prevent security issues, following WordPress coding standards.

== Screenshots ==

1. Carousel in action with navigation arrows and dots.
2. Admin settings page for configuring carousel and text animations.
3. Text animation applied to a heading.

== Changelog ==

= 1.3.20 =
* Restored: dismissible donate notice on the Carousel Settings and Gallery Presets admin pages (screen IDs updated for the new top-level menu structure).

= 1.3.19 =
* Fixed: image picker (add/remove/reorder images) and preset editing now work. The admin script enqueue was comparing against a guessed hook name that did not match what WordPress generates for a submenu of a custom top-level menu. The enqueue function now captures the exact hook suffix returned by add_submenu_page() and compares against that.

= 1.3.18 =
* Fixed: admin_enqueue_scripts hook name corrected from elcwg-settings_page_elcwg-presets to toplevel_page_elcwg-presets (partial fix — see 1.3.19 for the complete fix).

= 1.3.17 =
* Fixed: browser focus ring (white circle) no longer persists after clicking an arrow with the mouse. Uses :focus-visible so keyboard users still get an outline for accessibility.
* Added: white ring ripple animation after clicking an arrow — expands and fades out in 0.55 s. Resets correctly on rapid clicks. Disabled for users who prefer reduced motion.
* Fixed: missing type="button" attribute on arrow buttons (prevented accidental form submission).

= 1.3.16 =
* Fixed: navigation arrows are now perfectly centered in their circle on all browsers and fonts. Replaced text characters (‹ ›) with inline SVG chevrons and switched from line-height/text-align centering to flexbox — text glyph metrics vary per font and caused the icon to appear offset.
* Improved: arrow buttons slightly enlarged (36 px → 40 px) for better touch targets, padding reset to zero so no browser default interferes.

= 1.3.15 =
* Changed: Gallery Presets submenu label renamed to "Galleries"; Settings submenu label renamed to "Native Settings".
* Added: Full i18n coverage — fresh .pot generated from source; .po and compiled .mo files for English (en_US), French (fr_FR), Spanish (es_ES), Traditional Chinese / Taiwan (zh_TW), Korean (ko_KR), and Japanese (ja).

= 1.3.14 =
* Improved: Plugin menu moved from Settings to a dedicated top-level Carousel entry in the admin sidebar, with Settings and Gallery Presets as sub-pages. Provides faster access without hunting through the Settings menu.
* Improved: Preset edit form reorganised into Identity, Behavior, Appearance, and Images sections for faster scanning. All checkboxes now carry inline labels explaining what each option does.
* Improved: Settings page now links directly to Gallery Presets and uses inline checkbox labels consistent with the preset form.

= 1.3.13 =
* Fixed: carousel inside a constrained group block (is-layout-constrained + wp-container-* class) no longer breaks out to full viewport width. The elcwg-full-width breakout relies on margin-left:50% resolving against the viewport — inside a constrained group the 50% reference is the group's narrower width, causing misalignment. JS now also detects this case (in addition to the inline-style check from v1.3.12) and skips the breakout, letting the carousel fill the group naturally.

= 1.3.12 =
* Fixed: carousel no longer overflows a width-constrained group block (e.g. width:80%). The full-width breakout (width:100vw + margin-left:50%) uses the parent width as its reference point; inside a narrow group the math resolves incorrectly. JS now skips the elcwg-full-width class when the gallery's direct parent has an explicit inline width, letting the carousel fill the parent naturally instead.
* Fixed: added min-width:0 to the carousel wrapper so it cannot be stretched wider than its declared width when it is a flex item inside a flex-row group block (browsers default flex items to min-width:auto which allows expansion to min-content size).

= 1.3.11 =
* Fixed: carousel now respects the width set on the gallery block via Block Settings → Dimensions. WordPress writes these as inline styles on the gallery element; after JS wrapping the carousel, that percentage became relative to the wrapper (inner context) rather than the original parent. The inline width and max-width are now migrated to the outer wrapper before insertion.

= 1.3.10 =
* Fixed: alignwide carousel now respects the parent group block's custom wide-size set in Block Settings. Removed the explicit width override that forced the global theme wide-size, letting WordPress's constrained-layout container CSS supply the correct value (including any per-group custom content/wide width).

= 1.3.9 =
* Fixed: full-width carousel wrapper now uses !important on width, max-width, margin-left, and margin-right — WordPress block-theme container CSS was applying margin-left:auto !important and max-width:80% to all direct non-alignfull children of a group block, overriding the breakout technique and shifting the carousel to the left.

= 1.3.8 =
* Fixed: full-size gallery no longer flashes before the carousel initializes — slides are hidden until JS setup completes, with a CSS spinner shown in their place.
* Fixed: WordPress "Full width" alignment now uses the plugin's own full-width implementation instead of relying on theme CSS selectors that target the gallery element directly.
* Fixed: WordPress "Wide width" alignment now expands the wrapper to --wp--style--global--wide-size (block themes) with a 1200px fallback.
* Fixed: float:none on carousel wrapper prevents theme alignment CSS from floating the carousel.

= 1.3.7 =
* Fixed: carousel no longer overflows into adjacent page sections when its parent container has an explicit height (e.g. a group block set to height:200px). The wrapper now uses a flex-column layout with height:100% and overflow:hidden — it fills the parent when constrained and falls back to auto-height when the parent is unconstrained.
* Fixed: carousel images now use object-fit:cover so they fill their slot without distortion when height is constrained by a parent block.
* Fixed: navigation dots changed from <span> back to <button type="button"> — aria-label is not valid on spans without a role.

= 1.3.6 =
* Fixed: carousel slides overflowing into the footer — browsers do not apply overflow:hidden to GPU-composited children (will-change:transform promotes the inner track to its own layer). Added clip-path:inset(0) to the gallery which clips composited layers reliably.
* Fixed: removed :first-child/:last-child edge-padding rules that produced wrong gaps when loop cloning is active.

= 1.3.5 =
* Fixed: overflow:hidden moved from the wrapper to the gallery element — the wrapper was creating a block formatting context that corrupted page flow and caused the carousel to visually bleed into the footer.
* Simplified: removed text animation and caption font-size settings (not relevant to carousel).
* Simplified: settings page is now a single flat table — Enable Carousel, Autoplay, Delay, Loop.
* Simplified: CSS stripped of all hero/animation variants; captions are plain overlays with no JS animation.

= 1.3.4 =
* Fixed: Carousel wrapper no longer copies is-layout-flex from the gallery — WordPress CSS was turning the wrapper into a flex row, placing the gallery and navigation dots side by side instead of stacked.
* Fixed: Wrapper now has display:block !important so WordPress layout classes can never override it.
* Fixed: Wrapper still inherits WordPress alignment classes (aligncenter, alignwide, alignfull) so theme centering rules apply.

= 1.3.3 =
* Fixed: Carousel wrapper now inherits WordPress alignment and layout classes (aligncenter, alignwide, is-layout-*, etc.) from the gallery block, so theme centering rules apply correctly.

= 1.3.2 =
* Fixed: Preset shortcode galleries now activate as carousels even when the global "Enable Carousel" setting is off — preset galleries are self-contained.
* Fixed: Preset list table now shows [elcwg_gallery preset="slug"] for presets with stored images instead of the outdated ids="..." placeholder.

= 1.3.1 =
* Added: Image picker in preset edit form — select, reorder (drag-and-drop), and store images directly inside a preset.
* Added: [elcwg_gallery preset="slug"] shortcode now works without ids= attribute when images are stored in the preset.

= 1.3.0 =
* Added: Gallery Presets admin page (Settings > Gallery Presets) with WP_List_Table UI for creating and managing named carousel presets.
* Added: [elcwg_gallery preset="slug" ids="1,2,3"] shortcode renders a standalone carousel using preset settings, independent of global plugin settings.
* Added: Per-carousel data-attribute overrides in frontend JS — shortcode galleries use preset settings; existing CSS-class galleries continue to use global settings.

= 1.2.0 =
* Fixed: Carousel dots changed from <span> to <button type="button"> — aria-label is prohibited on spans with no ARIA role, causing accessibility audit failures.

= 1.1.9 =
* Fixed: Navigation arrows no longer shift vertically when changing slides. The inner container height is now locked to the tallest slide on load and on resize, so top: 50% always resolves to the same pixel position.

= 1.1.8 =
* Fixed: Added !important overrides to counter WordPress has-nested-images gallery CSS that was fighting plugin layout rules, causing columns and images to appear off-center or wrong size.

= 1.1.7 =
* Fixed: Navigation arrows are now always vertically centered relative to the image area only, not the full wrapper (which included the dots below).

= 1.1.6 =
* Improved: Images now display at their natural size (never stretched), centered within their column slot. Nothing is ever cropped. Previously images were forced to 100% slot width which distorted portrait images.

= 1.1.5 =
* Improved: Carousel now always shows exactly the number of columns selected in the gallery block. On mobile (< 480px) it forces 1 column. Removed intermediate breakpoint that was capping columns at 2 on tablets.

= 1.1.4 =
* Fixed: Carousel now fills its container div exactly, with no extra side padding — the container's own spacing is respected.

= 1.1.3 =
* Fixed: Carousel slides now fit within screen width without truncation, with consistent padding between cards and screen edges.
* Fixed: Overrides WordPress default gallery gap to prevent slides from being pushed off-screen.
* Improved: Mobile view (< 480px) shows a single full-width card with proper padding.

= 1.1.2 =
* Added: `elcwg-no-arrows` class to hide navigation arrows.
* Added: `elcwg-no-dots` class to hide navigation dots.
* Added: `elcwg-no-captions` class to hide image captions.

= 1.1.1 =
* Fixed: Added escaping to inline CSS output to prevent potential XSS vulnerabilities.

= 1.1.0 =
* Added text animation delay setting.
* Improved carousel responsiveness.

= 1.0.6 =
* Fixed issues with more than 4 columns in gallery.
* Fixed mobile issues with partial image sliding.
* Renamed plugin to "Effortless Carousel with Gallery".
* Removed parallax background functionality.
* Updated settings page and documentation to focus on carousel and text animations.

= 1.0.5 =
* Added sanitization for all settings to resolve WordPress Plugin Check errors.
* Ensured compatibility with carousel autoplay functionality.

= 1.0.4 =
* Added explicit autoplay setting for carousel in admin panel.
* Fixed missing carouselAutoplay in JavaScript settings.

= 1.0.3 =
* Enhanced carousel with touch/swipe support and improved autoplay.
* Optimized CSS for smoother animations and responsiveness.

= 1.0.2 =
* Simplified carousel JavaScript for better performance.
* Improved responsive design in CSS.

= 1.0.1 =
* Fixed minor bugs in settings page.
* Improved documentation.

= 1.0.0 =
* Initial release with parallax, text animation, and carousel features.

== Upgrade Notice ==

= 1.1.1 =
This update includes a security fix for inline CSS output. Please update to ensure your site remains secure.

= 1.0.6 =
This update renames the plugin to "Effortless Carousel with Gallery" and removes parallax functionality. Update to align with the new focus and ensure compatibility.

== License ==

This plugin is licensed under the GPLv2 or later. See the License URI for details.