Full history of ambera Theme Builder.

= 0.4.13 =
* Pro, new module: Reviews. Asks the customer a few days after an order that went out or an appointment that was kept — once, with a link that needs no account: five stars and two lines. What comes back waits until somebody has read it; let it through and the Reviews block shows it, with the average above. The key in the link belongs to one order and is used up, so nobody reviews the same thing twice and nobody is asked twice.
* The asking runs by itself once a day on a visit, not on a scheduler — many hosts switch that off, and a plugin that leans on it stops working there without saying so.
* Pro, new module: Jobs. Adverts on your own website with the details Google Jobs asks for — title, description, datePosted, validThrough, employmentType, the address in its parts, baseSalary — so the advert can appear in the jobs box and not only on your page. The screen says what is still missing for that. Nothing is invented: "by arrangement" produces no salary figure, and directApply is only true where the form really is; the same job is never marked up twice on one page.
* With the application next to it: name, message, papers attached. The papers go out through an address that asks first whether you are allowed to see them, are kept out of search engines, and are deleted with the application.
* Pro, new module: Events. Dates many people come to, as against Appointments where one person takes a time. Places, price, where it is, sign-up in one step without an account. The last place is given out under a lock, so two people in the same second do not both get it; whoever is late lands on the waiting list, and when somebody cancels the first who fits moves up and is told — the first who fits, because a family of four does not move up into two free places.
* Every confirmation carries a link that cancels and a file for the calendar (.ics). Two blocks: a list that drops what has been, and a single event as a card. Each entry says whether places are left.
* Pro, new module: Downloads. Files in groups — price list, brochure, form, manual — each with a line saying what it is, delivered under an address of the plugin's own instead of a link into the uploads folder. Two blocks: a list, which can be narrowed to one group, and a single button. A file can be for members only.
* Because the files go out through the plugin they are counted: per file, per day, thirty days and altogether, with a bar chart. No address, no account, nothing about who — and a HEAD request does not count, or link checkers would flatter the figures.
* The address of a file does not change when the file behind it does. Replace the price list and every page, newsletter and bookmark still leads to the current one.
* Four new blocks. Opening hours: the seven lines of the week as "08:00-12:00, 13:30-17:00", today marked, and a badge saying whether you are open right now and until when — worked out in the browser, because a cached page must not answer that from an hour ago.
* Contents: a table of contents built from the headings of the page. You pick the levels; headings without an anchor get one from their own text, so a copied link still lands in the same place later. A page without headings shows no box at all.
* Before and after: two pictures with a slider between them. Mouse, finger and arrow keys, and the handle announces itself to a screen reader.
* Locations: several addresses with one map beside them that jumps to whichever is picked — name, address, telephone, email and one more line. The map loads on the first click and not before, like the Google Maps block.
* Writing straight into an empty block stored the editor's own placeholder with the text: a heading came out as "<span class=\"ambera-placeholder-word\">Downloads</span>". Invisible on the page, a grey box above the heading in the editor. It is now removed wherever a block is saved or drawn; pages that carry it heal when opened, and your own spans stay.
* The client-area menu is sorted into six areas, each of which folds away; what you fold shut is remembered in your browser, and the area holding the screen you are on always opens.
* In a list of events, the name and the picture lead to the event's own page, and every entry ends in a "Read more" link — the calendar linked, the list did not. The link matters most on an event without a picture: there was nothing at all to click on such an entry.
* Every event has a page of its own at /event/its-name/ — it had none, so a description was nowhere to be read and there was no link to a single event. Picture large, the facts, the whole text, the sign-up at the end. Build a page with the block and that one is used instead.
* New block: event calendar. Drawn on the server, paging in the address so a month can be linked, and it opens on the first month that has something in it.
* Events: a calendar view beside the list, both with search and a category filter (categories are new). An event opens on its own with two tabs, the event and its sign-ups. The sign-ups tab shows four figures, lets you move somebody up from the waiting list by hand, and takes the list out as Excel or CSV — the Excel file written by the plugin, without a library.
* Adverts have categories, the way events do, and the workload is a figure: two numbers, from and to in per cent, so the list can be narrowed to "up to 50%", "50 to 79%" or "80 to 100%". The line in words stays beside it — "two days a week".
* Jobs is built the other way round as well, like Downloads and Events: the list first, with a search and two filters; an advert opens alone with two tabs (the advert, its applications) and gets the same toolbar for its text. A new entry "Applications" under Jobs shows everybody who has written in across all adverts, with three figures above — new, seen, done.
* Every download emptied the whole page cache: the counter writes a number to the file, and every number of the plugin's own written to a post threw the cache away. On a site with a price list people actually download, the cache was never full.
* "Build the page cache" counted a page as kept even where the server answered with an error. Each page is tried a second time now, and what still does not answer is named as a number instead of counted in.
* The unsubscribe page spoke English on every site: its three sentences reached the translation function through a variable, and a variable is invisible to the tool that collects texts for translation. They are collected now, and the page speaks the language of the website.
* Statistics: a city with an accent lost it — Zürich was counted as "Zrich". The CDN sends the name percent-encoded, and the cleaning step removed the percent sequences before the decoding step could read them. Decoded first now, cleaned afterwards.
* The calendar of the events module opened on the current month — an empty grid for anybody whose next event is in six weeks. It opens on the first month that has something in it, like the calendar block on the website.
* Waiting list: raising the places now fills them from the list at once; whoever moves up can be given a deadline, and if it runs out the place goes to the next one while they go back to the end of the list; and you can move somebody up yourself.
* A category can be renamed instead of only created and deleted — deleting one takes it off every event that had it.
* The six emails of the module can be written by you — switch, subject, text, fourteen placeholders, a test mail to your own address. What you do not change goes out in the wording the plugin brings. Two of them are new: the reminder two days before (once per event) and the cancellation, which also writes to the waiting list.
* The description of an event has a toolbar (bold, italic, headings, list, link), the picture is uploaded instead of entered as a number, and the name stands at the top as a title.
* Downloads are built the other way round: the screen opens on the groups, each with its number of files and its total; clicking one opens that group alone, files on the left, settings on the right. Two more entries under Downloads: "Files" (all of them, with search and filter) and "Figures". Thirty files in one table with a "Groups" column is a list you read end to end to find the price list.
* "Only for members" also sits on the group. Setting it moves every file in that group behind the lock at once; unticking moves them back. A file keeps its own setting either way.
* Replacing a file says so now, and says the thing that matters: the address stays the same, so every page, newsletter and bookmark leads to the new version. The field shows what lies there, its address, and that the replaced file is removed instead of left behind.
* Security: a file marked "only for members" was not. The lock held the way through the plugin and nothing else — measured: /download/12/ answered a stranger with 403 while the same file under its uploads address answered with 200 and handed it over. Those files now lie in a locked folder of their own: a rule for Apache, and a folder name nobody guesses for everything else, because an .htaccess does nothing on nginx. Ticking or unticking the box moves the file; its address never changes.
* Files of this module go into the media folder "Downloads" instead of among your photos.
* The button that sends an application or a sign-up was the browser's bare grey and stretched across the whole form. It carries the site's colour now and is as wide as its word; where an event is full, it steps back to an outline, because it leads to the waiting list and not to a place.
* A job advert read "from by arrangement" — the field is free text, and that is what stands in it most often. It reads "Start: by arrangement" now. The particulars beside it each sit in their own pill: one of them carries a middle dot of its own ("Basel · also from home"), and in a row of plain words there was no telling where one ended and the next began.
* A review showed its date as "2026-09-27". Stored that way so it can be sorted, written on the page the way the rest of the site writes dates.
* Under the right-hand picture of a before-and-after there was a white strip and the two pictures did not line up: the description meant only for a screen reader was taking 26 pixels. WordPress defines the class that hides it in the back end only; the theme now defines it for the front as well, which also affects the language switcher and every other block that describes a picture that way.
* A "Members only" section was invisible the moment you added it — 1152 pixels wide and none high, because its badge floats above the corner and an empty one had nothing to stand on. It now shows the same quiet area as every other empty container. Found by the walkthrough that adds all 89 blocks one after another.
* Deleting the plugin now really removes it. There was no clean-up routine at all: WordPress removed the files and nothing else. On a site that had only ever been switched on, six settings and the statistics table stayed behind; on a site that had been worked on, over fifty settings, five tables, two roles, a permission on the administrator and three scheduled jobs. All of it goes now — settings, transients, locks, the plugin's own tables, its roles, the permission, the scheduled jobs, the generated files and the rule it wrote into the .htaccess of the uploads folder.
* Nobody is locked out by it: whoever had the role "Website owner" becomes an editor, whoever was a customer becomes a subscriber. A role that no longer exists would leave them signed in with no way to anywhere.
* New, under Settings › General: a choice for what goes when the plugin is deleted. Off — the way it comes — the backups of the site, the files only members can download and what is recorded about each person are kept, because there is no second copy of them. Your pages, templates, forms, products, orders and courses always stay: they are ordinary WordPress content and they are all back if you install the plugin again.
* What goes is recognised by its beginning and not read from a list — every setting starts with "ambera_", every table with the table prefix and "ambera_" — so what a later version adds is cleaned up too. And a check that stays: it installs the plugin on a site of its own, opens every screen, deletes it again and then looks into the database and the uploads folder.
* The free package carried the code of a Pro block — the event calendar, which is never offered there because it is only registered where the Events module exists. It is left out now, and a check compares every Pro block against the list of what the free package leaves out, from both sides.
* Pro: deleting the plugin from the Plugins screen could end in a blank page. WordPress removes the folder first and then, in the same request, writes its note of which plugins have an update — which calls this plugin, whose code is still in memory while its files are gone. Asking for the licence key there loaded a class whose file no longer existed: a fatal error right after the click on "Delete". The step now looks whether its own main file is still there. The check that runs an update while the plugin is switched on removes it at the end as well and reads the error log afterwards; updating was tested, deleting was not.

