=== Vora Elements ===
Contributors: wpvora
Tags: elementor, widgets, header footer builder, elementor addons, page builder
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Requires Plugins: elementor
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

80 widgets for Elementor plus a header and footer builder. Each page loads only the CSS and JavaScript its own widgets need.

== Description ==

A widget pack for Elementor built around one idea: a page should only carry the
code it actually uses.

Every widget registers its own stylesheet and its own script, and declares them
as dependencies. Elementor prints only the handles the widgets on that page
asked for. A page with one button widget does not download the CSS for
seventy-nine others, and a widget with no script of its own costs nothing at all.
Widgets you never use can be switched off entirely from the settings screen, so
they are not even registered.

**A header and footer builder, free**

Build a header, a footer or any reusable block as a template, then choose where
it appears — the whole site, the front page, a post type, an archive, or a
single entry. Elementor's own theme builder is a Pro feature; this is not.

**What is in the box**

* Header, footer and site: navigation menu, mega-ready dropdowns, site logo,
  site title, site tagline, page title, breadcrumbs, search form, copyright,
  back to top, cart icon
* Text and headings: advanced heading, dual-colour heading, gradient heading,
  animated text, drop cap, content ticker
* Boxes and calls to action: info box, icon box, image box, flip box, card,
  call to action, promo box, creative button, dual button, image button
* People and proof: team member, testimonial, review, logo grid, logo carousel
* Data and tables: data table, info table, pricing table, price list, progress
  bar, counter, feature list
* Media: image accordion, before/after compare, image hover, image scroll,
  image hotspots, filterable gallery, lightbox gallery, media carousel, video
  box, sticky video
* Layout: advanced tabs, advanced accordion, content switcher, content reveal,
  tooltip, step flow, interactive circle, shape divider
* Posts: post grid, post list, post tabs, taxonomy list, author box, table of
  contents
* Marketing and social: countdown, event calendar, world clock, social icons,
  social share, WhatsApp button
* WooCommerce, when WooCommerce is active: product grid, product carousel,
  product categories, product search, mini cart
* Form stylers, each registered only when its form plugin is active: Contact
  Form 7, WPForms, Gravity Forms, Ninja Forms, Fluent Forms, Formidable Forms.
* Donation Form, registered only when Vora Donations is active: places a
  one-time or recurring donation campaign and styles it.
  These render the form plugin's own shortcode, so its validation, nonces and
  email all keep working — what the widget adds is styling controls.

**Some of these are built differently on purpose**

*Video Box* renders a facade, not an embed. A YouTube iframe costs roughly a
megabyte of player code and sets tracking cookies on page load, for every
visitor including the majority who never press play. Here the poster image is
the whole widget until it is clicked, and `youtube-nocookie.com` is the default
host when it finally loads.

*Countdown* resolves the author's date in the site's timezone on the server and
ships a UTC timestamp, so the browser only ever subtracts. Parsing the author's
string in the browser — the usual implementation — gives every visitor outside
the site's timezone the wrong deadline.

*Media Carousel* is a native scroll container with CSS scroll-snap rather than a
carousel library. That is around 10KB against roughly 160KB for the usual
bundle, it keeps the platform's own momentum and trackpad behaviour, it is
exposed to assistive technology as a scrollable region for free, and it works
before the script has loaded.

*Table of Contents* is built in PHP from the post's own headings, so it is in
the HTML for search engines and reader modes and causes no layout shift. It
reads Elementor's element tree on builder pages and `post_content` on
theme-rendered posts — a contents widget that reads only one of those lists
nothing on half the web.

*Filterable Gallery* removes filtered-out items with the `hidden` attribute
rather than fading them out, so a keyboard user does not tab through a dozen
invisible links.

**Accessibility**

Submenus, tabs, accordions and carousels are operated by real buttons carrying
`aria-expanded` or `aria-current`, not by hover alone — hover does not exist on
a touch screen and cannot be reached from a keyboard. Anything that moves by
itself has a way to stop it. Every widget respects `prefers-reduced-motion`.

**Multilingual and right-to-left**

Every string in the plugin is translatable, in the admin screens and in what
visitors see, and a POT file ships in `/languages` for anyone starting a
translation.

Thirty-eight of the widget stylesheets carry a right-to-left counterpart, so on
an Arabic, Hebrew, Persian or Urdu site the submenus open on the correct side,
the carousel arrows point the correct way and icons sit on the correct side of
their labels. WordPress swaps the files itself on an RTL locale; a
left-to-right site loads nothing extra and pays nothing for this.

