smartEngin MeetMix — complete changelog
=======================================

The readme.txt shows only the most recent releases, because WordPress.org
truncates that section at 5000 characters. The full history lives here.

= 0.32.0 =
* **A click on your picture shows it three times larger for two seconds.** The little round picture stays small - but a visitor can now see for a moment who they are about to meet. Click again and it goes back straight away.
* Your picture is loaded in a larger size for that, so it stays sharp when it grows. The file that is loaded is still a scaled one, not the original - a photo from a camera would otherwise be a megabyte for a 56-pixel circle.
* **Privacy and Imprint now open in a new tab.** Whoever clicks them in the middle of a booking keeps the booking page - and the half-filled form with it.
* Without a picture nothing changes: the circle with your initials stays exactly as it was, and it is not a button. A button that does nothing is worse than none.

= 0.31.0 =
* **The manual now names the shortcode.** It used to say "put the shortcode of your booking view on a page" without ever saying what it is called - not much help if you do not know. It is [smartengin_termin id="1"], and Booking views shows it ready to copy for each view.
* **Three places you can now find in the manual: Overview, Help & documentation and Log.** Those are exactly the three you need when something does not work, and none of them was described anywhere. An AI assistant reading the manual can now send you to the right place instead of guessing.

= 0.30.0 =
* Groundwork for the Pro extension: moving an appointment now asks first whether it may be moved at all, once for you in the backend and once for your customer on their own page. On its own this changes nothing - every appointment that could be moved before can still be moved.
* Nothing else changed. This version exists so that Pro 0.43.0 has something to hook into.

= 0.29.0 =
* **Fixed: your accent colour now reaches your emails too.** The button, the meeting link, the cancellation link and the frame of the mail stayed green when you picked a different colour - only the backend followed it.
* Emails work differently from the backend: mail programs throw stylesheets away, so every colour has to be written out on the element itself. Those places now ask for the same colour as everything else.
* The text ON the button is calculated instead of always being white. With a light accent colour - a yellow, a light pink - you would otherwise have had a button nobody can read.
* Dark blue and grey stay as they are on purpose: they are text and background, not an accent. Colouring them too would turn an email into a patchwork.
* With the built-in green, every mail looks exactly as before - an update must never change how things look.

= 0.28.0 =
* Groundwork for Zoom in events: the data class can now list what a connected service still has to catch up for an event. Nothing changes for you on its own - the Pro extension uses it.
* Needs the Pro extension in version 0.39.0 or newer, if you use it.

= 0.27.0 =
* **Fixed: your accent colour now reaches the appointment window too.** With a colour other than the built-in green, the buttons, the on/off switch and the meeting link inside a window stayed green - only everything outside had followed your colour.
* The cause was one selector too few: the stylesheet sets its colour values on three places, and the accent colour was only applied to the first of them. A window therefore set the green on itself, and a value an element sets on itself always beats an inherited one - however far up the inherited value comes from.
* All three places are now served from one single list, and a check reads that list out of the stylesheet: whoever adds a fourth place later and forgets it gets a red line instead of a green button months on.

= 0.26.0 =
* **The meeting link in an appointment is now clickable.** Open an appointment in the calendar - in the backend or on your phone - and the Zoom or Google Meet link opens with one click instead of having to be copied. The full link stays readable, so you can still see whether a passcode is attached to it.
* Only real web addresses become links. Anything else in that field stays plain text, which is deliberate: it is a field you fill in yourself, and not everything that can be typed there should be clickable.

= 0.25.0 =
* **Fixed: after going back from the form, you could not change the appointment type any more.** You picked another one and nothing happened - the calendar kept the previous type. Going back rebuilds the whole card, and the selection field is a different element afterwards, so the handler that reacted to it was gone.
* It now listens one level up, where it cannot be lost. **The time zone selector had exactly the same fault** and was fixed with it - nobody had noticed that one yet.
* And after going back, the field again shows the appointment type the calendar is actually showing. Before, it fell back to the first one - two different answers on one screen.

= 0.24.0 =
* Groundwork for Zoom in the Pro extension: the list of meeting options now says WHAT it is being asked for - an appointment type or an event.
* Why that matters: without it, an option that only works for appointment types would also appear at events, and choosing it there would quietly do nothing. Nothing changes for you; every existing option keeps working exactly as before.

= 0.23.0 =
* **Fixed: a long appointment type name was cut off in the booking view** - and the first attempt fixed it the wrong way round. The left column simply became wider, whatever the name was, and the type never shrank at all.
* Now it works in the order that keeps your calendar as wide as possible: the column stays at 300 pixels and **the type shrinks first**, step by step from 14 down to 11 pixels. Only if even 11 pixels do not fit does the column grow - and only by as much as is really missing, up to 360 pixels.
* Pick a short name again and everything goes back: the column returns to 300 and the type to full size.
* On a phone nothing changes. There is only one column there anyway, so the type stays at full size.
* What this cannot do, and it is worth knowing: the OPENED dropdown list is drawn by the operating system. Its type cannot be changed by any website. The cut-off text was in the closed box, and that is what was fixed.

