- esc() helper escapes free-text values and converts newlines to <br>;
used for commit messages, SMS text, annotations, and all JSON values
- JSON parser accepts scalar bodies (string, number, bool, null) and
renders them as a one-row table instead of falling back to the
default template
- Arrays of plain values render as one table under their path
breadcrumb, so nested string lists are no longer anonymous
- GitHub commits render as cards with a sha pill linked to the commit
Metadata blocks were divs styled with display:table. Nested blocks and
orphan cells created phantom columns that squeezed the value column to
a character or two. Every metadata block is now a real <table>/<tr>/<td>,
which mail clients lay out reliably, and the value column always fills
the remaining width.
The shared shell gets a gradient hero header, timestamp pill, dark
frame, and refreshed section, card, and code-block styling.
Header names arrive lowercase over HTTP/2 (the nginx front end enables
it) and Apache preserves that case, so the X-GitHub-Event lookup missed
and every email reported "Unknown". Normalise header keys once.
- docs.htm: dark single-page redesign in plain CSS, live URL builder,
all four parsers documented, Bootstrap CDN dependency dropped
- index.php: respond with pretty-printed JSON (success and 400 error);
email "Parsed Variables" block uses JSON instead of print_r
- parsers/helpers.php: emailShell() provides one stylesheet, header and
footer for every email template; five duplicated stylesheets removed