BB Article Grid 1.0.0
=====================
INSTALL
1. Remove/disable the previous articles_grid_shortcode, load_articles_ajax and articles_ajax_scripts snippets and the old articles.js enqueue. They conflict with the shortcode or old selectors.
2. WordPress > Plugins > Add New > Upload Plugin > choose bb-article-grid.zip > Install > Activate.
3. For Beaver Builder: open a page in the builder, find Article Grid under Webgeek, and drag it onto the page. Adjust its Article Grid tab settings. Beaver Builder must be active for the module to appear.
4. Or insert [articles_grid] anywhere shortcodes are supported. The shortcode also works without Beaver Builder.
5. Clear page/site/CDN caches after activation. If needed clear Beaver Builder cache under Settings > Beaver Builder > Tools.

SHORTCODE EXAMPLES
[articles_grid]
[articles_grid posts_per_page="9" columns="3" excerpt_words="28" visible_years="3" gap="0" image_height="0" accent_color="#222222"]
[articles_grid placeholder_url="" all_label="ALL ARTICLES" more_label="MORE ARTICLES" load_label="LOAD MORE ARTICLES"]

BEHAVIOR
Default: six published, non-password-protected posts per load; latest first; three visible year buttons; older years in More Articles. Initial posts render on the server. JavaScript enables filtering and pagination. Every instance operates independently. Desktop columns are configurable, tablet has up to two columns, mobile has one. Default styling follows the supplied reference: ruled filter bar, gray active tab, alternating light-gray cards, compact titles/excerpts, and natural image heights (image_height=0). Set a positive image height for cropped uniform images.
Image fallback defaults to the supplied website URL; replace it with your own URL or leave blank for a neutral placeholder. Layout and button styles are scoped to .bbag.

SECURITY AND CACHING
Read-only public AJAX uses the namespaced bbag_load_articles action, bounded pagination/settings and an HMAC-signed grid configuration. This deliberately avoids expiring public nonces on cached pages. Signing keys changing invalidates cached grids; purge caches afterward. Private, draft, future and password-protected posts are excluded.

REQUIREMENTS / VALIDATION
WordPress 6.0+, PHP 7.4+. Beaver Builder is optional for the shortcode. Beaver Builder module uses its custom module API. JavaScript syntax and PHP parsing are checked during packaging. A live WordPress/Beaver Builder integration test is still required on your staging site, including builder preview, logged-out filtering, multiple grids and the final load-more page.

No database tables or persistent plugin options are created. Deleting the plugin removes its functionality; page shortcodes and module content must then be removed manually.
