REMOTE_ADDR inside the container is 172.17.0.1. When the peer is a
private or loopback address, use X-Real-IP (or the first hop of
X-Forwarded-For) that nginx sets. Public peers cannot spoof it.
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.
- 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
- Added wxinteractParse() function supporting all SMS API events:
* Outbound SMS (submitted, delivered, failed)
* Shortlink clicked
* Inbound SMS received
* SMS opt out
* Contacts callback
- Helper functions for each event type with formatted HTML
- Test samples file for all event types
- Updated README with Webex Interact documentation
- Follows existing parser style and security guidelines