Skip to content

Changelog

Every release of Moonivo Image Map, newest first.

Every notable change, newest first. Versions follow Semantic Versioning.

1.8.1 · 2026-08-27

Fixed

  • The first scene has its own name now. A map's first scene took its label from the project name — the field the editor calls internal and promises is not shown on the front office. It was, as the first button of the scene switcher, which also meant a project holding five scenes had to be named after one of them. Scene 1 is renamed like any other scene: double-click it in the Builder strip. Existing maps are untouched — until you rename it, the project name is still what visitors see, exactly as before.
  • Repairing the database schema actually repairs it. The internal check that heals a missing column after an interrupted update returned early whenever the stored schema marker already matched the module version, which is precisely the case it exists for.

1.8.0 · 2026-08-26

Added

  • Product / category picture in the card. A card whose shape links a product or a category can now show that product's cover image (or the category picture) inside the tooltip. Enable it in Styles → Card (Tooltip) Style, choose the size (small / medium / large, or your own px value), the corner radius, and where the picture sits relative to the text (left, right, above or below). Individual shapes can override the global setting to always or never show their picture, from the shape's Card panel. The picture links to the same page as the card title. Off by default, so updating the module leaves existing maps looking exactly as they did.
  • Scene Switcher. A single project can now hold several scenes — each its own image with its own shapes — that visitors switch between on the storefront (e.g. Kitchen / Bedroom / Living Room photos of the same product line, each individually shoppable). Manage scenes from a strip in the Builder tab (add/rename/reorder/delete, upload an image per scene); the project's own image is always "Scene 1" and can't be removed. Nothing is written to the database until Save, matching the rest of the editor — scene rows/images are AJAX-immediate like the project's own image, but every scene's drawings persist only on the single Save submit.
  • Scene Switcher customization (Styles tab). A new "Scene Switcher" panel controls the visitor navigation style (pill buttons / arrows / dots / combinations) and its position via a visual picker — two strips for outside the image (above / below) and six spots to overlay it directly on the image (any corner, or top/bottom center) — instead of a plain dropdown list. The switch transition (slide/fade/none), its speed, and full color control over buttons, arrows and dots (normal + active states) round it out. Settings are project-wide and only apply once a project has more than one scene. Overlay placements sit inside the image's own box, so they stay put even when a lookbook sits beside the map.
  • Cards stay inside the picture. A tall card — a showcase with several products, say — used to run off the top or bottom of the image. It now stops short of the edges and scrolls within itself, and Styles → Card (Tooltip) Style has a Card max height if you want it shorter still (0 = as tall as the image allows). Cards also render above the scene switcher instead of sliding under it.
  • One scrollbar style for the whole map. Styles → Card (Tooltip) Style → Scrollbar style picks how every scrollable part of a map looks — the card, the product list and the filter row: a slim custom bar in the colour you choose, hidden (still scrolls), or the browser default.
  • Filter chips can stay on one line. Filter chips layout keeps them wrapping onto more lines as before, or puts them on a single line the visitor swipes/drags sideways, with small arrows on pointer devices.
  • The product filters can sit inside the product list, and follow the room. When a map has a synced product list, the filter chips now live at the top of that list instead of above the picture, and each scene shows only the tags its own shapes carry — so the bar always matches the room on screen. Switching rooms starts fresh — the previous room's selection is cleared, since the next room lists its own tags — and a new All chip clears the selection at any time. Where the row or the list continues past the edge, it fades out instead of being cut mid-chip or mid-card.
  • Scene switcher arrows now sit on the picture. With a product list beside the map, the back arrow was anchored to the whole row and landed on top of the list; both arrows now follow the image itself, like the overlaid button bar.
  • "Tabs" navigation style for the scene switcher. Alongside the separate pill buttons, arrows and dots, the switcher can now render as a segmented bar: every scene name inside one rounded track, the current one filled. Pick it in Styles → Scene Switcher → Navigation (on its own, or combined with arrows). Inactive tabs are plain labels — no frame, no fill — and the filled marker travels between them; how it travels is up to you in Tab indicator: slides to the tab, fades across, or no movement at all. It uses the same colour settings as the buttons, works in every position (above/below the image or overlaid on it), and keeps the same keyboard and screen-reader behaviour.
  • Style presets restyle the scene switcher too. Applying a preset (Classic, Minimal Light, Dark Elegant, Bold Commerce, Warm Amber, Fresh Teal) now also recolours the switcher's buttons, arrows and dots to match that palette. Only colours are touched — the navigation type, position and animation you picked are left exactly as they were.
  • Per-scene rendering, front to back. Every scene renders as its own server-rendered panel (no client-side HTML building), so the lookbook, product filters, reveal animation, marketing events (GA4/Meta) and live catalog data (price/stock/synced titles) all work per scene automatically through the existing rendering pipeline. Switching is keyboard- and swipe-accessible and respects prefers-reduced-motion.
  • Per-scene analytics. The click-density heatmap and the "Shape clicks" overlay in the editor now filter by the scene currently being viewed (new scene_id column on the analytics table, added automatically).
  • Export/Import/Backup/Restore carry scenes. A project's extra scenes (images, shapes, names) are included automatically in every archive format; restore safely cleans up scene image files that become orphaned.

