Seomedseb Smart Search for WooCommerce — full changelog

This file holds the complete version history. readme.txt only keeps the
most recent entries (0.15.0 onward) in its own Changelog section, because
WordPress.org's readme parser truncates that section at 5000 characters
for the "View version details" popup.

= 0.18.9 =
* Changed: hardened a few Plugin Check warnings flagged by WordPress.org's automated review — table-name lookups in the legacy-prefix migration now go through `$wpdb->prepare()`/`esc_sql()` instead of raw string interpolation, and three uninstall.php variables were given the plugin's own prefix. No functional change for existing sites.
* Changed: trimmed the readme's Changelog section to stay under WordPress.org's 5000-character display limit — full version history before 0.15.0 is now in `changelog-full.txt`.

= 0.18.8 =
* Fixed: the results dropdown could render partly or mostly off-screen on stores where the search bar sits away from the left edge of its header (centered, right-aligned, or a narrow collapsed icon trigger) — it's anchored to the bar's right edge and allowed to grow up to ~720px leftwards for room, which pushed its left edge past the actual browser window on those layouts, cutting results off or spilling them under the logo. It now checks where it actually landed after opening and, only if that's off-screen, repositions itself a fixed margin from the true edge of the screen instead — including on window resize, so rotating a device or resizing the browser while results are open doesn't leave it stuck.
* Changed: refined the wolftactical.de/wolftac.dk Design tab colors to match each site's real brand colors exactly (accent/submit button, group heading color) and corrected the font family, which was set to a generic default instead of each site's actual site font.

= 0.18.7 =
* Fixed: 0.18.6's Breakdance fix covered its canvas re-rendering an element after `wp_head` already printed the page's tags, but Breakdance's separate header/footer template editor (a `/breakdance_header/…` endpoint) renders through its own isolated request that appears to never fire `wp_head` at all — the opposite timing problem, with the same "real markup, no CSS" result. Rather than keep chasing each builder's specific rendering quirk, the bar now always brings its own CSS/JS along with it once per page, regardless of timing, instead of depending on catching the right moment in the `wp_head` queue.

