=== 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.4 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.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 `