Changelog
All notable user-facing changes to SyteHero are documented here. Uses Keep a Changelog format with Added / Changed / Fixed / Removed buckets.
v1.0.115 — 2026-06-30
Fixed
- Email reports: Sources and Attribution reports never trigger per-order ("real-time") emails — real-time alerts stay Sales Summary only — even if a real-time toggle was left enabled before switching the report type.
- Attribution report email: the "Top channels" section heading always names the selected attribution model.
Changed
- Internal hardening and cleanup of the email-report system; no change to existing report output.
v1.0.114 — 2026-06-28
Added
- Attribution email reports: create a scheduled (daily/weekly/monthly) email of your multi-model attribution data — credited revenue per model, a top-channels breakdown for a chosen primary model, and a native-vs-platform comparison. Add one under Email Reports and pick the "Attribution" report type.
- Create email report buttons: the Attribution and Sources dashboards now link straight to the report editor.
Changed
- The report editor section is now titled "Email Reports" (it creates sales, sources, and attribution reports — not just sales summaries).
v1.0.113 — 2026-06-28
Fixed
- Critical: sites running SyteHero without WooCommerce or FluentCart active no longer crash with a fatal error on every page load. The Native Attribution journey recorder required a store connection that those sites don't have; it now stays dormant until a supported store is present.
v1.0.112 — 2026-06-27
Fixed
- Native Attribution: visits with no UTM tags now resolve to their real source (e.g. Google, Facebook, or the referring site) instead of being grouped under a single "Referral" bucket.
- Native Attribution: internal page-to-page navigation no longer creates phantom "self-referral" touches that diluted multi-touch credit.
Added
- Native Attribution: a "Recent attributed orders" table showing each order's entry source, referrer and landing page, the credited amount under the selected model, and whether an affiliate coupon arrived via a referral link or was entered manually.
Changed
- Existing orders are re-scored once after updating so the attribution totals reflect the corrected sources.
v1.0.111 — 2026-06-26
Fixed
- Native Attribution on updated sites: the daily data-retention cleanup and the attribution settings now self-heal automatically on sites that updated into Native Attribution (rather than installing it fresh). Previously these were only set up during a fresh activation, so a site that received the feature via a plugin update would never schedule the retention cleanup or store its settings. Tracking still worked, but old visit data was never trimmed. No action needed — affected sites repair themselves on the next page load after updating.
v1.0.110 — 2026-06-26
Fixed
- Affiliate vendors editor: the table now uses the full width, and the Commission type/amount fields sit side by side with proper spacing (they were getting squeezed onto separate lines).
- Native Attribution settings: the section now uses the same clean collapsible styling as the other settings groups (removed a stray expander arrow and misaligned heading).
v1.0.109 — 2026-06-26
Fixed
- Critical: Fixed a fatal error on plugin load introduced in 1.0.108 — one new class file was named slightly differently from what the autoloader expected, so the plugin could not boot. Renamed the file to match, and added an automated check that verifies every class file is named correctly so this cannot recur.
v1.0.108 — 2026-06-26
Added
- Attribution dashboard: A new Attribution tab shows credited revenue by channel and source, with a model selector to switch instantly between first-touch, last-touch, linear, position-based, and time-decay — all from data already captured at checkout, over a 7/30/90-day window.
- Affiliate vendor crediting: Map a coupon code to an affiliate vendor on the Attribution tab. When that coupon is redeemed, the order's closing touch is credited to the vendor under the Last-touch and Position-based models, so partner-driven sales show up against the partner. Works with both WooCommerce and FluentCart; on WooCommerce you can also set the vendor on the coupon edit screen.
- Attribution settings: Enable or disable attribution tracking and set how long anonymous source touches are kept, under Settings → Native Attribution.
- SyteHero vs platform comparison: The Attribution tab compares SyteHero's attribution with WooCommerce/FluentCart's own, by channel group, plus a per-vendor revenue breakdown (revenue, orders, average order value).
- Affiliate link auto-apply: Optionally have a
?ref=COUPONlink apply that coupon to the WooCommerce cart automatically (per coupon, or a global default — off by default). - Attribution in the report email: The Sources Analytics report email can include an optional Attribution Models section showing per-model credited revenue.
- Affiliate commissions: Set a percentage or flat commission per affiliate coupon. SyteHero accrues what each vendor is owed as their coupons are redeemed, and the Attribution tab shows a per-vendor payout view (accrued / paid / owed) with a Mark paid button. Works with both WooCommerce and FluentCart.
Fixed
- Builder auto-mode rendering: Fixed a crash that could occur when a page builder (Elementor, Avada, Divi, or Gutenberg) rendered a SyteHero hero in responsive "auto" mode without a theme override.
v1.0.107 — 2026-06-26
Added
- Multi-model attribution scoring: SyteHero now credits every order under five attribution models — first-touch, last-touch, linear, position-based (40 % first / 40 % last / 20 % middle), and time-decay (recent touches weighted heavier with a 7-day half-life). All five are calculated at checkout so you can compare models instantly without reprocessing orders.
v1.0.106 — 2026-06-25
Added
- Multi-touch order attribution (native): SyteHero now records each visitor's full journey across sessions and devices and saves a durable attribution snapshot on every WooCommerce and FluentCart order, so your sales reports can credit the whole path to purchase — not just the last click. Journeys that belong to an order are kept regardless of the data-retention window.
Fixed
- FluentCart order data: FluentCart orders now read the correct fields from FluentCart's tables — the buyer's account, email, and name; the order total; the purchased line items; and the shipping address. Previously these came back empty or zero because they were read from the wrong place, which left FluentCart attribution stitching, order notifications, and sales totals incomplete. WooCommerce was unaffected.
- FluentCart variable products & sales: Fixed FluentCart variable-product detection, variation lookups, variation search, and the price-range refresh after a scheduled sale starts or ends — these relied on FluentCart product columns that have since been renamed, so they silently did nothing. WooCommerce was unaffected.
- FluentCart order events: Hero-slide revenue tracking, real-time order emails, and native attribution now trigger correctly when a FluentCart order is paid. FluentCart hands these events different data than WooCommerce, which SyteHero wasn't unpacking, so they previously didn't fire for FluentCart orders. WooCommerce was unaffected.
- FluentCart media & price reads: FluentCart product images are now correctly recognized as in-use (preventing accidental cleanup), and FluentCart product prices resolve in AI Studio — both previously read a renamed FluentCart column.
- FluentCart banner injection: Hero banners now display on FluentCart product-listing pages. They previously hooked a FluentCart action that doesn't exist, so they never appeared on FluentCart stores.
v1.0.105 — 2026-06-25
Added
- Native visitor analytics (first-party, privacy-conscious) — foundation. SyteHero now records anonymous, first-party visit signals (referrer and campaign tags) with its own same-origin tracker, which is resilient to the ad blockers and page caching that often block the platforms' built-in attribution. No IP addresses are stored, a random visitor token (not personal data) is used, capture honors the WP Consent API, and it can be disabled with a filter. This is the groundwork for upcoming multi-touch attribution and channel comparison — nothing new appears in reports yet.
v1.0.104 — 2026-06-25
Fixed
- More accurate referrer attribution for unusual hostnames. Web referrers whose domain begins with a TLD-like label (for example a site at
io.example.com) are no longer mistaken for a mobile-app referrer and labeled "Mobile App" — they now resolve to the real site. In-app referrals (e.g. the Facebook or Instagram app) continue to resolve to the app name.
v1.0.103 — 2026-06-25
Changed
- Clearer acquisition channels in the Sources dashboard and report. Channels now follow Google Analytics' standard grouping shown as "Channel · Source" — e.g. Organic Search · Google, Paid Search · Google, Organic Social · Facebook, Email · Klaviyo, Referral · somesite.com — replacing the ambiguous "Google" vs "Google (Organic)" and the cryptic "(Referral)" labels. Paid vs. organic is now split correctly by reading the campaign medium.
v1.0.102 — 2026-06-25
Added
- Sources Analytics report email — get your Sources dashboard delivered on a schedule. Each Sales Summary report can now be set to a new "Sources Analytics" type that emails your acquisition-channel and SyteHero-influence breakdown (with previous-period deltas) on a daily, weekly, or monthly cadence. Choose a 7-, 30-, or 90-day period and turn individual sections on or off: KPIs, Acquisition channels, SyteHero influence split, and the Channel × Hero cross-tab. Reuses your existing recipients and schedule. Works with WooCommerce and FluentCart.
Fixed
- In-app referrals now show the app name instead of a raw package id. Orders that arrive from an Android or iOS in-app browser (e.g. the Facebook or Instagram app) previously showed a reverse-DNS package id like
com.facebook.katanaas the source. They now resolve to the real app name where known, or a clean "Mobile App" label otherwise — so Sources reports and the order attribution badge read correctly. - The "Open Sources Dashboard" button in the Sources Analytics email now opens the Sources tab instead of the default plugin tab.
- A near-flat period (a change that rounds to 0.0%) now shows a neutral indicator in the Sources email instead of a colored up/down arrow next to "0.0%".
v1.0.101 — 2026-06-24
Added
- Sources dashboard — see which acquisition channels and SyteHero heroes drive your sales. A new Sources tab (next to Analytics) breaks down paid orders by acquisition channel (Facebook, Google, Direct, Klaviyo, Referral, and more) and by SyteHero hero influence (Featured Hero Slider, Custom Heroes per slide). A Channel × Hero cross-tab shows what percentage of each channel's orders had a hero assist. Choose Last 7, 30, or 90 days with previous-period deltas. Works with WooCommerce and FluentCart.
v1.0.100 — 2026-06-24
Fixed
- Daily sales-summary digests now cover the current day, not the day before. A daily digest reports the current day's orders up to the send time — which acts as the day's cutoff — and is labeled with that day's date. Previously a digest sent in the evening showed the full previous calendar day. Orders placed after the cutoff are included in the next day's digest. The schedule settings now note this cutoff behavior under the daily Send Time.
- "Send Test Email" now previews the real daily digest. A daily test email now uses the same midnight-to-now window as a live digest (instead of a rolling 24 hours), so its contents match its date label and what you'll actually receive.
- Changing "Only completed orders" no longer skips a day of orders. Toggling that filter now advances the report's cutoff to the moment of the change, so the next digest resumes cleanly without dropping orders placed since the previous send.
v1.0.099 — 2026-06-17
Added
- Deploy tool:
--avada/--no-avadatoggle to reset Avada/Fusion caches after deploy (default on; no-op on non-Avada sites). — 2026-06-23
Changed
- Sales and report email footers now use title-case labels with extra spacing above the footer text and SyteHero logo. Footer references read in title case — e.g. "Sent By: Daily Sales Report · Instant Alert", with mode labels like "Daily Summary" and "Instant Alert" — the "Sent by:"/"Sent from" lines become "Sent By:"/"Sent From", and there's a little more breathing room above the footer text and the SyteHero logo plate.
v1.0.098 — 2026-06-17
Changed
- Sales emails now name their cadence and the report that sent them. Subject lines carry a tag —
[Daily],[Weekly],[Monthly]for scheduled summaries,[Instant]for the immediate new-sale alert, and[Digest]for the batched real-time digest — followed by the report's name (e.g.[Daily] Morning Sales — Sales Summary: Your Store (SyteHero)). Every sales email also gains a "Sent by:" line in the footer identifying the schedule, so you can tell which report produced a message even after the subject scrolls away.
v1.0.097 — 2026-06-16
Changed
- "Reset Email Crons" is now "Reset Email Notifications." Alongside rescheduling the email crons, the button now also clears any pending sale-alert backlog — and sets a cut-off so already-processed orders are never re-announced — so a one-time notification flood can be stopped in a single click. It reports how many pending queues were cleared.
Fixed
- "New Sale" emails now send once per order. Previously a sale could be emailed twice — once at purchase and again when the order was later marked completed — which also produced batches of stale alerts when a backlog of old orders was completed together. Each order is now announced exactly once, at the moment of sale, via a persistent per-order marker.
- SyteHero now loads on sites without WooCommerce or FluentCart. When no ecommerce gateway is active the plugin no longer fatals during boot — non-commerce features keep working and the sales tools stay dormant until a supported store is present.
- Cleared a WordPress 6.7+ "translation loading triggered too early" notice. Admin menu titles are now translated when WordPress is ready instead of during plugin load, so the notice no longer appears in debug logs.
v1.0.096 — 2026-06-01
Fixed
- Email prices now display with your store's currency precision. Sale prices and order/line-item totals that ended in a zero — for example a $37.50 price — were sometimes shown without the trailing zero (
$37.5). Email prices now consistently follow your store's configured decimal places (two for USD/EUR, none for zero-decimal currencies like JPY) across the sale schedule report email and the sales-summary / new-order emails.
v1.0.095 — 2026-06-01
Added
- Custom banner shortcode endings. Non-primary banners can now use a custom shortcode ending (e.g.
[sytehero_banner_free_shipping]) instead of the auto-generated one. Set it in the banner's Shortcode box; leave it blank to keep the default. Endings must be unique — saving a duplicate is blocked — and changing an ending breaks any pages already using the old shortcode.
Fixed
- Copying a banner's shortcode now includes the surrounding
[ ]brackets. On the Banners screen the shortcode is now shown — and copied — as[sytehero_product_page_banners]instead of the bare tag, so you can paste it straight into a page or builder and have it work. The hidden (deleted-banner) shortcodes are displayed with brackets too.
v1.0.094 — 2026-05-31
Changed
- Brand logo updates now apply automatically. The plugin records a fingerprint of each bundled logo image and re-imports it into the media library when that image changes in an update — so the dark-mode logo fix (and any future logo refresh) shows up on the next admin load without manually clicking Refresh Brand Media Library. The button remains for forcing a full rebuild.
v1.0.093 — 2026-05-31
Fixed
- SyteHero icon in email logos no longer washes out on the dark plate. The mark's two faded side cards used transparency tuned for light backgrounds, so on the dark email plate they collapsed to a near-black smudge while the center card and wordmark stayed crisp. The on-dark logo now uses solid side cards, so the full mark reads clearly. After updating, open SyteHero → Settings and click Refresh Brand Media Library once so the new logo replaces the cached copy.
v1.0.092 — 2026-05-30
Fixed
- Email SyteHero logo no longer washes out in dark mode — including Gmail. The footer logo on transactional and report emails now sits on a dark backing plate (the same treatment as the logo in the email header), using the white version of the lockup. Because it doesn't depend on dark-mode CSS — which Gmail ignores — the logo stays crisp in every major email client and theme instead of fading into a near-black silhouette.
v1.0.091 — 2026-05-28
Changed
- Full brand overhaul. Adopted the new SyteWide brand system end-to-end: the SyteHero slider mark (terra-cotta
#D85A50) and SyteWide span mark (navy#1E3A8A) replace the legacy indigo logos across every admin page, email footer, WP admin sidebar menu icon, and the public docs site (logo, favicon, social card, primary color scale). Plugin admin color tokens migrate from indigo to terra-cotta; all stale hex fallbacks were swept so everyvar(--sytehero-color-primary, …)declaration resolves to a brand color even when CSS variables fail to load. - Brand assets now flow through the WordPress media library. Bundled brand logos are side-loaded once on activation (with
admin_initand manual "Refresh Brand Media Library" fallback paths) so admin pages, transactional emails, and shortcodes render them via attachment IDs — picking up srcset, lazy-load, and CDN integrations automatically. Default brand attachments are hidden from your media browser so they never clutter the Library. A new Settings button forces a re-import if logos ever go missing.
Added
- SyteWide attribution in the admin footer. SyteHero plugin pages now show "SyteHero is built and maintained by SyteWide" with the current plugin version in the WP admin footer.
v1.0.089 — 2026-05-21
Fixed
- Term deletion no longer crashes with SyteHero active.
Syte_Hero::prevent_featured_tag_deletion()was registered against thepre_delete_termaction with the wrong arity, causing a PHP 8ArgumentCountErrorwhenever WordPress fired the hook (admin term-delete, REST, andwp term deletefrom WP-CLI). Operators had to work around it with--skip-plugins=sytehero. The callback now uses the action's canonical($term, $taxonomy)signature. - The SyteHero featured tag is now actually undeletable. Returning a
WP_Errorfrom an action did nothing — WordPress discards action return values — so the previous guard was a placebo. Deletion of the featured tag now halts viawp_die()from every entry point (admin, REST, WP-CLI, directwp_delete_term()), with a clear protected-tag message.
Changed
- Admin tag list hides "Delete" on the SyteHero featured tag. New
tag_row_actionsfilter removes the row action so the protected tag never offers a delete link inwp-admin/edit-tags.php?taxonomy=product_tag. Thewp_die()guard remains as the deep safety net for non-UI paths.
v1.0.088 — 2026-04-22
Fixed
- Elementor “Copy styles from…” now updates the canvas immediately and persists across Elementor’s server re-render. The style picker writes
--sh-*custom properties on the active widget’s.sytehero-scaffold-wrapinside the preview iframe after each copy, using the samesh_*→--sh-*map as PHPStyleTokens. It also installs a short-livedMutationObserveron the widget element plusrequestAnimationFrame/ 150ms / 600ms / 1500ms timer re-applies, so when Elementor’s$e.run('document/elements/settings')command fires its asyncadmin-ajax.php?action=elementor_ajaxrender_widgetrequest and swaps the widget’s inner DOM, the copied vars are re-applied onto the new wrap. Previously the new wrap could land with default vars (stale model, cached response, or ahead-of-model ajax round-trip) and visually revert the author’s copy after ~200ms. The observer self-destructs once the last timer fires so consecutive copies never leak observers. - Scaffold CSS + editor live-preview script load on every Elementor preview boot.
elementor/preview/enqueue_stylesandelementor/preview/enqueue_scriptsnow callAssets::register()when needed and enqueuesytehero-widget-scaffoldplussytehero-editor-live-preview, fixing missing--sh-*consumers and slide media fill rules in the iframe. - Multi-slide editor previews stay filled when stylesheets are absent.
EditorPreviewRenderer::compose_live()emits a scoped inline<style id="sytehero-editor-live-inline">and mergesobject-fit:coverfill rules into each slide’s root<img>/<video>/<iframe>so the preview cannot letterbox even if asset loading regresses. - TA1 / TA2 / CTA no longer stay invisible in the Elementor editor preview.
sytehero-frontend.csshides the overlay elements withopacity:0; visibility:hiddenas FOUC protection, and relies onsytehero-frontend-overlay.js(gated by.sytehero-fhsbg) to reveal them inline with!important. The editor preview never emits.sytehero-fhsbg, so that reveal path never fired — even when the live-preview JS had already populated the overlay text from the active slide. A scoped reveal rule (.sytehero-elementor-editor-preview .sytehero-hero-text-area-1/2, .sytehero-hero-cta { opacity: 1; visibility: visible; }) is now shipped in bothsytehero-widget-scaffold.cssand the inline<style id="sytehero-editor-live-inline">block, and is included in bothcompose()(placeholder fallback) andcompose_live()(multi-slide live preview), so the overlay is visible whether or not the external stylesheet loaded.
Added
StyleTokens::get_var_map()— flat map published towindow.syteheroStylePicker.styleVarMapfor picker DOM sync.- Editor-only pulse animation —
.sytehero-editor-live-flashon TA / CTA after a successful copy (scoped to.sytehero-elementor-editor-preview).
Developer notes
- PHPUnit:
StyleTokensVarMapTest,EditorPreviewAssetsHookTest,EditorPreviewMediaSizingTest(now includes FOUC-override assertions for bothcompose()andcompose_live()paths); bootstrap:wp_register_script,wp_enqueue_script,wp_localize_scriptstubs for asset registration tests.
v1.0.087 — 2026-04-22
Added
- Elementor editor preview gains manual slide controls. Multi-slide heroes rendered inside the Elementor editor canvas now include prev / next arrow buttons (vertically centred on the preview edges) and a dot-indicator strip (bottom centred) so authors can step through slides on demand without waiting for the auto-advance timer. The controls are scoped strictly to the editor preview (
.sytehero-elementor-editor-preview) — nothing bleeds onto the published frontend. The outer preview wrap keepspointer-events: noneso the Elementor canvas stays fully interactive everywhere except the control buttons themselves, which opt back in via apointer-events: autoisland. Every button carries accessiblearia-labeltext (Previous slide,Next slide,Go to slide N) and keyboard focus rings; clicking a control resets the auto-advance timer so the next automatic tick starts fresh from the newly-active slide's configured interval. sytehero_elementor_editor_preview_manual_controlsfilter. Integrators who prefer the pre-v1.0.087 auto-advance-only experience can returnfalsefrom this filter to hide the arrows and dot indicators. The filter receives the current slide count as its second argument so decisions can vary per-preview. Default istrue(controls enabled).EditorPreviewRenderer::build_manual_controls_markup( int $slide_count ). New public helper for composing the controls island in isolation — returns''for single-slide previews and whenever the filter opts out, which keeps every branch of the emission logic unit-testable without having to stand up a fullcompose_live()payload.
Changed
- Blocksy palette bridge is now gated behind Blocksy-theme detection.
StyleMapper::theme_palette_additions()previously fired whenever acolorPalettetheme mod was present, regardless of which theme was active. BecausecolorPaletteis a generic enough mod key that another theme could coincidentally use it, this risked synthesisingblocksy_palette_Nmap entries that pointed at an unrelated theme's palette. The bridge now only runs whenwp_get_theme()->get_template()resolves toblocksy(which covers Blocksy parent theme + every Blocksy child theme — child themes inherit their parent's template slug) or whenBLOCKSY_PATHis defined. Vanilla-Elementor installs and installs running non-Blocksy themes with a straycolorPalettemod now see a clean kit-only fallback map, exactly as they should. Thesytehero_elementor_global_color_mapfilter still runs last and remains the authoritative override for custom theme integrations. - Editor live-preview cycler refactored around a Map-keyed stage state. The slide-cycler in
sytehero-editor-live-preview.jsmoved itscurrentindex / pending timer / slides list out of closure locals and into aMap<stage, StageState>so manual prev/next/dot click handlers can drive the same advance machinery the auto-timer uses. Behaviour for auto-advance is preserved exactly; manual advances wrap in both directions (prev on slide 0 → last slide, next on last → 0) and clear the pending auto-timer before scheduling the next tick, so authors never see a lurch from a stale pending advance firing right after they click.
Fixed
- Vanilla-Elementor installs no longer emit stray Blocksy palette IDs in the editor preview. See above — the Blocksy detection gate fixes a theoretical issue where a non-Blocksy theme persisting anything under the generic
colorPalettemod key would have caused the hero widget'sblocksy_palette_Nreferences to resolve to that unrelated theme's colour, painting the wrong hex in the editor iframe. On real-world installs the practical impact was minimal (most non-Blocksy themes don't usecolorPaletteas a mod key), but the regression tests now lock this contract so the bridge stays opt-in to Blocksy forever.
Developer notes
- New regression tests (
StyleMapperGlobalColorFallbackTest). Three new cases cover (a) vanilla-Elementor on a non-Blocksy theme with nocolorPalettemod → kit-only map and noblocksy_palette_*leakage, (b) non-Blocksy theme with a straycolorPalettemod → bridge skipped and nakedvar()emitted forblocksy_palette_NIDs, and (c) Blocksy child theme (get_template()=blocksy,get_stylesheet()=blocksy-child) → bridge fires normally. The existing Blocksy-bridge tests were updated to explicitly activate the Blocksy theme stub so they continue to pass. - New test suite (
EditorPreviewManualControlsTest, 14 tests / 33 assertions). Covers every branch ofbuild_manual_controls_markup()(single-slide returns empty, multi-slide emits the island, filter can disable, filter receives slide count, dot count matches slide count, first dot marked active, per-slidearia-labelanddata-sh-slide-index, all buttons usetype="button"to avoid Elementor form-submit conflicts) plus three end-to-end assertions throughcompose_live()(integration emits controls for multi-slide, omits for single-slide, honours filter opt-out). Full plugin suite green: 1,479 tests / 4,394 assertions.
v1.0.086 — 2026-04-22
Fixed
- Elementor editor preview now shows CTA / Text Area 1 / Text Area 2 in their correct colours. When the hero is edited inside the Elementor panel, the editor iframe does not always load the active theme's palette stylesheet (for example Blocksy's
global.css, which is what defines--e-global-color-blocksy_palette_*). Any colour the author picked via the Elementor global-colour selector therefore resolved to an undefined variable in the editor, dropping the CTA to its neutral scaffold fallback and producing an unstyled button with excess whitespace around it. Global-colour references now emitvar(--e-global-color-X, #hex)— the hex is resolved from two sources in priority order: Elementor's active Kit (for vanilla Elementor globals likeprimary/accent/text), then a Blocksy palette bridge that reads the theme modcolorPalettedirectly (because Blocksy stores its palette in Customizer theme mods, not in the Elementor Kit). The editor now paints the same colours the front end does, even when Blocksy's companion CSS is absent from the iframe.
Changed
- Global colour lookup is cached per request and mockable via filter. A new
sytehero_elementor_global_color_mapfilter lets integrations (and unit tests) extend or override the resolved ID → hex map without loading Elementor, and the map itself is resolved once per request. Filter precedence is: Elementor Kit → theme-palette bridge → filter (runs last and has the final say).
v1.0.085 — 2026-04-22
- Elementor: “Copy styles from…” uses
$e.run('document/elements/settings'); editor preview matches live per-view height, glow data/CSS vars, anddata-sytehero-ready; live-preview JS applies per-slide glow like the front end. - CTA: Scaffold defaults are a readable pill (
#fff/rgba(0,0,0,0.65)padding/radius) until Style-tab tokens override.
v1.0.084 — 2026-04-22
Fixed
- Border styles now copy correctly from Elementor Button widgets. The style picker's border source-key lookup covered only one of the two key patterns Elementor uses across versions (
border_bordervsbutton_border_border). Both patterns are now tried in order, so border style, border width, and border colour copy regardless of Elementor version. - CTA visibility animation preserves Elementor button layout. When the runtime overlay cycler shows or hides the CTA button, it now sets
display: inline-flex(matching Elementor's button flex model) instead ofinline-block, so theelementor-button-content-wrapperflex centering works correctly on Elementor Pro and custom Elementor-based themes.
Changed
- CTA
paddingandborder-radiusnow explicitly default to0. The CSS fallback values were removed in v1.0.083 with the intent of lettingelementor-size-smclass defaults cascade through, but that cascade does not occur due to specificity and source-order rules. The explicit0fallback is restored with a CSS comment explaining the behaviour, so authors know to set these via the Style tab or "Copy styles from…" rather than expecting class-based defaults.
v1.0.083 — 2026-04-22
Changed
- CTA button now renders with full Elementor button markup. The hero CTA element carries the same class set and inner HTML structure as a native Elementor Button widget (
elementor-button-link,elementor-size-sm,elementor-button-content-wrapper) in all render paths (editor preview, live preview, and published scaffold). This enables Elementor theme and kit button styles to apply by default, allows "Copy styles from…" to correctly transfer all button properties (including padding and border-radius) from any Elementor Button widget on the page, and ensures the CTA's appearance matches the rest of the author's site button style.
v1.0.082 — 2026-04-22
Fixed
- Hero is now truly full-bleed in the Elementor editor canvas. The section-level padding removal rule used
:only-child, which always fails in the editor because Elementor injects overlay and shape elements as sibling children of the container. The selector is replaced with a:not(:has(…))guard that ignores Elementor's own UI elements, so the container padding is correctly zeroed out in both the editor and on the published page.
v1.0.081 — 2026-04-22
Fixed
- No more whitespace below the hero in the Elementor editor canvas. Elementor's
.elementor-widget-containercarries a default padding that appeared as a blank gap beneath the live preview. The widget container's padding is now zeroed out so the hero preview renders flush to its edges. - "Copy styles from…" now activates the Publish button. After a style copy the Elementor Publish / Update button stays grayed out because the saver's change-flag was never signalled. It now activates immediately after any copy.
- CTA background colour now copies correctly from an Elementor Button widget. Elementor's native Button widget stores its background colour via
Group_Control_Backgroundunder the keybutton_background_color. The picker map was readingbackground_color(wrong key), so the background was silently skipped. The key is corrected; all other button properties (border radius, text colour, hover states, etc.) were already copying correctly.
v1.0.080 — 2026-04-21
Added
- Live all-slide preview in the Elementor editor. The editor canvas now cycles through every slide in the hero using the per-slide interval set in the Heroes tab. Text Area 1, Text Area 2, and CTA text fade in and out per slide. Videos (YouTube, Vimeo, Gumlet, direct mp4/webm) play inline. All three device-mode previews (desktop, tablet, mobile) each get their own independent cycling preview when Auto view mode is selected. The canvas stays fully scrollable — no FlexSlider, Swiper, or Splide in the editor.
Fixed
- "Copy styles from…" picker now applies styles immediately. Styles copied from another Text Area, CTA section, or a third-party widget now update the canvas preview at once and persist to the published page on save. The previous implementation used a code path that did not fire the change events Elementor needs to update the preview, so nothing appeared to change. Native panel controls were not affected.
v1.0.079 — 2026-04-21
Added
- CTA Button style section now renders a real button. Before v1.0.079 the SyteHero Hero Slider's CTA section inherited the same text-oriented controls as Text Area 1 / Text Area 2 — great for styling a heading, wrong for styling a button. v1.0.079 gives CTA its own button-parity control set: text colour + hover, background colour + hover, border (style / width / colour / radius), box-shadow, plus the typography and padding controls you already had. The hover controls drive a matching CSS
:hover/:focus-visiblestate on the rendered.sytehero-hero-ctaanchor. Available in every builder integration: Elementor (dedicated controls), Gutenberg (Inspector Panel was resynced to the new attribute surface), and Avada Fusion / Divi (the divergent schema flows through their existing control_args pipelines — shadows land as textareas, borders as dimension controls). - "Copy styles from…" picker now filters by section (Elementor). Text Area 1 and Text Area 2 dropdowns list only text widgets (Heading, Text Editor, Icon Box, Call-to-Action). The CTA Button dropdown lists only button widgets. Copying from an Elementor Button widget into CTA populates colour, hover colour, background, hover background, border (style / width / colour / radius), padding, typography, text-shadow, and box-shadow in one click.
Changed
- Third-party widgets need a registered category to appear in the picker. v1.0.078's "list every widget on the page" behaviour is replaced by a curated allowlist. Third-party widgets can join either dropdown by registering a map entry via the existing
sytehero_elementor_style_picker_mapfilter — each entry now declares'category' => 'text' | 'button' | 'both'. Seedocs/developer/integrations/elementor-widgets.md.
Removed
- Text-only controls on the CTA Button style section.
text-decoration,text-decoration colour / style / thickness,text-underline-offset,text-stroke,text-indent,white-space, andfont-variantare gone from the CTA panel. Saved values for those controls on existing widgets stop applying — the feature shipped in v1.0.077 and the blast radius is small. Text Area 1 / Text Area 2 are unchanged.
v1.0.078 — 2026-04-21
Fixed
- Elementor "Copy styles from…" picker now lists every widget on the page. v1.0.077 only surfaced Heading / Text Editor / Button / Icon Box / Call-to-Action source widgets, and on some Elementor versions the "Other widgets on this page" group came up empty even when those widget types were present. v1.0.078 switches the picker to enumerate widgets via the Elementor preview iframe's DOM (the
data-id+data-widget_typeattributes Elementor exposes on every rendered widget) — stable across Elementor versions — and drops the mapped-types filter. Every widget on the page now appears in the dropdown; copying from an unmapped widget (third-party Advanced Headings, theme widgets, etc.) uses a generic fallback that picks up standard colour / typography / text-shadow / padding fields. Properties the source widget doesn't expose remain unchanged on the target, same as before.
v1.0.077 — 2026-04-21
Added
- Copy styles from another widget (Elementor). Each of the three Style sections on the SyteHero Hero Slider widget (Text Area 1, Text Area 2, CTA Button) now has a Copy from… dropdown at the top. Pick any Heading, Text Editor, Button, Icon Box, or Call-to-Action widget on the current page and that widget's colour, typography, alignment, padding, and text-shadow flow into the SyteHero section in one click. You can also copy between SyteHero's own sections (e.g. TA1 → TA2 → CTA) in the same dropdown. Every copy is one undoable action (Ctrl/Cmd+Z). Properties the source widget doesn't expose are left unchanged on the target. Works entirely in the Elementor editor — no frontend bundle impact.
v1.0.076 — 2026-04-21
Changed
- Auto is now the default View variant — "Default" is gone. The v1.0.075 release added an "Auto" option to the hero widget's View variant control alongside the legacy "Default". Feedback was unanimous: the two options were confusing, and Auto is what almost everyone wants — a widget that adapts to the viewport automatically. v1.0.076 removes "Default" from the control and makes Auto the default selection for new widgets. Existing widgets that had "Default" saved are silently upgraded to Auto on the next page load, so no re-save or migration is required. If you prefer a single forced view, Desktop / Tablet / Mobile are still available exactly as before.
Removed
- "Default (as configured)" option in all four builder integrations. Replaced by Auto. See Changed above.
v1.0.075 — 2026-04-20
Added
- Auto View mode for hero widgets. New "Auto" option in the View variant control on every builder (Elementor, Gutenberg, Divi, Avada). When selected, the hero renders the Desktop, Tablet, and Mobile views and shows the correct one at each viewport size — automatically. In Elementor, the editor's device-mode toggle (Desktop / Tablet / Mobile preview buttons) also drives the switch, so you see exactly what visitors will see while you design. Uses Elementor's configured breakpoints when active; on other builders, falls back to 1199 / 767 px (matches the plugin's own frontend CSS breakpoints). Existing widgets set to Default / Desktop / Tablet / Mobile are unchanged.
Internal
- New
BreakpointProviderInterfacesubsystem. Third-party builders (Bricks, Beaver Builder, etc.) can now register their own breakpoint providers via thesytehero_breakpoint_providersfilter without touching plugin core. Seedocs/developer/architecture/auto-breakpoint-mode.md.
v1.0.074 — 2026-04-20
Fixed
- Hero image now fills the wrapper at all viewport widths. On Elementor, Divi, Gutenberg, and Avada, the hero background image previously rendered at its natural aspect ratio rather than filling the container — leaving a white band below the hero on tablet and mobile viewports (and when the browser window was narrower than the source image width). The text overlays and CTA button, being centered in the full-height wrapper, would visually float in the middle of the empty white area. Root cause: FlexSlider's vendor stylesheet was loaded after
sytehero-frontend.cssand its equal-specificityheight: autorule won the cascade. Fixed by bumping the SyteHero image rule specificity so it reliably wins regardless of stylesheet load order.
v1.0.073 — 2026-04-20
Internal
FeaturedProductsPagedata assembly extracted. A newFeaturedProductsPageDataAssemblerclass (+ readonlyFeaturedProductsPageDataDTO) now owns all data preparation work previously inline inFeaturedProductsPage::render(). The render method is reduced from ~1 980 to ~1 640 lines; output is byte-for-byte identical, verified by the render-equivalence harness. No user-facing behavior changed.
v1.0.072 — 2026-04-20
Internal
- WP integration test harness added. A second PHPUnit suite (
phpunit.integration.xml.dist) now boots a real WordPress environment against a local MySQL database. Provides render-equivalence pinning forFeaturedProductsPage, guarding future admin-page decomposition work against silent HTML regressions. No user-facing behavior changed.
v1.0.071 — 2026-04-20
Internal
- AI AJAX handler refactored into concern-scoped classes. The single 1 400-line
AiImageAjaxHandlerclass has been split into six focused handlers (AiSettingsAjaxHandler,AiGenerationAjaxHandler,AiPromptAjaxHandler,AiEditingAjaxHandler,AiVideoAjaxHandler,AiPipelineAjaxHandler) plus a sharedAiImageAjaxSupportutility class and a thinAiImageAjaxControllerorchestrator. All 21wp_ajax_*action names and priorities are identical to before. No user-facing behavior changed.
v1.0.070 — 2026-04-20
Internal
- Modularization cleanup across the builder integration layer. Four near-identical whitespace-class sanitizers are now a single shared helper (
ClassTokenSanitizer); the repeated hero-render ceremony across the Elementor / Avada / Divi / Gutenberg widget render paths lives in a singleBuilderHeroRenderertrait that each builder opts into; the duplicatedresolve_view_glow_enabledlogic between the featured and custom hero shortcodes is now a singleSlideOverlayResolvercall; and the admin Featured Products page routes its slide-id collection through the already-canonicalSlideOrderingServicestatics. Unit coverage expanded by ~25 tests acrossClassTokenSanitizer,SlideOverlayResolver,SlideOrderingService, and the new trait. No public API, hook name, option key, AJAX action, or asset handle changed.
v1.0.069 — 2026-04-20
Removed
- Reactive breakpoint auto-swap has been removed. Earlier v1.0.061 introduced a JavaScript listener that tried to swap the hero's desktop/tablet/mobile layout class as the viewport changed. It didn't reliably match Elementor's live breakpoints and could freeze at the wrong view, so it's gone.
Fixed
- Hero view is now driven entirely by the element-level "View" dropdown (Default / Desktop / Tablet / Mobile) on each builder — Elementor, Avada/Fusion, Divi, and Gutenberg. The view you pick in the editor is the view the visitor sees, full stop. No runtime class swapping, no guesswork about whose breakpoint config is authoritative.
Release note: v1.0.069 ships bundled with the v1.0.068 typography expansion (entry immediately below) — the two releases were cut together rather than as separate tags.
v1.0.068 — 2026-04-20
Fixed
- Tablet & mobile Elementor hero no longer leaves a white gap below the image. The slide image was rendering at its natural aspect ratio because vendor FlexSlider's
.flexslider .slides img { height: auto }rule (specificity 0,2,1) was beating the SyteHero cover-fit rule (specificity 0,1,1). The image rule now uses.sytehero-fhsbg .slides imgto match vendor specificity, and our cascade-later position letsheight: 100%; object-fit: coverwin — the image fills the wrapper edge to edge on every breakpoint.
Added
- 16 new typography & box controls per Text Area 1 / 2 / CTA Button on every builder (Elementor, Divi, Avada/Fusion, Gutenberg). Authors can now configure font-family, font-style, font-variant, letter-spacing, text-indent, white-space, text-transform, text-decoration + decoration-colour / style / thickness / underline-offset, text-shadow, text-stroke, background-colour, and padding. All routed through the shared
StyleTokenspipeline →--sh-{el}-*CSS custom properties consumed by scaffold CSS, so behaviour is identical regardless of which builder you use. The existing five controls (colour, font-size, font-weight, line-height, alignment) are unchanged and back-compat. New tokens fall back toinheritso v1.0.067 sites with no per-element overrides keep their theme cascade exactly as before. - Keyword UI for Elementor letter-spacing / text-decoration-thickness / text-underline-offset. Each control is now a paired SELECT (
Inherit/normalorauto/Custom value) plus a SLIDER conditionally shown when "Custom value" is picked, so authors can pick the keyword fallback without typing. - Always-visible TA1 / TA2 / CTA placeholder in the Elementor editor canvas. When no source is selected (or the picked source doesn't yet resolve to slides), the editor now shows three styled placeholder elements ("Text Area 1", "Text Area 2", "Call to Action") so authors can immediately tweak typography without having to populate content first. Toggleable via the new
sytehero_elementor_editor_placeholder_enabledfilter (returnstrueby default).
Internal
- Cross-builder StyleMappers refactored to be schema-driven. Adding a new typography prop is now a one-line change in
StyleSchema::element_controls(); each builder's StyleMapper iterates the schema and emits its native controls. No more per-prop hand-coded blocks across four mappers. - Hardened token sanitization for inline-style emission.
font-familyrejects values with unbalanced quotes (preventingstyle="..."attribute escape),text-shadow/-webkit-text-strokereject unbalanced parens (preventing invalid CSS), and the two composite sanitizers were factored into a singlesanitize_css_compositehelper so the rules stay in lockstep. - CSS regression tests added for every new typography prop on every element (48 new assertions) plus a vendor-specificity guard for the cover-fit rule and unit tests for
EditorPreviewRenderer::placeholder_payload(), so future stylesheet refactors can't silently regress any of these fixes.
v1.0.067 — 2026-04-19
Fixed
- Elementor hero CTA now centers horizontally inside the overlay. A legacy
align-self: flex-startrule on.sytehero-hero-cta(written for the older theme-shortcode path where the CTA's parent was a flex row) was overriding the scaffold overlay'salign-items: centerand pushing the CTA to the left edge in Elementor placements. The scaffold overlay now neutralizes that legacy rule so the CTA inherits the overlay's centered alignment alongside Text Area 1 and Text Area 2. - Hero overlay text defaults to white in the Elementor / Gutenberg scaffold. Text Area 1 / 2 previously fell back to
inherit, which on most themes resolved to the page's dark body color and made them invisible against dark hero images until an author manually configured a color. The default is now#fff, so the hero is readable out-of-the-box; authors who set a color via builder controls keep their value. - 5px minimum spacing between Text Area 1, Text Area 2, and CTA is now enforced on all themes. Previously, configuring a margin of 0% (or leaving the per-element margin off) could collapse the elements together. The scaffold overlay's gap is floored at 5px, the per-element margin rules clamp to
max(5px, configured value), and a baseline 5px top margin applies to TA2 and CTA inside the hero wrapper on Avada, Divi, Elementor, and Gutenberg.
v1.0.066 — 2026-04-19
Fixed
- Hero slider no longer inherits a 4 px white border on all four sides. FlexSlider's bundled stylesheet (the library SyteHero uses under the hood for the default slider engine) applies a 4 px white border + 4 px rounded corners to
.flexslider— a classic "Polaroid frame" default intended for card-style image galleries, not full-bleed heroes. The border has been silently present on every SyteHero hero since forever but was invisible while earlier bugs kept the slider collapsed to 0 px in Elementor; once the v1.0.063 width fix let the slider render at real dimensions, the border became user-visible. The new reset zeroes the border, radius, box-shadow, and the white background on the hero-scoped.flexsliderelement only — leaving any FlexSlider use outside the hero (if any) untouched. Affects Avada / Divi / Elementor / plain-shortcode placements equally. - Simplified the v1.0.064–065 Elementor full-bleed rule. The
gap, widgetmargin, and.elementor-widget-containerpadding overrides that were piled on in v1.0.065 were defensive speculation against the wrong root cause (the border was FlexSlider, not Elementor container chrome). They are removed; the rule now only zeroes the.e-conpadding shorthand + its four logical longhands, which is all that is actually needed for the Elementor full-bleed case.
Internal
- FlexSlider reset regression test added so a future vendor-CSS refresh cannot silently restore the Polaroid frame.
v1.0.065 — 2026-04-19
Fixed
- Elementor full-bleed rule now actually zeroes every padding variant. The v1.0.064 rule only zeroed the
paddingshorthand, but Elementor emits padding viapadding-block-start/padding-block-end/padding-inline-start/padding-inline-endlogical longhands on some kit and version combinations — those longhands aren't reset by a physical shorthand in the same cascade, so a residual border persisted on affected sites. The full-bleed rule now zeroes the shorthand, all four logical longhands, the container gap, the widget's margin, and.elementor-widget-container's own padding, so no single layer can keep a residual gutter when the SyteHero Hero Slider is the sole widget in its section.
Internal
- CSS regression test expanded — two new assertions lock in the logical-longhand zeros + the widget-container reset so a future "simplification" of the rule can't silently re-introduce the border.
v1.0.064 — 2026-04-19
Fixed
- Elementor hero no longer shows a white border around it. When the SyteHero Hero Slider is the only widget in its Elementor section, the section's default 10 px padding is now zeroed so the hero runs edge-to-edge — which is what almost every hero placement wants. Sections that contain additional widgets alongside the hero keep their normal padding, and sections where the padding is set explicitly via Elementor's section controls still win on specificity.
- Editor preview now respects the SyteHero license state. On sites without an active license, the Elementor editor canvas falls back to the dashed placeholder instead of showing real overlay text and product images — matching the published-page behavior that renders empty when the license is locked.
Added
sytehero_elementor_editor_preview_enabledfilter — a kill-switch for the Elementor editor static-preview feature introduced in v1.0.063. Returnfalseto restore the pre-v1.0.063 dashed placeholder. Useful on very large product catalogues where the extra per-editor-open product query noticeably slows editor load, or for authors who simply preferred the older placeholder card.
Internal
- CSS regression test added so the v1.0.063 Elementor width-collapse fix cannot silently disappear in a future scaffold-CSS refactor. Exercises the three
--elementor-scoped rules plus the new sole-widget full-bleed selector. - Featured-slides repository accepts a read-only cache mode.
FeaturedSlidesRepository::get_slides_by_tag_slug()gained an optional third argument$skip_cache_write(defaultfalse). Whentrue(and$skip_cacheisfalse), the repository reads the frontend transient cache for speed but never writes to it — letting admin-context callers (the Elementor editor preview, chiefly) avoid seeding the public cache with a query that may legally include draft / pending products. Existing two-arg callers are unaffected.
v1.0.063 — 2026-04-19
Fixed
- Elementor hero no longer renders as a 0-width gray box on the published page. Elementor's outer widget element is
display: flex(defaultflex-direction: row), and inside our scaffold both the slider (.sytehero-fhsbg) and overlay are absolutely positioned, contributing zero intrinsic horizontal extent. Without an explicit width,.elementor-widget-containerwas collapsing to 0 px wide — the slide image (width: 100%) then rendered at 0×0, while the heights cascaded correctly from:has()rules and the inline sizer. Added three width rules scoped to the--elementorbuilder modifier so the chain inherits the column's available width. Other builder integrations (Avada, Divi, Gutenberg) are unaffected.
Added
- Static first-slide preview inside the Elementor editor canvas. Dropping or selecting the SyteHero Hero Slider widget in the Elementor editor now shows a non-interactive snapshot of what the published hero will display — first slide's image, overlay text, and CTA — instead of the previous "live preview disabled" placeholder card. The preview is wrapped in
pointer-events: noneand never instantiates the slider engine, so the editor canvas's scroll and Elementor's drag handles work normally. Style-tab controls (gap, alignment, color tokens) update the preview live. When no source is selected or no slides are configured, the existing dashed placeholder still appears.
v1.0.062 — 2026-04-19
Fixed
- Theme/framework auto-detection now recognizes Elementor when it's installed as a plugin, even on Avada- or Divi-themed sites. Previously, an Avada site with Elementor active would auto-detect as
Avada— so SyteHero's inline sizer would hunt for.fusion-column-wrapperancestors that never exist inside an Elementor page, and the hero wrapper wouldn't receive its sizing tokens. Fresh installs now default toElementoron those mixed setups. Existing sites can re-run detection from SyteHero → Settings → Detect (or override manually via the Theme dropdown).
Added
sytehero/is_elementor_plugin_activefilter — override SyteHero's Elementor plugin detection. Useful if you want to force a theme-based profile even when Elementor is active (e.g., an Avada site where Elementor is installed but only used on a handful of pages managed by the SyteHero Avada widget). Receives the bootstrap-derived boolean and must return a boolean.
v1.0.061 — 2026-04-19
Fixed
- Elementor builder canvas: hero no longer collapses to 0 px. The scaffold wrap/stage layers that wrap every builder widget's slider did not carry a min-height, so the absolutely-positioned
.sytehero-fhsbgslider had no sized containing block and disappeared inside the Elementor canvas. The scaffold now propagates the same min-height formula the outer-wrapper sizer uses, scoped with:has(.sytehero-fhsbg)so non-hero widgets still flow at their natural height. Same fix applies silently to Avada, Divi, and Gutenberg scaffolds.
Added
- Builder widgets detect the viewport's breakpoint automatically. Elementor, Avada Fusion, Divi, and Gutenberg SyteHero widgets now opt into reactive breakpoint detection — the wrapper's
sytehero-hero-featured--{desktop|tablet|mobile}class tracks the viewport viamatchMedia, so authors no longer need to hand-pick a view per breakpoint or render per-view variants. Elementor's own breakpoint config is honored when present (so changing tablet to 900 px in Site Settings → Layout flows through automatically). Plain[sytehero_featured]/[sytehero_custom]shortcodes placed outside a builder widget keep the existing fixed-view behavior. sytehero/breakpointsfilter — pin custom viewport thresholds site-wide without editing core. Receives( array $breakpoints, string $theme_key )and must return[ 'mobile_max' => int, 'tablet_max' => int ]. Defaults follow each theme's own conventions (Elementor 767/1024, Avada 640/1024, Divi 767/980, generic 767/1024).
Changed
- Heads-up for custom CSS authors. On pages rendered through a SyteHero builder widget (Elementor / Avada Fusion / Divi / Gutenberg), the hero wrapper's view class (
.sytehero-hero-featured--desktop|--tablet|--mobile) now tracks the visitor's viewport instead of staying pinned to whatever view the widget was configured for. If you have site CSS that assumes a stable--desktopclass on a placement, that rule will unselect on mobile/tablet viewports. To restore the old "always desktop" behavior on a specific placement, target by the widget-specific wrapper class instead (e.g.,.sytehero-scaffold-wrap--elementor, or a custom class you add via the widget's "Extra wrapper CSS class" field). Plain shortcode calls outside a builder widget are unaffected.
Internal
- Inline sizer script de-duplicated into
Syte\Hero\Frontend\SliderSizerScript— both[sytehero_featured]and[sytehero_custom]now emit byte-identical sizing JS, and the helper has dedicated unit-test coverage (11 tests). - Elementor live-config read hardened: the resolver now checks
window.elementorFrontend.config.responsive.activeBreakpoints(Elementor 3.4+),window.elementorFrontend.config.responsive.breakpoints(3.2–3.3), and the rawwindow.elementorFrontendConfig.responsive.{activeBreakpoints,breakpoints}fallback, so user-overridden Elementor breakpoints propagate regardless of load order.
v1.0.060 — 2026-04-19
Changed
- Builder profile-override system hardened. The 4 builder integrations (Avada Fusion, Divi, Elementor, Gutenberg) that override the active theme injection profile during their render now share a single
RenderProfileScopehelper that wrapsadd_filter/do_shortcode/remove_filterin a try/finally. If the shortcode chain throws (license check, repository query, theme adapter), the override is no longer leaked past the render — preventing silent corruption of subsequent slider renders on the same page request. - Gutenberg block override now covers all three injection selectors (
overlay_wrapper_selector,text_host_selector,cta_text_selector) instead of only the wrapper. On sites where SyteHero is set to a host theme like Avada, the Gutenberg block's overlay text and CTA injection no longer try to find Avada-specific selectors (.fusion-text,.fusion-button-text) inside the host-theme-agnostic block scaffold. - Theme keys exposed as constants on
ThemeConfig(THEME_KEY_AVADA,THEME_KEY_DIVI,THEME_KEY_ELEMENTOR) so builder integrations don't repeat magic-string keys that a future refactor could silently drift from.
Fixed
ServiceContainer::get_active_theme_injection_profile()now type-guards the resolved theme adapter's return value. A misbehaving custom adapter that returns a non-array (object, null, scalar) now falls back to the globalThemeConfiginstead of corrupting the downstream shortcode chain.- Frontend slider JS fallback chain reordered for clarity. Builder-specific selectors (
.elementor-widget-container,.e-con,.et_pb_column,.sytehero-scaffold-wrap) are tried first; the[data-sytehero-hero-wrapper]data attribute is now last because it's only set by the inline sizer that has already failed by the time we reach the fallback.
Added
- Public
Syte\\Hero\\Integrations\\Scaffold\\RenderProfileScopehelper class. Two static methods:with_override( callable $override, callable $body )for exception-safe profile substitution during a render, andforce_theme( string $theme_key )to build a fixed-profile override callable from aThemeConfig::THEME_KEY_*constant. Available for any custom integration that needs the same scoped-override behavior. - 10 new unit tests covering the filter contract:
RenderProfileScopeTest(7 tests, including try/finally cleanup on body exception) andServiceContainerProfileFilterTest(3 tests covering the filter wiring + non-array result guard). PHPUnit suite is now 1230 tests / 3720 assertions.
v1.0.059 — 2026-04-19
Fixed
- All builder integrations now use their own theme profile during render, not just Elementor (v1.0.058). The same root cause that collapsed Elementor heroes to a sliver — the inline sizer using whichever profile the global SyteHero setting selected — would have surfaced any time a builder integration was used on a site whose SyteHero theme didn't match. Each builder now owns its rendering context:
- Avada Fusion element forces the Avada profile (
.fusion-column-wrapper). - Divi module forces the Divi profile (
.et_pb_column). - Elementor widget continues to force the Elementor profile (
.elementor-widget-containerchain). - Gutenberg block sizes against the scaffold's own wrapper (
.sytehero-scaffold-wrap) so the block works in any host theme without depending on theme-specific column structure.
- Avada Fusion element forces the Avada profile (
v1.0.058 — 2026-04-19
Fixed
- Elementor pages: SyteHero hero now renders at full size instead of collapsing to a small square in the corner. The shortcode's inline sizing CSS/JS was hardcoded to the globally-selected SyteHero theme (typically Avada's
.fusion-column-wrapper), which doesn't exist inside an Elementor widget — leaving the absolutely-positioned slider with no parent height. The Elementor widget now overrides the active injection profile during its render, and the frontend slider JS falls back to the closest.elementor-widget-container/.e-con/[data-sytehero-hero-wrapper]when the configured selector doesn't match. Sites that use SyteHero in mixed-builder contexts (e.g. Avada theme with Elementor pages) will see the hero render correctly in both. - Save Image Details: preview at the top now reliably appears with the actual generated image. In the non-deferred save flow, the modal opened the dialog before the image URL had been fetched, so the preview block stayed empty. The flow now fetches the preview URL before opening the dialog, falls back to reading the rendered result
<img>element when state is empty, and always renders the preview wrapper as a stable visual anchor. - Discard button is now always visible in the Save Image Details dialog — including in studio mode where no attachment exists yet. In the no-attachment case, Discard simply resets the in-flight generation and closes the dialog so users can re-prompt; in preset-tool mode it still deletes the auto-saved attachment from the media library.
- Modal no longer auto-closes after saving SEO metadata. Previously, completing a non-deferred save closed the entire modal, removing the user's chance to review the saved image, regenerate, or apply it. The modal now stays open after save so the user can decide what to do next.
Added
sytehero_active_theme_injection_profilefilter lets renderers temporarily substitute the active theme injection profile for the duration of a single shortcode render. Used by the Elementor widget to force its own profile on Avada-themed sites; available for any custom integration that needs the same.
v1.0.057 — 2026-04-19
Added
- Save Image Details now shows a preview of the generated image at the top of the dialog, so you can see exactly what you're about to save before filling in title/alt/caption/description.
- "Discard" button in Save Image Details for AI Studio's preset tools (Extend to Fit, Remove Background) where the generated image is auto-saved to the Media Library before the dialog opens. Clicking Discard prompts for confirmation, then deletes the attachment so you don't have to clean up unwanted images by hand. The original source image is preserved so you can immediately retry. If the image is already in use elsewhere on the site, Discard surfaces a friendly inline message instead of force-deleting. (Studio mode hides the button entirely — Cancel still works there because nothing was saved yet.)
sytehero_fal_outpaint_guardrail_promptfilter for agencies and developers who want to tune the outpaint guardrail phrasing per-site without forking. Receives( string $prompt, string $image_url, string $user_prompt ).
Changed
- Extend-to-Fit Aspect Ratio panel spacing has been refined. The description, the "Extend to <ratio>" button, and the optional fill-prompt input now have proper visual hierarchy — the button reads as the primary action and the prompt is visually separated as an optional refinement.
- Outpaint (Extend to Fit) now reliably matches the original background. A guardrail instruction is automatically prepended to every outpaint request asking the model to seamlessly extend the existing scene and avoid introducing unrelated objects, text, or scenery. Your custom fill-prompt (if any) is appended as additional direction. The fill-prompt placeholder and an inline tip have been updated to reflect this.
- Elementor editor placeholder for the SyteHero Hero Slider widget now shows the human-readable source name (e.g. "Featured Products slider", "Custom Hero: Spring Sale") instead of the raw slug.
Fixed
- Elementor editor canvas no longer loses scroll when the SyteHero Hero Slider widget is added. The featured-products slider's positioning and touch handlers were trapping wheel/touch events inside Elementor's preview iframe. The widget now renders a static placeholder when in edit mode (the live slider still renders normally on the published page), the slider's frontend JS bails early if it detects Elementor edit mode, and a defensive CSS reset neutralises the slider's
overflow:hidden/position:absolutewhenever Elementor's editor body class is present — so even hero markup that lands in the editor through other paths (HTML/shortcode widgets, cached templates) can no longer trap scroll.
v1.0.056 — 2026-04-19
Fixed
- Dragging an image into the AI Studio source area now reliably selects it. A follow-up to v1.0.055 addressing two stacked issues: the uploader falls back through
sizes.medium.url → url → guid(and logs a warning if none are usable), and the thumbnail<img>retries with the full-size URL when its subsize variant (e.g.-229x300.jpg) fails to load. If both variants fail (the rare case where the upload response URL points to a different origin that hasn't yet received the file), the drop zone restores its placeholder and surfaces an "Upload failed" hint instead of silently collapsing. Fix spans every AI Studio modal — AI Studio, Remove Background, Extend to Fit, Upscale, Image-to-Video, Hero generator.
Added
- "Processing…" spinner in the source image drop zone during upload. Dropping an image (or using the AI Studio "Upload File" button) now shows a centred spinner and a pulsing accent border while the file is uploading, so the zone never looks unresponsive between drop and selection. The AI Copy Reference image tile gets an equivalent spinner overlay. Copy is localizable via
SyteHero.i18n.aiSourceProcessing/aiSourceUploading/aiSourceUploadFailed. - Drag-and-drop on the AI Copy modal's Reference image tile. The tile already accepted click-to-pick via the Media Library; it now also accepts a dropped image file, mirroring the behaviour of every other image input in AI Studio.
Changed
- "Extend to Fit Aspect Ratio" now sits directly under the Quality selector inside the generation options, instead of appearing as a standalone row above the prompt. Keeps the option visually grouped with the other generation controls where users expect it.
v1.0.055 — 2026-04-19
Changed
- Unified drop-zone placeholder wording across AI tool modals. The per-tool modals (Remove Background, Extend to Fit, Upscale, Image-to-Video) now read "Drop or click" to match the hero and AI Studio modals, replacing the longer "Drop or click to select image" for a consistent drop-target affordance.
v1.0.054 — 2026-04-19
Fixed
- "Unexpected status: in_progress" error on slow AI generations. The AI image modals were only recognising fal.ai status codes in their legacy uppercase form, so when a model stayed in progress long enough to be re-polled (common with Nano Banana Pro), the UI bailed out with an error. Poll handlers now normalise the response so either uppercase or lowercase statuses round-trip cleanly.
- Drag-and-drop uploads into the AI Studio modal no longer vanish. Previously the dropped file uploaded to the Media Library but never appeared in the source area unless the Media Library picker had been opened first. The drop handler is now wired to the same state-update path as click-to-select, so the thumbnail updates immediately.
- AI Studio "Upload File" button now shows the image straight away. Same class of bug as the drag-drop case: if a user clicked Upload File before ever opening the Media Library picker, the file uploaded but the thumb stayed empty. It now routes through the base modal's shared selection handler.
Added
- Drag-and-drop is now available in every AI modal. The hero image generator, AI Studio, and the per-tool modals (Remove Background, Extend to Fit, Upscale, Image-to-Video) all accept an image file dropped onto their source area in addition to click-to-pick. The placeholder now reads "Drop or click to select" as a visible hint.
Changed
- "Extend to Fit" is now a collapsed dropdown instead of an always-visible row. It used to appear automatically whenever the source image's aspect ratio didn't match the target, which confused users unfamiliar with outpainting. It now only appears when your source actually doesn't match the selected ratio, shows up collapsed by default, and carries a discreet "Recommended — your source doesn't match…" hint next to the summary. Opening it reveals the optional fill prompt and "Extend to <ratio>" button. The Extend to Fit tool modal keeps the dropdown auto-expanded since it's the tool's primary action.
v1.0.053 — 2026-04-19
Changed
- Scaffold wrapper discovery simplified.
sytehero-frontend-overlay.jsnow recognises.sytehero-scaffold-wrapas the overlay wrapper directly, short-circuiting the theme-profile walk-up when a builder widget is present. The scaffold no longer needs to carry.e-con(or any theme-specific class) to be discoverable, and the Elementor builder path stops emitting.e-conentirely. - Non-Elementor builders emit a bare CTA text
<span></span>— the unreferencedsytehero-hero-cta-textclass introduced in v1.0.052 has been dropped. The Elementor path continues to emit.elementor-button-textwhere the Elementor theme profile's host selector expects it.
Added
- Editor-script handle contract tests —
HeroSliderBlockModuleTestnow directly assertseditor_script_handle()returns'sytehero-hero-slider-editor-script'and stays in lockstep withBLOCK_NAME. Agenerate_block_asset_handle()test stub intests/bootstrap.phpmirrors WP's real algorithm so both the live and fallback paths are covered. - Strengthened coexistence-test sentinel — verifies via reflection that the three
DiviModuleRegistrarCoexistenceTestfuture-contract methods still exist so a rename or accidental deletion trips a failing test immediately.
v1.0.052 — 2026-04-19
Changed
- Scaffold decoupled from Elementor-specific class names. The builder-scaffold renderer now emits
.e-con,.elementor-widget-container,.elementor-button, and.elementor-button-textonly for the Elementor widget path. Gutenberg / Avada / Divi / Divi 5 scaffolds produce clean, theme-neutral DOM —.sytehero-hero-text-area-1,.sytehero-hero-text-area-2,.sytehero-hero-cta,.sytehero-hero-cta-text. No frontend behaviour change (the overlay-injection JS'sel.closest(selector) || elfallback continues to land text in our elements regardless). - Gutenberg block editor-script handle is now computed dynamically via
generate_block_asset_handle()instead of a hardcoded string — future-proof against WP's handle-generation algorithm changes. - Fusion Builder preview template uses the underscore HTML-escape delimiter (
{{- }}instead of{{= }}) fordata.sh_sourceinterpolation. Defensive escaping at the template boundary even though the field currently only carries sanitized dropdown values.
Added
- CI Node build step.
.github/workflows/release.ymlnow runsnpm ci+npm run build:allbetween PHPUnit and the ZIP-staging step, so the release zip always contains freshly-builtassets/blocks/andassets/divi5/rather than whatever was last committed. - Coming Soon placeholder contract tests — asserts the Divi 5 placeholder row in Settings remains inert (no
TabGateOptionskey backing it) until the module actually ships. - Divi 4 ↔ Divi 5 coexistence contract tests (deliberately skipped until the D5 module lands). Encodes the required short-circuit behaviour as a ready-made regression net for the future implementer.
- Divi 5 stub bundle emits a small runtime marker (
window.SyteHeroDivi5 = 'coming-soon', ~88 bytes) so WP caching/minify plugins don't treat the compiled file as corrupt.
Notes
- An attempt to migrate from deprecated
divi-types-*npm aliases to the direct@divi/*packages was reverted — the direct packages have a transitive dependency (@types/[email protected]) that's missing from the npm registry, breaking fresh installs. Deferred to the Divi 5 native module continuation work; conditions for a successful re-attempt are documented. - No runtime behaviour change on any of the four supported builders.
v1.0.051 — 2026-04-19
Added
- Divi 5 native module infrastructure (Coming Soon feature). Build-time groundwork for a future first-class Divi 5 module — npm dependencies (
@divi/types+ targeted@types/divi__*packages), TypeScript + Webpack configs, abuild:divi5script, and a stubsrc/divi5/source tree that compiles cleanly. The module implementation itself is deferred pending a green-light signal (customer demand, Divi 5 adoption threshold, or upstream@divi/*API stabilisation); seedocs/superpowers/plans/2026-04-19-divi5-module-continuation.md. - "Divi 5 native module (Coming Soon)" placeholder under Settings → Advanced → Tab access. Greyed out and non-interactive — marks where the real toggle will appear when the module ships.
Changed
- Divi Classic module and Gutenberg block documentation now reference the Coming Soon Divi 5 roadmap.
Notes
- No runtime behaviour changes on Divi 4 or Divi 5 sites. The Classic module from v1.0.049 continues to serve both (Divi 5 via its Classic-compatibility layer).
- Rolling back this release is safe: all additions are dev-only tooling + a disabled UI row; no new runtime code paths were introduced.
v1.0.050 — 2026-04-19
Added
- Fusion Builder element preview — the SyteHero Hero Slider element now renders a labelled preview card inside Fusion Builder showing the element's name and selected source. Previously the builder showed only a generic element rectangle.
v1.0.049 — 2026-04-18
Added
- Avada / Fusion Builder element: SyteHero Hero Slider — register a native Fusion Builder element via
fusion_builder_map()onfusion_builder_before_init. The element wraps a shortcode ([sytehero_fusion_hero_slider]) that reuses the shared scaffold subsystem introduced in v1.0.047, producing byte-identical frontend markup to the Elementor widget and Gutenberg block for equivalent attributes. Style tab exposes colour, font size, font weight, line height, and alignment per Text Area 1 / Text Area 2 / CTA, plus a layout gap. - Divi Classic module: SyteHero Hero Slider — register a custom
ET_Builder_Modulesubclass viaet_builder_ready. Targets the classic back-end Divi Builder; the Visual Builder uses Divi's AJAX fallback rendering (a future release may add native VB rendering via a Divi Extension). Same Style-tab controls as the Fusion element. - Settings → Tab access toggles — two new toggles (Enable Fusion Builder element, Enable Divi module) let admins hide each integration without affecting existing shortcode placements.
Changed
- Bumped the shared scaffold subsystem's builder set to four: Elementor (v1.0.047), Gutenberg (v1.0.048), Avada / Fusion Builder, Divi Classic. Every builder consumes the same
Syte\Hero\Integrations\Scaffold\StyleSchema+ScaffoldRendererso authors see consistent behaviour across platforms.
v1.0.048 — 2026-04-18
Added
- Gutenberg block: SyteHero Hero Slider — insert the block on any post, page, or site-editor template and pick a saved hero from the Inspector. The overlay (Text Area 1, Text Area 2, CTA) is pre-packaged in the block's output; no container assembly required. Reuses the shared scaffold subsystem introduced in v1.0.047 so block placements produce the same frontend markup as the Elementor widget.
- Inspector Style panels — colour, font size, font weight, line height, and alignment per Text Area 1 / Text Area 2 / CTA, plus a layout gap control. Values cascade on top of the global SyteHero Settings defaults.
- Settings → Tab access → Enable Gutenberg block toggle — hides the block from the inserter without affecting existing shortcode placements.
Changed
- Minimum WordPress version bumped to 5.8 (required for
block.json-based block registration). Effectively no real-site impact; WP 5.0–5.7 is <1% of active sites per wordpress.org usage stats. - Build pipeline: root
package.json+@wordpress/scriptsadded for the Gutenberg block bundle. Dev-only —src/,package.json,node_modules/are excluded from the release zip by the existing allowlist. Built output ships fromassets/blocks/.
v1.0.047 — 2026-04-18
Added
- Pre-packaged overlay scaffold for the Elementor widget — dropping the SyteHero Hero Slider widget onto a page now produces the Text Area 1, Text Area 2, and CTA overlay automatically. No separate Heading/Button widgets required and no CSS-class scaffolding to remember. Content still comes from SyteHero → Custom Heroes (or the Featured Products slider); empty source fields hide the matching overlay element.
- Style tab on the Elementor widget — per-placement controls for text colour, font size, font weight, line height, and alignment on each of Text Area 1, Text Area 2, and CTA, plus a layout "gap between elements" control. Values cascade on top of the global SyteHero Settings defaults.
Changed
- Shared scaffold subsystem introduced under
Syte\Hero\Integrations\Scaffold(StyleSchema,StyleTokens,ScaffoldRenderer). The Elementor widget is the first consumer; the Gutenberg block (v1.0.048) and Avada/Divi elements (v1.0.049) will reuse the same building blocks.
v1.0.046 — 2026-04-18
Added
- Elementor widget: SyteHero Hero Slider — drop a "SyteHero Hero Slider" widget onto any Elementor page and pick either the Featured Products slider or a saved Custom Hero from a dropdown. Rotation, Text Area 1 / Text Area 2 / CTA overlays, license gating, and theme styling are inherited from the existing shortcode path, so there is no duplicate content to manage. Per-instance view variant (desktop/tablet/mobile) and an optional wrapper CSS class are exposed.
- Settings → Tab access → Enable Elementor widgets toggle — lets admins turn the widget off globally without affecting existing shortcode placements.
v1.0.045 — 2026-04-16
Fixed
- Fatal error on admin pages — added missing
useimport forAiProviderAjaxHandlerinAdminJsConfigafter the AJAX namespace refactor. The class moved toAdmin\Ajaxbut the reference was not updated, causing a fatal "Class not found" error on every admin page load.
v1.0.044 — 2026-04-16
Fixed
- Uniform hero height — product, custom/page, and fallback slides now all render at the same configured height. Previously, custom slides with large images could push the hero beyond the set viewport height.
- FlexSlider smoothHeight — no longer fights the hero height constraint inside the slider background.
- Supplemental slide auto-save — editing text, margins, modes, or glow on custom/page slides now auto-saves via AJAX. Previously these changes were lost because the save was never triggered.
- Push View persistence — the Push View button now persists changes for supplemental and fallback hero text editors.
v1.0.043 — 2026-04-15
Fixed
- Straico AI provider — migrated from v1 API (which returned HTTP 522) to the OpenAI-compatible v2 API. Straico now uses the same request format as OpenAI and OpenRouter.
- Straico model picker — filters to chat models only, excluding image, video, and audio models from the text-provider dropdown.
Changed
- AI chat completion timeout — increased from 30 seconds to 60 seconds to accommodate slower LLM providers and aggregator services.
- OpenAI-format token limit — requests now send both
max_completion_tokensandmax_tokensfor broad compatibility with OpenAI-compatible providers.
v1.0.042 — 2026-04-15
Fixed
- Admin-bar launcher reliability — removed a hard script dependency (
media-editor) that could silently prevent the launcher from loading, causing admin-bar AI Studio items to stop responding to clicks. - Modal media picker diagnostics — media picker guards now log a visible console warning when
wp.mediais unavailable, replacing the previous silent no-op.
Changed
- Launcher script hardening — script loader now tracks already-loaded assets to prevent duplicates, scopes click handling to the admin bar, and logs errors on script load failure.
v1.0.041 — 2026-04-15
Fixed
- AI Studio admin-bar modals on every page — Generate, Transform, Remove Background, Upscale, Extend to Fit, Image to Video, and AI Copy now work when launched from the admin bar on any admin page (Dashboard, Posts, Users, Plugins) or on the frontend for logged-in admins. Previously the modals opened but buttons inside were inert because their scripts didn't receive the full SyteHero config or the WordPress media picker.
Changed
- Admin-bar launcher moved to enqueued assets — the launcher script and styles previously printed inline in each admin page now load from cacheable
sytehero-admin-bar-launcher.jsand.cssfiles. No user-facing difference beyond slightly smaller page HTML.
v1.0.040 — 2026-04-15
Fixed
- AI provider tokens-refresh button — the refresh button next to Max Tokens on the AI Image provider card now syncs only the tokens value from the selected model. It no longer refetches the models list. If the models haven't been loaded yet, click Refresh models first.
- Admin-bar AI modals — modals launched from the top SyteHero → AI Studio → [modal] menu (AI Copy, BG Removal, Upscale, Outpaint, Image-to-Video) now render with the same styling as the AI Studio Generate modal. Previously, opening them outside the AI Studio page loaded only the base modal stylesheet, leaving drop zones and AI Copy-specific layout unstyled.
v1.0.039 — 2026-04-15
Changed
- AI Copy modal styling — reference tiles, inputs, suggestion chips, and status states now use the same dark modal surface styling as the other AI Studio modals.
- Transform modal footer layout — action groups now keep a cleaner responsive structure as space tightens, with more consistent button alignment across desktop and mobile.
v1.0.038 — 2026-04-15
Changed
- Prompt Enhancement — now routes through the shared AI text-provider system. Fal is registered as a text provider so existing Fal-only setups keep working without any extra configuration. Saved Fal API keys carry over automatically.
Removed
- Legacy AI image shims —
sytehero_fal_*AJAX action aliases, thesytehero_fal_settingsoption, and theFalAiSettings/get_fal_servicetransitional helpers from the v1.0.036 AI provider refactor have been removed. Any integrations still calling the old names must update tosytehero_ai_image_*.
v1.0.037 — 2026-04-15
Changed
- AI Studio — Integrations tab — AI image providers now render as separate card-style blocks with a shared save flow, making multi-provider configuration faster and less error-prone. Per-provider connection testing is preserved.
- Documentation — Integrations docs updated to describe the refreshed card layout and shared save workflow.
v1.0.036 — 2026-04-15
Changed
- AI Studio — Fal AI is now implemented as the first adapter in a pluggable AI image/media provider system. Each capability (Generate, Transform, Remove BG, Upscale, Extend to Fit, Image-to-Video) can be independently routed to different providers. Existing Fal API key and settings migrate automatically on upgrade.
- Prompt Enhancement — now available as a function area on the Integrations tab; when configured with a text provider (Claude, OpenAI, etc.) prompts are enhanced via that provider instead of Fal's built-in model.
v1.0.035 — 2026-04-09
Changed
- FluentCart detection — recognizes FluentCart and FluentCart Pro using broader class and constant signals when WooCommerce is not installed
Fixed
- Plugin activation — no longer fatals when the ecommerce gateway is unavailable; featured-tag setup runs when the store is ready
v1.0.034 — 2026-04-09
Added
- Integrations refresh — refresh actions for the AI model list and max-tokens fields on the Integrations card
Changed
- AI Providers card — three-column layout, Browse Models links, clearer dropdowns, and visual polish
- Maintenance — uninstall cleanup, FluentCart-related fixes, and modularization from the comprehensive review
Fixed
- Fal balance capture — fast models record post-generation balance and cost data more reliably
- AI integrations — Straico and Gemini model loading, integrations refresh behavior, badge contrast, and max-tokens synchronization
v1.0.033 — 2026-04-08
Added
- AI Studio modal — new dark-themed modal for text-to-image and image-to-image generation, accessible from any admin page
- Admin bar launcher — a ✨ icon in the WordPress admin bar opens the AI Studio modal from any admin screen without navigating to the AI Studio page
- AI media manager — dedicated AI Media tab to browse and delete AI-generated images, with usage detection to protect in-use assets
Removed
- Unused Media Scanner — AI Studio's Tools tab and all underlying scan/delete/export functionality has been removed.
Changed
- Admin background — Plugin admin pages now use a neutral slate-gray page canvas (#f8fafc) so white cards visually lift off the background.
Fixed
- Countdown modal save — Clicking "Save Settings" in the countdown modal now immediately persists settings via AJAX. A second manual save of the schedule form is no longer required.
- Analytics click tracking — CTA clicks are now tracked at click time via a rate-limited AJAX beacon. Previously, "clicks" only recorded at completed checkout.
Changed
- AI Studio checkboxes — Custom checkbox styling with proper checked state and focus indicator replaces the native browser rendering.
v1.0.032 — 2026-04-01
Added
- AI hero image generation powered by fal.ai — select a source image from the media library, write a prompt, pick a model (with cost indicators), and generate a new hero image directly in the WordPress admin
- New fal.ai integration card on the Integrations tab for API key management and connection testing
- "Generate with AI" buttons on the product metabox, Heroes tab, and Schedules tab
v1.0.031 — 2026-04-01
Changed
- FluentCart release workflow: clearer logging and documentation for the
x-sytehero-releaseWAF header (including guidance when the same Cloudflare zone also fronts SyteOps)
v1.0.030 — 2026-04-01
Changed
- Release automation can optionally publish the plugin ZIP to SyteWide FluentCart product downloadables when repository credentials are configured (no change required for sites that only install updates from SyteWide)
v1.0.029 — 2026-04-01
Fixed
- Video and iframe content now displays correctly in analytics hover preview when a slide uses video media
v1.0.027 — 2026-04-01
Added
- Persistent slide labels in the analytics dashboard — label your slides for easy identification
- Hover preview tooltip showing the slide image or video in analytics Card and Table views
v1.0.026 — 2026-03-31
Added
- "No-track" bookmark link in analytics settings for quickly toggling tracking on and off
v1.0.025 — 2026-03-31
Fixed
- Countdown timer now correctly respects tablet device visibility toggle
v1.0.024 — 2026-03-31
Added
- Analytics fallback labels for slides without explicit names
- Reset button for analytics data
- Option to exclude admin users from analytics tracking
Fixed
- Hero rotation order now preserved when schedules add or remove slides
v1.0.010 — 2026-03-30
Added
- Sale countdown timer overlay — display a live countdown on hero slides tied to sale end dates, with configurable position (top strip or below CTA) and per-slide visibility toggles
- Slide performance analytics dashboard — track slide impressions with Card and Table views, date-range filtering, and a visual analytics tab in the admin
Changed
- SyteWide branding applied to admin page header
- Analytics tab repositioned for better workflow
v1.0.009 — 2026-03-30
Fixed
- Email footer logo now renders at correct size with shared branding helper
v1.0.007 — 2026-03-30
Changed
- Updated to transparent PNG logos across admin and email branding
v1.0.004 — 2026-03-30
Fixed
- Email report cron scheduling now fires reliably
- Corrected shortcode tag names after rebrand
Added
- Cron diagnostics in admin for troubleshooting scheduled emails
v1.0.000 — 2026-03-28
Added
SyteHero launches as the successor to SyteSlyders, carrying forward all features under a new name and unified codebase:
- Featured product hero slider with drag-and-drop ordering, per-slide scheduling, and pause controls
- Hero text overlays with per-view (desktop/tablet/mobile) customization, glow effects, and CTA buttons
- Custom heroes — add page, category, or custom URL slides alongside products
- Sales scheduling — start/end dates, retain-after-expiry, and banner sync
- Banners — rich-text announcement banners tied to sale schedules
- Custom CSS — cross-theme CSS editor scoped to hero wrappers
- Shortcodes — embed featured and custom sliders anywhere via shortcode
- Slider engines — choose between FlexSlider, Swiper, or Splide
- Multi-theme support — Avada, Divi, and Elementor integrations with theme-aware injection
- Multi-ecommerce support — works with both WooCommerce and FluentCart
- Google Calendar integration — two-way sync of sale schedules with Google Calendar
- Shippo shipping integration — tracking info and shipping label costs in sales summary emails
- Sales summary reports — periodic and real-time order notification emails with dark mode support
- Backup & restore — full settings export/import
- License activation — first-run setup with EULA consent and SyteWide license validation
- Set Defaults modal — configure master hero text defaults and push to individual slides
- Admin preview — responsive browser-style preview with desktop/tablet/mobile breakpoints
- Documentation tab — in-plugin docs with configurable demo video