= 0.18.6 =
* Fixed: the 0.18.5 fix for the page-builder styling problem covered a builder that renders this plugin's shortcode with no page load at all, but not Breakdance's actual behaviour — its canvas is a real page load (so `wp_head` already ran and already printed the page's styles/scripts), then it re-renders just this one element through a later request and swaps the returned HTML in directly. That's too late for `wp_enqueue_style()`/`wp_enqueue_script()` to reach the page at all, which is exactly what the builder screenshot showed: real markup, zero CSS. When this is detected, the shortcode now brings its own `<style>`/`<script>` along with it instead of depending on `wp_head`.
* Fixed: the Design tab's "Knaptekst (valgfrit)" (submit button label) field had no live-preview effect — same underlying issue as 0.18.5's icon-label fix (the button renders *either* an arrow icon *or* your text, never both, so setting the text couldn't just update in place; it had to swap the arrow out).
* Fixed: ten Design-tab colors (the six status/stock badge colors, the two sale/regular price colors, "Added" confirmation background, and Group heading color) had no live-preview effect at all — they were missing the CSS-variable binding every other color field relies on, so editing them visibly did nothing until "Save changes".
* Fixed: the six "Dark:" colors likewise had no live-preview effect. These share their CSS variable names with the matching light-mode color (correct on the real site, where they're scoped to only apply when dark mode is actually showing) — the preview now only applies a "Dark:" color when it's actually simulating dark mode (based on the "Dark mode" setting and, for "Follow visitor OS setting", your own browser's current preference), instead of either doing nothing or incorrectly overwriting the light color.
* Fixed: the "Spacing" preset (Compact/Comfortable/Spacious) had no live-preview effect.

= 0.18.5 =
* Fixed: several Design/Search-bar settings (icon trigger shape, icon trigger style, icon label, submit button style, show submit button) had no effect on the admin's live preview — the preview only caught up once you clicked "Save changes" and the page reloaded, even though the screen says the preview updates as you edit. Each of these now updates the preview immediately, matching exactly what gets saved.
* Fixed: the `[smart_search_bar]` shortcode could render with none of its styling applied when placed through a page builder's own element/live-preview mechanism (seen in Breakdance) rather than a normal page load — the icon and markup showed up, but no colours, spacing or rounding. The plugin's CSS/JS only got registered on the `wp_enqueue_scripts` hook, which those builder preview requests don't fire; the shortcode now registers its own assets on demand if that hasn't already happened, so it looks right no matter how it's rendered.

= 0.18.4 =
* Fixed: the admin-only language switcher added in 0.18.0 changed a setting (`ssws_admin_locale`) from a plain GET link with only a capability check and no nonce — a logged-in admin could have that preference changed via a link they didn't intend to click (CSRF). The switcher's links now carry a nonce that's verified before the option is written.
* Changed: plugin author credit updated to SEOmedSEB.

= 0.18.3 =
* Fixed: clicking "View all products (N)" at the bottom of the search dropdown could take several seconds to respond on stores with a large catalogue. The link itself was always instant — the destination page (WooCommerce's own search-results page) runs this plugin's search a second time server-side to build its result list, and that pass was fully hydrating every matched product (price, add-to-cart, image, description) before throwing almost all of that away, since the results page only needs the list of matching IDs. It now skips straight to that, cutting the work from one full product load per match down to none.

= 0.18.2 =
* Fixed: `Tested up to` was one minor version behind current WordPress (7.0, now 7.1) — WordPress.org's automated check rejects a submission over this, since an unlisted-as-tested plugin doesn't show up in search.
* Fixed: the WordPress.org-specific build (no bundled languages/*.po/*.mo, per their own review guidance) was dropping the `languages/` folder entirely, which left the `Domain Path: /languages` header pointing at a folder that didn't exist in that package. The folder is kept with just the seomedseb-smart-search.pot template — the .po/.mo files translators would otherwise open are still excluded, only the template a translator starts from stays, which is what makes Domain Path valid again.

= 0.18.1 =
* Fixed: the Design tab's "Font family" field could be used to inject arbitrary CSS — flagged by WordPress.org's review. Its value is sanitized on save but that only strips HTML tags, not CSS syntax; the escaping this plugin applies when printing it (and every other Design-tab value) as a CSS custom property now strips the characters that give CSS its structure (`;` `{` `}` `@` etc.) instead of just guarding against an obsolete `</style>` breakout from before this moved to wp_add_inline_style() in 0.17.0.
* Changed: `Plugin URI` now points at the canonical, trailing-slash landing page URL directly, removing a redirect hop a strict crawler might not follow.

= 0.18.0 =
* Added: a language switcher for this plugin's own settings screens (top-right of every tab) — Dansk, Deutsch, or English, independent of whichever language WordPress itself is set to. Useful on its own if wp-admin's language resolution isn't cooperating (see the "Fixed" note below), and useful generally for an admin who'd rather configure the plugin in their own language than English.
* Fixed: this plugin's own settings screens could get permanently stuck in English even on a fully German- or Danish-language site with complete translations installed. Two separate causes: (1) the tab names were translated too early in the request — before this plugin's own translation file had even loaded — so they silently fell back to English no matter what; (2) WordPress's admin-language resolution uses the *logged-in admin's own* language preference rather than the site's, and falls back to English for any admin account old enough to predate that preference existing. The new language switcher above sidesteps both permanently; the tab-name timing bug is also fixed outright, independent of the switcher.

= 0.17.6 =
* Fixed: the real cause of 0.17.2/0.17.3 not working — WordPress's own load_plugin_textdomain() (used by WooCommerce and this plugin to load their translation files) ignores the page's language entirely for any admin-ajax.php request and uses the *logged-in admin user's own wp-admin language preference* instead, since admin-ajax.php always runs in an "admin" context regardless of who's asking or why. Confirmed live: switching get_locale() had no effect because it was never being consulted for this. Now uses WordPress's `plugin_locale` filter — the actual supported override for this — to force WooCommerce's and this plugin's own strings to the shopper's real page language during a search, independent of whichever admin happens to be logged in at the time.

= 0.17.3 =
* Fixed: the 0.17.2 locale fix didn't actually change WooCommerce's own button text ("Select options" etc.) — switch_to_locale() only reloads WordPress's own core translations; it doesn't force a plugin like WooCommerce to re-read its already-cached translation file for the rest of that request. Now explicitly clears WooCommerce's (and this plugin's own) cached translations first, so they're read fresh in the correct language.

= 0.17.2 =
* Fixed: on a multilingual store (Polylang/WPML), WooCommerce's own product-dependent button text — e.g. "Select options" for a variable product — could show in the site's default language instead of the shopper's actual language, mixed in with correctly-translated text right next to it. Root cause: the AJAX endpoint this search bar uses has no URL slug for Polylang/WPML to detect the visitor's language from, so anything computed live during that request (as opposed to preloaded into the page) fell back to the default language. The visitor's language is now captured while the page renders (where it's known correctly) and sent along with every search/add-to-cart request, so the whole response is consistently in one language again.

= 0.17.1 =
* Fixed: text overrides entered on the Texts tab stopped following Polylang/WPML's per-language translations after the 0.17.0 rename — a German shop could show a mix of Danish and English instead of German. The plugin hands each override string to Polylang/WPML under a named "group" so it can be translated per language; that group name was accidentally tied to the plugin's current marketing name and changed every time the plugin was renamed for WordPress.org (Smart Search for WooCommerce -> AJAX Smart Search for WooCommerce -> Seomedseb Smart Search for WooCommerce), which orphaned every translation already saved under the original name. The group name is now a fixed identifier that will never change again, regardless of future renames, so existing Polylang/WPML string translations work again immediately with no re-entry needed.

= 0.17.0 =
* Changed: plugin renamed to "Seomedseb Smart Search for WooCommerce" (slug: seomedseb-smart-search) — WordPress.org's directory review flagged the previous name as too generic and too close to existing search plugins. Every internal function, class, option, table and hook was renamed from the "ssw_"/"SSW_" prefix to "ssws_"/"SSWS_" at the same time, since the old 3-character prefix was below their required minimum. Existing installations migrate automatically on upgrade — no settings are lost and the search index is preserved.
* Removed: the "Custom CSS" field on the Design tab. WordPress.org no longer permits plugins to let users insert arbitrary CSS/JS/PHP, regardless of how it's sanitized.
* Changed: the Design tab's CSS custom properties are now attached via `wp_add_inline_style()` instead of being echoed directly as a `<style>` tag, per WordPress.org's asset-loading guidelines.
* Changed: rewrote the plugin description to remove comparative marketing language, per WordPress.org's content guidelines.

= 0.16.1 =
* Fixed: "Search in SKU" (Search config tab) was saved and shown correctly in the settings but never actually consulted by the search itself — SKU was hardcoded into every query's search columns, so turning the toggle off didn't stop SKU matches from appearing. Now the toggle is the single source of truth for which columns are searched, including in the typo-tolerant fallback search.
* Fixed: the "Clear search history" link text could not be customized on the Texts tab, even though the setting existed internally and was already translated — it was just missing its own field. Added under a new "Search history" section.

= 0.16.0 =
* Added: "Group heading color" (Design tab) — a dedicated color for the "Categories" / "Products" labels above each section of the results list. Previously always a dimmed (55% opacity) version of "Suggestion text" with no color of its own.
* Changed: the product image in the details panel is now ~19% larger (160px → 190px) on desktop, where it's shown — no quality loss, since the source image was already upgraded to a higher resolution.

= 0.15.3 =
* Fixed: "Show SKU" (Autocomplete tab) only hid the SKU in the dropdown row — the details panel on the right kept showing it regardless of the setting. Both now follow the same toggle.

= 0.15.2 =
* Fixed: product description in the details panel and dropdown rows showed the literal text "&hellip;" instead of an ellipsis when a description was long enough to be trimmed. `wp_trim_words()` defaults to the HTML-entity string '&hellip;' expecting to be echoed into raw HTML, but the panel inserts text through an escaping helper first — so the `&` got re-escaped and the entity never decoded. Now uses the actual "…" character, which needs no decoding.

= 0.15.1 =
* Changed: badge status colors (out of stock, backorder, sale) now default to classic red/amber/green instead of the previous scheme, for instant recognizability.
* Fixed: product images looked soft on high-DPI (retina) screens — the dropdown thumbnail was requesting WordPress's 150x150 'thumbnail' size, and the details-panel image its 300x300 'medium' size, both undersized once scaled up on a 2x/3x display. Now requests 'medium' (300x300) and 'large' (1024x1024) respectively. Existing indexed products need a reindex (Indeksering tab → "Genopbyg nu") to pick up the sharper thumbnail; the details-panel image is fetched live and needs no reindex.
* Fixed: dark mode set to "Følg besøgendes OS-indstilling" (auto) could silently override the light-theme search bar colors with the dark-mode colors on a visitor's device, depending on their OS setting.

= 0.15.0 =
* Added: "Product image radius" (Design tab) — rounds the corners of product images consistently in both the autocomplete dropdown thumbnail and the larger image in the details panel. Previously the dropdown thumbnail had a fixed 6px radius and the details panel had none at all; both now follow the same slider.

= 0.14.9 =
* Changed: plugin slug renamed from `smart-search-woocommerce` to `smart-search-for-woocommerce` (WordPress.org trademark policy — "woocommerce" may only appear in a slug alongside "for"/"with"/"using"/"and"). Text domain, main file, and translation files renamed to match.
* Fixed: `Tested up to` in this file was listing a patch version (7.0.3); WordPress.org only accepts major.minor there.
* Fixed: 14 Plugin Check false-positive security/escaping findings annotated with `phpcs:ignore` and an explanation, so an automated WP.org review no longer flags safe code.

= 0.14.8 =
* Added: "Search in GTIN/EAN" (Search config tab) — indexes WooCommerce's own core barcode field (GTIN/UPC/EAN/ISBN, product edit screen next to SKU), including per-variation barcodes. On by default. Takes effect after the next reindex (scheduled, or click "Rebuild index" for it immediately).
* Added: "SKU display" (Autocomplete tab) — when a variable product shows as one result, choose between listing every variation's SKU (previous, only behavior) or just the parent product's own SKU.

= 0.14.7 =
* Changed: multiple SKUs on a variable product (shown when "Product variations" is set to "Parent product only") were run together with just a space, e.g. "64-01513 64-01512" — now comma-separated for readability.
* Added: "Submit button style" (Search bar tab) — "Filled" (default, unchanged) or "Just the icon/text — no box", for sites that want the submit control without a distinct button-shaped box next to the input. "Show submit button" still exists separately for removing it entirely.

= 0.14.6 =
* Fixed: product titles in the results LIST (not the details panel) were silently inheriting the host theme/page-builder's text-align instead of being reliably left-aligned. Long titles hid it — an ellipsis-truncated title fills its row edge to edge regardless of alignment — but a short product name would visibly float to the middle of the row while every other row sat flush left (wolftactical.de feedback, e.g. "Pacsafe 20L Rucksack DENIM" centered next to left-aligned neighbors). The results list is now always left-aligned, matching standard search-dropdown convention; the separate right-hand details panel keeps its own admin-configurable left/center setting, unchanged.

= 0.14.5 =
* Fixed: on mobile, tapping into the search field could make the whole page jump/zoom and the search bar appear to shoot off-screen. Cause: "Font size (mobile)" defaults to 15px, and iOS Safari auto-zooms the page whenever a focused input's font-size is under 16px. The actual input now has a 16px floor regardless of the configured font size — everything else in the widget still scales down on mobile exactly as configured.
* Added: "Show 'Sponsored by' footer" checkbox on the Autocomplete tab — the small "Sponsored by Smart Search" line in the results dropdown can now be turned off from the admin, no code required (previously only possible via a developer filter).

= 0.14.4 =
* Added: full German (de_DE) translation — all 302 admin and shopper-facing strings, matching the existing Danish coverage. Sites with WordPress set to German now show the whole plugin (search bar, results, admin settings and help text) in German automatically, with no configuration needed.

= 0.14.3 =
* Fixed: a sale price and the regular price it replaced rendered in the exact same color (both inherited the single Accent/price color), distinguishable only by the strikethrough on the regular price. New "Sale price" and "Regular price (struck through)" fields under a new "Status colors" section on the Design tab.
* Added: admin color control for the four remaining hardcoded colors — the out-of-stock, on-backorder and sale badges, and the "Added" confirmation state on the Add to cart button. All four default to their previous fixed colors, so no existing site changes on upgrade.

= 0.14.2 =
* Fixed: the "Add to cart"/"View options" button, "View all products", and the category-preview "View all" link lost their own color and inherited the surrounding (dark) text color instead — a direct regression from 0.14.0's link-color isolation fix. That fix's blanket `.ssw-search a { color: inherit !important; }` correctly stopped the theme from bleeding into links that are *supposed* to inherit, but it also outranked these three links' own explicit color (their own specificity was lower than the blanket rule's, even though both carry !important). Found live once real brand colors replaced the plugin's defaults: white button text on an orange background turned black and unreadable. Each is now re-declared at higher specificity so it keeps its own color again.
* Changed: the "Add to cart"/"View options" button now uses the same admin-configurable "Submit button background"/"Submit button text" colors as the search bar's own submit button, instead of a hardcoded white-on-Accent-color combination with no admin control at all. Both color fields' help text now says so.
* Added: searching by an exact SKU now highlights the matching part of the SKU in the accent color, the same way a name search highlights the matching part of the title — previously a SKU-only search matched the right row with no visible indication of why.

= 0.14.1 =
* Fixed: a custom "Font family" value containing quotes (e.g. `'Inter', system-ui, sans-serif`) was silently ignored — esc_html() turned the apostrophes into `&#039;` entities inside the `<style>` block, which a stylesheet never decodes, so the browser dropped the invalid value and fell back to the theme's font. Found while matching wolftactical.de's brand fonts right after 0.14.0 shipped.

= 0.14.0 =
* Fixed: product titles, prices and links inside the results dropdown could silently take on the host theme's/page-builder's link color instead of the Design tab's own colors, when a global `a { color: ... }` rule (e.g. from Breakdance) tied in CSS specificity with the plugin's own selectors and won the cascade on load order. The whole widget's link color is now locked to its own Design-tab variables regardless of what the theme does elsewhere.
* Fixed: products with many SKUs (variable products with several variations folded into one row) could overflow past the edge of the results panel instead of truncating with an ellipsis — a missing `min-width: 0` on a flex child meant the "shrink to fit" never actually engaged. Price and stock badges now keep priority; the SKU text is what truncates.
* Fixed: the details-panel image (shown when a result is highlighted) was reusing the small 40px result-row thumbnail stretched up to 160px, which looked soft/pixelated. It now resolves its own larger image size directly from the product, live — no reindex needed.
* Added: "Product details alignment" (Design tab) — centered (previous, unchanged default) or left-aligned, for the product name/price/SKU/description in the details panel.
* Added: every Design-tab color swatch now has a paired hex text field, so an exact brand color code can be typed or pasted instead of only picked visually.
* Added: "Clear search history" action next to the Recent Searches heading in the dropdown (English + Danish, like every other shopper-facing string — see Settings → Texts).
* Docs: clarified that "Product image size" only affects the compact results list, not the details panel's own (larger) image.

= 0.13.2 =
* Fixed: sites installed before v0.10.3 were still showing "Search for products…" in English to non-English shoppers. Those old versions wrote the untranslated default into the database the first time the tab was saved, and a stored value always beats a translation. v0.10.3 fixed the mechanism but left the frozen values in place; this release clears them. Only exact matches against the old English defaults are removed, so a deliberately customised label is never touched.

= 0.13.1 =
* Fixed: the collapsed trigger was still 79px wide instead of the configured 40px. The hidden submit button was clamped with `max-width: 0`, but CSS never shrinks a box below its own padding and border — its 14.4px of horizontal padding kept 29px on screen. Those are now zeroed while it is hidden.

= 0.13.0 =
* Fixed: the collapsed icon trigger was not compact at all. The widget root is `width: 100%`, so the "icon" layout stretched to the full width of its container and kept the bar's vertical padding — a small magnifying glass floating inside a wide, 74px-tall box. It now hugs its content and renders as a proper square button.
* New: "Icon trigger size" (24–72px, default 40) and "Icon trigger shape" (rounded, circle, square) on the Search bar tab. Together with "Collapsed icon style" from 0.12.2, the header trigger can now be matched to a theme's existing cart and account icons.
* The expanded bar adopts the same height as the trigger, so clicking still never resizes anything.

= 0.12.4 =
* Fixed: the remaining 8px of movement in the collapsed icon layouts. The submit button was hidden with `display: none`, which removed it from the flex line entirely — so the bar was only as tall as the icon until the button reappeared on focus and pushed the height up. It is now hidden with visibility and zero width instead, keeping its height reserved from the start, so the control is exactly the same size before and after a click.

= 0.12.3 =
* Fixed: the collapsed icon layouts grew 20px taller the instant the bar was clicked, because focusing the field added vertical padding that the collapsed state did not have. In a header — the one place this layout is meant for — that pushed the logo, menu and cart icons out of position on every click. Only the width animates now; the height is identical in both states.

= 0.12.2 =
* Fixed: on phones the expanded search bar ran off the right edge of the screen, cutting off the submit button. The collapsed-icon layout kept its desktop 220px input width inside the mobile overlay, and a flex item with `flex: 0 0 auto` cannot shrink — so the form demanded roughly 400px on a screen that had 382px to give. The input now flexes to the space available, and no form can exceed its container.
* New: "Collapsed icon style" (Search bar tab) — choose between the boxed trigger and a bare icon with no background, border or shadow, so the trigger can sit alongside a theme's cart and account icons. The box returns when the bar expands.

= 0.12.1 =
* Fixed: the animated placeholder froze mid-word as soon as the search field was clicked, leaving something like 'Prøv "sham' next to the cursor for as long as the field stayed focused. It "paused" by rescheduling itself without ever restoring the text, so a working animation looked like truncated output — most visibly in the icon layouts, which focus the field the instant they expand. Pausing now always restores a complete sentence.
* Changed: the rule is now simply "animates while the field is empty and unfocused". Clicking the bar settles it on the plain Placeholder text immediately, instead of up to 300ms later.
* Changed: the animation stops while the bar is scrolled out of view or the tab is in the background, and restarts from the beginning of a phrase rather than resuming mid-word.

= 0.12.0 =
* New: a "Texts" tab holding every one of the 21 strings a shopper can see — group headings, "No results", "Did you mean", stock badges, and all the add-to-cart wording. Leave a field empty to use the built-in text, which follows the site's language. Only two of these were editable before; the other nineteen could only be changed by editing a translation file.
* New: overrides pass through an `ssw_label` filter and are registered with WPML and Polylang, so a multilingual shop can translate them per language instead of being stuck with whichever one was typed in.
* Changed: "No results label" and "More results label" moved off the Autocomplete tab to the new Texts tab. Existing values migrate automatically on update.
* Note: the Texts tab changes wording, not language. Translating the plugin — including the admin screens — is still done with languages/smart-search-for-woocommerce.pot via Poedit or Loco Translate.

= 0.11.0 =
* New: a `.pot` translation template ships with the plugin, so any language can be added without touching the source. Danish is complete (244/244 strings); every other language falls back to English until a `.po` is added.
* New: "Product variations" setting (Search config) with three modes — parent product only, each variation as its own result, or variations grouped under the parent. Defaults to parent-only, so upgrading changes nothing until you pick a different mode.
* New: variation results carry their own title (parent name plus the attribute summary, e.g. "Hårbørste Pro – Blå, Large"), price, stock status, SKU and image, and link straight to the preselected variant rather than to the bare product page.
* New: variations can be added to the cart directly from the results panel. Previously anything non-simple only got a "view options" link, which for a variation is a redundant trip — the options were already chosen by picking that row.
* New: "Hide sold-out variations" — keeps the product searchable while leaving out the variations that are out of stock. Distinct from "Exclude out of stock products", which removes the whole product.
* New: "Max variations per product" caps how many variations are listed under one parent in grouped mode, so a product with dozens of them can't fill the entire dropdown.
* Fixed: the results page lost the search term. The plugin cleared `s` to stop WordPress applying its own search conditions on top of the ranked result list, which also emptied the page heading, the breadcrumb, the document title and the search box — every one of them read "Search results for “”". Core's search SQL is now blanked directly instead, leaving the term intact.
* Fixed: in the two new variation modes, a variable product's result row printed every child SKU in a row ("HBP-BLA-S HBP-BLA-L HBP-SRT-S HBP-ROD-L") directly above the same variations listed individually. The parent now shows its own SKU; the index still matches on all of them.
* Fixed: schema changes shipped in an update were never applied. `register_activation_hook` only fires on a real activation, so uploading a new zip over the old one left the table at the previous version — this release adds a version-checked migration that runs on load and triggers a reindex when the index structure changes.

= 0.10.3 =
* Fixed: product names could disappear from result rows entirely. The price refused to shrink and a sale item renders two prices side by side, so with a large thumbnail and a badge the row ran out of room and the title — the only flexible element — collapsed to zero width. The title now has a minimum width it can never be squeezed below, and the price may wrap instead.
* Fixed: "Show product description" showed the raw search index blob, so a product with no description displayed its own category and tag names run together as a sentence. It now shows the actual short description (falling back to the full description), pulled live from WooCommerce.

= 0.8.1 =
* Fixed (major): every Design tab value was being silently discarded before it reached the search bar. The stylesheet declared each variable as `--x: var( --x, fallback )` — a self-reference, which the CSS spec treats as a cycle that makes the property invalid on that element. Colors, font size, spacing, radius and z-index all fell back to theme defaults no matter what was configured. Baseline values are now declared without self-reference, on a lower-specificity selector so the saved settings always win.
* Fixed: the results dropdown could be painted over by theme sections below the header (a hero/banner with its own z-index). "Dropdown z-index" previously computed to `auto` because of the bug above, and even once set it only applied to the panel — the whole widget now establishes its own stacking context at the configured z-index.

= 0.8.0 =
* New: explicit "Bar height (padding)" and "Bar width padding" controls (Design tab) — the three Spacing presets were previously the only way to influence the bar's height, with no way to hit an exact value. Leave at 0 to keep using the preset.
* New: "Border width" control (0–8px, 0 = borderless) — border width was hardcoded to 1px.
* New: separate "Icon color", "Placeholder text color", "Submit button background" and "Submit button text/icon" colors — these were hardcoded to derive from the bar text / accent color, so e.g. a brand-colored submit button was impossible without custom CSS.
* New: "Font weight" (400–700) and "Letter spacing" controls.
* New: "Max form width (mobile)" (Search bar tab) — set a different maximum width below the breakpoint, e.g. a 480px bar on desktop that goes full width on mobile. Max width now flows through a CSS variable instead of an inline style attribute, which is what made a mobile-specific value impossible before (an inline style always beats a media query).

= 0.7.1 =
* Fixed: collapsed icon/overlay layouts (icon, overlay, icon_mobile, icon_desktop, overlay_mobile) showed two search icons side by side — the trailing submit button was never hidden alongside the collapsed input. The submit button now stays hidden until the field is actually focused/expanded, matching the input's own reveal behavior.
* New: optional "Icon trigger label" (Search bar tab) — shows a short text label (e.g. "SØG") next to the collapsed icon instead of a bare magnifying glass, matching FiboSearch's "placeholder text" option. Empty by default (icon only, unchanged from before).

= 0.7.0 =
* New: matched search text is now highlighted (accent-colored) inside product titles and category/tag/brand names in the results dropdown.
* New: a "Sale" badge now shows on discounted products in the results list, alongside the existing out-of-stock/backorder badges.
* New: quick "Add to cart" (with a quantity stepper, added via AJAX, no page reload) and "View options" — mirrors what shoppers expect from a details panel: simple in-stock products get instant add-to-cart, variable/grouped/external products get a direct link to the right place on the product page. New "Show quick add-to-cart button" toggle (Autocomplete tab), on by default.
* New: skeleton "shimmer" loading rows for the first search of a session, instead of a blank panel with just a small spinner dot.
* New: result rows fade in with a light stagger instead of appearing all at once.
* New: Danish (da_DK) translation — every admin-screen and frontend-dropdown string now follows the site's chosen WordPress language automatically, instead of defaulting to English regardless of locale.
* Fixed: default `show_badges` label said "(out of stock, etc.)" — now explicitly lists out of stock, backorder, and the new sale badge.

= 0.6.0 =
* Fixed: pressing Enter right after typing (without arrow-keying to a result first) fell through to the browser's native form submit and jumped to a separate, generic WooCommerce results page — the exact jarring "new page" behavior competing plugins are known for. The first result is now kept in sync between its visual highlight and the keyboard state, so Enter acts on it immediately, on the same page, like the rest of the dropdown already does.
* New: "Dropdown z-index" control (Design tab) — raises the results panel above a sticky header, cookie banner, or modal that some themes place on a very high z-index.
* New: a small "Sponsored by Smart Search" line at the bottom of the results dropdown. On by default (this build is 100% free); wired through a filter (`ssw_show_branding`) rather than a settings toggle, so a future Pro version could turn it off without needing a UI switch now.
* Changed: refreshed the admin header logo — magnifying glass with a small spark inside the lens, three-stop gradient badge — replacing the plain flat icon.
* Changed: default out-of-the-box look is a bit more "pro" — border radius 12px → 14px, shadow depth soft → medium, and the submit button now has a subtle colored shadow instead of a flat fill. Fully overridable on the Design tab as always.
* Fixed: the search input's `aria-expanded` attribute was hardcoded to "false" in the markup and never actually updated — now kept in sync with whether the results dropdown is open.

= 0.5.0 =
Full settings audit — every setting cross-checked end-to-end (schema → save handler → admin UI → what actually consumes it). Found and fixed 8 real disconnects where a setting existed and looked functional but didn't actually do what it claimed:

* Fixed: "Dark mode" (auto/on/off) only ever toggled the CSS `color-scheme` property — it never changed the search bar's own colors, so "Follow visitor OS setting" visibly did nothing. Added a real dark color palette (6 new color fields on the Design tab) that's now genuinely applied via `prefers-color-scheme` for "auto" and unconditionally for "on".
* Fixed: "Show brands" (Autocomplete tab) had no effect — no Brands group was ever rendered, unlike Categories/Tags which worked. Now wired up the same way.
* Fixed: "Group results" (Autocomplete tab) was saved but never read anywhere. Now actually controls whether the Products/Categories/Tags/Brands section labels are shown.
* Fixed: "Show category images" (Autocomplete tab) was never checked — term thumbnails always showed regardless. Now gated correctly.
* Fixed: Synonyms were silently tied to the "Typo tolerance" checkbox — turning that off (to only disable the fuzzy fallback) also silently broke synonyms, undocumented. Synonyms now work independently, whenever configured.
* Fixed: Analytics log cleanup ignored a configured "Retention days" below 30 — a hardcoded 30-day floor in the deletion job meant e.g. a 7-day setting didn't actually delete anything sooner. Now respects the real configured value (1-day floor, matching the field's own validation).
* Fixed: Autocomplete price display used a single stored number instead of the product's real price. Variable products now show their genuine price range instead of just the cheapest variation's price, and sale prices show the correct strikethrough — computed live per result instead of a snapshot that could go stale between reindexes.
* Fixed: "Exclude out of stock" was only applied at query time when no category/tag/product exclude/include rules existed — confusing dead-looking logic that (mostly) worked by accident because the indexer separately removes out-of-stock rows. Now applied consistently and combines correctly with other rules, closing a staleness gap too.
* Fixed: manually toggling a product's stock status (without quantity-based stock tracking) didn't trigger re-indexing, since only the quantity-change hook was wired up. Added the missing `woocommerce_product_set_stock_status` hook.
* Fixed: the "Out of stock" badge text was hardcoded English (not translatable), and WooCommerce's "on backorder" stock status never got a badge of its own. Both now translatable, and backorder has its own badge.
* Fixed: per-instance Style override (shortcode/widget/block) couldn't be explicitly set to "Modern" — every other preset was in the whitelist except the default one.
* New: the widget now supports a per-instance Style override too, matching the shortcode and block (previously widget-only had Layout, not Style).

= 0.4.5 =
* Fixed: 0.4.4's fix for the "field inside a field" preview bug wasn't complete — excluding our own admin.css rule wasn't enough, because WordPress core's own default wp-admin text-input styling (grey border, 2px radius) also had enough specificity to override frontend.css's `.ssw-search__input` rule. Added a targeted, high-specificity override scoped to the preview so the real search input renders exactly as it does on the live site — no visible box of its own, just text directly on the search bar's own background.

= 0.4.4 =
* Fixed: the Design tab preview looked like "a search field inside a search field" — a real, confirmed bug. The preview renders the actual search-bar markup, and the admin screen's own generic input styling (`input[type="text"]`) was specific enough to override frontend.css's `.ssw-search__input` rule, painting the real search input with the admin's white/bordered/8px-radius look on top of its intended transparent/borderless one. That's also why "Border radius" looked disconnected from what looked like the input's own frame — that slider only ever controlled the outer `.ssw-search__form` shape, which was the correct behavior the whole time; the inner box simply shouldn't have been there. Admin input styling is now explicitly scoped to exclude the real search field.

= 0.4.3 =
* New: animated ("typewriter") placeholder — type a set of rotating phrases into the search field's placeholder, one character at a time, pause, delete, and move to the next. Configurable phrase list and speed (Search bar tab). Automatically disabled for visitors with "reduce motion" enabled.
* Fixed: a checkbox immediately followed by a dependent field ("Show submit button" + its button-label input, "Overlay on mobile" + its breakpoint field) was separated only by a `<br>`, so the two visually touched with no breathing room. Both now have proper spacing.

= 0.4.2 =
* Fixed: dropdown arrows on the settings screen overlapped the last 1-2 letters of the selected option (e.g. "...no shadow)", "...OS setting") on every `<select>`. Caused by our own uniform input padding shrinking the space WordPress reserves for its native dropdown-arrow icon on a select that's sized to fit its text. Selects now get dedicated padding and a shared minimum width.
* Fixed: the "live" preview on the Design and Search bar tabs wasn't actually live for most fields. Two separate causes: (1) the base CSS variables (border color, background, etc.) are normally printed once on the public site only — the admin screen never got that baseline, so any variable the user hadn't personally touched yet was undefined, which silently invalidated whole shorthand properties like `border` instead of just the one value; (2) the JS for style-preset/layout/shadow/animation/button-shape looked for a `data-ssw-root` marker that was never actually present in the markup, so those five controls never updated the preview at all, only the color pickers and sliders did. Both are fixed — every control now updates the preview instantly.

= 0.4.1 =
* Fixed: the icon-collapsed layouts (icon / overlay / icon_mobile / icon_desktop / overlay_mobile) never actually collapsed — the input's `flex-grow` was silently overriding `width: 0`, a classic flexbox gotcha. All five icon-based layouts now genuinely shrink to just the icon.
* Redesigned the admin settings screen: pill-style tab bar instead of the default WordPress nav-tab strip, softer cards, indigo accents, custom input/focus styling — distinct from the stock WP "form-table" look most other search plugins ship unmodified.

= 0.4.0 =
* Fixed: "Search bar → Breakpoint" was a number field that did nothing — the mobile/overlay CSS was hardcoded to 992px regardless of what was entered. It now genuinely drives the responsive rules.
* New: two more layout modes that respond to real screen width — "Icon on mobile, bar on desktop" and "Icon on desktop, bar on mobile" — plus a third that goes further than FiboSearch offers, "Icon → overlay on mobile, bar on desktop".
* New: Product image size control (autocomplete thumbnails), plus a "Mobile overrides" section — font size, icon size, and image size can now all be set differently below the breakpoint instead of one fixed value for every device.
* Changed: default style is now "Modern" (soft shadow, larger radius) instead of "Minimal" (flat, no shadow) — the old default was visually closer to FiboSearch's own default than intended. "Minimal" is still available as an explicit choice.
* Changed: default accent color is now indigo instead of purple, to stop the default look reading as a copy of FiboSearch's brand color.

= 0.3.1 =
* Added the `Requires Plugins: woocommerce` header (plugin file + readme) so WordPress itself (6.5+) flags WooCommerce as a hard dependency before activation, instead of relying only on this plugin's own runtime check.

= 0.3.0 =
* New: per-placement layout override — put an icon in the header nav and a full bar elsewhere, from the same install. Set via shortcode (`[smart_search_bar layout="icon"]`), the widget's Layout field, or the block's settings panel.
* New: "Icon → full-screen overlay" layout, for a command-palette-style search triggered from a header icon.
* New: shortcodes now work inside nav menu item labels (Appearance → Menus → Custom Link), so the search icon can live directly in the header without a separate widget area.
* New: Design tab — shadow depth, results-panel animation, icon size, and submit button shape are now all controllable, on top of colors/radius/spacing/dark mode.
* Fixed: default appearance no longer looks flat — the "minimal" preset kept a `box-shadow: none` override that cancelled the bar's shadow; default radius, border, and spacing were also refined.
* Improved: the results panel now animates in instead of appearing instantly (respects prefers-reduced-motion).

= 0.1.0 =
* Initial release: index + search engine, autocomplete UI, full design customization, analytics, indexer, shortcode + widget.
