From 5d944aa96ae7b82c054535a5121d886608860e3c Mon Sep 17 00:00:00 2001 From: prismiwi2015 Date: Sun, 16 Aug 2026 01:44:54 +0200 Subject: [PATCH 1/2] Add an analytics window, and the demo data that made it possible to build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Analytics are impossible to build against an empty database and misleading to build against a handful of test rows. Five submissions make every chart look fine: no long tail, no skew, no segment small enough to be noisy, no date range wide enough to need a scale. The first honest look at a report is the moment somebody points it at a real form with four hundred responses, which is much too late to find out the bar chart cannot cope with a label longer than twelve characters. So this is two things, and the order matters: a generator that produces a survey and five hundred people who answered it, and a report built against that rather than against wishful thinking. ## The demo data A team pulse survey — seven questions chosen for what they make possible downstream rather than for what a pulse survey would ideally ask. Two categorical dimensions to group by, a 0–10 recommendation score, a 1–5 rating, a lumpy small integer, a multi-select whose percentages deliberately sum past 100, and an optional free-text box answered by well under half. Every submission goes through `atf_process_submission()` — the same function a stranger's POST reaches. Sanitising, validation, spam screening, storage, the counters and `atf_entry_created` all run exactly as in production, and the request carries a properly signed timestamp rather than being waved past the time trap. A seeder that wrote rows directly would produce data the pipeline could never have produced, and the first thing that would hide is a bug in the pipeline. The population is not random, because random answers produce flat charts — every question at 1/n, every segment identical, every correlation zero, which looks like a working report and proves nothing. Each respondent gets a latent morale that depends on their team and tenure, and their answers follow from it. Support really is unhappier than Design (NPS -51 against +52), satisfaction really does track the recommendation score, and people really do write comments at the extremes and not in the middle. It is reproducible from a seed, and it comes back out: the form and every entry are tagged, and removal deletes exactly what carries the tag. Never "everything on the demo form" — that form has a working shortcode, so somebody will eventually answer it for real, and there is a test that says their answer survives. ## Developer mode All of it is gated on OpenStation's own per-user Developer mode switch, read rather than duplicated. It writes hundreds of entries into whatever database this happens to be, which is fine on a laptop and not something to leave one hover away from "Themes" on a site collecting real enquiries. The preference is not the permission. It answers "show me these"; the capability answers "you may use them"; both are checked on every route. Treating a user-meta preference as authorisation would mean anybody who can write their own meta could seed a database. ## The report Headline counts, submissions per day, a tally or a distribution per question, NPS for any 0–10 question, and a cross-tab of every numeric answer by any categorical one — which is the difference between "the average is 7.5" and "Support is at 5.8 and everyone else is above 7". Three things that look fine when wrong, so each has a test: - A timeline includes its empty days. Keep only the days that had a submission and the gaps close up, so one spike and three weeks of silence renders as a steady trickle. - NPS is not an average. Promoters minus detractors, as percentages, with the passives counting for nothing. Six sevens and eights average to a healthy-looking 7.5 and are an NPS of exactly zero. - A mean needs its distribution. Everybody answering 3, and half answering 1 with half answering 5, are opposite findings with the same mean. No charting library. Every chart is ordinary elements sized in percentages — a bar chart *is* a list of labelled quantities, and as a list it can be read aloud, selected and searched, which a painted canvas cannot without being described all over again. ## Found while building it - Fifty submissions in one request exhausted a 128MB limit, failing as a bare 500 with the entries already written. WordPress adds every post it touches to the object cache and nothing evicts it, and under WP_DEBUG `$wpdb` keeps every query with a backtrace. Both are now freed per chunk, and a failed chunk is retried rather than abandoning the batch. - The window's own token block listed three roots and not the new fourth, so every `var( --atfb-* )` in the report was invalid. That does not fail loudly: the declaration is simply dropped, and a chart of coloured bars renders as a blank rectangle. - The survey put `notifications` under `settings`, where nothing reads it. Harmless by luck — the default is empty — but the test asserting "no notifications" was passing against a key nothing uses, and would have gone on passing after somebody added one in the right place. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_0119U4sRRWGcTQdwYreTwpAp --- .github/media/analytics.png | Bin 0 -> 176252 bytes README.md | 13 +- allterrain-forms.php | 2 + assets/css/analytics.css | 461 ++++++++++++++ assets/css/builder.css | 7 +- assets/js/analytics.js | 840 ++++++++++++++++++++++++++ assets/js/analytics.min.js | 1 + assets/js/builder.js | 15 +- assets/js/builder.min.js | 6 +- assets/js/dock.js | 20 + assets/js/dock.min.js | 2 +- assets/js/entries.js | 15 +- assets/js/entries.min.js | 2 +- assets/js/widget.js | 15 +- assets/js/widget.min.js | 2 +- docs/architecture.md | 52 +- docs/hooks-reference.md | 52 ++ docs/javascript.md | 13 + includes/analytics.php | 502 ++++++++++++++-- includes/assets.php | 20 + includes/demo-data.php | 968 ++++++++++++++++++++++++++++++ includes/dev-mode.php | 86 +++ includes/openstation.php | 45 ++ includes/rest.php | 120 +++- package.json | 3 +- readme.txt | 4 +- src/analytics.ts | 752 +++++++++++++++++++++++ src/api.ts | 39 +- src/dock.ts | 35 ++ src/types.ts | 88 +++ tests/phpunit/tests/analytics.php | 442 ++++++++++++++ tests/phpunit/tests/demoData.php | 450 ++++++++++++++ tests/vitest/dock.test.ts | 120 ++++ vite.config.js | 5 + 34 files changed, 5126 insertions(+), 71 deletions(-) create mode 100644 .github/media/analytics.png create mode 100644 assets/css/analytics.css create mode 100644 assets/js/analytics.js create mode 100644 assets/js/analytics.min.js create mode 100644 includes/demo-data.php create mode 100644 includes/dev-mode.php create mode 100644 src/analytics.ts create mode 100644 tests/phpunit/tests/analytics.php create mode 100644 tests/phpunit/tests/demoData.php create mode 100644 tests/vitest/dock.test.ts diff --git a/.github/media/analytics.png b/.github/media/analytics.png new file mode 100644 index 0000000000000000000000000000000000000000..4c479abe368c832a9d881ac05c7a915778581ca0 GIT binary patch literal 176252 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 Ps|C;9Uas7ohtB^EqFVr| literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 2301eed..3ff9a43 100644 --- a/README.md +++ b/README.md @@ -216,12 +216,19 @@ register a user, or write user meta — each with a capability ceiling that a fo author cannot raise. **Managing** — an entries table with search, filters and star; a detail view; -bulk read/spam/trash; CSV export with formula injection defused; per-form -analytics (views, starts, submissions, conversion, per-field drop-off); survey -and quiz reporting. +bulk read/spam/trash; CSV export with formula injection defused; survey and quiz +reporting. + +**Reporting** — an analytics window with views, starts, conversion and completion; +submissions per day; a tally or a distribution per question; Net Promoter Score +for any 0–10 question; and a cross-tab that breaks every numeric answer down by +any categorical one — which is the difference between "the average score is 7.5" +and "Support scores 5.8 and everyone else is above 7". ![The entries window: submissions on the left, one submission's answers on the right](.github/media/entries.png) +![The analytics window: headline counts, submissions per day, a Net Promoter Score, and every answer broken down by team](.github/media/analytics.png) + **Privacy** — a retention policy that deletes automatically, IP anonymisation, and integration with WordPress's own export and erase tools so a subject access request reaches form submissions without anybody having to remember they are a diff --git a/allterrain-forms.php b/allterrain-forms.php index 6f78c08..1700e16 100644 --- a/allterrain-forms.php +++ b/allterrain-forms.php @@ -151,6 +151,8 @@ require_once ATF_DIR . 'includes/actions.php'; require_once ATF_DIR . 'includes/entries.php'; require_once ATF_DIR . 'includes/analytics.php'; +require_once ATF_DIR . 'includes/dev-mode.php'; +require_once ATF_DIR . 'includes/demo-data.php'; require_once ATF_DIR . 'includes/templates.php'; require_once ATF_DIR . 'includes/rest.php'; require_once ATF_DIR . 'includes/preview.php'; diff --git a/assets/css/analytics.css b/assets/css/analytics.css new file mode 100644 index 0000000..559e2f0 --- /dev/null +++ b/assets/css/analytics.css @@ -0,0 +1,461 @@ +/** + * The analytics window. + * + * Depends on `builder.css`, which is where the `--atfb-*` tokens are defined + * against the shell's own palette. Nothing here invents a colour: a report that + * looked right in the light theme and unreadable in the dark one would be a + * report nobody trusts, and the shell already answers that question. + * + * The charts are ordinary elements. A bar is a `div` whose width is a + * percentage, a histogram column is a `div` whose height is one — so resizing + * the window is a reflow rather than a redraw, and every label in every chart is + * real text that can be read aloud, selected and searched. + */ + +.atfa { + display: flex; + flex-direction: column; + block-size: 100%; + background: var( --atfb-bg ); + color: var( --atfb-fg ); + font-size: 13px; +} + +.atfa__bar { + display: flex; + align-items: center; + gap: 10px; + padding: 10px 14px; + border-block-end: 1px solid var( --atfb-border ); + background: var( --atfb-surface ); + flex: 0 0 auto; +} + +.atfa__bar-label { + color: var( --atfb-muted ); + font-size: 12px; +} + +.atfa__body { + flex: 1 1 auto; + overflow-y: auto; + padding: 16px; + display: flex; + flex-direction: column; + gap: 16px; +} + +.atfa__empty { + margin: 0; + padding: 32px 16px; + color: var( --atfb-muted ); + text-align: center; +} + +/* --- Headline numbers ----------------------------------------------------- */ + +.atfa-kpis { + display: grid; + /* Wraps by itself. Six fixed columns would be six unreadable slivers in a + window somebody has dragged narrow, which is a thing people do to put a + report beside the form it is about. */ + grid-template-columns: repeat( auto-fit, minmax( 130px, 1fr ) ); + gap: 10px; +} + +.atfa-kpi { + display: flex; + flex-direction: column; + gap: 2px; + padding: 12px 14px; + border: 1px solid var( --atfb-border ); + border-radius: 8px; + background: var( --atfb-surface ); +} + +.atfa-kpi__value { + font-size: 24px; + font-weight: 600; + line-height: 1.1; + /* Tabular figures, so a number ticking up during a demo-data run does not + shuffle the label underneath it. */ + font-variant-numeric: tabular-nums; +} + +.atfa-kpi__label { + color: var( --atfb-muted ); + font-size: 12px; +} + +.atfa-kpi__hint { + color: var( --atfb-faint ); + font-size: 11px; +} + +/* --- Panels --------------------------------------------------------------- */ + +.atfa-panel { + padding: 14px 16px 16px; + border: 1px solid var( --atfb-border ); + border-radius: 8px; + background: var( --atfb-surface ); +} + +.atfa-panel__head { + margin-block-end: 12px; +} + +.atfa-panel__title { + margin: 0; + font-size: 13px; + font-weight: 600; +} + +.atfa-panel__note { + margin: 2px 0 0; + color: var( --atfb-muted ); + font-size: 12px; +} + +/* --- Timeline ------------------------------------------------------------- */ + +.atfa-timeline { + display: flex; + align-items: flex-end; + gap: 1px; + block-size: 120px; + padding-block-end: 2px; + border-block-end: 1px solid var( --atfb-border ); +} + +.atfa-timeline__day { + flex: 1 1 0; + min-inline-size: 2px; + background: var( --atfb-accent ); + border-radius: 2px 2px 0 0; + transition: background-color 120ms ease; +} + +.atfa-timeline__day:hover { + background: var( --atfb-accent-strong ); +} + +/* A day with no submissions still occupies its column. Collapsing it would let + a quiet fortnight close up, and a chart that hides the gaps shows a steady + trickle where the truth was one spike and three weeks of silence. */ +.atfa-timeline__day.is-empty { + background: var( --atfb-border ); + block-size: 2px; +} + +.atfa-timeline__axis { + display: flex; + justify-content: space-between; + margin-block-start: 4px; + color: var( --atfb-faint ); + font-size: 11px; +} + +/* --- Net Promoter Score --------------------------------------------------- */ + +.atfa-nps { + display: flex; + align-items: center; + gap: 20px; + flex-wrap: wrap; +} + +.atfa-nps__score { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-inline-size: 104px; + padding: 12px 16px; + border-radius: 8px; + background: var( --atfb-well ); +} + +.atfa-nps__number { + font-size: 34px; + font-weight: 700; + line-height: 1; + font-variant-numeric: tabular-nums; +} + +.atfa-nps__caption { + margin-block-start: 2px; + color: var( --atfb-muted ); + font-size: 11px; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +/* The three verdicts. Not a red-to-green ramp: the difference between -5 and +5 + is a rounding error in a survey of five hundred people, and colouring them as + opposites would invent a finding. */ +.atfa-nps__score.is-poor .atfa-nps__number { + color: #b32d2e; +} + +.atfa-nps__score.is-ok .atfa-nps__number { + color: var( --atfb-fg ); +} + +.atfa-nps__score.is-great .atfa-nps__number { + color: #007017; +} + +.atfa-nps__detail { + flex: 1 1 260px; +} + +.atfa-nps__bar { + display: flex; + block-size: 22px; + border-radius: 4px; + overflow: hidden; + background: var( --atfb-well ); +} + +.atfa-nps__band.is-detractors { + background: #d63638; +} + +.atfa-nps__band.is-passives { + background: var( --atfb-border-strong ); +} + +.atfa-nps__band.is-promoters { + background: #008a20; +} + +.atfa-nps__legend { + display: flex; + flex-wrap: wrap; + gap: 14px; + margin-block-start: 8px; + font-size: 12px; +} + +.atfa-nps__key { + display: inline-flex; + align-items: baseline; + gap: 4px; +} + +.atfa-nps__key::before { + content: ""; + inline-size: 9px; + block-size: 9px; + border-radius: 2px; + align-self: center; +} + +.atfa-nps__key.is-detractors::before { + background: #d63638; +} + +.atfa-nps__key.is-passives::before { + background: var( --atfb-border-strong ); +} + +.atfa-nps__key.is-promoters::before { + background: #008a20; +} + +.atfa-nps__key small { + color: var( --atfb-faint ); +} + +/* --- Bars, shared by the tallies and the cross-tab ------------------------ */ + +.atfa-meter { + block-size: 8px; + border-radius: 999px; + background: var( --atfb-well ); + overflow: hidden; +} + +.atfa-meter__fill { + block-size: 100%; + background: var( --atfb-accent ); + border-radius: inherit; +} + +.atfa-meter__value { + display: inline-block; + margin-block-start: 3px; + color: var( --atfb-muted ); + font-size: 11px; + font-variant-numeric: tabular-nums; +} + +.atfa-bars { + margin: 0; + padding: 0; + list-style: none; + display: flex; + flex-direction: column; + gap: 8px; +} + +.atfa-bars__row { + display: grid; + /* The label column is fixed so every bar in a question starts at the same + place — ragged bar starts make two options impossible to compare, which is + the only thing a tally is for. */ + grid-template-columns: minmax( 90px, 200px ) 1fr auto; + align-items: center; + gap: 10px; +} + +.atfa-bars__label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.atfa-bars__value { + color: var( --atfb-muted ); + font-size: 11px; + font-variant-numeric: tabular-nums; + white-space: pre; +} + +/* --- Distribution --------------------------------------------------------- */ + +.atfa-hist { + display: flex; + align-items: flex-end; + gap: 6px; + block-size: 150px; +} + +.atfa-hist__col { + flex: 1 1 0; + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: center; + block-size: 100%; + gap: 3px; +} + +.atfa-hist__bar { + inline-size: 100%; + background: var( --atfb-accent ); + border-radius: 3px 3px 0 0; + min-block-size: 2px; +} + +/* The bar the mean falls in. Marked because the interesting case is the one + where the mean lands somewhere almost nobody actually answered. */ +.atfa-hist__col.is-mean .atfa-hist__bar { + background: var( --atfb-accent-strong ); + outline: 2px solid var( --atfb-accent-line ); + outline-offset: 1px; +} + +.atfa-hist__count, +.atfa-hist__tick { + font-size: 11px; + font-variant-numeric: tabular-nums; + color: var( --atfb-muted ); +} + +.atfa-hist__tick { + color: var( --atfb-faint ); +} + +/* --- The cross-tab -------------------------------------------------------- */ + +.atfa-table { + inline-size: 100%; + border-collapse: collapse; + font-size: 12px; +} + +.atfa-table th, +.atfa-table td { + padding: 8px 10px; + text-align: start; + vertical-align: middle; + border-block-end: 1px solid var( --atfb-border ); +} + +.atfa-table thead th { + color: var( --atfb-muted ); + font-weight: 500; + white-space: nowrap; +} + +.atfa-table__label { + font-weight: 600; +} + +.atfa-table__count { + color: var( --atfb-muted ); + font-variant-numeric: tabular-nums; +} + +.atfa-table tbody tr:last-child th, +.atfa-table tbody tr:last-child td { + border-block-end: 0; +} + +.atfa-questions { + display: flex; + flex-direction: column; + gap: 16px; +} + +.atfa-question__note { + margin: 0; + color: var( --atfb-muted ); +} + +/* --- The developer panel -------------------------------------------------- */ + +/* Visibly not part of the report. It writes several hundred entries into + whatever database this happens to be, and it should never be mistaken for one + more panel of numbers. */ +.atfa-demo { + padding: 14px 16px 16px; + border: 1px dashed var( --atfb-border-strong ); + border-radius: 8px; + background: var( --atfb-well ); +} + +.atfa-demo__title { + margin: 0 0 4px; + font-size: 12px; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var( --atfb-muted ); +} + +.atfa-demo__note { + margin: 0 0 10px; + max-inline-size: 70ch; + color: var( --atfb-muted ); + font-size: 12px; +} + +.atfa-demo__status { + margin: 0 0 10px; + font-variant-numeric: tabular-nums; +} + +.atfa-demo__actions { + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +@media ( prefers-reduced-motion: reduce ) { + .atfa-timeline__day { + transition: none; + } +} diff --git a/assets/css/builder.css b/assets/css/builder.css index a94441c..923ab2f 100644 --- a/assets/css/builder.css +++ b/assets/css/builder.css @@ -15,9 +15,14 @@ * @package AllTerrain_Forms */ +/* Every window root this plugin owns. A root missing from this list inherits no + tokens at all, which does not fail loudly: `var( --atfb-accent )` with nothing + behind it is simply an invalid declaration, so the element keeps its initial + value and a chart of coloured bars renders as a blank rectangle. */ .atfb, .atfe, -.atfs { +.atfs, +.atfa { /* The window's own surface. A window body must not paint a colour of its own choosing behind the shell's chrome. */ --atfb-bg: var( --os-window-bg, #fff ); diff --git a/assets/js/analytics.js b/assets/js/analytics.js new file mode 100644 index 0000000..199f1ab --- /dev/null +++ b/assets/js/analytics.js @@ -0,0 +1,840 @@ +var allTerrainFormsAnalytics = function(exports) { + "use strict"; + function getShell() { + const wp = window.wp; + return wp?.os ?? null; + } + const config = window.allTerrainForms; + class ApiError extends Error { + constructor(message, status, code = "") { + super(message); + this.name = "ApiError"; + this.status = status; + this.code = code; + } + } + async function request(path, init = {}) { + if (!config?.restUrl) { + throw new ApiError("AllTerrain Forms is not configured on this page.", 0); + } + const url = `${config.restUrl}${path}`; + const headers = { + "Content-Type": "application/json", + ...init.headers ?? {} + }; + if (config.nonce) { + headers["X-WP-Nonce"] = config.nonce; + } + const shell = getShell(); + const doFetch = shell?.fetch ? (input, options) => shell.fetch(input, options, { source: "allterrain-forms" }) : (input, options) => fetch(input, options); + const response = await doFetch(url, { + credentials: "same-origin", + ...init, + headers + }); + if (!response.ok) { + let message = `Request failed with status ${response.status}.`; + let code = ""; + try { + const body = await response.json(); + message = body.message ?? message; + code = body.code ?? ""; + } catch { + } + throw new ApiError(message, response.status, code); + } + if (response.status === 204) { + return void 0; + } + return await response.json(); + } + const get = (path) => request(path); + async function wpGet(route) { + if (!config?.wpRestUrl) { + throw new ApiError("AllTerrain Forms is not configured on this page.", 0); + } + const headers = config.nonce ? { "X-WP-Nonce": config.nonce } : {}; + const shell = getShell(); + const url = `${config.wpRestUrl}${route}`; + const response = shell?.fetch ? await shell.fetch(url, { credentials: "same-origin", headers }, { source: "allterrain-forms" }) : await fetch(url, { credentials: "same-origin", headers }); + if (!response.ok) { + throw new ApiError(`Request failed with status ${response.status}.`, response.status); + } + return await response.json(); + } + function decodeEntities(html) { + if (!html || !html.includes("&")) { + return html; + } + const textarea = document.createElement("textarea"); + textarea.innerHTML = html; + return textarea.value; + } + const post = (path, body) => request(path, { method: "POST", body: JSON.stringify(body) }); + const del = (path) => request(path, { method: "DELETE" }); + function query(params) { + const search = new URLSearchParams(); + for (const [key, value] of Object.entries(params)) { + if (value === void 0 || value === "" || value === false) { + continue; + } + search.set(key, String(value)); + } + const string = search.toString(); + return string ? `?${string}` : ""; + } + const api = { + config: () => get("/config"), + listForms: () => get("/forms"), + getForm: (id) => get(`/forms/${id}`), + createForm: (body) => post("/forms", body), + updateForm: (id, body) => post(`/forms/${id}`, body), + duplicateForm: (id) => post(`/forms/${id}/duplicate`, {}), + deleteForm: (id) => del(`/forms/${id}`), + preview: (id, body) => post(`/forms/${id}/preview`, body), + /** + * The site's published pages, for the "send them to a page" confirmation. + * + * Core's own route rather than one of ours: `wp/v2/pages` already knows about + * capabilities, pagination and the page hierarchy, and a plugin re-exposing + * the same list is a second thing to keep in step with it. `_fields` keeps the + * payload to the two values the picker shows — a full page response carries + * rendered content, and a hundred of those is megabytes. + */ + pages: () => wpGet( + "wp/v2/pages?per_page=100&status=publish&orderby=title&order=asc&_fields=id,title" + ).then( + (pages) => pages.map((page) => ({ + id: page.id, + // The REST API returns titles HTML-encoded; `el()` sets text through + // `textContent`, so without decoding, a page called "Q&A" shows as + // "Q&A" in the picker. + title: decodeEntities(page.title?.rendered ?? "") || `#${page.id}` + })) + ), + mergeTags: (id) => get(`/forms/${id}/merge-tags`).then((response) => response.groups), + analytics: (id, dimension = "") => get( + `/forms/${id}/analytics${dimension ? `?dimension=${encodeURIComponent(dimension)}` : ""}` + ), + /** + * The demo-data tools. + * + * Every one of these 404s unless developer mode is on, which is why the + * window asks for the status before drawing the panel rather than drawing the + * panel and letting the buttons fail. + */ + demoStatus: () => get("/demo"), + /** Generates one chunk. Called until `remaining` reaches zero. */ + demoSeed: (count) => post("/demo", count ? { count } : {}), + demoRemove: () => del("/demo"), + listEntries: (params) => get(`/entries${query(params)}`), + getEntry: (id) => get(`/entries/${id}`), + updateEntry: (id, body) => post(`/entries/${id}`, body), + deleteEntry: (id) => del(`/entries/${id}`), + exportEntries: (params) => get(`/entries/export${query(params)}`), + listThemes: () => get("/themes"), + saveTheme: (body) => post("/themes", body), + deleteTheme: (id) => del(`/themes/${id}`) + }; + function el(tag, options = {}) { + const node = document.createElement(tag); + if (options.class) { + node.className = options.class; + } + if (options.text !== void 0) { + node.textContent = options.text; + } + if (options.html !== void 0) { + node.innerHTML = options.html; + } + if (options.title) { + node.title = options.title; + } + if (options.type && "type" in node) { + node.type = options.type; + } + if (options.value !== void 0 && "value" in node) { + node.value = options.value; + } + if (options.placeholder !== void 0 && "placeholder" in node) { + node.placeholder = options.placeholder; + } + if (options.href && "href" in node) { + node.href = options.href; + } + for (const [name, value] of Object.entries(options.attrs ?? {})) { + if (value === void 0 || value === false) { + continue; + } + node.setAttribute(name, value === true ? "" : String(value)); + } + Object.assign(node.style, options.style ?? {}); + for (const [event, handler] of Object.entries(options.on ?? {})) { + node.addEventListener(event, handler); + } + for (const child of options.children ?? []) { + if (child === null || child === void 0 || child === false) { + continue; + } + node.append(child); + } + return node; + } + function clear(node) { + node.replaceChildren(); + } + function select(value, options, onChange) { + if (hasComponent("os-select") && hasComponent("os-option")) { + const host = document.createElement("os-select"); + host.setAttribute("value", value); + host.classList.add("atfb-field"); + for (const option of options) { + const item = document.createElement("os-option"); + item.setAttribute("value", option.value); + item.textContent = option.label; + host.append(item); + } + host.addEventListener("os-pick", (event) => { + onChange(String(event.detail?.value ?? "")); + }); + return host; + } + return el("select", { + class: "atfb-input atfb-select", + on: { + change: (event) => onChange(event.target.value) + }, + children: options.map( + (option) => el("option", { + value: option.value, + text: option.label, + attrs: { selected: option.value === value } + }) + ) + }); + } + function button(label, onClick, variant = "secondary", iconSlug) { + const children = [null, el("span", { text: label })]; + if (hasComponent("os-button")) { + const host = document.createElement("os-button"); + host.setAttribute("variant", variant); + host.setAttribute("type", "button"); + host.classList.add("atfb-button", `atfb-button--${variant}`); + host.addEventListener("click", onClick); + for (const child of children) { + if (child) { + host.append(child); + } + } + return host; + } + return el("button", { + class: `atfb-button atfb-button--${variant}`, + type: "button", + on: { click: onClick }, + children + }); + } + function hasComponent(tag) { + return typeof customElements !== "undefined" && Boolean(customElements.get(tag)); + } + const COMPONENTS = [ + "os-button", + "os-checkbox-label", + "os-number-field", + "os-select", + "os-option", + "os-segmented", + "os-segment", + "os-color-field", + "os-empty-state" + ]; + let componentsPending = null; + function whenComponents() { + if (componentsPending) { + return componentsPending; + } + const shell = window.wp?.os; + componentsPending = shell?.loadComponents ? shell.loadComponents(COMPONENTS).catch(() => void 0) : Promise.resolve(); + return componentsPending; + } + async function confirmAction(message, title = "") { + const shell = window.wp?.os; + if (shell?.confirm) { + return shell.confirm({ title, message, danger: true }); + } + return window.confirm(message); + } + function notify(title, body = "", type = "info") { + const shell = window.wp?.os; + if (shell?.notify) { + shell.notify({ title, body, type }); + return; + } + console.info(`[AllTerrain Forms] ${title}${body ? `: ${body}` : ""}`); + } + const NPS_BANDS = [ + { key: "detractors", label: "Detractors", hint: "0–6" }, + { key: "passives", label: "Passives", hint: "7–8" }, + { key: "promoters", label: "Promoters", hint: "9–10" } + ]; + class AnalyticsWindow { + constructor(root) { + this.forms = []; + this.formId = 0; + this.dimension = ""; + this.report = null; + this.demo = null; + this.demoAvailable = false; + this.bar = root.querySelector("[data-atfa-bar]") ?? el("div"); + this.body = root.querySelector("[data-atfa-body]") ?? el("div"); + } + /** Loads the form list and draws the first report. */ + async start() { + await whenComponents(); + try { + this.forms = await api.listForms(); + } catch { + this.fail("Could not load your forms."); + return; + } + if (!this.forms.length) { + this.fail("There are no forms yet. Build one, collect a few submissions, and this fills in."); + return; + } + if (config?.devMode && config?.canEdit) { + try { + this.demo = await api.demoStatus(); + this.demoAvailable = true; + } catch { + this.demoAvailable = false; + } + } + this.formId = this.forms[0].id; + await this.load(); + } + /** Fetches the report for the current form and redraws. */ + async load() { + try { + this.report = await api.analytics(this.formId, this.dimension); + } catch { + this.fail("Could not load that report."); + return; + } + this.dimension = this.report.breakdown?.id ?? ""; + this.renderBar(); + this.render(); + } + /** Says why there is nothing to show. */ + fail(message) { + clear(this.bar); + clear(this.body); + this.body.append(el("p", { class: "atfa__empty", text: message })); + } + /** The form picker, the grouping picker, and the headline counts. */ + renderBar() { + clear(this.bar); + this.bar.append( + select( + String(this.formId), + this.forms.map((form) => ({ value: String(form.id), label: form.title || `#${form.id}` })), + (value) => { + this.formId = Number(value); + this.dimension = ""; + void this.load(); + } + ) + ); + const dimensions = this.report?.dimensions ?? []; + if (dimensions.length > 1) { + this.bar.append( + el("span", { class: "atfa__bar-label", text: "Group by" }), + select( + this.dimension, + dimensions.map((item) => ({ value: item.id, label: item.label })), + (value) => { + this.dimension = value; + void this.load(); + } + ) + ); + } + } + /** Draws the whole report. */ + render() { + const report = this.report; + clear(this.body); + if (!report) { + return; + } + this.body.append(this.kpis(report)); + if (report.submissions < 1 && report.sampled < 1) { + this.body.append( + el("p", { + class: "atfa__empty", + text: "No submissions yet. Everything below fills in as they arrive." + }) + ); + } else { + this.body.append(this.timeline(report)); + for (const field of report.fields) { + if (field.nps) { + this.body.append(this.npsPanel(field)); + } + } + if (report.breakdown && report.breakdown.groups.length) { + this.body.append(this.breakdownPanel(report.breakdown)); + } + this.body.append(this.questions(report)); + } + if (this.demoAvailable) { + this.body.append(this.demoPanel()); + } + } + /** The headline numbers. */ + kpis(report) { + const cards = [ + { label: "Submissions", value: String(report.submissions) }, + { label: "Views", value: String(report.views) }, + { label: "Conversion", value: `${report.conversion}%`, hint: "of people who saw it" }, + { label: "Completion", value: `${report.completion}%`, hint: "of people who started" }, + { label: "Unread", value: String(report.unread) }, + { label: "Spam", value: String(report.spam) } + ]; + return el("div", { + class: "atfa-kpis", + children: cards.map( + (card) => el("div", { + class: "atfa-kpi", + children: [ + el("span", { class: "atfa-kpi__value", text: card.value }), + el("span", { class: "atfa-kpi__label", text: card.label }), + card.hint ? el("span", { class: "atfa-kpi__hint", text: card.hint }) : null + ] + }) + ) + }); + } + /** + * Submissions per day. + * + * Drawn as one element per day rather than an SVG path, so a day can carry its + * own tooltip and the whole thing stays readable when the window is narrow. + * The server sends every day in the window including the empty ones, which is + * what keeps a quiet fortnight looking quiet instead of closing up. + */ + timeline(report) { + const days = report.timeline; + const peak = days.reduce((most, day) => Math.max(most, day.count), 0); + const total = days.reduce((sum, day) => sum + day.count, 0); + return this.panel( + "When they answered", + `${total} in the last ${days.length} days · busiest day ${peak}`, + [ + el("div", { + class: "atfa-timeline", + children: days.map( + (day) => el("div", { + class: `atfa-timeline__day${day.count ? "" : " is-empty"}`, + attrs: { + // A percentage rather than a pixel height, so the chart + // scales with the window instead of being redrawn on + // every resize. + style: `height:${peak ? Math.max(2, day.count / peak * 100) : 0}%`, + title: `${day.date}: ${day.count}` + } + }) + ) + }), + el("div", { + class: "atfa-timeline__axis", + children: [ + el("span", { text: days[0]?.date ?? "" }), + el("span", { text: days[days.length - 1]?.date ?? "" }) + ] + }) + ] + ); + } + /** + * The NPS panel. + * + * The three bands are drawn to scale as one bar, which is the only honest way + * to show a score that is a *difference* between two of them: the passives in + * the middle contribute nothing to the number, and a chart that omits them + * makes the score look like a share of something. + */ + npsPanel(field) { + const nps = field.nps; + if (!nps) { + return el("div"); + } + const share = (count) => nps.responses ? count / nps.responses * 100 : 0; + return this.panel(field.label, `${nps.responses} answers · Net Promoter Score`, [ + el("div", { + class: "atfa-nps", + children: [ + el("div", { + class: `atfa-nps__score is-${nps.score >= 50 ? "great" : nps.score >= 0 ? "ok" : "poor"}`, + children: [ + el("span", { + class: "atfa-nps__number", + // Signed, always. An NPS of 6 and an NPS of -6 are very + // different results and differ by one character. + text: `${nps.score > 0 ? "+" : ""}${nps.score}` + }), + el("span", { class: "atfa-nps__caption", text: "NPS" }) + ] + }), + el("div", { + class: "atfa-nps__detail", + children: [ + el("div", { + class: "atfa-nps__bar", + children: NPS_BANDS.map( + (band) => el("div", { + class: `atfa-nps__band is-${band.key}`, + attrs: { + style: `width:${share(nps[band.key])}%`, + title: `${band.label} (${band.hint}): ${nps[band.key]}` + } + }) + ) + }), + el("div", { + class: "atfa-nps__legend", + children: NPS_BANDS.map( + (band) => el("span", { + class: `atfa-nps__key is-${band.key}`, + children: [ + el("strong", { text: String(nps[band.key]) }), + el("span", { text: ` ${band.label} ` }), + el("small", { text: band.hint }) + ] + }) + ) + }) + ] + }) + ] + }) + ]); + } + /** + * The cross-tab. + * + * "The average score is 7.5" is a fact nobody can act on. "Support scores 5.8 + * and everyone else is above 7" is a fact with an obvious next step, and this + * is the panel that turns the first into the second. + * + * A table, genuinely — rows of numbers compared across a shared scale is what + * a table is for, and it reads correctly in a screen reader without any of the + * describing an SVG would need. + */ + breakdownPanel(breakdown) { + const metrics = breakdown.groups[0]?.metrics ?? []; + if (!metrics.length) { + return el("div"); + } + const ceilings = /* @__PURE__ */ new Map(); + for (const group of breakdown.groups) { + for (const metric of group.metrics) { + ceilings.set(metric.id, Math.max(ceilings.get(metric.id) ?? 0, metric.mean)); + } + } + const head = el("tr", { + children: [ + el("th", { text: breakdown.label, attrs: { scope: "col" } }), + el("th", { text: "Answers", attrs: { scope: "col" } }), + ...metrics.map((metric) => el("th", { text: metric.label, attrs: { scope: "col" } })) + ] + }); + const rows = breakdown.groups.map( + (group) => el("tr", { + children: [ + el("th", { class: "atfa-table__label", text: group.label, attrs: { scope: "row" } }), + el("td", { class: "atfa-table__count", text: String(group.count) }), + ...group.metrics.map( + (metric) => el("td", { + children: [ + el("div", { + class: "atfa-meter", + children: [ + el("div", { + class: "atfa-meter__fill", + attrs: { + style: `width:${metric.mean / (ceilings.get(metric.id) || 1) * 100}%` + } + }) + ] + }), + el("span", { + class: "atfa-meter__value", + text: null !== metric.nps ? `${metric.mean.toFixed(1)} · NPS ${metric.nps > 0 ? "+" : ""}${metric.nps}` : metric.mean.toFixed(2) + }) + ] + }) + ) + ] + }) + ); + return this.panel(`Broken down by ${breakdown.label.toLowerCase()}`, "", [ + el("table", { + class: "atfa-table", + children: [el("thead", { children: [head] }), el("tbody", { children: rows })] + }) + ]); + } + /** One panel per question. */ + questions(report) { + return el("div", { + class: "atfa-questions", + children: report.fields.map((field) => this.question(field, report.sampled)) + }); + } + /** One question. */ + question(field, sampled) { + const parts = []; + if (field.choices.length) { + const ceiling = field.choices.reduce((most, choice) => Math.max(most, choice.count), 0); + parts.push( + el("ul", { + class: "atfa-bars", + children: field.choices.map( + (choice) => el("li", { + class: "atfa-bars__row", + children: [ + el("span", { class: "atfa-bars__label", text: choice.label }), + el("div", { + class: "atfa-meter", + children: [ + el("div", { + class: "atfa-meter__fill", + attrs: { style: `width:${ceiling ? choice.count / ceiling * 100 : 0}%` } + }) + ] + }), + el("span", { + class: "atfa-bars__value", + text: `${choice.count} ${field.answered ? Math.round(choice.count / field.answered * 100) : 0}%` + }) + ] + }) + ) + }) + ); + } + if (field.numbers) { + parts.push(this.histogram(field)); + } + if (!parts.length) { + parts.push( + el("p", { + class: "atfa-question__note", + text: `${field.answered} of ${sampled} people answered this.` + }) + ); + } + return this.panel(field.label, this.questionSummary(field, sampled), parts); + } + /** The line under a question's title. */ + questionSummary(field, sampled) { + const bits = [`${field.rate}% answered`]; + if (field.numbers) { + bits.push(`mean ${field.numbers.mean}`, `median ${field.numbers.median}`); + } + bits.push(`${field.answered}/${sampled}`); + return bits.join(" · "); + } + /** + * A numeric question's distribution. + * + * The bar the mean falls in is marked, because the interesting cases are the + * ones where it falls in a bar almost nobody chose — which is exactly when + * quoting the mean on its own would have misled. + */ + histogram(field) { + const numbers = field.numbers; + if (!numbers) { + return el("div"); + } + const buckets = []; + for (let value = Math.floor(numbers.min); value <= Math.ceil(numbers.max); value++) { + buckets.push({ value, count: numbers.distribution[String(value)] ?? 0 }); + } + const peak = buckets.reduce((most, bucket) => Math.max(most, bucket.count), 0); + const meanAt = Math.round(numbers.mean); + return el("div", { + class: "atfa-hist", + children: buckets.map( + (bucket) => el("div", { + class: `atfa-hist__col${bucket.value === meanAt ? " is-mean" : ""}`, + attrs: { title: `${bucket.value}: ${bucket.count}` }, + children: [ + el("span", { class: "atfa-hist__count", text: bucket.count ? String(bucket.count) : "" }), + el("div", { + class: "atfa-hist__bar", + attrs: { style: `height:${peak ? Math.max(2, bucket.count / peak * 100) : 0}%` } + }), + el("span", { class: "atfa-hist__tick", text: String(bucket.value) }) + ] + }) + ) + }); + } + /** + * The developer panel. + * + * Deliberately at the bottom, deliberately labelled, and deliberately not + * present at all unless developer mode is on. It writes several hundred + * entries into whatever database this happens to be, which is a fine thing to + * do on a laptop and a terrible one to do by accident. + */ + demoPanel() { + const status = this.demo; + const progress = el("p", { class: "atfa-demo__status", text: this.demoSummary(status) }); + const seed = button("Fill with demo data", async () => { + await this.seedAll(progress); + }); + const remove = button("Remove demo data", async () => { + if (!await confirmAction("Delete the demo survey and every entry it generated?", "Remove demo data")) { + return; + } + progress.textContent = "Removing…"; + try { + const result = await api.demoRemove(); + notify("Demo data removed", `${result.entries} entries and ${result.forms} form.`); + } catch { + notify("Could not remove the demo data", "", "error"); + } + await this.refreshDemo(progress); + }); + return el("div", { + class: "atfa-demo", + attrs: { "data-atfa-demo": "" }, + children: [ + el("h3", { class: "atfa-demo__title", text: "Developer" }), + el("p", { + class: "atfa-demo__note", + text: "Generates a team pulse survey and several hundred submissions through the real submission pipeline, so this report has something to report on. Everything it makes is tagged, and removing it deletes exactly that and nothing else." + }), + progress, + el("div", { class: "atfa-demo__actions", children: [seed, remove] }) + ] + }); + } + /** What the developer panel says about the current state. */ + demoSummary(status) { + if (!status || !status.formId) { + return "No demo data on this site."; + } + return `${status.title}: ${status.entries} of ${status.target} submissions.`; + } + /** + * Generates every remaining chunk. + * + * A loop of small requests rather than one big one. Each chunk is a few dozen + * passes through the whole submission pipeline, and the server caps what it + * will do per call — so this asks repeatedly, which is also what gives the + * count something true to report while it runs. + */ + async seedAll(progress) { + let guard = 0; + let failures = 0; + for (; ; ) { + try { + const status = await api.demoSeed(); + this.demo = status; + failures = 0; + progress.textContent = `Generating… ${status.entries} of ${status.target}`; + if (status.remaining < 1) { + notify("Demo data ready", `${status.entries} submissions.`); + break; + } + } catch { + failures += 1; + if (failures >= 3) { + progress.textContent = "Stopped early. Press it again to carry on from here."; + notify("Could not finish the demo data", "Some submissions were made. Try again to continue.", "error"); + break; + } + } + guard += 1; + if (guard > 200) { + break; + } + } + await this.refreshDemo(progress); + if (this.demo?.formId) { + try { + this.forms = await api.listForms(); + } catch { + } + this.formId = this.demo.formId; + this.dimension = ""; + } + await this.load(); + } + /** Re-reads the demo status and redraws the line that shows it. */ + async refreshDemo(progress) { + try { + this.demo = await api.demoStatus(); + } catch { + this.demo = null; + } + progress.textContent = this.demoSummary(this.demo); + } + /** A titled block. */ + panel(title, note, children) { + return el("section", { + class: "atfa-panel", + children: [ + el("header", { + class: "atfa-panel__head", + children: [ + el("h3", { class: "atfa-panel__title", text: title }), + note ? el("p", { class: "atfa-panel__note", text: note }) : null + ] + }), + ...children + ] + }); + } + /** Scrolls the developer panel into view. */ + revealDemo() { + this.body.querySelector("[data-atfa-demo]")?.scrollIntoView({ behavior: "smooth", block: "start" }); + } + } + let mounted = null; + function mountAnalytics() { + const root = document.querySelector("[data-atfa-root]"); + if (!root || root.dataset.atfaMounted) { + return; + } + root.dataset.atfaMounted = "1"; + mounted = new AnalyticsWindow(root); + void mounted.start(); + } + let wantsDemo = false; + document.addEventListener("atf-open-demo-panel", () => { + wantsDemo = true; + window.setTimeout(() => { + mounted?.revealDemo(); + wantsDemo = false; + }, 600); + }); + document.addEventListener("os-window-content-loaded", () => { + mountAnalytics(); + if (wantsDemo) { + window.setTimeout(() => mounted?.revealDemo(), 400); + } + }); + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", mountAnalytics); + } else { + mountAnalytics(); + } + exports.mountAnalytics = mountAnalytics; + Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); + return exports; +}({}); diff --git a/assets/js/analytics.min.js b/assets/js/analytics.min.js new file mode 100644 index 0000000..842bc43 --- /dev/null +++ b/assets/js/analytics.min.js @@ -0,0 +1 @@ +var allTerrainFormsAnalytics=function($){"use strict";function k(){return window.wp?.os??null}const c=window.allTerrainForms;class f extends Error{constructor(e,t,a=""){super(e),this.name="ApiError",this.status=t,this.code=a}}async function _(s,e={}){if(!c?.restUrl)throw new f("AllTerrain Forms is not configured on this page.",0);const t=`${c.restUrl}${s}`,a={"Content-Type":"application/json",...e.headers??{}};c.nonce&&(a["X-WP-Nonce"]=c.nonce);const i=k(),o=await(i?.fetch?(l,u)=>i.fetch(l,u,{source:"allterrain-forms"}):(l,u)=>fetch(l,u))(t,{credentials:"same-origin",...e,headers:a});if(!o.ok){let l=`Request failed with status ${o.status}.`,u="";try{const T=await o.json();l=T.message??l,u=T.code??""}catch{}throw new f(l,o.status,u)}if(o.status!==204)return await o.json()}const d=s=>_(s);async function M(s){if(!c?.wpRestUrl)throw new f("AllTerrain Forms is not configured on this page.",0);const e=c.nonce?{"X-WP-Nonce":c.nonce}:{},t=k(),a=`${c.wpRestUrl}${s}`,i=t?.fetch?await t.fetch(a,{credentials:"same-origin",headers:e},{source:"allterrain-forms"}):await fetch(a,{credentials:"same-origin",headers:e});if(!i.ok)throw new f(`Request failed with status ${i.status}.`,i.status);return await i.json()}function F(s){if(!s||!s.includes("&"))return s;const e=document.createElement("textarea");return e.innerHTML=s,e.value}const h=(s,e)=>_(s,{method:"POST",body:JSON.stringify(e)}),p=s=>_(s,{method:"DELETE"});function E(s){const e=new URLSearchParams;for(const[a,i]of Object.entries(s))i===void 0||i===""||i===!1||e.set(a,String(i));const t=e.toString();return t?`?${t}`:""}const m={config:()=>d("/config"),listForms:()=>d("/forms"),getForm:s=>d(`/forms/${s}`),createForm:s=>h("/forms",s),updateForm:(s,e)=>h(`/forms/${s}`,e),duplicateForm:s=>h(`/forms/${s}/duplicate`,{}),deleteForm:s=>p(`/forms/${s}`),preview:(s,e)=>h(`/forms/${s}/preview`,e),pages:()=>M("wp/v2/pages?per_page=100&status=publish&orderby=title&order=asc&_fields=id,title").then(s=>s.map(e=>({id:e.id,title:F(e.title?.rendered??"")||`#${e.id}`}))),mergeTags:s=>d(`/forms/${s}/merge-tags`).then(e=>e.groups),analytics:(s,e="")=>d(`/forms/${s}/analytics${e?`?dimension=${encodeURIComponent(e)}`:""}`),demoStatus:()=>d("/demo"),demoSeed:s=>h("/demo",s?{count:s}:{}),demoRemove:()=>p("/demo"),listEntries:s=>d(`/entries${E(s)}`),getEntry:s=>d(`/entries/${s}`),updateEntry:(s,e)=>h(`/entries/${s}`,e),deleteEntry:s=>p(`/entries/${s}`),exportEntries:s=>d(`/entries/export${E(s)}`),listThemes:()=>d("/themes"),saveTheme:s=>h("/themes",s),deleteTheme:s=>p(`/themes/${s}`)};function n(s,e={}){const t=document.createElement(s);e.class&&(t.className=e.class),e.text!==void 0&&(t.textContent=e.text),e.html!==void 0&&(t.innerHTML=e.html),e.title&&(t.title=e.title),e.type&&"type"in t&&(t.type=e.type),e.value!==void 0&&"value"in t&&(t.value=e.value),e.placeholder!==void 0&&"placeholder"in t&&(t.placeholder=e.placeholder),e.href&&"href"in t&&(t.href=e.href);for(const[a,i]of Object.entries(e.attrs??{}))i===void 0||i===!1||t.setAttribute(a,i===!0?"":String(i));Object.assign(t.style,e.style??{});for(const[a,i]of Object.entries(e.on??{}))t.addEventListener(a,i);for(const a of e.children??[])a==null||a===!1||t.append(a);return t}function b(s){s.replaceChildren()}function A(s,e,t){if(x("os-select")&&x("os-option")){const a=document.createElement("os-select");a.setAttribute("value",s),a.classList.add("atfb-field");for(const i of e){const r=document.createElement("os-option");r.setAttribute("value",i.value),r.textContent=i.label,a.append(r)}return a.addEventListener("os-pick",i=>{t(String(i.detail?.value??""))}),a}return n("select",{class:"atfb-input atfb-select",on:{change:a=>t(a.target.value)},children:e.map(a=>n("option",{value:a.value,text:a.label,attrs:{selected:a.value===s}}))})}function P(s,e,t="secondary",a){const i=[null,n("span",{text:s})];if(x("os-button")){const r=document.createElement("os-button");r.setAttribute("variant",t),r.setAttribute("type","button"),r.classList.add("atfb-button",`atfb-button--${t}`),r.addEventListener("click",e);for(const o of i)o&&r.append(o);return r}return n("button",{class:`atfb-button atfb-button--${t}`,type:"button",on:{click:e},children:i})}function x(s){return typeof customElements<"u"&&!!customElements.get(s)}const q=["os-button","os-checkbox-label","os-number-field","os-select","os-option","os-segmented","os-segment","os-color-field","os-empty-state"];let v=null;function D(){if(v)return v;const s=window.wp?.os;return v=s?.loadComponents?s.loadComponents(q).catch(()=>{}):Promise.resolve(),v}async function L(s,e=""){const t=window.wp?.os;return t?.confirm?t.confirm({title:e,message:s,danger:!0}):window.confirm(s)}function y(s,e="",t="info"){const a=window.wp?.os;if(a?.notify){a.notify({title:s,body:e,type:t});return}console.info(`[AllTerrain Forms] ${s}${e?`: ${e}`:""}`)}const C=[{key:"detractors",label:"Detractors",hint:"0–6"},{key:"passives",label:"Passives",hint:"7–8"},{key:"promoters",label:"Promoters",hint:"9–10"}];class N{constructor(e){this.forms=[],this.formId=0,this.dimension="",this.report=null,this.demo=null,this.demoAvailable=!1,this.bar=e.querySelector("[data-atfa-bar]")??n("div"),this.body=e.querySelector("[data-atfa-body]")??n("div")}async start(){await D();try{this.forms=await m.listForms()}catch{this.fail("Could not load your forms.");return}if(!this.forms.length){this.fail("There are no forms yet. Build one, collect a few submissions, and this fills in.");return}if(c?.devMode&&c?.canEdit)try{this.demo=await m.demoStatus(),this.demoAvailable=!0}catch{this.demoAvailable=!1}this.formId=this.forms[0].id,await this.load()}async load(){try{this.report=await m.analytics(this.formId,this.dimension)}catch{this.fail("Could not load that report.");return}this.dimension=this.report.breakdown?.id??"",this.renderBar(),this.render()}fail(e){b(this.bar),b(this.body),this.body.append(n("p",{class:"atfa__empty",text:e}))}renderBar(){b(this.bar),this.bar.append(A(String(this.formId),this.forms.map(t=>({value:String(t.id),label:t.title||`#${t.id}`})),t=>{this.formId=Number(t),this.dimension="",this.load()}));const e=this.report?.dimensions??[];e.length>1&&this.bar.append(n("span",{class:"atfa__bar-label",text:"Group by"}),A(this.dimension,e.map(t=>({value:t.id,label:t.label})),t=>{this.dimension=t,this.load()}))}render(){const e=this.report;if(b(this.body),!!e){if(this.body.append(this.kpis(e)),e.submissions<1&&e.sampled<1)this.body.append(n("p",{class:"atfa__empty",text:"No submissions yet. Everything below fills in as they arrive."}));else{this.body.append(this.timeline(e));for(const t of e.fields)t.nps&&this.body.append(this.npsPanel(t));e.breakdown&&e.breakdown.groups.length&&this.body.append(this.breakdownPanel(e.breakdown)),this.body.append(this.questions(e))}this.demoAvailable&&this.body.append(this.demoPanel())}}kpis(e){const t=[{label:"Submissions",value:String(e.submissions)},{label:"Views",value:String(e.views)},{label:"Conversion",value:`${e.conversion}%`,hint:"of people who saw it"},{label:"Completion",value:`${e.completion}%`,hint:"of people who started"},{label:"Unread",value:String(e.unread)},{label:"Spam",value:String(e.spam)}];return n("div",{class:"atfa-kpis",children:t.map(a=>n("div",{class:"atfa-kpi",children:[n("span",{class:"atfa-kpi__value",text:a.value}),n("span",{class:"atfa-kpi__label",text:a.label}),a.hint?n("span",{class:"atfa-kpi__hint",text:a.hint}):null]}))})}timeline(e){const t=e.timeline,a=t.reduce((r,o)=>Math.max(r,o.count),0),i=t.reduce((r,o)=>r+o.count,0);return this.panel("When they answered",`${i} in the last ${t.length} days · busiest day ${a}`,[n("div",{class:"atfa-timeline",children:t.map(r=>n("div",{class:`atfa-timeline__day${r.count?"":" is-empty"}`,attrs:{style:`height:${a?Math.max(2,r.count/a*100):0}%`,title:`${r.date}: ${r.count}`}}))}),n("div",{class:"atfa-timeline__axis",children:[n("span",{text:t[0]?.date??""}),n("span",{text:t[t.length-1]?.date??""})]})])}npsPanel(e){const t=e.nps;if(!t)return n("div");const a=i=>t.responses?i/t.responses*100:0;return this.panel(e.label,`${t.responses} answers · Net Promoter Score`,[n("div",{class:"atfa-nps",children:[n("div",{class:`atfa-nps__score is-${t.score>=50?"great":t.score>=0?"ok":"poor"}`,children:[n("span",{class:"atfa-nps__number",text:`${t.score>0?"+":""}${t.score}`}),n("span",{class:"atfa-nps__caption",text:"NPS"})]}),n("div",{class:"atfa-nps__detail",children:[n("div",{class:"atfa-nps__bar",children:C.map(i=>n("div",{class:`atfa-nps__band is-${i.key}`,attrs:{style:`width:${a(t[i.key])}%`,title:`${i.label} (${i.hint}): ${t[i.key]}`}}))}),n("div",{class:"atfa-nps__legend",children:C.map(i=>n("span",{class:`atfa-nps__key is-${i.key}`,children:[n("strong",{text:String(t[i.key])}),n("span",{text:` ${i.label} `}),n("small",{text:i.hint})]}))})]})]})])}breakdownPanel(e){const t=e.groups[0]?.metrics??[];if(!t.length)return n("div");const a=new Map;for(const o of e.groups)for(const l of o.metrics)a.set(l.id,Math.max(a.get(l.id)??0,l.mean));const i=n("tr",{children:[n("th",{text:e.label,attrs:{scope:"col"}}),n("th",{text:"Answers",attrs:{scope:"col"}}),...t.map(o=>n("th",{text:o.label,attrs:{scope:"col"}}))]}),r=e.groups.map(o=>n("tr",{children:[n("th",{class:"atfa-table__label",text:o.label,attrs:{scope:"row"}}),n("td",{class:"atfa-table__count",text:String(o.count)}),...o.metrics.map(l=>n("td",{children:[n("div",{class:"atfa-meter",children:[n("div",{class:"atfa-meter__fill",attrs:{style:`width:${l.mean/(a.get(l.id)||1)*100}%`}})]}),n("span",{class:"atfa-meter__value",text:l.nps!==null?`${l.mean.toFixed(1)} · NPS ${l.nps>0?"+":""}${l.nps}`:l.mean.toFixed(2)})]}))]}));return this.panel(`Broken down by ${e.label.toLowerCase()}`,"",[n("table",{class:"atfa-table",children:[n("thead",{children:[i]}),n("tbody",{children:r})]})])}questions(e){return n("div",{class:"atfa-questions",children:e.fields.map(t=>this.question(t,e.sampled))})}question(e,t){const a=[];if(e.choices.length){const i=e.choices.reduce((r,o)=>Math.max(r,o.count),0);a.push(n("ul",{class:"atfa-bars",children:e.choices.map(r=>n("li",{class:"atfa-bars__row",children:[n("span",{class:"atfa-bars__label",text:r.label}),n("div",{class:"atfa-meter",children:[n("div",{class:"atfa-meter__fill",attrs:{style:`width:${i?r.count/i*100:0}%`}})]}),n("span",{class:"atfa-bars__value",text:`${r.count} ${e.answered?Math.round(r.count/e.answered*100):0}%`})]}))}))}return e.numbers&&a.push(this.histogram(e)),a.length||a.push(n("p",{class:"atfa-question__note",text:`${e.answered} of ${t} people answered this.`})),this.panel(e.label,this.questionSummary(e,t),a)}questionSummary(e,t){const a=[`${e.rate}% answered`];return e.numbers&&a.push(`mean ${e.numbers.mean}`,`median ${e.numbers.median}`),a.push(`${e.answered}/${t}`),a.join(" · ")}histogram(e){const t=e.numbers;if(!t)return n("div");const a=[];for(let o=Math.floor(t.min);o<=Math.ceil(t.max);o++)a.push({value:o,count:t.distribution[String(o)]??0});const i=a.reduce((o,l)=>Math.max(o,l.count),0),r=Math.round(t.mean);return n("div",{class:"atfa-hist",children:a.map(o=>n("div",{class:`atfa-hist__col${o.value===r?" is-mean":""}`,attrs:{title:`${o.value}: ${o.count}`},children:[n("span",{class:"atfa-hist__count",text:o.count?String(o.count):""}),n("div",{class:"atfa-hist__bar",attrs:{style:`height:${i?Math.max(2,o.count/i*100):0}%`}}),n("span",{class:"atfa-hist__tick",text:String(o.value)})]}))})}demoPanel(){const e=this.demo,t=n("p",{class:"atfa-demo__status",text:this.demoSummary(e)}),a=P("Fill with demo data",async()=>{await this.seedAll(t)}),i=P("Remove demo data",async()=>{if(await L("Delete the demo survey and every entry it generated?","Remove demo data")){t.textContent="Removing…";try{const r=await m.demoRemove();y("Demo data removed",`${r.entries} entries and ${r.forms} form.`)}catch{y("Could not remove the demo data","","error")}await this.refreshDemo(t)}});return n("div",{class:"atfa-demo",attrs:{"data-atfa-demo":""},children:[n("h3",{class:"atfa-demo__title",text:"Developer"}),n("p",{class:"atfa-demo__note",text:"Generates a team pulse survey and several hundred submissions through the real submission pipeline, so this report has something to report on. Everything it makes is tagged, and removing it deletes exactly that and nothing else."}),t,n("div",{class:"atfa-demo__actions",children:[a,i]})]})}demoSummary(e){return!e||!e.formId?"No demo data on this site.":`${e.title}: ${e.entries} of ${e.target} submissions.`}async seedAll(e){let t=0,a=0;for(;;){try{const i=await m.demoSeed();if(this.demo=i,a=0,e.textContent=`Generating… ${i.entries} of ${i.target}`,i.remaining<1){y("Demo data ready",`${i.entries} submissions.`);break}}catch{if(a+=1,a>=3){e.textContent="Stopped early. Press it again to carry on from here.",y("Could not finish the demo data","Some submissions were made. Try again to continue.","error");break}}if(t+=1,t>200)break}if(await this.refreshDemo(e),this.demo?.formId){try{this.forms=await m.listForms()}catch{}this.formId=this.demo.formId,this.dimension=""}await this.load()}async refreshDemo(e){try{this.demo=await m.demoStatus()}catch{this.demo=null}e.textContent=this.demoSummary(this.demo)}panel(e,t,a){return n("section",{class:"atfa-panel",children:[n("header",{class:"atfa-panel__head",children:[n("h3",{class:"atfa-panel__title",text:e}),t?n("p",{class:"atfa-panel__note",text:t}):null]}),...a]})}revealDemo(){this.body.querySelector("[data-atfa-demo]")?.scrollIntoView({behavior:"smooth",block:"start"})}}let w=null;function g(){const s=document.querySelector("[data-atfa-root]");!s||s.dataset.atfaMounted||(s.dataset.atfaMounted="1",w=new N(s),w.start())}let S=!1;return document.addEventListener("atf-open-demo-panel",()=>{S=!0,window.setTimeout(()=>{w?.revealDemo(),S=!1},600)}),document.addEventListener("os-window-content-loaded",()=>{g(),S&&window.setTimeout(()=>w?.revealDemo(),400)}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",g):g(),$.mountAnalytics=g,Object.defineProperty($,Symbol.toStringTag,{value:"Module"}),$}({}); diff --git a/assets/js/builder.js b/assets/js/builder.js index 1b810b2..ebc65f3 100644 --- a/assets/js/builder.js +++ b/assets/js/builder.js @@ -353,7 +353,20 @@ var allTerrainFormsBuilder = function(exports) { })) ), mergeTags: (id) => get(`/forms/${id}/merge-tags`).then((response) => response.groups), - analytics: (id) => get(`/forms/${id}/analytics`), + analytics: (id, dimension = "") => get( + `/forms/${id}/analytics${dimension ? `?dimension=${encodeURIComponent(dimension)}` : ""}` + ), + /** + * The demo-data tools. + * + * Every one of these 404s unless developer mode is on, which is why the + * window asks for the status before drawing the panel rather than drawing the + * panel and letting the buttons fail. + */ + demoStatus: () => get("/demo"), + /** Generates one chunk. Called until `remaining` reaches zero. */ + demoSeed: (count) => post("/demo", count ? { count } : {}), + demoRemove: () => del("/demo"), listEntries: (params) => get(`/entries${query(params)}`), getEntry: (id) => get(`/entries/${id}`), updateEntry: (id, body) => post(`/entries/${id}`, body), diff --git a/assets/js/builder.min.js b/assets/js/builder.min.js index f130640..6eb926c 100644 --- a/assets/js/builder.min.js +++ b/assets/js/builder.min.js @@ -1,3 +1,3 @@ -var allTerrainFormsBuilder=function(W){"use strict";class ot{constructor(){this.targets=[],this.active=null,this.lastEndMs=0}start(e){if(this.active||e.origin.button!==0)return null;const{payload:t,origin:s}=e,i=s.clientX,a=s.clientY;let o=!1,l=!1,c=null,d=null,u=0,L=0;const w=()=>{document.removeEventListener("pointermove",E),document.removeEventListener("pointerup",R),document.removeEventListener("pointercancel",X),document.removeEventListener("keydown",ie),window.removeEventListener("blur",X),c?.remove(),c=null,t.source.classList.remove("atf-is-dragging"),d?.onLeave?.(m),d=null,this.active=null,this.lastEndMs=Date.now()},m={payload:t,isFinished:()=>l,cancel:(_="caller")=>{l||(l=!0,w(),e.onCancel?.(_))}},y=_=>{o=!0,t.source.classList.add("atf-is-dragging");const A=t.source.getBoundingClientRect();u=t.ghost?.offsetX??i-A.left,L=t.ghost?.offsetY??a-A.top,c=t.ghost?.element??t.source.cloneNode(!0),c.classList.add("atf-drag-ghost"),c.style.width=`${A.width}px`,document.body.appendChild(c),S(_)},S=_=>{c&&(c.style.transform=`translate3d(${_.clientX-u}px, ${_.clientY-L}px, 0)`)},E=_=>{if(l)return;if(!o){if(Math.hypot(_.clientX-i,_.clientY-a)<4)return;y(_)}S(_);const A=this.hitTest(_.clientX,_.clientY);A!==d&&(d?.onLeave?.(m),d=A,d?.onEnter?.(m))},R=_=>{if(l)return;if(!o){l=!0,w(),e.onClickOnly?.();return}const A=d;if(l=!0,w(),A&&A.accept(t)){e.onCommit?.(A),A.onDrop(m,{clientX:_.clientX,clientY:_.clientY});return}e.onCancel?.(A?"rejected":"no-target")},X=()=>m.cancel("pointercancel"),ie=_=>{_.key==="Escape"&&m.cancel("escape")};return document.addEventListener("pointermove",E),document.addEventListener("pointerup",R),document.addEventListener("pointercancel",X),document.addEventListener("keydown",ie),window.addEventListener("blur",X),this.active=m,m}registerDropTarget(e){return this.targets=this.targets.filter(t=>t.id!==e.id),this.targets.push(e),()=>{this.targets=this.targets.filter(t=>t.id!==e.id)}}isDragging(){return this.active!==null}recentlyEndedDrag(e=500){return Date.now()-this.lastEndMso.right||to.bottom)continue;const l=lt(a.element);if(l>i){s=a,i=l;continue}l===i&&s&&ct(a.element,s.element)&&(s=a)}return s}}function lt(n){let e=0,t=n;for(;t;)e++,t=t.parentElement;return e}function ct(n,e){return(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)!==0}function oe(){return window.wp?.os??null}let le=null;function U(){const n=oe();return n?.dragManager?n.dragManager:(le||(le=new ot),le)}function dt(n){const e=i=>{const a=i.detail?.payload;return a&&n.includes(a.type)?a.source:null},t=i=>e(i)?.classList.add("atf-is-dragging"),s=i=>e(i)?.classList.remove("atf-is-dragging");return document.addEventListener("os.drag.start",t),document.addEventListener("os.drag.end",s),()=>{document.removeEventListener("os.drag.start",t),document.removeEventListener("os.drag.end",s)}}function Te(n,e,t,s,i){const a=e.getBoundingClientRect();return i&&(i.style.width=`${Math.round(a.width)}px`,i.style.maxWidth=`${Math.round(a.width)}px`,i.style.boxSizing="border-box"),{type:n,source:e,data:t,ghost:{element:i,offsetX:s.clientX-a.left,offsetY:s.clientY-a.top,hint:{neutral:"",accept:"",reject:"",hidden:!0}}}}function $e(n,e,t,s){const i=Array.from(n.querySelectorAll(e)).filter(a=>a!==s&&!a.classList.contains("atf-drag-ghost"));for(let a=0;ai.fetch(l,c,{source:"allterrain-forms"}):(l,c)=>fetch(l,c))(t,{credentials:"same-origin",...e,headers:s});if(!o.ok){let l=`Request failed with status ${o.status}.`,c="";try{const d=await o.json();l=d.message??l,c=d.code??""}catch{}throw new ee(l,o.status,c)}if(o.status!==204)return await o.json()}const P=n=>ce(n);async function ht(n){if(!O?.wpRestUrl)throw new ee("AllTerrain Forms is not configured on this page.",0);const e=O.nonce?{"X-WP-Nonce":O.nonce}:{},t=oe(),s=`${O.wpRestUrl}${n}`,i=t?.fetch?await t.fetch(s,{credentials:"same-origin",headers:e},{source:"allterrain-forms"}):await fetch(s,{credentials:"same-origin",headers:e});if(!i.ok)throw new ee(`Request failed with status ${i.status}.`,i.status);return await i.json()}function ut(n){if(!n||!n.includes("&"))return n;const e=document.createElement("textarea");return e.innerHTML=n,e.value}const Y=(n,e)=>ce(n,{method:"POST",body:JSON.stringify(e)}),de=n=>ce(n,{method:"DELETE"});function Ae(n){const e=new URLSearchParams;for(const[s,i]of Object.entries(n))i===void 0||i===""||i===!1||e.set(s,String(i));const t=e.toString();return t?`?${t}`:""}const C={config:()=>P("/config"),listForms:()=>P("/forms"),getForm:n=>P(`/forms/${n}`),createForm:n=>Y("/forms",n),updateForm:(n,e)=>Y(`/forms/${n}`,e),duplicateForm:n=>Y(`/forms/${n}/duplicate`,{}),deleteForm:n=>de(`/forms/${n}`),preview:(n,e)=>Y(`/forms/${n}/preview`,e),pages:()=>ht("wp/v2/pages?per_page=100&status=publish&orderby=title&order=asc&_fields=id,title").then(n=>n.map(e=>({id:e.id,title:ut(e.title?.rendered??"")||`#${e.id}`}))),mergeTags:n=>P(`/forms/${n}/merge-tags`).then(e=>e.groups),analytics:n=>P(`/forms/${n}/analytics`),listEntries:n=>P(`/entries${Ae(n)}`),getEntry:n=>P(`/entries/${n}`),updateEntry:(n,e)=>Y(`/entries/${n}`,e),deleteEntry:n=>de(`/entries/${n}`),exportEntries:n=>P(`/entries/export${Ae(n)}`),listThemes:()=>P("/themes"),saveTheme:n=>Y("/themes",n),deleteTheme:n=>de(`/themes/${n}`)};function r(n,e={}){const t=document.createElement(n);e.class&&(t.className=e.class),e.text!==void 0&&(t.textContent=e.text),e.html!==void 0&&(t.innerHTML=e.html),e.title&&(t.title=e.title),e.type&&"type"in t&&(t.type=e.type),e.value!==void 0&&"value"in t&&(t.value=e.value),e.placeholder!==void 0&&"placeholder"in t&&(t.placeholder=e.placeholder),e.href&&"href"in t&&(t.href=e.href);for(const[s,i]of Object.entries(e.attrs??{}))i===void 0||i===!1||t.setAttribute(s,i===!0?"":String(i));Object.assign(t.style,e.style??{});for(const[s,i]of Object.entries(e.on??{}))t.addEventListener(s,i);for(const s of e.children??[])s==null||s===!1||t.append(s);return t}function D(n){n.replaceChildren()}function F(n){return r("span",{class:`dashicons ${n.startsWith("dashicons-")?n:`dashicons-${n}`}`,attrs:{"aria-hidden":"true"}})}function p(n,e,t){const s=e.id||`atf-c-${Math.random().toString(36).slice(2,9)}`;return e.id=s,r("div",{class:"atfb-row",children:[r("label",{class:"atfb-row__label",text:n,attrs:{for:s}}),e,t?r("p",{class:"atfb-row__hint",text:t}):null]})}function v(n,e,t=""){return r("input",{class:"atfb-input",type:"text",value:n,placeholder:t,on:{input:s=>e(s.target.value)}})}function N(n,e){if(J("os-number-field")){const t=document.createElement("os-number-field");return t.setAttribute("value",n),t.classList.add("atfb-field"),t.addEventListener("os-input-change",s=>{e(String(s.detail?.value??""))}),t}return r("input",{class:"atfb-input",type:"number",value:n,on:{input:t=>e(t.target.value)}})}function te(n,e,t=4){const s=r("textarea",{class:"atfb-input atfb-input--area",attrs:{rows:t},on:{input:i=>e(i.target.value)}});return s.value=n,s}function $(n,e,t){if(J("os-select")&&J("os-option")){const s=document.createElement("os-select");s.setAttribute("value",n),s.classList.add("atfb-field");for(const i of e){const a=document.createElement("os-option");a.setAttribute("value",i.value),a.textContent=i.label,s.append(a)}return s.addEventListener("os-pick",i=>{t(String(i.detail?.value??""))}),s}return r("select",{class:"atfb-input atfb-select",on:{change:s=>t(s.target.value)},children:e.map(s=>r("option",{value:s.value,text:s.label,attrs:{selected:s.value===n}}))})}function T(n,e,t){if(J("os-checkbox-label")){const i=document.createElement("os-checkbox-label");return i.setAttribute("label",n),i.classList.add("atfb-check"),e&&i.setAttribute("checked",""),i.addEventListener("os-checkbox-change",a=>{t(!!a.detail?.checked)}),i}const s=r("input",{type:"checkbox",on:{change:i=>t(i.target.checked)}});return s.checked=e,r("label",{class:"atfb-check",children:[s,r("span",{text:n})]})}function k(n,e,t="secondary",s){const i=[s?F(s):null,r("span",{text:n})];if(J("os-button")){const a=document.createElement("os-button");a.setAttribute("variant",t),a.setAttribute("type","button"),a.classList.add("atfb-button",`atfb-button--${t}`),a.addEventListener("click",e);for(const o of i)o&&a.append(o);return a}return r("button",{class:`atfb-button atfb-button--${t}`,type:"button",on:{click:e},children:i})}function J(n){return typeof customElements<"u"&&!!customElements.get(n)}const pt=["os-button","os-checkbox-label","os-number-field","os-select","os-option","os-segmented","os-segment","os-color-field","os-empty-state"];let se=null;function ft(){if(se)return se;const n=window.wp?.os;return se=n?.loadComponents?n.loadComponents(pt).catch(()=>{}):Promise.resolve(),se}async function he(n,e=""){const t=window.wp?.os;return t?.confirm?t.confirm({title:e,message:n,danger:!0}):window.confirm(n)}function I(n,e="",t="info"){const s=window.wp?.os;if(s?.notify){s.notify({title:n,body:e,type:t});return}console.info(`[AllTerrain Forms] ${n}${e?`: ${e}`:""}`)}function mt(n){let e=0,t;return(...s)=>{t=s,!e&&(e=window.requestAnimationFrame(()=>{e=0,n(...t)}))}}function De(n,e){let t=0;return(...s)=>{window.clearTimeout(t),t=window.setTimeout(()=>n(...s),e)}}function bt(n){try{return window.localStorage.getItem(n)??""}catch{return""}}function gt(n,e){try{window.localStorage.setItem(n,e)}catch{}}function Me(){const n=[window];try{window.parent&&window.parent!==window&&n.push(window.parent)}catch{}return n}function vt(n){const e=n.wp?.os?.windowManager?.getAll?.()??[];for(const t of e){const s=t.iframe??t.element?.querySelector?.("iframe");if(s&&s.contentWindow===window)return t}return null}const wt=4e3,yt=100;function xt(n,e){const t=Date.now()+wt,s=()=>{const i=vt(n);if(i&&i.id!==e){typeof i.close=="function"?i.close():n.wp?.os?.windowManager?.remove?.(i.id);return}!i&&Date.now()0?{form:t}:void 0;t>0&&Et(t);for(const i of Me())if(i.wp?.os?.openWindow?.(e,{source:"handoff",params:s})){window.setTimeout(()=>xt(i,e),0);return}}function kt(){document.addEventListener("click",n=>{const e=n.target?.closest?.("[data-atf-open-window]");if(!e)return;n.preventDefault();const t=e.getAttribute("data-atf-open-window")??"";for(const s of Me())if(s.wp?.os?.openWindow?.(t,{source:"handoff"}))return})}const St="allterrain-forms/requested-form";function Et(n){try{window.sessionStorage.setItem(St,String(n))}catch{}}const Oe={is:"is",is_not:"is not",contains:"contains",not_contains:"does not contain",starts_with:"starts with",ends_with:"ends with",greater:"is more than",less:"is less than",greater_equal:"is at least",less_equal:"is at most",empty:"is empty",not_empty:"has any answer"},Fe=["empty","not_empty"];function qe(n,e){const t=n.find(s=>s.id===e);return t?t.label||"an untitled question":null}function Ie(n,e,t){return n.find(a=>a.id===e)?.choices?.find(a=>a.value===t)?.label||t}function Lt(n,e){const t=Oe[n.operator]??String(n.operator);if(Fe.includes(n.operator))return t;const s=Ie(e,n.field,n.value);return`${n.operator==="is"?"":`${t} `}${s!==""?s:"(nothing)"}`}function Ne(n,e){const t=qe(e,n.field),s=Oe[n.operator]??String(n.operator);if(t===null)return[{kind:"field",text:"a question that no longer exists",fieldId:n.field,missing:!0}];const i=[{kind:"field",text:t,fieldId:n.field,missing:!1},{kind:"operator",text:s}];if(Fe.includes(n.operator))return i;const a=Ie(e,n.field,n.value);return i.push({kind:"value",text:a!==""?a:"(nothing)"}),i}function Ct(n,e){const t=n.logic;if(!t?.enabled||!t.rules.length)return[];const s=[{kind:"verb",text:t.action==="hide"?"Hidden when":"Shown when"}];return t.rules.forEach((i,a)=>{a>0&&s.push({kind:"join",text:t.match==="all"?"and":"or"}),s.push(...Ne(i,e))}),s}function Pe(n){return n.map(e=>e.text).join(" ")}function Tt(n,e){return Pe(Ne(n,e))}function ue(n){const e=[];for(const t of n){const s=t.logic;if(s?.enabled)for(const i of s.rules)!i.field||i.field===t.id||e.push({from:i.field,to:t.id,label:Tt(i,n),short:Lt(i,n),action:s.action,broken:qe(n,i.field)===null})}return e}function $t(n){const e=new Map,t=new Set;for(const s of ue(n)){const i=`${s.from}->${s.to}`;s.broken||t.has(i)||(t.add(i),e.set(s.from,(e.get(s.from)??0)+1))}return e}const Be=10,Re=22,z="http://www.w3.org/2000/svg";class At{constructor(e){this.edges=[],this.teardowns=[],this.frame=0,this.host=e,this.svg=document.createElementNS(z,"svg"),this.svg.setAttribute("class","atfb-logicmap"),this.svg.setAttribute("aria-hidden","true"),this.svg.setAttribute("focusable","false"),e.append(this.svg);const t=()=>this.schedule();window.addEventListener("resize",t),this.teardowns.push(()=>window.removeEventListener("resize",t));const s=e.closest(".atfb__canvas")??e;if(s.addEventListener("scroll",t,{passive:!0}),this.teardowns.push(()=>s.removeEventListener("scroll",t)),typeof ResizeObserver<"u"){const i=new ResizeObserver(t);i.observe(e),this.teardowns.push(()=>i.disconnect())}}setEdges(e){this.edges=e,this.schedule()}highlight(e){this.svg.classList.toggle("is-focused",!!e),this.svg.querySelectorAll("[data-from]").forEach(t=>{const s=e&&(t.dataset.from===e||t.dataset.to===e);t.classList.toggle("is-lit",!!s)})}destroy(){this.teardowns.forEach(e=>e()),this.teardowns=[],this.svg.remove(),this.frame&&cancelAnimationFrame(this.frame)}schedule(){this.frame||(this.frame=requestAnimationFrame(()=>{this.frame=0,this.draw()}))}draw(){this.svg.replaceChildren();const e=this.host.getBoundingClientRect();this.svg.setAttribute("viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttribute("width",String(e.width)),this.svg.setAttribute("height",String(e.height));const t=new Map;for(const s of this.edges){const i=this.cardRect(s.from),a=this.cardRect(s.to);if(!i||!a)continue;const o=t.get(s.from)??0;t.set(s.from,o+1),this.drawEdge(s,i,a,e,o)}}cardRect(e){const t=this.host.querySelector(`[data-atfb-card="${CSS.escape(e)}"]`);return t?t.getBoundingClientRect():null}drawEdge(e,t,s,i,a){const o=t.right-i.left,l=t.top+t.height/2-i.top,c=s.right-i.left,d=s.top+s.height/2-i.top,u=Math.max(0,i.width-Be-Math.max(o,c)),L=22+a*11+Math.min(22,Math.abs(d-l)/8),w=Math.max(12,Math.min(L,u*.4)),m=document.createElementNS(z,"path");m.setAttribute("d",`M ${o} ${l} C ${o+w} ${l}, ${c+w} ${d}, ${c} ${d}`),m.setAttribute("class",`atfb-logicmap__path is-${e.action}${e.broken?" is-broken":""}`),m.dataset.from=e.from,m.dataset.to=e.to;const y=document.createElementNS(z,"title");y.textContent=e.label,m.append(y);const S=document.createElementNS(z,"circle");S.setAttribute("cx",String(c)),S.setAttribute("cy",String(d)),S.setAttribute("r","3.5"),S.setAttribute("class",`atfb-logicmap__dot is-${e.action}${e.broken?" is-broken":""}`),S.dataset.from=e.from,S.dataset.to=e.to,this.svg.append(m,S);const E=document.createElementNS(z,"text");E.setAttribute("x",String(i.width-Be)),E.setAttribute("y",String(d+3)),E.setAttribute("text-anchor","end"),E.setAttribute("class","atfb-logicmap__label"),E.dataset.from=e.from,E.dataset.to=e.to,E.textContent=e.short.length>Re?`${e.short.slice(0,Re-1)}…`:e.short;const R=document.createElementNS(z,"title");R.textContent=e.label,E.append(R),this.svg.append(E)}}const Dt={text:"text",email:"text",url:"text",tel:"text",number:"text",password:"text",date:"text",time:"text",datetime:"text",date_range:"composite",textarea:"textarea",select:"select",country:"select",multiselect:"options",radio:"options",checkboxes:"options",image_choice:"options",quiz:"options",switch:"toggle",consent:"toggle",file:"file",range:"range",rating:"summary",scale:"summary",likert:"summary",signature:"summary",repeater:"summary",color:"text",name:"composite",address:"composite",total:"text",hidden:"static",heading:"static",html:"static",divider:"static",spacer:"static",page_break:"static"};function Mt(n){return Dt[n]??"text"}function He(n,e){const t=/^choice:(\d+):(label|value)$/.exec(e);return String(t?n.choices?.[Number(t[1])]?.[t[2]]??"":n[e]??"")}function H(n){const{value:e,onInput:t,onCommit:s}=n,i=r("span",{class:`${n.class} atfb-editable`,text:e,attrs:{contenteditable:"plaintext-only",role:"textbox",spellcheck:"false","data-placeholder":n.placeholder}});return n.bind&&(i.dataset.atfbBind=n.bind),i.addEventListener("pointerdown",a=>a.stopPropagation()),i.addEventListener("input",()=>t(i.textContent??"")),i.addEventListener("keydown",a=>{a.key==="Enter"&&(a.preventDefault(),i.blur()),a.key==="Escape"&&(i.textContent=e,i.blur()),a.stopPropagation()}),i.addEventListener("blur",()=>s?.()),i}function Ot(n){const e=r("input",{class:"atf-choice__input",type:n==="checkboxes"||n==="multiselect"?"checkbox":"radio"});return e.disabled=!0,e}function Ft(n,e,t){const s=Mt(n.type),i=H({value:n.label,placeholder:"Write the question…",class:"atf-label",bind:"label",onInput:o=>t.edit(l=>{l.label=o}),onCommit:()=>t.restructure(()=>{})}),a=[s==="static"||s==="toggle"?null:i,It(n,e,s,t),qt(n,e,t)];return r("div",{class:"atfb-preview atf-form",children:[r("div",{class:`atf-field atf-field--${n.type}`,children:a})]})}function qt(n,e,t){if(!e?.supports.includes("hint"))return null;const s=H({value:n.hint??"",placeholder:"Add a hint…",class:"atf-hint",bind:"hint",onInput:i=>t.edit(a=>{a.hint=i})});return s.setAttribute("aria-label","Hint"),r("p",{class:"atfb-preview__hint",children:[s]})}function It(n,e,t,s){switch(t){case"text":return pe(n,"atf-input",s);case"textarea":return pe(n,"atf-input atf-textarea",s,!0);case"select":return r("div",{class:"atfb-preview__select",children:[pe(n,"atf-input atf-select",s)]});case"options":return Pt(n,s);case"toggle":return r("div",{class:n.type==="switch"?"atf-toggle atf-toggle--switch":"atf-toggle",children:[(()=>{const i=r("input",{class:"atf-toggle__input",type:"checkbox"});return i.disabled=!0,i})(),H({value:n.label||"",placeholder:n.type==="consent"?"What are they agreeing to?…":"What does this turn on?…",class:"atf-toggle__label",bind:"label",onInput:i=>s.edit(a=>{a.label=i}),onCommit:()=>s.restructure(()=>{})})]});case"file":return r("div",{class:"atf-file",children:[r("input",{class:"atf-file__input",type:"file"})]});case"range":return r("input",{class:"atf-range__input",type:"range"});case"composite":return r("div",{class:"atf-composite__parts",children:[r("span",{class:"atf-input atfb-preview__ghost",text:""}),r("span",{class:"atf-input atfb-preview__ghost",text:""})]});case"static":return Bt(n,e,s);default:return r("div",{class:"atfb-preview__stack",children:[r("p",{class:"atfb-preview__summary",text:`${e?.label??n.type} — set this up in the panel on the right.`}),n.type==="repeater"?Nt(n,s):null]})}}function pe(n,e,t,s=!1){const i=H({value:n.placeholder??"",placeholder:n.type==="select"||n.type==="country"?"Choose…":"Placeholder…",class:`${e} atfb-preview__box${s?" atfb-preview__box--tall":""}`,bind:"placeholder",onInput:a=>t.edit(o=>{o.placeholder=a})});return i.setAttribute("aria-label","Placeholder"),i}function fe(n,e,t,s,i,a){return r("span",{class:`atf-button ${t} atfb-preview__button`,children:[H({value:n,placeholder:e,class:"atfb-preview__button-text",bind:s,onInput:o=>i.edit(l=>a(l,o))})]})}function Nt(n,e){return fe(String(n.addLabel??""),"Add another","atf-button--secondary","addLabel",e,(t,s)=>{t.addLabel=s})}function Pt(n,e){const t=r("div",{class:"atf-choices__list"});return(n.choices??[]).forEach((s,i)=>{t.append(r("div",{class:"atf-choice atfb-preview__option",children:[Ot(n.type),H({value:s.label,placeholder:"Option…",class:"atf-choice__label",bind:`choice:${i}:label`,onInput:a=>{e.edit(o=>{const l=o.choices?.[i];if(!l)return;const c=!l.value||l.value===l.label;l.label=a,c&&(l.value=a)})}}),r("button",{class:"atfb-preview__remove",type:"button",title:"Remove this option",attrs:{"aria-label":`Remove ${s.label||"this option"}`},on:{pointerdown:a=>a.stopPropagation(),click:a=>{a.stopPropagation(),e.restructure(o=>{o.choices.splice(i,1)})}},children:[r("span",{text:"×"})]})]}))}),t.append(r("button",{class:"atfb-preview__add",type:"button",on:{pointerdown:s=>s.stopPropagation(),click:s=>{s.stopPropagation(),e.restructure(i=>{const a=i.choices.length+1;i.choices.push({label:`Option ${a}`,value:`Option ${a}`})})}},children:[r("span",{text:"+ Add option"})]})),r("fieldset",{class:"atf-choices",children:[t]})}function Bt(n,e,t){return n.type==="heading"?H({value:n.label,placeholder:"Section heading…",class:"atf-heading",bind:"label",onInput:s=>t.edit(i=>{i.label=s}),onCommit:()=>t.restructure(()=>{})}):n.type==="divider"?r("hr",{class:"atf-divider"}):n.type==="page_break"?r("div",{class:"atfb-preview__stack",children:[r("p",{class:"atfb-progress-name",children:[H({value:n.label,placeholder:"Name this step…",class:"atf-progress__label",bind:"label",onInput:s=>t.edit(i=>{i.label=s}),onCommit:()=>t.restructure(()=>{})})]}),r("p",{class:"atfb-preview__summary",text:"Everything after this is a new page."}),r("div",{class:"atf-nav atfb-preview__nav",children:[fe(String(n.prevLabel??""),"Back","atf-button--secondary","prevLabel",t,(s,i)=>{s.prevLabel=i}),fe(String(n.nextLabel??""),"Next","","nextLabel",t,(s,i)=>{s.nextLabel=i})]})]}):r("p",{class:"atfb-preview__summary",text:`${e?.label??n.type} — nothing is shown to the visitor here.`})}const me=new Map;function be(n){let e=me.get(n);return e||(e=C.mergeTags(n).catch(()=>[]),me.set(n,e)),e}function Rt(n){me.delete(n)}function Ht(n){const e=new Map;for(const t of n)for(const s of t.items)e.set(s.tag,s);return e}function jt(n,e){const t=Ht(e);return n.replace(/\{[a-z_]+(?::[^}]*)?\}/gi,s=>{const i=t.get(s.toLowerCase());return i?i.sample:s})}function Wt(n){return/\{[a-z_]+(?::[^}]*)?\}/i.test(n)}let j=null;function K(){j?.remove(),j=null}typeof document<"u"&&(document.addEventListener("pointerdown",n=>{j&&!j.contains(n.target)&&K()}),document.addEventListener("keydown",n=>{n.key==="Escape"&&j&&(K(),n.stopPropagation())}));function Ut(n,e){const t=n.selectionStart??n.value.length,s=n.selectionEnd??n.value.length;n.value=n.value.slice(0,t)+e+n.value.slice(s);const i=t+e.length;n.setSelectionRange(i,i),n.focus(),n.dispatchEvent(new Event("input",{bubbles:!0}))}function Yt(n){let e=n.parentElement;for(;e&&e!==document.body;){const t=getComputedStyle(e).overflowY;if(t==="auto"||t==="scroll"||t==="hidden")return e.getBoundingClientRect().bottom;e=e.parentElement}return window.innerHeight}function zt(n,e){const t=r("input",{class:"atfb-input atfb-tagpick__search",type:"search",placeholder:"Search values…",attrs:{"aria-label":"Search values"}}),s=r("div",{class:"atfb-tagpick__list"}),i=a=>{s.replaceChildren();const o=a.trim().toLowerCase();let l=0;for(const c of n){const d=c.items.filter(u=>!o||u.label.toLowerCase().includes(o)||u.tag.toLowerCase().includes(o));if(!d.length){c.empty&&!o&&!c.items.length&&s.append(r("p",{class:"atfb-tagpick__group",text:c.label}),r("p",{class:"atfb-tagpick__empty",text:c.empty}));continue}s.append(r("p",{class:"atfb-tagpick__group",text:c.label}));for(const u of d)l+=1,s.append(r("button",{class:"atfb-tagpick__item",type:"button",on:{click:()=>{e(u.tag),K()}},children:[r("span",{class:"atfb-tagpick__item-main",children:[r("span",{class:"atfb-tagpick__label",text:u.label}),r("code",{class:"atfb-tagpick__tag",text:u.tag})]}),u.hint||u.sample?r("span",{class:"atfb-tagpick__meta",text:u.sample?`e.g. ${u.sample}`:u.hint}):null]}))}!l&&o&&s.append(r("p",{class:"atfb-tagpick__empty",text:`Nothing matches “${a}”.`}))};return i(""),t.addEventListener("input",()=>i(t.value)),r("div",{class:"atfb-tagpick",attrs:{role:"dialog","aria-label":"Insert a value"},children:[r("p",{class:"atfb-tagpick__intro",text:"Pick something to drop in. It is filled in when the form is submitted."}),t,s]})}function je(n,e){const t=r("button",{class:"atfb-button atfb-button--ghost atfb-tagpick__open",type:"button",title:"Insert a value from the submission",children:[F("shortcode"),r("span",{text:"Insert a value"})]}),s=r("div",{class:"atfb-taggable",children:[n,r("div",{class:"atfb-taggable__tools",children:[t]})]}),i=e.preview===!1?null:r("p",{class:"atfb-taggable__preview"});i&&s.append(i);const a=()=>{if(i){if(!Wt(n.value)){i.textContent="",i.hidden=!0;return}be(e.formId).then(o=>{i.hidden=!1,i.replaceChildren(r("span",{class:"atfb-taggable__preview-label",text:"Reads as"}),r("span",{text:jt(n.value,o)}))})}};return n.addEventListener("input",a),a(),t.addEventListener("click",o=>{if(o.stopPropagation(),j&&s.contains(j)){K();return}K(),be(e.formId).then(l=>{const c=zt(l,d=>{Ut(n,d),a()});s.append(c),j=c,(window.innerHeight-c.getBoundingClientRect().topYt(s))&&c.classList.add("atfb-tagpick--above"),c.querySelector(".atfb-tagpick__search")?.focus()})}),s}function We(n,e){const t=parseFloat(String(n??""));return Number.isFinite(t)?t:e}function Ue(n,e){let t=e[0];for(const s of e)Math.abs(s.at-n)n.accent??"#2271b1",apply:n=>({accent:n,"accent-soft":`color-mix( in srgb, ${n} 12%, transparent )`,"border-focus":n,"focus-ring-color":n,"button-bg":n,"button-bg-hover":`color-mix( in srgb, ${n} 88%, #000 )`})},{id:"roundness",label:"Roundness",hint:"Corners, everywhere at once.",kind:"scale",steps:ge.map(({value:n,label:e})=>({value:n,label:e})),owns:["radius-field","radius-button","radius-card","radius-check"],read:n=>Ue(We(n["radius-field"],4),ge),apply:n=>{const e=ge.find(t=>t.value===n)?.at??4;return{"radius-field":`${e}px`,"radius-button":`${e}px`,"radius-card":`${Math.min(e*2,28)}px`,"radius-check":`${Math.min(e,6)}px`}}},{id:"density",label:"Density",hint:"How much air the form has.",kind:"scale",steps:ve.map(({value:n,label:e})=>({value:n,label:e})),owns:["pad-field-x","pad-field-y","gap-fields","gap-label","button-pad-x","button-pad-y"],read:n=>Ue(We(n["pad-field-y"],9),ve),apply:n=>{const e=ve.find(t=>t.value===n)?.at??9;return{"pad-field-y":`${e}px`,"pad-field-x":`${Math.round(e*1.4)}px`,"gap-fields":`${Math.round(e*2.2)}px`,"gap-label":`${Math.max(4,Math.round(e*.7))}px`,"button-pad-y":`${e+2}px`,"button-pad-x":`${Math.round(e*2.2)}px`}}},{id:"shadow",label:"Depth",hint:"How far the form sits off the page.",kind:"scale",steps:Xt,owns:["shadow-field","shadow-field-focus","shadow-button","shadow-button-hover","shadow-card"],read:n=>{const e=n["shadow-card"]??"none";return e==="none"||e.trim()===""?n["shadow-field"]&&n["shadow-field"]!=="none"?"hard":"none":e.includes("0 1px")||e.includes("2px")?"subtle":"lifted"},apply:n=>{switch(n){case"subtle":return{"shadow-field":"none","shadow-field-focus":"none","shadow-button":"0 1px 2px rgba( 0, 0, 0, 0.12 )","shadow-button-hover":"0 2px 4px rgba( 0, 0, 0, 0.16 )","shadow-card":"0 1px 3px rgba( 0, 0, 0, 0.1 )"};case"lifted":return{"shadow-field":"none","shadow-field-focus":"0 4px 12px rgba( 0, 0, 0, 0.12 )","shadow-button":"0 4px 10px rgba( 0, 0, 0, 0.16 )","shadow-button-hover":"0 8px 20px rgba( 0, 0, 0, 0.2 )","shadow-card":"0 10px 30px rgba( 0, 0, 0, 0.14 )"};case"hard":return{"shadow-field":"3px 3px 0 currentColor","shadow-field-focus":"5px 5px 0 currentColor","shadow-button":"4px 4px 0 currentColor","shadow-button-hover":"2px 2px 0 currentColor","shadow-card":"none"};default:return{"shadow-field":"none","shadow-field-focus":"none","shadow-button":"none","shadow-button-hover":"none","shadow-card":"none"}}}},{id:"field-style",label:"Fields",hint:"How an input is drawn.",kind:"choice",steps:Gt,owns:["field-style"],read:n=>n["field-style"]??"outline",apply:n=>({"field-style":n})},{id:"labels",label:"Labels",hint:"Where the question sits relative to the answer.",kind:"choice",steps:Jt,owns:["label-position"],read:n=>n["label-position"]??"top",apply:n=>({"label-position":n})}]}function Kt(n){return Ye().find(e=>e.owns.includes(n))??null}function ze(n){let e=n.activeSlug,t={...n.overrides},s=n.themes;const i=r("div",{class:"atfs-preview__frame"}),a=r("div",{class:"atfs-controls__body"}),o=r("div",{class:"atfs-quick"}),l=r("div",{class:"atfs-themes"}),c=De(async()=>{try{const h=await n.previewFor(e,t);i.innerHTML=h,document.dispatchEvent(new CustomEvent("atf-refresh"))}catch(h){D(i),i.append(r("p",{class:"atfb-error",text:h instanceof Error?h.message:"Preview failed."}))}},180),d=h=>t[h.token]!==void 0?t[h.token]:s.find(b=>b.slug===e)?.resolved?.[h.token]??h.default,u=()=>{D(l);for(const h of s){const f=r("button",{class:`atfs-theme${h.slug===e?" is-active":""}`,type:"button",attrs:{"aria-pressed":h.slug===e,title:h.description},children:[r("span",{class:"atfs-theme__chip",style:{background:h.resolved.surface??"#fff",borderColor:h.resolved.border??"#ccc",borderRadius:h.resolved["radius-field"]??"4px",boxShadow:h.resolved["shadow-card"]??"none"},children:[r("span",{class:"atfs-theme__accent",style:{background:h.resolved.accent??"#2271b1",borderRadius:h.resolved["radius-button"]??"4px"}})]}),r("span",{class:"atfs-theme__name",text:h.label}),h.custom?r("span",{class:"atfb-badge",text:"yours"}):null],on:{click:()=>{e=h.slug,t={},n.onTheme(e),u(),m(),y(),c(),A()}}});l.append(f)}},L=()=>{const f={...s.find(b=>b.slug===e)?.resolved??{}};for(const[b,g]of Object.entries(t))f[b]=g;return f},w=(h,f)=>{const b=h.apply(f,L());for(const[g,x]of Object.entries(b))t[g]=x,n.onOverride(g,x);m(),y(),c()},m=()=>{D(o);const h=L();for(const f of Ye()){const b=f.read(h);let g;if(f.kind==="colour"){const x=r("input",{class:"atfs-color",type:"color",value:ye(b),attrs:{"aria-label":f.label},on:{input:q=>w(f,q.target.value)}});g=r("div",{class:"atfs-color-row",children:[x,v(b,q=>w(f,q))]})}else g=r("div",{class:`atfs-segmented atfs-segmented--${f.kind}`,attrs:{role:"group","aria-label":f.label},children:(f.steps??[]).map(x=>r("button",{class:`atfs-segment${x.value===b?" is-on":""}`,type:"button",text:x.label,attrs:{"aria-pressed":x.value===b},on:{click:()=>w(f,x.value)}}))});o.append(r("div",{class:"atfs-dial",children:[r("div",{class:"atfs-dial__head",children:[r("span",{class:"atfs-dial__label",text:f.label}),r("span",{class:"atfs-dial__hint",text:f.hint})]}),g]}))}},y=()=>{D(a);const h=new Map;for(const b of n.tokens){const g=h.get(b.group)??[];g.push(b),h.set(b.group,g)}const f={colour:"Colour",shape:"Corners and borders",shadow:"Shadows",fields:"Field style",space:"Spacing",type:"Type",labels:"Labels",button:"Buttons",focus:"Focus ring",motion:"Motion"};for(const[b,g]of h)a.append(r("details",{class:"atfs-group",attrs:{open:b==="colour"},children:[r("summary",{text:f[b]??b}),...g.map(x=>S(x))]}))},S=h=>{const f=d(h),b=M=>{M===""?delete t[h.token]:t[h.token]=M,n.onOverride(h.token,M),c()};let g;if(h.control==="color"){const M=r("input",{class:"atfs-color",type:"color",value:ye(f),attrs:{"aria-label":`${h.label} colour`},on:{input:G=>{const Z=G.target.value;ae.value=Z,b(Z)}}}),ae=v(f,G=>{M.value=ye(G),b(G)});g=r("div",{class:"atfs-color-row",children:[M,ae]})}else if(h.control==="select")g=$(f,(h.options??[]).map(M=>({value:M,label:M})),b);else if(h.control==="length"){const M=parseFloat(f)||0,ae=h.unit??"px",G=h.token.includes("radius")?60:80,Z=r("input",{class:"atfs-range",type:"range",value:String(M),attrs:{min:"0",max:String(G),step:"1","aria-label":h.label},on:{input:re=>{const rt=`${re.target.value}${ae}`;at.value=rt,b(rt)}}}),at=v(f,re=>{Z.value=String(parseFloat(re)||0),b(re)});g=r("div",{class:"atfs-length-row",children:[Z,at]})}else g=v(f,b);const x=p(h.label,g),q=Kt(h.token);return q&&(x.classList.add("is-dialled"),x.append(r("span",{class:"atfs-owned",text:q.label}))),t[h.token]!==void 0&&(x.classList.add("is-overridden"),x.append(r("button",{class:"atfs-reset",type:"button",text:"Reset",attrs:{"aria-label":`Reset ${h.label} to the theme's value`},on:{click:()=>{b(""),y()}}}))),x},E=async()=>{const h=s.find(g=>g.slug===e),f=h?`${h.label} (mine)`:"My theme",b=window.prompt("Name this theme",f);if(b)try{const g={};for(const q of n.tokens){const M=d(q);M!==q.default&&(g[q.token]=M)}const x=await C.saveTheme({label:b,tokens:g});s=[...s.filter(q=>q.slug!==x.slug),x],n.onThemesChanged(s),e=x.slug,t={},n.onTheme(e),u(),y(),c(),I("Theme saved",x.label)}catch(g){I("Could not save the theme",g instanceof Error?g.message:"","error")}},R=async()=>{const h=s.find(f=>f.slug===e);if(h?.custom&&await he(`Delete “${h.label}”? Forms using it fall back to Clean.`,"Delete theme"))try{await C.deleteTheme(h.id),s=s.filter(f=>f.slug!==h.slug),n.onThemesChanged(s),e="clean",t={},n.onTheme(e),u(),y(),c()}catch(f){I("Could not delete the theme",f instanceof Error?f.message:"","error")}},X=async()=>{const h=s.find(g=>g.slug===e),f={label:h?.label??e,tokens:{...h?.tokens??{},...t}},b=JSON.stringify(f,null," ");try{await navigator.clipboard.writeText(b),I("Theme copied","Paste it into another site to import it.")}catch{window.prompt("Copy this theme",b)}},ie=()=>{const h=window.prompt("Paste a theme");if(h)try{const f=JSON.parse(h);if(!f.tokens||typeof f.tokens!="object")throw new Error("That does not look like a theme.");for(const[b,g]of Object.entries(f.tokens))t[b]=String(g),n.onOverride(b,String(g));y(),c()}catch(f){I("Could not read that theme",f instanceof Error?f.message:"","error")}},_=k("Delete",()=>void R(),"danger"),A=()=>{const h=s.find(f=>f.slug===e);_.hidden=!h?.custom};return u(),m(),y(),c(),A(),r("div",{class:"atf-studio",children:[r("div",{class:"atf-studio__top",children:[r("div",{class:"atf-studio__picker",children:[r("h2",{class:"atf-studio__heading",text:"Theme"}),l]}),r("div",{class:"atfs__actions",children:[k("Save as a theme",()=>void E(),"primary"),k("Export",()=>void X()),k("Import",ie),_]})]}),r("div",{class:"atf-studio__panes",children:[r("aside",{class:"atf-studio__controls",children:[r("p",{class:"atfb-hint",text:"Changes apply to this form only, until you save them as a theme."}),o,r("details",{class:"atfs-advanced",children:[r("summary",{text:"Every setting"}),r("p",{class:"atfb-hint",text:"The full token list. The dials above write into it."}),a]})]}),r("main",{class:"atf-studio__preview",children:[r("h2",{class:"screen-reader-text",text:"Live preview"}),i]})]})]})}async function we(){const n=document.querySelector("[data-atfs-root]");if(!n||n.dataset.atfsMounted)return;n.dataset.atfsMounted="1";const e=n.querySelector("[data-atfs-bar]"),t=n.querySelector(".atfs__body")??n;try{const[s,i,a]=await Promise.all([C.config(),C.listThemes(),C.listForms()]);if(!a.length){D(t),t.append(r("div",{class:"atfb-empty",children:[r("h2",{text:"No forms to preview"}),r("p",{text:"Make a form first — a theme needs something to dress."})]}));return}let o=a[0],l={},c=o.theme;const d=()=>{D(t),t.append(ze({themes:i,tokens:s.tokens,activeSlug:c,overrides:l,standalone:!0,onTheme:u=>{c=u},onOverride:(u,L)=>{L===""?delete l[u]:l[u]=L},previewFor:async(u,L)=>{const w=await C.getForm(o.id);w.schema.settings.theme=u,w.schema.settings.themeOverrides=L;const{html:m}=await C.preview(o.id,{schema:w.schema,theme:u});return m},onThemesChanged:u=>{i.length=0,i.push(...u)}}))};e&&(D(e),e.append(r("span",{class:"atfs__label",text:"Preview against"}),$(String(o.id),a.map(u=>({value:String(u.id),label:u.title||"(untitled)"})),u=>{o=a.find(L=>String(L.id)===u)??a[0],l={},d()}))),d()}catch(s){D(t),t.append(r("p",{class:"atfb-error",text:s instanceof Error?s.message:"Could not load themes."}))}}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>void we()):we(),document.addEventListener("os-window-content-loaded",()=>void we()));function ye(n){const e=n.trim();return/^#[0-9a-f]{6}$/i.test(e)?e:/^#[0-9a-f]{3}$/i.test(e)?`#${e[1]}${e[1]}${e[2]}${e[2]}${e[3]}${e[3]}`:"#888888"}function xe(){return window.wp?.os??null}const Xe="allterrain-forms/preview",_e="allterrain-forms-preview";function Vt(n){const e=xe();if(!e?.registerTitleBarButton)return()=>{};const t=()=>{try{e.registerTitleBarButton({id:Xe,label:"Preview this form",icon:"dashicons-visibility",placement:"right",order:90,match:s=>{const i=s?.id??s?.config?.id??"";return i==="allterrain-forms"||i.startsWith("allterrain-forms#")},onClick:()=>void Ge(n),owner:"allterrain-forms-builder"})}catch{}};return e.ready?e.ready(t):t(),()=>{try{e.unregisterTitleBarButton?.(Xe)}catch{}}}async function Ge(n){n.isDirty()&&await n.save();const e=n.current();e&&Je(e.id,e.title,e.previewUrl)}function Je(n,e,t){const s=xe();if(!s?.windowManager?.open){window.open(t,"_blank","noopener");return}s.windowManager.open({id:`${_e}-${n}`,baseId:_e,url:t,title:`Preview: ${e}`,icon:"dashicons-visibility"})}function Qt(n,e,t){if(!xe()?.windowManager?.open||!document.querySelector(`[data-window-id^="${_e}-${n}"]`))return;const a=t.includes("?")?"&":"?";Je(n,e,`${t}${a}atf_r=${Date.now()}`)}const Zt="allterrain-forms/form";function es(){return window.wp?.os?.relations??null}function ts(n){const e=n.closest("[data-window-id], .os-window");if(!e)return null;const t=e.getAttribute("data-window-id");if(t)return t;const s=e.id??"";return s?s.replace(/^wp-window-/,""):null}const ss=6e3,Ke=120;function Ve(n,e){const t=es();if(ke.set(n,e),!t?.set)return;const s=a=>{if(ne.get(n)!==i)return;const o=ts(n);if(!o){Date.now()s(a),Ke);return}try{t.set(o,e)}catch(c){Qe||(Qe=!0,console.error("[AllTerrain Forms] The shell refused a window identity.",c,e)),ne.delete(n);return}if(!e||t.get?.(o)?.id===e.id||Date.now()>=a){ne.delete(n);return}window.setTimeout(()=>s(a),Ke)},i=Symbol("atf-identity");ne.set(n,i),s(Date.now()+ss)}let Qe=!1;const ne=new WeakMap,ke=new Map;function ns(){for(const[n,e]of ke){if(!n.isConnected){ke.delete(n);continue}Ve(n,e)}}if(typeof document<"u")for(const n of["os-window-content-loaded","os-window-opened"])document.addEventListener(n,()=>ns());function is(n,e){return{type:Zt,id:n.id,label:n.title||"Untitled form",related:[{id:`allterrain-forms/entries-${n.id}`,label:"Entries for this form",url:`${e}admin.php?page=allterrain-forms-entries&form=${n.id}`,group:"allterrain-forms",groupLabel:"Forms",icon:"dashicons-list-view"}]}}const V="allterrain-forms/field",as=["openstation/file","desktop-mode/file","openstation/attachment"],Ze="allterrain-forms/logic-map-v2";function B(n,e){return n.dataset.atfbBind=e,n}const et={level:{key:"level",label:"Heading level",control:"select",hint:"Headings should step down one at a time.",options:[{value:"2",label:"Heading 2"},{value:"3",label:"Heading 3"},{value:"4",label:"Heading 4"},{value:"5",label:"Heading 5"},{value:"6",label:"Heading 6"}]},content:{key:"content",label:"HTML",control:"textarea",hint:"Shown as written. Scripts are stripped when the form is saved."},consenttext:{key:"consentText",label:"What they are agreeing to",control:"textarea",hint:"Shown beside the tick box. Links are allowed."},height:{key:"height",label:"Height",control:"number",hint:"In pixels."},columns:{key:"columns",label:"Columns",control:"number",hint:"How many pictures sit side by side."},multiple:{key:"multiple",label:"Let them choose more than one",control:"checkbox"},inline:{key:"inline",label:"Lay the options out in a row",control:"checkbox"},other:{key:"other",label:"Offer an “Other” box",control:"checkbox",hint:"Adds a final option with a box to type in."},filetypes:{key:"filetypes",label:"Accepted file types",control:"commas",hint:"Extensions, separated by commas. Empty accepts anything the site allows."},maxsize:{key:"maxsize",label:"Largest file",control:"number",hint:"In megabytes."},maxfiles:{key:"maxfiles",label:"How many files",control:"number"},minrows:{key:"minRows",label:"Fewest rows",control:"number",also:{key:"maxRows",label:"Most rows"}},endlabels:{key:"minLabel",label:"Label at the low end",control:"text",also:{key:"maxLabel",label:"Label at the high end"}},points:{key:"points",label:"Points if correct",control:"number"},minchoices:{key:"minChoices",label:"Fewest they may pick",control:"number",also:{key:"maxChoices",label:"Most they may pick"}}},rs={label:"the canvas edits it in place, and the inspector mirrors it",placeholder:"edited by typing into the control on the canvas",hint:"edited under the control on the canvas",nextlabel:"edited on the page break’s own Next button",prevlabel:"edited on the page break’s own Back button",addlabel:"edited on the repeater’s own Add button",choices:"the choices editor, and the option list on the canvas",required:"the toggle on the card",width:"its own row",css:"its own row",prefill:"its own section",logic:"the conditional logic section",formula:"its own row, with the currency that goes with it",currency:"rendered with the formula",correct:"the choices editor marks the right answer",default:"its own row, typed to match what the field stores",rows:"a row count on a textarea; the statement list on a Likert matrix",parts:"a tick box per part, listed by the server",min:"the validation section, paired with max",max:"the validation section, paired with min",step:"the validation section",minlength:"the validation section, paired with maxlength",maxlength:"the validation section, paired with minlength",mindate:"the validation section, paired with maxdate",maxdate:"the validation section, paired with mindate",mintime:"the validation section, paired with maxtime",maxtime:"the validation section, paired with mintime",pattern:"the validation section",unique:"the validation section",maxchoices:"rendered with minchoices",maxrows:"rendered with minrows"};function tt(n,e,t){const s=n[e.key],i=a=>t(e.key,a);if(e.control==="checkbox")return T(e.label,!!s,i);if(e.control==="commas"){const a=Array.isArray(s)?s:[];return p(e.label,v(a.join(", "),o=>{i(o.split(",").map(l=>l.trim().replace(/^\./,"").toLowerCase()).filter(Boolean))}),e.hint)}return e.control==="select"?p(e.label,$(String(s??""),e.options??[],i),e.hint):e.control==="textarea"?p(e.label,te(String(s??""),i),e.hint):e.control==="number"?p(e.label,N(String(s??""),i),e.hint):p(e.label,B(v(String(s??""),i),e.key),e.hint)}function st(n,e){const t=new Set(n.map(i=>i.key).filter(Boolean));let s=n.length+1;return e.split(` -`).map(i=>i.trim()).filter(Boolean).map((i,a)=>{const o=n[a]?.key;if(o)return{key:o,label:i};for(;t.has(`r${s}`);)s+=1;return t.add(`r${s}`),{key:`r${s}`,label:i}})}const Se=[{value:"user:email",label:"Their email address",group:"About the person filling it in",tag:"{user:email}"},{value:"user:display_name",label:"Their name",group:"About the person filling it in",tag:"{user:display_name}"},{value:"user:first_name",label:"Their first name",group:"About the person filling it in"},{value:"user:last_name",label:"Their last name",group:"About the person filling it in"},{value:"user:login",label:"Their username",group:"About the person filling it in"},{value:"date:today",label:"Today’s date",group:"The date and time",tag:"{date}"},{value:"date:now",label:"The time right now",group:"The date and time",tag:"{time}"},{value:"site",label:"This site’s name",group:"About this site",tag:"{site}"},{value:"site:url",label:"This site’s address",group:"About this site",tag:"{site:url}"},{value:"site:admin_email",label:"The site administrator’s email",group:"About this site",tag:"{admin_email}"}],os=["About the person filling it in","The date and time","About this site"],Ee=(n,e)=>O?.i18n?.[n]??e;class nt{constructor(e){this.config=null,this.themes=[],this.forms=[],this.form=null,this.schema=null,this.selected=null,this.tab="build",this.logicMap=null,this.canvasTheme=r("style"),this.canvasThemeSignature="",this.openSections=new Map,this.logicMapOn=bt(Ze)!=="off",this.dirty=!1,this.teardowns=[],this.history=[],this.historyAt=-1,this.autosave=De(()=>{this.save(!0)},2500),this.renderInspector=mt(()=>{if(D(this.inspector),!this.schema||(this.root.classList.toggle("atfb--build-only-panes",this.tab!=="build"),this.tab!=="build"))return;const t=this.schema.fields.find(o=>o.id===this.selected);if(!t){this.inspector.append(r("div",{class:"atfb-placeholder",children:[r("p",{text:"Select a field to change it."}),r("p",{class:"atfb-hint",text:"Drag a field from the palette, or press one to add it to the end."})]}));return}const s=this.config?.fieldTypes.find(o=>o.type===t.type),i=s?.supports??[],a=(o,l)=>{t[o]=l,this.markDirty(),this.renderCanvas()};this.inspector.append(r("h3",{class:"atfb-inspector__title",text:s?.label??t.type}),r("p",{class:"atfb-hint",text:`Reference this field as {field:${t.id}}`})),i.includes("label")&&this.inspector.append(p("Label",B(v(t.label,o=>a("label",o)),"label"))),i.includes("placeholder")&&this.inspector.append(p("Placeholder",B(v(t.placeholder,o=>a("placeholder",o)),"placeholder"))),i.includes("hint")&&this.inspector.append(p("Hint",B(v(t.hint,o=>a("hint",o)),"hint"),"Shown under the field, and read out with it.")),i.includes("nextlabel")&&this.inspector.append(p("Next button",B(v(String(t.nextLabel??""),o=>a("nextLabel",o)),"nextLabel"),"Leave empty for “Next”.")),i.includes("prevlabel")&&this.inspector.append(p("Back button",B(v(String(t.prevLabel??""),o=>a("prevLabel",o)),"prevLabel"),"Leave empty for “Back”.")),i.includes("addlabel")&&this.inspector.append(p("Add button",B(v(String(t.addLabel??""),o=>a("addLabel",o)),"addLabel"),"Leave empty for “Add another”.")),i.includes("required")&&this.inspector.append(T("Required",t.required,o=>a("required",o))),i.includes("width")&&this.inspector.append(p("Width",$(t.width,[{value:"full",label:"Full width"},{value:"two-thirds",label:"Two thirds"},{value:"half",label:"Half"},{value:"third",label:"One third"},{value:"quarter",label:"One quarter"}],o=>a("width",o)))),s?.choices&&this.inspector.append(this.renderChoicesEditor(t,a)),this.renderTypeSettings(t,s,i,a),(t.type==="total"||i.includes("formula"))&&this.inspector.append(p("Formula",v(String(t.formula??""),o=>a("formula",o)),"Reference fields with braces: {f1} * {f2} + 10. Functions: min, max, sum, avg, round, ceil, floor, abs, sqrt, pow."),p("Currency symbol",v(String(t.currency??""),o=>a("currency",o)))),this.inspector.append(this.renderValidationSection(t,i,a)),this.inspector.append(this.renderLogicSection(t,a)),i.includes("prefill")&&this.inspector.append(this.prefillControl(t,a)),i.includes("css")&&this.inspector.append(p("CSS class",v(t.cssClass,o=>a("cssClass",o))))}),this.root=e,this.bar=e.querySelector("[data-atfb-bar]")??r("div"),this.palette=e.querySelector("[data-atfb-palette]")??r("div"),this.canvas=e.querySelector("[data-atfb-canvas]")??r("div"),this.inspector=e.querySelector("[data-atfb-inspector]")??r("div")}async start(){try{const[s,i,a]=await Promise.all([C.config(),C.listThemes(),C.listForms()]);this.config=s,this.themes=i,this.forms=a}catch(s){this.fail(s);return}this.teardowns.push(dt([V])),this.teardowns.push(Vt({current:()=>this.form?{id:this.form.id,title:this.form.title,previewUrl:this.form.previewUrl}:null,isDirty:()=>this.dirty,save:()=>this.save(!0)}));const e=s=>{this.dirty&&(s.preventDefault(),s.returnValue="")};window.addEventListener("beforeunload",e),this.teardowns.push(()=>window.removeEventListener("beforeunload",e));const t=s=>{!(s.metaKey||s.ctrlKey)||s.key.toLowerCase()!=="z"||s.target?.closest("input, textarea, [contenteditable]")||(s.preventDefault(),this.travel(s.shiftKey?1:-1))};this.root.addEventListener("keydown",t),this.teardowns.push(()=>this.root.removeEventListener("keydown",t)),this.renderBar(),this.renderPalette(),this.forms.length?await this.open(this.forms[0].id):this.renderFormsList()}destroy(){this.teardowns.forEach(e=>e()),this.teardowns=[]}fail(e){D(this.bar),this.bar.append(r("p",{class:"atfb-error",text:e instanceof Error?e.message:"Something went wrong loading your forms."}))}renderBar(){D(this.bar);const e=$(String(this.form?.id??""),[...this.forms.map(i=>({value:String(i.id),label:i.title||"(untitled)"}))],i=>void this.open(Number(i)));e.setAttribute("aria-label","Choose a form");const t=r("input",{class:"atfb-title",type:"text",value:this.form?.title??"",placeholder:"Untitled form",attrs:{"aria-label":"Form title"},on:{input:i=>{this.form&&(this.form.title=i.target.value,this.markDirty())}}}),s=r("div",{class:"atfb-tabs",attrs:{role:"tablist"},children:[["build","Build"],["theme","Theme"],["settings","Settings"],["notify","Notifications"],["confirm","Confirmations"]].map(([i,a])=>r("button",{class:`atfb-tab${this.tab===i?" is-active":""}`,type:"button",text:a,attrs:{role:"tab","aria-selected":this.tab===i},on:{click:()=>{this.tab=i,this.renderBar(),this.renderInspector(),this.renderCanvas()}}}))});this.bar.append(r("div",{class:"atfb-bar__left",children:[this.forms.length>1?e:null,t]}),s,r("div",{class:"atfb-bar__right",children:[this.historyButton("undo","Undo",-1),this.historyButton("redo","Redo",1),k("New",()=>void this.showTemplates(),"secondary","plus-alt2"),k("Export",()=>void this.exportForm(),"secondary","download"),k("Import",()=>void this.importForm(),"secondary","upload"),k("Preview",()=>void this.preview(),"secondary","visibility"),k("Entries",()=>this.openEntries(),"secondary","list-view"),this.logicMapButton(),this.saveButton()]}))}liveField(e){return this.schema?.fields.find(t=>t.id===e)}syncCanvas(e){const t=this.canvas.querySelector(`[data-atfb-card="${CSS.escape(e.id)}"]`);if(t)for(const s of t.querySelectorAll(".atfb-editable[data-atfb-bind]")){const i=He(e,s.dataset.atfbBind??"");s.textContent!==i&&(s.textContent=i)}}syncInspector(e){if(this.selected===e.id)for(const t of this.inspector.querySelectorAll("[data-atfb-bind]")){const s=He(e,t.dataset.atfbBind??"");t.value!==s&&("value"in t?t.value=s:t.setAttribute("value",s))}}rebindCanvas(){const e=document.activeElement;if(e instanceof HTMLElement&&this.canvas.contains(e)){e.addEventListener("blur",()=>this.rebindCanvas(),{once:!0});return}this.renderCanvas()}snapshot(){if(!this.schema)return;const e=JSON.stringify(this.schema);this.history[this.historyAt]!==e&&(this.history=this.history.slice(0,this.historyAt+1),this.history.push(e),this.history.length>60&&this.history.shift(),this.historyAt=this.history.length-1)}travel(e){const t=this.historyAt+e;!this.schema||t<0||t>=this.history.length||(this.historyAt=t,this.schema=JSON.parse(this.history[t]),this.schema.fields.some(s=>s.id===this.selected)||(this.selected=null),this.dirty=!0,this.autosave(),this.renderBar(),this.renderCanvas(),this.renderInspector())}historyButton(e,t,s){const i=this.historyAt+s,a=k(t,()=>this.travel(s),"secondary",e);return a.disabled=i<0||i>=this.history.length,a}exportForm(){if(!this.form||!this.schema)return;const e={plugin:"allterrain-forms",version:O?.version??"",title:this.form.title,schema:this.schema},t=new Blob([JSON.stringify(e,null," ")],{type:"application/json"}),s=URL.createObjectURL(t),i=r("a",{href:s,attrs:{download:`${this.form.title.replace(/[^a-z0-9]+/gi,"-").toLowerCase()||"form"}.json`}});document.body.append(i),i.click(),i.remove(),window.setTimeout(()=>URL.revokeObjectURL(s),1e3)}async importForm(){const e=r("input",{type:"file",attrs:{accept:"application/json,.json"}});e.addEventListener("change",async()=>{const t=e.files?.[0];if(t)try{const s=JSON.parse(await t.text());if(!s.schema)throw new Error("That file does not contain a form.");const i=await C.createForm({title:s.title??t.name.replace(/\.json$/i,""),schema:s.schema});this.forms.unshift({id:i.id,title:i.title,status:i.status,modified:i.modified,fields:i.schema.fields.length,theme:i.schema.settings.theme,entries:0,unread:0,views:0,submissions:0,shortcode:i.shortcode}),this.form=i,this.schema=i.schema,this.selected=null,this.dirty=!1,this.history=[],this.historyAt=-1,this.snapshot(),this.renderBar(),this.renderCanvas(),this.renderInspector(),I("Form imported",i.title)}catch(s){I("Could not import that file",s instanceof Error?s.message:"","error")}}),e.click()}saveButton(){const e=k("Save",()=>void this.save(),"primary");return e.disabled=!this.dirty,e.setAttribute("data-atfb-save",""),e}markDirty(){this.dirty=!0;const e=this.bar.querySelector("[data-atfb-save]");e&&(e.disabled=!1),this.autosave()}async save(e=!1){if(!(!this.form||!this.schema))try{const t=await C.updateForm(this.form.id,{title:this.form.title,schema:this.schema});this.form=t,this.schema=t.schema,this.dirty=!1,this.rebindCanvas(),Rt(t.id);const s=this.forms.find(a=>a.id===t.id);s&&(s.title=t.title);const i=this.bar.querySelector("[data-atfb-save]");i&&(i.disabled=!0),Qt(t.id,t.title,t.previewUrl),e||I("Form saved",t.title)}catch(t){I(Ee("saveFailed","Could not save"),t instanceof Error?t.message:"","error")}}async open(e){if(!(this.dirty&&!await he("You have unsaved changes. Discard them?"))){try{this.form=await C.getForm(e),this.schema=this.form.schema,this.selected=null,this.dirty=!1,this.history=[],this.historyAt=-1,this.snapshot()}catch(t){this.fail(t);return}this.renderBar(),this.renderCanvas(),this.renderInspector(),this.announceIdentity()}}announceIdentity(){this.form&&Ve(this.root,is(this.form,O?.adminUrl??""))}async showTemplates(){if(!this.config)return;const e=r("div",{class:"atfb-overlay"}),t=()=>e.remove(),s=r("div",{class:"atfb-templates",children:this.config.templates.map(i=>r("button",{class:"atfb-template",type:"button",on:{click:async()=>{t();try{const a=await C.createForm({template:i.slug});this.forms.unshift({id:a.id,title:a.title,status:a.status,modified:a.modified,fields:a.schema.fields.length,theme:a.schema.settings.theme,entries:0,unread:0,views:0,submissions:0,shortcode:a.shortcode}),this.form=a,this.schema=a.schema,this.selected=null,this.dirty=!1,this.renderBar(),this.renderCanvas(),this.renderInspector(),this.announceIdentity()}catch(a){I("Could not create the form",a instanceof Error?a.message:"","error")}}},children:[F(i.icon),r("strong",{text:i.label}),r("span",{text:i.description})]}))});e.append(r("div",{class:"atfb-modal",attrs:{role:"dialog","aria-label":"Start a new form"},children:[r("h2",{text:"Start a new form"}),s,r("div",{class:"atfb-modal__actions",children:[k("Cancel",t)]})]})),e.addEventListener("click",i=>{i.target===e&&t()}),document.addEventListener("keydown",i=>{i.key==="Escape"&&t()},{once:!0}),this.root.append(e),s.querySelector("button")?.focus()}renderFormsList(){D(this.canvas),this.canvas.append(r("div",{class:"atfb-empty",children:[r("h2",{text:"No forms yet"}),r("p",{text:"Start from a template, or build one from nothing."}),k("New form",()=>void this.showTemplates(),"primary","plus-alt2")]}))}openEntries(){const e=window.wp?.os;if(e?.openWindow){e.openWindow("allterrain-forms-entries");return}window.location.assign(`${O?.adminUrl??""}admin.php?page=allterrain-forms-entries`)}renderPalette(){if(!this.config)return;D(this.palette);const e=new Map;for(const s of this.config.fieldTypes){const i=e.get(s.group)??[];i.push(s),e.set(s.group,i)}const t=r("input",{class:"atfb-input atfb-palette__search",type:"search",placeholder:"Search fields",attrs:{"aria-label":"Search field types"},on:{input:s=>{const i=s.target.value.toLowerCase().trim();this.palette.querySelectorAll(".atfb-chip").forEach(a=>{const o=(a.textContent??"").toLowerCase();a.hidden=i!==""&&!o.includes(i)}),this.palette.querySelectorAll(".atfb-group").forEach(a=>{const o=Array.from(a.querySelectorAll(".atfb-chip")).some(l=>!l.hidden);a.hidden=!o})}}});this.palette.append(t);for(const[s,i]of Object.entries(this.config.groups)){const a=e.get(s);a?.length&&this.palette.append(r("div",{class:"atfb-group",children:[r("h3",{class:"atfb-group__title",text:i}),r("div",{class:"atfb-group__items",children:a.map(o=>this.paletteChip(o))})]}))}}paletteChip(e){const t=r("button",{class:"atfb-chip",type:"button",title:e.description,attrs:{"data-atf-type":e.type},children:[F(e.icon),r("span",{text:e.label})]});return t.addEventListener("pointerdown",s=>{const i=r("div",{class:"atfb-chip atfb-chip--ghost",children:[F(e.icon),r("span",{text:e.label})]});U().start({payload:Te(V,t,{fieldType:e.type,isNew:!0},s,i),origin:s,onClickOnly:()=>this.addField(e.type)})}),t.addEventListener("click",s=>{U().recentlyEndedDrag()&&s.preventDefault()}),t}renderCanvas(){if(D(this.canvas),!this.schema||!this.form){this.renderFormsList();return}if(this.tab!=="build"){this.canvas.append(this.renderTabCanvas());return}const e=r("div",{class:"atfb-canvas__list",attrs:{"data-atfb-list":""}});this.schema.fields.length||e.append(r("div",{class:"atfb-placeholder",text:Ee("emptyCanvas","Drag a field from the left to begin.")})),this.schema.fields.forEach((s,i)=>{e.append(this.renderFieldCard(s,i))});const t=r("div",{class:"atfb-canvas__inner",children:[r("p",{class:"atfb-shortcode",text:this.form.shortcode,title:"Paste this anywhere to place the form"}),e]});this.canvas.append(t),this.registerCanvasTarget(e),this.paintLogicMap(t),this.paintCanvasTheme()}prefillControl(e,t){const s=e.prefill.startsWith("query:"),i=Se.some(w=>w.value===e.prefill),a=s?"query":i&&e.prefill||(e.prefill?"custom":""),o=r("div",{class:"atfb-prefill__detail"}),l=r("p",{class:"atfb-row__hint atfb-prefill__preview"}),c=w=>{if(o.replaceChildren(),l.replaceChildren(),w==="query"){const m=e.prefill.startsWith("query:")?e.prefill.slice(6):"";o.append(v(m,y=>{const S=y.trim();t("prefill",S?`query:${S}`:""),d(`query:${S}`)},"utm_source"),r("p",{class:"atfb-row__hint",text:"The name of the parameter in the link people arrive on."}))}w==="custom"&&o.append(v(e.prefill,m=>{t("prefill",m),d(m)},"myplugin:something"),r("p",{class:"atfb-row__hint",text:"For a source another plugin has added through atf_resolve_prefill."})),d(e.prefill)},d=w=>{if(l.replaceChildren(),!w)return;if(w.startsWith("query:")){const y=w.slice(6);y&&(l.textContent=`A visit to …/your-page/?${y}=abc opens the form with “abc” in it.`);return}const m=Se.find(y=>y.value===w)?.tag;m&&be(this.form?.id??0).then(y=>{for(const S of y)for(const E of S.items)if(E.tag===m){const R=w.startsWith("user:");if(!E.sample){l.textContent="Empty unless the visitor is signed in.";return}l.textContent=R?`Opens with “${E.sample}” for you — empty for a visitor who is not signed in.`:`Opens with “${E.sample}”.`;return}})};c(a);const u=r("select",{class:"atfb-input atfb-select",on:{change:w=>{const m=w.target.value;t("prefill",m==="query"||m==="custom"?"":m),c(m)}}});u.append(r("option",{value:"",text:"Nothing — leave it empty",attrs:{selected:a===""}}));for(const w of os){const m=document.createElement("optgroup");m.label=w;for(const y of Se.filter(S=>S.group===w))m.append(r("option",{value:y.value,text:y.label,attrs:{selected:y.value===a}}));u.append(m)}const L=document.createElement("optgroup");return L.label="From the link they arrived on",L.append(r("option",{value:"query",text:"A parameter in the web address",attrs:{selected:a==="query"}})),u.append(L,r("option",{value:"custom",text:"Something else (advanced)",attrs:{selected:a==="custom"}})),p("Pre-fill this with",r("div",{class:"atfb-prefill",children:[u,o,l]}),"What the box already contains when the form opens. They can still change it.")}renderCondition(e){const t=e.some(s=>s.kind==="field"&&s.missing);return r("span",{class:`atfb-cond${t?" is-broken":""}`,attrs:{"aria-label":Pe(e)},children:[F("randomize"),...e.map(s=>this.renderConditionToken(s))]})}renderConditionToken(e){return e.kind==="field"&&!e.missing?r("button",{class:"atfb-cond__chip atfb-cond__chip--field",type:"button",text:e.text,title:"Go to this question",on:{click:i=>{i.stopPropagation(),this.selectField(e.fieldId),this.canvas.querySelector(`[data-atfb-card="${CSS.escape(e.fieldId)}"]`)?.scrollIntoView({block:"nearest",behavior:"smooth"})}}}):r("span",{class:{verb:"atfb-cond__verb",field:"atfb-cond__chip atfb-cond__chip--missing",operator:"atfb-cond__op",value:"atfb-cond__chip atfb-cond__chip--value",join:"atfb-cond__join"}[e.kind],text:e.text})}section(e,t,s,i=!1){const a=r("details",{class:"atfb-section",attrs:{open:this.openSections.get(e)??i},children:[r("summary",{text:t}),...s]});return a.addEventListener("toggle",()=>this.openSections.set(e,a.open)),a}logicMapButton(){const e=ue(this.schema?.fields??[]).length>0,t=k(this.logicMapOn?"Hide logic":"Show logic",()=>{this.logicMapOn=!this.logicMapOn,gt(Ze,this.logicMapOn?"on":"off"),this.renderBar(),this.renderCanvas()},this.logicMapOn?"primary":"secondary","randomize");return t.title="Draw a line from each question to the ones it decides.",t.hidden=!e,t}paintLogicMap(e){this.logicMap?.destroy(),this.logicMap=null;const t=this.schema?.fields??[],s=ue(t);if(!s.length||!this.logicMapOn)return;e.classList.add("has-logicmap");const i=new At(e);i.setEdges(s),i.highlight(this.selected??""),this.logicMap=i,e.addEventListener("pointerover",a=>{const o=a.target.closest("[data-atfb-card]");i.highlight(o?.dataset.atfbCard??this.selected??"")}),e.addEventListener("pointerleave",()=>i.highlight(this.selected??""))}renderFieldCard(e,t){const s=this.config?.fieldTypes.find(d=>d.type===e.type),i=this.selected===e.id,a=this.schema?.fields??[],o=Ct(e,a),l=$t(a).get(e.id)??0,c=r("div",{class:`atfb-card${i?" is-selected":""}`,attrs:{"data-atfb-card":e.id,"data-index":t,tabindex:"0",role:"button","aria-pressed":i,"aria-label":`${e.label||s?.label||e.type}, ${t+1} of ${this.schema?.fields.length??0}`},children:[r("div",{class:"atfb-card__grip",attrs:{"aria-hidden":"true"},children:[F("menu")]}),r("div",{class:"atfb-card__body",children:[r("div",{class:"atfb-card__head",children:[F(s?.icon??"dashicons-forms"),r("span",{class:"atfb-card__type",text:s?.label??e.type}),this.requiredToggle(e),l?r("span",{class:"atfb-badge atfb-badge--controls",text:l===1?"controls 1 field":`controls ${l} fields`,title:"Other questions appear or disappear based on this answer."}):null]}),Ft(e,s,{edit:d=>{const u=this.liveField(e.id);u&&(d(u),this.markDirty(),this.syncInspector(u))},restructure:d=>{const u=this.liveField(e.id);u&&(this.snapshot(),d(u),this.markDirty(),this.renderCanvas(),this.renderInspector())}}),o.length?this.renderCondition(o):null]}),r("div",{class:"atfb-card__actions",children:[this.cardAction("admin-page","Duplicate",()=>this.duplicateField(e.id)),this.cardAction("trash","Delete",()=>void this.deleteField(e.id))]})]});return c.addEventListener("click",d=>{d.target.closest(".atfb-card__actions")||U().recentlyEndedDrag()||this.selectField(e.id)}),c.addEventListener("keydown",d=>{if(d.key==="Enter"||d.key===" "){d.preventDefault(),this.selectField(e.id);return}d.altKey&&(d.key==="ArrowUp"||d.key==="ArrowDown")&&(d.preventDefault(),this.moveField(e.id,d.key==="ArrowUp"?t-1:t+1),window.requestAnimationFrame(()=>{this.canvas.querySelector(`[data-atfb-card="${CSS.escape(e.id)}"]`)?.focus()})),(d.key==="Delete"||d.key==="Backspace")&&(d.preventDefault(),this.deleteField(e.id))}),c.addEventListener("pointerdown",d=>{d.target.closest(".atfb-card__actions")||U().start({payload:Te(V,c,{fieldId:e.id,field:e,isNew:!1},d),origin:d})}),c}requiredToggle(e){return r("button",{class:`atfb-req${e.required?" is-on":""}`,type:"button",text:e.required?"Required":"Optional",title:e.required?"This must be answered. Click to make it optional.":"Click to make this required.",attrs:{"aria-pressed":e.required?"true":"false"},on:{pointerdown:s=>s.stopPropagation(),click:s=>{s.stopPropagation(),e.required=!e.required,this.markDirty(),this.renderCanvas(),this.renderInspector()}}})}cardAction(e,t,s){return r("button",{class:"atfb-card__action",type:"button",title:t,attrs:{"aria-label":t},on:{click:i=>{i.stopPropagation(),s()}},children:[F(e)]})}registerCanvasTarget(e){const t=r("div",{class:"atfb-marker",attrs:{"aria-hidden":"true"}}),s=U().registerDropTarget({id:`atfb-canvas-${this.form?.id??0}`,element:e,accept:a=>a.type===V,onEnter:()=>e.classList.add("is-dropping"),onLeave:()=>{e.classList.remove("is-dropping"),t.remove()},onDrop:(a,o)=>{e.classList.remove("is-dropping"),t.remove();const l=a.payload.data,c=l.fieldId?this.canvas.querySelector(`[data-atfb-card="${CSS.escape(l.fieldId)}"]`):null,d=$e(e,".atfb-card",o.clientY,c??void 0);if(l.isNew&&l.fieldType){this.addField(l.fieldType,d);return}if(l.fieldId&&this.schema?.fields.some(u=>u.id===l.fieldId)){this.moveField(l.fieldId,d);return}l.field&&this.insertField({...l.field,id:""},d)}});this.teardowns.push(s);const i=a=>{const o=a.detail;if(o?.payload?.type!==V||!e.classList.contains("is-dropping"))return;const l=o.clientY??0,c=$e(e,".atfb-card",l),d=e.querySelectorAll(".atfb-card");c>=d.length?e.append(t):d[c].before(t)};document.addEventListener("os.drag.move",i),this.teardowns.push(()=>document.removeEventListener("os.drag.move",i))}addField(e,t){const s=this.config?.fieldTypes.find(a=>a.type===e);if(!s||!this.schema)return;const i={id:this.nextFieldId(),type:e,label:s.input?s.label:"",placeholder:"",hint:"",required:!1,width:"full",cssClass:"",default:"",choices:s.choices?[{label:"First choice",value:"first"},{label:"Second choice",value:"second"}]:[],logic:{enabled:!1,action:"show",match:"all",rules:[]},messages:{},prefill:"",...s.settings};this.insertField(i,t)}insertField(e,t){if(!this.schema)return;e.id||(e.id=this.nextFieldId()),this.snapshot();const s=t===void 0?this.schema.fields.length:Math.max(0,Math.min(t,this.schema.fields.length));this.schema.fields.splice(s,0,e),this.selected=e.id,this.markDirty(),this.renderCanvas(),this.renderInspector(),window.requestAnimationFrame(()=>{this.canvas.querySelector(`[data-atfb-card="${CSS.escape(e.id)}"]`)?.focus()})}moveField(e,t){if(!this.schema)return;const s=this.schema.fields.findIndex(o=>o.id===e);if(s<0)return;const i=Math.max(0,Math.min(t,this.schema.fields.length-1));if(s===i)return;this.snapshot();const[a]=this.schema.fields.splice(s,1);this.schema.fields.splice(i>s?i-1:i,0,a),this.markDirty(),this.renderCanvas()}duplicateField(e){if(!this.schema)return;const t=this.schema.fields.findIndex(i=>i.id===e);if(t<0)return;const s=JSON.parse(JSON.stringify(this.schema.fields[t]));s.id=this.nextFieldId(),this.insertField(s,t+1)}async deleteField(e){if(!this.schema)return;const t=this.schema.fields.filter(i=>i.logic?.rules?.some(a=>a.field===e)),s=t.length?`Delete this field? ${t.length} other field${t.length===1?"":"s"} use it in a condition, and those conditions will stop working.`:Ee("confirmDelete","Delete this? It cannot be undone.");await he(s,"Delete field")&&(this.snapshot(),this.schema.fields=this.schema.fields.filter(i=>i.id!==e),this.selected===e&&(this.selected=null),this.markDirty(),this.renderCanvas(),this.renderInspector())}selectField(e){this.selected=e;for(const t of this.canvas.querySelectorAll("[data-atfb-card]")){const s=t.dataset.atfbCard===e;t.classList.toggle("is-selected",s),t.setAttribute("aria-pressed",s?"true":"false")}this.logicMap?.highlight(e),this.renderInspector()}nextFieldId(){const e=new Set((this.schema?.fields??[]).map(s=>s.id));let t=e.size+1;for(;e.has(`f${t}`);)t++;return`f${t}`}renderTypeSettings(e,t,s,i){for(const a of s){const o=et[a];o&&(this.inspector.append(tt(e,o,i)),o.also&&this.inspector.append(tt(e,{...o,key:o.also.key,label:o.also.label,hint:o.also.hint},i)))}s.includes("rows")&&e.type!=="likert"&&this.inspector.append(p("Lines tall",N(String(e.rows??""),a=>i("rows",a)))),s.includes("rows")&&e.type==="likert"&&this.inspector.append(this.renderStatementList(e,i)),s.includes("parts")&&this.inspector.append(this.renderPartsEditor(e,t,i)),s.includes("default")&&!["files","object"].includes(t?.value??"")&&this.inspector.append(this.renderDefaultControl(e,t,i))}renderStatementList(e,t){const s=Array.isArray(e.rows)?e.rows:[];return p("Statements",te(s.map(i=>i.label??"").join(` -`),i=>t("rows",st(s,i)),5),"One per line. Each becomes a row of the matrix.")}renderPartsEditor(e,t,s){const i=t?.parts??[],a=Array.isArray(e.parts)?e.parts:i.map(l=>l.key),o=i.map(l=>T(l.label,a.includes(l.key),c=>{const d=i.map(u=>u.key).filter(u=>u===l.key?c:a.includes(u));s("parts",d.length?d:[l.key])}));return r("div",{class:"atfb-section",children:[r("h4",{class:"atfb-section__title",text:"Parts to ask for"}),...o]})}renderDefaultControl(e,t,s){const i="Filled in before they start. They can change it.";return e.type==="switch"||e.type==="consent"?T("On by default",!!e.default,a=>s("default",a)):t?.choices&&(e.choices??[]).length?p("Default answer",$(String(e.default??""),[{value:"",label:"Nothing chosen"},...(e.choices??[]).map(a=>({value:String(a.value),label:a.label||String(a.value)}))],a=>s("default",a)),i):p("Default answer",v(String(e.default??""),a=>s("default",a)),i)}renderChoicesEditor(e,t){const s=e.choices??[],i=r("div",{class:"atfb-choices"});return s.forEach((a,o)=>{const l=r("div",{class:"atfb-choice-row",children:[e.type==="image_choice"?this.choiceImageWell(a,o,e):null,B(v(a.label,c=>{const d=!a.value||a.value===a.label;a.label=c,d&&(a.value=c),this.markDirty(),this.syncCanvas(e)}),`choice:${o}:label`),B(v(a.value,c=>{a.value=c,this.markDirty()},"value"),`choice:${o}:value`),e.type==="quiz"||a.points!==void 0?N(String(a.points??""),c=>{a.points=c===""?void 0:Number(c),this.markDirty()}):N(String(a.price??""),c=>{a.price=c===""?void 0:Number(c),this.markDirty()}),r("button",{class:"atfb-card__action",type:"button",attrs:{"aria-label":`Remove ${a.label}`},on:{click:()=>{s.splice(o,1),t("choices",s),this.renderInspector()}},children:[F("trash")]})]});i.append(l)}),r("div",{class:"atfb-section",children:[r("h4",{text:"Choices"}),r("p",{class:"atfb-hint",text:e.type==="quiz"?"Label, value, points.":"Label, value, and a price for calculations."}),i,k("Add choice",()=>{s.push({label:"",value:""}),t("choices",s),this.renderInspector()},"ghost","plus-alt2"),e.type==="quiz"?p("Correct answer",$(String(e.correct??""),[{value:"",label:"—"},...s.map(a=>({value:a.value,label:a.label}))],a=>t("correct",a))):null]})}choiceImageWell(e,t,s){const i=r("div",{class:`atfb-well${e.image?" has-image":""}`,attrs:{"data-choice":t,"aria-label":`Image for ${e.label||`choice ${t+1}`}`},children:[e.image?r("span",{class:"atfb-well__id",text:`#${e.image}`}):F("format-image")]}),a=U().registerDropTarget({id:`atfb-well-${s.id}-${t}`,element:i,accept:o=>as.includes(o.type),onEnter:()=>i.classList.add("is-dropping"),onLeave:()=>i.classList.remove("is-dropping"),onDrop:o=>{i.classList.remove("is-dropping");const l=o.payload.data,c=Number(l.attachmentId??l.id??l.file?.id??0);if(!c){I("That is not an image this field can use","","error");return}e.image=c,this.markDirty(),this.renderInspector()}});return this.teardowns.push(a),i.addEventListener("click",()=>{e.image&&(e.image=void 0,this.markDirty(),this.renderInspector())}),i}renderValidationSection(e,t,s){const i=[],a=[];t.includes("minlength")&&a.push(["minlength","Minimum characters"],["maxlength","Maximum characters"]),t.includes("min")?a.push(["min","Minimum"],["max","Maximum"]):t.includes("max")&&a.push(["max","Highest"]),t.includes("step")&&a.push(["step","Steps of"]),t.includes("mindate")&&a.push(["minDate","Earliest date"],["maxDate","Latest date"]),t.includes("mintime")&&a.push(["minTime","Earliest time"],["maxTime","Latest time"]);for(const[l,c]of a)i.push(p(c,v(String(e[l]??""),d=>s(l,d))));t.includes("pattern")&&i.push(p("Pattern",v(String(e.pattern??""),l=>s("pattern",l)),"A regular expression, without slashes.")),t.includes("unique")&&i.push(T("No two people may submit the same value",!!e.unique,l=>s("unique",l)));const o=e.messages??{};return t.includes("required")&&i.push(p("Message when required",v(o.required??"",l=>{o.required=l,s("messages",o)}),"Leave empty for the default wording.")),i.length?this.section(`validation:${e.id}`,"Validation",i):r("div",{class:"atfb-section is-empty"})}renderLogicSection(e,t){const s=e.logic,i=(this.schema?.fields??[]).filter(o=>o.id!==e.id&&o.type!=="page_break"),a=r("div",{class:"atfb-rules"});return s.rules.forEach((o,l)=>{a.append(r("div",{class:"atfb-rule",children:[$(o.field,i.map(c=>({value:c.id,label:c.label||c.id})),c=>{o.field=c,this.markDirty()}),$(o.operator,Object.entries(this.config?.operators??{}).map(([c,d])=>({value:c,label:d})),c=>{o.operator=c,this.markDirty()}),v(o.value,c=>{o.value=c,this.markDirty()}),r("button",{class:"atfb-card__action",type:"button",attrs:{"aria-label":"Remove this rule"},on:{click:()=>{s.rules.splice(l,1),t("logic",s),this.renderInspector()}},children:[F("trash")]})]}))}),this.section(`logic:${e.id}`,"Conditional logic",[T("Only show this field sometimes",s.enabled,o=>{s.enabled=o,t("logic",s),this.renderInspector()}),s.enabled?r("div",{children:[r("div",{class:"atfb-rule-head",children:[$(s.action,[{value:"show",label:"Show"},{value:"hide",label:"Hide"}],o=>{s.action=o,t("logic",s)}),r("span",{text:"this field when"}),$(s.match,[{value:"all",label:"all"},{value:"any",label:"any"}],o=>{s.match=o,t("logic",s)}),r("span",{text:"of these match:"})]}),a,k("Add rule",()=>{s.rules.push({field:i[0]?.id??"",operator:"is",value:""}),t("logic",s),this.renderInspector()},"ghost","plus-alt2")]}):null],s.enabled)}renderTabCanvas(){return this.schema?this.tab==="theme"?ze({themes:this.themes,tokens:this.config?.tokens??[],activeSlug:this.schema.settings.theme,overrides:this.schema.settings.themeOverrides,onTheme:e=>{this.schema.settings.theme=e,this.markDirty()},onOverride:(e,t)=>{t===""?delete this.schema.settings.themeOverrides[e]:this.schema.settings.themeOverrides[e]=t,this.markDirty()},previewFor:(e,t)=>this.previewHtml(e,t),onThemesChanged:e=>{this.themes=e}}):this.tab==="settings"?this.renderSettingsPane():this.tab==="notify"?this.renderNotificationsPane():this.renderConfirmationsPane():r("div")}async paintCanvasTheme(){if(!this.form||!this.schema)return;const e=this.schema.settings.theme,t=JSON.stringify([e,this.schema.settings.themeOverrides]);if(t!==this.canvasThemeSignature){this.canvasThemeSignature=t;try{const s=await this.previewHtml(e,this.schema.settings.themeOverrides??{}),i=/