Changed

  • The bundled demo content now shows what 1.8.0 can do. "Add demo content" installed three single-image maps that predated most of the current feature set. It now sets up a five-room map with the segmented scene switcher, a synced product list and per-room filters (placed on the home page), a "shop the look" room with the list beside it, and the filled-shapes showcase — all with lighter images than before. As always, the demo only appears on a shop that has no maps yet, and every product and category it links is matched to your own catalogue.
  • Removed a leftover editor script that the configuration page still loaded but that had done nothing for several versions (it looked for markup the editor no longer renders, and the copy/paste it once provided is built into the editor). One less request on every configuration page load.
  • Per-breakpoint (tablet/mobile) images and the responsive D/T/M visibility tools remain tied to the project's own image (Scene 1); the Responsive toggle is disabled while editing another scene to avoid ambiguity, and re-enables automatically when you switch back.

Fixed

  • Duplicating a project now keeps its extra scenes. Duplicate previously copied only the project's own image (Scene 1); a Kitchen/Bedroom/Living Room project silently lost every other scene on duplicate. The copy's scenes now travel with it (images are reused, not re-uploaded, matching how the project's own image is already reused).
  • Long scene names no longer wrap inside the switcher buttons. A multi-word scene name could wrap across two or three lines, especially cramped when the button sits overlaid on the image (inside_* positions). Button text now truncates with an ellipsis (full name still available on hover via a tooltip).
  • Keyboard focus indicator on the scene switcher. Tabbing to a scene button, dot or arrow now shows a visible focus ring, matching the outline already used elsewhere on the map (shape hotspots, tooltip buttons, lookbook items).
  • No more visible "jump" on load. The scene switcher's button/dot bar is positioned by JS (it tracks the image's own box). It now stays hidden until that first positioning pass completes, then fades in — previously it briefly rendered full-width/uncentered before snapping into place.
  • Uninstalling removes the Scene Switcher's tables too. The two new tables were left behind in the database after an uninstall; they are now dropped with the rest.
  • Uninstalling now clears every setting the module stored. Your saved style presets and the two marketing on/off switches stayed in the configuration table after an uninstall. All of the module's settings are removed with it.
  • Demo content links its showcase products to your catalogue. The demo remapped the product and category a shape links to, but not the extra products listed on a multi-product showcase card, so on a shop without those exact ids that card came up empty.
  • Deleting a project's image no longer deletes it out from under a copy. Duplicating a project reuses the original's image file rather than copying it, so clearing the image on either one used to remove the shared file and break the other. Uploaded images are now only deleted once no project and no scene references them any more — the same rule the scene images already followed, applied everywhere (image delete, restore-wipe). Restore also stopped deleting files before the rows were gone.
  • Click and add-to-cart analytics record which scene they happened on. Only the heatmap carried the scene, so the heatmap and the per-shape click report disagreed on multi-scene projects; every click/cart was filed under Scene 1.
  • Multi-product showcase cards accept a comma-separated product list again. The editor writes a list of ids, but a hand-edited or imported project could carry the older comma-separated string, and those cards silently rendered without live prices, stock or add-to-cart.
  • The analytics chart no longer floods the browser console. A period where every day had zero clicks divided by zero, and the resulting invalid coordinates were rejected by the browser for every point on the chart.
  • Product filters now work on every scene. With more than one scene, the filter bar was built from the first scene only: clicking a filter visibly did nothing on any other scene (it was quietly filtering the hidden first one). Filters now apply to whichever scene is showing, and a chosen filter stays applied as the visitor switches scenes.
  • Scene switcher buttons no longer wrap onto separate lines on narrow screens. A centered overlay bar was only being offered half the image's width to lay out in, so on a phone two scene buttons that would comfortably fit stacked one per line instead.
  • Deleting a project now deletes its images too. Removing a project cleared its database rows but left every uploaded image behind in the module's uploads folder, with nothing pointing at them — a project with ten scenes left ten files, and they accumulated with every delete. The files are now removed with the project, and only once no other project or scene still uses them (duplicating a project deliberately shares the original's files, so deleting a copy leaves the original untouched).
  • Adding to cart from the map no longer loses your place on the keyboard. After the theme's cart confirmation closed, focus was dropped at the top of the page instead of returning to the shape the visitor bought from, so keyboard and screen-reader users had to tab all the way back to the map.
  • Selecting a shape no longer overwrites it with the previously selected one's settings. Opening a shape refills the inspector, and the syntax-highlighted Custom CSS box reports every refill as an edit. That report was treated as a real edit, so the fields not yet refilled — card, action, label, breakpoints — were written back onto the shape just opened: it inherited whatever the previous shape had, or was blanked when it was the first shape opened after loading the page. The changes only reached the database if you then pressed Save. Refills are now recognised as such and ignored.
  • Scene switcher buttons no longer drift when switching scenes. The bar was being positioned from a measurement taken on the switch animation's first frame, so it locked onto a transient offset and stayed there — buttons landed a few dozen pixels off, differently each way you switched. Overlay ("over the image") placements now live inside the image box itself and are positioned purely by CSS, and the above/below placements measure layout values that ignore the animation. The bar also no longer squashes into a narrow, one-button-per-line column when the page hasn't finished laying out.
  • A map can no longer stay invisible after loading. The picture fades in once the browser reports the image as loaded. If that report was missed — a tab in the background when the map was built, or an image that finished loading in the split second between the two checks — the fade never started and the map stayed blank (its hotspots drawn over nothing). The fade now always completes.
  • An image used only as a tablet/mobile version is no longer deleted with another project. Uploads are kept as long as anything still points at them, but the per-breakpoint (tablet/mobile) pictures were not counted as pointers: deleting a project that shared its main image with another project's mobile version removed the file, leaving that second project without a picture on phones.
  • The dot-style scene switcher no longer jumps out of the picture on a phone. An overlaid button/tab bar steps outside the image below a width where it would cover too much of it — dots are only a few pixels tall and always fit, so they now stay put on the image on every screen size instead of following the same rule.
  • An embed in a narrow column no longer pushes the page sideways. A project whose layout is set to "Theme container" re-applied the theme's own container width when it was embedded in page content. Pasted into a narrow column — a category description next to a filter sidebar, for instance — that forced a container-wide block into a much smaller space and the whole page gained a horizontal scrollbar. An embed now simply fills whatever holds it.
  • "Add all to cart" no longer opens a cart popup per product. The bundle button fired every product's add-to-cart at once and told the theme the cart had changed after each one, so a five-product showcase opened five cart confirmations stacked on top of each other — and the simultaneous writes raced against the same cart. Products are now added one after another and the theme is notified once, so the visitor gets a single confirmation showing the last product added and the totals for the whole cart.
  • The cart confirmation shows the product again when it has variants. Adding from a card told the theme only which product had been added, not which combination — so for a product with variants the cart block could not resolve what to display and the popup came up with "no image available", no name and no quantity, even though the right item was in the cart. The combination (and customization) now travel with the notification, and the confirmation shows the picture, name, chosen variant and quantity.
  • A card no longer opens scrolled down after a tall one was scrolled. All of a map's cards share one element, which has a few pixels of scroll range even when it needs no scrollbar (the invisible halo that bridges the gap to its shape overhangs it). After scrolling a tall showcase card, every card opened at that offset — first line against the top edge, as if its padding had gone — until the tall one was scrolled back up. Cards that do not scroll now always open at their top.
  • The product list no longer squeezes the map in a narrow column. Beside the map, the list kept its full width until the map had less than 200px left, so an embed in a category column could end up with a ~280px picture and its hotspots crammed into a corner while the list sat comfortably next to it. The list now drops below the map as soon as the map would fall under a usable width. Full-width maps are unaffected.
  • Updating the module now reaches visitors who were already on the shop. The map's script and stylesheet were served from an address that never changed, behind the week-long browser cache PrestaShop puts on such files, so after an update a returning visitor could keep running the previous script against the new page for days — the map's newest buttons or behaviour simply missing for them. Both files now carry their own version in the address, on every supported PrestaShop version, and updating the module also refreshes the theme's combined script bundle for shops that have Combine, Compress and Cache switched on.