= 0.21.0 =
* Groundwork for the Pro extension: a companion plugin can now add a tab of its own under Settings, instead of only filling one that already exists here. Nothing changes for you - without the Pro extension there is no extra tab, and the existing ones are untouched.
* The reason: the Pro extension is getting a Zoom page. Reserving an empty tab here for it would have meant one more page that shows nothing but a pointer, and the directory asks for those to stay sparse.

= 0.20.0 =
* **New: an overview under Settings that tells you what is still missing.** Ten points, each one either done or waiting for you - a bookable appointment type, weekly hours, the booking page, the time zone, the sender address, the privacy link, the scheduled task. It is the first tab, because an overview you have to look for is not one.
* The reason it exists: a real appointment went out without its meeting link, and nothing said so. The booking arrived, the confirmation was sent, only the access link was missing - and the single hint sat inside one appointment's window, which you have to click first.
* The list has ONE source. The overview shows exactly what the read-only interface answers, so the backend can never say green where the interface says red.

= 0.19.0 =
* **The plugin now passes Plugin Check with zero warnings, not just zero errors.** WordPress.org's review runs the same tool, and its report lists warnings too - 101 of them here. Every single one was checked by hand: none was a real hole. The nonce and permission checks live one level up, in a shared guard the tool cannot see, and every database value already went through prepare(). Where that was true, the reason is now written next to the line, in the exact form the tool reads.
* A new test attacks all 16 entry points over real HTTP - once with no credentials at all, once as an administrator without a security token, and once with a valid token but no permission. It proves the locks hold instead of claiming it. Two entry points were missing from an earlier list; the test found them both.
* Removed the call that loaded the translations by hand. WordPress has done that on its own since version 4.6, and the directory asks for it to go. Measured before and after: the German texts arrive either way.

= 0.18.0 =
* Ready for the WordPress.org plugin directory: the readme now has the Installation, FAQ, Screenshots and Upgrade Notice sections it was missing, and the changelog was shortened to the recent releases - WordPress.org cuts that section at 5000 characters, so 88 older entries would have vanished without a word. The full history moved to changelog.txt inside the plugin.
* The bundled FullCalendar library now carries its licence text (MIT) and a pointer to its readable source, as the directory requires for minified third-party code.
* The notes about the Pro extension now link to it. The plugin header pointed at a page that answers with 404 - it points at the right one now.

= 0.17.1 =
* **Fixed: an appointment type without a description filled the error log.** The booking page passed an empty description straight to WordPress, which since PHP 8.1 writes a notice for every single page view. Nothing was visibly broken - the log just kept growing. A booking view without a heading or intro text no longer leaves empty elements behind either.

= 0.17.0 =
* Groundwork for the Pro extension: the calendar configuration can now redirect where each request goes. The Pro extension uses it so its mobile view talks to its OWN entrances - the ones in this plugin stay untouched and remain for logged-in users only.

= 0.16.1 =
* The description above was rewritten: it described the state of an early stage and no longer said what the plugin can do today. It now lists the features instead of a stage number - a stage number goes stale, a feature list does not.

= 0.16.0 =
* Prepares the new **Mobile access** tab under Settings. On its own it only explains what the Pro extension adds there - the calendar on your phone.

= 0.15.0 =
* **The test email now shows what your customer really gets** - with the letterhead, the green button and the calendar file, and in the language of your website instead of your own backend language. Until now it arrived as plain text, so anyone checking the look was checking something else.
* A booking number is never handed out twice, not even after bookings have really been deleted by the privacy clean-up.
* If an email breaks off in the middle, the following emails of the same run no longer speak the wrong language.
* Umlauts in calendar files are no longer cut in half when a long line is wrapped - strict calendar programs used to drop that line.
* Confirming an appointment whose appointment type has been deleted no longer throws the appointment away. It stays, and your customer is asked to get in touch.
* The limit for the customer reminder really is 14 days now (it allowed 840).
* Page 2 of the appointment list keeps a search term containing "&".
* The state report no longer needs the mbstring extension.
* "Delete all data with the plugin" now really removes everything: three options and the short-lived values were left behind.
* In the backend calendar: pressing Escape after dragging an appointment puts it back where it was, and the two small months on the left follow your language and your first day of the week instead of always German and Monday.

= 0.14.0 =
* **Nobody jumps the waiting list any more.** While somebody is still waiting and could still move up, a seat that becomes free belongs to them - a visitor who happens to be on the page in that very moment no longer takes it. After the move-up deadline the rule stops on purpose: from then on nobody moves up automatically either, and a seat the queue can no longer get should not stay empty.
* New hook `seca_buchung_abgelaufen` for the Pro extension: when a seat that was held for a payment expires, the next person on the waiting list can now move up.

= 0.13.2 =
* Text in the calendar now always follows its own bar: dark on a light background, light on a dark one. Entries from a connected calendar were white on light grey and simply could not be read, and an appointment type in a light colour had the same problem. Reported.

= 0.13.1 =
* In the month view every entry now carries its colour as a filled bar. Until now an appointment with a time was drawn as a small dot with plain text on a see-through background — so an appointment that takes the time away looked exactly like an entry that takes nothing away, and the rule "coloured background = the time is gone" simply did not hold in the month view. Reported.
* The text colour of an event with its own colour now follows that colour instead of staying white, which would be unreadable on a light one.

