*** Product Tabs Studio – full changelog ***

The readme.txt on WordPress.org keeps only the last three versions; this file keeps every version.

1.0.0 (2026-09, first release)
* Per-product tabs stored as JSON post meta (`_ptstudio_tabs`) with a per-product history (last 5 saves by default, up to 20) and one-click restore from the product editor.
* Global tabs (custom post type `ptstudio_tab`) shown on all products, on products matching rules, or attached manually from the product panel.
* Free rule types: category (with subcategories), tag, brand (WooCommerce Brands, Perfect Brands, YITH Brands, filterable), specific products, product type / virtual / downloadable; include and exclude lists; any/all matching; exclude always wins.
* Per-product "hide" and "customize content" of a rule-matched global tab without touching the global content.
* Save guards: nothing is written unless the product panel was part of the submitted form; truncated POSTs (PHP max_input_vars) are detected, rejected and explained; the previous value is always kept in history; a single JSON field travels instead of hundreds of inputs.
* Tab order screen: rename, hide or move Description / Additional information / Reviews; unmoved default tabs keep their WooCommerce priorities; custom-tab slot (first / after description / before reviews / after all).
* Rendering: `woocommerce_product_tabs` filter at priority 10 registered on `woocommerce_init`; automatic priorities 25, 26, …; Reviews pushed last in the default slot; three content pipelines (standard / isolated / raw) with automatic safe-mode fallback when a theme filter throws; template overrides in `yourtheme/product-tabs-studio/`.
* Shortcodes `[ptstudio_tabs]`, `[ptstudio_tab key="…"]`, `[ptstudio_youtube]`; hash deep links (`#tab-key`).
* Read-only adapters for Custom Product Tabs for WooCommerce (YIKES / Code Parrots), Product Tabs for WooCommerce (Barn2, free) and WB Custom Product Tabs: their tabs render as soon as the other plugin is deactivated, with the same keys, order and (optionally) CSS classes; nothing is modified.
* YIKES take-over: saved tabs converted to global tabs, settings mapped, lazy conversion of product tabs on the first native save, optional mirror back to the YIKES format (`legacy_mirror`) so a rollback keeps working; YIKES filters and WB shortcodes aliased (`legacy_hooks`).
* Migration engine for Barn2 and WB: dry run, batched migration with progress, verification report (both renderings compared), rollback that removes exactly what was created; downloadable JSON report.
* Templates library: Manufacturer information (GPSR), EU responsible person, Safety information, Shipping & returns, Size guide, Warranty, Care instructions.
* Tools & Health: migration cards, JSON export/import (merge/replace, dry run), WooCommerce CSV bridge (product tabs travel with the WooCommerce product exporter/importer), health checks with fix links, system report (copy/download), activity log.
* Site Health tests: rival plugin active, tabs template override, tabs output removed, render failures, pending migration, truncated saves; debug information section.
* Compatibility: WPML (`wpml-config.xml`, JSON meta encoding), Polylang, WooCommerce HPOS declaration, block themes (Product Details block), Elementor / Divi / Bricks / WPBakery detection with an "isolated pipeline" recommendation, product duplication, quick-view plugins.
* Security: every admin-ajax handler checks a nonce and a capability; no `wp_ajax_nopriv_` handlers; no REST routes; `unserialize()` used only in `Legacy\Safe_Unserialize` (objects rejected); all plugin data stored as JSON strings or scalars; content sanitised with `wp_kses_post` and an iframe host allow-list.
* Uninstall: keeps data by default; two explicit opt-in switches delete plugin data and, separately, per-product tabs.
* Internationalisation: text domain `product-tabs-studio`, POT file, `wp_set_script_translations` for the admin scripts.
