== Changelog ==

Entries describing the Class Portal, member portal, credit packages, levels, waitlists, the staff role and reminder emails refer to the separate Pro plugin — **SteadyDevs Venue Booking Pro**, named SteadyBook Pro in older entries. The free plugin covers the resource booking engine, approvals, emails, theming and reports.

= 1.11.3 =
* Changed: every `gbb_` / `GBB_`-prefixed function, class, constant, option, transient and hook is renamed to `steadydevs_` / `STEADYDEVS_`, per the WordPress.org review guideline requiring a prefix over four characters. Existing option values (business name, appearance, email templates, WhatsApp number and the rest) carry over automatically the first time the plugin loads after updating — nothing is reset. Developer hooks are a breaking change: if custom code hooks into any of the actions or filters listed in the readme, update the name.
* Fixed: the "WhatsApp us" email button and its number lookup were fully working code in the free build, gated only by a hidden settings field — a Guideline 5 violation. The button now lives entirely in the Pro plugin; the free build has no code for it at all.

= 1.11.2 =
* New: A timetable slot can now override its class's duration, the same way it already overrides capacity. Class Portal > Timetable has a "Duration override (min)" field next to the capacity one; leave it at 0 to keep using the class's default length. Clash detection, the member timetable and booking emails all use the slot's actual duration.

= 1.11.1 =
* Changed: the free plugin is renamed **SteadyDevs Venue Booking** and installs as steadydevs-venue-booking/. The text domain follows the new slug; if you maintain your own translation files, rename them to match. Nothing else changes — same features, same data, same shortcode.

= 1.10.1 =
* New: Class Portal > Setup opens with a setup checklist that reads your site instead of reciting the same four paragraphs to everyone. It reports how many classes are on the week, whether the credit packs are still the sample ones the plugin shipped, whether your pages carry their shortcodes, and whether any payment method actually works — with exactly one step marked "Next", so the screen only ever asks for one thing at a time.
* New: "Create the pages for me", on that checklist. It publishes the login and portal pages, drops the shortcodes in and selects them, in one click. A page you already made that carries the shortcode is reused rather than duplicated.
* New: The timetable takes several days at once. Tick Mon, Wed and Fri, set the time, save — a class running three days a week is one trip through the form instead of three. Every day is checked for clashes before anything is written, so a duplicate on one day never leaves half a week saved and an error about the rest.
* Changed: A page selected under Setup that has no shortcode in it is now reported. It used to look configured while sending members to a blank page, with nothing in the admin saying why.
* Note: The checklist does not tick "Price your credits" for the four starter packs — their prices are invented, and a checklist that congratulates you on numbers the plugin made up is worse than no checklist. Saving or removing a package is what ticks it.
* New: Members can pay for credit packages online. Set a payment method under Class Portal > Setup to be settled by a gateway instead of by you, and the member is sent to that provider's own checkout — no card details ever touch your site. The credits are added the moment the payment clears, so a pack bought at 11pm is usable at 11pm.
* New: HitPay is the first supported gateway, covering PayNow, cards, GrabPay, FPX and DuitNow through one checkout. Paste in your API key and salt, then copy the webhook URL shown on the same screen into your HitPay dashboard. A sandbox switch is there for testing before you go live.
* New: A "Test connection" button beside the gateway keys. It checks them against the provider there and then, using what is typed rather than what is saved, so a mistyped key is caught while you are still looking at the field instead of by the first member who tries to buy something. Nothing is charged and nothing appears in your gateway dashboard. It also names the most common mistake outright — a sandbox key with sandbox mode off, or the reverse — and reminds you that a working key still proves nothing about the webhook until a real payment goes through.
* New: A Currency setting (SGD, MYR, PHP…) next to the payment methods. Only online methods use it; the symbol members see is still set under SteadyBook > Settings.
* Note: Nothing changes for methods you settle yourself. A transfer QR, bank details or cash at the desk still cost nothing in fees and still wait for you to confirm them, and both kinds can be offered side by side at checkout.
* Note: A payment that does not add up is never credited automatically. A part payment, or one that settled in the wrong currency, is left pending in the Orders queue with a note saying what looked wrong — exactly where a transfer you have not confirmed would sit. The same applies if the webhook never arrives, so no payment is ever lost, only delayed until somebody looks.
* Changed: Confirming an order — by hand or by gateway — now goes through one code path, and the pending-to-paid step is settled by the database. A payment provider that delivers the same webhook three times, as they do by design, can no longer grant the credits three times.