= 0.13.0 =
* New field for the Pro extension: an event can now carry its own colour, so several events are easy to tell apart in your calendar. Database schema v14.
* Empty means "as before", not black — an update must never change how your calendar looks.

= 0.12.5 =
* Clicking an entry from a connected calendar told you it blocks your time — even when it does not. Since entries that block nothing are shown as well, that sentence was wrong for exactly those entries, and it sent you looking in your Google calendar for something that was never taking time away. The window now says which of the two it is.

= 0.12.4 =
* One rule now runs through the whole calendar: a coloured background means the time is taken and nobody can book it; an entry with only text and no background is there for information and blocks nothing. A sentence under the calendar says so.
* Needed for the Pro extension, where connected calendars can now be set to "only show it" instead of blocking.

= 0.12.3 =
* Fixed a rare but serious double booking. When a reservation had run out and somebody else had taken the same time in the meantime, a late click on the old confirmation link — or a payment arriving late — took that other person's slot over. Both appointments then stood as firm at the same time, and the other booking was left holding nothing. Confirming and paying now check whether the time still belongs to that very booking, and the database itself refuses to hand a slot over to anybody else.

= 0.12.2 =
* German wording only: a button is called "Button" in German, not "Knopf". Every label, help text and manual chapter now says Button. The English source is unchanged.
* The two rows of the colour palette now sit side by side while there is room, with a clear gap between them, and only stack when the box gets narrow. That is what the palette is for: your colour and its fixed neighbours in one glance.

= 0.12.1 =
* The colour field now shows the colour instead of a thin line - it had no height of its own and was flattened by the styling of the other fields.
* **New: a colour palette under the field.** It shows the five colours that follow your choice (buttons, hovered button, highlight, tinted area, borders) and the five that do not (white, text, quiet text, red, yellow), each with its hex value and what it is for. An "Aa" on the swatches shows how text sits on that colour. A colour on its own says nothing about whether it works - next to its neighbours it does.

= 0.12.0 =
* **New: an accent colour of your own, under Settings -> Design.** Everything that is green today follows it - buttons, borders, highlights, symbols and tinted areas, on your website and here in the backend. Pick your house colour and the plugin wears it. The darker shade for hover, the lighter one for highlights and the tinted card background are worked out from your colour, and the text on buttons switches between white and dark by itself so that it stays readable.
* **Nothing changes until you change it.** As long as the colour is the smartEngin green, every shade comes out exactly as before - they are the hand-picked originals, not values calculated from the green. An update must never change how your site looks.
* Two things stay as they are on purpose: the colour of each appointment type (that one is yours per type and colours its bar in your calendar), and the warning colours red and yellow - a warning in your house colour is no longer a warning.
* Groundwork for the free plugin: a new hook fires just before an appointment type is deleted. The Pro extension uses it to take the appointment off sale in smartEngin buy.

= 0.11.0 =
* **The price is now actually shown before somebody books.** It was being handed to the page all along, but nothing ever drew it - so a visitor only learned that an appointment costs money after booking it. Reported for events; it turned out to hit appointment types just as hard. A price belongs before the decision, not after it.
* **New field "Original price" right next to the price.** Enter it and it appears crossed out next to the current price, and it is handed to smartEngin buy for the offer cards there. It only counts when it is really HIGHER than the price - a crossed-out amount that is not higher claims a discount that does not exist. Database schema v13.
* It sits next to the price on purpose, and not in smartEngin buy: two numbers that together make a discount belong in one place.

= 0.10.0 =
* **One tax rate for everything, set once.** Under Settings -> Payment there is now a general tax rate. Every appointment type and every event follows it, and their own tax field stays empty - which is the normal case. You enter the rate in one place instead of repeating it on every single appointment type.
* An appointment type or event may still deviate, because that is a real case: a coaching session and an entrance fee to a cultural event are not necessarily taxed the same. Type a number into its field and it wins - and the settings page then lists, by name, everything that deviates, so a rate that quietly does not apply cannot hide.
* **Nothing changes for what you already sell.** A one-off migration writes today's behaviour into the data before the new rule takes effect: anything that has a price but no tax rate is pinned to 0 per cent explicitly, exactly as it was handed to smartEngin buy before. Rows that already carried the same rate as the new general one are cleared, which changes nothing and leaves the rate in one place. A deviating rate is a decision and is never cleaned up.
* **Zero per cent is a valid rate**, not "nothing entered" - it stays zero and never silently becomes 19.
* The read-only interface now reports the general rate, plus for every appointment type both the deviation (if any) and the rate that really applies.

= 0.9.2 =
* **The checklist item about the sender no longer sends you on work that does not exist.** It used to ask whether the sender FIELDS are filled in - but leaving them empty is perfectly fine: the plugin then uses your site name and the WordPress administrator address, and if that address is already on your own domain, everything is correct. It now checks what actually matters: does the address your mail is really sent from belong to your own domain? A foreign one (GMX, Gmail) is what gets sorted into spam.
* The answer also reports whether the sender falls back to the WordPress values and whether its domain matches the site - still without ever showing an address.

