= 4.3.0 =
* New design system for portal and admin surfaces, with clearer admin information architecture.
* Restored the 4.2.3 customer booking presentation, service cards, category jump navigation, spacing, and summary layout.
* The complete service list stays visible; Read more retains its original text-link styling and now expands reliably.
* Staff profile self-service with progress/retry feedback, collapsible admin groups, and accessibility improvements.
* Improved admin navigation hover contrast and added comfortable spacing between the sidebar and page content.
* OTP, session, privacy-tool, and PWA scope hardening.
* Real production minification for CSS and JavaScript assets.

= 4.2.2 =
* Free package rebuilt from the working Pro baseline and cleaned for Plugin Check ERROR items: escaping, translator comments, gmdate usage, migration SQL ignores, remote script removal, and Free-only integration stubs.

= 4.2.1 =
* Security hardening: Square access token, Vagaro API key, Stripe secret/webhook keys, Twilio auth token, Square webhook signature key, and Google Calendar client secret/refresh token are now encrypted at rest in the database instead of stored as plain text, using AES-256-GCM (authenticated encryption - a tampered or truncated value is detected and rejected rather than silently decrypting into garbage). The encryption key is derived from the site's own WordPress salts, so no separate secret needs to be managed. This covers every known save path, including the Setup Wizard's Square/Vagaro connection steps and the "Save All Settings" bulk handler. Existing saved credentials (plain text or the initial CBC-based format) keep working with no migration step and are transparently upgraded to the new format the next time they're saved.
* "Is this credential configured?" checks for Square, Stripe, and Google Calendar now read through the same decrypting path used elsewhere, for consistency.
* Documented an object-cache caveat for OTP/rate-limit transients in docs/SECURITY_NOTES.md (matters mainly for multi-server/Redis-Memcached setups).
* Fixed corrupted characters in the Spanish, Vietnamese, and Simplified Chinese translation files (a past save had mangled individual multi-byte characters, which could make the .po file fail to load entirely). Also brought all three languages fully up to date with the current 4.2.1 string list (Loyalty, Automations, Broadcasts, Square Payments, OTP, AI Assistant, Setup Wizard, and more) - Spanish, Vietnamese, and Simplified Chinese are now at 100% translation coverage (686/686 strings).
* Fixed a pre-existing bad character in the admin Bookings list that could break the page's JavaScript.
* Cleaned up leftover mojibake (a corrupted em dash) in this changelog's older entries.

= 4.2.0 Square payment suite =
* Hardened booking verification so email/SMS OTP settings are enforced server-side, not only in the browser.
* Added an optional strict Cloudflare Turnstile mode for active bot-attack windows.
* Refined Freemius-facing privacy, external-service, GPL, and Yatoon brand wording.
* Added Square Web Payments support for Card, Apple Pay, Google Pay, Cash App Pay, and Square Gift Card checkout in Pro.
* Customers can now pay through Square during booking, then the appointment continues through the existing Square appointment/POS sync flow.
* Added Square Application ID, Square payment enablement, payment method selection, country code, and deposit/full-payment mode settings under Deposit / Pre-Payment.
* Added setup guidance for Apple Pay domain registration, HTTPS/Safari requirements, Google Pay availability, US-only Cash App Pay, and Square seller gift cards.
* Square payments are verified server-side before a booking is saved and recorded against the existing booking/order payment fields.

= 4.1.3 =
* Kept the professional 5-step booking flow and tightened the mobile first-screen spacing.
* Added instant booking URL support for direct service, staff, and category links.
* Added automatic soonest-opening search on the date/time step.
* Slimmed mobile service cards so clients see more services before scrolling.
* Improved checkout confidence messaging on the review step.

= 4.1.2 =
* Added a Loyalty / Rewards points program (left nav > Loyalty): clients earn points automatically once a visit is marked paid (points-per-dollar rate you set), and staff can redeem a configured reward (percent or fixed amount off) right from the Staff Portal checkout screen once a client has enough points. No separate customer sign-up needed - points track against the same phone/email already used for bookings.
* Added Marketing Broadcasts (left nav > Broadcasts): send a one-off email or SMS to a segment of clients - everyone, clients who haven't visited in X days, clients who've booked a specific service, or a tag. Shows a live recipient count before sending, sends in small batches with a progress bar (safe to resume if interrupted), and keeps a history of past broadcasts. This is separate from the existing "Messages" inbox, which is for customers contacting the business, not the other way around.
* Updated the bundled Freemius SDK to 2.13.4.

= 4.1.1 =
* Fixed multi-service visits not merging into one calendar card when the underlying booking rows didn't have a shared group link (older bookings, or edge cases in how they were created). The calendar now also merges rows that are unmistakably the same visit - same customer, same staff, and the exact same start time - as a fallback, so grouping works regardless of how or where the booking originated.