= 1.7.0 =
* New: One account can now book for more than one person - for families with two or more children at the academy. Switch on "Attendees per account" under Class Portal > Setup. The member keeps the list themselves under Account, booking asks who the class is for, and a class one sibling already holds still offers the other a seat. Credits stay shared across the account; each attendee takes their own seat, so two siblings in one class cost two credits.
* New: Staff can edit the whole attendee list on a member's record, and the Members list shows how many people an account books for.
* Note: Off by default, and off behaves exactly as before - one account, one child. Nothing is migrated when you switch it on: the child already on file becomes the first attendee, and their existing bookings stay theirs. Switching it back off keeps the extra people on file, it just stops offering them.
* Changed: The double-booking guard is now per attendee rather than per account, so a parent can put two children in the same class. The class schema upgrades in place on first load.

= 1.6.6 =
* New: A Guide tab under Class Portal. The whole thing written down in the admin: how to set the tabs up in order, what each field actually does, the money step, and the two settings that can lock you out - with your own escape-hatch login URL printed in place. It ends with a plain-text guide for members that you can copy to the clipboard and paste into an email.

= 1.6.5 =
* Fixed: Admin panels no longer draw a box inside a box. The plugin's older styling gave every settings table its own white bordered panel, which showed up as an inner frame and a rule under each row once those tables moved into cards. The card is now the only outline - on Classes, Packages, Timetable, Levels and Members.
* Changed: More space above the save button on those screens, so it reads as the end of the form rather than another row.

= 1.6.4 =
* New: The Members tab is now a real member list. It shows everyone who can log in to the portal - not only those who have bought credits, so last night's sign-up is there - with their attendee, phone, balance and last activity, and a search box for name or email.
* New: Opening a member lets you edit their name, email, phone, attendee and age. It is the same form the member sees under Account, with the same checks, so a phone call to the front desk no longer means a trip through the WordPress user editor. Passwords and roles stay where they belong, on the WordPress profile.
* Changed: The Class Portal admin screens share one stylesheet instead of per-element inline styles. The two-column tabs (Classes, Packages) use a grid, so the right column no longer sits lower than the left and both stack cleanly on a laptop screen; forms sit in cards; label columns are one width throughout; counts and prices are right-aligned; and Edit / Delete no longer run together.
* New: The portal bar now shows your logo top left, next to the business name, and the pair links back to your home page - so a member can get out of the portal without the browser back button. It uses the logo set under Emails, falling back to the site logo from the Customizer; with neither set the name shows on its own as before. Where a logo is set the business name is not printed beside it - most logos already carry the name as artwork - though screen readers still announce it.
* Changed: "Use your own login screen" no longer takes over wp-login.php. Members are still sent to your page by every login link, reset email and admin bounce, but wp-login.php keeps working as the staff entrance - so you are not redirected out of your own login. Redirecting it is now a separate, opt-in checkbox underneath, off by default, because a visitor at wp-login.php is anonymous and the redirect cannot tell staff from members.
* New: A member who does log in at wp-login.php now lands on the portal instead of a dashboard they cannot use. Administrators and editors go to wp-admin as before.
* Fixed: A login prompt raised by wp-admin now goes to the WordPress login screen, not your member page - so being timed out of the dashboard no longer drops you on the parents' login form. Prompts from the rest of the site still use your page.
* New: "Create account" is back on the login page. It no longer depends on WordPress's "Anyone can register" setting, which opens wp-login.php to the whole internet - the portal has its own switch under Class Portal > Setup, on by default, and only ever creates subscribers through its own form.
* Note: Because sign-up was previously off on most sites, accounts made by hand have no child on file, so the portal bar shows their email rather than "Parent of ...". Filling in the child's name under Account fixes that account.
* New: Picking a page with no [steadybook_login] shortcode on it no longer lets the wp-login.php redirect be switched on, so an empty page cannot leave everyone staring at a blank screen. Settings still save; the warning tells you what to add.