1.7.0 · 2026-07-03

Fixed

  • Marketplace usability: documentation lives inside the module. The configuration page's Docs link now opens the bundled user guide (shipped as self-contained HTML in EN, FR, ES, IT, DE, PL and LT, chosen by the back-office language) through an authenticated module endpoint — no external websites or e-mail addresses anywhere in the interface; support goes through the PrestaShop Addons contact form.
  • Marketplace review fixes (debug-mode PHP warnings). Three Undefined array key warnings found by the Addons review team (fatal on the edit page in debug mode) are fixed: the editor form now receives every global-style key it reads — g_hotspot_pulse_intensity, g_card_border and g_anim_intensity were saved by the editor but never read back, and a safety net now fills any style key missing from older rows; the projects-list AJAX refresh assigns the preview URL it links (previously only the full page render did); and project exports no longer read created_at/updated_at fields that the projects table never had.
  • Addons compatibility & security report. Cleared the PrestaShop marketplace validation report: (1) removed trailing commas from function calls (invalid on PHP 7.1/7.2) and pinned php-cs-fixer to array-only trailing commas so they cannot return; (2) the configuration page now self-heals — ensureDatabaseSchema() creates the base tables if they are missing (via a shared Installer::ensureTables()), so opening the config page around a partial/missing install no longer throws "table doesn't exist" in debug mode; (3) hardened the uploaded/base64 image save against path traversal (basename + strict allow-list on the filename); (4) hardened the bundled-template loader against path traversal / SSRF by looking the key up in an allow-list built from the actual template files (the user value is only an array key, never a path); (5) rebuilt the product-info preview and the toast helper with DOM APIs and text nodes instead of innerHTML, and removed an unused, never-rendered template-picker block together with its two AJAX endpoints (dead code that the security scanner kept flagging; the bundled template data was not even shipped); (6) dropped the legacy mod='impro' parameter from every {l} template tag; and (7) shipped en-US identity catalogues and taught the t() helper to skip the translator when the catalogue lacks the id — the output is identical, but PrestaShop no longer logs "Translation not found" during installation, which the validator counted as translation errors.
  • Accurate click analytics. The per-shape report no longer counts heatmap samples as clicks (every map click also records an anonymous heat point, so totals were double-counted and an unlabelled "—" row appeared), and the project-name join is pinned to one language — on multilingual shops every count was multiplied by the number of shop languages.
  • Showcase layout: no more gap on wide screens. When the map image is narrower than the screen (small source image + wide monitor), the showcase list was pinned to the far edge with a hole between it and the map. The map no longer stretches its box past the image — the map+list pair now sits together and follows the canvas alignment (center/left/right).
  • Editor preview resolves synced content. The themed editor preview now runs the UNSAVED state through the same server enrichment as the storefront, so synced card titles (product/category names) and live prices/badges show in the preview instead of an empty card.
  • Multilingual filter tags. The per-shape "Filter tag" is now a multilingual field: shapes with the same default-language tag form one filter button, and the other languages only change the button's label (legacy single-string tags keep working). The template-apply confirmation in the editor is also translatable now.
  • Language audit hardening. The map image's alt text and the admin project lists now use the current language's project name (previously an arbitrary first row); multilang card texts fall back to the first available value on shops where language id 1 was removed; and "Load product data into card" now fills every language tab with that language's product name and short description (it used to fill only the first tab).
  • Shape links now open the localized page. Product / category / CMS actions built their target URL client-side without a language, landing visitors on the default-language page. The render now resolves the real localized URL server-side (action.url) and the storefront prefers it — a click on a /fr/ page opens the /fr/ product page.
  • Embedded maps now render in the page's language. Embeds (CMS pages, category/product descriptions) loaded their content through a URL without the language prefix, so on multi-language shops the map always rendered in the default language. The embed AJAX now uses a language-aware endpoint — a map on a /fr/ page renders in French.
  • Storefront texts now follow the shop language. The customer-facing strings ("Add to cart", "Add all to cart", "In stock", "Out of stock", "Quantity") were always shown in English; they are now translatable (PrestaShop translation system) and the module ships ready-made translations for French, Spanish, German, Italian, Polish, Dutch, Portuguese (pt + Brazilian pt-BR) and Lithuanian — on all render paths (page embed, home hook and standalone/iframe API).
  • Drawing has priority over selection. While a drawing tool is active, clicking an existing shape no longer selects it (you can draw right over other shapes). When drawing a polygon, dragging the canvas pans the (zoomed) view without dropping a point — a point is added only on a clean click.
  • Embed "Get code" copies clean URLs. The copied iframe snippet no longer HTML-encodes the & characters in the URL (& → &), so the pasted code works as-is.
  • PS Addons validator hardening. Added the missing :'UTF-8' charset to a JavaScript escape in the admin template (XSS-safe), switched admin JS translations to the js=1 form, corrected exception handling in the image helper (a namespaced catch (Exception) never caught the thrown \Exception), typed the admin controllers' $module as Impro, made Tab::$active a boolean, removed dead methods, added the standard license header to two index.php stubs and an upgrade file, and set prepend-autoloader: false in composer.json.
  • Coding standard & static analysis cleanup. The codebase now fully matches the PrestaShop coding standard (php-cs-fixer reports zero changes). The internal ImproRepository alias was replaced everywhere with the autoloaded Moonivo\Impro\Repository\ProjectRepository, and redundant method_exists()/=== null guards were removed, clearing the validator's compatibility notes.

