=== SEOPulse - SEO tools to Boost your Rankings & Traffic ===
Authors: citrusdevlab
Contributors: citrusdevlab, Alexandre Jacquin
Donate link: https://www.seopulse.citrus-design.fr
Tags: seo, xml sitemap, schema, local seo, google search console
Requires at least: 6.0
Tested up to: 7.0
Stable tag: 1.5.0
Requires PHP: 8.1
License: GPLv3 or later
License URI: https://www.gnu.org/licenses/gpl-3.0.html

WordPress SEO plugin to boost your rankings with real-time content analysis, SEO metadata, XML sitemaps, redirections, Local Business SEO, and GDPR-compliant analytics.

== Description ==

<h3>The modern, all-in-one SEO plugin for WordPress built with REACT</h3>

SEOPulse is a complete WordPress SEO solution that helps you optimize your content, manage your metadata, generate sitemaps, handle redirections, and improve your local search visibility — all from a single, modular plugin.

✔ <strong>Real-time content analysis with SEO scoring (0–100) and actionable recommendations</strong>
✔ <strong>Up to 5 focus keywords per post with per-keyword scoring</strong>
✔ <strong>Open Graph, Twitter Card & LinkedIn live social previews directly in the editor</strong>
✔ <strong>Meta Template Engine with 99+ dynamic variables for titles and descriptions</strong>
✔ <strong>XML sitemaps: posts, pages, taxonomies, images, and Google News</strong>
✔ <strong>301/302 URL redirections with 404 monitoring</strong>
✔ <strong>Local Business JSON-LD schema with interactive map</strong>
✔ <strong>GDPR-compliant Google Analytics 4, Google Tag Manager & cookie consent banner</strong>
✔ <strong>Migrate from Yoast SEO, Rank Math & SEOPress in one click</strong>
✔ <strong>No ads, fully modular — disable what you don't need</strong>

<h3>Why choose SEOPulse?</h3>

<ul>
	<li><strong>All in one</strong>: No need for separate plugins for sitemaps, redirects, schemas, or analytics. SEOPulse bundles everything. Disable unused modules with one click.</li>
	<li><strong>Easy AND powerful</strong>: The setup wizard guides you through initial configuration. Advanced users get access to 99+ template variables, REST API endpoints and WP-CLI commands.</li>
	<li><strong>Modern architecture</strong>: Built on React and PHP 8.O with a modular design, SEOPulse is fast, extensible, and developer-friendly.</li>
	<li><strong>Migrate easily</strong>: Import your focus keywords, meta tags, and Open Graph data from Yoast SEO, Rank Math, SEOPress or All In One SEO in a single click.</li>
</ul>

<h3>Features</h3>