= 1.6.1 =
* Changed: The public timetable now uses the member portal's styling and colours rather than its own - same day cards, level pills and palette - so a visitor who books and lands in the portal sees one design, not two. Both are driven from a single Appearance mapping, so changing your theme colours moves both together.
* New: The Buy credits screen groups packages by level, each under its own heading with how many credits you already hold in that level - so a parent buying for a Junior student is not scrolling past Elite pricing. Sites without levels keep the original single grid.
* New: Credit levels. Define your own tiers under Class Portal > Levels - as many as you like, named whatever your students are grouped by (Junior, Elite, Competitive...). Set a level on a class and on a package, and credits bought for that level can only book classes at that level, so you can charge a different rate per tier.
* New: Members see a balance per level rather than one number, and a level they hold nothing in still shows as 0 - which is the prompt to buy it.
* New: Booking refuses with "You need Elite credits to book this class" rather than a bare "not enough credits", so a member holding the wrong tier understands why.
* New: Manual credit adjustments and the members screen are per level.
* Changed: The class Level field is now a dropdown of your configured levels. The old free-text label is still there and still shown when no level is chosen, so nothing you typed before is lost.
* Note: Existing sites are untouched. Everything you already have stays "Any level" - one shared pool that books anything, exactly as before - and levels only start applying to what you assign them to. No balances are rewritten on upgrade.


= 1.5.13 =
* New: [steadybook_schedule] puts the weekly class timetable on any public page - a read-only Mon-Sun grid with no booking controls and no login, for a home or marketing page. It reads the same programmes and slots the portal books against, so there is one timetable to keep up to date rather than a copy hand-written into the page. Options: coach="no", spots="no", age="yes", legend="no", week="Y-m-d". Unlike the booking form it is not licence-gated, so your public timetable stays up even if a renewal lapses.


= 1.5.12 =
* Changed: On My Bookings, the line beneath each class name now shows the coach, and the credit figure is labelled "used" so it is not mistaken for a balance.

= 1.5.10 =
* New: The timetable now shows each class's level, and hovering a class reveals its full detail — level, age guide, duration, coach and description — so members can tell classes apart without leaving the schedule.
* New: Class duration is shown beside the coach on each class card.
* New: Help & info links on the Account screen. Point them at your terms, main site and contact page with [steadybook_portal terms_url="/terms" site_url="/" contact_url="/contact"]. A WhatsApp link is added automatically when you have a number set. The panel is hidden entirely if you set none of them.

= 1.5.9 =
* Fixed: Cancelling a class then booking it again failed with "You have already booked this class". The database rule that stops a member taking the same seat twice did not take cancellations into account, so a cancelled booking permanently blocked that member from rebooking that class on that date. Cancelled bookings are now excluded from the rule, while genuine double-bookings are still prevented. Existing bookings are migrated automatically on update.
* Fixed: Trying to book a class you have asked to cancel now says so, instead of reporting it as already booked.
* Fixed: Cancelling or declining a cancellation wrote empty text where a null value was intended, leaving stale timestamps on the booking record.

= 1.5.8 =
* New: Class Portal → Setup now shows your site's own clock and timezone. Every decision about which day is "today" and whether a class has started is made against that clock, so seeing it makes a wrong timezone obvious instead of showing up as a timetable that highlights the wrong day.

= 1.5.7 =
* Fixed: A class whose start time had passed could still show a Book button if the timetable had been open in the browser for a while. The timetable now closes classes as their start time arrives, without needing a page reload.
* Fixed: The timetable refreshes when you return to a tab that has been left open, so seat counts are current rather than however they looked an hour ago.
* Note: Times are judged against your WordPress timezone (Settings → General). If that is wrong, "now" is wrong, and classes will open and close at the wrong moment.

= 1.5.6 =
* Fixed: Booking a second class could wrongly report "You have already booked this class". Any failure to save a booking was being reported as a duplicate, so unrelated problems showed members a misleading message. A real repeat booking is now detected explicitly — one class, one date — and every other failure reports its own cause and is written to the PHP error log for diagnosis.

= 1.5.5 =
* New: Bookings screen under Class Portal — see who is booked into which class, filtered by upcoming, past, cancellation requests, cancelled or all, and searchable by attendee or class name.
* New: Cancel a class booking from the admin, with the refund as a separate choice: "Cancel + refund" returns the credits, "Cancel only" frees the seat without returning them, so a late cancellation can be released without paying it back.
* New: Optional member-requested cancellations. Switch on under Class Portal → Setup and members get a Cancel button in the portal with an optional reason. A request never frees the seat or returns credits by itself — it waits for you to approve or decline it. Leave the setting off and members are pointed at WhatsApp exactly as before.
* New: Cancellation cut-off setting — members cannot request a cancellation inside this many hours of the class. You can still cancel any booking yourself at any time.
* New: The Bookings tab shows a count of pending cancellation requests, so they are visible from any screen.
* Fixed: Cancelling was previously unreachable — the portal's Cancel button only opened a WhatsApp prompt and there was no admin cancel at all, so no booking could actually be cancelled and no credit ever returned.
* Developer: New actions gbb_class_cancel_requested ($booking_id, $user_id, $reason) and gbb_class_cancelled ($booking_id, $booking, $refunded).