= 0.9.1 =
* **Fixed straight after the first real test on the live site (thank you):** the weekly schedule came back empty in the AI answer, and the checklist item "weekly hours are set" was green even for somebody who has none - which is exactly the item that explains "nothing can be booked". Both had the same cause: the weekly schedule is stored as "weekday -> list of time spans" and always carries all seven days, and I had read it as a plain list of rows.
* An appointment type with its OWN weekly schedule now reports that schedule too. Without it an assistant could not see why nothing is bookable for that one type while the shared schedule is filled.

= 0.9.0 =
* **You can now let an AI assistant READ your setup and guide you through it.** Under Settings -> REST API you switch the connection on, generate a short-lived connection code and copy the prepared text into Claude, ChatGPT or a similar assistant. It then sees what is still missing - no weekly hours, the booking view not on any page, the scheduled task behind - and walks you through it step by step.
* **It can only read, and it never shows anything about your customers.** No names, no email addresses, no phone numbers, no addresses, no keys, no meeting links, no IP addresses: where such a field exists, the answer only says whether it is filled in. Your own labels - the titles of appointment types, booking views and events - are shown in full, because otherwise an assistant could not tell you which one is missing something.
* Off when the plugin is installed, and only from your own computer until you say otherwise; access over the internet then requires https. The code expires by itself, you can withdraw it with one button, ten wrong guesses lock the caller out for a quarter of an hour, and every request is listed with time, origin and result.
* Two addresses, both read-only: /wp-json/seca/v1/setup for the live state and /wp-json/seca/v1/guide for the manual.
* **New handbook chapter "Letting an AI read your setup"**, including the honest limits: a normal chat window in a browser cannot use this connection (it cannot send the required security header) - for that there is still the copy button under Help & documentation.

= 0.8.1 =
* The "payment still open" email no longer reads like a demand. It goes out the moment the time is held — so it also reaches somebody who is paying on the website right that second, and "please complete your payment" made them wonder whether they had to pay twice. It now says up front that the link is only there in case they need it later, and that they can ignore the email if they have already paid.

= 0.8.0 =
* Groundwork for paid events (see the Pro changelog): an event can now carry a price, a tax rate and a "payment required" switch, plus a deadline for somebody moving up from the waiting list. Database schema v12.
* Fixed a trap that would have hit the moment sign-ups could wait for payment: the clean-up for expired reservations looked for "waiting, and no valid lock left" — and a sign-up to an event never has a lock, because an event blocks its time as a whole and counts seats instead. Every waiting sign-up would have been dropped within five minutes, silently, in the middle of paying. Sign-ups now expire on their own deadline.

= 0.7.2 =
* Groundwork for documents attached to an event (see the Pro changelog): an event can now carry a list of files from your media library. Database schema v11. Without the Pro extension nothing changes — events themselves are a Pro feature.
* The media picker can now pick documents, not only images, and shows the file name where a PDF has no preview image to show.

= 0.7.1 =
* The built-in guide was three stages out of date, and wrong in three places: it claimed stage 0.5 was the current state, that price and tax fields did nothing yet, and that the holiday list was Saxony's. All three are corrected.
* The guide can now be extended by the Pro extension, which brings its own chapters for Google Calendar, meeting rooms, Telegram, events with a waiting list, paid appointments and several booking views. Without Pro nothing changes here — the free guide describes the free plugin and no longer promises anything that is not there.
* Settings -> Payment no longer says "planned for stage 1.2". That stage is finished; it just needs the Pro extension and the free smartEngin buy plugin.

= 0.7.0 =
* The logo above the appointment type is now a circle, and its size is yours to set — right next to the logo, under Booking views. Default 56 pixels (it used to be a fixed 34, which was hard to make out), anything from 24 to 160.
* Public holidays now cover all sixteen German states, not just Saxony. Pick your state under Availability → Public holidays; the list is rebuilt for it. Holidays that only apply in certain municipalities — Corpus Christi in Saxony and Thuringia, Assumption Day in Bavaria, the Augsburg Peace Festival — are listed WITHOUT a tick on purpose: a day blocked by mistake quietly costs you appointments.
* Fixed: the state selector existed but was never saved and never read — the list was always Saxony's, whatever you picked.

= 0.6.3 =
* Fixed (found by Pierre): 0.6.2 kept smartEngin buy's payment buttons intact, but broke this plugin's own — the time tiles lost their frame and "Book this appointment" became a line of text. The exception was written in a way that made the reset outweigh the plugin's own button rules. It now leaves foreign buttons alone without changing its own weight at all.

= 0.6.2 =
* Fixed (found by Pierre on the live site): the payment buttons of smartEngin buy were stripped bare by this plugin's own button reset. The reset exists so themes cannot interfere with the booking calendar — it now leaves anything belonging to another smartEngin plugin alone, and grips a little tighter against themes than before.

= 0.6.1 =
* Fixed (found by Pierre on the live site): the payment buttons appeared as plain text. This page is deliberately not a normal WordPress page, so anything an extension registers had nowhere to be printed — it is printed now.
* An appointment type that has to be paid for is no longer offered on your website while there is no way to take the money. Before, it was quietly booked for free. Your appointment types page now says so in red, with what to do about it.
* The customer page no longer claims "this appointment has been paid for" while the payment is still open, and the "move appointment" button is gone while it is — it led nowhere.
* The payment step now looks like a step: the notice sits on its own line, the button below it.

