When the stock inputs
don't fit the research.
custom: runs author HTML, CSS, and JavaScript
inside the survey — a per-question shadow-DOM widget, a
survey-wide helper installed on flow-reach, or a page layout
scaffold with named slots. Shelf tests, image hotspots,
concept boards, drag-and-rank, any custom input device —
same wire back to native DSL answers.
Build the interaction. Keep the native answer.
[ ] Pack-front click map
Coords persist to a hidden open-end. Export → heatmap, no extra tooling.
Concept board layout
Multiple questions, one page, named slots via data-jet-slot.
Concept popups anywhere
One block installs Jet.modal. Trigger from any question's link.
QDotsAny input device, native answer
Tap, slide, draw — writes a native number through Jet.setValue.
Bring your own forms
Insights teams build proprietary methodology libraries —
branded shelf tests, virtual aisles, reaction-curve
players, concept dials, pack-front hit-maps. They're
competitive assets, and historically they lived in a
parallel JavaScript stack bolted onto the survey tool.
custom: dissolves that split. Your form
library is part of the survey, written in the same YAML as
the standard questions, running on the same engine as the
rest of the fieldwork.
Native in the data
The system of record stays the question. A shelf-test
widget writes an ordered SKU list to a hidden
rank through
Jet.setValue(qid, order) — downstream, skip
logic, quotas, piping, and export treat it like a normal
rank. A hotspot widget writes coordinates to a
hidden open. A dial player writes a timestamped
series. No parallel export job after fieldwork closes.
Three places to plant it
Question-level blocks run in a Shadow DOM
on their host question. CSS doesn't leak out; the survey's
--jet-* theme tokens pierce in. Survey-
level blocks are flow nodes installed once on
flow-reach — the right home for a shared modal, a delegated
handler, or a helper like Jet.modal.
Page-level blocks are layout scaffolds:
the questions on the page render into elements marked
data-jet-slot, so a concept board (hero
stimulus + three ratings in a row) is one block instead of
three stacked questions.
A programmer surface
Custom code runs same-realm — no iframe, no allow-list.
Load Chart.js, D3, Three.js, or a proprietary component
library the firm already ships. Scripts are deduped by URL
across questions, and the runtime captures
fetch and the session token up-front so author
code can't exfiltrate credentials. A new input device is a
YAML block, not a vendor queue.