= 1.5.4 =
* New: Payment methods. Credit checkout is no longer PayNow-only — add as many methods as you like under Class Portal → Setup, each with a name, instructions and an optional QR image. That covers PayNow, PromptPay, UPI, PIX, a plain bank transfer, or paying in person, anywhere in the world. Members pick a method at checkout and you confirm the payment as before.
* New: The chosen payment method is recorded on each credit order and shown in the Credit Orders queue, so you know which account to check.
* Changed: Existing PayNow settings are carried over automatically and keep working until you save the new Payment methods screen.
* Developer: New filter gbb_portal_payment_methods to add or alter the methods offered at checkout.

= 1.5.3 =
* Fixed: On the login page, the Log in / Create account toggle and the main buttons looked top-heavy — more space above the label than below. Their labels are now centred properly rather than sitting on a text baseline, so they read evenly whatever font your theme uses.
* Fixed: Uneven spacing above and below the Log in / Create account toggle.
* Fixed: Credit package badges ("Popular", "Best value") now sit centred on the top edge of their card instead of tucked to the left.
* Changed: The Business Name setting no longer falls back to a sample name. If you have not set one, the field is simply blank and the booking summary omits the business heading rather than showing placeholder text. Sites that already saved a business name are unaffected.
* Changed: Class Portal example wording is now generic rather than tied to any one type of business — placeholder text on the Classes and Timetable screens, the sample data in email previews, and the example names on the Create account form.
* Changed: The starter credit packages created on activation now use neutral round prices as placeholders. Existing packages are never overwritten, so this only affects brand-new installs.

= 1.5.2 =
* Fixed: The Log in / Create account toggle on the portal login page did nothing on some sites. The switching script was inline and anchored to its own position in the page, so any caching or optimisation plugin that moved inline scripts to the footer silently broke it. It is now a properly enqueued script that works wherever the form appears.
* Fixed: Login page buttons picked up the theme's styling instead of your booking colours, and "Forgot password?" rendered as a large coloured block rather than a text link. Buttons, links, inputs, labels and checkboxes are now insulated from theme styles.
* Fixed: Large gaps between the fields on the login card, caused by theme margins on form labels and inputs.
* Improved: The Create account form now matches the login design — name, email and phone, attendee name and age, password, an optional Terms & Conditions agreement, and a note about the free trial credit when you offer one.
* Improved: Field labels on the signup form are configurable, so you can say "Parent's name" and "Child's name" where that fits: [steadybook_login name_label="Parent's name" attendee_label="Child's name" age_label="Child's age" terms_url="/terms"].
* Security: Agreement to the Terms & Conditions is now re-checked on the server, not only in the browser.

= 1.5.1 =
* New: Your own branded login screen. [steadybook_login] now handles logging in, creating an account, forgotten passwords and setting a new password — all on one page, styled to your theme, with no WordPress screens in sight.
* New: Optional "use your own login screen" setting under Class Portal → Setup. Redirects wp-login.php to your page, points password-reset emails at it, hides the admin bar from members and keeps them out of wp-admin. Administrators and editors are unaffected, and wp-login.php stays reachable at ?gbb_wp_login=1 so you can never be locked out.
* New: Timetable clash checking. The same class can run on as many days and times as you like; adding a true duplicate, or putting one coach in two overlapping classes, is now blocked. Overlaps between different classes are reported but allowed, since two coaches can teach side by side. Back-to-back classes are correctly treated as no clash.
* New: Shortcode options on [steadybook_login] for the heading, subtitle, kicker, logo, "back to site" link and footnote.