= 4.1.0 =
* CRITICAL FIX: bookings submitted through the website's booking form could silently fail to save ("Failed to save booking") because the bookings table was missing a database column (design_upload_token) that the booking-save code has referenced since 4.0.4. This did not affect bookings synced in from Square directly, only ones created via the booking form itself - which is why it could go unnoticed while the calendar still looked normal. The missing column is now added automatically on update, no manual action needed. Also added error logging so any future insert failures are recorded in debug.log with the actual database error instead of a generic message.
* Added an independent admin app shell: a dedicated left navigation rail + top bar replacing the default WordPress admin chrome on Yatoon screens (grouped nav, quick search, "+ New Booking" quick-create), for a more SaaS-app feel. Includes "Back to WordPress Dashboard" and "View Site" escape-hatch links, and hides WordPress's native "Screen Options / Help" toggle tabs which otherwise floated oddly once the surrounding chrome changed.
* Staff Portal calendar (Day/Agenda/Week/Today/Month views): bookings that share one visit (a customer with multiple services back-to-back, e.g. Gel Manicure + Pedicure) now display as a single merged card like Square does, instead of two separate same-name blocks. Opening it shows an itemized breakdown; Edit lets you pick which specific service to adjust.
* Fixed: marking a multi-service visit as paid, arrived, completed, or no-show previously only updated the first service's row, leaving sibling services stuck showing the old status/payment. All services in the visit now update together.
* Fixed a function-naming collision where the Today tab was silently showing whichever day was last selected elsewhere in the calendar instead of the actual current date.
* Added an idle auto-lock to the Staff Portal: after a configurable period of inactivity (default 5 minutes, adjustable in Settings > Staff Portal Security, or disabled entirely), the screen returns to the PIN lock automatically so an unattended device doesn't stay signed in.
* Documented the existing PIN security model in Settings (bcrypt-hashed PINs, progressive lockout after repeated wrong attempts, 12-hour session expiry).
* Added mobile card-layout responsiveness to the Bookings admin table (previously required horizontal scrolling on phones; now collapses into stacked cards like the Services and Staff tables already did).
* Added mobile "quick-jump" staff tabs to the admin Staff Calendar so switching between staff columns on a phone/tablet no longer requires scrolling past every other staff member's day.
* Added a quick-jump anchor nav to the longest Settings sub-section (Platform & Booking Setup) so its several cards are easier to scan and jump between.
* Added a new visual Automation builder (left nav > Automation): set up rules like "24 hours after a booking is still Pending, send an SMS reminder to confirm" without digging through scattered settings. Rules are shown as connected trigger -> action cards, can be reordered by drag, and tested with your most recent booking. Triggers: new booking, status changes to X, still-unconfirmed after X hours, X hours before/after the appointment. Actions: email customer, SMS customer, email the business.
* Added a live color preview to Brand & Colors: adjusting the Primary/Secondary/Text color pickers now updates a live mockup of the booking page instantly.
* Polished the customer booking page's step transitions and primary button interactions with smoother easing and subtle hover/press feedback.
* Warmed up the Setup Wizard and Launch Checklist copy.
* Consolidated overlapping admin CSS design-token systems for long-term consistency.

= 4.0.5 =
* Fixed: design/photo-upload highlight now actually appears in the Bookings admin list, the admin Staff Calendar, and every Staff Portal calendar view (it previously had no matching styles wired up).
* Fixed: the design-upload highlight on colored Staff Portal timeline cards no longer makes the appointment text unreadable; it now uses an amber ring and a small photo badge instead of overwriting the card's background/text color.
* Added the same photo-upload highlight to the Staff Portal "Today" view, which was previously missed.
* Fixed PIN pad double-tap-to-zoom on the Staff Portal login screen (pinch-to-zoom still works).
* Added a simplified "Month" calendar view to the Staff Portal for staff who only need to see their own schedule at a glance, with day-tap agenda and a detail sheet. This is now the default view for staff without multi-schedule permissions.
* Added a "View details" button to admin Staff Calendar cards, opening a popup with full customer, service, payment, notes, and design-reference details.
* Added a manual Duration (minutes) field to the Staff Portal appointment editor so appointment length can be adjusted independent of the service's default duration, similar to Square.
* Fixed: appointments rescheduled directly in Square (time changed, not just status) were not being picked up by the booking sync - only status and staff reassignment were synced before. Reschedule times now sync correctly.
* Added a Square webhook option (Settings > Sync Settings > Real-time Sync) so changes made directly in Square - reschedules, cancellations, no-shows - show up here within a second or two instead of waiting for the periodic sync interval, with a short debounce so bursts of events don't cause repeated API calls. The periodic sync still runs as a backup.

