=== STM Smart Checkout for WooCommerce ===
Contributors: jobhunter99
Tags: checkout, woocommerce checkout, conversion, germanized, one page checkout
Requires at least: 6.5
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 0.1.49
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Conversion-focused, legally compliant checkout for WooCommerce — works with your gateways, your theme and Germanized instead of replacing them.

== Description ==

STM Smart Checkout turns the standard WooCommerce checkout into a focused, trustworthy buying experience — without replacing your payment gateways, your legal plugins or the WooCommerce checkout itself.

**The core plugin, completely free:**

* Distraction-free checkout layouts — three columns, two columns or a single column, with a progress indicator through cart, checkout and confirmation
* A trust header band that replaces the theme header on cart and checkout: your logo, three short trust claims with their icons, and an "Already a customer?" login pill that opens the login form WooCommerce prints anyway
* Card-based design driven by design tokens: accent colour, hover colour, heading colour, the step and label blues, font size and corner radius — all from the settings screen, no `!important` battles with your theme
* Field manager with real-time validation, tidied field pairs (first and last name, postcode and city), state corrections and the correct touch keyboard on phones
* Postcode autofill for Germany, Austria and Switzerland — type the postcode, the city fills itself. The databases ship inside the plugin: no external service, no customer address leaves your server
* Legal texts (terms, cancellation policy) open in an overlay without leaving the checkout, and a server-side safety net checks every required consent box again after submit
* Trust badges with a curated icon set, and a reassurance note between the consent boxes and the buy button
* Optional control over the coupon notice and the "Additional information" order notes field — two of the most common reasons customers leave a checkout to go looking for something
* Delivery time under every product in cart and checkout, resolved from the most specific source that knows one
* A legal footer row under the checkout, filled from pages you pick, from a menu, or automatically from the legal pages your site already registers
* Preview mode: try the whole thing on your live site while customers keep seeing the standard checkout
* HPOS (High-Performance Order Storage) supported, no external fonts, no tracking, no remote requests

**Built for stores selling under EU and German law (DACH-ready)**

If no legal plugin is present, the checkout supplies the mandatory pieces itself — each one only when no other plugin is actually rendering it, so nothing ever appears twice:

* The consent box for terms and cancellation policy, with the exact wording the customer saw written onto the order
* A buy button label that states the obligation to pay, as § 312j BGB requires — WooCommerce's own "Place order" does not
* The VAT statement in the order summary
* Delivery time per line item
* The short mandatory notice directly above the buy button, where the essential order details have to be readable

It works **with** WooCommerce Germanized and German Market rather than against them: the plugin asks the rendered checkout whether a legal plugin is actually printing a checkbox — not whether one happens to be installed — and stands down where it is. Unit prices (PAngV) and sending the cancellation policy with the order mail stay with a dedicated legal plugin, and the settings screen says so in plain language instead of leaving you to find out later.

**What it deliberately leaves alone**

Your gateways keep rendering their own express buttons. Your legal plugin keeps owning its legal texts. Your theme keeps its typography. This plugin arranges what is already there into a checkout that converts — deactivate it and you get the standard WooCommerce checkout back, unchanged.

It styles the classic (shortcode) cart and checkout in full. On the Cart and Checkout blocks it delivers the shell around the form, the design tokens inside it, a required consent box that WooCommerce validates on the server, the mandatory notice and the links to the legal texts above the button, the § 312j button label, the delivery time under each item, the trust row under the button and the reassurance note under the consent box; the column layouts and the field manager are classic-only for now, and the settings screen says which is which. A reversible one-click switch to the classic pages remains — the plugin never changes your pages on its own.

**STM Smart Checkout Pro**

The free plugin above is complete in itself and stays that way. A separate paid add-on adds seven things, in order of how often shops ask for them:

