# Changelog

All notable changes to Essential Pro Pack are documented here.
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

---

## [1.7.0] — 2026-04-06

### Security
- Fixed unescaped output in team-member widget bio toggle buttons — now uses `esc_attr()` at `data-read-more`/`data-read-less` attributes and `esc_html()` on button text
- Fixed unescaped `$post_id` in popup admin list column — replaced `printf()` with `absint()` + `echo`

### Fixed
- Added missing `translators` comment for `_n()` call in post-grid reading time output
- Removed redundant double `esc_url()` on post-navigation prev/next URL variables
- Removed incorrect `size_units` from post-featured-image hover scale control (CSS transform scale is unitless)
- Moved `// phpcs:ignore` comments from HTML context into PHP blocks in woo-products widget (were rendering as visible page text)
- Downloaded missing `lottie.min.js` (v5.12.2) into `assets/vendor/lottie/` — Lottie widget was silently non-functional

### Infrastructure
- Added `phpcs:ignore NonPrefixedClassFound` inline comments across all 70+ widget and dynamic tag class declarations
- Added `index.php` (directory browsing protection) to 117 plugin subdirectories
- Bumped `Stable tag` and `EPP_VERSION` constant to `1.7.0`
- Updated `readme.txt`: fixed widget count (49 → 46), removed 6 descriptions for deregistered widgets, added WP.org-compliant tags

---

## [1.6.2] — 2026-04-02

### Enhanced — Widget Customizations

**Advanced Button**
- Added `hover_fill` control: fill-slide animation (left/right/top/bottom) via `prefix_class`
- Added `hover_fill_color` control for slide fill color
- CSS: `::before` pseudo-element fill-slide transitions for all four directions

**Post Grid**
- Added `layout` option: `masonry` (CSS columns-based)
- Added `show_filter_tabs` / `filter_all_text` controls for AJAX-style category filter tabs
- Added `image_hover_zoom` prefix class `epp-pg--imgzoom-yes`
- Render: outputs `epp-pg-filter-tabs` bar with all site categories; cards carry `data-cats` attribute
- JS (`post-grid.js`): client-side `initFilterTabs()` — fade in/out cards by slug
- CSS: `.epp-pg-masonry` column layout, `.epp-pg-filter-tabs` / `.epp-pg-filter-btn` styles

**WooCommerce Products**
- Added `show_filter_tabs` / `filter_all_text` category filter controls
- Added `show_oos_badge` / `oos_badge_text` out-of-stock badge controls
- Added `pagination_type` / `load_more_text` Load More controls
- Render: OOS badge + `.epp-wp-card--oos` class, filter tabs bar, Load More button
- Created `script.js`: `initFilterTabs()` + `initLoadMore()` with fetch/AJAX append
- `get_script_depends()` → `epp-woo-products-script`
- CSS: `.epp-wp-badge--oos`, `.epp-wp-card--oos`, filter tabs, load-more button

**Login / Register**
- Added `enable_recaptcha` / `recaptcha_site_key` / `recaptcha_theme` reCAPTCHA v2 controls
- Added `show_terms` / `terms_text` / `terms_link` / `terms_link_text` Terms checkbox controls
- Added `login_success_message` / `reg_success_message` custom success message controls
- Render: enqueues Google reCAPTCHA script on demand; outputs `.epp-lr-recaptcha` div and `.epp-lr-terms` checkbox before each form's submit button
- CSS: `.epp-lr-terms`, `.epp-lr-recaptcha` styles

**Team Member**
- Added `department` text control (shown above name)
- Added `email` / `phone` contact controls with mailto/tel links
- Added `popup_on_click` switcher — clicking card opens a full-detail modal
- Render: outputs `.epp-tm-department`, `.epp-tm-contact` block, and `.epp-tm-modal-overlay` popup
- Created `assets/js/script.js`: open/close modal, Escape key, overlay click, focus management
- `get_script_depends()` → `epp-team-member-script`
- CSS: department label, contact links, full modal overlay + animation

