== Changelog ==

This file contains the full release history of BrikPanel. The latest releases are kept in readme.txt; older versions are archived here.

= 3.0.5 (2026-05-19) =
* New: **GTIN column on the products list** — the BrikPanel product list can now show a **GTIN** column reading WooCommerce's native `_global_unique_id` field (`WC_Product::get_global_unique_id()`). Off by default; flip it on per-user from the **Columns** popover (persisted in user meta, like every other column). Variable products show the parent GTIN, or the aggregated variation GTINs when the parent has none — so it works for both simple and variable products
* New: **Search products by SKU** — the product list live-search box now matches on SKU as well as title. A `posts_search` filter rewrites the query so a search term hits a product's own `_sku` **and** surfaces a parent product whenever one of its variation SKUs matches, with `$wpdb->esc_like()` escaping throughout. Resolves the user report that SKU search did not work on the product list
* New: **Yoast SEO for WooCommerce compatibility** — the WooCommerce-specific Yoast addon (detected via `WPSEO_WOO_VERSION`) ran its identifier/GTIN analysis against `#product-type` and `#_sku` DOM nodes that the simplified BrikPanel editor never rendered, so it errored out. The editor now emits hidden shim nodes mirroring the real product type and SKU and keeps the hidden `#product-type` in sync when the BrikPanel type selector changes, so the Yoast Woo SEO analysis and score panel run correctly inside the BrikPanel product editor for both simple and variable products
* New: **Dashboard export button** — a new export button next to the dashboard date-range presets downloads the full dashboard as a multi-sheet Excel workbook (Summary, conversion funnel, order status, devices, customer segments, top products, most-viewed, most added-to-cart, sales-over-time, countries, cities, low stock, subscriptions and full order records) for the active date range. Built from the exact payload the dashboard renders so the file can never drift from the screen; streamed via `admin-post.php` (`brikpanel_dashboard_export`, nonce-checked, `manage_woocommerce`-gated) with real numeric cells so the spreadsheet can sum and sort
* New: **Shipping class in the product editor** — WooCommerce's `product_shipping_class` taxonomy is now selectable in the simplified product editor as an opt-in **Shipping class** section (enable it from WooCommerce → Settings → BrikPanel via the editor section list; hidden by default). Simple products get one selector; variable products additionally get a per-variation shipping class column with a "Same as parent" inherit option, so every variation can override individually. Closes the migration gap reported by users who relied on WooCommerce shipping classes
* Fix: **Bullet points now render in the product editor and on the storefront** — bulleted and numbered lists created in the editor were being wrapped in an invalid `<p> > <ul>` structure so they did not display as a list. After an insert-list command the editor now unwraps the list from its surrounding paragraph, and explicit `list-style` / `display:list-item` CSS for nested `ul`/`ol`/`li` (disc → circle → square) makes lists render correctly in both the editor and the front-end product description
* Improvement: **Richer product description editor** — the description and short-description editors gained a block-format dropdown (Paragraph, Heading 2, Heading 3, Heading 4) that reflects and applies the current selection's block, plus heading CSS so the formatting is visible while editing. Combined with the existing visual ⇄ HTML source toggle, content pasted from a website (which keeps its markup) can now be retagged with proper headings from the toolbar instead of only being fixable in the code editor