* **Online withdrawal form** — the withdrawal function required across the EU since 19 June 2026 (directive 2023/2673): a public form on its own page, reachable for guests, pre-filled for logged-in customers with their most recent order, with merchant notification and customer receipt
* **Withdrawals management screen** under WooCommerce with a status workflow, its own table and a counter badge — plus a "Withdraw this order" button in My Account for a period you choose
* **Express zone** — one defined band above the checkout form for wallet buttons, instead of PayPal under the payment methods and another button somewhere else. The buttons are steered into place through the providers' own filters, never rebuilt or moved in the DOM
* **Payment-dependent required fields** — a matrix that makes "required" depend on the chosen payment method, so invoice purchase can ask for a phone number while prepayment does not. Checked again on the server
* **Method customizer** — your own name, a note, a symbol and a sort position per payment method, all through documented WooCommerce filters, with 33 bundled symbols
* **Safe mode** — a fatal error while the checkout renders no longer costs the shop its orders: the Smart Checkout stands down from the next request on and WooCommerce's standard checkout takes over, visibly and reversibly
* **Mobile sticky order bar** and an **ultra-compact layout** for dense checkouts on small screens

Pro requires this free plugin and is sold here: [STM Smart Checkout Pro for WooCommerce](https://en.storetown-media.de/produkt/stm-smart-checkout-pro-woocommerce/). This plugin has a page of its own as well: [STM Smart Checkout for WooCommerce](https://en.storetown-media.de/produkt/stm-smart-checkout-woocommerce/)

**Auf Deutsch: rechtssichere WooCommerce-Kasse für Shops in Deutschland, Österreich und der Schweiz**

STM Smart Checkout macht aus der Standard-Kasse von WooCommerce eine fokussierte, vertrauenswürdige Kaufstrecke — ohne Ihre Zahlungsarten, Ihr Rechts-Plugin oder die WooCommerce-Kasse selbst zu ersetzen.

**Kasse gestalten und Kaufabbrüche vermeiden**

* Ablenkungsfreier Checkout: Theme-Kopf, Menü, Siegel und Brotkrumen verschwinden auf Warenkorb und Kasse — als Ein-, Zwei- oder Dreispalter mit Fortschrittsanzeige über Warenkorb, Kasse und Bestätigung
* Trust-Kopfband mit Ihrem Logo, drei kurzen Vertrauens-Aussagen mit Symbolen und einer „Bereits Kunde?"-Anmelde-Pille
* Kartenbasiertes Design über Design-Tokens: Akzentfarbe, Überschriftenfarbe, Schriftgröße und Eckenradius aus dem Backend — ohne `!important`-Kämpfe mit dem Theme
* Vertrauenselemente und Trust-Badges mit kuratiertem Symbolsatz, dazu ein Beruhigungshinweis direkt über dem Kaufknopf
* Gutschein-Hinweis und das Bemerkungsfeld „Zusätzliche Informationen" abschaltbar — zwei der häufigsten Gründe, warum Kunden die Kasse verlassen
* Vorschau-Modus: alles auf der Live-Site ausprobieren, während Kunden weiter die Standard-Kasse sehen

**Formularfelder und Adresseingabe**

* Feldverwaltung mit Sofortprüfung, aufgeräumten Feldpaaren (Vor-/Nachname, PLZ/Ort) und den richtigen Tastaturen auf dem Handy
* PLZ-Autovervollständigung für Deutschland, Österreich und die Schweiz — Postleitzahl eintippen, der Ort füllt sich selbst. Die Datenbanken liegen im Plugin: kein externer Dienst, keine Kundenadresse verlässt Ihren Server (DSGVO-konform)

**Pflichtangaben nach deutschem und EU-Recht — auch ganz ohne Rechts-Plugin**

Ist kein Rechts-Plugin vorhanden, liefert die Kasse die Pflichtangaben selbst. Jede davon nur dann, wenn kein anderes Plugin sie bereits ausgibt — nichts erscheint doppelt:

* Einwilligung zu AGB und Widerrufsbelehrung als Pflicht-Häkchen, mit dem exakten Wortlaut auf der Bestellung
* Button-Lösung nach § 312j BGB: eine Beschriftung des Kaufknopfes, die die Zahlungspflicht ausspricht — WooCommerce' „Bestellung abschicken" tut das nicht
* MwSt.-Ausweisung in der Bestellübersicht
* Lieferzeit je Artikel in Warenkorb und Kasse
* Der kurze Pflichthinweis unmittelbar über dem Kaufknopf, wo die wesentlichen Angaben lesbar sein müssen
* AGB und Widerrufsbelehrung im Overlay lesbar, ohne die Kasse zu verlassen — plus serverseitige Absicherung, die die Pflichthäkchen nach dem Absenden erneut prüft
* Rechtszeile unter der Kasse mit Impressum, Datenschutz und AGB, aus gewählten Seiten, einem Menü oder automatisch aus den bereits hinterlegten Rechtsseiten

**Arbeitet mit Germanized und German Market zusammen, nicht gegen sie.** Das Plugin fragt die gerenderte Kasse, ob ein Rechts-Plugin tatsächlich ein Kästchen druckt — nicht, ob eines installiert ist — und zieht sich dort zurück. Grundpreise (PAngV) und der Versand der Widerrufsbelehrung mit der Bestellmail bleiben beim Rechts-Plugin; der Einstellungsbildschirm sagt das klar, statt es Sie später herausfinden zu lassen.

**Grundsatz:** Ihre Zahlungsarten rendern weiter ihre eigenen Express-Knöpfe, Ihr Rechts-Plugin behält seine Rechtstexte, Ihr Theme behält seine Typografie. Dieses Plugin ordnet alles zu einer Kasse, die verkauft. Deaktivieren Sie es, steht die Standard-Kasse unverändert wieder da.

**STM Smart Checkout Pro**

Alles oben Beschriebene ist im kostenlosen Plugin und bleibt dort. Das kostenpflichtige Zusatzmodul ergänzt sieben Dinge:

* **Online-Widerrufsformular** — die seit dem 19. Juni 2026 EU-weit vorgeschriebene Widerrufsfunktion (Richtlinie 2023/2673): öffentliches Formular auf eigener Seite, auch für Gäste erreichbar, für angemeldete Kunden mit der letzten Bestellung vorbefüllt, mit Händler-Benachrichtigung und Kundenbeleg
* **Widerrufs-Verwaltung** unter WooCommerce mit Status-Workflow, eigener Tabelle und Zähler-Badge — dazu ein „Diese Bestellung widerrufen"-Knopf im Kundenkonto für einen von Ihnen gewählten Zeitraum
* **Express-Zone** — ein definiertes Band über dem Kassenformular für PayPal, Apple Pay und Google Pay, statt eines Knopfes unter den Zahlarten und eines zweiten irgendwo sonst. Die Knöpfe werden über die Filter der Anbieter dorthin gesteuert, nie nachgebaut und nie im DOM verschoben
* **Zahlartabhängige Pflichtfelder** — eine Matrix, die „Pflicht" von der gewählten Zahlart abhängig macht: Kauf auf Rechnung darf nach der Telefonnummer fragen, Vorkasse nicht. Serverseitig nachgeprüft
* **Methoden-Customizer** — eigener Name, Zusatztext, Symbol und Reihenfolge je Zahlart, alles über dokumentierte WooCommerce-Filter, mit 33 mitgelieferten Symbolen
* **Safe-Mode** — ein Fatal Error beim Rendern der Kasse kostet den Shop keine Bestellungen mehr: der Smart Checkout zieht sich ab der nächsten Anfrage zurück, die Standard-Kasse übernimmt, sichtbar und umkehrbar
* **Mobile Sticky-Bestellleiste** und ein **ultra-kompaktes Layout** für dichte Kassen auf kleinen Bildschirmen

Pro setzt dieses kostenlose Plugin voraus: [STM Smart Checkout Pro für WooCommerce](https://www.storetown-media.de/produkt/stm-smart-checkout-pro-woocommerce/). Auch das kostenlose Plugin hat eine eigene Seite: [STM Smart Checkout für WooCommerce](https://www.storetown-media.de/produkt/stm-smart-checkout-woocommerce/)

== Frequently Asked Questions ==

= Does this work with the block-based checkout? =

In part, and the plugin says exactly which part. Everything around the form works on the Cart and Checkout blocks: the full-page template, the trust header band, the step indicator, the legal footer line and the design tokens on the button, the fields and the order summary. Inside the form, the pieces that matter under German law are there as well: a required consent box for terms and cancellation policy that WooCommerce validates on the server — a request without the tick is refused — and writes onto the order together with the exact wording; the mandatory notice from your settings and the links to both texts one line above the buy button, the links opening in the same overlay as on the classic checkout; the buy button label from your settings; and the delivery time under each line item, in the cart block and in the order summary, resolved from the same sources as on the classic checkout. Also on the blocks since 0.1.47: the trust row under the buy button and the reassurance note under the consent box, in the same markup and the same stylesheet the classic checkout uses. Also on the blocks since 0.1.48: the switches for the coupon prompt and the order-notes field — the block checkout already folds both away behind a single line, so the separate "expandable line" setting for the notes has nothing left to do there. Not yet on the blocks: the column layouts and the field manager with its postcode autofill. The settings screen lists this, and the one-click switch to the classic cart and checkout remains for shops that want all of it today — the block markup is kept, so the way back is one click as well.

= Does it work with WooCommerce Germanized / German Market? =

Yes — coexistence with both is a core design goal. The plugin respects their legal checkboxes, button texts and tax displays.

= Is there a paid version, and what does it add? =

Yes. STM Smart Checkout Pro is a separate add-on that requires this free plugin. It adds the online withdrawal form and its management screen, the express zone for wallet buttons, payment-dependent required fields, the payment method customizer, safe mode, a mobile sticky order bar and an ultra-compact layout. Everything described in the description above is part of this free plugin and stays that way — Pro adds, it does not unlock. Details and pricing: [STM Smart Checkout Pro for WooCommerce](https://en.storetown-media.de/produkt/stm-smart-checkout-pro-woocommerce/)

= Does the free plugin include the online withdrawal form required since June 2026? =

No — that one is in Pro. EU directive 2023/2673 requires an online withdrawal function for distance contracts from 19 June 2026, and it is more than a form: a public page reachable for guests, pre-filling for logged-in customers, order matching that never turns a consumer away, notification and receipt mails, and a management screen with a status workflow. What the free plugin does cover is the checkout side of German and EU law — consent, the § 312j BGB button label, VAT statement, delivery time and the mandatory notice above the buy button.

= Do I need a legal plugin for a German shop? =

No. If none is present, the checkout supplies the mandatory pieces itself: the consent box for terms and cancellation policy, the § 312j BGB button label, the VAT statement in the order summary, and the delivery time under each product. Each of these is decided by asking whether another plugin is actually rendering it — not by asking whether one is installed — so nothing ever appears twice.

= What does it deliberately not cover? =

Unit prices (PAngV) and sending the cancellation policy with the order confirmation mail stay with a dedicated legal plugin. The settings screen states this in plain language rather than leaving you to find out later, and it shows what the automatic detection last found on your checkout.

= Can I try it without switching my live checkout over? =

Yes. Leave the plugin switched off and open the checkout with `?stmc_preview=1` as a shop manager — you see the Smart Checkout, customers keep seeing the standard one. `?stmc_preview=off` ends the preview again, and the settings screen tells you while it is running, with the link that ends it.

= What happens to my checkout if I deactivate the plugin? =

You get the standard WooCommerce checkout back, unchanged. The plugin arranges and supplements the existing checkout; it does not replace the template, the gateways or the order process, and it stores nothing your shop would miss.

= Does it work with my theme? =

It is built to. Themes with a server-side adapter (The7, Storefront) use their native distraction-free path; every other theme gets the plugin's own minimal full-page template, so the theme's header, menus and footer are never built while styles, analytics, consent tools and chat widgets keep working. Layout rules place the checkout anchors themselves, whatever markup a theme template wraps them in.

= Is it compatible with HPOS? =

Yes, HPOS (High-Performance Order Storage) is fully supported. Compatibility with the cart/checkout blocks is declared in the sense that this plugin does not interfere with them — it does not style them either; see the block-checkout question above.

= Does it load external fonts or call external services? =

No. No remote fonts, no tracking, no external requests. The postcode databases for DE/AT/CH ship with the plugin.

== Credits ==

The bundled postcode databases for Germany, Austria and Switzerland are derived from the free geographical database [GeoNames](https://www.geonames.org/), used under the [Creative Commons Attribution 4.0 licence](https://creativecommons.org/licenses/by/4.0/).

They ship as plain JSON inside the plugin and are read locally. Nothing is fetched at runtime, and no address a customer types is sent anywhere.

== Screenshots ==

1. The three-column checkout: trust header band with progress, express payment area, and address, payment and order summary side by side.
2. The buy zone in reading order — totals, required consent, reassurance note, buy button, trust row.
3. Terms and cancellation policy open in an overlay, without leaving the checkout.
4. The same checkout on a phone: one column, reachable targets, express buttons kept.
5. The design tab — layout, the two blues, font size in pixels, every setting with its own plain-language help bubble.
6. The legal tab with "detected at the checkout": what the automatic detection last found, and which required statements the plugin is standing down from because another plugin delivers them.

== Changelog ==

Older entries (0.1.0 to 0.1.28) are kept in `CHANGELOG-ARCHIVE.txt` in the plugin's
repository: https://github.com/storetown-media/stm-smart-checkout
They are left out here because WordPress.org truncates this section at 5,000 words,
which would drop them silently instead of on purpose.

= 0.1.49 =
* On the block checkout the own consent box now stands down for a legal plugin that renders its own — until now a shop running Germanized read two consent texts on one page, ours as a required checkbox and Germanized's below it, with the setting on "automatic".
* Why it took a different answer than the classic checkout: the block field has to be registered at woocommerce_init, because the Store API needs it registered to validate and store it, and at that moment no legal plugin has hooked the checkout yet. Measured in a real request — the detection answers "nobody" there and "Germanized" a few hooks later, too late to matter.
* So on the blocks, and only there, the question is answered by presence rather than by hook, and as narrowly as possible: not "is Germanized installed" but "is its block integration loaded". Registering the field and declining to render it later would have been better, but WooCommerce offers no filter for that.
* The settings screen says what was found, because a decision made on presence can be wrong and must not be wrong silently. A shop whose legal plugin is installed but not showing a consent box switches the setting to "on".

= 0.1.48 =
* The coupon prompt and the order-notes field can now be switched off on the block checkout too — the same two settings that already governed them on the classic pages, so a shop configures once and both surfaces agree.
* Measured before it was promised, and the measurement moved the answer: WooCommerce hands the block app a couponsEnabled flag and offers a filter behind it, but that flag is global for the request — the Store API checks the same function, so using it would not hide a prompt, it would refuse coupons the shop still issues by link. The narrow lever is the block wrapper itself.
* The order-notes filter the classic checkout uses does not exist in the block path at all; the block that draws the field carries no logic to hook into. What works is that the Checkout block renders server-side as a tree of empty wrappers and the app mounts into them — no wrapper, nothing to mount. Verified through first paint, through a re-render, and on the way back.
* Said plainly rather than sold: the block checkout already folds the notes and the coupon behind a single line by itself, so the separate "expandable line" setting for the notes changes nothing there. The settings screen says so.

= 0.1.47 =
* The trust row and the reassurance note reach the block checkout. The row of small trust items sits under the buy button, where the last doubt happens, and the reassurance note under the consent box it comments on — the same markup, the same settings and the same stylesheet the classic checkout uses, read from one place so the two can never drift apart.
* Measured first, because the reasonable guess was wrong: the block checkout offers no hook under its button and no slot either — the four Slot/Fill points WooCommerce exposes all sit in the order summary. What does work is appending markup after a block, and the checkout's React tree leaves it alone: through the first paint, and through re-renders while a customer types.
* The block stylesheet no longer depends on the legal module. A shop that lets a legal plugin handle consent kept its buy button, fields and cards unstyled on the blocks, because the whole layer hung on one switch. The design travels with the plugin now; the button label, the consent box and the legal line still stand down with the module they belong to.

= 0.1.46 =
* The block checkout wears the plugin's design. Every step of the Checkout block is a card now — the same background, border, radius and shadow as the classic sections — with the classic numbered title: a disc in the title blue counting contact, address, shipping and payment, and the accent rule beneath. The additional-information block and the order notes keep the card and skip the number; they are addenda, not steps. The order summary heading speaks in the same voice. All of it is stylesheet only, hung on the block's own class names as measured on WooCommerce 11, and switched off with the plugin.
* Not attempted, and said so: the three-column choreography of the classic checkout. The block offers no wrapper for two independent columns of steps, and a grid would couple the address and payment columns row by row — a tall payment step forcing an equally tall blank beside it. The layout setting keeps applying to the classic checkout only, as the settings screen states.

= 0.1.45 =
* The legal core works on the Cart and Checkout blocks. A required consent box for terms and cancellation policy is registered through WooCommerce's additional checkout fields, so the Store API validates it on the server — a checkout request without the tick, or with it set to false, is refused before an order exists — and the order carries the moment of consent and the exact sentence agreed to, as it does on the classic checkout. The links to both texts stand one line above the buy button, in the place WooCommerce reserved for legal text, and open in the plugin's overlay. The buy button carries the label from your settings; the blocks never read the classic filter, and what looked compliant on German shops so far was WooCommerce's translation of "Place order" and nothing more.
* The design tokens reach into the block form: the buy button, the fields, the section titles and the order summary wear the same accent, radius and type scale as the shell around them. The shell itself — full-page template, trust band, step indicator, legal footer — has worked on the blocks all along; it hangs on page hooks, not on the classic checkout's rendering hooks, which is more than the previous FAQ answer allowed for.
* The mandatory notice and the delivery time follow. The notice from your settings — the essential order details the courts want readable right before the decision — shares the line above the buy button with the legal links, in body size where the links stay quiet. The delivery time under each item rides on WooCommerce's own item data, the mechanism the Store API and both blocks already render under a product name: it appears in the cart block and in the checkout's order summary, resolved from the same sources as on the classic checkout (the product's own value, a legal plugin's delivery term, the shop-wide default), stands down for virtual items and where a legal plugin labels the item, and is printed once even on a shop whose cart is classic while its checkout is a block.
* Not on the blocks yet, and said so on the settings screen: the column layouts, the field manager and postcode autofill, the trust row, the reassurance note, the coupon and order-note controls. Every piece above stays out on WooCommerce older than the additional-fields API; the classic checkout is unaffected there.

= 0.1.44 =
* The logo field no longer promises something the checkout does not do. Its help text said an empty field falls back to your site logo; the header band actually prints your site title as text, which is what the code has always done. A shop owner who left the field empty expecting a logo got a line of text and no explanation. Both help texts now describe the behaviour, and say out loud that the site logo and this field are different places in WordPress.
* The German translation follows the WordPress glossary. The German polyglots team pointed at the glossary and the style guide when granting editor rights, and four terms did not match it: Knopf is Button, Kästchen is Checkbox, Fußbereich is Footer, and Site is Website. 38 places in each of the two German catalogues, with the article corrected wherever the gender changed with the word — a Kästchen is neuter, a Checkbox is not, and a blind replacement would have left "das Checkbox" behind in a dozen sentences. Translations are delivered by WordPress.org and are not part of this package.

= 0.1.43 =
* The links to our own pages sit at the end of the description instead of its second line. A shop owner opening a directory page wants to know what the plugin does; a link to the vendor's shop before the first feature reads as an advertisement, whatever it points at. Both language sections now describe the plugin in full first and name the pages afterwards, where someone who has read that far might actually want them. The first link is now halfway down the description rather than in its opening. No code changed.

= 0.1.42 =
* The links in the description are links. WordPress.org renders a readme with a Markdown subset — bold, lists and headings came through, but a bare URL stays plain text, so every address in the description sat there unclickable. They are written as proper links now, with the product's name as the anchor instead of the address, which is also what a search engine reads. The two attribution links in Credits had the same problem and are fixed with them. No code changed.

= 0.1.41 =
* The description says what the plugin actually does. It listed eight bullets for a checkout that has closer to twenty settings worth naming, and it described the paid add-on as "three things" when it has carried seven since the end of August — an understatement is as inaccurate as a promise, and this readme has been on the wrong side of that before. Both product pages are linked now, in the language of the section that links them, and the German half spells out the legal features under the words a German shop actually searches for: Button-Lösung, § 312j BGB, Widerrufsformular, AGB-Checkbox, MwSt.-Ausweisung, Lieferzeit. Two questions were added to the FAQ, one of them stating plainly that the online withdrawal form required since 19 June 2026 is in Pro and not in this plugin. No code changed.

= 0.1.40 =
* The plugin's own homepage link no longer leads to the paid version. The Plugin URI in the header pointed at a path that redirects to the Pro product page, and WordPress.org publishes that header field as this plugin's homepage — so the free plugin's link led to a sales page for a different product. It now points at this plugin's own page. Both header URLs are the English ones, because the directory listing is written in English; the German product pages are carried by the German translation of those fields, which is what translatable header URLs are for.

= 0.1.39 =
* The settings screen loads its stylesheet and its script as files. Both were printed into the page as a style and a script block, which renders the same but skips everything WordPress does around an asset: a version the caches can see, one place from which a site can dequeue or replace them, and markup that stays out of the middle of the form. The distraction-free module's extra hide rules take the same route and hang off the checkout stylesheet now instead of being written into the page head — and the child combinator survives their sanitizer, so "header > .bar" hides that bar rather than everything below the header.
* Values written into a style element are stripped of the characters that could leave it. The word between the express buttons and the form is translatable, and a translation is a string from outside the code: one carrying a closing style tag would have ended the element and turned the rest of the declaration into markup. The colour and size tokens pass the same filter, applied late, where the value is written into the CSS rather than where it was read.
* Translations come from WordPress rather than from the package. The plugin no longer calls load_plugin_textdomain and no longer ships compiled .mo files: for a plugin in the directory, WordPress delivers translations into wp-content/languages/plugins/ and loads them on the first translated string without being asked, so a bundled copy would only give one language two sources — of which the packaged one is always the older. The Domain Path header goes with them, because it pointed at a folder the package no longer carries. The German translation stays maintained in the source repository and goes to translate.wordpress.org, where anyone who finds a better word can correct it.

= 0.1.38 =
* The shipping-address switch speaks in the checkout's voice. Its label carries the text, so a theme's label rules land there rather than on the heading around it — Basel sets 22px and uppercase on `.woocommerce-form__label`, and that one line shouted at 66px while the rest of the checkout spoke normally. Font size, weight, letter spacing and casing now inherit from the row, stated on the label and on the span inside it, because which of the two a theme targets differs.

= 0.1.37 =
* Customers can enter a different shipping address again. The rule that steps the theme's own section headings aside — so the plugin's numbered titles can take their place — also caught the shipping block, and WooCommerce does not put a heading there: it puts the "Ship to a different address?" checkbox inside that h3. Hiding it removed the only control that opens the shipping address and left an empty card in its place, on every shop that offers shipping. The shipping block is now excluded from that rule and its heading is styled as what it actually is: a switch, in the body font, with a 44px tap target. Reported from a live shop; the two test shops had never rendered the section, one forcing shipping to the billing address and the other selling a virtual article.

= 0.1.36 =
* The plugin now says it when your cart and checkout are built from blocks. A stock WooCommerce install renders both pages from the Cart and Checkout blocks; this plugin extends the classic cart and checkout, and none of its hooks fire inside the blocks. Until now that combination was silent in every direction: the settings screen offered its full set of options, the checkout kept looking exactly as before, and WooCommerce said nothing either — because the plugin declares block compatibility, which is true (it breaks nothing) and which switches off Woo's own warning. The settings screen now names the affected pages above the tabs, states plainly that nothing below will change what customers see, and offers to switch those pages to the classic cart and checkout in one click. The block markup is kept in the page's meta, so the way back is one click as well and stays visible for as long as the switch is in place. The same note appears once on the plugins list, where it can be dismissed.

= 0.1.35 =
* Preview mode can be left again. Once a shop manager had opened the preview, every later visit showed the Smart Checkout while the settings screen kept saying "off" — which reads like a broken switch. `?stmc_preview=0` (also "off", "no") clears the cookie and takes effect in the same request, and the settings screen now says out loud whenever the cookie is set: preview is on for you, this is why the checkout looks switched on, customers still see the standard checkout — with the link that ends it. Customers were never affected.

= 0.1.34 =
* Delivery time per line item — the last piece a shop without a legal plugin was missing in its checkout. Shown under every product in cart and checkout, resolved from the most specific source that knows one: a value typed onto this product (new field in the product's Shipping tab) wins, then Germanized's own delivery-time term (variation falling back to parent), then the shop-wide default. The `stmc_delivery_time` filter has the last word for shops that compute it from stock, a supplier feed or the shipping zone. Where a legal plugin already states the delivery time for a product, this one stays away — decided per product, not per shop.

= 0.1.33 =
* The two blues become settings. The step-heading blue and the field-label blue were hardcoded in the token file, which made them the only colors a shop could not change; both are colour settings on the Design tab now, with their current values as defaults, so nothing shifts visually. They stay deliberately separate from "Heading color" — labels are read while filling in, headings while orienting, and one colour for both flattens the form into a grey block. The reassurance note moves back between the consent boxes and the buy button, where it comments on the consent right above it.

= 0.1.32 =
* The order summary states its VAT. With gross prices WooCommerce prints no tax row at all, reasoning that the price already contains it — so on a shop whose legal plugin has stopped rendering, the summary charges VAT and says nothing about it. The checkout now states it itself, one row per tax rate beside the other money lines, wherever no legal plugin is doing it. The percentage comes from the tax rate, never from its name: shops name their rates freely, and a legal statement must not depend on what someone typed into a settings field.

= 0.1.31 =
* Lite and Pro become two plugins. The withdrawal complex, the mobile sticky order bar and the ultra-compact layout move to a separate STM Smart Checkout Pro plugin, so the free plugin neither carries nor loads paid code. Lite grows the extension points that make an add-on possible instead of a fork: `stmc_settings_fields`, `stmc_admin_tab_fields`, `stmc_admin_tab_{slug}`, `stmc_layouts`, `stmc_layout_labels` and public row helpers, so both plugins speak one visual language. New `STMC_Settings::layout()` resolves the effective layout from the raw option, so a stored layout whose provider is momentarily absent degrades to its nearest relative instead of silently falling back to the default.

= 0.1.30 =
* The checkout stands on its own legally. For shops with neither Germanized nor German Market, the plugin now owns the buy-button label wherever no legal plugin sets one (§ 312j BGB) — previously a compliant label arrived only by way of WooCommerce's German translation, which is accidental compliance, not compliance. Priority 5, so anything hooking later keeps the last word, and a setting for shops with their own wording. Plus a slot for the information that must be readable in the same glance as the button, printed inside the place-order row so it travels with the button wherever the layout moves it. The settings screen now says plainly what the plugin does not cover when no legal plugin is present.

= 0.1.29 =
* Font size in pixels. The type scale had one knob expressed as a percentage of rem, which handed the real size to the theme's root font size — the same setting rendered differently on two shops. It is a pixel value now, with every step a fixed ratio of it, chosen to reproduce the previous scale exactly at the 15px default; the old percentage is migrated rather than reset. Payment rows stay one row: a gateway setting `display:block` inline on its own rows made the block-level label start a new line, stranding the radio above it — an inline-flex label sits beside the radio there and is blockified back to flex where the row is flex, so nothing changes elsewhere. No `!important` involved.

