Statable Analytics — full changelog
The readme carries only the recent entries; this file carries all of them.

= 0.34.0 =
* The two scripts the plugin still printed into the page are now enqueued files like everything else it loads. The opt-out toggle's behaviour moved to assets/js/opt-out.js, and a widget renders from an empty placeholder that an enqueued script turns into the bundle's own tag — in the same place, with the same options, so nothing about the page changes. The placeholder carries nothing but an id: the script address and the options reach the page through the enqueued script, never through the post content, so nothing that can be written into a post can name a script to load. Browsers can cache both files, and the plugin prints no script tag of its own anywhere.
* Both files also cope with two things a page can do to them: content rendered after the footer scripts have gone out (a cookie banner carrying the opt-out shortcode, say) still gets its script, and an optimizer that pulls the file into the head no longer runs it before there is a page to look at. They carry the same "leave me alone" markers for caching plugins that the tracker has carried all along.
* A shortcode or block can no longer hand the counter inside a widget bundle a different endpoint or a callback: `tracking-api` and `before-send` join the attributes a widget refuses to pass through.
* The External services section of this readme now covers the public widgets — what a page with one loads from Statable and what that request carries — which it had left out. The Widgets tab and the readme now also say precisely what the counter inside a widget bundle does: it sends the request, and Statable records nothing from it.

= 0.33.0 =
* The listing now opens with a tour of Statable, the service behind the plugin, said plainly as that — the directory turns a video URL in the readme into a player, and a still screenshot cannot show a globe turning or a map answering a hover.
* Housekeeping for the WordPress.org directory: the readme now says plainly what Statable costs and what the free tier asks in return, before anyone installs rather than after. It also lists the seven screens the directory shows — including both widgets the block can draw — and records that the plugin was tested against WordPress 7.1.
* The plugin no longer calls load_plugin_textdomain(). It ships no translations of its own — the ones it has arrive from translate.wordpress.org, which WordPress has loaded unaided since 4.6 — so the call and the Domain Path header that went with it named a directory that was never there.
* Four places where a posted value is checked further down now say so where the check would be looked for. No behaviour changes: the site id was already cast, the feature list already went through sanitize_key(), and the two JSON payloads were already parsed field by field.

= 0.32.0 =
* The site's address on Statable now comes back with the site itself, so the plugin no longer asks for a widget snippet just to read it out of the URL. That detour, its retry timer and the code behind it are gone; installs connected before the change pick the value up on their next look.
* "Tracking is switched off" now admits the exception it had. A widget bundle contains the counter, so a page showing a Statable widget keeps being counted with the switch off — when that is the case, the screen says so instead of promising silence. The Widgets tab says it too, before you add one.

= 0.31.0 =
* The privacy wording now says the visitor hash is keyed with a server-side secret, which it is on both ingest nodes. Without that key the hash would be guessable from an IP and a user-agent, so it is the part of the sentence that carries the weight — and it is only claimed now that it has been checked rather than assumed.

= 0.30.0 =
* Two sentences that were simply untrue are gone. An expiring key was said to stop tracking: it does not — the tag on your pages carries no key, so visits keep being counted and only the statistics screens here go dark. And disconnecting was said to remove the script on the next page load, which is not true behind a page cache: cached pages keep serving the old markup until the cache is purged, and the screen now says so.
* "You are excluded from tracking" is no longer stated to people who are not. The exclusion is by role and the list is editable, so the screen that explains why no data has arrived now checks first.
* The trial countdown matches statable.com. The plugin rounded up and the dashboard rounds down, so the same trial read 61 days here and 60 there for its whole length.
* What the plugin says about visitor data is exact now: the IP address and the user-agent are combined with your website's id and the current date into a hash, and neither of them is written to the analytics database — only the hash and what was derived from them.
* On the "no pageviews yet" screen, the explanation of the test sits under the buttons it describes rather than beside them.

= 0.29.0 =
* The plugin now notices when something else on your site is already counting into Statable. Two trackers on one page is not twice the data: only the first one the browser reaches runs, the other quietly counts nothing, and a site that was tracked by hand before this plugin arrived can split its history in two without a single visible symptom.
* It looks at your home page the way a visitor gets it, so it finds the tag wherever it was put — a theme template, a header-scripts field, a snippet plugin, a template part. A tag inserted by a tag manager is not in the page yet at that point, so a clean result means "nothing found", not "nothing there".
* When the other tracker belongs to a site in your account, the notice names it and offers to count into that one instead — which is the fix when the older tag is the one with the history behind it. Otherwise remove the older tag and keep this one. Widgets are never mistaken for trackers.