Header and footer templates are a translatable post type, declared through a
`wpml-config.xml` that both WPML and Polylang read, so each language can have
its own header without any configuration. `[vora_template id="12"]` resolves to
the current language's version of that template where one exists, and falls
back to the original where it does not — so a translated page does not end up
showing an untranslated block.

Numbers and dates follow the site's locale rather than US conventions: the
counter widget uses the locale's own thousands and decimal marks (so a German
site reads 1.234,5 and not 1,234.5), and dates are formatted with the site's
settings and translated month and day names.

== External services ==

Most of this plugin talks to nothing outside your site. The widgets below are
the exception, and none of them does anything unless you place that widget on
a page.

**Weather widget — Open-Meteo**

The Weather widget shows current conditions and a short forecast using
Open-Meteo, a free weather API that needs no account and no key.

* What is sent: the place name you type into the widget, to
  `geocoding-api.open-meteo.com`, which returns coordinates; then those
  coordinates and your chosen units to `api.open-meteo.com`, which returns the
  forecast.
* When: only when a page containing the Weather widget is rendered and the
  cached reading has expired. Requests are made by your server, not by your
  visitors' browsers, and the result is cached for an hour — so no visitor
  data, IP address or browser information ever reaches Open-Meteo.
* Terms of service: https://open-meteo.com/en/terms
* Privacy policy: https://open-meteo.com/en/terms#privacy

**Video Box and Sticky Video — YouTube and Vimeo**

Both widgets embed a video you choose. Nothing is requested until a visitor
presses play: until then the widget is a poster image, so an unplayed video
costs no request and sets no cookie. Once play is pressed, the player is loaded
from the host you chose — `youtube-nocookie.com` or `youtube.com` for YouTube,
`player.vimeo.com` for Vimeo — which then applies its own tracking and cookies.
YouTube embeds default to `youtube-nocookie.com`.

* YouTube terms: https://www.youtube.com/t/terms — privacy:
  https://policies.google.com/privacy
* Vimeo terms: https://vimeo.com/legal/ — privacy:
  https://vimeo.com/legal/privacy/policy

**Mailchimp widget**

The Mailchimp widget posts a subscribe form directly to the Mailchimp form
action URL you paste into it, which is an address on `list-manage.com`. Your site does not contact Mailchimp; the
visitor's browser submits to Mailchimp when they subscribe, and the data sent is
whatever the form's fields collect.

* Terms: https://mailchimp.com/legal/terms/ — privacy:
  https://www.intuit.com/privacy/statement/

**WhatsApp Button — WhatsApp (Meta)**

The WhatsApp Button widget is a link to `wa.me`, WhatsApp's click-to-chat
address. No WhatsApp script is loaded and nothing is sent while the page is
viewed.

* What is sent: when a visitor clicks the button, their browser opens
  `https://wa.me/` with the phone number you entered in the widget and, if you
  set one, the pre-filled message you wrote. WhatsApp also receives whatever
  its site collects from any visitor, such as the visitor's IP address.
* When: only when a visitor clicks the button.
* Terms of service: https://www.whatsapp.com/legal/terms-of-service
* Privacy policy: https://www.whatsapp.com/legal/privacy-policy

**Social Share widget — the networks you choose**

The Social Share widget shows share buttons for the networks you pick in the
widget. Each button is a plain link to that network's own share page. No
network script, button or tracking pixel is loaded, and nothing is sent while
the page is viewed.

* What is sent: when a visitor clicks a button, their browser opens that
  network's share page with the address (URL) and title of the page being
  shared, so the visitor can post it. The network also receives whatever its
  site collects from any visitor, such as the visitor's IP address and, if they
  are signed in, their account.
* When: only when a visitor clicks that network's button. Networks you do not
  select in the widget are never linked.
* Email sharing opens the visitor's own mail program and uses no service.

The networks, what each share address is used for, and their terms:

* Facebook (Meta), `facebook.com/sharer` — shares the page to Facebook.
  Terms: https://www.facebook.com/terms.php — Privacy:
  https://www.facebook.com/privacy/policy/
* X, `x.com/intent/tweet` — composes a post with the page link and title.
  Terms: https://x.com/tos — Privacy: https://x.com/privacy
* LinkedIn, `linkedin.com/sharing` — shares the page to LinkedIn.
  Terms: https://www.linkedin.com/legal/user-agreement — Privacy:
  https://www.linkedin.com/legal/privacy-policy