**Image Carousel**
- Added `show_caption` switcher — overlays attachment caption on each slide
- Added `pause_on_hover` switcher
- JS: `pauseOnMouseEnter` passed to Swiper autoplay config
- CSS: `.epp-ic-caption` overlay with fade-up on hover

**Content Toggle**
- Added `label_1_icon` / `label_2_icon` (ICONS controls) — icon rendered before each label
- Added `savings_badge` text control — `.epp-ct-badge` shown between switch and label 2
- Render: `Icons_Manager::render_icon()` in both switch and button-group styles; badge conditional output
- JS: `wrap.dataset.active` synced on each toggle for CSS-driven badge visibility
- CSS: label flex icon gap, `.epp-ct-badge` pill style

**Timeline**
- Added `horizontal` layout option to the `layout` SELECT control
- Render: separate horizontal branch — date in `.epp-timeline-h-top`, icon in `.epp-timeline-h-middle` with half-lines either side, card below
- CSS: flex-row wrap, `.epp-timeline-h-line`, responsive collapse to vertical ≤640 px

### Internal
- `core/Asset_Manager.php`: registered `epp-team-member-script` and `epp-woo-products-script`

---

## [1.6.1] — 2026-04-02

### Removed — 13 Redundant Widgets
The following widgets were removed because they duplicated Elementor FREE's own widgets or had negligible real-world usage:

**Elementor FREE duplicates removed:**
- `video` — Elementor's Video widget is identical
- `social-icons` — Elementor's Social Icons widget is identical
- `alert-box` — Elementor's Alert widget is identical
- `progress-bar` — Elementor's Progress Bar widget is identical
- `testimonial` — Elementor's Testimonial Slider widget is identical
- `flip-box` — Elementor's Flip Box widget is identical
- `price-list` — Elementor's Price List widget is identical
- `countdown-timer` — Elementor's Countdown widget is identical

**Internal duplicates removed:**
- `animated-heading` — `fancy-heading` covers all use cases
- `dual-button` — `advanced-button` covers all use cases

**Near-zero usage removed:**
- `audio-player` — Users prefer SoundCloud/Spotify embeds
- `business-hours` — Extremely niche; used by <1% of sites
- `pdf-viewer` — Basic iframe; Google Docs embed is preferred

### Internal
- Widget count updated: 65 → **52**
- All removed widget folders, styles, and scripts fully purged

---

## [1.6.0] — 2026-04-02

### New Widgets — Theme Builder (12)
- **Site Logo** — Outputs the site logo set in Customizer (or a custom image fallback), with optional home link, width slider, opacity, border-radius, and hover CSS filter controls.
- **Nav Menu** — WordPress navigation menu widget with horizontal/vertical layouts, hover dropdowns, hamburger toggle on mobile, and full item/dropdown/hamburger style controls.
- **Site Title** — Dynamic site name from Settings → General with HTML tag selector, optional home link, typography, color, and text-shadow controls.
- **Site Tagline** — Dynamic site tagline from Settings → General with HTML tag selector, alignment, and typography controls.
- **Post Title** — Dynamic current-post title with HTML tag selector, optional permalink link, alignment, typography, color, hover color, and text-shadow controls.
- **Post Content** — Outputs `the_content()` for the current post/page — the essential widget for Theme Builder single templates.
- **Post Featured Image** — Current post featured image with size picker (thumbnail → full), link target (none/post/file/custom), border-radius, shadow, and normal/hover CSS filter controls.
- **Post Excerpt** — Post excerpt with configurable word limit, optional styled Read More link, and typography/color controls.
- **Post Meta** — Repeater of meta items — date, modified date, author, categories, tags, comment count, estimated reading time, or any custom meta key — with icon, label, separator, and full color/typography controls.
- **Archive Title** — Dynamic archive/category/tag/author/search page title with optional type prefix, HTML tag, alignment, and typography controls.
- **Archive Description** — Taxonomy term description for Theme Builder archive templates with alignment and typography controls.
- **Post Navigation** — Previous/Next post links with label, post title, directional arrows, stay-in-category option, and full typography/color/border/shadow style controls.