= 0.28.0 =
* Widgets placed with the shortcode — in the classic editor, in a page builder, or in a theme template — no longer stay invisible when nobody has opened the Widgets tab. The script URLs behind them are now cached from any of the plugin's screens, and refilled after a reconnect.
* What the plugin says about your visitors' data now matches what is actually done with it: no cookies and no persistent identifiers, the raw IP never stored, and a visitor ID that is re-derived every day. It is pseudonymous data, and calling it "no personal data" was too generous.
* The live number is labelled with the window it actually covers — the last five minutes — instead of "right now". The Realtime period continues to say thirty minutes, because that is what it reads.
* A key that Statable refuses is now reported as a refused key rather than as an unreachable service, so a single failure no longer gets two different explanations on one screen.
* Deleting the plugin now removes everything it wrote, including the index of cached reports. That index had no expiry and stayed in the database for good.
* Links to Statable fall back to your site list when the site's address there is not known yet, instead of pointing at a page that does not exist.
* Widget cards no longer stretch to match the tallest one in their row, which left a band of empty space under the shorter card's button.
* Translations bundled with the plugin now load. Only language packs from the WordPress.org directory did before, and the plugin is not in the directory yet.

= 0.27.0 =
* Connecting a site that is already in your Statable account no longer creates a second one. The plugin now looks the domain up in your account first and connects to the site it finds, whatever way the address happens to be spelled there — with a scheme, with www, with a trailing slash. Before, a site added from the dashboard and then connected from here could end up as two sites, with the counting quietly moving to the empty one while the history stayed on the old.
* When a site is adopted this way, the screen says so, because its numbers start before today.
* Links to Statable — Goals, Public widget, Import from Google Analytics, Delete this site — worked only after the first visit had been recorded and led to a "page not found" before that. They now work from the moment the site is connected, which is when most of them are needed.

= 0.26.0 =
* One place says whether this site is counting, instead of three. The Connection block described a state it had no control over, the switch that controls it sat two sections away, and the notice at the top talked about the past week regardless — so with tracking switched off the screen managed to say "Receiving data" and "not counting" at the same time.
* Switching tracking off now says so at the top of every tab, where the other states already live, with a button back to the switch. The Connection block is about the connection alone: which account, since when, which site, and how long the key has left.

= 0.25.2 =
* The connection status is now marked as well as written: a green tick when the site is counting, an amber pause when tracking is switched off. Two different marks rather than two colours, so the difference survives greyscale and colour blindness — and the words still say it outright.

= 0.25.1 =
* The Connection block now states where things stand before explaining how to end them: connected and counting, or connected with tracking switched off, and the date it was connected.
* It also shows when the access key runs out. Keys are issued for a year, and until now the first sign of one lapsing was the statistics screens going dark for no visible reason. Inside the last month it counts down in days, in red.

= 0.25.0 =
* **Disconnecting now actually stops the counting.** It removed the stored key — which stopped the statistics screens from reading anything — but left the tracking script on your pages, so a disconnected site went on sending visits to an account its administrator could no longer see. Measured before and after on a logged-out visit: the script and the event are gone now.
* The screen says what disconnecting does and, more importantly, what it does not. It is not account deletion and not data deletion: your account, this website and every visit already recorded stay exactly as they are. Widgets stay in your content and start rendering again when you reconnect. Links to where the key is revoked and where a site is really deleted are on the screen.

= 0.24.1 =
* Paste the code Statable's dashboard gives you straight into a post, and it becomes a Statable block. WordPress strips `<script>` from post content unless the author has unfiltered_html, and optimisation plugins move or combine whatever survives — so a pasted snippet often silently did nothing. Now it is caught on paste, and also converts if it has already landed as a Custom HTML block or as escaped text in a paragraph.
* Only the settings come from the pasted code. The address does not: a snippet carries whichever site the dashboard was showing, and a staging dashboard hands out a staging host — the block always points at the site this WordPress is connected to.
* Scripts that are not ours are left alone, including ones that happen to sit at a similar path on another host.

