{"id":305625,"date":"2026-09-16T19:28:48","date_gmt":"2026-09-16T19:28:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/appointment-booking-calendar-dynamic-reservation\/"},"modified":"2026-09-17T09:39:10","modified_gmt":"2026-09-17T09:39:10","slug":"appointment-booking-calendar-dynamic-reservation","status":"publish","type":"plugin","link":"https:\/\/hr.wordpress.org\/plugins\/appointment-booking-calendar-dynamic-reservation\/","author":23488927,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.34","stable_tag":"1.2.34","tested":"7.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Appointment Booking Calendar \u2013 Dynamic Reservation","header_author":"Dynamic Reservation","header_description":"Reservation management with admin dashboard calendar. Manage bookings directly from WordPress.","assets_banners_color":"41697a","last_updated":"2026-09-17 09:39:10","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/dynamicreservation.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":61,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.34":{"tag":"1.2.34","author":"dynamicreservation","date":"2026-09-17 09:39:10","revision":3699948}},"upgrade_notice":{"1.2.13":"<p>WordPress.org compliance release: removed bundled auto-updater, hardened input sanitization and output escaping, tested up to WordPress 6.9. Recommended for all users.<\/p>","1.2.12":"<p>Fixes color picker and tile-hover regressions in the WordPress admin dashboard. Recommended for all users.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3699760,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3699760,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3699776,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3699776,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.34"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3699760,"resolution":"1","location":"assets","locale":"","width":1992,"height":1332},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3699776,"resolution":"2","location":"assets","locale":"","width":1616,"height":1230}},"screenshots":{"1":"<strong>Admin Dashboard<\/strong> \u2013 manage bookings in the week view: pending, confirmed and rejected counters, \"Send Booking Link\", \"Block Time\" and one-click blocking of free days.","2":"<strong>Booking Calendar<\/strong> \u2013 the public month view your customers see, embedded with the <code>[apboca_calendar]<\/code> shortcode. Title, description, colors and default view are configurable."}},"plugin_section":[],"plugin_tags":[276,269,416,722,268],"plugin_category":[40],"plugin_contributors":[281133],"plugin_business_model":[],"class_list":["post-305625","plugin","type-plugin","status-publish","hentry","plugin_tags-appointment","plugin_tags-booking","plugin_tags-calendar","plugin_tags-reservation","plugin_tags-scheduling","plugin_category-calendar-and-events","plugin_contributors-dynamicreservation","plugin_committers-dynamicreservation"],"banners":{"banner":"https:\/\/ps.w.org\/appointment-booking-calendar-dynamic-reservation\/assets\/banner-772x250.png?rev=3699776","banner_2x":"https:\/\/ps.w.org\/appointment-booking-calendar-dynamic-reservation\/assets\/banner-1544x500.png?rev=3699776","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/appointment-booking-calendar-dynamic-reservation\/assets\/icon-128x128.png?rev=3699760","icon_2x":"https:\/\/ps.w.org\/appointment-booking-calendar-dynamic-reservation\/assets\/icon-256x256.png?rev=3699760","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/appointment-booking-calendar-dynamic-reservation\/assets\/screenshot-1.png?rev=3699760","caption":"<strong>Admin Dashboard<\/strong> \u2013 manage bookings in the week view: pending, confirmed and rejected counters, \"Send Booking Link\", \"Block Time\" and one-click blocking of free days."},{"src":"https:\/\/ps.w.org\/appointment-booking-calendar-dynamic-reservation\/assets\/screenshot-2.png?rev=3699776","caption":"<strong>Booking Calendar<\/strong> \u2013 the public month view your customers see, embedded with the <code>[apboca_calendar]<\/code> shortcode. Title, description, colors and default view are configurable."}],"raw_content":"<!--section=description-->\n<p><strong><a href=\"https:\/\/dynamicreservation.com\">Dynamic Reservation<\/a><\/strong> brings a full appointment booking calendar into WordPress. Customers book online through a clean shortcode widget, while you manage everything from the WordPress admin.<\/p>\n\n<p>\ud83d\udc49 <strong>Website, free account &amp; live demo:<\/strong> <a href=\"https:\/\/dynamicreservation.com\">dynamicreservation.com<\/a><\/p>\n\n<h4>\ud83d\ude80 Key Features<\/h4>\n\n<ul>\n<li><strong>Admin Dashboard Calendar<\/strong> \u2013 week &amp; month view with bookings, blocked slots and live status<\/li>\n<li><strong>Confirm \/ Reject \/ Remove Bookings<\/strong> \u2013 manage reservation status directly in WordPress<\/li>\n<li><strong>Block Time<\/strong> \u2013 block individual slots, full days or recurring time ranges (daily \/ weekly \/ monthly) with optional notes and color labels (amber \/ red \/ blue \/ green \/ purple \/ slate)<\/li>\n<li><strong>Booking Shortcode<\/strong> <code>[apboca_calendar]<\/code> \u2013 embed the public booking calendar on any page, post or block<\/li>\n<li><strong>Live Design Settings<\/strong> \u2013 change surface, border, header and accent colors and see a live preview of the calendar, rendered locally inside WordPress<\/li>\n<li><strong>Multilingual<\/strong> \u2013 built-in translations for 10 languages (EN, DE, FR, ES, IT, PT, NL, PL, SV, TR)<\/li>\n<li><strong>Customer e-mails<\/strong> \u2013 automatic confirmation, rejection and cancellation e-mails<\/li>\n<li><strong>Auto-Updates<\/strong> \u2013 plugin updates are delivered through WordPress<\/li>\n<li><strong>No external CSS \/ JS dependencies<\/strong> \u2013 Tailwind is precompiled and shipped with the plugin (wp.org compliant)<\/li>\n<\/ul>\n\n<h4>\u2699\ufe0f How it works<\/h4>\n\n<p>The public booking widget is embedded on your site through the <code>[apboca_calendar]<\/code> shortcode and is connected to your WordPress site via an Embed Token (API Key). All booking data is stored on the Dynamic Reservation backend. The WordPress admin screens do not embed any external page: the dashboard, the settings and the live calendar preview are rendered by the plugin itself and talk to the backend through server-side REST API requests only.<\/p>\n\n<h4>\ud83d\udd0c External services<\/h4>\n\n<p>This plugin is a client for the hosted booking service <strong><a href=\"https:\/\/dynamicreservation.com\">Dynamic Reservation<\/a><\/strong>. Reservations, blocked times and calendar settings are not stored in your WordPress database; they live on the Dynamic Reservation backend and are read and written through its REST API. Without an account and an Embed Token the plugin only offers a local demo mode.<\/p>\n\n<p><strong>Which service is used<\/strong><\/p>\n\n<ul>\n<li><strong>Service<\/strong>: <a href=\"https:\/\/dynamicreservation.com\">Dynamic Reservation<\/a>, operated by the plugin author<\/li>\n<li><strong>Base URL<\/strong>: <code>https:\/\/dynamicreservation.com<\/code><\/li>\n<li><strong>API documentation &amp; your API key<\/strong>: <a href=\"https:\/\/dynamicreservation.com\/admin\/api\">dynamicreservation.com\/admin\/api<\/a> (after logging in)<\/li>\n<\/ul>\n\n<p><strong>Which API routes the plugin calls<\/strong><\/p>\n\n<p>All calls to the REST API are made server-side from PHP (<code>wp_remote_*<\/code>) and \u2013 except for login and password reset \u2013 authenticated with your Embed Token. The plugin only calls routes from a fixed allow-list:<\/p>\n\n<ul>\n<li><code>\/api\/v1\/reservations<\/code> \u2013 list, create, confirm \/ reject (update) and remove bookings (GET, POST, PATCH, DELETE)<\/li>\n<li><code>\/api\/v1\/blocked-times<\/code> \u2013 list, create, update and delete blocked time slots, including recurring series (GET, POST, PATCH, DELETE)<\/li>\n<li><code>\/api\/v1\/calendar-settings<\/code> \u2013 read and save opening hours, slot length and blocked weekdays (GET, POST)<\/li>\n<li><code>\/api\/v1\/design<\/code> \u2013 read and save colors, title, description and default view of the booking calendar (GET, POST)<\/li>\n<li><code>\/api\/v1\/billing<\/code>, <code>\/api\/v1\/checkout<\/code>, <code>\/api\/v1\/cancel<\/code>, <code>\/api\/v1\/verify-session<\/code> \u2013 show and manage your Dynamic Reservation subscription. Paid plans are checked out on a payment page of <a href=\"https:\/\/stripe.com\">Stripe<\/a> (<a href=\"https:\/\/stripe.com\/privacy\">privacy policy<\/a>); the plugin never receives or stores card data.<\/li>\n<li><code>\/api\/v1\/admin\/customers<\/code>, <code>\/api\/v1\/customer-magic-link<\/code> \u2013 list your customers and create or send their personal booking link (\"Send Booking Link\")<\/li>\n<li><code>\/api\/v1\/contact<\/code> \u2013 the optional support contact form in the plugin settings<\/li>\n<li><code>\/api\/wp-auth<\/code>, <code>\/api\/forgot-password<\/code> \u2013 log in \/ register to connect your site, and reset your password<\/li>\n<\/ul>\n\n<p>The public booking widget is loaded from <code>https:\/\/dynamicreservation.com\/embed\/calendar<\/code> in a frame on the pages where you place the <code>[apboca_calendar]<\/code> shortcode.<\/p>\n\n<p><strong>What is sent and when<\/strong><\/p>\n\n<ul>\n<li><strong>Data sent<\/strong>: your Embed Token (API key), booking data (date, time and the contact details a visitor enters into the booking form), block-time entries, calendar and design settings, and \u2013 only when you use them \u2013 your login e-mail \/ password or a support message<\/li>\n<li><strong>When<\/strong>: when a visitor opens the booking widget or submits a booking, when an admin opens the plugin dashboard or settings, when a booking is confirmed \/ rejected \/ removed, when a block is created \/ deleted, and when settings are saved<\/li>\n<li><strong>Not sent<\/strong>: no data is sent before you connect the site; the demo mode works completely locally in your browser<\/li>\n<\/ul>\n\n<p><strong>Legal<\/strong><\/p>\n\n<ul>\n<li><strong>Privacy policy<\/strong>: <a href=\"https:\/\/dynamicreservation.com\/privacy\">dynamicreservation.com\/privacy<\/a><\/li>\n<li><strong>Terms of service<\/strong>: <a href=\"https:\/\/dynamicreservation.com\/terms\">dynamicreservation.com\/terms<\/a><\/li>\n<\/ul>\n\n<p>You need a Dynamic Reservation account and an Embed Token to use the booking features. A <a href=\"https:\/\/dynamicreservation.com\">free plan<\/a> is available.<\/p>\n\n<h4>\u2b50 Organization<\/h4>\n\n<p>Dynamic Reservation is developed and maintained by <strong><a href=\"https:\/\/github.com\/vdux-org\">vdux<\/a><\/strong> \u2013 a team creating innovative app solutions. Dynamic Reservation and our other apps are published in the vdux organization on GitHub. Have a look, leave a star \u2b50 and follow the development:<\/p>\n\n<p>\ud83d\udc49 <strong>GitHub:<\/strong> <a href=\"https:\/\/github.com\/vdux-org\/apps\">github.com\/vdux-org\/apps<\/a><\/p>\n\n<p>\ud83d\udc49 <strong>Company:<\/strong> <a href=\"https:\/\/vdux.de\">vdux.de<\/a><\/p>\n\n<h3>Reservation Booking Calendar<\/h3>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install it via the WordPress Plugins screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Go to <strong>D-Reservation \u2192 Settings<\/strong> and paste your <strong>Embed Token<\/strong> (API Key) from https:\/\/dynamicreservation.com.<\/li>\n<li>Place the shortcode <code>[apboca_calendar]<\/code> on any page or post to display the booking calendar.<\/li>\n<li>Manage incoming bookings under <strong>D-Reservation \u2192 Dashboard<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20an%20account%20on%20dynamicreservation.com%3F\"><h3>Do I need an account on dynamicreservation.com?<\/h3><\/dt>\n<dd><p>Yes. The plugin connects to the Dynamic Reservation hosted backend. You can sign up for a free account and receive an Embed Token to use the plugin.<\/p><\/dd>\n<dt id=\"where%20is%20my%20booking%20data%20stored%3F\"><h3>Where is my booking data stored?<\/h3><\/dt>\n<dd><p>Bookings are stored on the Dynamic Reservation backend. The plugin reads and writes them through the public REST API using your Embed Token.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20look%20of%20the%20calendar%3F\"><h3>Can I change the look of the calendar?<\/h3><\/dt>\n<dd><p>Yes. Under <strong>D-Reservation \u2192 Settings \u2192 Design<\/strong> you can change surface, border, header, primary and hover colors, the border radius, the title and description and switch between week and month view. A live preview is shown next to the form.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20translation-ready%3F\"><h3>Is the plugin translation-ready?<\/h3><\/dt>\n<dd><p>Yes. The text domain is <code>appointment-booking-calendar-dynamic-reservation<\/code>. The plugin ships with translations for English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Swedish and Turkish.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20load%20any%20external%20css%20or%20javascript%20at%20runtime%3F\"><h3>Does the plugin load any external CSS or JavaScript at runtime?<\/h3><\/dt>\n<dd><p>No. Tailwind CSS is precompiled and bundled inside the plugin, and the WordPress admin loads no external CSS, JavaScript, fonts or frames \u2014 the dashboard and the live calendar preview are rendered locally. Requests to https:\/\/dynamicreservation.com are made server-side from PHP. On the front end the booking widget itself is rendered in a frame from https:\/\/dynamicreservation.com, which is the hosted booking service this plugin is a client for.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.34<\/h4>\n\n<ul>\n<li>wp.org compliance: the WordPress admin no longer embeds any external page. All four iframes that loaded content from dynamicreservation.com have been removed.<\/li>\n<li>Live preview: the calendar preview in Design, Themes and Position is now rendered by the plugin itself (<code>assets\/preview.js<\/code>). It reacts to colors, title, description, header, view mode and border radius exactly as before, is navigable, and loads nothing from an external site.<\/li>\n<li>Demo mode: the demo dashboard is now the plugin's own dashboard, driven by sample data stored in the browser (localStorage). Bookings, block times, recurring blocks and statistics all work locally; nothing is sent to or loaded from an external service.<\/li>\n<li>Privacy: because no admin screen loads remote content anymore, opening the plugin's screens no longer causes any browser request to an external host. All communication with the booking service happens server-side via PHP, only after the site has been connected.<\/li>\n<li>Cleanup: removed the unused preview-iframe CSS, a leftover debug log, and corrected the text domain named in the FAQ.<\/li>\n<li>Compat: \"Tested up to\" raised to WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.2.33<\/h4>\n\n<ul>\n<li>Security: the AJAX API proxy no longer forwards the posted JSON body after a plain <code>json_decode()<\/code>. The posted string is sanitized on read, the decoded payload is sanitized recursively (keys via <code>sanitize_key()<\/code>, string values via <code>sanitize_email()<\/code> \/ <code>sanitize_textarea_field()<\/code>, numbers and booleans keep their type) and invalid JSON is rejected with a 400 response.<\/li>\n<li>Security: the proxied endpoint is validated against an allow-list of the routes the plugin actually uses, its query string is rebuilt from sanitized key\/value pairs, and the HTTP method is restricted to GET\/POST\/PATCH\/DELETE.<\/li>\n<li>Security: all remaining <code>$_POST<\/code> reads are unslashed and sanitized before use; toggles are compared against sanitized values, calendar hours and slot lengths are range-validated, blocked weekdays are cast to int and clamped to 1-7.<\/li>\n<li>Security: login and registration now validate the email format and the password length\/characters before the credentials are forwarded to the authentication API.<\/li>\n<li>Compat: \"Tested up to\" raised to WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>1.2.32<\/h4>\n\n<ul>\n<li>wp.org compliance: front-end embed CSS and JS are no longer emitted as inline <code>&lt;style&gt;<\/code> \/ <code>&lt;script&gt;<\/code> blocks. The static wrapper styles now live in <code>assets\/embed.css<\/code> and are enqueued via <code>wp_enqueue_style()<\/code>; the full-bleed breakout runtime lives in <code>assets\/embed.js<\/code> and is enqueued via <code>wp_enqueue_script()<\/code>, with per-shortcode config passed through <code>wp_add_inline_script()<\/code>.<\/li>\n<li>wp.org compliance: removed the legacy generic <code>[dynamic_reservation]<\/code> shortcode alias. Only the prefixed <code>[apboca_calendar]<\/code> tag is registered now, eliminating the only remaining non-prefixed identifier flagged by the wp.org reviewer.<\/li>\n<\/ul>\n\n<h4>1.2.31<\/h4>\n\n<ul>\n<li>Build\/structure: renamed plugin source folder and main file to match the wp.org slug <code>appointment-booking-calendar-dynamic-reservation<\/code>. Resolves WordPress.WP.I18n.TextDomainMismatch warnings reported by the Plugin Check tool.<\/li>\n<li>No functional changes for end users.<\/li>\n<\/ul>\n\n<h4>1.2.30<\/h4>\n\n<ul>\n<li>Settings: unified empty-state across Layout, Calendar, Connection and Subscription tabs when not connected.<\/li>\n<li>Settings: each tab now shows the same banner with two CTAs \u2014 \"Go to General\" (login\/register) and \"Try Demo\" (opens demo on the dashboard).<\/li>\n<li>Connection tab: removed obsolete \"Go to Dashboard\" link; the connection status card is now hidden until the site is connected.<\/li>\n<li>Translations: added new setup banner + button strings for all 10 supported languages.<\/li>\n<\/ul>\n\n<h4>1.2.29<\/h4>\n\n<ul>\n<li>Login form: added password reveal eye icon (admin login + register).<\/li>\n<li>Login form: added \"Forgot password?\" link with reset email flow.<\/li>\n<li>Translations: added forgot\/reset\/eye strings for all 10 supported languages.<\/li>\n<\/ul>\n\n<h4>1.2.28<\/h4>\n\n<ul>\n<li>Fix: Fullwidth-Modi \u00fcberlaufen nicht mehr rechts aus dem Viewport. Die Breakout-Routine nutzt jetzt <code>position: relative<\/code> + <code>left<\/code> (rein visuelle Verschiebung ohne Layout-Seiteneffekte) statt negativer Margins, und misst den Wrapper selbst nach einem sauberen Reset. Damit ist die Positionierung exakt: links bei <code>0<\/code>, rechts bei <code>clientWidth<\/code> (ohne Scrollbar-Gutter).<\/li>\n<\/ul>\n\n<h4>1.2.27<\/h4>\n\n<ul>\n<li>Fix: Fullwidth-Modi (\u201ebricht aus dem Inhaltscontainer aus\u201c und \u201egesamter Bildschirm\u201c) positionieren sich jetzt zuverl\u00e4ssig links bei <code>0<\/code> und f\u00fcllen die Viewport-Breite. Die Breakout-Routine misst nun das <strong>Parent-Element<\/strong> (statt des Embeds selbst), wodurch die Positionierung unabh\u00e4ngig vom Theme-Layout (zentriert, links-ausgerichtet, mit Sidebar etc.) deterministisch wird. Zus\u00e4tzliche Re-Runs nach Font-Load und mit kurzem Timeout fangen sp\u00e4te Layout-Shifts (Page-Builder Hydration, Sticky-Header) ab.<\/li>\n<li>New: Welcome-Card und Demo-Banner im WP-Admin sind jetzt in 10 Sprachen verf\u00fcgbar (en, de, fr, es, it, pt, nl, pl, sv, tr) \u2014 die Sprache wird automatisch aus der WordPress-Locale des Nutzers abgeleitet, ohne dass eine <code>.mo<\/code>-Datei nachgeladen werden muss.<\/li>\n<\/ul>\n\n<h4>1.2.26<\/h4>\n\n<ul>\n<li>Fix: \u201cVolle Breite \u2013 bricht aus dem Inhaltscontainer aus\u201d \u2014 the proportional scale slider no longer applies a <code>transform: scale()<\/code> in this mode, which had been shrinking the iframe to a tiny corner when the slider was below 100%. Scale is now disabled (forced to 100%) in both full-width modes; only height is configurable.<\/li>\n<li>Fix: \u201cVolle Breite \u2013 gesamter Bildschirm (Rand zu Rand)\u201d \u2014 replaced the brittle JS measurement-based breakout with a deterministic CSS approach. The wrapper now uses <code>width: var(--apboca-vw)<\/code> + <code>margin-left: calc(50% - var(--apboca-vw)\/2)<\/code>, where <code>--apboca-vw<\/code> is set to the document\u2019s <code>clientWidth<\/code> (excludes vertical scrollbar). This eliminates the right-edge overflow that used to appear when the breakout JS mismeasured the parent offset.<\/li>\n<li>Fix: Live-Vorschau in den Plugin-Einstellungen verh\u00e4lt sich jetzt identisch zu \u201eVolle Breite\u201c am Frontend (kein winziger Kalender beim Verstellen des Skalierungs-Sliders).<\/li>\n<\/ul>\n\n<h4>1.2.25<\/h4>\n\n<ul>\n<li>Fix: Welcome card \u2014 the \u201cStart in Demo Mode\u201d button now has at least 30px breathing room below it. Previously the spacing classes (<code>pb-8<\/code>, <code>py-7<\/code>) used in the markup were not part of the precompiled Tailwind bundle and therefore had no effect; spacing is now applied via inline styles so it cannot be silently dropped.<\/li>\n<\/ul>\n\n<h4>1.2.24<\/h4>\n\n<ul>\n<li>Fix: Frontend full-width breakout no longer triggers a horizontal scrollbar on the document. The runtime now sets <code>overflow-x: clip<\/code> on <code>&lt;html&gt;<\/code> \/ <code>&lt;body&gt;<\/code> so the calendar can extend to the viewport edge without enabling page-level horizontal scrolling.<\/li>\n<li>Fix: Welcome card spacing \u2014 the \u201cStart in Demo Mode\u201d button now has additional bottom breathing room (\u226525px between the button and the bottom edge of the WP admin content area).<\/li>\n<\/ul>\n\n<h4>1.2.23<\/h4>\n\n<ul>\n<li>Fix: Settings \u2192 Layout \u2192 Position \u2014 full-width modes now also tell the embedded calendar (SvelteKit) to render responsively via a <code>responsive=1<\/code> URL flag. Previously the iFrame wrapper was stretched correctly but the calendar inside kept its internal <code>max-width<\/code> and stayed centered at 800px, making the breakout look like a no-op.<\/li>\n<li>Fix: Settings \u2192 Layout \u2192 Position \u2014 the proportional scale slider now actually updates the iFrame Width (px) and iFrame Height (px) input values as it is dragged, instead of only scaling the preview visually.<\/li>\n<li>Fix: Settings \u2192 Layout \u2192 Position \u2014 \u201cFull width \u2014 breaks out of content container\u201d now disables the Width (px) input and shows a <code>100%<\/code> placeholder. Previously the field kept a meaningless number (e.g. <code>2000<\/code>) which made the configuration confusing.<\/li>\n<li>Fix: Settings \u2192 Layout \u2192 Position \u2014 saving from the Position sub-tab now lands the user back on the Position sub-tab after the redirect from <code>options.php<\/code>, instead of falling back to the Reservation sub-tab.<\/li>\n<li>Feature: Dashboard before login \u2014 added a \"Start in Demo Mode\" CTA on the welcome card. Demo mode loads the public demo dashboard inside an iFrame so the user can explore time-blocking and the booking flow with sample data before registering. A clear amber banner reminds the user that bookings made in demo mode are not stored on the live site.<\/li>\n<\/ul>\n\n<h4>1.2.22<\/h4>\n\n<ul>\n<li>Fix: Backward compatibility \u2014 the original <code>[dynamic_reservation]<\/code> shortcode tag is registered again as an alias of <code>[apboca_calendar]<\/code>, so existing pages continue to render the calendar after upgrading from 1.2.19 or earlier.<\/li>\n<li>Fix: Frontend full-width breakout actually widens the calendar now. The previous build only applied a negative margin which shifted the element but left the width at the parent column width. The runtime now sets an explicit pixel width (document width minus optional 16px gutter) AFTER neutralising <code>overflow:hidden<\/code>\/<code>overflow:clip<\/code> on every ancestor up to <code>&lt;body&gt;<\/code>, so the calendar reliably stretches across Elementor sections, Gutenberg groups, Divi rows etc.<\/li>\n<li>Fix: Admin Dashboard month view \u2014 a single combined scrollable list now contains both blocked time entries and reservations. Previously only reservations were scrollable and blocked time entries were still truncated with a <code>+N<\/code> counter.<\/li>\n<\/ul>\n\n<h4>1.2.21<\/h4>\n\n<ul>\n<li>Fix: Admin Dashboard month view \u2014 scrollable list when a day has more than 3 bookings now actually scrolls (the previous build relied on an arbitrary Tailwind class that was not in the precompiled CSS bundle; replaced with inline <code>max-height<\/code> + <code>overflow-y:auto<\/code>).<\/li>\n<li>Fix: Settings \u2192 Layout \u2192 Position live preview \u2014 \u201cFull width \u2014 breaks out of content container\u201d and \u201cFull width \u2014 entire screen (edge to edge)\u201d now correctly stretch the calendar iFrame across the simulated page frame instead of the iFrame staying constrained to the 720px content column.<\/li>\n<li>Fix: Frontend full-width breakout now uses a JS-based runtime adjustment (measures the document width, applies negative margins relative to the actual element position and neutralises <code>overflow:hidden<\/code> on ancestor containers up to <code>&lt;body&gt;<\/code>) so the calendar reliably breaks out inside Elementor sections, Gutenberg groups, Divi rows and similar builders.<\/li>\n<\/ul>\n\n<h4>1.2.20<\/h4>\n\n<ul>\n<li>Fix: Renamed all generic <code>dr_<\/code> \/ <code>DR_<\/code> prefixes to the unique <code>apboca_<\/code> \/ <code>APBOCA_<\/code> prefix (functions, classes, defines, options, AJAX actions, settings group, nonces and the JS global) to comply with WordPress.org plugin naming guidelines.<\/li>\n<li>Change: Booking shortcode tag is now <code>[apboca_calendar]<\/code>.<\/li>\n<li>Fix: Admin Dashboard month view \u2014 when a day contains more than 3 bookings, the list is now scrollable (vertical scroll inside the day cell) instead of being truncated with a <code>+N<\/code> counter.<\/li>\n<li>Fix: Settings \u2192 Layout \u2192 Position \u2014 \u201cFull width \u2014 breaks out of content container\u201d and \u201cFull width \u2014 entire screen (edge to edge)\u201d now use the standard full-bleed CSS technique (<code>margin-left: calc(50% - 50vw)<\/code>) so the iFrame reliably escapes the content column on common page builders such as Elementor, Gutenberg and Divi.<\/li>\n<li>Fix: When \u201cFull width \u2014 entire screen (edge to edge)\u201d is selected, Width (px) and Proportional Scale are now disabled (only iFrame Height stays editable), since width scaling is meaningless in edge-to-edge mode.<\/li>\n<\/ul>\n\n<h4>1.2.19<\/h4>\n\n<ul>\n<li>New: \"Service Information\" tab in Settings with links to Terms &amp; Conditions, Privacy Policy, and Imprint.<\/li>\n<li>New: Contact form to reach support directly from WordPress (rate-limited to 1 message per day).<\/li>\n<\/ul>\n\n<h4>1.2.17<\/h4>\n\n<ul>\n<li>Fix: WordPress dashboard calendar now actually opens in the configured Default View (Week \/ Month) from Settings \u2192 Layout \u2192 Admin.<\/li>\n<\/ul>\n\n<h4>1.2.16<\/h4>\n\n<ul>\n<li>Fix: \"Remove all in series\" now actually deletes every block in the recurring series via the v1 API endpoint used by the WordPress plugin (1.2.15 fixed only the web app).<\/li>\n<li>Fix: Default Calendar View toggle (Week \/ Month) no longer overlaps the description text in Settings \u2192 Layout.<\/li>\n<\/ul>\n\n<h4>1.2.15<\/h4>\n\n<ul>\n<li>Fix: \"Remove all in series\" now reliably cascades and deletes every block in a recurring series (daily \/ weekly \/ monthly).<\/li>\n<li>New: Default Calendar View toggle (Week \/ Month) per area in Settings \u2192 Layout (Booking &amp; Admin sub-tabs).<\/li>\n<li>UI: Calendar Settings \u2013 \"Booking Description\" is now a toggle switch (consistent with the rest of the settings).<\/li>\n<li>Live preview: switching the default view in Layout updates the embedded preview iframe immediately.<\/li>\n<\/ul>\n\n<h4>1.2.13<\/h4>\n\n<ul>\n<li>WordPress.org compliance: removed in-plugin auto-updater (updates are delivered via WordPress.org).<\/li>\n<li>Hardening: stricter input sanitization on AJAX endpoints (api proxy body, blocked dates, calendar settings).<\/li>\n<li>Hardening: all template output is escaped (esc_attr \/ esc_html) to satisfy Plugin Check ERROR-level rules.<\/li>\n<li>Compat: replaced date() with gmdate() to be timezone-safe.<\/li>\n<li>Tested up to WordPress 6.9.<\/li>\n<\/ul>\n\n<h4>1.2.12<\/h4>\n\n<ul>\n<li>UI: Calendar Settings \u2013 renamed \"Blocked weekdays\" to \"Block weekdays (recurring)\" (DE: \"Blocke beliebig Wochentage (wiederkehrend)\").<\/li>\n<li>UI: Weekday tiles use a green default state and turn red when selected \u2013 matches the web app.<\/li>\n<li>Fix: Surface and border color pickers in Design Settings now apply correctly to the embedded calendar preview.<\/li>\n<li>Fix: Hover on day tiles in the WordPress dashboard week \/ month view no longer removes the tile border.<\/li>\n<\/ul>\n\n<h4>1.2.9<\/h4>\n\n<ul>\n<li>Fix: Block Time popup is translated into the WordPress user language (10 locales).<\/li>\n<li>Fix: When the selected day already has bookings, the Block Time \u2192 Advanced tab now shows a banner explaining that the entire day cannot be blocked, the all-day toggle is disabled and From\/To dropdowns only list still-free hours.<\/li>\n<\/ul>\n\n<h4>1.2.8<\/h4>\n\n<ul>\n<li>Fix: Disable \"Advanced \/ Block entire day\" tab when the day already has bookings.<\/li>\n<li>Fix: Reservation delete via SvelteKit <code>\/api\/reservations<\/code> endpoint uses <code>delete({ count: \"exact\" })<\/code> for reliable RLS detection.<\/li>\n<\/ul>\n\n<h4>1.2.7<\/h4>\n\n<ul>\n<li>Month view: blocked day tiles now show the actual block label, note and chosen color.<\/li>\n<li>Reservation Remove: surfaces backend errors instead of silently appearing to fail.<\/li>\n<\/ul>\n\n<h4>1.2.6<\/h4>\n\n<ul>\n<li>Block Time: recurring blocks (daily\/weekly\/monthly) now correctly create individual entries on every interval day via the public REST API.<\/li>\n<li>Block Time: tile color palette (amber\/red\/blue\/green\/purple\/slate) visible on day, week and month tiles.<\/li>\n<li>Booking Details popup: new \"Remove\" button for confirmed\/rejected bookings \u2013 confirmed bookings trigger a cancellation e-mail to the customer.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Fix: recurring blocks (daily\/weekly\/monthly) only blocking the start day in some timezones.<\/li>\n<li>Block Time: color palette picker (amber\/red\/blue\/green\/purple\/slate) for block tile border + background.<\/li>\n<li>Remove Blocked Time popup: now displays the saved note text.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Block Time: validation for repeat \"Until\" date (required + must be on\/after start).<\/li>\n<li>Block Time: auto-fill \"Until\" with start +30 days when picking a repeat type.<\/li>\n<li>Calendar tiles: show truncated note (max 15 chars) on blocked time entries.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Replaced Tailwind CDN with locally bundled, precompiled CSS (wp.org compliance \u2013 no external resources).<\/li>\n<li>Block Time: optional note field (max 120 characters) in advanced mode.<\/li>\n<li>Booking details popup: Close button right-aligned.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Admin dashboard visually aligned with the web app calendar.<\/li>\n<li>Booking details popup matches web app structure (incl. note field).<\/li>\n<li>Fixed missing borders on status cards and grey calendar wrapper.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Status card layout improvements.<\/li>\n<li>Tailwind utility scoping for WP admin.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Admin dashboard with week\/month calendar view.<\/li>\n<li>Reservation management (confirm\/reject).<\/li>\n<li>Booking calendar shortcode.<\/li>\n<li>Auto-update from GitHub releases.<\/li>\n<\/ul>","raw_excerpt":"Appointment booking calendar with admin dashboard. Manage reservations, block time and embed the booking widget on any page.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/305625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=305625"}],"author":[{"embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dynamicreservation"}],"wp:attachment":[{"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=305625"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=305625"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=305625"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=305625"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=305625"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=305625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}