= 4.0.4 =
* Added a design-image filter and gallery viewer to the Bookings admin list so image-backed appointments can be reviewed in batches.
* Added in-place full-size design image preview to the Staff Portal appointment detail view.
* Hardened Pro design-reference uploads with attachment tokens, orphan cleanup, and limited image derivative generation.

= 4.0.3 =
* Added a compact search bar under the category tabs on the booking page so customers can quickly find a service by name or description.
* Fixed Business Logo not saving in Brand & Colors (logo was written to the wrong option key and never appeared on the booking page, portal, or emails).
* Fixed deleted/renamed service categories lingering forever in the Brand & Colors "Category Order & Names" list.

= 4.0.2 =
* Improved contrast for the Today command card in the owner dashboard.
* Removed the duplicate horizontal scrollbar from the Staff table.
* Reworded the customer design-image upload prompt to clearly request a reference photo showing the desired color, shape, or nail art.

= 4.0.1 =
* Rebased the Pro package on the known-working 3.6.0 booking flow.
* Kept the existing Confirm Booking button and booking submission logic unchanged.
* Fixed Just me appointments so they skip the group-only Add guests and services screen.
* Tightened the mobile category tabs and More button spacing so the final tab is less likely to be clipped.
* Made the customer self-service post-cancel buttons compact on mobile screens.
* Added a backward-compatible Vagaro API loader for legacy AJAX paths.
* Preserved Pro Freemius packaging and Square, Vagaro, Google Calendar, and Twilio integrations.

= 3.6.0 =
* Added a Today workspace with next-client and daily attention indicators.
* Added Staff, Manager, and Owner presets with granular permission overrides.
* Added staff time-off requests, manager approvals, and automatic schedule blocking.
* Added client history, allergies, preferences, and recent notes to appointment details.
* Added top employee tabs so mobile calendars show one staff schedule at a time.
* Maintains compatibility with existing appointments, staff PINs, availability, shortcodes, and settings.

= 3.5.0 =
* Added a dedicated Yatoon admin shell and fixed right-edge clipping across plugin screens.
* Refined the staff portal with Day, Week, and Agenda views plus a compact mobile workflow.
* Added secure customer design-reference uploads for enabled services and Nail Art / Custom Design add-ons.
* Design images now appear in booking administration, staff appointment details, and admin notifications.
* Added global and per-service controls for customer image uploads.
* Added reusable existing-item selection when creating service options, with shared Square or local IDs.
* Improved the mobile booking progress header while retaining the original two-column staff cards.
* Fixed visible encoding artifacts and strengthened service-schema repair during upgrades.
* Maintains compatibility with existing bookings, shortcodes, services, staff, and settings from 3.4.0.

= 3.4.0 =
* Preserved the 3.3.20-3.3.29 Services admin fixes as the new release baseline.
* Added a privacy-aware five-step activation funnel for opted-in Freemius installs.
* Added anonymous event queuing, background delivery, retry limits, and local-only fallback.
* Kept the database schema version pinned because this release has no table changes.

= 3.3.29 =
* Replaced the Services list status checkbox with a clear Active/Hidden status button so selection and visibility controls are no longer confused.
* Widened the Edit Service modal, added an explicit close button, and prevented option action controls from being clipped.

= 3.3.28 =
* Made Service Options / Variations editable directly inside the Edit Service modal, including name, duration, price, and type.
* Added per-option Save and Delete controls so add-ons no longer need to be deleted and recreated for small changes.

= 3.3.27 =
* Reworked the Services admin page into self-contained service rows that show key details without dragging right.
* Disabled resizable-column behavior for the Services list so old saved column widths cannot squeeze the visible content.

= 3.3.26 =
* Reworked the Services admin list into a compact overview that fits common admin screens without hunting for far-right actions.
* Added click-row-to-edit behavior so service details, categories, options, and add-ons are managed in the edit modal instead of a wide inline table.

= 3.3.25 =
* Moved Services admin management actions into the top toolbar: select one service, then Edit Selected, Add Add-on, or Delete Selected.
* Hid the far-right row Actions column from the Services table so important controls no longer require horizontal scrolling.

= 3.3.24 =
* Fixed the Services admin table column initialization so Service Name no longer expands and pushes Duration, Price, Category, Status, and Actions off-screen.
* Preserved resizable columns while applying practical default widths and a one-time reset of older saved oversized Services table widths.

= 3.3.23 =
* Refined the Services admin table so default columns start narrower while remaining resizable by the user.
* Reset old saved Services table widths and made service selection update immediately on pointer down.

= 3.3.22 =
* Improved the Services admin table so key actions stay visible without horizontal hunting on desktop screens.
* Made service row selection more reliable by increasing checkbox hit targets and allowing the checkbox cell to toggle selection.