= 0.23.4 =
* "View your statistics" now wears Statable's blue. It is the one button on the screen that leads out of WordPress and into the product, so it looks like the product; every other control stays WordPress's own.

= 0.23.2 =
* "Check again" now refreshes the numbers as well as the badge above them. A report is cached for a minute like everything else here, so a brand-new site's screen of zeroes could sit under a fresh "Receiving data" — the plugin appearing to contradict itself at the exact moment someone is deciding whether it works.

= 0.23.1 =
* "Check again" now answers. Pressing it on a site that has started receiving used to remove the box the button was in, which looks exactly like a click that did nothing; the confirmation stays on screen instead, and goes quiet on the next load.
* The screen opens on Today rather than Realtime. The last thirty minutes of a normal site is a handful of visits or none, and someone opening this is asking how the site is doing rather than who is on it this second.

= 0.23.0 =
* "Connected, but no pageviews yet" — and the button that sends a test pageview — now appears above whichever tab you are on, not only on Settings. The minute after you type the code is spent on the Statistics tab looking at zeroes, and the one useful thing to do about that was hidden two tabs away.
* Once data is arriving, the confirmation goes back to being just a line on Settings. A green box above the numbers that already prove the point is noise.

= 0.22.5 =
* Nine releases were missing from this changelog. Everything between the full-list modal and the tab rows is written up below, where it should have been.

= 0.22.4 =
* The active tab's underline reaches its corners. It is drawn inside the button, so the two-pixel corner radius was clipping both ends into stubs — most visible now that the tabs are taller.

= 0.22.3 =
* The tab rows on the panels are taller. They are the heading of each box as well as its controls, and at six pixels of padding they read as a cramped strip — sitting a centimetre below the chart's header, which was half as tall again. They now match it, and each tab is a 33px target instead of a 23px one.

= 0.22.1 =
* Two panels side by side are now the same height. A short list beside a long one used to end halfway down, which read as a box cut off rather than a box with nothing more to show — and it left the two "View all" buttons on different lines. They now sit at the foot of each box, level with each other.

= 0.22.0 =
* The Status tab is gone, and what it said now opens the Settings tab. "Is it working" is a question asked once, on the day you install this, and never again — a permanent tab for it was a permanent reminder of a solved problem. Where it belongs is above the switches you reach for when the answer is no.
* Your account's email moved into the Connection block, beside the site id. The trial line it used to carry is in the page header now, on every tab.

= 0.21.3 =
* The Statable section shows the timezone and hostname only when there is something to do about them. Listing a hostname this screen cannot edit, or announcing that the timezone already matches, is a label with no verb — the question it invites is "so what", and the answer was already in the links below.

= 0.21.2 =
* Days left on your trial now sit in the top corner of every tab, turning red in the last three days, with a link to pick a plan. Nothing is shown once there is a plan: a permanent line about a settled account is furniture, not information.
* The outward-link arrows sat above the words with the link's underline running beneath them, which read as a second, broken underline. They sit on the baseline now, outside the underline.

= 0.21.1 =
* The Settings tab now shows what your tracking script actually collects, module by module, with what each one weighs — and lets you switch them off. It is the answer to "why is Engagement time zero" and to "what am I loading on every page", both of which belong next to the switch that loads it.
* It also compares your WordPress timezone against Statable's and offers to make them match. With the two set differently, every day, week and month on the Statistics tab is cut at a different hour than everything else in WordPress, and nothing used to say so.
* And it notices when this install's hostname is not on the list Statable counts — visits being silently thrown away — and offers to add it. Localhost and bare IP addresses are not offered.
* Everything else a site has on Statable is a link to it: goals, widget, GA4 import, Search Console, blocklists and deletion. A second editor for a value WordPress knows nothing about is two places to change it and one of them forgotten.

= 0.20.2 =
* The close button on the full list no longer opens ringed and link-blue. Opening the window focused its close button, which read as pressed and as the thing to click next; focus now goes to the window itself, and Tab from there still reaches the cross.