= 3.0.4 (2026-05-18) =
* New: **Access control** — a new WooCommerce → Settings → BrikPanel → "Access control" section lets you keep the BrikPanel interface for some users while leaving others on the stock WordPress / WooCommerce admin. Disable for **administrators** with one toggle (the common agency setup: clients who are shop managers get BrikPanel, the agency's own administrator account stays vanilla), and/or for any **roles** or hand-picked **individual users**. Disabled users get the native admin menu, dashboard, product/order/coupon screens and zero BrikPanel styling; everyone else is unaffected. Enforced in two layers — every interface toggle is short-circuited to "off" so each module renders the native screen, and all always-on BrikPanel assets, the extra order-list columns and the font/accent/brand-logo theming are swept — so the result is pixel-for-pixel the default experience. BrikPanel analytics, tracking and background jobs keep running for the store regardless. The BrikPanel settings tab is always reachable (with the real toggle states) even for an excluded administrator, so you can never lock yourself out

= 3.0.2 (2026-05-16) =
* Security: **Signed proxy responses** — every reply from the brksoft.com proxy (Google Ads, Meta Ads and Google Sheets OAuth) is now HMAC-SHA256 signed with a freshness timestamp. The plugin verifies the signature on every successful response and refuses to act on any unsigned, tampered, replayed or stale body instead of trusting it — closing cache-poisoning / transport-tampering / log-only attack paths
* Security: **Remote kill-switch** — a signed `revoke` directive lets the proxy operator make all installs immediately wipe their stored Google / Meta / Sheets tokens and stop calling the proxy until the user reconnects, so a suspected proxy compromise can be contained without a plugin update
* Security: **Google Ads query allow-list** on the proxy — only the exact daily-spend query is accepted; any attempt to pull search terms, PII or other resources through a connected account is rejected
* Security: **Hostile `raw_data` handling** — ad-spend API payloads are depth-, size- and charset-capped before they are stored, so a malicious response cannot bloat the table or smuggle content to later consumers
* Security: Proxy global off-switch, `no-store` / `noindex` response headers, and operational hardening notes for the brksoft.com proxy
* Tweak: Version bump to 3.0.2; no functional changes to the dashboard, sync or UI

= 3.0.0 (2026-05-15) =
* New: **Google Ads & Meta Ads integration** — BrikPanel now pulls daily ad spend from Google Ads and Meta (Facebook / Instagram) Ads into a local table so the dashboard can show **real ROAS and Net Profit** next to store revenue. Three new KPI cards render under the existing dashboard metrics: **Ad Spend** (summed across every connected platform for the active date range), **ROAS** (store revenue ÷ ad spend), and **Net Profit** (revenue − COGS − ad spend − manual expenses). The cards are multi-currency aware — when an ad account reports in a different currency than the store, spend is shown split as "₺X + $Y" and ROAS / Net Profit are intentionally omitted (UI shows "—") instead of printing a misleading converted number. COGS is read from WooCommerce's native order COGS meta through a dedicated HPOS-compatible query; manual expenses come from the existing BrikPanel expenses table. The cards only appear once the first sync has written real data
* New: One-click OAuth connect per platform through the same brksoft.com proxy pattern as Google Sheets — PKCE-protected handoff, and the Google **developer token** / Meta **app secret** / OAuth client secret never ship inside the plugin (the proxy injects them server-side). Tokens are kept in a single encrypted multi-platform vault (`sodium_crypto_secretbox`, AES-256-GCM fallback, key HKDF-derived from the site's WP salts) with platform-aware refresh: Google uses the standard `refresh_token` grant, Meta uses the `fb_exchange_token` long-lived-token swap. A revoked / `invalid_grant` connection auto-clears so the UI shows a clean "reconnect" state instead of looping on errors
* New: Per-platform **primary account picker** — Google enumerates accounts via `listAccessibleCustomers` with manager-account (MCC) `login-customer-id` support; Meta lists `/me/adaccounts` including accounts under a Business Manager. On first account selection BrikPanel backfills **3 years of history**, split into 90-day Action Scheduler chunks scheduled most-recent-first so today's spend appears on the dashboard within minutes while the full history fills in behind it. A daily sync re-pulls the trailing 7 days to absorb the late revisions ad platforms apply to recent-day numbers; every write is an idempotent UPSERT so re-syncing or overlapping windows never duplicate a day
* New: Dedicated **Ad Platforms** page under the WooCommerce menu (Beta badge), a "Connect ad accounts" call-to-action on the dashboard, a per-platform manual **Sync now** button, backfill progress, and a token-redacted error log viewer. A master toggle under WooCommerce → Settings → BrikPanel → **Ad Platforms** (default on) makes the whole module dormant when off — no admin page, no scheduled sync, no dashboard cards — while saved connections are kept. Google Ads stays locked behind a switch until its Google-approved developer token is live so users never hit a dead "Connect" button; Meta is unaffected. A new `wp_brikpanel_ad_spend` table is created on activation alongside the other BrikPanel tables, and the raw API payload is retained per row for the planned BrikMentor analysis
* Developer: New proxy-tunnelled **Google Ads API** and **Meta Marketing API** clients (`Brikpanel_Ads_Google_Client`, `Brikpanel_Ads_Meta_Client`) built on `wp_remote_*` with one-shot 401 refresh-and-retry, infrastructure-only backoff (HTTP 429 / 502 / 503 / 504 plus Meta rate-limit codes 4 / 17 / 32 / 613) and no retry on application-level 500s so a misconfigured proxy fails fast instead of hanging the settings UI — no Composer dependency added, reusing the foundation laid by the 2.9.0 Sheets client

= 2.9.5 (2026-05-13) =
* New: Multisite network access rules — when BrikPanel is network-activated, every subsite admin used to inherit full visibility of the WooCommerce → BrikPanel settings tab; a new "BrikPanel Access" page under Network Admin → Settings now lets the Super Admin enforce a role allowlist (`brikpanel_network_access` site-option). When enforcement is on, only users whose role is in the allowlist see the settings tab, the BrikPanel sidebar menus, and can hit any `brikpanel_*` AJAX endpoint — gated centrally through `brikpanel_user_can_access()` so a single check applies across surfaces and the `administrator` role can never be removed from the allowlist (defense-in-depth)
* New: **Delete individual variations** from inside the BrikPanel product editor — every row in the variation table now has a per-row trash button with an in-place confirmation, and the deletion is finalized when the parent product is saved. Combined with the existing **Generate variations** button this closes the last gap users hit when migrating away from the default WooCommerce variations tab. Works on both brand-new variable products and existing ones with attribute combinations already generated
* New: Unsaved-changes guard on the product editor — clicking the top-left "Back to Products" arrow (or closing the tab / reloading) while any field is dirty now triggers the browser's native `beforeunload` confirmation instead of silently discarding edits. Dirty state is tracked on every input / textarea / select / contenteditable inside the editor body
* New: Quick-edit drawer **featured product star** — the slide-in quick edit panel from the products list now exposes the same featured-product star that lives in the row and the full product editor, so a product can be flipped in/out of WooCommerce's featured pool without opening either screen. Backed by the same `brikpanel_toggle_featured` AJAX endpoint as the row icon; row + drawer star sync via a shared `applyQeFeaturedState()` so toggling either surface updates the other instantly. Works for both simple and variable products
* New: Optional advanced coupon restriction fields — the slide-over coupon editor stays minimal by default, but six WC-native restriction fields can now be enabled individually under WooCommerce → Settings → BrikPanel → Coupons: **Products**, **Exclude products**, **Product categories**, **Exclude categories**, **Allowed billing emails** and **Limit usage to X items**. Each toggle is checked both on the editor render side AND inside the AJAX save handler so a hostile payload cannot write to a field that an admin has not enabled. Closes the migration gap reported by users moving from heavy WC coupon workflows
* New: Drag-free **dashboard section ordering** — the existing "Visible dashboard sections" multiselect is now an ordered list with per-row visibility checkbox and up/down arrow buttons (same pattern as the product editor section ordering), so dashboard cards can be both hidden and reordered without touching the drag-and-drop API. Order persists as `brikpanel_dashboard_section_order` JSON, and the dashboard renderer resolves the final order through a `brikpanel_dashboard_section_order` filter so developers can override programmatically
* New: "Copy everything" help tooltip — the previously-cryptic dashboard "Copy everything" button now ships with a question-mark icon next to it whose hover/focus tooltip explains exactly what it does: bundles every dashboard metric (KPIs, top products, recent orders, customers, settings) into a single Markdown report and copies it to the clipboard, ready to paste into ChatGPT / Claude for instant store analysis. CSS-only popover, repositions right-aligned on screens under 900px
* New: **Google Sheets** integration ships with a "Beta" badge on its menu item and page header, and can now be fully disabled from WooCommerce → Settings → BrikPanel → "Google Sheets integration" with a single checkbox (`brikpanel_gs_module_enabled`, default on). When disabled, no admin page, no sync classes, no OAuth handlers and no `woocommerce_new_order` listener are registered — zero overhead on stores that do not use the connector
* Fix: Third-party **brand / taxonomy columns** in the products list now render as comma-separated, locale-aware brand labels instead of dumping the raw array (`Array` or `["Brand1","Brand2"]`). The ASE bridge routes any column whose source is a taxonomy through `get_the_terms()` + `sanitize_term_field()` + `wp_get_list_item_separator()` before output, with per-term escaping — fixes brand columns added by WooCommerce Brands, Perfect WooCommerce Brands, YITH Brands and any plugin that registers a taxonomy column on the products list
* Fix: Variable products created through the BrikPanel editor sometimes lost their variation selector on the storefront (notably reported on stores running the Blocksy Pro theme). Root cause: an in-flight `save_post` hook reloaded the parent product through WC's poisoned factory cache and silently flipped the `product_type` term back to "simple". `save_variations()` now reasserts the `variable` term with `wp_set_object_terms()`, clears WC's per-product `_type_` cache via `WC_Cache_Helper::get_cache_prefix()`, calls `clean_post_cache()`, and finally calls `WC_Product_Variable::sync()` on a freshly-instantiated parent so the frontend always recognizes the product as variable

= 2.9.1 (2026-05-12) =
* Critical fix: Google Sheets sync handlers were registered only inside the `is_admin()` gate, so Action Scheduler workers (WP-Cron / CLI) and the front-end `woocommerce_new_order` hook never saw them — real-time sync silently dropped new orders and bulk export failed with "no callbacks registered". Bootstrap now loads outside the admin gate (same pattern as BrikControl); admin menu / AJAX endpoints still self-gate to admin context
* Critical fix: "Sync now" was queueing an Action Scheduler job and returning immediately, leaving the user with no progress, no row count, and no completion signal. Now runs inline with a spinner, sticky "Syncing…" toast, and a final success toast reporting actual rows + duration. Bulk export still paginates in the background via Action Scheduler when more rows remain
* New: "Reset & re-push everything" button on the Orders tab — clears the `_brikpanel_gs_synced_at` flag from every order so the next Sync re-pushes the full history to the currently configured tab. Useful when renaming the target tab so the old history appears in the new tab
* New: switching the target spreadsheet now automatically resets sync state — every order is re-pushed to the new sheet on the next sync (was: silently kept the old "synced" flags so new sheet stayed empty)
* Improvement: Sync now feedback is data-driven — when nothing new was synced, the toast explains "every order is already marked synced" and points to the Reset button instead of returning silent zero
* Improvement: Reports / Customers / Orders sync handlers return structured stats (`rows`, `orders`, `more`) so manual sync can report exact numbers and the JS UI can refresh the "Last successful sync" stamp inline without a page reload
* Improvement: `ensure_tab` now detects pre-seeded empty tabs (created via the "Create new spreadsheet" flow) and writes their header on first sync instead of leaving them headerless. Existing tabs with non-empty headers are never overwritten
* Improvement: Reports analytics helpers (`brikpanel_get_total_revenue`, `brikpanel_get_visitor_count`, etc.) are now explicitly loaded by the reports-sync handler, so Sales Summary / Daily KPIs / Top Products / Funnel tabs work when running inside Action Scheduler workers (previously silently emitted zero rows)
* Improvement: Token refresh stays robust when `expires_at` has already lapsed — the lazy refresh path runs synchronously through the brksoft.com proxy and surfaces auth errors clearly

= 2.9.0 (2026-05-12) =
* New: **Google Sheets integration** — a fully native, one-click connector that streams BrikPanel data into a Google Sheet of your choice. Four flows ship in V1: (1) **Real-time order sync** — every new WooCommerce order is appended to a dedicated tab within seconds, with one row per line item so variations get their own row and attribute columns; status changes update the existing row in place via stored row indices kept in order meta. (2) **Scheduled bulk export** — Action Scheduler-backed hourly/4h/daily job that catches up historical orders matching a configurable date range and status set; same idempotency guarantee, so manually re-running "Sync now" never duplicates rows. (3) **Analytics report snapshots** — four overwrite-mode tabs (Sales Summary, Daily KPIs, Top Products, Funnel) are refreshed on an interval, exposing total-sales, conversion, AOV, refund/conversion rates and the visitor → checkout funnel directly in Sheets for formulas and pivots. (4) **Customer + RFM snapshot** — chained to the nightly RFM recompute so the segments tab refreshes the moment the metrics table does. Authentication uses an OAuth proxy that BrikPanel hosts on brksoft.com (PKCE-protected handoff token, never sends the auth code through the browser URL); the plugin stores only encrypted access/refresh tokens locally (sodium_crypto_secretbox keyed off AUTH_KEY + SECURE_AUTH_KEY) and requests minimum scopes — `spreadsheets` + `drive.file` (NOT full Drive). HPOS-compatible queries throughout, custom error log with bearer/token redaction, exponential backoff on 429/5xx, and full re-pin into the modern sidebar. Top-level menu page (Google Sheets) under WooCommerce → BrikPanel
* Developer: New WP-CLI-compatible Sheets API client (`Brikpanel_Sheets_Client`) using `wp_remote_*` with built-in 401-refresh, 429 exponential backoff, and 403 rateLimitExceeded handling — no Composer dependency added. Reusable foundation for the planned Google Ads integration in 3.0

= 2.8.6 (2026-05-11) =
* New: Featured product star — a new opt-in setting adds a clickable star next to the status dropdown in the simplified product editor and at the start of every row in the products list, so any product can be flipped in or out of WooCommerce's featured pool without opening the full editor. Backed by WC's native `featured` term on the `product_visibility` taxonomy (single source of truth shared with storefront shortcodes and "featured" widgets), with optimistic UI and a dedicated `brikpanel_toggle_featured` AJAX endpoint. Off by default so existing installs are unchanged
* New: Brand logo for the BrikPanel topbar and the modern login page — a new opt-in toggle under WooCommerce → Settings → BrikPanel → Appearance lets store owners pick a single brand image from the media library that replaces both the BrikPanel mark in the admin top bar AND the centered logo on the modern login screen. One picker drives both surfaces so the brand stays consistent. Off by default; wide non-square logos stretch horizontally up to 160px in the top bar instead of being letterboxed
* New: Settings import / export — a new "Import / Export" section under WooCommerce → Settings → BrikPanel downloads every BrikPanel option as a single portable JSON file (toggles, layout, accent color, sidebar order, dashboard order, product-editor section order, notification preferences). The import endpoint validates the format header, refuses files over 1 MB, and sanitises every value against its declared WC field type before writing — so a hostile upload can never inject raw values into `wp_options`. The brand logo attachment id is intentionally skipped because it cannot transfer across sites. New `brikpanel_exportable_option_keys` filter for developers
* New: Drag-free section ordering in the simplified product editor — the previously-flat "Visible editor sections" multiselect under Settings → Products is now a sortable list with per-row up/down buttons and a visibility checkbox, so store owners can both hide and reorder every editor section (Images, Pricing, Inventory, Category, Tags, Digital, Description, Variations, SEO, Attributes, …) without touching code. Order is persisted as JSON and merged forward on plugin update so newly-introduced sections never silently disappear; hidden sections keep their slot so they slide back into place when re-enabled
* New: Backorder "Notify customer" sub-option — opt-in setting that surfaces WooCommerce's third backorder value (`notify`) in the simplified product editor. When "On backorder" is selected as the stock status, a CSS-Grid collapse reveals two radios (*Allow without notification* / *Allow and notify customer*); WC then writes a customer-visible note onto backordered line items at checkout. Works on both simple and variable products (variation rows expose the same control), and off by default so existing installs keep their two-value behaviour
* New: Quick-edit drawer now respects custom product taxonomies — a new opt-in setting surfaces any third-party product taxonomy (Brands from WooCommerce / Perfect WooCommerce Brands / YITH Brands, plus any custom `register_taxonomy` for the product post type) inside the slide-in quick-edit panel alongside Categories and Tags. Hierarchical taxonomies render as a checkbox tree, flat ones as a flat list, and capability checks (`assign_terms`) ensure editors without rights never see fields they can't save. Off by default; built-in cat/tag and attribute (`pa_*`) taxonomies are excluded since they already have dedicated UI
* Improvement: Virtual flag is now driven by the Downloadable toggle in the product editor — toggling "Digital (downloadable)" on automatically locks Virtual on and disables it, so the user can never end up in an inconsistent "downloadable but ships physically" state. Variations inherit the parent's Virtual + Downloadable flags so the lock applies uniformly across variable products

= 2.8.5 (2026-05-07) =
* New: BrikControl — Store Health module. A new "Store Health" surface (shield icon in the BrikPanel topbar + dashboard alert banner + dedicated `admin.php?page=brikpanel-brikcontrol` report page) audits every published and private product (and variation) and scores the store on two e-commerce-critical axes: oversized product images (>1 MB) and modern format coverage (WebP / AVIF). Each finding ships a clear recommendation — BrikPanel does NOT bundle its own image converter (that would needlessly bloat the plugin); instead it detects already-active optimizers (Smush, ShortPixel, Imagify, EWWW, Optimole, reSmush.it, LiteSpeed, WebP Express, Converter for Media, ShortPixel Adaptive Images, Jetpack Boost…) and, when none is found, surfaces a critical flag with a curated install list. Scans run in the background through Action Scheduler (200 products per batch, idle when not needed) and the topbar updates without leaving the page
* New: Vendor management settings under WooCommerce → Settings → BrikPanel → Vendors. New dedicated section pill exposes a master toggle for the Vendors / Stock Orders feature, a "Show vendor field in product editor" toggle (adds a Sourcing card with vendor + per-product vendor SKU; variations inherit the parent vendor unless overridden), a "Show vendor column on products list" toggle, the Stock Orders module toggle with a configurable PO reference prefix, and granular automations for the moment a purchase order is received (auto-increase WC stock, auto-update product cost / COGS with last-cost OR weighted-average method, auto-create matching expense entry under a configurable category). A "Settings" row is also injected into the top-level Vendors menu that links straight to the section
* New: Full WordPress Multisite compatibility — BrikPanel can now be network-activated to deploy a separate, fully-isolated dashboard on every subsite. Each subsite gets its own products, orders, vendors, stock orders, expenses, customer analytics tables, settings and Action Scheduler queue, with zero cross-site leakage. Network activation provisions every existing subsite immediately, and a `wp_initialize_site` hook back-fills tables / defaults the moment a new subsite is created on a network where BrikPanel is already active. Per-site activation continues to work unchanged on single-site WordPress
* Improvement: New products now default to the **Published** status in the BrikPanel product editor instead of "Draft". Auto-draft posts are surfaced as "publish" in the status dropdown so the very first save publishes the product without a second click — matching what most store owners expect. Existing drafts keep their current status untouched
* Improvement: Brand-new products now show a **Publish** button (instead of "Save") and clicking it actually publishes the product. The moment the first save succeeds, the action bar auto-injects the **View product**, **Duplicate** and **Add new** buttons next to the status dropdown — no page reload required. Previously these only appeared after a manual page refresh
* Improvement: Toggling **"Does this product have sizes/colors?"** on now hides the standalone **Product attributes** card while the variations wizard is open, so users no longer get confused between variation attributes (Size / Color) and spec attributes (Brand / Material). Switching the toggle back off restores the card immediately. Works on both simple→variable transitions and existing variable products
* Fix: The product list **Sort** dropdown now correctly re-orders products when a specific category is selected. Previously, filtering by category and changing the sort order in the same session left the table on the previous ordering because rapid filter+sort changes raced each other; in-flight requests are now aborted when a newer one is fired, so the visible ordering always matches the dropdown — for both simple and variable products

= 2.7.2 (2026-05-04) =
* New: Sidebar navigation customizer "More menu" section — top-level WordPress admin menu items (and custom links) can now be promoted into the BrikPanel "More" dropdown alongside the native WooCommerce submenus, instead of only living in the top "Store" or "Site management" groups. Drag any row from WooCommerce → Settings → BrikPanel → Navigation into the new third section and it renders as a child of "More" on the sidebar, with the existing WC submenu structure (Reports, Status, Extensions, …) preserved
* New: Per-submenu visibility toggles in the customizer — every system row now expands into a collapsible panel that lists its individual WordPress submenu children (e.g. Users → All Users, Add User, Profile) with a small toggle next to each one. Hidden children disappear from the BrikPanel sidebar hover/expand menu without removing the parent
* New: Custom icon override for system items — every system row now has a "Change icon" button that opens the icon picker dialog and replaces the default WordPress dashicon with one of the curated BrikPanel SVG icons (25+ options); a "Use original" button restores the dashicon. Previously only user-added custom links could pick from this icon set
* Improvement: Customizer config schema is forward-compatible — existing saved configs continue to work without `submenus` / `icon_override` fields, and the snapshot now collects all submenu children (with WC promotion/skip filters applied) so newly-installed plugins surface their child items automatically

= 2.7.0 (2026-05-04) =
* New: Sidebar navigation customizer — every item in the BrikPanel left menu (both the top "Store" group and the "Site management" group below the heading) can now be reordered via drag-and-drop, hidden, or extended with custom internal/external links from WooCommerce → Settings → BrikPanel → Navigation. Configuration is stored as JSON in a single option and newly-installed plugins auto-append at the end so they always remain visible after an update
* New: Dashboard section visibility — the "Dashboard" settings section now exposes a multiselect that lets store owners pick exactly which cards render on the BrikPanel dashboard (KPI cards, sales chart + live visitors, conversion funnel + order rates, locations globe, top products + recent orders, most viewed pages + add-to-cart, devices + customer types, RFM segments, low stock + LTV, subscriptions, marketplace analytics, WordPress widgets). Empty selection means "show everything", so existing installs keep their full dashboard
* New: Storefront product ordering from the BrikPanel product list — a new "Sort" toggle in the toolbar enables drag-and-drop reordering of products with a handle column, and a "Custom order" entry has been added to the sort dropdown so the saved order is also browseable inside the panel. Reordering writes directly to `wp_posts.menu_order` so the new sequence applies on the storefront immediately, with collisions tie-broken by title
* New: Admin interface appearance customization — a new "Appearance" section in BrikPanel settings lets you change the UI font (System default + nine curated Google Fonts: Inter, Poppins, Roboto, Manrope, DM Sans, Plus Jakarta Sans, Nunito, Work Sans) and the primary/accent color used across the dashboard, top bar, sidebar, products, orders, coupons, segments, expenses, customer analytics, product editor and the modern login page. Google fonts are loaded with `display: swap` and a `preconnect` hint, and skipped entirely when "System default" is selected so no outbound request is ever made by default
* New: Full RTL support — a dedicated `assets/css/brikpanel-rtl.css` override stylesheet (~860 lines, all rules scoped under `body.rtl`) is enqueued at priority 999 only when WordPress reports an RTL locale (Arabic, Hebrew, Persian, Urdu, …), so the entire BrikPanel UI flips direction cleanly — dashboard, products list, product editor, orders, coupons, segments, expenses, customer analytics, top bar, sidebar nav, login page, modals and toast notifications
* Improvement: BrikPanel settings page reorganized into a Shopify-style sub-navigation — the previously single long page is now split into focused sections (General, Navigation, Dashboard, Products, Orders, Coupons, Login page, Notifications, Developers) so admins land on one topic at a time. Each section's title + description + form-table block is wrapped into a single visual card; third-party fields injected via the public `brikpanel_settings_fields` filter are still respected
* Fix: Cmd/Ctrl + K order search no longer leaves a phantom empty WordPress Command Palette open behind the BrikPanel overlay. The keydown listener is now registered in the capture phase with `stopImmediatePropagation()` so WordPress core's `commands-command-menu` (which binds the same shortcut) never fires, and closing the BrikPanel search via Escape no longer reveals an empty WP search modal underneath
* Fix: The "X" close button on the bulk-update modal in the products page now closes the modal correctly — the click handler had only been bound to the bottom "Cancel" button, leaving the top-right close icon inert. Both controls are now wired to the same `closeBulkModal` handler

= 2.6.1 (2026-04-28) =
* New: Live store summary — BrikPanel now generates a continuously updated `brikpanel-store-summary.md` file that captures every metric the panel collects (sales, orders, AOV, conversion rate, top products, top countries, customer LTV / RFM / cohort highlights, inventory health and more) in a compact, human-readable format. Designed for two flows: paste it into any AI chat for instant store interpretation, or hand it to a data analyst, accountant or investor as a one-page snapshot of the whole shop
* New: Cache plugin integration on the BrikPanel top admin bar — when WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache, WP Fastest Cache, Cache Enabler, Hummingbird, Comet Cache, Breeze, Autoptimize, SG Optimizer, Swift Performance or Nginx Helper is active, a "Clear cache" button appears in the top bar and purges the detected provider in one click
* New: Quick edit "Downloadable" toggle for virtual / digital products in the product list — when a product is digital, the slide-in quick edit now exposes the downloadable switch so digital products can be flipped without opening the full product editor (works for both simple and variable products)
* New: Gutenberg compatibility — the simplified product editor and the BrikPanel order screens now coexist cleanly with the block editor, including stores that have Gutenberg forced on for `product` post type
* Improvement: Digital product settings (Virtual / Downloadable / Files / Download limits) are now positioned above the description and short description fields in the product editor — the most relevant toggles for digital sellers are visible without scrolling
* Fix: "Top Countries by Orders" and "Top Countries by Customers" dashboard cards now show accurate values — the previous query joined the wrong address table on HPOS stores and double-counted shipping/billing entries on legacy stores. Both code paths have been rewritten and the totals now match `wc_get_orders` and the customer table exactly
* Fix: "Visitors by Device" dashboard widget data source corrected — device classification is now derived from the stored User-Agent on the `wp_brikpanel_visitors` table (not from a stale transient), so desktop / mobile / tablet shares match the visitor log row-for-row

= 2.5.3 (2026-04-25) =
* New: Full SEO plugin compatibility — Yoast SEO, Rank Math, All in One SEO and SEOPress metaboxes (including the SEO score panel) now render and save inside the BrikPanel product editor, with all of their features available from the simplified screen
* New: Custom BrikPanel-styled top admin bar that replaces the default WordPress toolbar across the entire admin (not only the dashboard) with a larger, e-commerce-focused notification bell and quick links — enabled by default and toggleable from settings
* New: Sold downloadable products column on the order edit page — see how many times each download has been redeemed by the customer, like the legacy panel used to show
* New: BrikMarket marketplace analytics block on the dashboard — when BrikMarket is active, marketplace orders are excluded from the storefront conversion rate and a dedicated section shows orders per marketplace, share by marketplace, and top categories from marketplace orders
* New: Compatibility with major subscription / membership plugins — WooCommerce Subscriptions, Subscriptions for WooCommerce (WP Swings), MemberPress, Paid Memberships Pro, WooCommerce Memberships, YITH WooCommerce Subscription, SUMO Subscriptions, WebToffee Subscriptions for WooCommerce and Restrict Content Pro
* New: Advanced filtering and segmentation for customers and orders — combine spend range, product, location, date and more to build saved segments
* New: Customer analytics suite — Cohort retention, Customer Lifetime Value (LTV) and RFM segmentation, all calculated from your store data and visualized in the dashboard
* New: Developer hooks & filters system — `brikpanel_after_product_save` action, `brikpanel_product_editor_boxes` filter and many more, with a built-in developer documentation popup in settings (one-click copy buttons for every snippet)
* New: Brand field in the refactored product editor — the WooCommerce `product_brand` taxonomy is now first-class alongside categories and tags
* New: Admin and Site Enhancements (ASE) custom columns are now respected in the BrikPanel product, order and customer lists
* New: Per-user toggles for any third-party / SEO column in the products list — extra columns added by Yoast, Rank Math, ASE and other plugins can now be hidden from the existing "Columns" dropdown
* Improvement: Hardened performance for low-resource WooCommerce hosting — heavy queries are batched, cached and run through Action Scheduler so the dashboard, customer analytics and bulk editor stay responsive on shared hosting
* Improvement: All JavaScript and jQuery strings audited for translation — every customer-facing message in the JS layer now goes through `wp_localize_script` so translators no longer miss strings hidden in scripts
* Fix: Sidebar menu no longer flickers / disappears on upward scroll — the sticky positioning CSS that fought with the new top bar has been corrected
* Fix: Variation tab no longer loses unsaved state when navigating back — the editor now restores the in-progress variation form without needing to close and reopen the product
* Fix: PHP notice raised when the refactored product editor module was disabled in settings is now resolved
* Fix: "Top Marketplace Products" and "Top Categories from Marketplaces" cards now correctly render data for the selected date range (last 30 days and custom ranges)
* Fix: Removed the redundant "Storefront metrics shown below exclude marketplace orders…" helper notice now that marketplace data has its own dedicated section

= 2.2.1 (2026-04-24) =
* Improvement: "Force native login submission" is now enabled by default so custom authentication plugins (2FA, SSO, or captcha layers) keep working on a fresh install without extra configuration. Existing sites keep their current setting
* Fix: Newly created categories in the simplified product editor now reflect instantly in the checklist and parent dropdown with correct hierarchy, depth indentation, and alphabetical ordering — previously the new entry was appended flat at the end and missed the depth class, and the first category on a product with none at all was silently dropped

= 2.2.0 (2026-04-20) =
* Improvement: New "Force native login submission" toggle under WooCommerce → Settings → BrikPanel → Login Page for custom authentication plugins that aren't auto-detected, plus a `brikpanel_disable_ajax_login` filter hook for developers. When any of these conditions trigger, the AJAX login endpoint is no longer registered at all, reducing the attack surface

= 2.1.6 (2026-04-20) =
* New: "Private" status filter on the product list — quickly isolate products that are published privately alongside the existing All / Published / Draft / Trash tabs
* New: Hover popover for the Category column in the product list — the main category stays inline and a "+N" badge reveals every remaining category on hover, so products assigned to multiple categories no longer hide their taxonomy
* New: Visual / HTML toggle on both the short description and full description editors in the simplified product editor — paste raw HTML without losing formatting, switch back to the rich-text view at any time
* Improvement: ACF (Advanced Custom Fields) and other third-party metabox compatibility hardened — ACF field groups targeting the `product` post type now bootstrap, render, and save correctly on the BrikPanel product editor (file, image, gallery, repeater, true/false and text fields all tested). The `_acf_nonce` / `_acf_post_id` payload is emitted so save round-trips validate. Applies to both simple and variable products
* Improvement: "Additional fields" / third-party metabox card redesigned — inputs no longer overflow the right edge of the card, JavaScript-driven fields (ACF, custom pickers) receive their init payload, and text/number inputs are now fully editable across every registered metabox
* Improvement: Category list rows on the categories page are now more compact — reduced vertical padding and tighter line-height so more categories fit on screen without scrolling
* Improvement: Downloadable product file URLs are now editable in place — the file input accepts direct edits and the media library browse button replaces the existing file instead of requiring a delete-and-reupload cycle
* Improvement: Custom login page is now fully compatible with 2FA and SSO plugins — when Wordfence Login Security, Two Factor, WP 2FA, miniOrange, Solid Security, Duo, Rublon, or Google Authenticator is active, BrikPanel keeps its modern styling but hands the form submit to the native `wp-login.php` flow so multi-step authentication works exactly as the plugin author intended. Closes a silent 2FA bypass where AJAX login could skip a redirect-based challenge page

= 2.1.5 (2026-04-17) =
* New: Inline stock-status toggle in the product list — flip "In stock / Out of stock" directly from the row without opening a popup, for both simple and variable products
* New: "Columns" dropdown above the product list — hide the columns you don't need (SKU, Price, Stock, Category, Status, Image) and the preference is remembered per user
* New: WordPress widgets position setting for the dashboard — display the embedded WP widgets section above or below BrikPanel analytics (handy for shop managers who rely on widget shortcuts)
* New: `brikpanel_dashboard_section_order` filter hook — developers can reorder any dashboard section via a snippet
* New: `brikpanel_products_columns` filter hook — register custom columns in the product list
* Improvement: Login page AJAX falls back to the native WordPress submit flow when the AJAX endpoint is blocked (e.g. WP Hide / security plugins renaming `admin-ajax.php`), so users are no longer stuck on a generic "An error occurred" message
* Improvement: Login page toast notifications are now centered at the top of the screen for better visibility
* Improvement: Admin notice suppression now also runs on the BrikPanel settings tab — third-party marketing notices no longer leak onto the settings page
* Improvement: WooCommerce's generic "Your settings have been saved" banner is replaced with a branded BrikPanel confirmation on the settings tab
* Improvement: Variable-product stock-status changes now propagate to every variation and the WooCommerce meta lookup table, so flipping a variable product off actually makes it unavailable on the storefront

= 2.1.0 (2026-04-16) =
* New: Admin notice suppression — hides third-party plugin notices on BrikPanel pages for a cleaner, distraction-free admin experience (toggleable from settings)
* New: Product tags support in the simplified product editor with autocomplete suggestions
* New: Cost of Goods Sold (COGS) field support when enabled in WooCommerce settings
* Improvement: Enhanced SEO plugin compatibility — Yoast SEO, Rank Math, AIOSEO, and SEOPress metaboxes now load correctly on the BrikPanel product editor
* Improvement: Better admin body class handling for modern product edit and classic navigation modes

= 2.0.7 (2026-04-12) =
* Comprehensive settings have been added to the product editing page.

= 2.0.4 (2026-04-09) =
* Add Digital product support

= 2.0.1 (2026-04-08) =
* Bug fix: The "Live Visitors" section was scrolling to the right

= 2.0.0 (2026-04-08) =
* New: Modern WooCommerce dashboard rebuilt from scratch with real-time sales analytics, conversion funnel, order status donut, and 3D geographic globe
* New: WooCommerce live visitors widget with cart status and current page
* New: Cmd/Ctrl + K lightning-fast order search across ID, name, email, phone, and SKU
* New: Modern WooCommerce order management page with 30-day overview bar and inline status change
* New: WooCommerce product list plugin with AJAX pagination, live search, and one-click publish toggle
* New: Quick edit sidebar for inline product editing without leaving the list
* New: WooCommerce bulk editor with full variation support — bulk edit variation prices, bulk update variation stock, percentage and fixed-amount updates, by category or selected products
* New: WooCommerce variation price editor modal with attribute filtering
* New: Simplified WooCommerce product editor with drag-and-drop image upload, searchable category picker, live SEO preview, and auto-generated variations
* New: WooCommerce variation gallery — separate image gallery per variation
* New: WooCommerce categories page with drag-and-drop parent/child nesting
* New: Best-in-class free WooCommerce coupon manager with slide-over panel and one-click duplicate
* New: Custom WP login page (WordPress login customizer) with AJAX submission
* New: Sound notifications and confetti celebrations on new completed orders
* New: Welcome / onboarding modal for first-run experience
* New: WooCommerce sales by country and city with interactive 3D globe
* New: WooCommerce conversion tracking with full visitor → cart → checkout → order funnel
* New: Two custom order statuses — Return Draft and Change
* New: Optional simplified admin mode that hides the full WordPress menu for non-technical clients
* Improvement: Full HPOS (High-Performance Order Storage) compatibility with dual code paths on every order query
* Improvement: All AJAX endpoints hardened with nonce + capability checks
* Improvement: IP addresses now SHA-256 hashed before storage for privacy
* Improvement: Admin users excluded from all analytics to keep numbers clean
* Improvement: Tested up to WordPress 6.9 and WooCommerce 9.x

= 1.5.0 (2026-03-01) =
* Improvement: Simplified licensing — all features now completely free

= 1.4.1 (2026-02-15) =
* Bug fix: Yesterday date range calculation corrected in dashboard widgets

= 1.3.5 (2026-01-20) =
* Bug fix: Order conversion rate calculation accuracy improved

= 1.3.4 (2026-01-10) =
* New feature: Added new dashboard widgets for enhanced store insights

= 1.3.3 (2025-12-15) =
* Bug fix: Order count display corrected for filtered views

= 1.3.2 (2025-12-01) =
* Bug fix: Resolved Slider Revolution CSS color conflict

= 1.2.9 (2025-11-15) =
* Bug fix: Resolved compatibility issues on stores without HPOS enabled

= 1.2.6 (2025-11-01) =
* Bug fix: Product category addition issue resolved

= 1.2.3 (2025-10-15) =
* Improvement: Full translation support added with .pot file

= 1.2.2 (2025-10-01) =
* Bug fix: Admin Menu Editor compatibility restored

= 1.2.0 (2025-09-15) =
* Improvement: WooCommerce 9.4 compatibility
* Improvement: Redesigned UI with enhanced navigation
* Bug fix: Various minor fixes
