=== Luxe Gallery ===
Contributors: jannihares
Donate link: https://jajasolutions.de
Tags: gallery, lightbox, webp, responsive, gutenberg
Requires at least: 5.0
Tested up to: 6.9
Requires PHP: 7.4
Stable tag: 2.2.8
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Premium gallery with customizable hero grid, WebP optimization and immersive fullscreen view for modern websites.

== Description ==

Luxe Gallery revolutionizes WordPress galleries with a visual grid editor that lets you create unique hero layouts. Combined with automatic WebP conversion, category-based organization and an immersive fullscreen view, it offers the perfect solution for professional image presentations.

= Key Features =

* **🎨 Visual Grid Editor**: Create custom hero layouts with drag & drop - uniquely customizable for each gallery
* **📱 Mobile-First Design**: Responsive design with custom slider for mobile devices
* **🗂️ Category-Based Organization**: Organize images in custom categories
* **💡 Lightbox**: Modern, touch-friendly lightbox experience
* **⚡ WebP Optimization**: Automatic WebP conversion for better performance
* **🎨 Drag & Drop Interface**: Intuitive admin interface for managing images
* **📝 Shortcode Support**: Easy integration with `[luxe_gallery id="123"]`
* **🔧 Page Builder Integration**: Native support for Gutenberg, Elementor, Divi, Beaver Builder and Bricks Builder
* **⚙️ Comprehensive Settings**: Fully configurable options for performance and design

= Performance Features =

* **Lazy Loading**: Images are loaded only when needed
* **WebP Support**: Automatic conversion to modern image formats
* **Optimized Database Queries**: Minimal impact on website performance
* **CDN Compatible**: Works with all common CDN solutions

= Page Builder Compatibility =

* **Gutenberg Block**: Native block for the WordPress Block Editor
* **Elementor Widget**: Fully integrated widget with live preview
* **Divi Module**: Custom module for the Divi Builder
* **Beaver Builder Module**: Seamless integration with Beaver Builder
* **Bricks Builder Element**: Native Bricks element with all options

= Technical Details =

* Fully responsive and mobile-optimized
* SEO-friendly with structured data
* Accessibility compliant (WCAG 2.1)
* Translation-ready (i18n)
* Compatible with all major themes and page builders
* Clean, validated code

= Shortcode Usage =

`[luxe_gallery id="123"]`

**Parameters:**

* `id` - The gallery ID (required)
* `show_title` - Show gallery title: yes/no (default: no)
* `title_tag` - HTML tag for title: h1-h6 (default: h2)
* `layout` - Layout style: hero-grid, grid, masonry (default: hero-grid)
* `columns` - Number of columns: 2-6 (default: 4, for grid/masonry layouts)
* `gap` - Gap between images in pixels (default: 8)
* `border_radius` - Border radius in pixels (default: 12)
* `show_image_count` - Show photo count on button: yes/no (default from settings)
* `lightbox` - Enable lightbox: yes/no (default: yes)
* `sharing` - Enable social sharing: yes/no (default: no)
* `virtual_tour` - Virtual tour URL (optional)
* `class` - Additional CSS classes (optional)

**Example with all parameters:**

`[luxe_gallery id="123" layout="masonry" columns="3" gap="12" lightbox="yes" sharing="yes"]`

== Installation ==

1. Upload the plugin via the WordPress admin panel or install it through the plugin directory
2. Activate the plugin through the 'Plugins' menu in WordPress
3. Go to 'Luxe Gallery' > 'Add New' to create your first gallery
4. Configure the plugin settings under 'Luxe Gallery' > 'Settings'
5. Use the shortcode `[luxe_gallery id="ID"]` to display the gallery

= Usage with Page Builders =

**Gutenberg**: Search for the "Luxe Gallery" block in the Block Editor
**Elementor**: Find the "Luxe Gallery" widget in the Elementor sidebar
**Divi**: Add the "Luxe Gallery" module from the Divi Builder
**Beaver Builder**: Select "Luxe Gallery" from the Content Modules
**Bricks Builder**: Use the "Luxe Gallery" element in the Bricks Editor

= Manual Installation =

1. Upload the plugin directory to the `/wp-content/plugins/` folder
2. Activate the plugin through the 'Plugins' menu in WordPress
3. Follow the installation steps above

== Frequently Asked Questions ==

= How do I create a new gallery? =

1. Go to 'Luxe Gallery' > 'Add New'
2. Enter a title for your gallery
3. Select 5 hero images for the grid layout
4. Add categories and organize your images
5. Save the gallery and copy the generated shortcode

= Does the plugin support WebP images? =

Yes, Luxe Gallery automatically converts uploaded images to WebP format for better performance. This can be configured in the plugin settings.