= 0.20.1 =
* The full list, behind every panel and every custom-analytics tab. A panel shows ten rows because that is what fits beside three other panels; "View all" opens the same query without that constraint — fifty rows at a time, and every metric that breakdown carries. Top pages, for instance, gains bounce rate, time on page and scroll depth.
* Where the field takes a text comparison, the full list has a search of its own, run by Statable rather than over the rows already loaded — so it searches the whole list, not the page of it you can see. Countries, regions, cities and status codes hold codes rather than words, so those have no search box.
* What it does not offer is sorting by another column, and the footer says so: Statable's API ranks a breakdown by its first metric with no way to ask otherwise, and re-sorting the fifty rows on screen would put a new order on a slice that was chosen by the old one.
* Clicking a row still filters the whole report, and closes the list, since the thing behind it just changed.
* The list is built on the browser's own dialog element, for focus trapping and Escape. Its close event turned out not to fire at all here — not on Escape, not on being closed outright — which left a dead window in the page every time one was opened; closing is now done directly rather than in response to that event.

= 0.19.0 =
* Every row now carries its share of the window — and, once you pick a comparison, how it moved against it instead. The change is measured per row against its own earlier self, wherever it happened to rank back then, which is a reading two separate top-ten lists cannot reconstruct.
* Ten rows per list, matching the dashboard.
* A seventh metric: engagement time, the part of a session someone was actually doing something. It reads zero unless your tracking script includes the engagement module, and the tile says so.
* Four more tabs: Referrers, UTM contents, UTM terms, and Errors — the status codes your pages returned.
* Filtering to a single browser turns the Browsers tab into that browser's versions, and the same for operating systems. Version numbers only mean something inside one browser, which is why they have no tab of their own.
* Three more filter fields: browser version, OS version and status code.
* Tab rows wrap instead of scrolling sideways, so a tab is never hidden past an edge nobody knows to drag.

= 0.18.2 =
* Switching a panel tab or a custom-analytics tab now replaces that one box and nothing else. It used to redraw the whole report — rebuilding a chart nobody had touched and throwing the page back to the top, which is a long way from a tab you just clicked at the bottom. Only the box being reloaded dims, too.

= 0.18.1 =
* Each custom-analytics tab now says where its numbers are made, and links there: goals and funnels are created in your Statable dashboard, custom events and their properties come from your own markup. An empty box used to leave you guessing which of the two it was waiting on.

= 0.18.0 =
* Custom analytics come to wp-admin. A fifth box under the panels carries the four things a site opts into measuring: custom events, goals with their conversion rates, custom properties, and funnels drawn step by step with what each one lost. Everything obeys the filters above it, and clicking a custom event filters the whole report the way any other row does.
* Two of those tabs need a choice of their own, so each has a picker: a property is a key *and* the event it was sent with, and a site can keep more than one funnel.
* Funnels segment by visit, not by event, so a Page or Event filter cannot apply there. Rather than refuse the whole run, the box applies the rest and names what it left out.

= 0.17.5 =
* The filter row is quieter: no "Filters" label, a bare + once there are chips to explain themselves, and "Clear all" as plain text rather than a third button competing for attention. Each chip now reads field and comparison in grey with the value in bold, so a row of them scans at a glance.

= 0.17.4 =
* Clicking a row no longer leaves the "Add filter" button looking pressed. Focus follows the keyboard now, and stays out of the way of the mouse.
* The panel headings no longer show a drag cursor. They are not draggable; WordPress styles that class as a metabox handle, and this screen has no metaboxes to drag.

= 0.17.3 =
* Flags next to countries and icons next to devices. Neither downloads anything: a flag is built from the country's own two-letter code, and the device icons are the ones WordPress already ships. On Windows, which has no flag glyphs, the code shows as two letters instead.

= 0.17.2 =
* The panels sit where the Statable dashboard puts them: sources beside pages, browsers beside locations. They had been swapped, so reading the two screens side by side meant hunting for the same box in the opposite corner.

= 0.17.1 =
* Filters that a field cannot take are now dropped rather than rewritten. A bookmarked "country is not Netherlands" used to come back as "country is Netherlands" — the exact opposite of what the link asked for.
* Events accept one value and one comparison, which is all Statable's API allows for them; asking for more no longer blanks the screen.
* Long values work. Click-tracking referrers run past a kilobyte and the API accepts them, but the plugin was silently discarding anything over 255 characters — the filter simply never appeared. Values are also no longer mangled: percent signs in a referrer survive.
* Requests carry the filters in the body instead of the address, so a handful of long values cannot overrun the request-line limit and turn a report into a 414.
* The panel survives the Realtime auto-refresh instead of vanishing mid-choice, stays usable while the report reloads, and hands focus back to the button when it closes.
* Comma in a value, or one value too many: the panel now says why instead of quietly refusing.