= 0.4.12 =
* Pro, Legal pages: the button "Create the pages" did nothing. Same for every Save under Appointments. The forms posted to /themebuilder/admin/do/<action>, which answered 404, because neither module had registered its action for the client area. New filter ambera_own_actions; both modules use it.
* Pro, Appointments: the block was not in the editor's block list. Its category() returned "forms"; the group is called "form". A block whose group does not exist is in no list.
* Pro, Appointments: the block now takes several services and several people instead of one or all. One person fixes the block to her; several give the visitor a choice between exactly those; none means all. Old pages keep working — a single number is still read as a list of one.
* Empty dropdowns in the editor, six of them: Appointments (service, person), Memberships (columns), Members only (who sees it), Course list (which courses), Menu entry (who sees it). Their options were an associative array, which becomes a JSON object, and the editor reads a list.
* Pro, languages: a page under /en/, /fr/ and so on kept the site language for every word a block brings with it. Lang\Pages now switches the WordPress locale, and tells WordPress about the languages that ship inside the plugin — without that, switch_to_locale() refused everything but en_US.
* Editor: WordPress draws a blue focus ring on :focus, not :focus-visible, so it appeared on every mouse click. It is switched off inside the editor; the keyboard focus ring stays.
* With a licence, blocks, demos and template kinds no longer carry a "Pro" mark. The mark now follows the lock, not the list of Pro things.
= 0.4.11 =
* An update that cannot succeed is refused before anything is deleted. WordPress clears the old plugin folder first and only notices halfway through when it is not allowed to — what is left is a folder without its main file, which WordPress no longer recognises as a plugin: it drops out of the list, switches off, and the site stands there without its theme. The plugin now looks over its own folders first and stops the update with a message naming the one in the way, so the running version stays and the site keeps working.
* A plugin folder that is only a link to somewhere else is refused as well. Updating it would rewrite the files it points at — where several sites share one folder, that takes down the sites nobody touched.