### Popup Builder Enhancements
- **New Trigger — After Form Submit** — Open popup on successful form submission. Supports EPP native forms, Contact Form 7 (`wpcf7mailsent`), and any generic form via CSS selector. Also fires on the custom `epp_form_success` JS event for programmatic integration.
- **New Trigger — After Add to Cart** — Open popup when a product is added to the WooCommerce cart (hooks into WooCommerce `added_to_cart` AJAX event).
- **New Behavior — Redirect on Close** — Optionally redirect the page to any URL when the popup is dismissed (close button or overlay click).
- **New Condition — Front Page Only** — Show popup exclusively on the site's front page.
- **New Condition — Blog / Posts Page** — Show popup only on the main posts listing page.
- **New Condition — Search Results** — Show popup only on search results pages.
- **New Condition — WooCommerce Shop Page** — Show only on `is_shop()`.
- **New Condition — WooCommerce Single Product** — Show only on `is_product()`.
- **New Condition — WooCommerce Cart Page** — Show only on `is_cart()`.
- **New Condition — WooCommerce Checkout Page** — Show only on `is_checkout()`.
- **New Condition — WooCommerce My Account** — Show only on `is_account_page()`.
- **New Condition — Referrer URL Contains** — Show popup only when the visitor arrived from a specific referring domain or URL fragment (e.g. `google.com`, `facebook.com`).

### Theme Builder Enhancements
- **New Template Type — Landing Page** — Full-page template that suppresses the site header and footer. Use with page-specific display conditions to build dedicated landing pages without theme chrome.
- WooCommerce template types (Product, Shop, Cart, Checkout, My Account) were already present and now fully confirmed working with guarded `function_exists()` checks.

### Internal
- **Version** bumped to `1.6.0`.
- **Widget count** updated to 65 across plugin header and documentation.

---

## [1.5.1] — 2026-04-02

### New Widgets
- **WooCommerce Mini Cart** — Cart icon with live item-count badge and flyout dropdown (click or hover trigger). Renders `woocommerce_mini_cart()` output including product thumbnails, item names, quantities, remove links, subtotal, and cart/checkout buttons. `woocommerce_add_to_cart_fragments` filter keeps the count badge in sync on AJAX add-to-cart without a page reload. Style controls: trigger button color/bg/hover, icon size, text typography, count badge bg/color/size, dropdown width/bg/padding/radius/border/shadow.
- **WooCommerce Add to Cart** — Standalone add-to-cart form for the current product page or any product by ID. Shows optional quantity input using `woocommerce_quantity_input()`, respects min/max purchase quantities, and gracefully shows an "Out of Stock" notice when needed. Style controls: button bg/color/hover, typography, padding, radius, border; quantity input color/bg/width/radius/border.

---

## [1.5.0] — 2026-04-01

### New Widgets (18)
- **Fancy Heading** — Decorative headings with prefix/suffix text, gradient or highlight fills, letter-spacing controls, and animated entrance.
- **Info List** — Icon + title + description repeater with vertical/horizontal layout, icon shape controls, connector lines, and full typography/color styling.
- **Download Button** — File download trigger with icon, label, file-size badge, hover background/color, and full border/radius/padding controls.
- **Back to Top** — Fixed-position scroll-to-top button with scroll-offset trigger, icon, tooltip, fade animation, position (bottom-right/left), and style controls.
- **Reading Progress** — Fixed top/bottom progress bar tracking scroll depth with configurable height, color, background, and optional percentage tooltip.
- **One Page Nav** — Sticky vertical dot navigation for single-page sites with active dot highlight, tooltip labels, and dot color/size/active color controls.
- **Content Toggle** — Two-panel toggle (e.g. Monthly/Yearly) via Elementor templates or WYSIWYG content with animated slide/fade switch and full style controls.
- **Image Carousel** — Swiper-powered image carousel with lightbox, zoom hover, responsive breakpoints, arrows, dots, and autoplay.
- **Lottie** — Renders Lottie JSON animations with autoplay, loop, speed, direction, hover-trigger, scroll-trigger, and click-to-play mode.
- **Audio Player** — Custom HTML5 audio player with progress bar, play/pause, seek, volume, mute, and full color/size style controls.
- **Pie Chart** — Animated SVG donut chart with IntersectionObserver trigger, percentage label, stroke color/width, track color, and typography controls.
- **Author Box** — Post author avatar, name, bio, and social links with show/hide avatar, name tag, bio typography, and card background/border/padding.
- **Related Posts** — Related posts grid by category/tag with thumbnail, title, date, read-more link, configurable post count, columns, and card style controls.
- **Login / Register** — Combined login + registration tabs with AJAX submission, redirect URL, custom labels, error/success messages, and full form style controls.
- **Google Map** — Google Maps iframe embed by address or coordinates with configurable zoom, height, border-radius, and box shadow.
- **PDF Viewer** — PDF iframe embed with configurable height and optional download button; style controls for wrapper radius, shadow, and button colors.
- **WooCommerce Products** — WooCommerce product grid with category/tag/SKU filtering, configurable columns, show/hide price/rating/add-to-cart, and full style controls.
- **Post Comments** — Native WordPress comment list and form for the current post with configurable title and typography/color controls.