= Is the plugin responsive? =

Absolutely! Luxe Gallery is developed mobile-first and provides optimal display on all devices, from smartphones to desktop computers.

= Can I customize the design? =

Yes, the plugin offers comprehensive settings options. Additionally, you can further customize the appearance with CSS.

= Does it work with my theme? =

Luxe Gallery is designed to be compatible with most WordPress themes. If you encounter issues, please contact support.

= Does the plugin work with page builders? =

Yes! Luxe Gallery offers native integration for all major page builders:
- Gutenberg (WordPress Block Editor)
- Elementor
- Divi Builder
- Beaver Builder
- Bricks Builder

Each builder has its own custom module/widget with live preview and all settings options.

= Which file formats are supported? =

The plugin supports all common image formats: JPEG, PNG, GIF, WebP and SVG.

= Can I use multiple galleries on one page? =

Yes, you can include as many galleries as you like on a page by using multiple shortcodes.

= Are there limits to the number of images? =

No, there are no technical limits. Performance depends on your hosting and the number of images.

== Screenshots ==

1. Hero Grid Layout - Attractive 5-image grid as entry point
2. Mobile Slider - Optimized display for mobile devices
3. Category-Based Gallery - Organized image display with navigation
4. Lightbox - Modern lightbox experience
5. Admin Interface - Intuitive drag & drop management
6. Plugin Settings - Comprehensive configuration options

== Changelog ==

= 2.2.8 =
* Fixed: Hero grid area assignments (e.g. image 4 spanning 2 columns) and per-gallery JS config were missing for logged-out visitors on cached page loads. The transient-cache fast path in `render_shortcode` returned the cached HTML without re-running `wp_add_inline_style()` / `wp_add_inline_script()`, so anyone hitting the cache received markup without the per-gallery grid CSS or the `window.luxe_gallery_config_*` / `window.luxe_gallery_all_images_*` globals. Per-gallery CSS and JS are now emitted as `<style>` / `<script>` tags inside the cached HTML output, so they survive every cache path (page cache, object cache, LiteSpeed CSS combine).

= 2.2.7 =
* Mobile slider: Fixed image bottom corners appearing sharp while top corners rounded — the `.luxe-gallery-image-wrapper` had no height, so the image rendered at its intrinsic aspect and left a bare edge above the slider's rounded bottom. Wrapper now stretches to fill the slide.
* Mobile slider: Pagination dots moved onto a translucent pill (`backdrop-filter: blur(6px)`) so white/black dots stay legible on any image background — sky, shadow, pool water — without drifting off-scene.
* Mobile slider: Pagination now caps at 3 visible dots (prev / current / next) with a sliding window — fixes an accessibility issue where 10+ dots crowded together on long galleries and became indistinguishable.
* Mobile slider: Fixed a long-standing specificity bug where the `.luxe-gallery-container button` reset zeroed out pagination-dot padding and margin, collapsing the intended touch area. Dots now use a ::before overlay for a 38×38 hit zone (exceeds WCAG 2.5.8 AA 24×24) while the visible dot stays 10 px and the pill stays compact.
* Mobile slider: Increased visual spacing between dots (12 px gap) so adjacent targets are distinguishable on touch.
* Mobile slider: "Show all N photos" button no longer wraps to two lines on narrow phones (iPhone SE, 375 px) — added `white-space: nowrap` and `max-width: calc(100% - 32px)`.

= 2.2.6 =
* Admin UI: Fixed icon-to-label spacing on "Add Images" and "Remove Category" buttons — they now raise specificity above WP core `.button` so flex gap wins regardless of stylesheet load order.
* Admin UI: Image "remove" control expanded to a 44×44 px hit area (WCAG 2.5.5) via content-box padding + background-clip; the visible pill stays compact and the control is now always visible on touch devices and on keyboard focus.
* Admin UI: Replaced every inline `style="…"` in the media meta box (Videos, Floor Plan, Before/After) with reusable classes — destructive buttons route through a single `.luxe-remove-btn` token that respects `--luxe-admin-danger`.
* Admin UI: Removed ~10 duplicate CSS selector blocks that made cascade behavior brittle; margins and paddings from the old rules are preserved in the consolidated versions.
* Admin UI: Merged two colliding `@media (max-width: 768px)` blocks and fixed an unreachable `flex-direction: column` on a CSS grid parent — the grid editor now correctly collapses to a single column on mobile.
* Accessibility: Admin body-text secondary color upgraded from #a0a5aa (2.3:1, fail) to #646970 (4.56:1, pass WCAG AA). Three other grey-on-white contrast failures on remove-links and empty-state text now use the same token.
* i18n: Empty-state hints ("No categories yet…", "Drop images here…") moved from hard-coded CSS strings to translatable PHP via `data-empty-text` attributes.