= 0.4.10 =
* Help now has a chapter for every part of the plugin, the ones that come with Pro included — so the screen tells you what a thing does before you have to decide whether you need it. Each chapter has its own films where one exists.
* The rest of this version happens in Pro; the free plugin keeps step with it.


= 0.4.9 =
* Support without an account. "Support ticket" and "Feature request" on the Help screen used to open a sign-in page — the free plugin has no account there. They now lead to an open form: you write your question, the answer comes by email, and you answer by replying to it. Version, WordPress, PHP and the site are filled in before you arrive, and screenshots may come along.
* A header template can stay at the top while the page scrolls, so the menu and the search stay within reach on a long page. The switch sits on the template, beside "Lies over the content".

= 0.4.8 =
* Tasks are part of the free plugin now: what has to be done, with a day and a time, and a reminder in the client area when it is due.
* The post list can carry filter buttons — one for each category among the posts shown — and filters without loading the page again.
* The search block can suggest matching pages while a visitor types.
* The Security screen has tabs instead of seven sections under one another; one button still saves the whole screen.
* The builder is set in Open Sans. The font ships with the plugin; nothing is fetched from Google.
* Fixed: "No programs in the uploads folder" took a file written by an earlier version for a stranger's and asked the owner to edit the .htaccess by hand.
* Fixed: where that file really belongs to somebody else, the rule now goes in as its own block between two marker lines, the way WordPress writes its own.

= 0.4.7 =
* Spam protection under every form, every comment and every sign-up: a hidden field, a signed clock, a brake per address, a limit on links and a word list of your own. No captcha, nothing from Google, no cookie.
* Sections, groups, columns and grids can end in a shape instead of a straight line — a wave, a slant, a triangle, mountains — drawn in the page.

= 0.4.6 =
* The date a page was last changed follows its layout, which is what search engines and caches read.

= 0.4.5 =
* Compatibility improvements and internal hooks.

= 0.4.4 =
* Compatibility improvements and internal hooks.

= 0.4.3 =
* Compatibility improvements and internal hooks.

= 0.4.2 =
* Two-factor sign-in keeps "Remember me": the tick on the first form now survives the code on the second.
* Compatibility improvements and internal hooks.

= 0.4.1 =
* Compatibility improvements and internal hooks.