### Features
- Login/Register AJAX handler (`includes/class-login-register-handler.php`) loaded via `Plugin.php`.

### Style Controls Audit
- **Advanced Search** — Added Search Button style section: background, hover background, text/icon color, border radius, padding.
- **Advanced Slider** — Added slide button hover background and hover text color controls.
- **Form** — Added Success / Error Messages style section: text color, background, typography, padding, border radius for `.epp-form-success` and `.epp-form-error-global`.
- **Gallery Pro** — Added filter tab background, hover color/bg, active background, padding, border-radius, gap; load-more hover background/color/padding.
- **Post Grid** — Added load-more button style controls (background, color, hover background, typography, padding, radius) gated on `pagination_type` = `load_more`.
- Complete style audit across all remaining 46 widgets; added missing hover states, padding, radius, and color controls throughout.

---

## [1.4.2] — 2026-03-31

### New Widgets
- **Icon Box** — Icon + title + description with top/left/right icon position, hover animation, link wrapping, icon size/color/background/padding/radius, and box background/border/shadow.
- **Social Icons** — Repeater of 15 platform presets with brand colors, circle/square/rounded/none shapes, per-item color override, hover opacity, gap, and border controls.
- **Call to Action** — Heading + subheading + description + two buttons in centered/left/right/split layout with full background, padding, border-radius, shadow, and typography controls.
- **Image Box** — Image + title + description with top/left/right image position, hover effects (zoom/zoom-out/lift/greyscale), link-type control, and full background/border/shadow controls.
- **Progress Bar** — Scroll-triggered animated bars with label, percentage position (inline/tooltip/inside), stripe + animated-stripe option, and per-bar color overrides.
- **Flip Box** — 3D flip (right/left/up/down), fade, or slide effect with independent front/back content, background controls, and optional back-side button.
- **Alert Box** — 4 preset types (success/warning/error/info) with auto-colors, accent styles, optional dismiss button, and fade animation.
- **Video** — YouTube/Vimeo/self-hosted embed with poster thumbnail, 3 play button styles, lightbox mode, aspect ratio control, autoplay/mute/loop.
- **Dual Button** — Two independently-styled buttons with icon position, optional divider text, normal/hover color tabs, and responsive mobile-stack.
- **Business Hours** — Repeater-based weekly schedule with per-day open/closed toggle, today auto-detection, "Open Now" badge, and today-row highlight.
- **Timeline** — Vertical repeater with date/title/description/icon; left/right/alternating layout; staggered scroll-triggered animation.
- **Hotspot** — Image with pin markers at X/Y position, hover/click trigger, tooltip with title/description/link, pulse animation, per-pin icon/color.
- **Price List** — Repeater of items with image/title/description/price/badge; list layout with dotted leader; grid layout with responsive columns.
- **Table of Contents** — Auto-generated nested TOC from page headings, smooth scroll, IntersectionObserver active highlight, collapsible toggle, numbered or icon list.