= 0.17.0 =
* A real filter, the one the Statable dashboard has: pick any of nineteen fields — pages, entry and exit pages, hostnames, sources, channels, all five UTM parameters, countries, regions, cities, devices, browsers, operating systems, events — choose how it should match, and pick from the values your site actually recorded.
* Four comparisons: is, is not, contains, does not contain. Text comparisons are not offered for countries, regions and cities, whose values are codes rather than names — asking whether a code contains "nether" could only ever match nothing.
* One filter can hold several values, which are OR-ed: Country is Singapore or India. Clicking a second row of the same list adds to that filter rather than starting a contradictory second one.
* Rows that have no value behind them are no longer clickable. "Direct" is this screen's word for a visit with no referrer; the API stores nothing there, so filtering on the word found nothing at all.

= 0.16.5 =
* Two panels to a row instead of four. Every tab now fits — the sources box no longer hides "UTM campaigns" behind a sideways scroll — and the tables have room for long page paths.

= 0.16.4 =
* The dates being shown moved to the right-hand end of the tab row, which was empty. Filters and the period controls now share one line instead of taking two.

= 0.16.3 =
* Yesterday — and any earlier single day you step back to — now charts by the hour instead of a single flat dot.

= 0.16.2 =
* Changing a metric or a panel's tab is now about a second instead of five: only the part that changed is fetched, rather than the whole report.
* The screen no longer blanks while it loads. What you were reading stays, dimmed, until its replacement arrives.
* Picking "Custom" no longer throws away the window you were looking at. It fills the dates with that window and waits — and you can leave without applying anything. Changing the end date, or pressing Enter, applies it.

= 0.16.1 =
* The period, the comparison and the arrows now sit together at the top right, the way they do on the Statable dashboard, with the dates and the live count on the left. The chart's header keeps only the grouping picker.

= 0.16.0 =
* Every window the Statable dashboard offers is here: Realtime, Today, Yesterday, the last 7, 30 or 90 days, month to date, last month, year to date, the last 12 months, and any custom range. Step back through earlier windows with the arrows.
* Single days chart by the hour; longer windows by day, week or month, whichever suits them.
* Realtime refreshes itself, by the minute, without blanking the screen.
* Each panel carries the dashboard's tabs: pages / entry pages / exit pages / hostnames, sources / channels / UTM source, medium and campaign, countries / regions / cities, devices / browsers / operating systems.
* Compare against the previous period or the same period a year earlier — and for a single day, the same day last week.
* "All time" is not offered: Statable's API answers at most 366 days, and a button that quietly showed a year instead would be worse than no button.

= 0.15.1 =
* The previous period is now a choice, not a fixture: the chart draws one line until you tick Compare, which is how the Statable dashboard has always behaved. The percentages on the metric tiles are unaffected — those compare whether or not the chart does.

= 0.15.0 =
* The chart is the dashboard's chart now: an area line with gridlines, an optional dashed line for the previous period, and a readout that names the bucket under your pointer.
* Every metric tile is a button — click Sessions, Bounce rate or any other and the chart redraws to it. Views per session joins the row, and the tiles use the dashboard's own wording (Sessions, Session duration) instead of the API's field names.
* Group the chart by hours, days or weeks, with the sizes that suit the window you are looking at.
* Click any row — a page, a source, a country, a device — to narrow the whole screen to it. Filters show as chips you can drop one at a time, and travel in the URL, so a filtered view can be reloaded or shared.

= 0.14.0 =
* Your statistics now live in wp-admin, on a new Statistics tab: visitors, pageviews, visits, bounce rate and visit duration, each against the previous period, a chart of your daily visitors, and your top pages, sources, countries and devices — over the last 7 days, 30 days, or this month.
* Top pages now show visitors and pageviews side by side, ranked by visitors — the order Statable's API actually returns.
* Drawn by the plugin from Statable's API rather than embedded from the dashboard. An embedded dashboard is what an ad blocker blanks, and what WordPress asks plugins not to do; this screen is ordinary WordPress markup and keeps working.
* The API key never reaches your browser: the page asks WordPress, WordPress asks Statable.

= 0.13.6 =
* "View your statistics" is now a page-title action next to the heading — one click from any tab, the way core places "Add New". It used to hide inside one sentence of the Status notice; that inline copy is gone.