= 3.3.21 =
* Improved the Services admin option editor with visible Save/Delete actions, Unsaved/Saved feedback, and clearer inline option management.
* Fixed duplicate horizontal scrollbars on the Services admin table so option editing is easier to use.

= 3.3.19 =
* Stability: Free and Pro now load the same shared core before all business classes.
* Upgrade safety: UI-only releases no longer rerun the full database schema migration.
* Testing: Added automated shared-core, schema-upgrade, package parity, and WP-CLI smoke tests.
* Onboarding: Added package-aware setup, optional demo data, automatic pages, and direct test booking.
* Insights: Added a local activation funnel from activation through the first real booking.
* UI: Balanced mobile booking-page endings while keeping Pro free of public attribution.

= 3.3.18 =
* Improved: Client profiles now surface VIP, upcoming booking, no-show, and unpaid signals directly in the client list.
* Improved: Square no-show fee statuses are clearer across Staff Portal, admin calendar, and bookings.
* Improved: Booking payment status labels now include no-show fee charged and waived states for cleaner operations.

= 3.3.17 =
* New: Added a Square-only no-show fee workflow for Staff Portal and admin calendar.
* New: Staff can open Square, copy the Square booking ID, mark a no-show fee charged in Square, or waive the fee after marking an appointment No Show.
* Improved: No-show appointments remain visible in operational calendar views so staff can finish the charge/waive decision.

= 3.3.16 =
* Refined mobile booking polish, admin clarity, license messaging, and package metadata for a cleaner production release.
* Improved touch targets, focus states, and card spacing across the booking UI without changing existing workflows.

= Changelog =

= 3.3.20 =
* Fixed Android/narrow-browser wrapping in option and add-on cards so long labels no longer collapse into vertical text.
* Improved mobile booking container width and option-card spacing for a cleaner, less cramped layout.

= 3.3.15 =
* Final polish: mobile steps, service cards, category tabs, AI helper, and license/upgrade wording are cleaner and easier to scan.
* Improved: Booking flow copy is clearer across group bookings, staff choice, appointment length, review, and mobile cart states.
* Improved: Add guests and services review uses numbered guest labels and a consistent primary action style.
* Improved: Time selection now uses an Edit Services action that returns customers to the service/guest review instead of defaulting to adding another service for Me.

= 3.3.14 =
* Improved: Group guest appointments now show the time range first and Reserved Time underneath, with guests clearly shown as starting together instead of implying sequential service order.

= 3.3.12 =
* New: Added separate mobile and desktop Popular Picks count controls with custom 1 to 12 item limits.
* Improved: Reduced the spacing between service category tabs and the first category heading for a cleaner mobile storefront.
* Improved: Popular Picks now adapts per screen size while keeping full, uncropped service cards.

= 3.3.5 =
* Improved: Popular Picks on mobile now uses complete service cards instead of a horizontal rail that can show a cropped second card.
* Improved: Popular service cards now adapt to two-column mobile layouts and single-column ultra-narrow screens for a cleaner storefront feel.
* New: Added a Brand Settings toggle to show or hide the Popular Picks section on the booking page.
* Improved: Added a SaaS-style polish pass for admin cards, tables, forms, customer booking surfaces, and staff portal tap targets.
* Fixed: Staff Portal calendar now loads the selected week instead of only today, so staff can view past and upcoming appointments.
* Improved: Staff Portal More sheet now shows current Add Appointment, Customers, and All Schedules permission status.
* Improved: Staff Portal bottom navigation now stays fixed to the screen bottom and adapts when all feature buttons are enabled.
* Improved: Staff Portal multi-staff timeline is more compact and scannable on mobile, closer to a professional calendar app.

= 3.3.4 =
* Improved: Staff Portal now feels more like a native mobile app with icon-style navigation, compact top actions, clearer empty-day actions, richer timeline cards, and a more useful appointment detail sheet.
* Improved: Owner Dashboard now opens with a daily command center focused on today's visits, unpaid appointments, and quick operational actions.
* Improved: Customer booking pages received another mobile polish pass for quick date choices, no-availability actions, mobile cart bar, and success confirmation cards.
* Improved: Staff Portal production assets were refreshed so minified CSS/JS builds load the same app polish.

= 3.3.3 =
* New: Added a customer-facing popular services rail so visitors can start from featured or commonly booked services faster.
* New: Added booking highlight cards and quick date shortcuts for Today, Tomorrow, and This week.
* Improved: Staff Portal now includes daily appointment insights, customer list insights, message templates, and a direct message action from appointment details.
* Improved: Staff Portal calendar styling now better matches the Yatoon booking theme with a brighter app-like interface.
* Improved: Saved Square, Vagaro, Stripe, Twilio, and Google secrets are now masked in admin forms and are not overwritten by blank credential fields.
* New: Added Yatoon-specific capability names for future owner, manager, booking, service, staff, and report role delegation.
* New: Added market positioning and security notes for launch, support, and customer evaluation.