<ul>
	<li><strong>Installation wizard</strong> to quickly setup your site</li>
	<li><strong>Content analysis</strong> with up to 5 focus keywords per post and real-time SEO scoring (0–100)</li>
	<li><strong>18+ content checks</strong>: title structure, heading hierarchy, word count, keyword density, links, images, alt text</li>
	<li><strong>Readability analysis</strong>: Flesch Reading Ease, sentence length, passive voice, complex words, transition words</li>
	<li><strong>Mobile / Desktop Google Preview</strong> to see how your post appears in search results</li>
	<li><strong>Facebook, Twitter & LinkedIn social previews</strong> directly in the editor sidebar</li>
	<li><strong>SEO titles & meta descriptions</strong> with dynamic variables (post title, author, date, custom fields…)</li>
	<li><strong>Meta Template Engine</strong>: 16 namespaces, 99+ variables, conditional rendering, fallback chains</li>
	<li><strong>Open Graph & Twitter Cards</strong> for better social sharing on Facebook, LinkedIn, Twitter, WhatsApp…</li>
	<li><strong>Custom canonical URL</strong> and robots directives (noindex, nofollow, noarchive)</li>
	<li><strong>XML Sitemaps</strong>: posts, pages, custom post types, taxonomies, images</li>
	<li><strong>Google News Sitemap</strong> with multilingual support (WPML, Polylang, TranslatePress)</li>
	<li><strong>robots.txt management</strong> with auto-insertion of sitemap URL</li>
	<li><strong>301/302 URL redirections</strong> with exact matching, hit counter, and chain detection</li>
	<li><strong>404 monitoring</strong>: automatic logging with referrer, user agent, deduplication, and bot filtering (up to 100 entries)</li>
	<li><strong>Redirect suggestions</strong> for 404 URLs</li>
	<li><strong>CSV export</strong> for redirects and 404 logs</li>
	<li><strong>Local Business SEO</strong>: single-location JSON-LD schema with address, opening hours, phone, email, social profiles, business identity, logo, ratings, and pricing</li>
	<li><strong>JSON-LD schema</strong>: Organization, WebSite, Article, FAQ, HowTo, Product (WooCommerce)</li>
	<li><strong>JSON-LD validator</strong> with browser preview</li>
	<li><strong>Google Analytics 4</strong> (GA4) with Consent Mode v2 and GDPR compliance</li>
	<li><strong>Google Tag Manager</strong> (GTM) with consent-aware script injection</li>
	<li><strong>GDPR cookie consent banner</strong>: customizable position, theme, message, and button text</li>
	<li><strong>Instant indexing</strong>: IndexNow protocol and Google Indexing API with submission log</li>
	<li><strong>Google Suggest integration</strong> for keyword research in the editor</li>
	<li><strong>WooCommerce support</strong>: Product schema auto-injection, meta template variables (price, SKU, rating…)</li>
	<li><strong>SEO columns</strong> in post/page lists: sortable score, title, description, focus keywords with color-coded badges</li>
	<li><strong>Admin bar SEO score</strong> for quick reference</li>
	<li><strong>Image ALT auto-fill</strong> and image diagnostics</li>
	<li><strong>HTML Head cleanup</strong>: remove generator tag, emoji scripts, WLW manifest, shortlinks, RSD links</li>
	<li><strong>Freeze Modified Date</strong> to preserve SEO history on post edits</li>
	<li><strong>Import/Export settings</strong> in JSON format and one-click plugin reset</li>
	<li><strong>Migrate from</strong> Yoast SEO, Rank Math, SEOPress and All In One SEO</li>
	<li><strong>WP-CLI commands</strong>: analyze, dashboard, migrate, export, import</li>
	<li><strong>Full REST API</strong> for all major features</li>
	<li><strong>Multisite compatible</strong></li>
	<li><strong>Multilingual ready</strong>: WPML, Polylang, TranslatePress</li>
</ul>

<h3>All Features Included</h3>

SEOPulse ships with every feature unlocked — no upsells, no limits:

<ul>
	<li><strong>Unlimited focus keywords</strong> per post</li>
	<li><strong>Unlimited redirections</strong> with regex pattern support and capture groups</li>
	<li><strong>CSV redirect import/export</strong> for bulk redirect management</li>
	<li><strong>Extended Local SEO fields</strong>: fax, GPS coordinates, price range, aggregate rating, area served, founding date, number of employees, payment methods, slogan, currencies accepted…</li>
	<li><strong>6 Gutenberg blocks</strong> with auto-injected structured data: FAQ (FAQPage schema), HowTo (HowTo schema), Table of Contents (auto-generated), Schema (custom JSON-LD), Review (ratings), Product Grid (WooCommerce)</li>
</ul>

<h3>WooCommerce SEO</h3>

SEOPulse integrates with WooCommerce out of the box:

<ul>
	<li>Automatic Product JSON-LD schema (name, price, availability, SKU, ratings, brand, images)</li>
	<li>WooCommerce variables in the Meta Template Engine (price, SKU, rating, stock…)</li>
	<li>Product Grid Gutenberg block with search, filter, and sort</li>
	<li>Freeze Modified Date to preserve SEO history on product edits</li>
	<li>Enhanced product schema, breadcrumb customization, and category SEO optimization</li>
</ul>

<h3>Developers will love SEOPulse!</h3>

<ul>
	<li>Modular architecture with 8 toggleable modules</li>
	<li>Full REST API under <code>/wp-json/seopulse/v1/</code> for every feature</li>
	<li>WP-CLI commands for batch operations (analyze, migrate, export, import)</li>
	<li>Hooks and filters for extensibility (<code>seopulse_container_built</code>, <code>seopulse_modules_definition</code>…)</li>
	<li>Modern PHP 8.1 codebase with PSR-4 autoloading</li>
</ul>

== Installation ==

1. Upload 'seopulse' to the '/wp-content/plugins/' directory
2. Activate the plugin through the 'Plugins' menu in WordPress
3. Click on SEOPulse in the admin menu and follow the setup wizard

<strong>Requirements:</strong> WordPress 6.0+ and PHP 8.1+

= Source Code Repository =

The full source code (including all uncompiled JavaScript, TypeScript, and SCSS source files) is publicly available at: https://github.com/wp-seopulse/seopulse-public