### Bug Fixes
- Theme Builder — canvas.php approach adopted; `get_post_class()` array concatenation fixed; guard added for direct CPT access.
- Deactivation hook — `esc_like()` added to LIKE pattern for transient flush.

### Performance
- Theme Builder conditions reduced from 3 `get_posts()` calls to 1 with `update_post_meta_cache`.
- Elementor CSS files pre-enqueued during `wp_enqueue_scripts` to prevent FOUC.

---

## [1.4.1] — 2026-03-30

### New Features
- **WooCommerce Dynamic Tags (7)** — Product Price, Product SKU, Product Rating, Product Short Description, Add to Cart URL, Stock Status, Product Gallery Image.
- **Theme Builder Content Templates** — `single_post`, `single_page`, `archive`, `search`, `blog`, `404`, WooCommerce `product`/`shop`/`cart`/`checkout`/`my_account` page types.
- **`[epp_template id="X"]` shortcode** — Embeds Reusable Section templates anywhere; validates post type and publish status.

### Bug Fixes
- Popup Builder — `var fired` name collision between scroll-depth and inactivity triggers renamed to `scrollFired`/`inactivityFired`.
- Theme Builder — `_epp_hf_priority` meta now read during template selection; higher value wins within each specificity tier.

### i18n
- Translation POT file added (`languages/admore-widgets-suite.pot`) with ~150 key strings.

---

## [1.4.0] — 2026-03-29

### New Widgets
- **Team Member** — 4 card styles (Classic, Modern, Overlay, Minimal), social links repeater, photo shape controls, full typography/color style controls.

### Bug Fixes
- Search icon overlap in Widget Manager admin fixed.
- Popup Builder width/height panel now accessible inside Elementor editor via sliding drawer.
- All `error_log()` calls gated behind `WP_DEBUG_LOG`.

### UX
- Theme Builder empty-state template cards centered and enlarged.

---

## [1.3.2] — 2026-03-28

### New Features
- Popup Builder width and height controls with unit selection (px, %, vw, vh).

### UX
- Quick Setup wizard redesigned with hero layout, feature cards, and next-step actions.

### Bug Fixes
- Plugin renamed to Essential Pro Pack (no trademark conflicts).
- All widget wrapper classes added to global box-sizing reset.

---

## [1.3.1] — 2026-03-27

### Features
- Global CSS design system — CSS custom properties for colors, typography, spacing, shadows, radii, and transitions applied across all widget CSS files.

### Improvements
- Advanced Button, FAQ Pro, Testimonial, Pricing Table, Gallery Pro, Post Grid, Countdown Timer, Animated Heading, Advanced Tabs, Breadcrumbs, Advanced Search, Mega Menu — all converted to design system variables.
- Theme Builder admin redesigned with card layout, colored type badges, and status indicators.
- Extension badges (Custom CSS, Sticky, Conditions) polished to gradient pill style.

### Bug Fixes
- Post Grid `.epp-pg-card` selector scope corrected.
- Gallery Pro focus-visible uses design system focus ring.
- All `--epp-text-sm` / `--epp-text-xs` variable fallback values corrected.
- Advanced FAQ wrong text domain `'epp'` corrected to `'admore-widgets-suite'`.
- Editor empty-state placeholders migrated to shared `.epp-editor-placeholder` class.

### Defaults
- FAQ Pro ships with 4 sample items, first item open.
- Gallery Pro ships with 6 named sample items across categories.
- Testimonial Slider quote icon enabled by default.
- Post Grid read-more button enabled by default.
- Advanced Tabs ships with descriptive content (Overview, Features, Details).
- Advanced Slider first 3 slides have distinct gradient backgrounds via CSS `:nth-child`.

---

## [1.3.0] — 2026-03-26

### New Widgets
- **Post Grid** — Dynamic post grid/list/carousel with WP_Query controls, category/tag filters, pagination (numbered/load-more/infinite scroll), and responsive columns.
- **Countdown Timer** — Fixed-date and evergreen countdown with boxes/inline/circle styles and expiry actions (hide/message/redirect).
- **Animated Heading** — Typewriter, rotating, slide, clip, zoom, bounce, and highlight effects with gradient text and text shadow.

