LIFE SKYGUARD – OPENKODA PROCESS FRAMEWORK Purpose This package provides the approved Life Skyguard page structure and visual styling for the following OpenKoda workflows: • Life Quote (new) • Life Quote (review) • Life Quote Proposal • Document Upload • Claim Form • Endorsement Request Package contents Design reference (unchanged, as originally supplied) • life-skyguard-process-template.html • life-skyguard-process-template-standalone.html Completed pages – one per workflow, ready for deployment • life-new-quote.html • life-quote.html • life-quote-proposal.html • document-upload.html • claim-form.html • endorsement-request.html Shared assets – both are required by all six pages • life-skyguard.css • skyguard-logo.png ============================================================================== OPENKODA IMPLEMENTATION ============================================================================== Each page frames one OpenKoda endpoint on https://sg-prod.app.openkoda.com and forwards the parameters that endpoint uses. All six endpoints are live. PAGE ENDPOINT REQUIRED PARAMETERS OPTIONAL -------------------------- ------------------------ -------------------------- ---------------------------- life-new-quote.html /life-new-quote (none) organizationId life-quote.html /life-quote quoteId, authToken organizationId life-quote-proposal.html /life-quote/proposal acceptance, quoteId, organizationId authToken document-upload.html /document-upload documentType, quoteId, riskItemId, organizationId authToken claim-form.html /claim-form (none) (none) endorsement-request.html /endorsement-request (none) (none) `acceptance` is either `accept` or `reject`. `claim-form` and `endorsement-request` identify the policy from a policy number typed into the form itself, so they take no URL parameters. URL parameter handling Each page reads the parameters from ITS OWN address and passes them to the framed endpoint. The SkyGuard emails already produce links in exactly the right shape — only the host needs changing from the OpenKoda host to life.skyguardglobal.com. For example: https://life.skyguardglobal.com/life-quote-proposal?acceptance=accept"eId=1234&authToken= https://life.skyguardglobal.com/document-upload?documentType=medicalDocument"eId=1234&authToken= https://life.skyguardglobal.com/life-quote?quoteId=1234&authToken= Only the parameters listed in the table above are forwarded, and each is checked against a shape rule (ids numeric, tokens alphanumeric, `acceptance` one of two words) before being passed on. Anything else on the address — tracking parameters such as fbclid, gclid or utm_* — is dropped. This filtering is not optional. OpenKoda only serves these pages to anonymous visitors when every query value consists of letters, digits, spaces, dots, hyphens and underscores. A single tracking parameter containing a percent-escape or a plus sign makes OpenKoda treat the request as one needing a login and redirects the visitor to its login screen. Please make sure any campaign or analytics tooling on life.skyguardglobal.com does not append parameters to these six addresses — and if it does, they will now be stripped before the form is opened. If a required parameter is missing or malformed, the page does not open the form at all. It shows a "Link incomplete" notice in the same panel instead, inviting the visitor to use the most recent link from their email or to contact info@skyguardglobal.com. Responsive iframe behaviour The OpenKoda pages report their content height to the parent page via postMessage, and the frame resizes to match (minimum 700px). Messages are accepted only from the OpenKoda hosts: https://sg-prod.app.openkoda.com https://sg-prod.cloud.openkoda.com https://sg-dev.cloud.openkoda.com Both message names in use are handled (`skyguard-form-height` and `openkoda:resize`). On each navigation inside the frame the height resets to the stylesheet minimum, so the confirmation and outcome pages — which are much shorter than the forms and do not report a height — do not leave a large empty gap. The three pages that take required parameters build their frame address with JavaScript, so they carry a