= 0.6.0 =
* Groundwork for paid appointments (see the Pro changelog). An appointment type with a price and "payment required" now holds its time for 15 minutes instead of booking it right away; the booking only becomes firm once the payment arrives. Without a payment extension nothing changes at all — the price fields stay unused, exactly as before.
* Two new e-mail templates: "Payment still open" to your customer (with the link, so a closed browser window does not lose the appointment) and a message to you for the rare case that a payment arrives after the time was given away.
* A paid appointment can no longer be cancelled by the customer on their own page; it says to get in touch with you instead. Moving it to another time stays possible.
* New seams for extensions: seca_zahlungswege, seca_kundenseite_zahlung, seca_kundenseite_aktion, seca_buchung_bezahlt, seca_mail_text.

= 0.5.29 =
* Groundwork for absences in your Google calendar (see the Pro changelog): an absence can now be linked to an entry at an outside service in its own right. Database schema v10.

= 0.5.28 =
* Groundwork for events in your Google calendar (see the Pro changelog): an event can now be linked to an entry at an outside service in its own right, not only through a booking. Without that, all events would have shared one slot and only one of them would have been recognised as "ours" — the rest would have come back as foreign entries and laid a second grey bar over your own event.

= 0.5.27 =
* Sign-ups to an event no longer stand in your calendar as separate appointments. A workshop with twenty people used to put twenty grey bars over the one event — and people on the waiting list appeared as appointments although they have no seat at all. Your calendar now shows the event itself as one line ("Workshop · 8 of 10"); who is coming stands in its list of participants, which is where you look for it anyway.
* Groundwork for the Pro extension: the database can now move up a person you pick yourself, not only the first in the queue — under the same lock, so the number of seats still decides.

= 0.5.26 =
* Groundwork for the waiting list of an event (see the Pro changelog): the database now hands out the place in the queue and lets the next person move up — both inside the same transaction that already decides about the last seat, so two people clicking at the same moment can never end up on the same place.
* One more connection point for the Pro extension: it can add its own placeholder to the list of allowed ones. Without it you would get a warning about a placeholder the plugin itself had written into your template.

= 0.5.25 =
* Styling for the collapsed sign-up form of an event list (see the Pro changelog).

= 0.5.24 =
* A seat in an event can no longer be taken twice by the same person. Reloading the page after a sign-up used to send the form again — with a new booking number, a second confirmation email and a second seat gone. Somebody reloading ten times could have filled a whole workshop on their own. The database now refuses a second sign-up with the same email address, and signing off frees that address again.

= 0.5.23 =
* One more connection point for the Pro extension: it can now say which of its own emails may carry the green "join" button. Without it the sign-up confirmation for an event never showed one. Still a positive list, so a cancellation can never inherit that button by accident.

= 0.5.22 =
* Three more connection points for the Pro extension, invisible on their own: an extension can say which of its emails carry a calendar file and what goes into it, and it can take over the customer page for a sign-up to an event — that page is about giving up a seat, not about picking a new time. Nothing changes for you on its own.

= 0.5.21 =
* Two more connection points for the Pro extension, invisible on their own: an extension can now fill the placeholders of an email (that is how an event sign-up gets a title and a place, although it belongs to no appointment type), and it can say whether one of its own email templates goes to your customer or to you. Without the second one such an email would go to the wrong address, in the wrong language.
* Sign-ups to an event are now written in a way that lets the database decide about the last seat — the same protection your appointments have had from the start.

= 0.5.20 =
* An event can now have preparation and follow-up time. Both block the slot in addition to the event itself, so nobody books a call while you are still setting up or answering questions afterwards. Your visitors never see those minutes — the announcement shows the real start.

= 0.5.19 =
* Groundwork for events (group appointments), which arrive with the Pro extension: the free plugin now holds their data and — this is the important part — makes sure an announced event blocks that slot against every other appointment type. That protection sits here on purpose, so it keeps working even if the Pro extension is ever switched off.
* Your own calendar can show an extra group of entries from the Pro extension, which is how events appear there. Nothing changes for you on its own.

= 0.5.18 =
* Booking views can now be copied, deleted, and any one of them can be made the default — the three handles you need as soon as there is more than one of them. The default is what the shortcode without an id shows, and what appointments you create by hand belong to.
* The last booking view cannot be deleted: without one, your booking calendar would have nothing to show. Deleting never touches appointments already booked through that view.
* Several booking views at the same time still need the Pro extension.

= 0.5.17 =
* The emails to your customers now arrive in a proper layout instead of plain text: your name at the top, the subject as a heading, clear spacing, and a green button for online appointments that leads straight into the meeting. Below the button the link is written out once, to read or copy.
* Every one of those emails still goes out as plain text as well, in the same message — anyone who has switched HTML off keeps getting exactly your text. Your templates stay plain text: you never type HTML.
* The button only appears when it is right: there has to be an access link, and the appointment has to still take place. A cancellation never carries a "join" button.
* The name at the top and the footer come from your settings (company name, or the name of your website) — nothing is fixed in the plugin.