Added

  • Style presets & unsaved-work protection. Six built-in style presets (Classic, Minimal Light, Dark Elegant, Bold Commerce, Warm Amber, Fresh Teal) apply a full coordinated look — shape colours, hotspot style, card, button and sale badge — in one click, from the Global styles panel; when creating a NEW project the picker is highlighted so you start from a good-looking base ("Classic" doubles as a reset to module defaults). You can also save the current styles as your own preset (per shop, listed separately under "My presets", deletable, same name overwrites), and every preset apply first snapshots the styles you had — a "Previous styles" chip toggles between the old and the new look, so an accidental apply is always reversible. The editor also mirrors every change to the browser's local storage: if the tab is closed without saving, reopening the project offers to restore the unsaved draft (cleared automatically on save).
  • Readable annotations on small canvases. Hotspot dots, sale badges and on-shape labels now keep a constant on-screen size: when a map renders narrower than ~1200px (embeds in category/product columns, mobile), they scale up proportionally instead of shrinking with the image — shapes themselves keep scaling exactly with the image, as they must. Recomputed live on resize and layout changes.
  • Product picker for the multi-product showcase. The "Multi-product showcase" field is now a product search with removable chips instead of a raw comma-separated ID list (IDs are still stored the same way, so existing maps are untouched).
  • Nicer editor inputs. The action "URL / code" field is a monospace, resizable code box; the sale-badge colours use the same swatch+hex inputs as the other colour fields.
  • Live prices, sale badges & clickable titles. Cards that link a product now show the live catalog price (a hand-typed price-only body is superseded automatically), with a struck-through old price when the product is on sale (colour configurable, red by default). A sale badge can show the discount percent (e.g. -20%) or a custom translatable text ("Sale" by default), with global style options (pill/rounded/square preset, size, background and text colours) and three placement toggles: on the card, in the product list, and pinned to the shape on the map itself (top-right corner for shapes, centred above the dot for hotspots). Card titles that link a product/category/CMS page are now clickable (same look, opens the localized page). Multi-product showcase rows show the old price + badge too.
  • Synced card titles. When a shape links a product or a category, a new "Sync card title" toggle (on by default for newly linked shapes) makes the card title follow the live catalog name in the visitor's language — always up to date, translated automatically, no retyping. Turn it off to write your own title (the previous behaviour; existing maps are unchanged). The lookbook list shows the synced name too.
  • Rounded & curved polygons, edited on-canvas. Polygons are no longer limited to straight edges. Each corner shows a small radius dot just inside it — drag it to round all corners evenly, or Alt+drag to round only that one (per-corner radii). Click a point to activate it and show its tangent; drag the blue control dots to bend the edges into smooth bezier curves (pen-tool style), Alt+drag a point to pull out a curve handle, Alt+click to make it sharp again. While drawing a polygon, Alt+drag drops a curved point immediately. On polygons with many points only the active corner's dot is shown to avoid clutter. Everything is saved with the project, travels through export/import and renders identically on the storefront.
  • Project preview. A Preview button on each project in the list opens the map in a new tab on a self-contained page styled with your storefront theme (fonts/styles, no site header/footer) — how it will really look embedded in a page. The editor gets the same themed preview in a near-fullscreen modal (bottom bar button), reflecting unsaved edits, with Desktop / Tablet / Mobile width switches.
  • Back-office translations: French, Spanish, Italian, German, Polish, Lithuanian. The whole module configuration and editor UI (630+ strings, including all canvas/editor JS labels and the TinyMCE "Insert Image Map" dialog) ships fully translated into French, Spanish, Italian, German, Polish and Lithuanian. Any other language can be translated via the standard PrestaShop translation interface.
  • Keyboard-shortcuts help. A full shortcuts reference (selection, editing, history, movement, zoom, polygon points, corners & curves, drawing) is available from the new Shortcuts button in the canvas toolbar, the ? button by the zoom bar, or by pressing ?.
  • Multi-product showcase cards. A single shape can now feature several products at once. In the shape's Card panel, a new "Multi-product showcase" product picker (search + removable chips) selects the products; the card then lists each product with its live name, current price (specials/tax included) and stock badge, a per-product Add to cart button, and a single "Add all to cart" bundle button — all via AJAX with no page reload. Product data is resolved live at render time (never cached/stale), and disabled or out-of-stock-and-unsellable products are skipped automatically. Cards left empty keep their previous single-product/link behaviour, so existing maps are unchanged. Both bundled demo showcases now ship with a multi-product card.
  • Builder toolbar polish & consistent toggles. All on/off controls across the configuration screen now use one unified switch component (instead of a mix of native checkboxes and unstyled Bootstrap switches), vertically centred to line up with the other controls. The builder's snap/align toolbar was tidied: aligned on one row, labels share a single typographic style, logical groups have clear spacing, the align tools appear only when a shape is selected (no blank gap), and the "Responsive" toggle anchors to the right. Snap grid is now sized relative to the image (Off / Fine / Medium / Coarse) with lines that scale to stay visible on large images — the old fixed 8/16/32 px grid was invisible on big photos. Removed the "Start from a template" feature (its generic shapes were placed at fixed coordinates that didn't match real images).
  • Marketing & analytics events. The storefront pushes events for GA4 (dataLayer + gtag) and Meta Pixel (fbq) on hotspot click, lookbook click and add-to-cart (impro_add_to_cart / AddToCart). The calls are no-ops when no tag is present, so they integrate with existing consent gating without extra setup. New module-settings toggles let you enable/disable GA4 and Meta Pixel independently (both on by default), with in-page help on how to connect each tag.
  • Variants in the card. When a listed product has combinations, the card shows the attributes plus a quantity field; choosing a combination updates the price and stock badge live and adds the exact variant (per-product and "Add all to cart" both send id_product_attribute + quantity). Colour attributes render as visual swatches (hex colour or texture image, like the native product page); other attributes use a dropdown. Products without combinations are unaffected. Prices/stock are resolved per-combination (specials/tax/currency aware).
  • Product thumbnails in the card. Multi-product cards now show each product's cover image next to its name.
  • Showcase click pins the card. Clicking a showcase (lookbook) item now opens and pins its card: the tooltip stays put (it no longer auto-hides on hover-out, and hovering other shapes won't steal it) so the card and its add-to-cart are fully usable, and the item shows an active highlight. Clicking anywhere else on the map dismisses it; a second click on the same item follows the product/category link. Previously the click navigated immediately, so the card's add-to-cart was unreachable.
  • Scheduled maps. A project can define a visibility window (Show from / Show until, store timezone) in the Canvas settings. Outside the window the map is hidden everywhere — home page, HTML embeds and the API. Either bound may be left empty for open-ended scheduling.
  • Product filters on the map. Tag shapes with a "Filter tag" and enable "Product filters" to give visitors a toggle bar above the map (e.g. Chairs / Lamps / Tables). Toggling a tag shows only the matching shapes and hides their lookbook items too. Both demo showcases ship with filters.
  • Reveal animation (timed / on-scroll). Each shape can appear after a delay or when the map scrolls into view (staggered), fading the shape and its caption in. Skipped for reduced-motion visitors. The demo showcases reveal their shapes on scroll.
  • True click-density heatmap. A new Heatmap view (editor Builder toolbar) renders a smooth density gradient from the actual click coordinates recorded on the storefront — anywhere on the image, including spots with no shape/hotspot — so you can see where visitors expected something to be clickable. Coordinates are anonymous (no personal data), normalized 0..1, sent via sendBeacon. The previous per-shape bubble overlay is kept and renamed Shape clicks (clicks counted per shape). Safeguards keep it light: a per-page-view click cap (anti-flood), automatic 90-day retention of heatmap points (batched prune, no cron), and a composite index for fast aggregate queries.

1.6.2 · 2026-06-21

Added

  • One-click demo content. When a shop has no image maps yet, the configuration screen offers to import a set of ready-made demo maps (interactive room scenes with hotspots, filled shapes, cards and a synced product showcase list). Product/category links are kept where those items exist and otherwise remapped to real catalogue items, so every link works on any store. You choose whether to show the main map on the home page right away or just import them and place them yourself later. The demo content is shipped with the module, so it can be re-imported any time the shop is emptied.

Changed

  • Faster loading with no layout shift. The map image is now rendered server-side with its width/height, so the browser reserves the correct space immediately (the page no longer jumps while the canvas loads) and starts downloading the image during page parse instead of waiting for the JavaScript. The front script draws the interactive overlay on top of that image. The home-page map gets high fetch priority; embedded maps load lazily. Embedded maps now reserve their space too — the embed code carries the map dimensions, so a placeholder of the right size is shown while the map loads over AJAX (no more jump). The embed also preloads its image in parallel with that request (it carries the image path), so the picture is already cached when the map is inserted — no waiting for the round-trip first. The reserved height now accounts for the showcase list beside the map (so it’s no longer too tall), and the list stacks below the map automatically in narrow columns instead of squashing it. Works the same in CMS pages, category descriptions and anywhere else an embed is placed. The bundled demo images were also downsized (≈3.5× smaller) for quicker first paint.
  • More forgiving hotspots. Each hotspot now has a larger invisible hit area, so hovering or tapping near the dot — not exactly on it — still opens the card. The catch area is extra-large on touch screens (≥44px tap target).
  • The “Move to top” hook-position action now truly renders the map first on the home page: it shifts the other modules down instead of only setting its own position number (which could tie with modules already at the top).

Fixed

  • Mobile/tablet two-tap reliability. On touch screens the first tap on a shape now reliably just opens its card, and only a second tap follows the link (product/category/page). Previously some mobile browsers reported the tap’s click with an empty pointerType, so the very first tap both opened the card and immediately navigated away.
  • Lookbook edge spacing in full-width layout. When the map uses the full-width layout, the showcase list no longer sticks to the screen edge — it gets a small side inset, plus a small top inset on the list cards only (the map/canvas keeps its full-width top edge). Theme-container layout is unchanged, since the container already provides spacing.
  • Lookbook “left” placement. When the synced product list was set to the left side it still rendered on the right (the DOM reorder and the CSS row-reverse cancelled each other out). The list now correctly sits on the chosen side.

1.6.1 · 2026-06-21

Added

  • Per-breakpoint images (mobile art direction). Upload an optional separate image for tablet and mobile so a wide hero no longer shrinks to a tiny strip on phones. The storefront swaps the image and viewBox by breakpoint; shapes keep their own per-breakpoint placement.
  • Responsive editing tools in the builder: per-shape D / T / M visibility chips in the shapes list (one click to make a shape desktop-only, mobile-only, etc.) and a "Fit shapes" button that repositions all shapes proportionally onto a breakpoint image.
  • Uninstall confirmation — the admin is now warned that uninstalling permanently deletes all projects, images, and analytics.
  • Image credit caption (optional). A new per-project “Image credit” field shows a small caption on the map (HTML/links allowed, e.g. a photo attribution). Off by default.
  • Showcase slider. The product showcase list now scrolls with its own up/down arrow controls instead of the browser’s scrollbar, so it stays tidy and signals “there’s more” when the list is taller than the map. You can also swipe it on touch and drag it with the mouse (a real drag won’t accidentally open a product). On phones you can limit how many items show at once (default 3; 0 = show all) — the rest are reached by swiping/arrows; this setting affects mobile only.
  • Loading animation (optional). A skeleton placeholder shows while the image loads and the whole map fades in when ready. Toggle it per project in the Canvas settings (on by default); it automatically respects the visitor’s reduced-motion preference.

Changed

  • Cleaner responsive editing. When previewing a breakpoint, the editor shows only the shapes visible on it (matching the storefront) with a "Show hidden" toggle, instead of greyed-out clutter.
  • The Responsive toggle now persists: it stays on after save/reload and auto-enables when a project already has per-breakpoint settings. New shapes drawn while previewing tablet/mobile default to that breakpoint.

Fixed

  • Migrated the deprecated PrestaShop hooks header / backOfficeHeader to their modern equivalents displayHeader / displayBackOfficeHeader, removing deprecation warnings (existing installs are migrated automatically on upgrade).
  • Multishop (path-based shops): the map image now loads from the shop's physical path instead of its virtual URL prefix — previously the image 404'd on a path-based secondary shop (e.g. /shop2/).

Maintenance

  • Large internal refactor of the main module file into a layered src/ architecture (services, repository, presenter, installer) and a shared front/editor caption renderer — no change to behaviour, easier to maintain. Added a unit-test suite for the core logic.

1.6.0 · 2026-06-09

Added

  • Add-to-cart buttons on shape cards (tooltips), so visitors can buy directly from the image map.
  • Conversion analytics — clicks and add-to-cart conversions are now tracked per shape, with CTR and a daily timeline in the admin analytics panel (new event_type column).
  • Conditional display per shape (show/hide by login state, customer group, or language).
  • Per-breakpoint position & scale per shape (nudge/resize a shape for tablet/mobile).
  • Lookbook layout — a synced product list rendered beside the map.
  • A/B testing — split visitors between two project variants via a cookie.
  • Accessibility improvements (respects prefers-reduced-motion, focus-visible outlines).
  • Per-project Custom CSS.

1.5.0

Added

  • Caption/label system for shapes, label style presets, and global label defaults.
  • Database schema auto-upgrade safeguard (ensureDatabaseSchema).

1.0.4

Added

  • "Image Maps" admin menu tab (AdminImpro).

1.0.3

Added

  • Dedicated admin AJAX endpoint tab (AdminImproAjax) for uploads and module actions.

1.0.2

Added

  • Back-office asset loading via the actionAdminControllerSetMedia hook.

1.0.1

Added

  • Layout wrap option (full width vs. theme container) with the layout_wrap column.

1.0.0

Added

  • Initial release: draw clickable areas (rectangles, circles, polygons, hotspots) on any image, with hover styles, tooltips/cards, click actions (product, category, CMS, link), multilingual and multishop support.

Still stuck?

Customers get support through the PrestaShop Addons contact form, so every request is tracked.

How to get help

Missing a feature or have an idea? Tell us what you need

Last updated October 8, 2026