= 3.3.2 =
* Improved: Booking pages in immersive mode now suppress common theme page titles and top spacing for a more app-like customer experience.
* Improved: Mobile booking action bar is constrained inside the viewport with cleaner spacing, rounded edges, and safer small-screen button sizing.
* Improved: Time selection, date cards, empty availability states, and calendar panels received another visual polish pass.
* New: Added a one-click Staff Portal page creator in Settings so merchants can quickly create the staff mobile app page with [yatoon_staff_portal].
* Improved: Setup readiness now tracks whether the Staff Portal page exists.

= 3.3.1 =
* Improved: Added a full experience polish pass across the customer booking flow, Staff Portal, Dashboard, Bookings, Services, settings cards, modals, and setup wizard.
* Improved: Customer booking cards, category tabs, option choices, time slots, checkout panels, mobile cart bar, and form focus states now share a cleaner premium Yatoon visual system.
* Improved: Staff Portal now feels more app-like with refined top bar, day tabs, calendar shell, client cards, bottom navigation, empty states, and checkout controls.
* Improved: Admin screens now have more consistent SaaS-style cards, KPI panels, table surfaces, toolbar spacing, status badges, rounded controls, and modal styling.
* Improved: Mobile spacing and touch targets were refined for a simpler, more practical booking and staff workflow.

= 3.3.0 =
* New: Staff Portal Checkout adds Square-focused in-person checkout helpers, including Open Square App, Open pay link, Copy pay link, and clearer mark-paid controls.
* New: Added admin settings for Square Checkout URL, Square App URL, and a staff-facing Square checkout note.
* Improved: Payment requests now prefer the Square Checkout URL when configured, then fall back to the generic Payment Request URL or manage-booking link.
* Improved: Staff checkout messaging now better explains that Stripe/hosted links support online wallet payments, while NFC Tap to Pay is handled through Square App or a native Square SDK app.

= 3.2.5 =
* New: Staff Portal now supports Square-style owner-controlled calendar permissions for each PIN.
* New: Authorized staff can add appointments, edit appointment time/service/staff/notes, cancel appointments, and search existing client profiles while booking.
* Improved: Staff Portal now uses a Square-style mobile calendar timeline with staff columns, appointment blocks, and tap-to-create empty time slots.
* New: Staff Portal adds Customers and Messages tabs with client list/search, client detail profiles, add/edit/delete client controls, Twilio SMS sending, and WhatsApp quick-open links.
* New: Staff Portal adds a Checkout tab and appointment checkout sheet for marking in-person payments, Square POS/Tap to Pay payments, waived balances, and sending payment requests by email, SMS, or WhatsApp.
* Improved: Staff Portal visual styling now follows the Yatoon booking brand instead of forcing a dark calendar theme.
* Improved: Staff Portal appointment management now enforces server-side permission checks, staff schedule conflict checks, and Square create/update/cancel calls when the site is in Square mode.
* Changed: Staff Portal cancellation preserves appointment history; hard delete remains limited to WordPress administrators.

= 3.2.0 =
* New: Staff Portal now supports owner-controlled calendar permissions for each PIN, including view-only access, all-staff schedule visibility, and status update permission.
* Fixed: Pro Staff Portal status updates now use permission checks instead of the Free-version upgrade block, so authorized staff can mark arrived, no-show, or completed.
* New: Completed the four-stage UI polish pass with a shared frontend and admin design layer for buttons, cards, forms, tables, modals, badges, toasts, empty states, and focus states.
* Improved: Mobile booking flow now has more consistent service selection, time selection, cart bar, drawer, empty states, and checkout review styling.
* Improved: Dashboard, Bookings, and Services admin screens now share a cleaner SaaS-style visual system with improved tables, toolbars, status badges, KPI cards, and dialogs.
* Improved: Reduced more high-impact inline styling in booking and admin templates by moving presentation into the shared UI polish stylesheet.
* Improved: Accessibility, keyboard focus, admin modal semantics, toast announcements, and privacy/external-resource presentation were refined.
= 3.1.5 =
* New: Added a premium booking flow refresh with a stronger venue hero, polished service list, sticky category navigation, and checkout-style summary sidebar.
* Improved: Mobile booking now uses a more refined bottom cart bar and drawer treatment for a cleaner Fresha/Square-like experience.
* Improved: Service cards, appointment type choices, AI helper, location banner, policy blocks, form fields, and success state have clearer spacing, depth, and selected states.
* Improved: Reduced visual dependence on inline template styles by moving more presentation into the shared UI polish stylesheet.
* Improved: Key booking hero strings are now localized for translation workflows.