= 0.4.0 =
* Compatibility improvements and internal hooks.

= 0.3.9 =
* Compatibility improvements and internal hooks.

= 0.3.8 =
* Compatibility improvements and internal hooks.

= 0.3.7 =
* A button can lead to a file from the media library (a download).
* Compatibility improvements and internal hooks.

= 0.3.6 =
* Compatibility improvements and internal hooks.

= 0.3.5 =
* Compatibility improvements and internal hooks.

= 0.3.4 =
* The early firewall (loader in the site root) is a Pro file; the free plugin writes nothing outside the uploads folder.
* The residual stylesheet of an HTML import is kept only with its checker, which is Pro; the free plugin drops it.
* The block library's preview document uses a data-address stylesheet link instead of a style tag where no file can be written.
* External services: PayPal button, share links and the Interpol redirect are documented.

= 0.3.3 =
* Login hiding is off on a fresh installation; switch it on under Security.
* The finished page goes through wp_kses with an allow-list of what the blocks output before it is printed; shortcodes run afterwards, as WordPress does.
* JSON-LD of the breadcrumbs and reviews blocks is printed in the footer through wp_print_inline_script_tag.
* Icons, the mark, the template sketches and the QR code are escaped where they are printed; inline stylesheets go through wp_strip_all_tags.
* Demo files are checked before unpacking: only JSON, images, fonts, media, PDF and text, nothing outside the folder.
* The Snippets module is not in the free plugin at all any more.
* Inputs of the template conditions, the client bar and the mail password are sanitised or validated on arrival.
* Fresh installation with WP_DEBUG: statistics table created on activation, no early translation, no unknown style dependency.
* Backups: a percent sign survives a restore.

= 0.3.2 =
* Sign-in guard: whoever keeps trying while locked out, or comes back for a third round, goes on the firewall's block list for good.
* Twenty-five short help films, one per screen, linked from the Help.
* Nothing locked: the Pro blocks, modules, template kinds and the license section are not in this plugin any more, instead of standing there locked. Pro is a separate plugin.
* Every external service is listed under "External services" with terms and privacy links.
* Early scripts and styles go through wp_print_inline_script_tag and wp_add_inline_style; JSON-LD keeps slashes escaped; the page cache closes its buffer itself; translations load on init.

= 0.3.1 =
* Text size and contrast for the client area ("Aa" in the top bar), per user.
* New versions show in the client area (dashboard stripe, Help) and lead to the WordPress updates page — not only in wp-admin.
* Support tickets and feature requests open the support portal, prefilled; no mail server needed.
* Statistics: addresses that are never counted (Settings → Speed → Statistics).
* Menus in the section library: five built menus to put in — a row with a dropdown, a mega menu across the whole width, a dark one, one centred under the name, one down a side column. A full-width mega menu now begins at the lower edge of the header.

= 0.3.0 =
* Access: per role and area, what a role sees and where it may only look — hidden, see only, or see and change; give an editor the newsletter, the shop or the users without making them an administrator.
* Menu builder: the Menu block built on the spot — entries with icons, badges and a line below; a list or a built panel (mega menu) under every entry; in a row or one under the other. Menu templates (Pro) shared by several headers.
* Backups (Pro): the whole site in one file, made now or on a plan, incremental or full, checked after every run, restored with one click; download and upload.
* Navigation folds from the first paint on phones; pictures carry their aspect ratio — no layout jump.

= 0.2.10 =
* Site fonts are preloaded: no layout jump when the font arrives.
* Accessibility styles sit in the head instead of a render-blocking file.

= 0.2.9 =
* Dragging a block wider works even against a max-width class from a demo.
* The structure panel has its own close button.

= 0.2.8 =
* A demo brings its AVIF pictures with it; the import no longer spends minutes on them.
* AVIF files are really smaller now.

= 0.2.7 =
* First release on wordpress.org: the plugin slug is ambera-theme-builder, the readme names every external service, and the free version never calls home.
* A demo imports in the free version again.

= 0.2.6 =
* Ninety-three demos in the catalogue, every one with its own skeleton and a photo up front.
* The demo list counts itself.
* An update from the dashboard stripe leaves the plugin switched on.

= 0.2.5 =
* The carousel loops for real, a slide lays out its content.
* A demo imports in a window over the page and can be cancelled.
* The plugin list says Pro or Light.

= 0.2.4 =
* Fourteen new blocks: slider, popup, off canvas, loop carousel, flip box, reviews, share buttons, video playlist, image hotspots, portfolio, sitemap and more.
* The block library opens at once.

= 0.2.3 =
* A library of 270 ready-made sections at the plus of every section — five of them menus, with a mega menu.
* Your own picture in the profile; an editor bar with room to breathe.

== Upgrade Notice ==

