From 1a56cd760383d7e56d91558b3ba23b14defbd19e Mon Sep 17 00:00:00 2001 From: Jeffrey Hales Date: Wed, 28 Oct 2026 18:04:29 -0700 Subject: [PATCH] feat(forms): add Form A iframe fallback safeguards --- www/integrations/jotform/README.md | 25 ++-- www/reports/SESSION_HANDOFF.md | 14 ++- ...se-9-form-a-owner-acceptance-2026-10-28.md | 51 +++++++++ ...-jotform-implementation-plan-2026-10-18.md | 16 ++- ...jotform-integration-contract-2026-10-18.md | 36 ++++-- ...form-verification-checklist-2026-10-18.csv | 10 +- www/src/components/JotformIframe.astro | 75 +++++++++--- www/src/utils/form-integration.ts | 2 + www/tools/jotform-form-a-browser.mjs | 108 ++++++++++++++++-- www/tools/jotform-form-a.test.mjs | 21 +++- 10 files changed, 299 insertions(+), 59 deletions(-) create mode 100644 www/reports/phase-9-form-a-owner-acceptance-2026-10-28.md diff --git a/www/integrations/jotform/README.md b/www/integrations/jotform/README.md index 08bf71c..46f7b65 100644 --- a/www/integrations/jotform/README.md +++ b/www/integrations/jotform/README.md @@ -10,8 +10,8 @@ The current Builder theme reconciliation adds narrowly scoped `!important` decla ## Installation and comparison -1. Create or open the approved blank Form A in AIA's HIPAA-enabled Jotform account. -2. Keep the form disabled while field, PHI, notification, conditional-logic, and language review is pending. +1. Open the approved Form A in AIA's HIPAA-enabled Jotform account. Do not change its fields or settings from this repository workflow. +2. Keep production activation disabled while embedded-runtime, accessibility, telemetry/privacy, and release review remain pending. 3. Paste the contents of `aia-form-a.css` into Jotform's custom CSS area. 4. Compare the Jotform preview with the Astro Form A mock at 390px and 1440px. Check the form surface, label rhythm, input height, button fill, outlined hover/focus state, error state, and mobile reflow. 5. Check both English and Spanish configurations. Confirm translated labels, required indicators, validation messages, confirmation copy, and the accessible iframe title supplied by the parent Astro integration. @@ -27,12 +27,15 @@ The Astro adapter exists only for a separately approved, non-indexing isolated t PUBLIC_AIA_FORMS_MODE=isolated-test PUBLIC_AIA_FORMS_ENVIRONMENT=isolated-test PUBLIC_AIA_FORMS_ISOLATED_TEST_APPROVED=true +PUBLIC_AIA_FORMS_LIVE_APPROVED=false PUBLIC_ALLOW_INDEXING=false ``` It uses fixed allowlisted hosted URLs only: the contact routes use `formContext=contact` with their fixed English or Spanish language value, and the five landing routes use `formContext=landing&language=en`. `formContext` is the exact case-sensitive Jotform Unique Name supplied by the owner; it is presentation-only and does not accept visitor query values. A missing gate, any other environment role, an indexing-enabled build, a route outside that seven-route allowlist, or `live` mode renders the normal fail-closed Astro fallback instead. -The adapter has a localized iframe title, a fixed-height responsive frame, a `no-referrer` policy, a minimal sandbox, and a direct hosted-form fallback. It loads no Jotform helper script, reads no iframe DOM, and treats no frame load as a submission or conversion. The disabled Form A must undergo owner-authorized synthetic EN/ES testing before the isolated adapter or its fixed height can be accepted for a live workflow. +The adapter has a localized iframe title, a fixed-height responsive frame, a `no-referrer` policy, a minimal sandbox, and a direct hosted-form fallback. The fallback is outside the iframe, initially hidden without layout space, revealed after a 15-second missing-load timeout, cleared on frame load or component disposal, and duplicated only as localized `