= 3.1.0 =
* New: Added a unified UI polish layer for frontend booking pages and admin screens with more consistent cards, buttons, spacing, shadows, and mobile behavior.
* New: Added modern admin toast notifications to replace disruptive browser alerts on Yatoon admin pages.
* New: Added privacy controls for loading Google Fonts, international phone assets, and IP-based country detection.
* Improved: Booking form service cards, selected states, summary panels, AI assistant block, success areas, and mobile cart drawer now feel more cohesive.
* Improved: Key frontend labels such as Rating, Read more, and Show less are now localized.

= 3.0.7 =
* Improved: AI service recommendations now rank synced local availability by customer timing preferences such as today, tomorrow, morning, noon, afternoon, and evening without treating those preferences as hard limits.
* Improved: AI availability guidance now clarifies that Square and Vagaro times are based on synced local availability data and must be confirmed in the booking form, avoiding extra live API calls during AI suggestions.

= 3.0.6 =
* Improved: Staff editor modal adapts to wider and narrower admin windows so blocked-time controls remain visible.
* Fixed: Service order numbers are easier to read when they contain two or more digits.
* Fixed: Dragging services saves the new visual order reliably instead of snapping back to the previous order.
* Fixed: Long admin tables show a synced horizontal scrollbar so right-side columns remain reachable.
* New: The AI privacy note under the customer input can be edited from the AI Assistant settings page.
* Improved: AI service recommendations can use live staff assignments and upcoming availability snapshots when answering timing questions.
* New: AI provider order and model choices can be configured for OpenAI, Google Gemini, and Anthropic.

= 3.0.4 =
* Improved: Staff photos and names open the staff profile editor directly, alongside the existing Edit action.
* New: Staff profiles include photo upload/removal through the WordPress Media Library.
* Improved: Blocked Times now use a simple date/time editor with all-day support instead of requiring formatted text rules.

= 3.0.3 =
* Improved: AI Assistant collapsed button keeps the merchant's custom title, size, color, and background controls.
* Improved: Admin list tables keep long names and emails on one line with ellipsis instead of vertical wrapping.
* New: Desktop admin list tables support drag-to-resize columns with saved widths per table.

= 3.0.0 =
* New: AI-ready booking experience for WordPress 7.0 AI Client.
* New: Frontend AI service helper suggests clickable matching services from the salon's real service menu.
* New: AI service description helper improves customer-facing service descriptions from the Services editor.
* New: Pro adds AI reply drafts for Text Us messages, reviewed by staff before sending.
* Improved: AI Assistant page explains provider priority when multiple WordPress Connectors are connected.
* Improved: WordPress 6.9 and older remain fully compatible; AI actions show clear guidance when the AI Client is unavailable.
* Improved: Dedicated AI Assistant admin page now shows AI switches, availability, and connector guidance.

= 2.9.0 =
* New: Beauty-focused booking templates: Clean, Beauty, and Luxury.
* New: Launch Center preview action and setup readiness checks.
* New: Admin-only Test Booking Mode for local booking flow validation.
* Improved: Slimmer default admin menu with optional advanced tools.
* Improved: Mobile booking flow polish and refreshed starter salon data.
* Improved: Front-end style templates now apply consistently across booking views.
* Improved: Local booking race protection and cached next-opening lookups.
* Improved: Added official live demo links for easier customer evaluation.
= 2.8.5 =
* New: Services now include category management for renaming and deleting service categories.
* New: Service category selection now supports existing-category dropdowns plus quick creation of new categories.
* Improved: Add-on copying is now available directly from each service row.
* Fix: Service-row Add Add-on can now create manual local add-ons even when no Square-backed source options exist.

= 2.8.4 =
* Fix: Square and Vagaro no-slot responses now use a safer message that explains the business may be closed or fully booked.
* Fix: Square mode can read Square location hours when available, while keeping Square as the source of bookable time slots.

= 2.8.3 =
* Change: Removed separate plugin timezone controls; admin booking and calendar times now follow the WordPress site timezone.
* Fix: Customer self-service cancellation now cancels the full multi-service appointment group and immediately removes it from staff calendars and availability.
* Fix: Sidebar Confirm Booking button now performs the same checkout action as the main form button.
* Fix: Sidebar Confirm Booking button now shows the same confirming state as the main form button after it is clicked.
* Fix: Local multi-service bookings now normalize the whole group to the same auto-confirm status after creation.
* Fix: Local business hours now calculate weekdays in the WordPress site timezone, preventing Sunday/Monday open and closed days from shifting.
* Fix: Local-mode multi-service booking creation now uses the same staff-assignment search as availability display, preventing shown slots from failing at checkout due to a greedy Any staff assignment.
* Fix: Removed old admin placeholder cancel handlers so cancelling a booking shows only the plugin's cancellation dialog.