= 2.2.5 =
* Security: AI custom endpoint URL now validated against an http(s) allowlist; outbound calls refuse loopback/private/reserved IPs to block SSRF.
* Security: PDF export and original-download AJAX endpoints now require edit_post / read_post on the specific gallery instead of a generic site-wide capability.
* Security: Gallery password sessions default to 2-hour lifetime (filterable via `luxe_gallery_password_session_lifetime`) and uninstall now scrubs cache-version and floor-plan hotspot meta.
* Performance: Gallery output cache invalidation now uses per-post version keys, so saves invalidate transients on external object caches (Redis, Memcached) without enumerating hashed keys.
* Accessibility: Screen readers now hear a single polite announcement per lightbox navigation ("Image 3 of 12, caption") instead of two separate regions firing.
* Accessibility: Before/After slider exposes `aria-valuetext` with human-readable percentages and labels.
* Accessibility: Focus rings meet WCAG 2.4.7 — thicker outline plus light contrast layer so rings stay visible over dark and light images.
* Accessibility: Keyboard shortcuts (F/G/?/Home/End) are now scoped to the gallery container, preventing cross-gallery conflicts on pages with multiple instances.
* Accessibility: Lightbox focus trap now includes iframes, links, and custom tabindex elements so embedded video controls stay reachable.
* Accessibility: Decorative icons carry `aria-hidden="true"`; inline `<dialog>` on grid/masonry layouts announces as a region, not a dialog.
* Accessibility: Alt text now prefers `_wp_attachment_image_alt` across every rendering path (template, lightbox, floor plan).
* Accessibility: Plugin ships its own `.screen-reader-text` utility so SR-only text works even on themes that omit it.

= 2.2.4 =
* Fixed: Lightbox caption showing image filename even when "Show image titles" setting is disabled

= 2.2.3 =
* Fixed: Hero grid layout broken — CSS class mismatch (.item-X vs .area-X) caused flat grid instead of Airbnb-style 2x2+4 layout
* Fixed: Lightbox shows blank images when lazy-loading plugin (LiteSpeed/WP Rocket) replaces img src with data-URI placeholder
* Fixed: "Show all photos" dialog empty when gallery has only hero images and no categories — now falls back to hero images
* Fixed: LQIP thumbnail images no longer duplicated in lightbox navigation (aria-hidden images filtered out)

= 2.2.2 =
* Full view now uses native HTML dialog element — proper focus trapping, Escape key handling, and top-layer rendering
* Fixed: Plugin settings (colors, gap, border radius, button text) now correctly applied on the frontend
* Fixed: Custom button text setting for "Show all photos" button
* Fixed: Hero images now included in lightbox navigation (click hero image → opens lightbox)
* Fixed: Critical error on gallery admin list when gallery data stored as array instead of JSON
* Fixed: Data loss when saving gallery with only videos/floor plan but no categories
* Fixed: Transient key injection in WebP conversion progress handler
* Fixed: Feature buttons (Video, Floor Plan, Before/After) now visible on mobile
* Fixed: Layout shortcode parameter (grid/masonry) now respected
* Fixed: LuxeLightbox and LuxeCompare re-entrant close/destroy crash
* Fixed: Gutenberg block TypeError on non-block-editor pages
* Fixed: Uninstall now cleans up all meta keys (videos, floor plan, before/after)
* Fixed: Transient cache now invalidated when plugin settings change
* Improved: Hero images with width/height attributes, srcset/sizes, and fetchpriority for better Core Web Vitals
* Improved: Full view focus restoration for accessibility
* Improved: Skeleton loading animation made more subtle

= 2.0.5 =
* Fixed translations not working: bundled .mo now loads via load_textdomain() before WP.org JIT translations can override with incomplete data
* "Show all X photos" button now correctly displays in German (and other languages)

= 2.0.4 =
* Regenerated .pot file with all translatable strings (was outdated from v1.0.1)
* Fixed "Show all X photos" button not translatable (string was missing from .pot)
* Fixed "photo/photos" plural form not translatable (missing from .pot)
* Fixed lightbox strings (Close, Share, Previous/Next) not translatable (missing from .pot)
* Completed 100% German (de_DE + de_DE_formal) translations for all 214 strings
* Added translations for all page builder modules (Elementor, Divi, Beaver Builder, Bricks)

= 2.0.3 =
* Fixed mobile slider pagination dots jumping when clicking through slides
* Fixed back-to-grid button positioned in center of modal instead of at navigation
* Reduced excessive gap between category navigation and first category section
* Fixed show_image_count setting still showing count when disabled (default changed to false)
* Added German formal (de_DE_formal) translation files
* Smooth dot visibility transitions instead of abrupt display:none jumps