= 0.5.16 =
* The emails to yourself — new booking, reminder shortly before, and rescheduled by your customer — now say where the appointment takes place, right under date and time. For an online appointment that is the access link, so you can join from your phone without logging into the backend first.

= 0.5.15 =
* An online appointment can now carry an access link that is created at the moment of booking (this needs the Pro extension). For that, the confirmation email is now written after everything belonging to the appointment exists — so the link is really in it instead of arriving too late.
* New email "Access to the online meeting": it only goes out if the meeting room was created later than the confirmation, so your customer is never left without a way in. You can edit it like every other template.
* New placeholder {meetinghinweis} for a short note about joining an online meeting. It stays empty for appointments without their own meeting room.

= 0.5.14 =
* One more connection point for the Pro extension: an appointment window can now carry a notice from an extension, shown at the top before all the details. That is how you are told when an appointment was changed directly in your Google calendar. Nothing changes for you on its own.

= 0.5.13 =
* Groundwork for the Pro extension, invisible on its own: bookings can now be linked to an appointment at an outside service, and two building blocks that fill in your emails can be reused - so the entry in your Google calendar says exactly what your email says. Nothing changes for you.

= 0.5.12 =
* Clicking an appointment that comes from a connected calendar now tells you what it is instead of doing nothing: it blocks the time here, but it belongs to that other calendar and is changed there.

= 0.5.11 =
* Three connection points for the Pro extension, invisible on their own: the free-slot engine can now be told about busy times from an outside calendar, the backend calendar accepts an extra group of entries, and the calendar script draws every group it is sent instead of only the four it knows. That is how appointments from Google start blocking your bookable times - the Pro extension does the rest. Nothing changes for you on its own.

= 0.5.10 =
* The settings tab "Google" is now called "Google Calendar" - clearer about what it is for. Nothing else changed, and a connection set up before keeps working.

= 0.5.9 =
* Absences can now carry extra fields from the Pro extension, in the calendar window as well as under Availability - that is how the reminder for your own absences arrives. Two more signals tell an extension when an absence was saved or deleted, so nothing is left behind. Nothing changes for you on its own.

= 0.5.8 =
* Two connection points for the Pro extension, invisible on their own: a settings tab can now be replaced by Pro (that is how the real Telegram tab arrives), and there is a signal when a reminder has gone out, so the same reminder can reach you on Telegram - exactly once, like the email.

= 0.5.7 =
* Stage 0.5 is finished, and the guide describes it: a new chapter "Your calendar" covers the four views, opening an appointment, cancelling and moving with the email shown first, creating by hand, and absences. Two chapters that still described the state before it were rewritten. The same texts feed the copyable AI briefing, so an assistant is told the truth as well.

= 0.5.6 =
* Absences can now repeat every year — birthdays, anniversaries, a yearly company holiday. You enter it once and it appears in every year; changing or deleting it changes every year with it. The 29th of February falls back to the 28th in ordinary years instead of quietly disappearing.
* A second switch decides whether an entry blocks bookings at all. A birthday should not close your working day: switch it off and the entry is a note in your calendar while customers can still book that day. Normal absences block as before.
* The coloured bar now carries your colour completely — including the text, which turns light or dark by itself so it stays readable on any colour.

= 0.5.5 =
* An absence can now have a colour of its own, chosen while you create it — six colours to click plus a free colour picker. Private appointments you block out are told apart at a glance: in day, week and month the bar carries your colour, and in the year view the day itself does. Without a colour everything looks exactly as before, so your existing entries are untouched. The same field is on Availability → Absences, and the list there shows a colour dot.
* Groundwork for a later feature: the calendar can now be drawn outside the WordPress backend, its settings can be changed by the Pro extension, and there is a hook before every calendar request is checked. Nothing changes for you today — this is what a calendar on your phone will be built on.

= 0.5.4 =
* You can now create appointments and absences straight in the calendar, the way you would in Outlook: click an hour in the day or week view for an appointment, drag across several days in the month view for an absence — the window opens with the right date already filled in, and a switch at the top turns one into the other. An appointment you enter by hand may have a length of its own, carries the customer's language for every later email, and is not bound by your bookable hours (the double-booking protection still applies). Nothing is sent while you create it: afterwards you see the confirmation email, you can rewrite it, and you decide whether it goes out at all. Clicking an absence opens it for changing or deleting, and if appointments are already booked in that period you are told — an absence blocks new bookings, it never cancels anything.
* Day and week now show all 24 hours instead of a window around your bookable hours, so nothing can fall outside the visible grid. The view still opens at the start of your working day, and hours outside your bookable times stay dimmed.

= 0.5.3 =
* The status of an appointment says what it means now. "Booked" is a firm appointment that will take place — that is what almost every appointment is. "Open" now means what it sounds like: the appointment is waiting for your customer to confirm it by email. The status "Confirmed" is gone: the plugin never set it, and setting it by hand would have quietly switched off every reminder for that appointment, because reminders only look for booked ones. An appointment that is waiting can no longer be changed by hand either — its time is only held, and the schedule would later drop it.