= 0.13.5 =
* The footer names both versions — "Statable Analytics x.y.z · WordPress a.b.c" — instead of leaving core's bare "Version" next to ours to be misread.

= 0.13.4 =
* The plugin version now shows in the footer of the Statable screens, next to the WordPress version — the first thing support asks for, visible right where you already are. The rest of wp-admin keeps its normal footer.

= 0.13.3 =
* Removed the "Customize on Statable" link from the widget cards. The dashboard's customizer only generates embed code — nothing it saves would reach a widget already placed here, so the link promised a flow that does not exist. Customization lives in the block sidebar, with a live preview; code generated on the dashboard still pastes into the block's panel.

= 0.13.2 =
* Dropped the editor-preview resize workaround for the globe shadow: the widget itself now anchors the shadow inside its own box (fixed at the source and rolled out), so the preview needs no nudging.

= 0.13.1 =
* The globe's under-shadow no longer strands itself below the block in the editor preview. The widget measures its shadow position once, before the editor canvas settles; the preview now nudges it to re-measure after layout stops moving.

= 0.13.0 =
* The globe's "Shadow under globe" switch no longer flattens the whole globe. The dashboard couples the under-globe shadow with the surface lighting in one switch; the block now offers them honestly as two controls — a "Globe surface lighting" toggle and a "Shadow under globe" choice of None, Soft or Strong (Soft was never reachable from the dashboard at all).

= 0.12.3 =
* Opening "How to add it" no longer pushes the "Customize on Statable" link outside the card.

= 0.12.2 =
* The Widgets tab instructions caught up with the block: customization now lives in the block sidebar with a live preview, dashboard code pastes into the block's own panel (not a Custom HTML block), and the shortcode line shows how attributes carry customization.

= 0.12.1 =
* Hardened the new customization after an adversarial review: the live preview recovers from a failed load via Reload, size fields cannot orphan each other, numbers clamp to their allowed range, colors compare case-insensitively, pasted snippets accept single quotes and querystrings and report when they are not widget code, shortcode-to-block conversion now carries all customization attributes, and the live-users country list can no longer silently vanish from the published page.
* Correct globe default size (400x400).

= 0.12.0 =
* The block customizes the widget right in the editor: theme, colors, time range, size and every other knob the Statable dashboard offers — the controls are generated from the same schemas, so the two cannot drift apart.
* The editor preview is now the live widget with your site's real data, re-rendering as you change settings, with the bundled artwork as an offline fallback.
* Paste the code generated on the Statable dashboard into the block's "Paste code from Statable" panel and it becomes a fully configured block.
* The shortcode passes customization through: [statable_widget type="globe" theme="dark"] renders data-theme="dark".

= 0.11.0 =
* The Status tab now says how much of your trial is left, with a link to pick a plan — and warns when the trial has ended. Requires the current Statable API; the line simply stays hidden against an older one.
* The "How to add it" instructions now explain the customization flow honestly: a look configured on Statable travels inside the code Statable generates, so it goes into a Custom HTML block — the Statable block and the shortcode render the default look.

= 0.10.3 =
* "Customize on Statable" sits on the same row as the button now, aligned to its middle, instead of dangling under it.

= 0.10.2 =
* Dropped "Use as default" from the widget cards. There is no site-wide default to manage — widgets are placed one by one — so the button now answers the question people actually have: "How to add it", with the block steps and a ready-to-paste typed shortcode for that exact widget.
* The widget grid is a 2×2 now instead of three-and-a-straggler.
* A default chosen in earlier versions is still honored by a bare [statable_widget].

= 0.10.1 =
* Widget cards now show the same preview artwork as the Statable dashboard instead of embedding the live widgets. Live embeds needed the network, the site's data and luck; the previews need none of it, and the tab no longer greets you with "could not load".

= 0.10.0 =
* The screen is now three tabs. Status answers "is it working" and nothing else. Widgets is a showroom: every widget renders live, with your site's real data, right in wp-admin — pick a default there if the shortcode should have one. Settings is unchanged.
* Choosing a widget stopped looking mandatory. It never was: statistics work without one, and the page finally says so.
* Each widget card links to its appearance settings on your Statable dashboard — placement lives in WordPress, looks live on Statable.

