=== LandTech Extras for Elementor ===

Contributors: brelandr
Tags: elementor, page-builder, widgets, addons, extensions
Requires at least: 6.2
Tested up to: 7.1
Stable tag: 3.0.5
Requires PHP: 7.4
License: GPLv3 or later
License URI: https://www.gnu.org/licenses/gpl-3.0.html

60+ free Elementor widgets: gallery, testimonials, FAQ, pricing, calendar, maps, posts, plus display conditions and editor tools.

== Description ==

**60+ free Elementor widgets and editor extensions — no upsells, no locked features.**

LandTech Extras for Elementor is a complete, actively maintained Elementor addon. If you built pages with the original Elementor Extras (by Namogo) and lost access to those widgets, this is the drop-in replacement — existing templates using slugs like `ee-calendar`, `posts-extra`, and `ee-gallery` keep working after you switch.

**Everything listed below is free.** Optional API keys (Google Maps, Snazzy Maps, Instagram) live under Elementor Extras → APIs. Full documentation: [extrasforelementor.com/docs](https://extrasforelementor.com/docs/).

**[Try it instantly — no install required →](https://playground.wordpress.net/?blueprint-url=https://plugins.svn.wordpress.org/landtech-extras-for-elementor/assets/blueprints/blueprint.json)**
The WordPress Playground blueprint installs Elementor and this plugin, seeds demo content, and builds a live demo page per widget. Log in as admin / password to explore.

== Optional Premium add-on ==

This plugin is complete on its own. **LandTech Extras for Elementor Premium** is a separate paid plugin that adds extra capabilities — it does not unlock anything already here.

**[Upgrade to Premium →](https://landtechwebdesigns.com/product/extras-for-elementor/)**

When Premium is not installed, **Elementor Extras → Add-on features** lists the add-on catalog (informational). After you activate Premium, that catalog is hidden.

The premium add-on includes:

* **WooCommerce & conversion:** shop extras, product page builder, product carousel, wishlist, 360 viewer, 3D viewer, smart countdown.
* **Forms, popups & menus:** multi-step forms, smart popup triggers, popup A/B tests, mega menu, Gravity Forms styler, booking calendar, login/register, marketing button, business hours, calculator, experience builder.
* **Dynamic data & loops:** remote content, AJAX facets, advanced loop query, masonry/metro, live data table, social feeds (Instagram / X / TikTok), external grid.
* **Site chrome & motion:** header/footer builder, one-page dot nav, text animation, scroll story, evolutionary layouts.
* **AI & accessibility:** Genius assistant, AI workspace (bring-your-own-key), alt-text batch, semantic search, voice search, WCAG scanner.
* **Agency tools:** export/import package, CPT builder, content protection, white label, template marketplace, time machine, asset compiler, PWA builder, client feedback, conditional CSS classes.

Add-on docs: [extrasforelementor.com/docs/premium](https://extrasforelementor.com/docs/premium/).

== What’s new in 2.9 ==

This release is a large free-plugin update (work from 2.6 through 2.9, shipped together):

* **Social proof & people:** Testimonials (manual, WooCommerce reviews, or comments), FAQ Accordion with optional FAQPage schema, Team Members (classic, overlay, flip, horizontal), Icon Box, Call to Action, Star Rating.
* **Commerce-ready layouts:** Pricing Table and Pricing Toggle (monthly/annual, optional WooCommerce add-to-cart when WooCommerce is active).
* **Motion & media:** Lottie scroll / hover / click / scrub playback via bundled lottie-web; Video Playlist (YouTube, Vimeo, self-hosted); Progress Bar; Countdown; Reading Progress; Social Share; Back to Top; Cookie Consent; Sticky Wrapper; Dark Mode Toggle.
* **Calendar & popups:** iCal / Google Calendar URL, The Events Calendar, and WooCommerce Bookings sources; popup delay, scroll, inactivity, and cookie/session suppression.
* **Editor tools:** ACF Free dynamic tags, block patterns, SEO hints in the editor, Generate alt text via the WordPress AI Client (Settings → Connectors), Loop Builder / WCAG / CSP notes.
* **Gallery, tabs, SVG, comparison:** Gallery video tiles and pagination; Tabs vertical + mobile accordion + deep links; Inline SVG path colors and reduced-motion-safe animations; Image Comparison vertical drag.
* **Add-on features tab:** When the optional Premium plugin is not installed, this tab shows a read-only catalog of what that **separate** plugin adds. When Premium is active, the catalog is hidden and the live Enable checkboxes appear instead.

== Widgets and extensions ==

Find widgets in the Elementor panel under the **LandTech Extras for Elementor** category. Widget type slugs match the upstream Elementor Extras fork for easier migration.

**Widgets:** Age Gate (`ee-age-gate`), Animated Headline (`ltxe-animated-headline`), Audio Player (`ee-audio-player`), Back to Top (`ltxe-back-to-top`), Breadcrumbs (`ee-breadcrumbs`, optional **BreadcrumbList** JSON-LD when **Structured data** is enabled), Buttons / Button Group (`button-group`), Calendar (`ee-calendar`), Circle Progress (`circle-progress`), Comparison Table (`ltxe-comparison-table`), Cookie Consent (`ltxe-cookie-consent`), Countdown (`ltxe-countdown`), Dark Mode Toggle (`ltxe-dark-mode`), Devices (`devices-extended`), FAQ Accordion (`ltxe-faq`), FAQ Schema (`ee-faq-schema`), Filterable Gallery (`gallery-filterable`), Flip Box (`ltxe-flip-box`), Form Styler (`ltxe-form-styler`), Gallery (`gallery-extra`), Gallery Slider (`gallery-slider`), Google Map (`ee-google-map`), Heading Extra (`heading-extended`), Hotspots (`hotspots`), HTML5 Video Player (`html5-video`), Icon Box (`ltxe-icon-box`), Image Accordion (`ltxe-image-accordion`), Image Comparison (`image-comparison`), Image Scroller (`ltxe-image-scroller`), Inline SVG (`ee-inline-svg`), Interactive Card (`ltxe-interactive-card`), Logo Carousel (`ltxe-logo-carousel`), Lottie (`ee-lottie`), Call to Action (`ltxe-cta`), News Ticker (`ltxe-news-ticker`), Newsletter Signup (`ltxe-newsletter-signup`), Number Counter (`ltxe-number-counter`), Offcanvas (`ee-offcanvas`), One Page Nav (`ltxe-dot-nav`), PDF Embed (`ltxe-pdf-embed`), Popup (`ee-popup`), Post Carousel (`posts-carousel`), Posts Extra / Portfolio / Carousel layouts (`posts-extra`), Pricing Table (`ltxe-pricing-table`), Pricing Toggle (`ltxe-pricing-toggle`), Progress Bar (`ltxe-progress-bar`), Random Image (`ee-random-image`), Reading Progress (`ltxe-reading-progress`), Recipe (`ltxe-recipe`), Scroll Indicator (`ee-scroll-indicator`), Search Form (`ee-search-form`), Slide Menu (`ee-slide-menu`), Social Share (`ltxe-social-share`), Star Rating (`ltxe-star-rating`), Sticky Wrapper (`ltxe-sticky-wrapper`), Switcher (`ee-switcher`), Table (`table`), Table of Contents (`ee-table-of-contents`), Tabs (`ee-tabs`), Tags Cloud Sphere (`ltxe-tags-cloud-sphere`), Team Members (`ltxe-team-members`), Testimonials (`ltxe-testimonials`), Text Divider (`text-divider`), Timeline (`timeline`), Toggle Element (`ee-toggle-element`), Unfold (`unfold`), Video Playlist (`ltxe-video-playlist`), Weather (`ltxe-weather`), World Clock (`ltxe-world-clock`).

**Editor extensions** (Advanced tab on Elementor elements): Display Conditions (free: time, day, URL/query vars including UTM presets, cookie, business hours; WooCommerce purchase history and membership rules ship in the separate **LandTech Extras Premium** add-on), Parallax Background, Parallax Elements, Portfolio Parallax, Shape Dividers (section/container Layout tab), Sticky Elements, Tooltips.

Disable unused widgets under **Elementor → LandTech Extras → Widgets** to speed up the editor.

== Screenshots ==

1. Enable or disable individual LandTech Extras widgets from Elementor → LandTech Extras.
2. Editor extensions such as display conditions, sticky elements, parallax, and tooltips.
3. Optional API keys for Google Maps, Snazzy Maps, Instagram, and BYOK LLM credentials.
4. LandTech Extras widgets appear in the Elementor panel under the LandTech Extras category.

== Installation ==

1. Install and activate **Elementor**.
2. Install and activate **LandTech Extras for Elementor** from this directory or from WordPress.org once published.
3. Edit pages with Elementor and use **LandTech Extras for Elementor** widgets and extensions.

**External Services**

This plugin may cause the site, the WordPress admin, or the Elementor editor to contact third-party services when you enable the related features or save API credentials. For each service below, direct links to its **Terms of Service** (or equivalent) and **Privacy Policy** are provided.

**Google Maps Platform (Google LLC)**

When you enable the Google Map widget or turn on **Load Google Maps API** under Elementor → LandTech Extras → APIs, visitors’ browsers may load the Maps JavaScript API from Google (`maps.googleapis.com`, including via bundled `assets/lib/gmap3/gmap3.js`). Requests can include the **Maps API key** you enter in settings, map coordinates or place queries you configure, and typical browser HTTP metadata. [Terms of Service](https://cloud.google.com/maps-platform/terms) · [Privacy Policy](https://policies.google.com/privacy)

**OpenStreetMap tile servers (OpenStreetMap Foundation and community tile providers)**

When you set the Google Map widget **Map provider** to **OpenStreetMap**, visitors’ browsers load bundled **Leaflet** (`assets/lib/leaflet/`) and request raster map tiles from OpenStreetMap’s tile service (`tile.openstreetmap.org`, including subdomains `a`–`c`). Requests can include map tile coordinates (zoom level and x/y indices), the visitor’s IP address, and standard browser HTTP metadata. Marker icon assets are served from your site; no API key is required for the default tile layer. [OpenStreetMap Foundation Terms](https://wiki.osmfoundation.org/wiki/Terms_of_Use) · [OpenStreetMap Foundation Privacy Policy](https://wiki.osmfoundation.org/wiki/Privacy_Policy) · [OpenStreetMap copyright](https://www.openstreetmap.org/copyright)

**Snazzy Maps (snazzymaps.com; operated by Atlist Inc.)**

When you add a Snazzy Maps API key and search for map styles in the Elementor editor, the editor script (`assets/js/editor.js`) requests JSON from `https://snazzymaps.com/{endpoint}.json` (explore, my-styles, or favorites). Those requests can include your **Snazzy Maps API key**, pagination parameters, and standard browser HTTP metadata. Server-side PHP does not proxy these editor requests. Atlist publishes the legal terms that apply to Snazzy Maps / Atlist services: [Terms of Service](https://www.atlist.com/terms) · [Privacy Policy](https://www.atlist.com/privacy)

**Instagram (Meta Platforms, Inc.)**

When you use Instagram-related options (Gallery widget Instagram source or an access token under Elementor → LandTech Extras → APIs), the plugin may request data from **Instagram Graph API** (`graph.instagram.com`, including token refresh in admin) and/or **instagram.com** endpoints used by the Gallery widget. Data sent can include the **access token** you configure, API parameters required by Instagram, and standard HTTP metadata. [Instagram Terms of Service](https://www.instagram.com/legal/terms/) · [Instagram Privacy Policy](https://privacycenter.instagram.com/policy/) · [Meta Privacy Policy](https://www.facebook.com/privacy/policy/) · Meta **Developer Terms** (API use): [Terms](https://developers.facebook.com/terms/)

**OpenAI (OpenAI, LLC) — optional bring-your-own-key (add-on AI workspace)**

Credentials may be stored under Elementor Extras → APIs (`openai_api_key` / `ltxe_openai_key`) or as `LTXE_OPENAI_KEY` / `LANDTECH_EXTRAS_OPENAI_KEY`. This plugin does not call OpenAI. **Generate CSS ID** uses the WordPress AI Client when it is available, then a local slug. Outbound OpenAI requests happen only when the separate add-on AI workspace uses your saved key. [Terms of Service](https://openai.com/policies/terms-of-use/) · [Privacy Policy](https://openai.com/policies/privacy-policy/)

**Anthropic (Anthropic, PBC) — optional bring-your-own-key (add-on AI workspace)**

Same as OpenAI above: credentials may be stored here; outbound **Anthropic API** requests (e.g. `api.anthropic.com`) occur only when the separate add-on AI workspace invokes them with your saved **Anthropic API key**, messages, and parameters. [Commercial Terms of Service](https://www.anthropic.com/legal/commercial-terms) · [Privacy Policy](https://www.anthropic.com/legal/privacy)

**Google Gemini API (Google LLC) — optional bring-your-own-key (add-on AI workspace)**

Same as OpenAI above: credentials may be stored here; outbound **Gemini** requests (e.g. `generativelanguage.googleapis.com`) occur only when the separate add-on AI workspace invokes them with your saved **Gemini API key**, prompts, and parameters. [Google AI / Gemini API Terms](https://ai.google.dev/gemini-api/terms) · [Google Privacy Policy](https://policies.google.com/privacy)

**User-provided iCal / calendar feeds**

When the Calendar widget source is **iCal / Google Calendar URL**, the site server requests the `.ics` URL you enter (`wp_safe_remote_get`). The request includes that URL and standard HTTP metadata. No Land Tech server is involved. Review the calendar host’s terms (Google, Microsoft, Apple, or your own feed) before publishing.

**YouTube (Google LLC)**

When a Gallery video tile, the Media Gallery widget, or the Video Playlist widget uses a YouTube URL, visitors’ browsers load an embed iframe from `www.youtube.com` / `youtube.com`, and the gallery may request a poster image from `img.youtube.com` using the video ID. Requests can include the video ID you configured and standard browser HTTP metadata. No YouTube API key is stored. [Terms of Service](https://www.youtube.com/t/terms) · [Google Privacy Policy](https://policies.google.com/privacy)

**Vimeo (Vimeo.com, Inc.)**

When a Gallery video tile, the Media Gallery widget, or the Video Playlist widget uses a Vimeo URL, visitors’ browsers load an embed iframe from `player.vimeo.com`. The Media Gallery also requests `https://vimeo.com/api/oembed.json` from the site server to read a thumbnail URL, which is cached for seven days. Requests can include the video URL you configured and standard HTTP metadata. No Vimeo API key is stored. [Terms of Service](https://vimeo.com/terms) · [Privacy Policy](https://vimeo.com/privacy)

**WordPress AI Client (core Connectors)**

When an editor clicks **Generate alt text** on an image control, or **Generate CSS ID** in a widget panel, this plugin calls `wp_ai_client_prompt()` if the WordPress AI Client is available. Site admins configure Connectors under **Settings → Connectors**. The request can include a short prompt and, for alt text, the attachment image URL. If the AI Client is not available, alt text returns HTTP 503 and CSS ID falls back to a local slug. Review the terms and privacy policy of the provider you connect in WordPress.

**Social share destinations (user-initiated)**

The Social Share widget only builds share URLs. A visitor click may open Facebook, X/Twitter, LinkedIn, WhatsApp, Telegram, Pinterest, Reddit, or a `mailto:` window. No third-party share SDK is loaded. Review each destination’s terms before enabling that button.

**Playground demo WXR (extrasforelementor.com)**

When a WordPress Playground blueprint (or an administrator calling `POST /wp-json/landtech-extras/v1/playground/seed`) imports demo content, this plugin may request `https://extrasforelementor.com/playground-demo-content.xml` via `wp_remote_get`. The request includes the WXR URL and standard HTTP metadata. No visitor data is sent. If that file is unavailable, the bundled in-plugin seeder creates demo pages locally instead. Documentation host: [extrasforelementor.com](https://extrasforelementor.com/).

**Open-Meteo (open-meteo.com)**

When a page includes the Weather widget, the site server requests forecast data from `https://api.open-meteo.com/v1/forecast` and, for city names, geocoding from `https://geocoding-api.open-meteo.com/v1/search` via `wp_remote_get`. Requests include the configured city name or latitude/longitude, unit preferences, and standard HTTP metadata. No API key is required or stored. Responses are cached for five minutes. Visitors’ browsers call only this site’s REST proxy (`/wp-json/landtech-extras/v1/weather`). [Terms](https://open-meteo.com/en/terms) · [License / attribution](https://open-meteo.com/en/license)

**Mailchimp (Intuit Mailchimp Marketing API) — Newsletter Signup widget**

When you save a **Mailchimp API key** under **Elementor → LandTech Extras → APIs** and a visitor submits the Newsletter Signup widget, the site server posts the subscriber **email address** plus optional first/last name, phone, and GDPR tag to `*.api.mailchimp.com`. The key is stored encrypted and is never printed in page HTML or REST responses. [Terms of Service](https://mailchimp.com/legal/terms/) · [Privacy Policy](https://www.intuit.com/privacy/statement/)

**Mozilla PDF.js sample PDF (optional demo URL)**

The PDF Embed widget can load a PDF you upload to the media library, or a URL you enter. The bundled demo may use Mozilla’s public sample at `https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf`. Visitors’ browsers request that file only when that URL is configured. [PDF.js project](https://mozilla.github.io/pdf.js/)

**User-provided Lottie animation URLs (LottieFiles or other hosts)**

When the Lottie widget is set to load an animation from an **External URL** (or from a JSON file in your media library served from another origin), visitors’ browsers request that JSON from the URL you configure. The Playground demo may load a sample file from **LottieFiles** (`assets*.lottiefiles.com`) when you preview the bundled demo page. No animation URL is transmitted to Land Tech servers. Review your animation host’s terms and privacy policy before publishing.

**Third-party libraries**

This plugin bundles or references third-party scripts. Licenses and upstream sources for every bundled file are noted below. Full provenance details are in the matching `README.txt` files under `assets/lib/`.

**anime.js 4.5.0** (MIT) — `assets/lib/anime/anime.js` / `anime.min.js`
Source: https://github.com/juliangarnier/anime — License notes: `assets/lib/anime/README.txt`.

**Splitting.js 1.0.6** (MIT) — `assets/lib/splitting/splitting.js` / `splitting.min.js` / `splitting.css`
Source: https://github.com/shshaw/Splitting — License notes: `assets/lib/splitting/README.txt`.

**GLightbox 3.3.1** (MIT) — `assets/lib/glightbox/js/glightbox.js` / `glightbox.min.js` and CSS under `assets/lib/glightbox/css/`
Source: https://github.com/biati-digital/glightbox — License notes: `assets/lib/glightbox/README.txt`.

**jquery-circle-progress** (MIT) — https://github.com/kottenator/jquery-circle-progress
**jquery.appear** (MIT) — https://github.com/morr/jquery.appear/
**LongShadow jQuery Plugin** (MIT) — https://github.com/dangvanthanh/jquery.longShadow
**HC-Sticky** (MIT) — https://github.com/somewebmedia/hc-sticky
**jQuery Mobile** (MIT/jquery.org) — https://jquerymobile.com/
**jquery-visible** (MIT) — http://teamdf.com/jquery-plugins/license/
**Parallax Background** (MIT) — https://github.com/erensuleymanoglu/parallax-background
**TableSorter** v2.32.0 (MIT/GPL dual, Mottie fork) — https://github.com/Mottie/tablesorter
**Isotope v3.0.6** (GPLv3) — `assets/lib/isotope/` standalone modules (WordPress core jQuery via jquery-bridget)
**Metafizzy / Desandro layout dependencies** (MIT unless noted) — `assets/lib/jquery-bridget/`, `outlayer/`, `ev-emitter/`, `get-size/`, `fizzy-ui-utils/`, `matches-selector/`, `masonry-layout/` (each folder includes `README.txt`)
**Packery v2.1.2** (GPLv3) — `assets/lib/packery/` standalone modules (WordPress core jQuery via jquery-bridget)
**Infinite Scroll 4.0.1** (GPLv3) — `assets/lib/infinite-scroll/infinite-scroll.js` (core build; vanilla DOM API via `new InfiniteScroll()`; no jquery-bridget)
Source: https://infinite-scroll.com — License notes: `assets/lib/infinite-scroll/README.txt`.
**javascript-detect-element-resize** (MIT) — https://github.com/sdecima/javascript-detect-element-resize
**tilt.js** (MIT) — https://github.com/gijsroge/tilt.js
**Schedule-X Calendar 4.6.1** (MIT) — `assets/lib/schedule-x/` with Preact under `assets/lib/preact/` and `@js-temporal/polyfill` as `assets/lib/temporal-polyfill/js-temporal-schedule-x.min.js`
Source: https://github.com/schedule-x/schedule-x — License notes: `assets/lib/schedule-x/README.txt`.
**@lottiefiles/lottie-player** (MIT) — `assets/lib/lottie-player/lottie-player.js`
Source: https://github.com/LottieFiles/lottie-player — License notes: `assets/lib/lottie-player/README.txt`.
**lottie-web 5.13.0** (MIT) — `assets/lib/lottie-web/lottie.js`
Source: https://github.com/airbnb/lottie-web — License notes: `assets/lib/lottie-web/README.txt`.
**WaveSurfer.js 7.9.9** (BSD-3-Clause) — optional Audio Player waveform skin
Source: https://github.com/kwavesurfer/wavesurfer.js — License notes: `assets/lib/wavesurfer/README.txt`.
**GMAP3** (GPL-3.0+) — http://gmap3.net
**Leaflet** v1.9.4 (BSD-2-Clause) — `assets/lib/leaflet/leaflet.js` / `leaflet.css` (OpenStreetMap map provider)
Source: https://github.com/Leaflet/Leaflet — License notes: `assets/lib/leaflet/README.txt`.
**Slidebars** (MIT) — http://www.adchsm.com/slidebars/

Date/time formatting in the Calendar widget uses **Moment.js** registered by WordPress core when available.

== Frequently Asked Questions ==

= Does this plugin require Elementor? =

Yes. LandTech Extras for Elementor requires the free [Elementor](https://wordpress.org/plugins/elementor/) page builder to be installed and active.

= Which Elementor version is required? =

Elementor 3.5.0 or later. Compatibility is documented in the plugin header (`Elementor tested up to`).

= Can I use this without Elementor Pro? =

Yes. All free widgets and extensions work without Elementor Pro. Some widgets note when Elementor Pro is required.

= How do I disable widgets I don't use? =

Go to **Elementor → LandTech Extras** in your WordPress admin and uncheck any widgets or extensions you don't plan to use. This improves Elementor editor load time.

= How do I get an API key for Google Maps? =

Follow the [Google Maps API key guide](https://developers.google.com/maps/documentation/javascript/get-api-key) and enter your key under **Elementor → LandTech Extras → APIs**.

= Is this plugin affiliated with Namogo or Elementor Ltd.? =

No. This is an independent fork of the original Elementor Extras plugin by Namogo, maintained by Land Tech Web Designs. It is not affiliated with or endorsed by Namogo or Elementor Ltd.

= Is this a replacement for Elementor Extras / Extras for Elementor? =

Yes. LandTech Extras for Elementor is an independent, GPLv3-maintained continuation of the Elementor Extras (Extras for Elementor) widget set. It is intended for sites that need those Elementor widgets and extensions without relying on the discontinued original distribution. Widget type slugs (`ee-calendar`, `posts-extra`, and similar) are preserved so existing Elementor JSON templates can load after you deactivate the old plugin and activate LandTech Extras.

= Does this plugin require the Premium add-on? =

No. Every widget and extension in this plugin works without Premium. The paid add-on is a separate plugin that adds extra capabilities. It does not unlock features that already ship here.

= What does the Premium add-on add? =

WooCommerce extras, multi-step forms, header/footer builder, AI workspace, booking, social feeds, and other lanes listed under **Optional Premium add-on** above. Details: [extrasforelementor.com/docs/premium](https://extrasforelementor.com/docs/premium/).

= Can I migrate from Elementor Extras or Namogo Extras? =

In most cases, yes. Export your Elementor templates, replace the old plugin with **LandTech Extras for Elementor**, and re-open pages in Elementor. Widgets should resolve under the LandTech Extras category. Re-save pages if Elementor prompts you to update data. Compare your widget list with the **Widgets and extensions** section above; optional API keys (Maps, Instagram) must be re-entered under **Elementor → LandTech Extras → APIs**.

= Does this plugin include Gutenberg blocks? =

No. LandTech Extras adds **Elementor** widgets and Elementor editor extensions only. Search terms like “Elementor blocks” usually refer to Elementor widgets or sections; this plugin does not register WordPress block editor blocks.

= What prefix does this plugin use in code? =

PHP functions, hooks, options, and transients use the **`landtech_extras_`** or **`ltxe_`** prefix (four or more characters). Script/style handles use **`landtech-extras-`**. Namespaced PHP classes live under **`LandTechExtras\`**. Elementor widget type slugs (for example `ee-calendar` or `posts-extra`) are retained from the upstream Elementor Extras fork so existing Elementor templates keep working; they are Elementor element identifiers, not WordPress options or hooks.

== Development ==

Human-readable source for bundled/minified assets (included in this plugin package):

* `assets/css/frontend.min.css` and `assets/css/frontend-rtl.min.css` — built from `assets/css/frontend.css` and `assets/css/frontend-rtl.css`.
* `assets/js/frontend.min.js` — built from `assets/js/frontend.js`.
* `assets/js/search-form-editor.js` — Elementor editor helper for Search Form restriction controls (loaded in the editor only).
* `assets/js/landtech-extras-calendar-schedule-x.js` and `assets/js/table-csv-editor.js` — widget helpers (not minified; loaded directly when needed).
* `assets/js/admin.min.js`, `assets/js/editor.min.js`, and `assets/js/notice.min.js` — built from their matching non-minified files in `assets/js/`.
* `assets/css/admin.min.css`, `assets/css/editor.min.css`, and `assets/css/editor-preview.min.css` — built from matching non-minified CSS in `assets/css/`.
* Widget/library `.min.js` / `.min.css` under `assets/lib/` — non-minified counterparts ship in the same folder where applicable; third-party-only bundles are documented under **Third-party libraries** above and in the per-library `README.txt` files under `assets/lib/`.
* `assets/lib/landtech-extras-anime-helpers.js` — TweenMax-compatible animation shim using bundled anime.js (MIT).

From the plugin root, after **`npm install`**, run **`npm run build:assets`** to regenerate the minified frontend CSS/JS files listed above (used by default enqueues when `SCRIPT_DEBUG` is false).

Before publishing a public GitHub mirror, verify any **Repository** or **Source** URL in this readme returns HTTP 200 (WordPress.org reviewers check linked URLs).

== Upgrade Notice ==

= 3.0.5 =
Update if a Switcher is still hidden after 3.0.4 and the console reports elementorFrontend is not defined. Optional Button Look presets are included and do not change existing buttons until you select one.

= 3.0.4 =
Changelog on this page now lists recent releases in full. No widget changes in this update.

= 3.0.3 =
Switcher widgets remain visible when an older layout has no saved animation speed. Update if a switcher disappeared after 2.5.5.

= 3.0.2 =
Readme listing leads with the free widget set. External service and library notes moved to the Installation tab so the directory description is not cut off. A dismissible review reminder appears in wp-admin after 7 days.

= 3.0.0 =
Major free update: Media Gallery, Recipe, Comparison Table, Interactive Cards, Image Scroller, PDF Embed, World Clock, Tags Cloud Sphere, Form Styler (CF7 + WPForms), Newsletter Signup, Shape Dividers, Filterable Gallery, and more.

= 2.9.0 =
Large free update: testimonials, FAQ, team, pricing, countdown, Lottie, calendar feeds, and more. This plugin stays complete. An optional separate Premium add-on is listed on Add-on features only when Premium is not active.

= 2.5.5 =
Playground Live Preview: new Tabs and Table of Contents demo pages; Search Form demo copy updated. No changes required on existing sites.

= 2.5.4 =
Readme only: short description trimmed for WordPress.org (150 character limit). No code changes.

= 2.5.3 =
Maintenance release: Elementor 4.3.x compatibility headers and Plugin Check fixes (readme casing, bundled Temporal script filename). No feature changes.

= 2.5.2 =
Recommended update: new Tabs and Table of Contents widgets, plus Search Form **Include only** category restrictions and shorter custom search result URLs. Re-save Search Form widgets after updating if you use hidden category filters.

== Changelog ==

= 3.0.5 =
* Fix: Switcher stays visible when this plugin's script loads before Elementor. 3.0.4 could still hide the switcher and log "elementorFrontend is not defined."
* Add: Button Look presets (Current, Pill, Soft, Outline) on Switcher, Button Group, Form Styler, and other buttons. Current is the default, so existing buttons stay as they are until you choose a look.
* Add: Switcher menu bar, border, radius, and shadow controls, plus the same button chrome on widgets that did not already have it.

= 3.0.4 =
* Docs: Changelog shortened so WordPress.org can show it in full. Notes for 2.3.3 and older are summarized under Earlier releases.

= 3.0.3 =
* Fix: Switcher widgets remain visible when an older layout has no saved animation speed or duration, and when the animation helper is unavailable.

= 3.0.2 =
* Docs: WordPress.org description opens with the free widgets. External Services and third-party libraries are documented on the Installation tab so the directory description is not truncated.
* Add: Dismissible review reminder on the Dashboard, Plugins screen, and LandTech admin pages after the plugin has been active for 7 days.

= 3.0.1 =
* Fix: Search Form widgets upgraded from Elementor Extras or 2.5.0 keep their saved Exclude lists as “search the other terms,” instead of switching those results to a not-in query.

= 3.0.0 =
* New: Recipe widget with Recipe schema JSON-LD
* New: Comparison Table, Interactive Card, Image Scroller, PDF Embed, World Clock, Tags Cloud Sphere, Newsletter Signup
* New: Shape Dividers extension on section/container Layout tab
* New: Form Styler — style Contact Form 7 and WPForms without CSS
* New: Number Counter — animated count-up widget with prefix, suffix, easing
* New: Logo Carousel — infinite CSS marquee with grayscale hover
* New: Flip Box — 3D and fade flip cards, hover and click triggers
* New: Filterable Gallery — Isotope masonry with category filter pills
* New: Post Carousel — autoplay Swiper carousel skin for the posts widget
* New: Animated Headline — typewriter and word-cycle effects (free tier)
* New: One Page Nav — dot navigation moved to free tier
* New: Image Accordion — expanding image column panels
* New: News Ticker — CSS marquee with manual items or live post feed
* New: Weather — current conditions and 5-day outlook via Open-Meteo (no API key)
* New: Media Gallery — photos and YouTube, Vimeo, or self-hosted video in one filterable lightbox grid

= 2.9.0 =
* Add: Testimonials (`ltxe-testimonials`) — manual, WooCommerce review, or comment sources; carousel/grid/single; optional AggregateRating schema.
* Add: FAQ Accordion (`ltxe-faq`) with keyboard navigation and optional FAQPage schema. Existing FAQ Schema (`ee-faq-schema`) is unchanged.
* Add: Team Members, Icon Box, and Call to Action widgets (flip/hover effects respect reduced motion).
* Add: Social Share, Back to Top, Cookie Consent, Sticky Wrapper, and Dark Mode Toggle.
* Add: ACF Free dynamic tags, block patterns, editor SEO hints, and Generate alt text via the WordPress AI Client.
* Add: Informational Premium catalog on **Add-on features** when the separate Premium plugin is not active (hidden after Premium is activated).
* Add: Playground demo pages for the new widgets; public docs at extrasforelementor.com/docs.
* Note: 2.6–2.8 work (Lottie, calendar feeds, pricing, progress, countdown, video playlist, gallery/tabs/SVG upgrades) is included in this directory release. See those version headings for detail.

= 2.8.4 =
* Fix: Tabs first panel is visible again (`hidden="false"` still hid it), and tab icons no longer render at full SVG size over the labels.

= 2.8.3 =
* Fix: Hotspots now bind click/hover tooltips when Elementor Improved Asset Loading prints LandTech scripts after `elementor/frontend/init`.

= 2.8.2 =
* Fix: Inline SVG now fetches and injects the SVG from `data-url` even when Elementor Improved Asset Loading prints scripts after `elementor/frontend/init`.
* Fix: Calendar month grid paints days when Schedule-X leaves the wrapper empty, and Temporal date-only strings no longer abort month generation.
* Fix: Multiple Popup widgets on one page no longer share a single GLightbox instance, so click triggers work after a delay popup.

= 2.8.1 =
* Fix: Print per-widget CSS/JS on pages that use Elementor Improved Asset Loading so Progress Bar, Calendar, Countdown, and other 2.8 widgets initialize on the frontend.
* Fix: Calendar Schedule-X now self-boots without the legacy frontend.js bundle.

= 2.8.0 =
* Add: Pricing Table and Pricing Toggle widgets with monthly/annual switch (`ltxe_pricing_toggle_changed`) and optional WooCommerce add-to-cart when WooCommerce is active.
* Add: Star Rating widget with half-star display, review count, and optional AggregateRating schema.
* Add: Video Playlist widget (YouTube, Vimeo, self-hosted MP4) under the media-player module. Embeds are built with DOM APIs, not innerHTML.

= 2.7.0 =
* Add: Progress Bar, Countdown (fixed datetime), and Reading Progress widgets.
* Add: Hotspot tooltip content types — Elementor template and image — alongside existing text.
* Add: Tabs vertical orientation, mobile accordion, and hash / `?tab=` deep linking.
* Add: Gallery video tiles (GLightbox) and client-side load more / infinite / numbered pagination for manual galleries.
* Add: Inline SVG per-path colors and draw/fade/scale/rotate animations (respects reduced motion).
* Add: Image Comparison vertical drag and start-position control.

= 2.6.0 =
* Add: Lottie playback triggers (scroll, scroll-scrub, hover, click), speed, direction, and segment play via bundled lottie-web, with the existing lottie-player path kept for simple autoplay.
* Add: Calendar sources for iCal / Google Calendar URLs, The Events Calendar, and WooCommerce Bookings (when those plugins are active).
* Add: Popup delay, scroll-percentage, inactivity triggers, and cookie/session suppression.
* Add: Per-widget frontend script loading (`LTXE_FRONTEND_SPLIT`). Shared helpers live in `frontend-core.js`; the previous monolithic `frontend.js` stays registered for one major version and loads only when a widget still depends on it.

= 2.5.13 =
* Fix: Schema output kept camelCase schema.org property names intact. Property keys were passed through `sanitize_key()`, which lowercased them (`mainEntity` became `mainentity`), so the `EE FAQ Schema` widget never printed its FAQPage JSON-LD, and breadcrumb `itemListElement`, organization `sameAs` and event `startDate` / `endDate` / `eventStatus` / `eventAttendanceMode` properties were emitted with invalid names. Keys are now stripped to letters, digits, `_`, `-` and `@` without changing case.

= 2.5.12 =
* Update: Bundled anime.js upgraded from 4.0.2 to 4.5.0 (MIT), using the upstream UMD bundles. Every function the plugin's animation helpers call is unchanged, so existing widget animations keep working.
* Fix: `TweenMax.killTweensOf()` in the animation shim now actually stops running animations (anime.js 4.5.0 exposes `remove`, which 4.0.2 did not). Hotspot tooltips that are hovered in and out quickly no longer let the previous show/hide animation keep running.

= 2.5.11 =
* Fix: `EE Calendar` grid renders as a `<table>` at desktop widths and did not force any responsive layout. On viewports 767 px and under, the calendar container now becomes a horizontally scrollable block so a full month grid does not push the page sideways on phones, while the day cells retain their existing typography and styling.
* Fix: `EE Gallery` with `Layout: Slider` set to the vertical direction used a 400 px fixed inline height. On viewports 767 px and under, the vertical slider height now falls back to `50dvh` (with a `50vh` fallback for older browsers) so the slider never claims more than half of a phone's visible height, and the aspect ratio can be reset with a normal Elementor `height` control override.
* Fix: `EE Image Comparison` output stretched to the widget's rendered width without constraining the underlying `<img>` elements, so a landscape image inside a narrow phone column could grow past the widget frame. On viewports 767 px and under, both images are now clamped to `width: 100%` with `object-fit: cover` so the comparison stays inside the widget column regardless of the source image dimensions.
* Fix: `EE Popup` and `EE Age Gate` opened via Magnific Popup used the library's default max-width and no safe-area handling, which on phones ran the close button under the browser chrome / notch and cropped tall popups. On viewports 767 px and under, popup content is now clamped to `calc(100vw - 32px)` and its bottom padding respects `env(safe-area-inset-bottom)` so the popup fits inside the visible viewport and the close button stays reachable.
* Fix: `EE Hotspots` positioning is set with `transform: translate(-50%, -50%) scale(N)` from the widget's controls, and at very small `N` values (< 0.5) the resulting interactive footprint dropped below WCAG 2.5.8's 24×24 px minimum. Each hotspot now enforces a 24 px minimum click target (with the scaled visual centred inside it) on viewports 767 px and under, without changing the visible dot / icon size the editor configured.
* Fix: `EE Slide Menu` submenu triggers (`.ee-menu__arrow`) had a 20 px tap target — below WCAG 2.5.8. The arrow now enforces a 24 px minimum interactive box at every viewport (with `box-sizing: border-box`), while the arrow glyph itself is unchanged.
* Fix: `EE Google Map` navigation UI positioned at `bottom` sat under the browser chrome and phone-notch inset. The bottom-positioned UI now respects `env(safe-area-inset-bottom)` and is clamped to `calc(100vw - 32px)` so it stays fully on-screen on phones.
* Fix: `EE Lottie` output previously carried an inline `style="width:100%;max-width:480px;"` attribute on `<lottie-player>`, which conflicted with responsive Elementor `width`/`max-width` controls. The inline attribute has been removed and the same defaults are now provided by the bundled Wave 4 CSS, so Elementor's own size controls take precedence when set.

= 2.5.10 =
* Fix: `EE Devices Extended` widget's laptop, desktop, and window frames are 645, 895 and 1000 px wide respectively, which was pushing the page sideways on phones because the widget carries no responsive rule. On viewports 767 px and under, each device frame is now capped to the column width while its aspect ratio (set via `padding-bottom` percentages on `.ee-device__media__inner`) is preserved, so the frame scales down instead of overflowing.
* Fix: `EE Swiper`-based sliders using the `--outside` navigation-position skin had their prev/next arrows placed at `left: -100px` and `right: -100px`, which put them off the phone viewport with no other way to advance the slide. On viewports 767 px and under, both arrows now sit 8 px inside the container. Larger breakpoints are unchanged.
* Fix: `EE Scroll Indicator` bar-skin markers had a 6 px tap target — below the 24 px minimum in WCAG 2.5.8. On viewports 767 px and under, the surrounding `<a>` element now expands to a 24 px minimum height with the 6 px bar centred vertically inside it. The visible bar height is unchanged.
* Fix: `EE Search Form` `--expand` skin animates open to a fixed 300 px, which overflowed narrow phone viewports and clipped the input. On viewports 767 px and under, the expanded width is now clamped to `calc(100vw - 32px)` so it stays inside the visible area. Above 767 px the 300 px width still applies.
* Fix: `EE Switcher` `--overlay` skin has 48 px of inner padding on its content pane, which wasted horizontal space on phones. On viewports 767 px and under, the padding is reduced to 24 px.
* Fix: `EE Offcanvas` slidebar defaults to 50% of the viewport width, which is roughly 240 px on a 480 px phone — too narrow to be usable for menu or content layouts. On viewports 480 px and under, the slidebar now takes the full viewport width. Above 480 px the 50% width is unchanged, and any user-set width still overrides it.
* Fix: `EE Live Data Table` pagination Prev/Next buttons had a 6 px vertical padding that made them ~12 px tall, below the WCAG 2.5.8 24×24 px minimum. The buttons now enforce a 24×24 minimum interactive box (with `box-sizing: border-box`) at every viewport; the visual button size does not change on desktop.

= 2.5.9 =
* Change: The Tabs and Table of Contents widgets no longer carry controls that were registered in a disabled state. The options that were only offered when a paid add-on was installed have been removed from this plugin entirely and are now supplied by that add-on instead, so nothing here ships switched off waiting to be unlocked.
* Add: Extension points so an add-on can restore those options without this plugin needing to know about it — the `landtech_extras/tabs/register_repeater_controls` action, the `landtech_extras/tabs/wrapper_attributes` and `landtech_extras/tabs/tab_label_html` filters, the `landtech_extras/toc/wrapper_attributes` filter, and the `landtech_extras/toc/before_list` action. The Tabs and Table of Contents scripts now also fire `ltxe:tabs:activated` and `ltxe:toc:built`.
* Fix: The Tabs widget no longer loads the anime.js library. It was declared as a hard script dependency but nothing in this plugin used it.
* Fix: The Tabs slug field no longer describes `?tab=slug` deep links as a paid feature. They have always worked here.

= 2.5.8 =
* Fix: Table of Contents "Sticky left" and "Sticky right" layouts now run full width and in normal flow on phones. The 240px float previously left body text about fifteen characters wide, and the widget has no responsive controls to work around it.
* Fix: Table of Contents sticky height now uses `dvh` so it cannot exceed the visible area on mobile browsers, where `vh` resolves against the larger address-bar-hidden viewport.
* Fix: Audio and video player seek bars can now be dragged to scrub on touch devices. Only mouse events were bound, so tapping worked but dragging did nothing. Volume sliders gained the same handling for tablets.
* Fix: Audio and video player seek bars and their play, previous, next and rewind buttons now meet the 24px minimum touch target in WCAG 2.5.8. The controls row centres its items, so each was only as tall as its glyph.
* Fix: Off-canvas floating trigger placed along the bottom edge now respects `env(safe-area-inset-bottom)`, so it no longer sits under the gesture bar on phones that reserve space there.
* Fix: The audio and video player scripts are now minified by the documented build pipeline, so their `.min.js` files can no longer drift away from the sources they are built from.

= 2.5.7 =
* Fix: Admin menu priority changed from 200 to 5 so the "Elementor Extras" top-level menu item is registered in `$menu` before premium submenus (priority 30–60) attach to it. Fixes 404/wrong-URL errors for all premium lane menu items when the premium add-on is also active.

= 2.5.6 =
* Add: **Elementor Extras** top-level admin menu item in the WordPress sidebar, positioned immediately after Elementor (position 26). LandTech Extras settings now appear under their own dedicated parent instead of being nested inside the Elementor submenu. When the Premium add-on is also active, all premium lanes (license, Premium Lanes, Performance, Social Proof, Cross-Site Clipboard, etc.) appear as additional children under the same top-level item.

= 2.5.5 =
* Add: WordPress Playground demo pages for EE Tabs (`demo-tabs`) and Table of Contents (`demo-table-of-contents`).
* Improved: Playground Search Form demo description mentions include/exclude restriction modes.

= 2.5.4 =
* Fix: Short description in readme.txt shortened to WordPress.org 150-character limit (directory listing was truncated on import).

= 2.5.3 =
* Fix: WordPress.org Plugin Check — canonical `readme.txt` filename; rename bundled `@js-temporal/polyfill` file so it is not flagged as core `polyfill.min.js`.
* Fix: Sanitize widget preset AJAX JSON payloads; PHPCS for Search Form restriction mode controls and pre-6.4 autoload option fallback.
* Improved: Plugin header **Elementor tested up to** and **Elementor Pro tested up to** 4.3.2.

= 2.5.2 =
* Add: EE Tabs widget (`ee-tabs`) with horizontal tabs, repeater content, and template slots.
* Add: EE Table of Contents widget (`ee-table-of-contents`) with page-scope heading scan.
* Add: Search Form **Include only** restriction mode for categories and other taxonomies (whitelist terms instead of excluding many categories site-wide).
* Add: Search Form **Restriction mode** for post types (include or exclude lists).
* Fix: Hidden Search Form restrictions send compact include/exclude payloads in `ltxe_search_query` (shorter search result URLs; exclude mode uses NOT IN instead of listing every allowed term).
* Fix: Search Form Include/Exclude term pickers list categories again in the Elementor editor (Select2 options restored; editor REST helper for saved slugs).
* Improved: Search Form **Restrictions & Filters** loads up to 500 terms per taxonomy in control options (sorted by name) for sites with large category lists.

= 2.4.4 =

* Fix: Ship `assets/js/viewport-bridge.js` with the free plugin so Premium viewport display conditions no longer 404 the script on frontend.
* Add: Viewport display condition (mobile/tablet/desktop) and breakpoint helpers for WordPress 7.0+ visibility bridge.

= 2.4.3 =

* Fix: Tooltip extension no longer triggers PHP warnings when `tooltip_enable` is unset on a widget.
* Fix: Posts and Timeline widgets load `Posts_Base` before class declaration to prevent fatal errors on frontend.
* Fix: Widget registration loads class files before calling static methods, preventing fatals for FAQ Schema and other widgets.
* Fix: Autoloader uses `require_once` for reliable class loading.
* Improved: Zip build verifies `posts-base.php`, `faq-schema.php`, and `schema-validator.php` are included in releases.

= 2.4.2 =

* Fix: Activation redirect and version-tracking options use `autoload = no` to avoid loading one-shot flags on every request.

= 2.4.1 =

* Remove: **CLNDR** library and legacy calendar markup/CSS after Schedule-X migration.
* Fix: Calendar widget wires **First Day**, **Earliest/Latest Month**, and **Default Month** settings to Schedule-X.
* Remove: Dead Elementor style controls for CLNDR-era navigation, header, days, and compact event list UI.
* Improved: **Organization** schema validation (dedicated rules when @type is Organization).
* Add: Shared `Schema_Builder` helpers for **Organization** and **Event** JSON-LD (consumed by Premium Schema Suite).

= 2.4.0 =

* Fix: **Unfold widget** — anime.js v4 timeline and height animations work again via updated GSAP shim.
* Fix: **Heading animations** — `TweenMax.from()` presets use anime.js v4 `animate(targets, params)` API.
* Add: **Widget preset import/export** — export/import current widget settings as JSON from the Elementor editor (nonce + capability gated).
* Add: **Editor widget health hints** — dismissible panel notices for missing Maps API key, empty gallery, and similar local checks.
* Add: **Admin command palette (lite)** — shortcuts to LandTech settings and documentation when WordPress `wp-commands` is available.
* Improved: **Accessibility batch 1** — Google Map, Audio Player, Popup, Offcanvas, and Posts Extra carousel focus/ARIA/keyboard/reduced-motion support.
* Improved: **Posts Extra grid** — equal-height cards and responsive column gaps (CSS only).
* Improved: **Element HTML cache** — opt-in caching for Table, Inline SVG, and Text Divider static widgets.


= Earlier releases =

* Releases **2.3.3 and older**, including the Elementor Extras history this plugin forked from, are in the Git repository: [github.com/brelandr/landtech-extras-for-elementor](https://github.com/brelandr/landtech-extras-for-elementor). They are omitted here so this Changelog stays under WordPress.org's 5,000-word limit.

== Support ==

Full documentation for every widget, extension, and API is at [extrasforelementor.com/docs](https://extrasforelementor.com/docs/). For add-on purchases, feature requests, and bug reports, email **sales@landtechwebdesigns.com** or use the contact options on [Land Tech Web Designs](https://landtechwebdesigns.com/).

== Credits ==

Developed by **Land Tech Web Designs, Corp.**
