Feature: added a public showcase_for_swell_log action that routes to the event logger, so companion add-ons can write to the Showcase for Swell event log without touching the Logger class directly. Registered unconditionally (independent of Swell store credentials).
1.4.1
Build: .distignore now excludes .git/ and .distignore itself from the WordPress.org SVN deploy. Previous releases shipped the full git history (~19 MB) inside the plugin ZIP; the trunk drops from ~22 MB to ~2.5 MB and end-user installs no longer contain a .git/ directory.
1.4.0
Feature: storefront prices now render in the store’s configured currency instead of being hardcoded to USD. Product cards, product detail pages, product search results, and the cart sidebar all read the currency resolved from Swell’s /settings endpoint and format with Intl.NumberFormat / NumberFormatter. Currency is captured on connection test, refreshed on every product sync, and a “Refresh from Swell” button on the Settings page lets you re-resolve on demand.
Fix: single product pages no longer return 404 after the first product sync. The activation flush was issued before the swell_product CPT and swell_category taxonomy registered on init, so the stored rewrite rules excluded their routes. Activation now queues a deferred flush that runs after both register themselves, and every successful sync that creates new products re-queues the flush so existing installs self-heal on upgrade.
1.3.1
Branding: added a plugin icon and header banner for the WordPress.org plugin directory listing. No functional changes.
1.3.0
Security: every server-rendered block (category-grid, category-nav, product-card, product-detail, product-grid, product-search, cart-icon, cart-sidebar, sample-product) now passes its renderer output through wp_kses() at the echo site instead of relying on suppression comments. Addresses the WordPress.org review request to escape every echoed variable.
Security: JSON-LD output now uses wp_print_inline_script_tag() and wp_json_encode() without JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE — backslash and unicode escaping stay on, and the <script> wrapper is built by core.
Compliance: replaced the generic swell / swp_ / Swell_WP / SWELL_WP_ / swell-wp/* prefix family across the entire plugin with showcase_for_swell_* / Showcase_For_Swell* / SHOWCASE_FOR_SWELL_* / showcase-for-swell/*. Plugin namespace, constants, action/filter hooks, option/transient names, REST namespace, block namespace, asset handles, and CSS class prefixes are all unique enough to avoid collisions with other Swell-related plugins (per WordPress.org review feedback).
Refactor: the admin-bar health indicator CSS now ships as a real stylesheet (assets/css/admin-bar-status.css) enqueued via wp_enqueue_style(), replacing the previous wp_add_inline_style() call.
1.2.3
Security: cart-fallback REST endpoint no longer returns a preserved owner token to a caller that cannot prove ownership of an existing cart_id. The CREATE route now requires the matching X-Swell-Cart-Owner header on overwrite (per WordPress.org plugin review feedback).
Docs: each block renderer class declares an explicit output-escaping contract in its docblock so the escape guarantee at every register_block_type() render callback is verifiable from the source.
1.2.2
Polish: replaced remaining “Swell WP” labels in the admin menu, setup wizard, settings heading, and console error prefixes with “Showcase for Swell” so no legacy brand surface is shipped to the WordPress.org plugin directory.
1.2.1
Build: WordPress.org plugin directory submission build of the 1.2.0 changeset (no functional changes vs. 1.2.0).
1.2.0
Rename: plugin renamed from “Swell Storefront” to “Showcase for Swell” (slug showcase-for-swell) per WordPress.org plugin directory feedback.
Remove: dropped the 25-product sync cap. The plugin now syncs the entire Swell catalog regardless of catalog size.
Remove: dropped all upgrade prompts, tier-status messaging, and license-related copy from the admin dashboard and setup wizard.
1.1.0
Fix: activation product sync occasionally undercounted on first run due to a race between the wizard sync and the reconciliation cron deleting each other’s freshly synced posts.