= 0.5.2 =
* Click an appointment in the calendar and you see everything about it: the customer's details and answers, the booking number, the language they booked in, an internal note only you can read, and the status. From there you can cancel it — and dragging an appointment in the day or week view moves it. Both always show you the email your customer would receive first, and you can rewrite it before it goes out; nothing is ever sent because of an accidental drag. The deadlines that apply to your customers do not apply to you, but the double-booking protection still does.

= 0.5.1 =
* The calendar now follows your own weekly hours: day and week start and end where your bookable times do instead of running from midnight to midnight, hours outside them are dimmed, and the grid opens up by itself if an appointment falls outside — an appointment you cannot see would be the worst kind of bug. Half-hour rows with an hourly label. In the year view every day is now coloured by how much is going on (light for one or two appointments, strong for three or more, yellow for an absence or a public holiday), with a legend — before, the year looked empty even when it was not.

= 0.5.0 =
* Stage 0.5 begins: the calendar page is real. Day, week, month and year in one place, with the calendar week down the side, appointments in their true length, buffers before and after shown as hatched areas, absences and public holidays as bars across the days, and a red line for right now. On the left two mini months to jump around and a tick per appointment type to show or hide it. The whole year fits on one screen. Cancelled appointments stay out of the way — they are in the appointment list. Creating, moving and cancelling inside the calendar follow in the next packages.

= 0.4.16 =
* Guide brought up to date for the whole of stage 0.4. Two chapters still claimed that no email is sent at all, and nothing was written yet about cancelling and rescheduling, reminders, the scheduled task at your host, the retention settings and the logo switch: two new chapters, a rewritten privacy chapter, and the same texts feed the copyable AI briefing. Changelog completed for 0.4.2 to 0.4.11.

= 0.4.15 =
* The logo under the booking calendar is now right-aligned and a fifth smaller.

= 0.4.14 =
* Settings → Design can now show the smartEngin MeetMix logo at the bottom of the booking calendar. It is off by default and it is never a link — nothing appears on your website unless you switch it on yourself. The Pro extension can put your own logo there instead.

= 0.4.13 =
* Renamed: this plugin was called smartEngin Calendrix before. Only names changed — your appointment types, weekly hours, bookings, settings and the shortcodes stayed exactly as they were.

= 0.4.12 =
* Settings → Privacy is real now: your own consent sentence, a notice shown before booking an online appointment, a retention period in days after the appointment, anonymising or deleting, an honest preview of what a clean-up would affect, and a button to do it right away. Automatic clean-up is off by default. No IP address is stored — the page says so and explains what the spam protection does instead.

= 0.4.11 =
* The instructions for the scheduled task no longer read as if every host worked like all-inkl: the four steps are now marked as an example, and a general part says what to look for in other control panels and what to write to your host's support.

= 0.4.10 =
* Reminders are real: a reminder to your customer and one to yourself, with their own lead time per appointment type (24 hours and 60 minutes by default), an optional second reminder shortly before and an optional follow-up afterwards — both off by default. Everything due is caught up instead of being sent "exactly 24 hours before", and every email goes out exactly once even if the schedule runs twice at the same moment. Settings → Reminders shows when the scheduled task last ran, warns when it is behind, and explains how to set up a real schedule at your host.

= 0.4.9 =
* Your customer can pick a new time. It stays the same appointment — same booking number, same details, same link, and the calendar entry is updated instead of a second one appearing. The new time is taken before the old one is released, so nobody ends up without an appointment. Limited by a deadline and a maximum number of times, both under Settings → General.

= 0.4.8 =
* Your customer can cancel. A single click only opens a question, with an optional reason that only you get to see — links out of emails are clicked by accident, and mail servers open them on their own. The time is free again immediately, you are notified, and the cancellation email carries a calendar file that removes the appointment from your customer's calendar. Past the deadline the buttons are replaced by a friendly sentence with your reply address instead of an error message.

= 0.4.7 =
* Groundwork for cancelling and rescheduling: the settings card "Cancelling and rescheduling by your customer" (both on, until 24 hours before, twice), two new templates that notify you when your customer cancels or moves an appointment, and the placeholder {absagegrund} that either fills itself as a whole sentence or stays away completely.

= 0.4.6 =
* Settings → Emails shows two templates side by side instead of ten cards below each other. The columns stack when the space gets narrow, and the reading order stays 1, 2, 3 for keyboard and screen readers.

= 0.4.5 =
* Fixed, and it mattered: saving the email templates once without changing anything marked all of them as "your own wording" and froze them — a text field sends its line breaks back differently than they are stored. From then on no template would ever have been translated again. Line breaks are now aligned before comparing, and templates that already got frozen this way are released again.

= 0.4.4 =
* German translation: the informal "du" is now used on the website as well, not only in the emails — booking form, calendar, confirmation page and the page behind the customer link.

= 0.4.3 =
* New placeholder {nachname} for the surname, all customer emails on informal terms in German, and two templates (booking confirmation and reminder) reworded.

= 0.4.2 =
* Emails really go out now: booking confirmation and the notification to you, each with a calendar file attached, sent in the language your customer booked in and with times in the reader's own time zone. New: the page behind the customer link, "confirmation by your customer" switchable per appointment type (the time is held for 30 minutes, then released again), a shipped list of known throwaway address providers, a test mail button and a log tab that records every attempt, including the failed ones.