= 2.8.2 =
* Fix: Local-mode multi-service availability now validates the entire cart before showing a time slot, including Me/guest timing, Any staff assignment, named staff, and existing bookings.

= 2.8.1 =
* Fix: Local-mode Bookings admin list now displays local WordPress timezone correctly instead of converting local records as UTC.
* Fix: Frontend appointment summary no longer appends the slot check text ("Yes") to selected time labels.
* Fix: Local-mode multi-service cart submission keeps one visible appointment as one booking request, preventing partial "appointment 2 failed" results.
* Fix: Local-mode Any staff assignment now chooses a truly available eligible staff member at submit time.

= 2.8.0 =
This release brings the local-mode booking engine to full production quality. Salons that do not use Square or Vagaro now have a complete, reliable booking system — multi-service, multi-guest, conflict-safe — running entirely within WordPress with no external dependencies.

**Local mode — now fully production-ready**

* New: Local mode now supports multi-service bookings. Clients can add Acrylic Fill, Pedicure, and Gel Manicure in a single checkout, and the engine calculates a start time that fits the entire combined duration.
* New: Local mode now supports group / guest bookings. A client can book services for herself and a guest simultaneously; each guest's services run in parallel from the same start time, and each person can have a different staff member.
* New: Double-booking prevention in local mode. Before saving, the booking engine checks both the existing appointments database and the in-progress bookings within the same group submission, so no two services can be assigned to the same staff member at the same time — even in the same checkout session.
* New: "Any staff" assignment in local mode. When a client selects Any Staff, the engine finds the first available technician for each service, respecting the service-staff assignment matrix and skipping staff who are already booked in that window.
* New: Parallel vs. sequential timing in local mode. Services for the same guest are scheduled back-to-back (sequential); services for different guests in a group start at the same time (parallel) — matching the logic customers expect.
* Fix: Confirmation emails now send correctly in local mode for both single and multi-service bookings, with all booked services listed in the email body.
* Fix: Local mode bookings now trigger the admin notification, Twilio SMS confirmation, and the scheduled reminder / review-request emails — these were silently skipped in prior versions.
* Fix: Booking start and end times are stored in the correct local WordPress timezone, so the admin list, staff portal, and confirmation emails all show the right time without UTC offset issues.

**Booking confirmation page**

* Fix: "Manage Appointment" links on the confirmation page now show the correct service name for each button when multiple services are booked by the same person. Previously, all buttons showed "Manage appointment for Me" regardless of which appointment they linked to — making it impossible to tell them apart.
* Fix: The AJAX response for every booking path (local single, local multi, Square single, Square multi) now includes the service name, so the confirmation page can label each manage link correctly.
* Fix: Square single-service booking response now includes `manage_url` directly. Previously only `manage_token` was returned; the URL had to be reconstructed client-side, which could silently break if the manage booking page URL changed.

**Settings**

* New: Auto-Confirm Bookings toggle in Settings — Hours. When ON (default), new bookings are immediately set to Confirmed — the existing behavior. When OFF, bookings start as Pending and must be manually approved in the Bookings list. Useful for salons that review requests before committing.


= 2.7.8 =
* New: Display Timezone setting under Business Identity — choose which timezone is used when showing appointment times in the admin booking list.


= 2.7.7 =
* Fix: Bookings now complete successfully. In 2.7.6 the phone validation helpers (`validateUSPhone`, `showPhoneError`) were defined inside a jQuery document-ready handler, which placed them outside the class's lexical scope. When the booking submit handler tried to call `validateUSPhone`, it threw a ReferenceError before the AJAX request was sent, leaving the button stuck on "Confirming your booking...". Helpers are now hoisted to the IIFE scope.

= 2.7.6 =
* Improved: Refined the mobile booking flow with shorter step labels, cleaner sticky cart actions, and full service descriptions restored in the service detail view.
* Improved: Pick Time now lets customers switch staff from the appointment summary and refreshes available times immediately.
* Improved: Service detail images now display fully on mobile instead of cropping important content.
* Tweak: Review & Book now shows selected staff as read-only so customers use Edit for appointment changes.

= 2.7.5 =
* Tweak: Align Freemius initialization with the Menu & Online Ordering plugin so the pricing screen can render the Free and Pro plans consistently.

= 2.7.4 =
* Fix: Send the plugin-list Upgrade to Pro link directly to Freemius checkout to avoid confusing free users with the internal pricing table.
* Tweak: Align the Freemius SDK initialization with the WordPress.org compliant setup used by the menu plugin.

= 2.7.3 =
* Fix: Added the missing Upgrade to Pro action link on the WordPress Plugins screen.

