=== EffortLess Layered Menu Visibility ===
Contributors: domclic
Tags: menu, navigation, visibility, conditional, user
Requires at least: 5.0
Tested up to: 7.0
Stable tag: 1.0.10
Donate link: https://id7.dev/donate/
License: GPL-2.0+
License URI: http://www.gnu.org/licenses/gpl-2.0.txt

Control menu item visibility with user, device, and page-based rules effortlessly.

== Description ==

Control which menu items are shown based on login status, user role, device type, page type, or archive context. Rules are configured directly in the WordPress nav-menu editor and evaluated on every page load.

== Changelog ==

= 1.0.10 =
* Fix: renamed the donate-notice class to the plugin's own ELLMV_ prefix (Plugin Check flagged the shared, un-prefixed class name).
* Fix: corrected @package doc tag casing to EffortLess (capital L), matching the plugin's display name.

= 1.0.9 =
* Fix: corrected "Contributors" in readme.txt to the actual WordPress.org owner username.

= 1.0.8 =
* Add: donate notice on the Menus admin screen.

= 1.0.7 =
* Fix: removed load_plugin_textdomain() call (discouraged since WP 4.6; translations load automatically).
* Fix: removed "Domain Path" header pointing to a non-existent /languages folder.

= 1.0.6 =
* Fix: removed duplicate Plugin URI/Author URI header values flagged by the plugin review team.

= 1.0.5 =
* Update: Confirmed compatibility with WordPress 7.0.

= 1.0.4 =
* Update: plugin display name corrected to EffortLess Layered Menu Visibility.
* Update: Tested up to WordPress 7.0.

= 1.0.3 =
* Add: children of a hidden parent menu item are now also hidden (cascades to any nesting depth).
* Add: uninstall.php removes all _ellmv_visibility_rules post meta when the plugin is deleted.

= 1.0.2 =
* Fix: translations never loaded because load_textdomain was registered on plugins_loaded from inside a plugins_loaded callback; now called directly.
* Remove: stale bug-reference comments from PHP and JS files.
* Refactor: hoist wp_get_current_user() above the rule loop in is_menu_item_visible().

= 1.0.1 =
* Fix: Front-end filtering was completely inert — add_custom_fields hook moved out of admin_init so it fires on the public front-end.
* Fix: Shared POST field names caused every menu item to inherit all other items' rules on save; field names are now scoped per item ID.
* Fix: PHP translation call inside the static JS file is now delivered via wp_localize_script.
* Fix: "Add Rule" with no existing rules produced an empty type select; options are now built from server-provided data.
* Fix: Value '0' was silently dropped by empty(), making boolean negation (not logged-in, not mobile, not archive) impossible.
* Fix: JS rule index collision after a removal could overwrite a surviving rule on save; replaced with a monotonic counter.
* Fix: Missing wp_unslash() before sanitize_text_field() on $_POST values.
* Fix: Boolean rule types now use a Yes/No select and compare against '1'/'0' instead of relying on PHP bool cast of an arbitrary string.

= 1.0.0 =
* Initial release.