= 1.5.0 =
* New: Class Portal — an optional second booking mode for recurring classes sold as prepaid credit packs, for academies, studios and anywhere people book a seat rather than a resource by the hour. Add it with the [steadybook_portal] and [steadybook_login] shortcodes.
* New: Members book a seat in a weekly class from a live timetable showing seats remaining, with credits deducted instantly. Each member has a dashboard, their bookings, a credit balance and an account page.
* New: Credit packages and a PayNow checkout. Members scan your uploaded PayNow QR and mark the order as paid; credits are granted only once you confirm the payment under Class Portal → Credit Orders. Nothing is credited automatically.
* New: Credit ledger — every credit movement is recorded with its reason, so a member's balance can always be explained. Manual adjustments require a note.
* New: Three emails for the portal (class booked, class reminder, credits added), editable under SteadyBook → Emails like every other email. Class reminders use the existing reminder schedule.
* New: Academy (cream & copper) colour preset, and the portal follows whichever appearance preset you have selected.
* New: Developer hooks — actions gbb_class_booked, gbb_credits_changed, gbb_credit_order_created, gbb_credit_order_confirmed, gbb_portal_member_registered and gbb_class_reminder_sent; filter gbb_class_reminders_due.
* Note: This is entirely additive. The existing [steadybook] hourly booking form, its data and all existing settings are unchanged, and both modes can run on the same site.

= 1.4.0 =
* New: Reports — a Utilization & Yield dashboard under SteadyBook → Reports. Shows how much of your sellable time actually sold, revenue per available hour, a weekday × hour busy grid, performance per resource, a peak vs off-peak comparison, the request funnel and median booking lead time. Date presets or a custom range, plus CSV export.
* New: Developer hook reference in the User Guide (SteadyBook → User Guide → For developers) and in this readme, so the hooks added in 1.3.0 are documented inside the plugin rather than only in the source.

= 1.3.0 =
* New: Booking reminders — email customers a set number of hours before an approved booking (off by default; switch it on under SteadyBook → Settings). The wording is editable under SteadyBook → Emails like every other email.
* New: Developer hooks. Actions gbb_booking_created, gbb_booking_status_changed, gbb_booking_approved / _rejected / _cancelled and gbb_reminder_sent; filters gbb_booking_total, gbb_time_slots, gbb_bays_availability, gbb_email_subject, gbb_email_body, gbb_email_recipient and gbb_email_should_send. gbb_time_slots is the seam for blackout dates and custom opening hours.

= 1.2.15 =
* Fixed: Rejected bookings no longer occupy their time slot — rejecting a request now frees it for other customers, the same as cancelling.
* Fixed: Approving a booking now checks the full time range, not just the start time. Previously an approved 3-hour 08:00 booking did not stop a 09:00 booking on the same resource from also being approved.
* Changed: Rejected and cancelled bookings are final and can no longer be re-approved or changed again. To reinstate one, the customer books again.

= 1.2.14 =
* New: 14-day free trial with no credit card required, offered on the Starter plan.
* Changed: Pricing is now annual-only across Starter, Professional, Agency and Custom — the monthly billing option has been removed.
* Removed: Unused demo-mode helper that was never wired into the booking flow.

= 1.2.13 =
* Fixed: On the date picker, the weekday label of the selected day now turns white to match the date number (previously it stayed grey).

= 1.2.12 =
* New: Minimum Advance Notice (hours) setting — require bookings to be made a set number of hours ahead. On today's date, slots inside the lead-time window show "too soon" and can't be selected. Defaults to 1 hour; set to 0 to only block times that have already passed.
* Improved: On today's date, start times that have already passed are now blocked on the booking form and re-validated on submit.

= 1.2.10 =
* New: Time Slots admin page — add, enable/disable and remove the bookable start times from the dashboard (previously fixed at 07:00–22:00). Only active slots show on the booking form.
* New: Business hours generator on the Time Slots page — set an opening and closing time and generate the hourly slots automatically. Start times can be on the half/quarter hour (e.g. 09:30); the closing time must share the same minutes (09:30 → 18:30).
* New: Configurable maximum booking duration (Settings) — the booking form now offers 1…N hourly duration options instead of a fixed 1–3.
* Fixed: Multi-hour bookings now correctly occupy every hour they span. An 8:00 booking for 3 hours makes 9:00 and 10:00 unavailable for that resource, in the time-slot list, the resource availability, and the final conflict check.
* Improved: Availability and conflict checks now work in minute precision, so half/quarter-hour start times are handled correctly, and time slots are ordered by their actual time.

= 1.2.9 =
* Fixed: Peak pricing is now actually applied. When a customer picks a date on a configured peak day, each resource is charged its peak rate — on the booking form total (with a “peak rate” note) and on the recorded booking. Previously the peak price was only shown, never charged.
* New: In-dashboard User Guide page — a step-by-step reference covering setup, peak pricing, publishing the form, managing bookings and emails, plus an FAQ.
* New: Sender Email and Sender Name settings — set the “From” address/name on customer emails (receipt, approved, rejected). Applied via the standard WordPress mail filters, so an SMTP plugin’s “Force From” still takes precedence when enabled.
* Changed: Hid the Freemius “Contact Us” submenu; the User Guide now points users to contact@steadydevs.com for support.