= 0.9.2 =
* "Statable dashboard" in the widget picker is now a link to your dashboard, with the external-link icon — it says where the statistics live, so now it takes you there.
* Option descriptions moved out of their labels, so clicking a link in a description no longer flips the radio button above it.

= 0.9.1 =
* Removed the duplicate green notice after connecting. The Setup screen's status box already says whether data is arriving, so "Connected" no longer appears a second time above the tabs.

= 0.9.0 =
* Added the Statable block. Press + in the editor, search for "statable", and pick the widget right where it will appear — nothing to copy. The shortcode keeps working everywhere it did.
* Each block chooses its own widget in the sidebar, so different pages can show different widgets without remembering attributes.
* Pasting an existing `[statable_widget]` shortcode into the block editor converts it into the block automatically.
* Setup screen: the block is now the featured way to place a widget; the shortcode moved to a quiet fallback line and no longer stretches an input across the whole screen.

= 0.8.3 =
* Tidied the status line: the link now sits on the same line as the message, and the external-link icon is no longer caught under the underline.

= 0.8.2 =
* "View your statistics" is now a link with the external-link icon, not a button — it leaves WordPress, and it should look like it does.

= 0.8.1 =
* Added "View your statistics" — it opens this site directly, not the site list.

= 0.8.0 =
* The Setup screen now says whether data is actually arriving: "Receiving data" with the pageview count, or "Connected, but no pageviews yet".
* Added "Send a test pageview" — your own visits are excluded from tracking, so there was no way to see the counter work from the browser you are signed in to. This counts one visit on purpose.
* An unreachable API is now distinguishable from an empty site, and both are distinguishable from a key that no longer works.

= 0.7.2 =
* The "put it in your footer" link now matches your theme. Block themes have no sidebars, so it points at the Site Editor instead of the Widgets screen, which for them is empty.

= 0.7.1 =
* Fixed a dead end in Setup: picking a widget did nothing unless you also switched a separate "mode" radio, which was easy to miss. There is now one list — None, or the widget you want — and the shortcode appears as soon as you save.

= 0.7.0 =
* Widgets work. Pick one in Setup and place it with the `[statable_widget]` shortcode — a map, a globe, top countries or live users, wherever you want it on the page.
* Pass a type to show a different widget on one page: `[statable_widget type="globe"]`.

= 0.6.0 =
* Split the screen into two tabs. Setup asks the question that matters first — should visitors see anything, or should the counter stay invisible — and Settings holds the rest.
* Widget choice is there but not yet selectable: it needs one piece of data the API does not return yet. The hidden counter works normally meanwhile.

= 0.5.1 =
* The two secondary actions on the code step are now a single quiet line of links under the main button, in the style WordPress uses elsewhere, instead of a stray button.

= 0.5.0 =
* Added "Send a new code" on the verification step. If the email does not arrive there is now a way forward that is not retyping your address.
* When you ask too soon, the message says how long to wait rather than "try again later".

= 0.4.2 =
* Rewrote the setup screens to explain what is happening and why. The button now says what you get, not what the software does, and the code step explains that it replaces a password.

= 0.4.1 =
* Reverted the custom connect screen. The plugin now uses WordPress's own admin markup again and ships no stylesheet at all — it should look like part of your dashboard, not like a widget dropped into it.

= 0.4.0 =
* Redesigned the connect screen: a proper card with the Statable mark, a two-step indicator, and brand styling instead of the default settings table.

= 0.3.1 =
* The Terms and Privacy Policy links now always point at statable.com, even when the plugin is configured against another host. You should never be asked to accept an agreement published somewhere else.

= 0.3.0 =
* Removed the Plan type switch, the Site hash field and the Hobby widget picker. None of them matched what the dashboard actually offers: the plan is decided when the site is created, and a widget has to sit where you put it on the page, not in the tracker settings.
* Site ID is now shown as read-only information, since nothing needs to be pasted anymore.

= 0.2.1 =
* The admin menu now carries the Statable mark instead of a generic chart icon.

= 0.2.0 =
* Set-up now happens entirely in wp-admin: enter your email, type the code, and your account and site are created for you.
* No more copying a Site ID between tabs.
* Added a Disconnect button that removes the stored key from your database.

= 0.1.0 =
* Initial release: tracking-script injection, admin/role exclusion, settings page.
* Visitor opt-out via the `[statable_opt_out]` shortcode (localStorage).
* Caching/optimization-plugin skip markers on the tracker tag.