= 0.4.0 =
* Stage 0.4 begins with the texts: Settings → Emails holds nine templates with subject, text and placeholders, each switchable, plus the shared footer and the switch for the calendar file. Settings → General now holds company name and the sender, reply-to and notification addresses. A template you leave untouched is translated along with the plugin; your own wording is fixed — the backend says so. Unknown placeholders are reported instead of ending up in a customer's email. Nothing is sent yet.

= 0.3.9 =
* Stage 0.3 finished: guide chapters brought up to date (booking page, privacy), full regression, packages built.

= 0.3.8 =
* Step-by-step guidance on phones (one of the three columns at a time, with a progress bar and a back button), arrow-key navigation in the month grid, and free times announced to screen readers. Fixed: the limit per IP address counted every attempt — a mistyped form could lock you out. It now counts bookings that really came about, with a separate generous guard against hammering.

= 0.3.7 =
* Visitors can book: a form per appointment type, consent, spam protection without a captcha (hidden field, signed time trap, limit per IP address and hour, block list), atomic double-booking protection, a visible booking number and a confirmation page. New: a note about the area you travel to, per appointment type. The backend appointment list is real now — filters, search and paging.

= 0.3.6 =
* The switch to the narrow layout is now driven by the calendar's own width; the observer watching it is kept alive properly, and the browser window is watched as a fallback.

= 0.3.5 =
* The calendar really keeps its configured width now: block themes were overriding it with their own content width, which made everything look oversized.

= 0.3.4 =
* Settings → Design: maximum width of the booking calendar, and the width below which its three columns stack. The switch is now driven by the measured width of the calendar itself instead of the browser window — a calendar inside a narrow column is cramped long before the window is.

= 0.3.3 =
* Booking calendar polish after the first look in a real theme: day tiles are square again exactly as designed (themes were inflating the buttons), switching months no longer collapses the card for a moment, and a ticked but not bookable appointment type is now called out clearly in the booking view instead of hiding behind a small badge.

= 0.3.2 =
* The booking calendar appears on your site: shortcode [smartengin_termin] (also [smartengin_booking]) shows appointment type, month and free times in three columns, in the visitor's own time zone, 12h or 24h, with a jump to the next free appointment. Stylesheet and script load only on pages that really show a calendar. Booking itself follows next.

= 0.3.1 =
* Form fields: one global list for the whole plugin. The seven standard fields can be renamed and given a help text; your own fields (text, multiline, email, phone, address, choice list, tick box) appear in every appointment type right away. Spam protection settings (time trap, limit per IP address and hour, block list) and the booking number prefix are configurable.

= 0.3.0 =
* Booking views are configurable: allowed appointment types, preselection, heading and intro text, logo and displayed name, privacy and imprint links, 12h/24h format with an optional switch, time zone switch, "next free appointment" button, phone step guidance, and what happens after a booking. Pro hooks for additional views are in place.

= 0.2.3 =
* Free-slot engine: weekly schedule (shared or per type), buffers, minimum notice, horizon, daily maximum, absences, public holidays and taken slots — all times UTC, DST-safe. Atomic lock rows prevent double bookings at the database level; expired payment reservations free their slots. Guide chapters updated.

= 0.2.2 =
* Public holidays: calculated Saxony list (verified against SaechsSFG), each holiday blockable with a tick, global block switch, copy into absences without duplicates. Corpus Christi not ticked by default.

= 0.2.1 =
* Absences: add, edit and delete blocked periods — all day or with a time span, with an internal reason. Local time in, UTC stored.

= 0.2.0 =
* Weekly schedule: any number of time spans per weekday, day off by leaving a day empty, copy Monday to all weekdays, overlapping spans are merged on save. Appointment types can now edit their own schedule right in the type form.

= 0.1.6 =
* Plugin Check: zero errors. Output assembly refactored to the collect-then-echo pattern (no functional change).

= 0.1.5 =
* Help & documentation: real chapters from a single guide source, plus a copyable AI briefing. The same source will later feed the read-only REST endpoint for AI assistants.

= 0.1.4 =
* Language files: translation template plus complete German translation. Language and Pro status cards on the General settings tab. Copy button now also works on plain http sites (clipboard fallback).

= 0.1.3 =
* Appointment types fully functional: create, edit, copy, delete (with confirmation), sort by dragging or arrow buttons, all six sections. Minimum required form fields are enforced per kind. Price fields are stored but not used yet. Main menu renamed to "smartEngin MeetMix".

= 0.1.2 =
* Complete admin menu scaffold: 8 menu pages, Availability with 4 tabs, Settings with 11 tabs. Working already: the time zone check (warns about fixed UTC offsets) and the privacy switch controlling data removal on uninstall.

= 0.1.1 =
* Admin design kit: shared stylesheet and PHP building blocks (buttons, cards, tables, form rows, tabs, notices, dialog, loading and empty states), collector for admin notices from other plugins, internal reference page.

= 0.1.0 =
* Initial scaffold: database schema, activation, deactivation, clean uninstall (data is kept by default).