= 2.7.2 =
* Fix: Removed placeholder image file from assets
* Fix: Staff limit now shown in admin UI before hitting the cap (disabled button + upgrade notice)

= 2.7.1 =
* Fix: Resolved Plugin Check warnings in class-yatoon-staff-portal.php (sanitization and unslash)
* Updated: Plugin description

= 2.7.0 =
* New: Setup Wizard - guided 5-step onboarding for new installs
* Fix: Appointment reminder and review request emails now actually send (cron was not registered)
* Fix: Confirmation email now lists all services when multiple services are booked
* Fix: Timezone now reads from WordPress site settings instead of a hardcoded fallback
* Fix: Added database columns for reminder/review tracking on existing installs

= 2.6.2 =
* Improved: "Make Another Booking" button now clearly separated from action buttons with a divider line

= 2.6.1 =
* Fix: Business phone number now correctly appears in confirmation emails

= 2.6.0 =
* Fix: Booking confirmation no longer hangs - extended server timeout for booking submission
* Fix: Business phone number now appears correctly in confirmation emails
* Fix: "Make Another Booking" button now has proper spacing below the action buttons

= 2.5.4 =
* Fix: {business_phone} variable now correctly shows the phone number in confirmation emails

= 2.5.3 =
* Improved: "Make Another Booking" button spacing increased for a cleaner separation from the action buttons above

= 2.5.2 =
* Fix: Booking confirmation no longer hangs indefinitely - PHP execution time limit extended to prevent silent timeouts during booking submission
* Fix: "Make Another Booking" button now appears on its own line below the action buttons for a cleaner layout

= 2.5.1 =
* Fix: Customer self-service cancel/reschedule (Manage Booking) now works in Square mode - token is generated for all booking platforms
* Fix: Multi-service bookings now show correct service names in Staff Portal (booking_options populated on Square sync)
* Fix: Appointment times display correctly across all browsers including Safari (Unix timestamp format)
* Fix: Staff Portal day tabs now show text in correct color on all backgrounds
* Fix: ZIP package folder name corrected to yatoon-booking-system for proper WordPress installation

= 2.5.0 =
* New: Staff Portal PWA - technicians can view their weekly schedule and manage appointment status from their phone. Add [yatoon_staff_portal] to any page, set a 4-digit PIN per staff member under Settings > Staff, and share the link. Installable as a home screen app on iOS and Android.
* New: Set PIN button in Staff admin table - securely hashed, with brute-force rate limiting (10 attempts per 5 minutes per IP)

= 2.4.0 =
* New: Checkout Options - Gift Card and Coupon Code fields can now be individually toggled on/off in Settings > Checkout Options
* New: Coupon Code now has an Apply button with real-time validation and discount preview at checkout
* New: Multi-Location support - add unlimited locations under Yatoon Booking > Locations, each with its own address, description, phone, email, timezone, and accent color. Use [yatoon_booking location="2"] or [yatoon_booking location="downtown"] to scope a booking form to a specific location
* Improved: Location banner shown on booking form when a specific location is selected via shortcode
* Note: Pro users can assign a separate Square Location ID per location for independent live availability sync

= 2.3.6 =
* Fix: Removed "Checking availability..." indicator on service cards - availability is shown at the time selection step instead

= 2.3.5 =
* New: Multi-person booking gets a cleaner, more intuitive interface - each person's services are clearly grouped and easier to manage
* Improved: No-availability message now shows the specific service name (single service) or total appointment count (multiple services) for clearer feedback
* Improved: Service menu category tabs now sit closer to the first section heading for a tighter, more polished layout
* Removed: "Checking availability..." indicator on service cards - availability is shown at the time selection step instead
* Fix: Duplicate service modal - "Dismiss" button now closes the popup and keeps the client on the service menu instead of jumping to the time selection step
* Fix: UP/DOWN reorder buttons now only appear when the same person has 2 or more services

= 2.2.0 =
* New: Apple-style service cards with hero image, rounded corners, soft shadow, and Book pill button
* New: Star rating and review count on each service card
* New: "Next Available" hint on service cards with green pulsing dot
* New: Week/Month calendar in local mode replaces native date picker
* Improved: Service card typography, padding, and selected-state ring

= 2.1.2 =
* New: International phone number support with country flag picker
* New: Email OTP and SMS OTP verification before booking confirmation
* New: Phone number optional toggle

= 2.1.0 =
* New: [yatoon_gallery] infinite-loop auto-scrolling photo carousel
* New: [yatoon_catalog] service image card grid with popup booking
* New: Custom booking form fields with drag-and-drop builder
* New: Tip / gratuity at checkout
* New: Star rating collection and Reviews admin page
* New: Recurring appointments
* New: Closed Dates manager
* New: Redesigned dashboard with KPI cards and trend chart

= 2.0.0 =
* Initial public release
