=== PosLimitless Booking === Contributors: poslimitless Tags: booking, reservation, escape-game, gift-card, events Requires at least: 5.8 Tested up to: 6.9 Requires PHP: 7.4 Stable tag: 2.6.6 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html Online booking system, client portal, gift cards and events for leisure centers. == Description == PosLimitless Booking integrates PosLimitless booking modules directly into your WordPress site. **Included modules:** * **Booking** — Full booking system with calendar, time slot selection and online payment (Stripe, Monetico, Sogecommerce, CAWL) * **Confirmation** — Summary and payment page with promo codes, gift cards and options * **Client Portal** — Secure client portal with booking history, gift cards and photos * **Gift Card** — Online gift card purchase with customization and live preview * **Events** — Display public center events with registration **Features:** * 5 visual styles per module (Classic, Grid, Glassmorphism, Immersive, Dashboard) * Full customization of colors, fonts and effects * 6 pre-configured color packs * Live preview in the WordPress admin * Dark mode / light mode * Mobile responsive * Secure multi-gateway payment == Installation == 1. Upload the `poslimitless-booking` folder to `/wp-content/plugins/` 2. Activate the plugin in the Plugins menu 3. Go to PosLimitless > Configuration 4. Enter your Center ID and API Key (available in POS Limitless > API Keys) 5. Insert shortcodes into your pages == Shortcodes == * `[poslimitless_booking]` — Booking module * `[poslimitless_espace_client]` — Client portal * `[poslimitless_bon_cadeau]` — Gift cards * `[poslimitless_verif_bon_cadeau]` — Gift card balance check * `[poslimitless_roue_chance]` — Lucky wheel * `[poslimitless_event]` — Events == Frequently Asked Questions == = Where can I find my Center ID and API Key? = Log in to POS Limitless (poslimitless.web.app), go to Configuration > API Keys. You will find your Center ID there and can generate your API Key. = How do I customize the appearance? = Each module has its own appearance page in the PosLimitless menu. You can choose from 5 visual styles and customize all colors. = Which payment methods are supported? = Stripe, Monetico, Sogecommerce and CAWL. Configuration is done in POS Limitless. == Changelog == = 2.6.6 = * Improvement: client portal dashboard — reservations with status `pictureClient` (paid + photo captured on arrival) now show a clean "Payé" badge instead of the raw internal status string, alongside a small camera icon that jumps to the Photos tab on click. On mobile, the tab bar now performs a brief horizontal scroll hint on load when it overflows, so customers discover the off-screen Photos tab without having to swipe blindly. = 2.6.5 = * Fix: ad conversion value (Google Ads, Meta, TikTok, GA4) now reports the full reservation total after discounts/coupon, instead of the deposit amount when the customer pays a deposit. Previously deposit-mode bookings under-reported their value to ad platforms, skewing ROAS and smart bidding downward. * Change: the booking widget no longer manages its own cookie/tracking consent. Since the widget mounts directly in the host page (not an iframe), its tags now inherit the consent signals from the host site's Consent Management Platform (Complianz, CookieYes, etc.). The widget's separate "cookies & trackers" checkbox has been removed to avoid a duplicate, conflicting consent layer. The privacy-policy acceptance checkbox is unchanged. = 2.6.4 = * Fix: when the booking widget is mounted via a scoped shortcode (e.g. `[poslimitless_booking group_id="..."]`), cancelling a payment on the provider's hosted page (Stripe / CAWL / Monetico / Sogecommerce) now returns the customer to the exact page they came from, instead of the center's general booking page. The widget now forwards `window.location.href` as `originUrl` on all payment session creation calls; the backend stores it on the session document and prefers it (after host validation against the center's known domains, to prevent open-redirect abuse) over the default booking URL when building the cancel redirect. = 2.6.3 = * Fix: the real root cause of the "extra players" warning breaking French words mid-character. Direct API inspection on the live site revealed the stored message HTML contained ` ` (non-breaking space) entities between every word — Quill, the rich-text editor used in the admin Service form, inserts NBSP whenever the user selects text or applies formatting. From the browser's wrapping perspective, an NBSP-joined sentence is a single unbreakable word, so `overflow-wrap: break-word` kicks in and slices it at arbitrary character positions to make it fit the column. No amount of Shadow DOM, `!important`, or `word-break: normal` could have fixed it — the issue was in the text data, not the styling. The warning's `sanitizeWarningHtml` now decodes ` ` and the U+00A0 character back into regular spaces before injection, so the browser can wrap at word boundaries the way the rest of the CSS already expected. = 2.6.2 = * Fix: the "extra players" warning, even rendered inside a Shadow DOM (since v2.6.1), was still breaking French words mid-character at narrow column widths (e.g. the 320 px summary column in the V5 confirm view). DevTools inspection on the live site (enigma78.fr) confirmed the shadow root and the `word-break: normal !important` rule were both applied — so the cause was not theme CSS, but `text-align: justify` combined with the browser's default justification algorithm picking break opportunities mid-word when stretching short lines. Switched the shadow-DOM scoped CSS to `text-align: left !important` and `text-justify: inter-word !important` so justification can only happen between whitespace tokens, never inside a word. = 2.6.1 = * Fix: the "extra players" warning now renders its message inside a Shadow DOM so the host WordPress theme can no longer reach the content with CSS selectors. Earlier attempts (v2.5.4 through v2.6.0) tried scoped class selectors, scoped `