* WhatsApp (Meta), `api.whatsapp.com/send` — opens a WhatsApp message
  containing the page title and link.
  Terms: https://www.whatsapp.com/legal/terms-of-service — Privacy:
  https://www.whatsapp.com/legal/privacy-policy
* Telegram, `t.me/share` — opens a Telegram message with the page link and
  title. Terms: https://telegram.org/tos — Privacy: https://telegram.org/privacy
* Reddit, `reddit.com/submit` — submits the page link and title as a post.
  Terms: https://redditinc.com/policies/user-agreement — Privacy:
  https://www.reddit.com/policies/privacy-policy
* Pinterest, `pinterest.com/pin/create` — creates a Pin of the page with its
  title. Terms: https://policy.pinterest.com/en/terms-of-service — Privacy:
  https://policy.pinterest.com/en/privacy-policy
* Threads (Meta), `threads.net/intent/post` — composes a post with the page
  title and link. Terms: https://help.instagram.com/769983657850450 —
  Privacy: https://help.instagram.com/515230437301944
* Tumblr, `tumblr.com/share` — shares the page link and title to Tumblr.
  Terms: https://www.tumblr.com/policy/en/terms-of-service — Privacy:
  https://www.tumblr.com/privacy/en
* VK, `vk.com/share.php` — shares the page link and title to VK.
  Terms: https://vk.com/terms — Privacy: https://vk.com/privacy
* LINE, `social-plugins.line.me/lineit/share` — shares the page link in LINE.
  Terms: https://terms.line.me/line_terms — Privacy:
  https://www.lycorp.co.jp/en/company/privacypolicy/
* XING, `xing.com/spi/shares` — shares the page link to XING.
  Terms: https://www.xing.com/terms — Privacy: https://privacy.xing.com/en/privacy-policy
* Hacker News (Y Combinator), `news.ycombinator.com/submitlink` — submits the
  page link and title. Terms and privacy: https://www.ycombinator.com/legal/

**Social Icons widget** links to profile addresses that you type in yourself.
The widget ships with placeholder addresses for Facebook, X, Instagram,
LinkedIn, YouTube, TikTok, Threads, Pinterest, WhatsApp, Telegram, GitHub and
Discord, which you replace with your own. Nothing is sent to any of them; a
visitor who clicks a link simply visits that address, as with any link.

== Installation ==

1. Install and activate Elementor.
2. Upload the `vora-elements` folder to `/wp-content/plugins/`, or install it
   from Plugins → Add New.
3. Activate the plugin.
4. The widgets appear in Elementor's panel under **Vora Elements**.

== Frequently Asked Questions ==

= Does this work with any theme? =

Yes. The widgets style themselves and inherit your theme's colours and fonts
where it makes sense to.

= Do I need Elementor Pro? =

No. The header and footer builder here covers the part of Elementor Pro's theme
builder that most sites install it for.

= Will it slow my site down? =

Each widget's CSS and JavaScript is registered but not enqueued until a page
actually uses that widget, so the cost is proportional to what is on the page
rather than to what the plugin contains. Widgets you switch off in Settings are
not registered at all.

= Can I turn widgets off? =

Yes, individually or by group, under Settings. A widget already used on a page
keeps working until you remove it.

= Does it work with WPML or Polylang? =

Yes. Header and footer templates are declared translatable in a
`wpml-config.xml`, which both plugins read, so each language gets its own
templates and the template list is already filtered to the language being
edited. The `[vora_template]` shortcode follows the current language too.

= Does it support right-to-left languages? =

Yes. The stylesheets that contain directional rules ship a flipped counterpart,
and WordPress serves those instead on an RTL locale. Nothing extra is loaded on
a left-to-right site.

= Can I put a tracking or chat script in a header or footer template? =

Yes, in an Elementor HTML widget, provided the template was created by a user
who is allowed to save unfiltered HTML — an administrator, or an editor on a
single site. That is the same rule WordPress applies to scripts in ordinary
post content, and it matters more for a template, because a template renders on
every page of the site rather than on one post. A template's markup is escaped
on output, and a script saved by a user without that capability is removed
rather than printed. Structured data (`application/ld+json`) is always kept.

= What happens to my templates if I delete the plugin? =

Nothing — they are left in place, so reinstalling picks up where you left off.
There is a setting to remove everything on uninstall, and it is off by default.

== Screenshots ==

1. The widget panel inside Elementor.
2. The settings screen, with per-widget switches.
3. The header and footer builder's template list.
4. A page built with the pack.

== Changelog ==

= 1.0.0 =
* First release: 80 widgets and the header and footer builder.