= 2.0.2 =
* Fixed category navigation no longer scrolls sticky with page
* Fixed show_image_count setting being ignored when unchecked
* Fixed all checkbox settings not saving correctly when unchecked
* Fixed German translations not loading (enabled load_plugin_textdomain)
* Added German translations for plural photo/photos, settings descriptions, and lightbox strings
* Fixed grid images not filling full height (picture element + wrapper height)
* Fixed hover removing rounded borders on grid images
* Added black border to slider pagination dots for better visibility
* Slider pagination now shows max 5 dots with sliding window navigation
* Updated settings description to remove outdated PhotoSwipe reference
* Regenerated .mo translation file

= 2.0.1 =
* Fixed critical SyntaxError caused by ES module export statement
* Fixed grid image display issues
* Fixed button icon alignment
* Added proper version bumping for WordPress update detection

= 2.0.0 =
* **Major Performance Rewrite**: Removed all third-party libraries
* Replaced Swiper.js (151KB) with custom CSS scroll-snap slider (~2KB)
* Replaced PhotoSwipe (68KB) with custom lightweight lightbox (~4KB)
* Removed jQuery dependency — zero external dependencies
* Frontend JS reduced from 246KB to 26KB (−89%)
* Frontend CSS reduced from 41KB to 20KB (−51%)
* HTTP requests reduced from 6 files to 2 files
* Optimized PHP: deduplicated WebP logic, reduced per-image overhead
* Optimized Icon.png from 1.1MB to 44KB
* Uses O(1) associative array for image deduplication instead of in_array()
* Single wp_upload_dir() call per render instead of per-image
* Custom lightbox features: pinch-to-zoom, swipe nav, wheel zoom, double-click zoom, preloading, Web Share API

= 1.1.0 =
* WordPress 6.9 compatibility with Gutenberg Block API v3
* Added extended shortcode parameters: show_title, title_tag, layout, columns, gap, border_radius, lightbox, sharing, virtual_tour
* Added new layout options: hero-grid, standard grid, and masonry
* Added virtual tour button integration
* Added comprehensive hooks and filters system for developers
* Added Display Defaults settings section (layout, columns, gap, border radius, lightbox, sharing)
* Added Branding settings section (button text, colors, accent color)
* Added skeleton loading animation for images
* Added blur-up image loading effect
* Added sticky category navigation in fullscreen view
* Added social sharing functionality in lightbox (Web Share API with fallback)
* Added deep linking support for lightbox images (shareable URLs)
* Added extended keyboard shortcuts (F to open, G to close, Home/End for navigation)
* Updated Elementor widget with layout, columns, features, and virtual tour controls
* Updated Divi module with layout, columns, lightbox, sharing, and virtual tour options
* Updated Beaver Builder module with full feature parity
* Improved Bricks Builder integration with extended controls
* Fixed Bricks Builder labels (internationalization)
* Improved accessibility with focus states
* Performance optimizations with CSS custom properties

= 1.0.1 =
* Updated all original strings to en_US for Polyglots compliance
* Synced localization files and builder labels
* Prepared release assets for WordPress.org distribution

= 1.0.0 =
* Initial release
* Hero grid layout with 5 configurable images
* Category-based gallery organization
* Mobile-optimized Swiper slider
* PhotoSwipe lightbox integration
* Automatic WebP conversion
* Comprehensive plugin settings
* Drag & drop admin interface
* Full internationalization
* Performance optimizations

== Upgrade Notice ==

= 1.1.0 =
Major update with WordPress 6.9 compatibility, extended shortcode parameters, new layout options, hooks/filters for developers, and UI improvements.

= 1.0.1 =
Ensures English originals before translation on translate.wordpress.org.

= 1.0.0 =
Initial release of Luxe Gallery - the most modern gallery plugin for WordPress.

== Technical Information ==

= Minimum Requirements =

* WordPress 5.0 or higher
* PHP 7.4 or higher
* MySQL 5.6 or higher
* At least 64MB PHP Memory Limit

= Recommended Requirements =

* WordPress 6.0 or higher
* PHP 8.0 or higher
* MySQL 8.0 or higher
* 128MB PHP Memory Limit
* GD Library or ImageMagick for WebP conversion

= Used Libraries =

* No external JavaScript libraries — all components are custom-built
* Zero dependencies for optimal performance

= Support =

For support and questions visit:
* Website: https://jajasolutions.de
* Plugin Support Forum: https://wordpress.org/support/plugin/luxe-gallery (after publication)
* Developer: Janni Hares

= Contributing =

Contributions are welcome! Visit our GitHub repository for more information.

= Privacy =

Luxe Gallery does not collect any personal data from website visitors. All data is stored locally in your WordPress installation.