=== OT Vercel ===
Contributors: michaelskweres
Tags: headless, vercel, netlify, rest-api, preview
Requires at least: 6.4
Tested up to: 6.8
Requires PHP: 8.1
Stable tag: 0.3.18
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Headless control plane: WordPress as CMS for apps on Vercel or Netlify.

== Description ==

OT Vercel connects WordPress to a frontend hosted on Vercel or Netlify. It provides a snapshot API for builds, signed webhooks for on-demand revalidation, CORS allowlisting, a preview handshake for drafts, and in-plugin Vercel/Netlify connection (encrypted personal access tokens — no OAuth client_secret in the zip).

Live content continues to use the WordPress REST API (`/wp/v2`). This plugin does not replace GraphQL or Faust.

== Changelog ==

= 0.3.18 =
* Deliveries admin UI now uses cohesive OT Vercel styling: a dedicated filter toolbar card, clearer spacing, and responsive control alignment.
* Destructive clear actions are grouped in a distinct danger panel with stronger visual hierarchy, while keeping the same checkbox + `DELETE` + confirm dialog safety flow.
* Accessibility polish: clearer labels, grouped controls, and consistent focus behavior using existing Fluent OT form/button tokens.

= 0.3.17 =
* Deliveries now support status filtering (`all`, `pending`, `processing`, `delivered`, `failed`) via server-side REST query and UI selector.
* Added guarded clear actions: clear filtered status rows or clear all rows, both requiring explicit arming, typed `DELETE`, and final confirmation.
* Added backend and controller regression tests for filtering and purge flow while keeping Actions behavior unchanged (Copy ID, Copy URL redacted, Retry on failed).

= 0.3.15 =
* PHPCS `WordPress-Docs` docblocks now generate minimal `@param`/`@return` tags from PHP signatures (no narrative prose).

= 0.3.14 =
* Auto-link confirms are per Production / Staging inside each host column. A production tick no longer covers staging.

= 0.3.13 =
* After generating a webhook secret or Application Password, keyboard focus moves to the copy-once region (Save/Test still focus the notice).

= 0.3.12 =
* Getting started nav stays valid after setup completes. Section nav no longer rebinds on every keystroke. Wizard uses the Getting started card heading.

= 0.3.11 =
* Connection primary layout is Connect Vercel | Connect Netlify again (one host per column). Production/Staging pickers, auto-link, and apply URL/env live on that host card. Shared Targets / WordPress API / CORS sit below. Section nav unchanged in spirit (Getting started · Vercel · Netlify · Targets · WordPress API · CORS).

= 0.3.10 =
* Connection: sticky section nav (OT Cache style) + 2-column grids — Accounts (Vercel | Netlify), Production/Staging (link | apply/test), Snapshot (settings | curl). Stacks on mobile.

= 0.3.9 =
* Connection settings are grouped into Accounts, Production, Staging, WordPress API, and CORS cards. Production and Staging are stacked environments, not mixed fields.

= 0.3.8 =
* Overlapping cron runners cannot POST the same delivery: atomic claim (UPDATE … WHERE id and due status) returns affected rows. UNIQUE fingerprint on deliveries does not block retries of the same row. HMAC still signed at send time.

= 0.3.7 =
* After a project/site is linked, Connection can set the revalidate URL and write server env on demand. Confirm before secrets. WORDPRESS_AUTH only if generated this session. Route Handler file still lives in the frontend Git repo.

= 0.3.6 =
* dbDelta only on activate/upgrade or missing tables, not on every page load. Dispatcher locks deliveries while POSTing and reclaims stale processing rows after 5 minutes. Partial options-import no longer duplicates deliveries.

= 0.3.5 =
* Deliveries and preview tokens persist only in custom wpdb tables. One-time import from leftover options; options are not deleted if the table is missing.

= 0.3.4 =
* After connect, Vercel projects and Netlify sites load automatically. Empty state only when the API returns an empty list; 401/403/404 show the HTTP error. Team-scoped tokens send stored teamId on list.

= 0.3.3 =
* Native HMAC cursor paging for terms, menus, and public authors. Backfill _ot_vercel_modified_gmt on activate/upgrade. Admin submenu highlight (Snapshot, Deliveries, Help, About).

= 0.3.2 =
* languages/ot-vercel.pot. GitHub Actions composer verify. Native HMAC cursor paging for posts and media (no 200-row cap).

= 0.3.1 =
* WPCS + PHPStan + composer verify. Menu webhooks (menu.updated / menu.deleted) with the same HMAC as posts.

= 0.3.0 =
* Snapshot kinds: terms, menus, public author fields, media URLs. Taxonomy webhooks. Public CPT checklist.

= 0.2.5 =
* Editor Preview bounce, wpdb preview tokens, staging env targets, first-run WORDPRESS_AUTH wizard.

= 0.2.4 =
* Connection test 404/405 vs HMAC; Nextra revalidate recipe.

= 0.2.2 =
* Vercel team/project tokens connect without GET /v2/user; no raw “User not found.”

= 0.2.1 =
* First-run wizard, team/account picker, HMAC created on auto-link, wpdb delivery queue, snapshot rate-limit window, Vercel teamId.

= 0.2.0 =
* Connect Vercel and Netlify from WordPress with an encrypted personal access token, list apps/sites, and auto-link production/staging (origin, CORS, hooks).

= 0.1.2 =
* Family Fluent admin UI, guided Connection/Snapshot/Deliveries, Help recipes from current Vercel and Netlify docs.

= 0.1.1 =
* Webhook queue, preview handshake, React admin, OT-VERCEL licensing, Callhome, Application Password helper, installable zip in backup/.

= 0.1.0 =
* Initial release: control plane, snapshot API, HMAC webhooks, preview handshake.