See the "Source Code & Build Instructions" section below for details on how to compile the assets yourself.

== External Services ==

This plugin connects to several third-party external services as described below. No data is sent to any external service without the site administrator explicitly enabling the corresponding feature.

= Google Analytics 4 (GA4) =

When the GA4 tracking feature is enabled by the administrator, this plugin loads the Google Analytics 4 script on the frontend of your website.

* **What it does:** Collects anonymous website usage and traffic data for analytics purposes.
* **When data is sent:** On every frontend page load, after the visitor has given consent (if the cookie consent banner is enabled).
* **What data is sent:** Page views, user interactions, browser information, and other analytics data are collected client-side by Google's script and sent to Google's servers.
* **Service provider:** Google LLC
* [Google Analytics Terms of Service](https://marketingplatform.google.com/about/analytics/terms/us/)
* [Google Privacy Policy](https://policies.google.com/privacy)

= Google Tag Manager (GTM) =

When the GTM feature is enabled by the administrator, this plugin loads the Google Tag Manager script and noscript iframe on the frontend.

* **What it does:** Manages and deploys marketing and analytics tags on your website.
* **When data is sent:** On every frontend page load, after the visitor has given consent (if the cookie consent banner is enabled).
* **What data is sent:** Page views, browser information, and any data configured within your GTM container. The GTM container ID is embedded in the script URL.
* **Service provider:** Google LLC
* [Google Tag Manager Terms of Service](https://marketingplatform.google.com/about/analytics/tag-manager/use-policy/)
* [Google Privacy Policy](https://policies.google.com/privacy)

= Google Consent Mode v2 =

When Google Consent Mode v2 is enabled alongside GA4 or GTM, this plugin injects a consent defaults script on the frontend.

* **What it does:** Sets all Google consent categories to "denied" by default until the visitor explicitly grants consent via the cookie banner.
* **When data is sent:** No additional data is sent. This script configures the behavior of other Google scripts already loaded on the page.
* **Service provider:** Google LLC
* [Google Consent Mode documentation](https://developers.google.com/tag-platform/security/guides/consent)
* [Google Privacy Policy](https://policies.google.com/privacy)

= Google Indexing API =

When the Google Indexing feature is enabled by the administrator and a service account JSON key file has been uploaded, this plugin submits URLs to Google for indexing.

* **What it does:** Notifies Google when pages are published, updated, or deleted so they can be crawled and indexed faster.
* **When data is sent:** Automatically when a post is published, updated, or deleted, or manually via the admin interface.
* **What data is sent:** The page URL and the action type (URL_UPDATED or URL_DELETED). For authentication, a JWT assertion signed with the service account private key is sent to Google's OAuth2 token endpoint.
* **Service provider:** Google LLC
* [Google Indexing API Terms of Service](https://developers.google.com/terms)
* [Google Privacy Policy](https://policies.google.com/privacy)

= Google Autocomplete (Google Suggest) =

This plugin uses the Google Autocomplete API to provide keyword suggestions in the editor.

* **What it does:** Retrieves keyword suggestions based on a search query to help with SEO keyword research.
* **When data is sent:** When an administrator uses the Google Suggest feature in the post editor. Requests are rate-limited (2 per minute) and results are cached for 1 hour.
* **What data is sent:** The search keyword and the site language code.
* **Service provider:** Google LLC
* [Google Terms of Service](https://policies.google.com/terms)
* [Google Privacy Policy](https://policies.google.com/privacy)

= Google Sitemap Ping =

When an administrator manually triggers a search engine ping from the Sitemap settings page, this plugin notifies Google about the sitemap.

* **What it does:** Notifies Google that a sitemap has been updated.
* **When data is sent:** Only when the administrator clicks the "Ping search engines" button.
* **What data is sent:** The sitemap URL of your website.
* **Service provider:** Google LLC
* [Google Terms of Service](https://policies.google.com/terms)
* [Google Privacy Policy](https://policies.google.com/privacy)

= Bing Sitemap Ping =

When an administrator manually triggers a search engine ping from the Sitemap settings page, this plugin notifies Bing about the sitemap.

* **What it does:** Notifies Bing that a sitemap has been updated.
* **When data is sent:** Only when the administrator clicks the "Ping search engines" button.
* **What data is sent:** The sitemap URL of your website.
* **Service provider:** Microsoft Corporation
* [Bing Webmaster Tools Terms of Use](https://www.bing.com/webmasters/terms)
* [Microsoft Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement)

= IndexNow API =

When the IndexNow feature is enabled by the administrator, this plugin submits URLs to the IndexNow API for faster indexing by participating search engines (Bing, Yandex, and others).

* **What it does:** Notifies search engines when pages are published, updated, or deleted.
* **When data is sent:** Automatically when a post is published, updated, or deleted.
* **What data is sent:** The page URL and an auto-generated API key. The request is sent to `https://api.indexnow.org/indexnow`.
* **Service provider:** IndexNow.org (supported by Microsoft Bing, Naver, Seznam.cz, Yandex, and Yep)
* [IndexNow Terms and Conditions](https://www.indexnow.org/terms)
* [Microsoft Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement)

= OpenStreetMap Nominatim Geocoding API =

The Local SEO module uses the Nominatim geocoding API to convert a business address into GPS coordinates.

* **What it does:** Converts an address to GPS coordinates (geocoding) directly from the Local SEO admin settings.
* **When data is sent:** When an administrator clicks the "Get Coordinates" button after filling in their business address.
* **What data is sent:** The address search query. The administrator's IP address is visible to the API server.
* **Service provider:** OpenStreetMap Foundation
* [Nominatim Usage Policy](https://operations.osmfoundation.org/policies/nominatim/)
* [OpenStreetMap Privacy Policy](https://wiki.osmfoundation.org/wiki/Privacy_Policy)

= YouTube (Privacy-Enhanced Mode) =

The setup wizard embeds a tutorial video using YouTube's privacy-enhanced mode.

* **What it does:** Displays an embedded YouTube video in the plugin setup wizard.
* **When data is sent:** When an administrator clicks the play button on the video in the setup wizard. YouTube's privacy-enhanced mode (youtube-nocookie.com) is used to minimize tracking.
* **What data is sent:** Standard video embed request data (IP address, browser information). A video thumbnail image is also loaded from img.youtube.com.
* **Service provider:** Google LLC (YouTube)
* [YouTube Terms of Service](https://www.youtube.com/t/terms)
* [Google Privacy Policy](https://policies.google.com/privacy)

= XML Sitemaps Validator (xml-sitemaps.com) =

The Sitemap settings page includes a link that lets administrators validate their sitemap against the XML Sitemap standard using the xml-sitemaps.com online validator.

* **What it does:** Validates the XML sitemap file of your website for conformity with the XML Sitemap protocol.
* **When data is sent:** Only when the administrator explicitly clicks the "Validate sitemap" link. The link opens the external validator in a new browser tab — no data is sent automatically by the plugin.
* **What data is sent:** The public URL of your website's sitemap is passed as a URL parameter to the validator.
* **Service provider:** xml-sitemaps.com
* [xml-sitemaps.com Privacy Policy](https://www.xml-sitemaps.com/privacy-policy.html)

== Source Code & Build Instructions ==

The full uncompiled source code is publicly available on GitHub:
https://github.com/wp-seopulse/seopulse-public

The compiled and minified files in `assets/build/` (e.g. `admin.js`, `editor-sidebar.js`, `setup-wizard.js`, etc.) are generated from the human-readable source files using `@wordpress/scripts` (webpack). No external code is fetched at build time beyond npm dependencies declared in `package.json`.

= Source file locations (in the GitHub repository) =

* JavaScript / TypeScript source: `assets/src/` (React components, Gutenberg blocks, admin pages)
* SCSS source for admin styles: `assets/css/seopulse-admin.scss`
* SCSS source for module styles: `Modules/MetaSeo/assets/css/`
* Webpack configuration: `webpack.config.js`
* Build dependencies: `package.json`

= Build Instructions =

To build from source, clone the GitHub repository and run the following commands. You need Node.js (v18 or higher) and npm.

1. Clone the repository: `git clone https://github.com/wp-seopulse/seopulse-public`
2. Navigate to the plugin directory: `cd seopulse-public`
3. Install dependencies: `npm install`
4. Build production assets: `npm run build`
5. For development with live rebuilds: `npm start`

The build process uses `@wordpress/scripts` (which includes webpack) to compile TypeScript/JSX into JavaScript and SCSS into CSS. The output is written to `assets/build/`.

= PHP Dependencies =

Composer is used for PHP autoloading. Vendor dependencies are included in the `vendor/` directory. To regenerate: `composer install --no-dev`

== Frequently Asked Questions ==

= What are the requirements? =

SEOPulse requires WordPress 6.0 or higher and PHP 8.1 or higher.

= Does SEOPulse support custom post types? =

Yes. All public custom post types are supported in sitemaps, SEO analysis, and the SEO metabox. Additional post types can be added via filters.

= How is the SEO score calculated? =

The global score is a weighted combination of four categories:

* Content Analysis: 35%
* Meta Tags: 25%
* Readability: 20%
* Technical SEO: 20%

The thresholds are customizable through filters.

= Can I use more than one focus keyword? =

Yes. SEOPulse supports unlimited focus keywords per post, each with individual scoring.

= Which types of sitemaps does SEOPulse support? =

XML sitemaps for posts, pages, custom post types, taxonomies, and images. A Google News sitemap is also available with multilingual support (WPML, Polylang, TranslatePress).

= Can I manage redirections and 404 errors? =

Yes. SEOPulse includes a full redirections manager with 301/302 redirects, regex patterns, 404 logging (up to 100 entries), hit tracking, chain detection, and CSV import/export.

= Does SEOPulse support instant indexing? =

Yes. SEOPulse supports IndexNow protocol and Google Indexing API, with automatic URL submission on publish/update and an admin log viewer.

= Is WooCommerce supported? =

Yes. SEOPulse includes WooCommerce Product schema auto-injection, a Product Grid Gutenberg block, WooCommerce meta template variables, and Freeze Modified Date support.

= Can I migrate from another SEO plugin? =

Yes. SEOPulse includes one-click migration from Yoast SEO, Rank Math, SEOPress and All In One SEO to import focus keywords, meta tags, and Open Graph data.

= Is the plugin multisite compatible? =

Yes. SEOPulse supports multisite and performs per-site cleanup on uninstall.

= Is SEOPulse GDPR compliant? =

Yes. The cookie consent banner supports Google Consent Mode v2, script blocking until consent is granted, and admin consent logging for compliance audits.

= How do I get support? =

Use the WordPress.org support forum.

= Does SEOPulse include a REST API? =

Yes. All features are accessible via REST endpoints under `/wp-json/seopulse/v1/`.

== Changelog ==

= 1.5.0 =

* NEW: Admin Page Header — Notification panel items now have a "Dismiss" button; dismissed notifications are stored per user and filtered out of the `GET /notifications` REST response, plus a new `POST /notifications/dismiss` route to record the dismissal
* PERFORMANCE: Admin steelsheet now loads only when the module is enabled
* FIX: Admin Page Header — Notification IDs for disabled modules are now sanitized consistently between generation and dismissal, preventing dismissed notifications from reappearing when a module key contains uppercase or special characters
* FIX: Dashboard — Toggling a module's enabled state no longer requires a full page reload to update the notification panel and its badge counter; the header bundle now re-fetches notifications after a module toggle via a cross-bundle refresh event
* FIX: Editor Sidebar — Meta Title/Description character counter and SEO score/Meta Checks warnings now use the resolved value of dynamic variables (`%%post.title%%`, `%%post.excerpt%%`, including combinations with static text) instead of the literal template string length
* FIX: Admin Columns — Posts list "SEO" column now displays the resolved post title/description instead of the raw `%%post.title%%` / `%%post.excerpt%%` template syntax
* FIX: Admin Columns — Score badge colors on the posts list `edit.php` screen were not applied because the design-token stylesheet defining `--sp-success-subtle`/`--sp-warning-text`/`--sp-error-*` custom properties was not enqueued outside SEOPulse admin pages
* FIX: Module Page — Disabled state now renders correctly when the module is disabled
* FIX: Module Page — Module toggles now correctly redirect to the dedicated module admin page

= 1.4.0 =

* NEW: Sitemap Robots.txt — "Load current robots.txt" button in the Robots.txt View tab fetches and populates the textarea with the current robots.txt content (physical file if present, otherwise SEOPulse-generated)
* PERFORMANCE: General — Graphical improvements
* PERFORMANCE: React codebase
* FIX: Sitemap Settings — "View Sitemap" link in Tools & Diagnostics tab now correctly switches between `wp-sitemap.xml` (native) and `sitemap.xml` (custom) based on the "Disable native WordPress sitemap" checkbox state
* FIX: Sitemap Robots.txt — `generate_robots_txt()` now uses `custom_robots` as the full verbatim content when set, preventing duplicate base headers after a load-edit-save cycle
* FIX: Meta Engine — `%%author.name%%` and all `author.*` variables now resolve correctly when context is built from a `post_id` alone (e.g. headless API, editor sidebar preview); author is now auto-derived from the post's `post_author` field in `ContextBag::fromArray()`
* FIX: Meta Engine — Admin template live preview no longer resolves all contextual variables to empty; `resolve_template` endpoint now builds a sample context from the most recently modified published post when no explicit context is provided
* FIX: Editor sidebar — Modal now correctly loads the CSS
* FIX: Editor Sidebar — Snippet preview (Search tab) now displays the actual resolved post title and description instead of raw `%%post.title%%` / `%%post.excerpt%%` template strings
* FIX: Editor Sidebar — Social preview (Social tab) now displays the actual resolved OG/Twitter title and description instead of raw template strings; `resolved` values from the REST API are now used with a field-level fallback chain matching the PHP defaults

= 1.3.0 =

* NEW: Analytics & Cookie Consent —  Add settings page to configure the Google Analytics 4 and Google Tag Manager tracking scripts.
* NEW: Add an Header React component to all React SPAs.
* PERFORMANCE: CSS files to reduce the output size.
* PERFORMANCE: Rework all React SPAs.
* FIX: Local SEO — `numberOfEmployees` field reverted to 0 on page reload; API response returns a `QuantitativeValue` object which is now properly normalized to a plain string on load.
* FIX: Local SEO — `areaServed` region and country fields reverted to empty on page reload; PHP now stores `region` as `AdministrativeArea` and `country` as `Country` (distinct Schema.org types), allowing the frontend to reliably distinguish them on load.

= 1.2.1 =

* FIX: Dashboard blank — React SPA mount errors are now surfaced via an ErrorBoundary instead of silently leaving `#seopulse-dashboard-root` empty
* FIX: Dashboard blank — silent bail conditions in the entry point now log explicit `console.error` messages (`#seopulse-dashboard-root` not found, `window.seopulseDashboard` undefined, `createRoot` unavailable)
* FIX: Dashboard blank — added runtime guard for `createRoot` availability
* FIX: `DashboardHeader` — unsafe non-null assertion `window.seopulseDashboard!` replaced with optional chaining to prevent `TypeError` crashing the full render tree

= 1.2.0 =

* NEW: Dashboard fully migrated from PHP to React
* NEW: SEO Overview dashboard widget fully migrated from PHP to React with live data fetch via REST API
* NEW: Monitor404 — `sendTest()` method in `Monitor404EmailReporter` to send a test email bypassing the enabled/schedule guards
* NEW: Monitor404 — test email now captures `wp_mail_failed` hook and surfaces the PHPMailer/SMTP error message in the REST response
* NEW: "See all" expand/collapse toggle on the Recent Analyses dashboard widget
* PERFORMANCE: General CSS cleanup
* FIX: Monitor404 Settings — after saving, the React state and `window.seopulse404Monitor.settings` were not updated, requiring a full page reload to reflect changes
* FIX: Editor sidebar — ScoreGauge SVG circles now enforced via CSS to prevent Gutenberg resets from making them opaque
* FIX: Editor sidebar — ScoreGauge render the score text above the SVG
* FIX: Editor sidebar — ScoreGauge color variant selectors now use higher specificity to resist WordPress/Gutenberg overrides
* FIX: Score level vocabulary mismatch — PHP now returns `needs_improvement` to align with TypeScript components
* FIX: Open Graph and Twitter Card global settings were saved correctly but never applied to frontend meta tags
* FIX: Third-party admin notices (e.g. Elementor, WooCommerce) no longer appear on SEOPulse plugin pages
* FIX: French translations not displayed on Meta SEO, Local SEO, Redirections, Sitemap and Log Viewer pages — `wp_set_script_translations()` was missing for the corresponding script handles

= 1.1.0 =

* NEW: "See all" expand/collapse toggle on the Quick Wins dashboard widget
* NEW: "See all" expand/collapse toggle on the Images to Fix dashboard widget
* NEW: Command palette (Ctrl+K) in admin bar
* NEW: SEO score in admin bar
* NEW: Modules Panel block is now draggable to left or right columns in the dashboard grid
* PERFORMANCE: SEO Health Status dashboard widget: score sparkline is now animated
* PERFORMANCE: SEO Health Status dashboard widget: KPI badge now shows the live score
* PERFORMANCE: Recent Analyses dashboard Widget
* FIX: Fatal error on Setup Wizard

= 1.0.1 =

Tested up to WordPress 7.0

= 1.0.0 =

Initial release.