### Style Controls Added
- Advanced Button: size presets (XS–XL), CSS ID, icon hover animations.
- Post Grid: image hover zoom toggle, overlay color, card hover background, read-more styling, meta typography, badge radius.
- Countdown Timer: circle size/border color, block min-width, label hide toggle, expiry message style.
- Animated Heading: gradient text via CSS custom properties, letter spacing, text shadow, bottom border toggle.
- FAQ: question style tabs, answer style, toggle-all button style.
- Pricing Table: card hover background/shadow/scale/border, popular card border/scale, feature tooltip colors.
- Gallery Pro: overlay type (solid/gradient), caption animation, custom lightbox icon, hover transition duration, load-more button styling.
- Testimonial: custom quote icon, quote opacity, review text alignment, star gap and spacing.

### Bug Fixes
- Animated Heading — gradient used invalid cross-control Elementor selector; replaced with CSS custom properties.
- Gallery Pro — gradient overlay used invalid cross-control selector; replaced with CSS custom properties.
- Pricing Table — tooltip controls targeted element instead of `::after` pseudo-element.
- Post Grid — image hover zoom always applied; now conditional via `.epp-pg-img-zoom` class.
- Testimonial — star rating gap non-functional; added `display:inline-flex` to rating container.
- Testimonial — quote icon picker added but render used hardcoded SVG; now uses `Icons_Manager`.
- FAQ — missing base CSS for toggle-all button and wrapper.
- Gallery Pro — missing caption animation CSS keyframes.
- Animated Heading — missing `.epp-ah-gradient` and `.epp-ah-has-border` CSS rules.

---

## [1.2.0] — 2026-03-24

### New Widgets
- **Advanced Form** — multi-step form builder with conditional logic, AJAX submission, email/webhook, secure file uploads, honeypot spam protection, and persistent DB storage.
- **Responsive Menu** — accessible hamburger nav with ARIA roles, submenu support, keyboard navigation, and mobile lock scroll.
- **Mega Menu** — full-width mega panel with Elementor template support, keyboard navigation, and mobile accordion fallback.
- **Advanced Slider** — Swiper-powered content slider with custom/template slides, autoplay, and responsive breakpoints.

### Architecture
- **NEW** `core/DB.php` — custom table management: `install()`, `maybe_upgrade()`, `uninstall()`, and full CRUD for form entries.
- **NEW** `includes/class-form-entries.php` — admin UI for form submissions: paginated list, detail view, bulk delete, mark-as-read, CSV export.
- **NEW** `uninstall.php` — drops `{prefix}epp_form_entries` table and all plugin options on plugin deletion.
- Activation hook now calls `EPP_DB::install()` and `flush_rewrite_rules()`.
- `Plugin.php` calls `EPP_DB::maybe_upgrade()` on every load (handles manual plugin copies).
- `includes/class-assets.php` marked `@deprecated 1.1.0`; replaced entirely by `Asset_Manager`.

### Performance
- Global CSS/JS (`epp-global`, `epp-main-script`, `epp-extensions`) now enqueued via `elementor/frontend/after_enqueue_scripts` — **zero load on non-Elementor pages**.
- `register_all()` still fires on `wp_enqueue_scripts` so handles are available for `get_style/script_depends()`.

### Security
- `epp_form_nonce` added to `wp_localize_script` output as a backup nonce source.
- `get_client_ip()` added to `EPP_Form_Handler` (matches implementation in AJAX handler).
- `page_id` and `page_url` sanitized before DB insertion.

### Bug Fixes — Critical
- **`contain:layout` removed from all 9 widget CSS files** — was clipping absolutely-positioned dropdowns (nav-menu, mega-menu) and overflow shadows (card hovers, tooltips).
- **Form submissions now save to `wp_epp_form_entries`** — previously only email/webhook; DB row now written before both.

### Bug Fixes — Form Widget
- Added `form_name` Elementor control to Settings tab.
- `formName`, `pageId`, `pageUrl` added to `data-config` JSON and forwarded in AJAX `FormData`.
- Form handler reads `config['form_name']` with `$form_id` fallback.