= 1.2.7 =
* New: Configurable form-panel padding (per side) — set Left to 0 to align the step content with the “1 2 3” progress bar.
* New: Configurable step-heading text (“Pick your day”, “Pick a tee time”) and a smaller, adjustable step-heading size.
* New: “Selected highlight” colour for the selected time/date (defaults to your Primary) — the selected time slot is no longer hard-coded green.
* Fixed: Time-slot text is now readable on dark presets (e.g. Midnight) when not selected.

= 1.2.6 =
* New: The Appearance page now shows a live preview of the real 3-step booking form, sticky on the right, with step tabs — so every color, wording and layout change is visible immediately.
* New: Emails use a “WhatsApp us” button with a dedicated email WhatsApp number (falls back to the booking number).
* Fixed: Email template color changes now reflect in the live preview, which is also wider and taller.

= 1.2.5 =
* New: Editable HTML email templates — a dedicated Emails page with the native editor (Visual/code), a live preview, per-email color overrides (defaulting to your theme), a logo, and on/off toggles per email. Emails now send as HTML.
* New: Email notifications on submission — an admin new-booking alert (to a configurable address, blank = off) and a customer receipt, alongside the existing approve/reject emails.
* New: Quick Setup page with just the essentials for faster onboarding.
* New: Booking form polish to match the reference design — Name/Mobile side by side with required-field markers, transparent players selector, dotted coaching card, transparent Back button with hover fill, pill buttons with a hover glow, and a configurable Back-button text color.
* Improved: Progress steps are left-aligned and inline, showing a tick once completed.
* Improved: The form panel (card) background, shadow and border can all be removed to sit flush on the page.

= 1.2.4 =
* New: Configurable form panel — keep the card with shadow, drop the shadow, or remove the background entirely so the form sits flush on the page.
* Changed: The "Confirm button" color is now "Continue / Confirm button" and styles every primary button (step Continue buttons and the final Confirm), including hover.
* Improved: Action buttons are content-sized with Continue aligned right and Back left, matching the reference layout.

= 1.2.3 =
* New: Configurable resource terminology — rename “Bay” to Slot, Class, Court, Room, etc. (singular + plural), applied across the booking form and admin. Default is now “Slot/Slots”.

= 1.2.2 =
* New: Peak / non-peak bay pricing — each bay has a non-peak and peak price, with configurable peak days; both prices show on the booking form.
* New: Configurable confirm button label and background color, and a configurable summary note with full styling (color, size, bold, italic, alignment).
* Improved: Step 1 now shows only bookable dates as a compact, paginated month grid (no more full calendar or horizontal scrolling).
* Improved: Progress steps show a tick once completed instead of the number.
* Changed: Step 3 simplified to a single “Send booking request” action (removed the WhatsApp/Pay-online toggle); it still creates the booking and hands off to WhatsApp.

= 1.2.1 =
* New: Editable form wording (heading, subheading, summary label) and configurable coaching label/description.
* New: Appearance controls — "Your Booking"/summary/price colors, transparency for card, summary and page background, and a border option for the back-most background so the form can blend into any page.
* New: Live preview now reflects wording, layout, transparency and border — not just colors.
* Improved: Bays admin — read-only list with a dedicated edit screen and a delete action with confirmation.
* Improved: Availability now surfaces earlier — fully-booked/limited time slots and already-booked bays are shown before the confirmation step.
* Improved: Native browser pop-ups replaced with a themed modal that follows the appearance settings.
* Changed: Admin screens restyled to the Steady Devs brand; removed the Support Forum menu item.

= 1.2.0 =
* New: Appearance / theming panel — color presets, custom color pickers, layout, background and motion controls, with a live preview.
* The booking form is now themed entirely through scoped CSS variables (no theme edits required).

= 1.1.0 =
* New: Booking approval workflow — approve / reject / cancel from the admin.
* New: Double-booking guard when approving.
* New: Customer email field with automatic approve/reject notifications.
* New: Freemius licensing (annual subscription).

= 1.0.0 =
* Initial release: 3-step booking, configurable resources, real-time availability, WhatsApp integration, responsive design.
