Fix (mobile): the booking modal now uses 100dvh (dynamic viewport height) instead of 100vh so the iframe content is no longer cut off by the iOS Safari URL bar at the top or by the iPhone home indicator at the bottom. The close button is also offset using env(safe-area-inset-top) so it stays reachable on devices with a notch / Dynamic Island.
Fix (mobile): full-width modal on phones — 100vw with safe-area-inset paddings on all four sides, no border radius, no drop shadow. The visible viewport is now fully reserved for the booking widget on every phone size.
1.2.3
Fix: the booking modal no longer closes prematurely after a reservation is submitted. The Planevia booking widget sends a Planevia-booking-confirmed postMessage as soon as the reservation is persisted (between step 4 and step 5), which the plugin previously treated as a “close the modal” signal. Visitors never saw the payment step (Stripe form when the business has online payment enabled) nor the final confirmation screen with the booking summary. The plugin now only closes the modal when the visitor explicitly clicks the close button inside the booking widget (which sends Planevia-booking-close).
Flow that now works end-to-end inside the iframe:
Category → Service → Staff/Date/Time → Contact form → Reservation created in Planevia
Payment (Stripe, if allowOnlinePayment is enabled on the organization)
Confirmation screen with booking summary and a close button
No backend / spa-management change required — pure plugin-side fix.
1.2.2
Fix: the booking modal now opens the Planevia booking widget directly inside the iframe (https://planevia.ca/embed/{org}) instead of fetching organization data and rendering a custom intermediate card. The custom card introduced in 1.2.0 was blocked by cross-origin (CORS) restrictions on api.planevia.ca, which caused “Impossible de charger les données” errors on every modal open. Visitors now see the full booking widget (cover, categories, services and calendar) immediately when clicking the floating button, an auto-captured booking link, or any .planevia-book trigger.
Note: auto-capture (introduced in 1.2.1) still works the same way — any button or link containing “Réserver / Book / Rendez-vous / Appointment” opens the modal automatically.
1.2.1
New: auto-capture is back. Any button or link on your site containing “Réserver”, “Reserv”, “Book”, “Prendre rendez-vous”, “Rendez-vous” or “Appointment” is automatically converted into a Planevia trigger — no HTML change required. Can be disabled in the settings page if you prefer manual integration.
Improvement: auto-captured triggers open the new category picker introduced in 1.2.0 (same flow as the floating button and as .planevia-book triggers without filters).
1.2.0
New: category picker modal — the floating button (and any generic .planevia-book trigger) now opens a clean two-column card first. Left column shows the organization cover, name, address and phone. Right column lists categories with thumbnails, service counts and an info popover. Clicking a category loads the booking iframe pre-filtered for that category.
New: rendered natively in the plugin (no extra iframe load, no remote /embed.js script). Two public endpoints power the card: /api/public/organizations/{slug} and /api/public/services?org={slug}.
New: navigation arrows in the modal footer match the Booxi-style flow (prev disabled on first step, next opens the booking iframe with no filter for visitors who want to browse all services).
New: hover and focus states pick up your organization’s primaryColor automatically.
Change: the floating button is again a booking trigger (the brief 1.1.0 chat-FAB experiment is deferred — chat will return in a future release once the chat embed page is in production).
Fix: the modal close listener now accepts both the legacy string postMessage and the object form ({type:’Planevia-booking-close’}) sent by the embed page. The booking modal now closes automatically after a confirmed reservation.
Brief chat-FAB experiment (now superseded by 1.2.0). The floating button targeted /embed/{org}/chat. Removed because the chat embed page was not yet deployed in production.
1.0.6
Fix: booking modal is now fully responsive across mobile, tablet and desktop. The previous max-width of 520px forced the embed page into mobile single-column mode on every screen, hiding the company banner and info panel. New breakpoints: full-screen on mobile (<= 640px), 92% width on tablet (641-1024px), capped at 1100px on desktop (>= 1025px). The two-column layout with the company cover image and details now displays correctly on desktop and tablet.
1.0.5
Improvement: auto-capture is now enabled by default. Any button or link containing “Réserver”, “Reserv”, “Book”, “Prendre rendez-vous”, “Rendez-vous”, or “Appointment” automatically opens the Planevia booking modal — no code change required on the client’s site. The setting can still be disabled in the plugin settings.
1.0.4
Improvement: Planevia URL and Planevia API URL are now hardcoded constants (PLANEVIA_SERVER_URL, PLANEVIA_API_URL) instead of admin-editable settings. These point to the Planevia platform and are not meant to be customized by clients. Removes two unnecessary configuration fields from the plugin settings page.
1.0.3
Fix: corrected default server URL from app.planevia.ca (non-existent subdomain) to planevia.ca. Existing installations are auto-migrated on plugin load. This was preventing the floating button and booking modal from appearing on client websites.
New: separate API URL setting (default https://api.planevia.ca) used by the [planevia_services] shortcode. The booking iframe and floating button stay on planevia.ca; the public API is now correctly called on api.planevia.ca.
1.0.2
Fix: floating button now loads correctly (corrected widget script path from /widget/planevia-widget.js to /embed.js)
1.0.1
Updated plugin name to “PlaneviaApp Booking for Planevia” and requested slug “planeviaapp-booking”
Translated all descriptions and settings to English
Removed arbitrary custom CSS insertion; use the WordPress Customizer for custom CSS
Replaced direct script/style tags with wp_enqueue_script() and wp_add_inline_script()
Replaced json_encode() with wp_json_encode() throughout
Added full type and sanitize_callback declarations to all register_setting() calls
Removed load_plugin_textdomain() (not required for WordPress.org hosted plugins since WP 4.6)