### Bug Fixes — CSS/Styling
- Nav-menu submenu toggle rotation used wrong CSS selector (child vs sibling) — fixed.
- `body.epp-menu-lock` CSS rule added to `frontend.css` (was referenced by JS but never defined).
- Search Results layout/columns classes applied to correct inner div.
- FAQ and Advanced FAQ active items now visible on page load.
- Empty CSS rule blocks (`.epp-faq-pro{}` etc.) cleaned up after `contain:layout` removal.

### i18n
- `base-widget.php` spacing control labels wrapped in `__()`.
- `rem` added to dimension `size_units` arrays.

### Docs
- `readme.txt`: PHP 8.0 requirement, stable tag 1.2.0, 11 widgets, new FAQ entries, updated performance claims.
- `CHANGELOG.md`: this entry.

---

## [1.1.0] — 2026-03-24

### Architecture
- **NEW** `core/Plugin.php` — singleton that orchestrates all subsystems.
- **NEW** `core/Asset_Manager.php` — centralised registration of all CSS/JS handles.
- `core/widgets-manager.php` — refactored to static methods + `glob()` auto-discovery.
- `core/init.php` — deprecated; kept as stub for backwards compatibility.

### Performance
- Per-widget CSS via `get_style_depends()` on all 7 widgets — stylesheet only
  loads when the widget is on the page.
- `assets/css/frontend.css` reduced to global variables + box-sizing reset only.
- Seven new per-widget CSS files: `widgets/{name}/assets/css/style.css`.
- AJAX search results cached in transients (5-minute TTL).
- Cache auto-invalidated on `save_post` / `delete_post`.
- Debounce default increased from 300 ms to 400 ms.

### Security
- IP-based rate limiting on `epp_search` AJAX action (60 req/min).
- `epp_refresh_nonce` AJAX action for long-lived cached pages.
- JS nonce auto-refresh on 403 responses (retry once).
- Result cards rendered via DOM `textContent` API — eliminates XSS vector.
- All `$_POST`/`$_SERVER` values run through `sanitize_*`/`wp_unslash`.
- `check_ajax_referer` returns false instead of dying; proper JSON error sent.

### Bug Fixes
- **Process widget** — connector `top` position now tracks the circle size via
  `--epp-num-size` CSS variable set by the Elementor size control.
- **FAQ widget** — added `empty()` guard before `foreach` in `render()`.
- **Search widget** — form submit in `page` mode now redirects to
  `/?s=<keyword>` instead of triggering a silent AJAX call.
- **Testimonial widget** — placeholder SVG shown when no photo is uploaded;
  removed duplicate `get_script_depends()` declaration.

### Admin Panel
- New **Widgets** tab — toggle slider per widget; unchecked widgets are
  excluded from Elementor registration.
- New **Import / Export** tab — download settings as JSON; upload to restore.
- New **License** tab — API key field scaffold (premium features coming soon).
- Inline admin CSS via `wp_add_inline_style` (no extra HTTP request).
- Settings schema versioning stored in `epp_settings_version` option.

### Release Preparation
- Plugin headers updated: `Requires PHP`, `Requires at least`, `Tested up to`,
  `Requires Plugins: elementor`, `License`, `Text Domain`, `Domain Path`.
- PHP 7.4 version gate with clear admin notice.
- `EPP_BASENAME` constant added.
- `epp_load_textdomain()` registered on `init`.
- Deactivation hook flushes all `epp_*` transients.
- Activation hook stamps `epp_settings_version`.
- `readme.txt` created (WordPress.org compatible format).

---

## [1.0.0] — Initial Release

- Advanced Button widget.
- FAQ PRO widget.
- Advanced FAQ widget.
- Process Journey widget.
- Testimonial Slider widget (Swiper).
- Smart Search widget (AJAX).
- Search Results widget.
- Admin settings panel (General, Post Types, Categories, UI tabs).
- AJAX handler with nonce and post-type filtering.
- Elementor Customizer integration.
