{"id":2617465,"date":"2026-06-17T19:35:29","date_gmt":"2026-06-17T19:35:29","guid":{"rendered":"https:\/\/www.airriderz.com\/portchester\/?page_id=2617465"},"modified":"2026-06-17T19:36:10","modified_gmt":"2026-06-17T19:36:10","slug":"invitation-card","status":"publish","type":"page","link":"https:\/\/www.airriderz.com\/portchester\/invitation-card\/","title":{"rendered":"Invitation Card"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2617465\" class=\"elementor elementor-2617465\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bb413ca e-flex e-con-boxed e-con e-parent\" data-id=\"bb413ca\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8a733d4 elementor-widget elementor-widget-html\" data-id=\"8a733d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link\r\n    href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow+Condensed:wght@700;800;900&family=Barlow:wght@400;500;600;700&display=swap\"\r\n    rel=\"stylesheet\">\r\n\r\n<style>\r\n    .sz*,\r\n    .sz*::before,\r\n    .sz*::after {\r\n        box-sizing: border-box;\r\n        margin: 0;\r\n        padding: 0;\r\n    }\r\n\r\n    .sz {\r\n        --acc: #00ff00;\r\n        --acc2: #00cc00;\r\n        --btn: #0000ff;\r\n        --btnH: #0000cc;\r\n        --bg: #ffffff;\r\n        --f1: 'Barlow', sans-serif;\r\n        --f2: 'Barlow Condensed', sans-serif;\r\n        --txt: #1a1a1a;\r\n        --txt2: #555;\r\n        --txt3: #999;\r\n        --bdr: #d0d0d0;\r\n        --bdrF: #0000ff;\r\n        --err: #cc3300;\r\n        background: var(--bg);\r\n        color: var(--txt);\r\n        font-family: var(--f1);\r\n        font-size: 15px;\r\n        line-height: 1.5;\r\n        padding: 32px 24px 48px;\r\n    }\r\n\r\n    \/* \u2500\u2500 two-column grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-grid {\r\n        display: grid;\r\n        grid-template-columns: 1fr 1fr;\r\n        gap: 48px;\r\n        max-width: 1100px;\r\n        margin: 0 auto;\r\n    }\r\n\r\n    @media(max-width:780px) {\r\n        .sz-grid {\r\n            grid-template-columns: 1fr;\r\n        }\r\n\r\n        .sz-right {\r\n            order: -1;\r\n        }\r\n\r\n        .sz-grid {\r\n            display: block;\r\n        }\r\n\r\n        .sz-bg-thumb {\r\n            width: 90px !important;\r\n        }\r\n\r\n\r\n        .sz {\r\n            padding: 0px !important\r\n        }\r\n    }\r\n\r\n    \/* \u2500\u2500 shared label style \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-lbl {\r\n        display: block;\r\n        font-size: 15px;\r\n        font-weight: 700;\r\n        color: var(--txt);\r\n        margin-bottom: 10px;\r\n    }\r\n\r\n    .sz-lbl .req {\r\n        color: var(--err);\r\n    }\r\n\r\n    \/* \u2500\u2500 form group spacing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-grp {\r\n        margin-bottom: 28px;\r\n    }\r\n\r\n    \/* \u2500\u2500 background picker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-bgs {\r\n        display: flex;\r\n        gap: 12px;\r\n    }\r\n\r\n    .sz-bg-opt {\r\n        position: relative;\r\n        cursor: pointer;\r\n        width: 100px;\r\n    }\r\n\r\n    .sz-bg-opt input[type=radio] {\r\n        position: absolute;\r\n        opacity: 0;\r\n        width: 0;\r\n        height: 0;\r\n    }\r\n\r\n    .sz-bg-thumb {\r\n        display: block;\r\n        width: 100px;\r\n        height: 120px;\r\n        border-radius: 4px;\r\n        border: 2px solid var(--bdr);\r\n        overflow: hidden;\r\n        transition: border-color .15s, box-shadow .15s;\r\n        cursor: pointer;\r\n    }\r\n\r\n    .sz-bg-opt input:checked+.sz-bg-thumb {\r\n        border-color: var(--btn);\r\n        box-shadow: 0 0 0 3px rgba(0, 0, 255, .18);\r\n    }\r\n\r\n    .sz-bg-opt:hover .sz-bg-thumb {\r\n        border-color: #aaa;\r\n    }\r\n\r\n    .sz-bg-thumb canvas {\r\n        width: 100%;\r\n        height: 100%;\r\n        display: block;\r\n    }\r\n\r\n    \/* \u2500\u2500 date dropdowns \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-date-row {\r\n        display: flex;\r\n        gap: 10px;\r\n    }\r\n\r\n    .sz-date-row .sz-sel-wrap {\r\n        flex: 1;\r\n    }\r\n\r\n    \/* \u2500\u2500 time row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-time-row {\r\n        display: grid;\r\n        grid-template-columns: 1fr 1fr;\r\n        gap: 20px;\r\n    }\r\n\r\n    @media(max-width:500px) {\r\n        .sz-time-row {\r\n            grid-template-columns: 1fr;\r\n        }\r\n    }\r\n\r\n    .sz-time-group {}\r\n\r\n    .sz-time-inner {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 6px;\r\n    }\r\n\r\n    .sz-time-colon {\r\n        font-size: 18px;\r\n        font-weight: 700;\r\n        color: var(--txt2);\r\n        line-height: 1;\r\n        flex-shrink: 0;\r\n    }\r\n\r\n    \/* \u2500\u2500 select \/ input base \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-sel,\r\n    .sz-inp {\r\n        width: 100%;\r\n        background: #fff;\r\n        border: 1px solid var(--bdr);\r\n        border-radius: 4px;\r\n        padding: 9px 12px;\r\n        color: var(--txt);\r\n        font-family: var(--f1);\r\n        font-size: 14px;\r\n        font-weight: 500;\r\n        outline: none;\r\n        appearance: none;\r\n        -webkit-appearance: none;\r\n        transition: border-color .15s, box-shadow .15s;\r\n    }\r\n\r\n    .sz-sel {\r\n        background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23888'\/%3E%3C\/svg%3E\");\r\n        background-repeat: no-repeat;\r\n        background-position: right 10px center;\r\n        background-size: 8px;\r\n        padding-right: 28px;\r\n        cursor: pointer;\r\n    }\r\n\r\n    .sz-sel:focus,\r\n    .sz-inp:focus {\r\n        border-color: var(--bdrF);\r\n        box-shadow: 0 0 0 3px rgba(0, 0, 255, .12);\r\n    }\r\n\r\n    .sz-inp::placeholder {\r\n        color: var(--txt3);\r\n    }\r\n\r\n    .sz-sel.sz-sm {\r\n        width: auto;\r\n        min-width: 72px;\r\n    }\r\n\r\n    .sz-sel.sz-ampm {\r\n        min-width: 70px;\r\n    }\r\n\r\n    .sz-inp.err,\r\n    .sz-sel.err {\r\n        border-color: var(--err);\r\n    }\r\n\r\n    \/* character counter *\/\r\n    .sz-counter {\r\n        font-size: 12px;\r\n        color: var(--acc2);\r\n        margin-top: 5px;\r\n        font-weight: 600;\r\n    }\r\n\r\n    .sz-counter.warn {\r\n        color: var(--err);\r\n    }\r\n\r\n    \/* \u2500\u2500 RSVP section heading \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-rsvp-head {\r\n        font-size: 18px;\r\n        font-weight: 700;\r\n        color: var(--txt);\r\n        margin-bottom: 20px;\r\n        padding-top: 4px;\r\n    }\r\n\r\n    \/* \u2500\u2500 two-field row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-2col {\r\n        display: grid;\r\n        grid-template-columns: 1fr 1fr;\r\n        gap: 16px;\r\n        margin-bottom: 20px;\r\n    }\r\n\r\n    @media(max-width:420px) {\r\n        .sz-2col {\r\n            grid-template-columns: 1fr;\r\n        }\r\n    }\r\n\r\n    .sz-field {\r\n        display: flex;\r\n        flex-direction: column;\r\n        gap: 6px;\r\n    }\r\n\r\n    \/* \u2500\u2500 generate button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-gen-wrap {\r\n        margin-top: 10px;\r\n        display: flex;\r\n        justify-content: flex-end;\r\n    }\r\n\r\n    .sz-gen {\r\n        padding: 12px 32px;\r\n        background: #fff;\r\n        color: var(--btn);\r\n        border: 2px solid var(--btn);\r\n        border-radius: 4px;\r\n        font-family: var(--f1);\r\n        font-size: 15px;\r\n        font-weight: 800;\r\n        letter-spacing: .1em;\r\n        text-transform: uppercase;\r\n        cursor: pointer;\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 8px;\r\n        transition: background .15s, color .15s, box-shadow .15s;\r\n    }\r\n\r\n    .sz-gen:hover {\r\n        background: var(--btn);\r\n        color: #fff;\r\n        box-shadow: 0 4px 18px rgba(0, 0, 255, .25);\r\n    }\r\n\r\n    .sz-gen:disabled {\r\n        opacity: .5;\r\n        cursor: default;\r\n    }\r\n\r\n    \/* messages *\/\r\n    .sz-msg {\r\n        display: none;\r\n        margin-top: 12px;\r\n        padding: 10px 14px;\r\n        border-radius: 4px;\r\n        font-size: 13px;\r\n        font-weight: 600;\r\n    }\r\n\r\n    .sz-msg-err {\r\n        background: #fff5f5;\r\n        border: 1px solid #ffcccc;\r\n        color: var(--err);\r\n    }\r\n\r\n    .sz-msg-ok {\r\n        background: #f0fff0;\r\n        border: 1px solid rgba(0, 200, 0, .4);\r\n        color: #007700;\r\n    }\r\n\r\n    \/* \u2500\u2500 RIGHT COLUMN \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n    .sz-right-lbl {\r\n        font-size: 15px;\r\n        font-weight: 700;\r\n        color: var(--txt);\r\n        margin-bottom: 14px;\r\n    }\r\n\r\n    \/* small preview thumbnails  *\/\r\n    .sz-preview-thumbs {\r\n        display: none;\r\n        gap: 10px;\r\n        margin-bottom: 18px;\r\n    }\r\n\r\n    .sz-prev-thumb {\r\n        flex: 1;\r\n        border-radius: 4px;\r\n        overflow: hidden;\r\n        border: 2px solid transparent;\r\n        cursor: pointer;\r\n        transition: border-color .15s, opacity .15s;\r\n        opacity: .45;\r\n    }\r\n\r\n    .sz-prev-thumb.active {\r\n        border-color: var(--btn);\r\n        opacity: 1;\r\n    }\r\n\r\n    .sz-prev-thumb canvas {\r\n        width: 100%;\r\n        aspect-ratio: 660\/686;\r\n        display: block;\r\n    }\r\n\r\n    \/* main invitation canvas *\/\r\n    .sz-canvas-wrap {\r\n        border: 1px solid #e0e0e0;\r\n        border-radius: 6px;\r\n        overflow: hidden;\r\n        background: #f5f5f5;\r\n        position: relative;\r\n        min-height: 300px;\r\n    }\r\n\r\n    .sz-canvas-wrap canvas {\r\n        width: 100%;\r\n        display: block;\r\n    }\r\n\r\n    \/* placeholder state *\/\r\n    .sz-placeholder {\r\n        position: absolute;\r\n        inset: 0;\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        justify-content: center;\r\n        gap: 12px;\r\n        background: #f8f8f8;\r\n        transition: opacity .3s;\r\n    }\r\n\r\n    .sz-placeholder.gone {\r\n        opacity: 0;\r\n        pointer-events: none;\r\n    }\r\n\r\n    .sz-placeholder svg {\r\n        opacity: .25;\r\n    }\r\n\r\n    .sz-placeholder p {\r\n        font-size: 13px;\r\n        color: #aaa;\r\n        text-align: center;\r\n    }\r\n\r\n    \/* post-generate actions *\/\r\n    .sz-actions {\r\n        display: none;\r\n        flex-direction: column;\r\n        gap: 10px;\r\n        margin-top: 14px;\r\n    }\r\n\r\n    .sz-actions.show {\r\n        display: flex;\r\n    }\r\n\r\n    .sz-dl {\r\n        width: 100%;\r\n        padding: 12px 20px;\r\n        background: var(--btn);\r\n        color: #fff;\r\n        border: none;\r\n        border-radius: 4px;\r\n        font-family: var(--f1);\r\n        font-size: 14px;\r\n        font-weight: 700;\r\n        cursor: pointer;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        gap: 8px;\r\n        transition: background .15s, box-shadow .15s;\r\n    }\r\n\r\n    .sz-dl:hover {\r\n        background: var(--btnH);\r\n        box-shadow: 0 4px 16px rgba(0, 0, 255, .25);\r\n    }\r\n\r\n    .sz-email-btn {\r\n        width: 100%;\r\n        padding: 11px 20px;\r\n        background: #fff;\r\n        color: var(--txt);\r\n        border: 1px solid var(--bdr);\r\n        border-radius: 4px;\r\n        font-family: var(--f1);\r\n        font-size: 13px;\r\n        font-weight: 600;\r\n        cursor: pointer;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        gap: 8px;\r\n        transition: border-color .15s;\r\n    }\r\n\r\n    .sz-email-btn:hover {\r\n        border-color: #aaa;\r\n    }\r\n\r\n\r\n    \/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n   Selected background overlay + check icon\r\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n\r\n.sz-bg-thumb{\r\n    position: relative !important;\r\n}\r\n\r\n.sz-bg-opt input:checked + .sz-bg-thumb::before{\r\n    content:'';\r\n    position:absolute;\r\n    inset:0;\r\n    background:rgba(0,0,0,0.15);\r\n    z-index:5;\r\n}\r\n\r\n.sz-bg-opt input:checked + .sz-bg-thumb::after{\r\n    content:'\u2713';\r\n    position:absolute;\r\n    top:6px;\r\n    right:6px;\r\n    width:24px;\r\n    height:24px;\r\n    border-radius:50%;\r\n    background:#00CC00;\r\n    color:#fff;\r\n\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:center;\r\n\r\n    font-size:15px;\r\n    font-weight:700;\r\n\r\n    z-index:10;\r\n\r\n    box-shadow:0 2px 6px rgba(0,0,0,.25);\r\n}\r\n\r\n\/* keep canvas below overlay *\/\r\n.sz-bg-thumb canvas{\r\n    position:relative;\r\n    z-index:1;\r\n}\r\n<\/style>\r\n\r\n<div class=\"sz\" id=\"sz-root\">\r\n    <div class=\"sz-grid\">\r\n\r\n        <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 LEFT: FORM \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n        <div class=\"sz-left\">\r\n            <form id=\"szForm\" novalidate>\r\n\r\n                <!-- 1. Background -->\r\n                <div class=\"sz-grp\">\r\n                    <label class=\"sz-lbl\">Select a background: <span class=\"req\">*<\/span><\/label>\r\n                    <div class=\"sz-bgs\" id=\"szBgs\">\r\n                        <label class=\"sz-bg-opt\">\r\n                            <input type=\"radio\" name=\"sz_bg\" value=\"0\" checked id=\"szBg0\">\r\n                            <span class=\"sz-bg-thumb\"><canvas id=\"szBgC0\" width=\"100\" height=\"120\"><\/canvas><\/span>\r\n                        <\/label>\r\n                        <label class=\"sz-bg-opt\">\r\n                            <input type=\"radio\" name=\"sz_bg\" value=\"1\" id=\"szBg1\">\r\n                            <span class=\"sz-bg-thumb\"><canvas id=\"szBgC1\" width=\"100\" height=\"120\"><\/canvas><\/span>\r\n                        <\/label>\r\n                        <label class=\"sz-bg-opt\">\r\n                            <input type=\"radio\" name=\"sz_bg\" value=\"2\" id=\"szBg2\">\r\n                            <span class=\"sz-bg-thumb\"><canvas id=\"szBgC2\" width=\"100\" height=\"120\"><\/canvas><\/span>\r\n                        <\/label>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- 2. Party date -->\r\n                <div class=\"sz-grp\">\r\n                    <label class=\"sz-lbl\">When is your party? <span class=\"req\">*<\/span><\/label>\r\n                    <div class=\"sz-date-row\">\r\n                        <div class=\"sz-sel-wrap\">\r\n                            <select class=\"sz-sel\" id=\"szMM\">\r\n                                <option value=\"\">MM<\/option>\r\n                                <option value=\"1\">January<\/option>\r\n                                <option value=\"2\">February<\/option>\r\n                                <option value=\"3\">March<\/option>\r\n                                <option value=\"4\">April<\/option>\r\n                                <option value=\"5\">May<\/option>\r\n                                <option value=\"6\">June<\/option>\r\n                                <option value=\"7\">July<\/option>\r\n                                <option value=\"8\">August<\/option>\r\n                                <option value=\"9\">September<\/option>\r\n                                <option value=\"10\">October<\/option>\r\n                                <option value=\"11\">November<\/option>\r\n                                <option value=\"12\">December<\/option>\r\n                            <\/select>\r\n                        <\/div>\r\n                        <div class=\"sz-sel-wrap\">\r\n                            <select class=\"sz-sel\" id=\"szDD\">\r\n                                <option value=\"\">DD<\/option>\r\n                            <\/select>\r\n                        <\/div>\r\n                        <div class=\"sz-sel-wrap\">\r\n                            <select class=\"sz-sel\" id=\"szYY\">\r\n                                <option value=\"\">YYYY<\/option>\r\n                            <\/select>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- 3. Times -->\r\n                <div class=\"sz-grp\">\r\n                    <div class=\"sz-time-row\">\r\n                        <!-- check-in time -->\r\n                        <div class=\"sz-time-group\">\r\n                            <label class=\"sz-lbl\">Check-In Time:<span class=\"req\">*<\/span><span style=\"font-size:11px;\">\r\n                                    (15 mins. before jump time)<\/span> <\/label>\r\n                            <div class=\"sz-time-inner\">\r\n                                <select class=\"sz-sel sz-sm\" id=\"szCIH\">\r\n                                    <option value=\"\">HH<\/option>\r\n                                    <option>1<\/option>\r\n                                    <option>2<\/option>\r\n                                    <option>3<\/option>\r\n                                    <option>4<\/option>\r\n                                    <option>5<\/option>\r\n                                    <option>6<\/option>\r\n                                    <option>7<\/option>\r\n                                    <option>8<\/option>\r\n                                    <option>9<\/option>\r\n                                    <option>10<\/option>\r\n                                    <option>11<\/option>\r\n                                    <option>12<\/option>\r\n                                <\/select>\r\n                                <span class=\"sz-time-colon\">:<\/span>\r\n                                <select class=\"sz-sel sz-sm\" id=\"szCIM\">\r\n                                    <option value=\"\">MM<\/option>\r\n                                    <option>00<\/option>\r\n                                    <option>15<\/option>\r\n                                    <option>30<\/option>\r\n                                    <option>45<\/option>\r\n                                <\/select>\r\n                                <select class=\"sz-sel sz-ampm\" id=\"szCIAP\">\r\n                                    <option value=\"\">AM\/PM<\/option>\r\n                                    <option>AM<\/option>\r\n                                    <option>PM<\/option>\r\n                                <\/select>\r\n                            <\/div>\r\n                        <\/div>\r\n                        <!-- end time -->\r\n                        <div class=\"sz-time-group\">\r\n                            <label class=\"sz-lbl\">End Time:<span class=\"req\">*<\/span><span style=\"font-size:11px;\">\r\n                                    (Scheduled room end time)<\/span> <\/label>\r\n                            <div class=\"sz-time-inner\">\r\n                                <select class=\"sz-sel sz-sm\" id=\"szETH\">\r\n                                    <option value=\"\">HH<\/option>\r\n                                    <option>1<\/option>\r\n                                    <option>2<\/option>\r\n                                    <option>3<\/option>\r\n                                    <option>4<\/option>\r\n                                    <option>5<\/option>\r\n                                    <option>6<\/option>\r\n                                    <option>7<\/option>\r\n                                    <option>8<\/option>\r\n                                    <option>9<\/option>\r\n                                    <option>10<\/option>\r\n                                    <option>11<\/option>\r\n                                    <option>12<\/option>\r\n                                <\/select>\r\n                                <span class=\"sz-time-colon\">:<\/span>\r\n                                <select class=\"sz-sel sz-sm\" id=\"szETM\">\r\n                                    <option value=\"\">MM<\/option>\r\n                                    <option>00<\/option>\r\n                                    <option>15<\/option>\r\n                                    <option>30<\/option>\r\n                                    <option>45<\/option>\r\n                                <\/select>\r\n                                <select class=\"sz-sel sz-ampm\" id=\"szETAP\">\r\n                                    <option value=\"\">AM\/PM<\/option>\r\n                                    <option>AM<\/option>\r\n                                    <option>PM<\/option>\r\n                                <\/select>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- 4. Celebration name -->\r\n                <div class=\"sz-grp\">\r\n                    <label class=\"sz-lbl\" for=\"szCel\">What are you celebrating? <span class=\"req\">*<\/span><\/label>\r\n                    <input class=\"sz-inp\" type=\"text\" id=\"szCel\" maxlength=\"72\"\r\n                        placeholder=\"Enter the name of your party\">\r\n                    <div class=\"sz-counter\" id=\"szCounter\">0 of 72 max characters<\/div>\r\n                <\/div>\r\n\r\n                <!-- 5. RSVP contact -->\r\n                <div class=\"sz-rsvp-head\">Who should people contact to RSVP?<\/div>\r\n\r\n                <div class=\"sz-2col\">\r\n                    <div class=\"sz-field\">\r\n                        <label class=\"sz-lbl\" for=\"szFN\">First Name: <span class=\"req\">*<\/span><\/label>\r\n                        <input class=\"sz-inp\" type=\"text\" id=\"szFN\" placeholder=\"\">\r\n                    <\/div>\r\n                    <div class=\"sz-field\">\r\n                        <label class=\"sz-lbl\" for=\"szLN\">Last Name: <span class=\"req\">*<\/span><\/label>\r\n                        <input class=\"sz-inp\" type=\"text\" id=\"szLN\" placeholder=\"\">\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"sz-2col\">\r\n                    <div class=\"sz-field\">\r\n                        <label class=\"sz-lbl\" for=\"szPhone\">Phone Number: <span class=\"req\">*<\/span><\/label>\r\n                        <input class=\"sz-inp\" type=\"tel\" id=\"szPhone\" placeholder=\"\">\r\n                    <\/div>\r\n                    <div class=\"sz-field\">\r\n                        <label class=\"sz-lbl\" for=\"szEmail\">Email Address: <span class=\"req\">*<\/span><\/label>\r\n                        <input class=\"sz-inp\" type=\"email\" id=\"szEmail\" placeholder=\"\">\r\n                    <\/div>\r\n                <\/div>\r\n\r\n\r\n                <div class=\"sz-grp\">\r\n                    <label class=\"sz-lbl\" for=\"szGroupID\">\r\n                       Party\/Group ID:\r\n                        <span style=\"font-size:11px;\">\r\n                            (Can be found on your e-receipt. Different from the sale ID)\r\n                        <\/span>\r\n                    <\/label>\r\n\r\n                    <input class=\"sz-inp\" type=\"text\" id=\"szGroupID\" placeholder=\"Enter Party\/Group ID\">\r\n                <\/div>\r\n\r\n                <div class=\"sz-grp\">\r\n                    <label class=\"sz-lbl\" for=\"szRSVPBy\">\r\n                        RSVP By Date: <span class=\"req\">*<\/span>\r\n                    <\/label>\r\n                    <input class=\"sz-inp\" type=\"date\" id=\"szRSVPBy\">\r\n                <\/div>\r\n\r\n                <!-- errors -->\r\n                <div id=\"szErr\" class=\"sz-msg sz-msg-err\"><\/div>\r\n                <div id=\"szOk\" class=\"sz-msg sz-msg-ok\"><\/div>\r\n\r\n                <!-- generate -->\r\n                <div class=\"sz-gen-wrap\">\r\n                    <button type=\"submit\" class=\"sz-gen\" id=\"szGenBtn\">\r\n                        GENERATE\r\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n                            stroke-width=\"3\">\r\n                            <path d=\"M5 12h14M13 6l6 6-6 6\" \/>\r\n                        <\/svg>\r\n                    <\/button>\r\n                <\/div>\r\n\r\n            <\/form>\r\n        <\/div>\r\n\r\n        <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 RIGHT: PREVIEW \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n        <div class=\"sz-right\">\r\n            <div class=\"sz-right-lbl\">Sample Invitation:<\/div>\r\n\r\n            <!-- 3 pattern preview thumbnails -->\r\n            <div class=\"sz-preview-thumbs\" id=\"szPrevThumbs\">\r\n                <div class=\"sz-prev-thumb active\" data-p=\"0\"><canvas id=\"szPT0\" width=\"220\" height=\"229\"><\/canvas><\/div>\r\n                <div class=\"sz-prev-thumb\" data-p=\"1\"><canvas id=\"szPT1\" width=\"220\" height=\"229\"><\/canvas><\/div>\r\n                <div class=\"sz-prev-thumb\" data-p=\"2\"><canvas id=\"szPT2\" width=\"220\" height=\"229\"><\/canvas><\/div>\r\n\r\n            <\/div>\r\n\r\n            <!-- main canvas -->\r\n            <div class=\"sz-canvas-wrap\">\r\n                <canvas id=\"szCanvas\" width=\"660\" height=\"950\"><\/canvas>\r\n                <div class=\"sz-placeholder\" id=\"szPlaceholder\">\r\n                    <svg width=\"56\" height=\"56\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#bbb\" stroke-width=\"1.5\">\r\n                        <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" \/>\r\n                        <path d=\"M3 9h18M9 21V9\" \/>\r\n                    <\/svg>\r\n                    <p>Fill in the form and click<br><strong>GENERATE<\/strong> to see your invitation<\/p>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- post-generate actions -->\r\n            <div class=\"sz-actions\" id=\"szActions\">\r\n                <button class=\"sz-dl\" onclick=\"szDownload()\">\r\n                    <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n                        stroke-width=\"2.5\">\r\n                        <path d=\"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3\" \/>\r\n                    <\/svg>\r\n                    Download Invitation PNG\r\n                <\/button>\r\n                <button class=\"sz-email-btn\" id=\"szEmailBtn\" style=\"display:none\">\r\n                    <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n                        <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\" \/>\r\n                        <polyline points=\"22,6 12,13 2,6\" \/>\r\n                    <\/svg>\r\n                    Send via Email\r\n                <\/button>\r\n            <\/div>\r\n        <\/div>\r\n\r\n    <\/div><!-- .sz-grid -->\r\n<\/div><!-- .sz -->\r\n\r\n<script>\r\n\r\n    \/\/ Pre-load the logo\r\n    const arLogo = new Image();\r\n    arLogo.src = 'https:\/\/www.airriderz.com\/wp-content\/uploads\/logo.png';\r\n\r\n    \/\/ Pre-load the QR Code\r\n    const waiverQR = new Image();\r\n    waiverQR.src = 'https:\/\/www.airriderz.com\/portchester\/wp-content\/uploads\/2026\/06\/portchester-waiver-code.png';\r\n\r\n    (function () {\r\n        'use strict';\r\n\r\n        \/* \u2500\u2500 CONFIG \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n           Set SEND_URL to your PHP backend to enable email delivery.\r\n           Leave '' for download-only mode (no backend required).              *\/\r\n        var SEND_URL = '';\r\n\r\n        var PARK = {\r\n            name: 'Air Riderz Trampoline Park',\r\n            address: '3600 Ridgeway Drive, Unit 4 & 5',\r\n            city: 'Mississauga, ON L5L 0B4',\r\n            waiver: 'www.airriderz.com\/mississauga\/waiver\/',\r\n            url: 'https:\/\/www.airriderz.com\/mississauga\/'\r\n        };\r\n\r\n       \/* \u2500\u2500 BACKGROUND PATTERNS \u2500\u2500\u2500\u2500\u2500\u2500       *\/\r\n        var PATTERNS = [\r\n               \/\/ Pattern 0: blue bg, blob shapes, pink diagonal stripes\r\n            {\r\n                bg: '#0000cc',\r\n                shapes: [\r\n                    { type: 'blob', color: '#74B94C' },\r\n                    { type: 'stripes', color: '#ff66cc' }\r\n                ]\r\n            },\r\n            \/\/ Pattern 1: Light mint\/green tones\r\n            {\r\n                bg: '#e8fff0',\r\n                shapes: [\r\n                    { type: 'blob', color: '#00cc00' },\r\n                    { type: 'rect', color: '#0000ff' },\r\n                    { type: 'circle2', color: 'rgba(0,0,255,0.2)' }\r\n                ]\r\n            },\r\n            \/\/ Pattern 2: light green watercolor wash, splatter, dark blue bottom band\r\n            {\r\n                bg: '#0000cc',\r\n                shapes: [\r\n                    { type: 'splatter', color: '#74B94C' }\r\n                ]\r\n            }\r\n        ];\r\n\r\n \/* \u2500\u2500 DRAW PATTERN ON CANVAS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        function drawPattern(ctx, w, h, pi) {\r\n            var p = PATTERNS[pi];\r\n\r\n            \/\/ background\r\n            ctx.fillStyle = p.bg;\r\n            ctx.fillRect(0, 0, w, h);\r\n\r\n           \/\/ --- Pattern 0: blue bg, blob shapes, pink diagonal stripes ---\r\n            if (pi === 0) {\r\n                \/\/ diagonal stripe lines (pink only)\r\n                ctx.save();\r\n                ctx.strokeStyle = '#ff66cc';\r\n                ctx.lineWidth = w * 0.045;\r\n                for (var i = -h; i < w + h; i += w * 0.13) {\r\n                    ctx.beginPath();\r\n                    ctx.moveTo(i, 0);\r\n                    ctx.lineTo(i + h, h);\r\n                    ctx.stroke();\r\n                }\r\n                ctx.restore();\r\n\r\n                \/\/ white circles\r\n                ctx.fillStyle = 'rgba(255,255,255,0.15)';\r\n                ctx.beginPath(); ctx.arc(w * 0.85, h * 0.45, w * 0.09, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.12, h * 0.6, w * 0.07, 0, Math.PI * 2); ctx.fill();\r\n                \/\/ blue accent blobs\r\n                ctx.fillStyle = 'rgba(0,100,255,0.5)';\r\n                drawWave(ctx, w * 0.5, h * 0.1, w * 0.2, h * 0.18);\r\n                drawWave(ctx, w * 0.1, h * 0.45, w * 0.16, h * 0.15);\r\n            }\r\n\r\n            \/\/ --- Pattern 1: light mint\/green tones ---\r\n            if (pi === 1) {\r\n                ctx.fillStyle = '#92b57c';\r\n                drawWave(ctx, w * 0.02, h * 0.05, w * 0.22, h * 0.28);\r\n                drawWave(ctx, w * 0.6, h * 0.6, w * 0.22, h * 0.28);\r\n\r\n                ctx.fillStyle = '#0000cc';\r\n                drawRotRect(ctx, w * 0.7, h * 0.05, w * 0.1, h * 0.08, 12);\r\n                drawRotRect(ctx, w * 0.82, h * 0.78, w * 0.1, h * 0.08, -10);\r\n                drawRotRect(ctx, w * 0.04, h * 0.6, w * 0.09, h * 0.07, 15);\r\n\r\n                ctx.fillStyle = 'rgba(0,0,204,0.2)';\r\n                ctx.beginPath(); ctx.arc(w * 0.78, h * 0.2, w * 0.1, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.2, h * 0.8, w * 0.08, 0, Math.PI * 2); ctx.fill();\r\n            }\r\n\r\n            \/\/ --- Pattern 2: light green watercolor wash, splatter, dark blue bottom band, squiggle ---\r\n            if (pi === 2) {\r\n                \/\/ light green\/white watercolor background\r\n                ctx.fillStyle = '#eaf6e4';\r\n                ctx.fillRect(0, 0, w, h);\r\n\r\n                \/\/ soft white streaks\r\n                ctx.save();\r\n                ctx.fillStyle = 'rgba(255,255,255,0.55)';\r\n                for (var s = 0; s < 14; s++) {\r\n                    ctx.save();\r\n                    ctx.translate(w * (0.05 + (s % 7) * 0.13), h * (0.05 + Math.floor(s \/ 7) * 0.45) + (s % 3) * h * 0.05);\r\n                    ctx.rotate(-0.45);\r\n                    ctx.fillRect(0, 0, w * 0.6, h * 0.012);\r\n                    ctx.restore();\r\n                }\r\n                ctx.restore();\r\n\r\n                \/\/ green dashed border curve top-right\r\n                ctx.strokeStyle = '#74B94C';\r\n                ctx.lineWidth = h * 0.012;\r\n                ctx.setLineDash([h * 0.018, h * 0.012]);\r\n                ctx.beginPath();\r\n                ctx.moveTo(w * 0.45, -h * 0.02);\r\n                ctx.quadraticCurveTo(w * 0.65, h * 0.1, w * 1.02, h * 0.07);\r\n                ctx.stroke();\r\n                ctx.setLineDash([]);\r\n\r\n                \/\/ green corner fill (top-right)\r\n                ctx.fillStyle = '#74B94C';\r\n                ctx.beginPath();\r\n                ctx.moveTo(w * 0.55, -h * 0.02);\r\n                ctx.quadraticCurveTo(w * 0.7, h * 0.06, w * 1.02, h * 0.04);\r\n                ctx.lineTo(w * 1.02, -h * 0.02);\r\n                ctx.closePath();\r\n                ctx.fill();\r\n\r\n                \/\/ splatter blobs (paint splash)\r\n                ctx.fillStyle = 'rgba(116,185,76,0.55)';\r\n                ctx.beginPath(); ctx.arc(w * 0.78, h * 0.27, w * 0.085, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.66, h * 0.32, w * 0.022, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.6, h * 0.36, w * 0.012, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.5, h * 0.27, w * 0.028, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.42, h * 0.34, w * 0.018, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.38, h * 0.38, w * 0.01, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.86, h * 0.18, w * 0.012, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.9, h * 0.32, w * 0.01, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.52, h * 0.31, w * 0.008, 0, Math.PI * 2); ctx.fill();\r\n                ctx.beginPath(); ctx.arc(w * 0.58, h * 0.41, w * 0.008, 0, Math.PI * 2); ctx.fill();\r\n\r\n                \/\/ dark blue bottom band\r\n                var bandY = h * 0.745;\r\n                ctx.fillStyle = '#0000cc';\r\n                ctx.fillRect(0, bandY, w, h - bandY);\r\n\r\n                \/\/ green squiggle on blue band\r\n                ctx.strokeStyle = '#74B94C';\r\n                ctx.lineWidth = h * 0.0065;\r\n                ctx.beginPath();\r\n                ctx.moveTo(0, bandY + h * 0.1);\r\n                ctx.bezierCurveTo(w * 0.18, bandY + h * 0.04, w * 0.22, bandY + h * 0.18, w * 0.38, bandY + h * 0.16);\r\n                ctx.bezierCurveTo(w * 0.5, bandY + h * 0.14, w * 0.4, bandY + h * 0.02, w * 0.46, bandY + h * 0.0);\r\n                ctx.bezierCurveTo(w * 0.55, bandY - h * 0.02, w * 0.6, bandY + h * 0.18, w * 0.75, bandY + h * 0.16);\r\n                ctx.bezierCurveTo(w * 0.88, bandY + h * 0.14, w * 0.92, bandY + h * 0.22, w, bandY + h * 0.2);\r\n                ctx.stroke();\r\n            }\r\n        }\r\n\r\n        function drawWave(ctx, x, y, w, h) {\r\n            ctx.beginPath();\r\n            ctx.moveTo(x, y + h * 0.5);\r\n            ctx.bezierCurveTo(x + w * 0.2, y, x + w * 0.4, y + h, x + w * 0.5, y + h * 0.5);\r\n            ctx.bezierCurveTo(x + w * 0.6, y, x + w * 0.8, y + h, x + w, y + h * 0.5);\r\n            ctx.lineTo(x + w, y + h * 1.5);\r\n            ctx.bezierCurveTo(x + w * 0.8, y + h, x + w * 0.6, y + h * 2, x + w * 0.5, y + h * 1.5);\r\n            ctx.bezierCurveTo(x + w * 0.4, y + h, x + w * 0.2, y + h * 2, x, y + h * 1.5);\r\n            ctx.closePath();\r\n            ctx.fill();\r\n        }\r\n\r\n        function drawRotRect(ctx, x, y, w, h, deg) {\r\n            ctx.save();\r\n            ctx.translate(x + w \/ 2, y + h \/ 2);\r\n            ctx.rotate(deg * Math.PI \/ 180);\r\n            ctx.fillRect(-w \/ 2, -h \/ 2, w, h);\r\n            ctx.restore();\r\n        }\r\n\r\n        function drawWaveLine(ctx, x1, y, x2, baseY, amp) {\r\n            var segs = 12;\r\n            ctx.beginPath();\r\n            ctx.moveTo(x1, baseY);\r\n            for (var i = 0; i <= segs; i++) {\r\n                var px = x1 + (x2 - x1) * i \/ segs;\r\n                var py = baseY + Math.sin(i \/ segs * Math.PI * 4) * amp * (baseY \/ 600);\r\n                i === 0 ? ctx.moveTo(px, py) : ctx.lineTo(px, py);\r\n            }\r\n            ctx.stroke();\r\n        }\r\n\r\n\r\n\r\n        \/* \u2500\u2500 DRAW THUMBNAIL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        function drawThumb(canvasId, w, h, pi) {\r\n            var c = document.getElementById(canvasId);\r\n            if (!c) return;\r\n            c.width = w; c.height = h;\r\n            var ctx = c.getContext('2d');\r\n            drawPattern(ctx, w, h, pi);\r\n        }\r\n\r\n        \/* \u2500\u2500 POPULATE YEAR DROPDOWN \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        function populateYears() {\r\n            var sel = document.getElementById('szYY');\r\n            var yr = new Date().getFullYear();\r\n            for (var y = yr; y <= yr + 3; y++) {\r\n                var o = document.createElement('option');\r\n                o.value = y; o.textContent = y;\r\n                sel.appendChild(o);\r\n            }\r\n        }\r\n\r\n        \/* \u2500\u2500 POPULATE DAY DROPDOWN \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        function populateDays(month, year) {\r\n            var sel = document.getElementById('szDD');\r\n            var cur = sel.value;\r\n            while (sel.options.length > 1) sel.remove(1);\r\n            var days = 31;\r\n            if (month && year) days = new Date(year, month, 0).getDate();\r\n            else if (month) days = new Date(2024, month, 0).getDate();\r\n            for (var d = 1; d <= days; d++) {\r\n                var o = document.createElement('option');\r\n                o.value = d; o.textContent = d < 10 ? '0' + d : d;\r\n                sel.appendChild(o);\r\n            }\r\n            if (cur) sel.value = cur;\r\n        }\r\n\r\n        \/* \u2500\u2500 HELPERS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        function gv(id) { var e = document.getElementById(id); return e ? e.value : ''; }\r\n        var MONTHS_SHORT = ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n        var MONTHS_LONG = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n\r\n        function fmtDate(m, d, y) {\r\n            if (!m || !d || !y) return '';\r\n            return MONTHS_LONG[+m] + ' ' + (+d) + ', ' + y;\r\n        }\r\n        function fmtTime(h, m, ap) {\r\n            if (!h || !m || !ap) return '';\r\n            return h + ':' + m + ' ' + ap;\r\n        }\r\n\r\n        \/* \u2500\u2500 VALIDATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        function validate() {\r\n            var errs = [];\r\n            if (!gv('szMM') || !gv('szDD') || !gv('szYY')) errs.push('Please select a full party date.');\r\n            if (!gv('szCIH') || !gv('szCIM') || !gv('szCIAP')) errs.push('Please select a check-in time.');\r\n            if (!gv('szETH') || !gv('szETM') || !gv('szETAP')) errs.push('Please select an end time.');\r\n            if (!gv('szCel').trim()) errs.push('Please enter what you are celebrating.');\r\n            if (!gv('szFN').trim()) errs.push('First name is required.');\r\n            if (!gv('szLN').trim()) errs.push('Last name is required.');\r\n            if (!gv('szPhone').trim()) errs.push('Phone number is required.');\r\n            if (!gv('szRSVPBy')) errs.push('Please select RSVP by date.');\r\n            var em = gv('szEmail').trim();\r\n            if (!em || !\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(em)) errs.push('A valid email address is required.');\r\n            return errs;\r\n        }\r\n\r\n\r\n        function drawInvite(pi) {\r\n            var canvas = document.getElementById('szCanvas');\r\n            var ctx = canvas.getContext('2d');\r\n            var CW = 660, CH = 950;\r\n\r\n            \/\/ 1. Full-bleed background pattern\r\n            drawPattern(ctx, CW, CH, pi);\r\n\r\n            \/\/ 2. Inner black content panel\r\n            var PX = CW * 0.13,  \/\/ left edge of panel\r\n                PY = CH * 0.10,  \/\/ top edge of panel\r\n                PW = CW * 0.6,   \/\/ panel width\r\n                PH = CH * 0.75; \/\/ panel height\r\n            ctx.fillStyle = '#ffffff';\r\n            ctx.fillRect(PX, PY, PW, PH);\r\n\r\n            \/\/ slight border accent on left edge of panel\r\n            ctx.fillStyle = '#00ff00';\r\n            ctx.fillRect(PX, PY, 4, PH);\r\n\r\n            var TX = PX + 28; \/\/ text left margin inside panel\r\n            var TW = PW - 56; \/\/ text max width\r\n\r\n            \/\/ 3. Logo area \u2014 Air Riderz logo image\r\n            var logoY = PY + 22;\r\n            var logoH = 46;\r\n            var logoW = arLogo.naturalWidth ? (arLogo.naturalWidth \/ arLogo.naturalHeight) * logoH : 130;\r\n            if (arLogo.complete && arLogo.naturalWidth) {\r\n                ctx.drawImage(arLogo, TX, logoY, logoW, logoH);\r\n            }\r\n\r\n            \/\/ 4. \"YOU'RE INVITED\" \u2014 massive display type\r\n            ctx.fillStyle = '#000000';\r\n            ctx.font = '900 ' + Math.round(CW * 0.112) + 'px \"Barlow Condensed\",\"Barlow\",sans-serif';\r\n            ctx.textAlign = 'left';\r\n            var invY = logoY + 120;\r\n            ctx.fillText(\"YOU'RE\", TX, invY);\r\n            ctx.fillText(\"INVITED\", TX, invY + Math.round(CW * 0.116));\r\n\r\n            \/\/ 5. \"Please join us on [date] for\"\r\n            var dateStr = fmtDate(gv('szMM'), gv('szDD'), gv('szYY'));\r\n            var infoY = invY + Math.round(CW * 0.116) + 38;\r\n            ctx.fillStyle = '#000000';\r\n            ctx.font = '500 14px \"Barlow\",sans-serif';\r\n            ctx.fillText('Please join us on ' + (dateStr || '[date]') + ' for', TX, infoY);\r\n\r\n            \/\/ 6. Celebration name \u2014 bold, accent green colour\r\n            var celText = (gv('szCel') || 'WHAT WE ARE CELEBRATING').toUpperCase();\r\n            ctx.fillStyle = '#000000';\r\n            ctx.font = 'bold 18px \"Barlow Condensed\",\"Barlow\",sans-serif';\r\n            var celY = infoY + 36;\r\n            \/\/ word-wrap the celebration name\r\n            ctx.fillStyle = '#0000cc';\r\n            celY = wrapCanvasText(ctx, celText, TX, celY, TW, 22) + 28;\r\n\r\n            \/\/ 7. Time lines\r\n            var ciTime = fmtTime(gv('szCIH'), gv('szCIM'), gv('szCIAP'));\r\n            var etTime = fmtTime(gv('szETH'), gv('szETM'), gv('szETAP'));\r\n            ctx.fillStyle = '#000000';\r\n            ctx.font = '600 13px \"Barlow\",sans-serif';\r\n            if (ciTime) { ctx.fillText('Check In Time: ' + ciTime, TX, celY + 4); celY += 30; }\r\n            if (etTime) { ctx.fillText('Party End Time: ' + etTime, TX, celY + 4); celY += 30; }\r\n\r\n            celY += 22;\r\n\r\n            \/\/ 8. Park name + address\r\n            ctx.fillStyle = '#000000';\r\n            ctx.font = 'bold 14px \"Barlow\",sans-serif';\r\n            ctx.fillText(PARK.name, TX, celY);\r\n            ctx.fillStyle = '#000000';\r\n            ctx.font = '500 13px \"Barlow\",sans-serif';\r\n            ctx.fillText(PARK.address, TX, celY + 18);\r\n            ctx.fillText(PARK.city, TX, celY + 34);\r\n            celY += 58;\r\n\r\n            \/\/ Group\/Jump ID\r\n            var groupId = gv('szGroupID') || 'N\/A';\r\n\r\n            ctx.fillStyle = '#000000';\r\n            ctx.font = 'bold 13px \"Barlow\",sans-serif';\r\n            ctx.fillText('Party\/Group ID:', TX, celY);\r\n\r\n            ctx.font = '500 13px \"Barlow\",sans-serif';\r\n            ctx.fillText(groupId, TX + 115, celY);\r\n\r\n            celY += 34;\r\n\r\n            \/\/ 9. RSVP line\r\n            var fn = gv('szFN'), ln = gv('szLN'), ph = gv('szPhone'), em = gv('szEmail');\r\n            var rsvpName = ((fn + ' ' + ln).trim()) || 'Firstname Lastname';\r\n            var rsvpPhone = ph || '555-555-5555';\r\n            var rsvpEmail = em || 'name@email.com';\r\n            ctx.fillStyle = '#000000';\r\n            ctx.font = '500 13px \"Barlow\",sans-serif';\r\n            var rsvpLine1 = 'Please RSVP by contacting ' + rsvpName + ' at';\r\n            celY = wrapCanvasText(ctx, rsvpLine1, TX, celY, TW, 18) + 24;\r\n            \/\/ phone in white, email in accent\r\n            var pW = ctx.measureText(rsvpPhone).width;\r\n            ctx.fillText(rsvpPhone, TX, celY);\r\n            ctx.fillStyle = '#0000cc';\r\n            ctx.fillText(' or ' + rsvpEmail, TX + pW, celY);\r\n            celY += 25;\r\n\r\n            var rsvpBy = gv('szRSVPBy');\r\n\r\n            if (rsvpBy) {\r\n                var rsvpByDate = new Date(rsvpBy);\r\n                var formattedRSVPBy =\r\n                    rsvpByDate.toLocaleDateString('en-US', {\r\n                        year: 'numeric',\r\n                        month: 'long',\r\n                        day: 'numeric'\r\n                    });\r\n\r\n                ctx.fillStyle = '#000000';\r\n                ctx.font = '600 13px \"Barlow\",sans-serif';\r\n                ctx.fillText('Please RSVP by: ' + formattedRSVPBy, TX, celY + 18);\r\n\r\n                celY += 2;\r\n            }\r\n\r\n\r\n            \/\/ 10. CTA waiver button bar\r\ncelY += 50;\r\n           \r\nvar btnY = celY;\r\nvar btnHeight = 52;\r\nvar btnX = PX + 14;\r\nvar btnWidth = PW - 28;\r\n\r\nctx.save();\r\n\r\n\/\/ 1. Clear the area first to wipe out any ghost artifacts\r\nctx.clearRect(btnX, btnY, btnWidth, btnHeight);\r\n\r\n\/\/ 2. Draw the Button Background\r\nctx.fillStyle = '#00CC00';\r\nctx.fillRect(btnX, btnY, btnWidth, btnHeight);\r\n\r\n\/\/ Define Column Widths (80% \/ 20%)\r\nvar textColWidth = btnWidth * 0.80;\r\nvar arrowColWidth = btnWidth * 0.20;\r\n\r\n\/\/ Calculate Positions\r\nvar btnCenterY = btnY + (btnHeight \/ 2);\r\nvar textLeftPadding = btnX + 12; \r\nvar arrowCenterX = btnX + textColWidth + (arrowColWidth \/ 2);\r\n\r\n\/\/ 3. Configure & Draw Text (Left Column - 80%)\r\nctx.fillStyle = '#000000';\r\nctx.font = 'bold 10px \"Barlow Condensed\", \"Barlow\", sans-serif';\r\nctx.textAlign = 'left';\r\nctx.textBaseline = 'middle';\r\n\r\nctx.fillText('FILL OUT A WAIVER ONLINE AT:', textLeftPadding, btnCenterY - 13);\r\nctx.fillText(PARK.waiver.toUpperCase(), textLeftPadding, btnCenterY);\r\nctx.fillText('Or scan the QR code to complete your waiver online', textLeftPadding, btnCenterY + 13);\r\n\r\n\/\/ 4. Configure & Draw Arrow (Right Column - 20%)\r\nctx.font = 'bold 34px \"Barlow Condensed\", \"Barlow\", sans-serif';\r\nctx.textAlign = 'center';\r\n\r\nctx.fillText('\u2193', arrowCenterX, btnCenterY);\r\n\r\n\/\/ Clean up path state\r\nctx.beginPath();\r\n\r\nctx.restore();\r\n\r\n            \/\/ 11. Disclaimer footer with QR CODE\r\n            var FOOTER_H = 80; \/\/ increased height\r\n            var FOOTER_Y = PY + PH - FOOTER_H;\r\n            var discY = celY + 70;\r\n            ctx.fillStyle = '#000000';\r\n            ctx.fillRect(PX, discY, PW, FOOTER_H);\r\n\r\n            \/\/ QR size + position\r\n            var qrSize = 65; \/\/ slightly larger for clarity\r\n\r\n            var qrPadding = 5;\r\n            var qrX = PX + PW - qrSize - qrPadding;\r\n            var qrY = discY + 5; \/\/ more top breathing space\r\n\r\n            if (waiverQR.complete) {\r\n                ctx.drawImage(waiverQR, qrX, qrY, qrSize, qrSize);\r\n            }\r\n\r\n            \/\/ text block\r\n            ctx.fillStyle = '#ffffff';\r\n            ctx.font = '500 13px \"Barlow\",sans-serif';\r\n            ctx.textAlign = 'left';\r\n\r\n            var textX = TX;\r\n            var textY = discY + 24;\r\n            ctx.fillText(\r\n                'All jumpers must have a signed waiver on file',\r\n                textX,\r\n                textY\r\n            );\r\n\r\n             ctx.fillText(\r\n                'prior to jumping. Anyone under 18 must have a ',\r\n                textX,\r\n                textY + 18\r\n            );\r\n\r\n            ctx.fillText(\r\n                'waiver signed by their parent or legal guardian.',\r\n                textX,\r\n                textY + 36\r\n            );\r\n      }\r\n\r\n        \/* word-wrap helper for canvas *\/\r\n        function wrapCanvasText(ctx, text, x, y, maxW, lineH) {\r\n            var words = text.split(' '), line = '';\r\n            for (var n = 0; n < words.length; n++) {\r\n                var test = line + (line ? ' ' : '') + words[n];\r\n                if (ctx.measureText(test).width > maxW && n > 0) {\r\n                    ctx.fillText(line, x, y);\r\n                    line = words[n]; y += lineH;\r\n                } else line = test;\r\n            }\r\n            ctx.fillText(line, x, y);\r\n            return y;\r\n        }\r\n\r\n        \/* \u2500\u2500 INIT THUMBNAILS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        function initThumbs() {\r\n            \/\/ form picker thumbs\r\n            for (var i = 0; i < 3; i++) drawThumb('szBgC' + i, 100, 120, i);\r\n            \/\/ right-column preview mini-thumbs\r\n            for (var j = 0; j < 3; j++) drawThumb('szPT' + j, 220, 229, j);\r\n        }\r\n\r\n        \/* \u2500\u2500 SYNC PICKERS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        function getSelectedBg() {\r\n            var radios = document.getElementsByName('sz_bg');\r\n            for (var i = 0; i < radios.length; i++) if (radios[i].checked) return +radios[i].value;\r\n            return 0;\r\n        }\r\n\r\n        \/\/ clicking right-column preview thumb selects that bg\r\n        document.getElementById('szPrevThumbs').addEventListener('click', function (e) {\r\n            var t = e.target.closest('.sz-prev-thumb');\r\n            if (!t) return;\r\n            var p = +t.dataset.p;\r\n            document.querySelectorAll('.sz-prev-thumb').forEach(function (el) { el.classList.remove('active'); });\r\n            t.classList.add('active');\r\n            \/\/ sync left radio\r\n            var r = document.getElementById('szBg' + p);\r\n            if (r) r.checked = true;\r\n        });\r\n\r\n        \/\/ clicking left radio syncs right-column thumbs\r\n        document.getElementById('szBgs').addEventListener('change', function (e) {\r\n            var val = e.target.value;\r\n            document.querySelectorAll('.sz-prev-thumb').forEach(function (el) { el.classList.remove('active'); });\r\n            var pt = document.querySelector('.sz-prev-thumb[data-p=\"' + val + '\"]');\r\n            if (pt) pt.classList.add('active');\r\n        });\r\n\r\n        \/* \u2500\u2500 CHARACTER COUNTER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        document.getElementById('szCel').addEventListener('input', function () {\r\n            var len = this.value.length;\r\n            var counter = document.getElementById('szCounter');\r\n            counter.textContent = len + ' of 72 max characters';\r\n            counter.className = 'sz-counter' + (len > 60 ? ' warn' : '');\r\n        });\r\n\r\n        \/* \u2500\u2500 DATE DROPDOWNS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        document.getElementById('szMM').addEventListener('change', function () {\r\n            populateDays(this.value, gv('szYY'));\r\n        });\r\n        document.getElementById('szYY').addEventListener('change', function () {\r\n            populateDays(gv('szMM'), this.value);\r\n        });\r\n\r\n        \/* \u2500\u2500 FORM SUBMIT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        document.getElementById('szForm').addEventListener('submit', async function (e) {\r\n            e.preventDefault();\r\n\r\n            var errEl = document.getElementById('szErr');\r\n            var okEl = document.getElementById('szOk');\r\n            var btn = document.getElementById('szGenBtn');\r\n            errEl.style.display = okEl.style.display = 'none';\r\n\r\n            var errs = validate();\r\n            if (errs.length) {\r\n                errEl.innerHTML = errs.join('<br>');\r\n                errEl.style.display = 'block';\r\n                errEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n                return;\r\n            }\r\n\r\n            \/\/ draw the invite\r\n            var pi = getSelectedBg();\r\n            drawInvite(pi);\r\n\r\n            \/\/ hide placeholder\r\n            document.getElementById('szPlaceholder').classList.add('gone');\r\n\r\n            \/\/ show download actions\r\n            document.getElementById('szActions').classList.add('show');\r\n            if (SEND_URL) document.getElementById('szEmailBtn').style.display = 'flex';\r\n\r\n            \/\/ scroll to preview on mobile\r\n            if (window.innerWidth < 820) {\r\n                document.getElementById('szCanvas').scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n            }\r\n\r\n            \/\/ send to backend if configured\r\n            if (SEND_URL) {\r\n                btn.disabled = true;\r\n                btn.innerHTML = 'Sending\u2026 <span style=\"opacity:.6\">\u21bb<\/span>';\r\n                try {\r\n                    var fd = new FormData();\r\n                    fd.append('ar_action', 'send_invite');\r\n                    fd.append('celebration', gv('szCel'));\r\n                    fd.append('party_date', gv('szYY') + '-' + String(gv('szMM')).padStart(2, '0') + '-' + String(gv('szDD')).padStart(2, '0'));\r\n                    fd.append('start_time', gv('szCIH') + ':' + gv('szCIM') + ' ' + gv('szCIAP'));\r\n                    fd.append('end_time', gv('szETH') + ':' + gv('szETM') + ' ' + gv('szETAP'));\r\n                    fd.append('first_name', gv('szFN'));\r\n                    fd.append('last_name', gv('szLN'));\r\n                    fd.append('phone', gv('szPhone'));\r\n                    fd.append('email', gv('szEmail'));\r\n                    fd.append('bg_theme', String(pi));\r\n                    fd.append('rsvp_by', gv('szRSVPBy'));\r\n                    fd.append('invite_image', document.getElementById('szCanvas').toDataURL('image\/png'));\r\n\r\n                    var res = await fetch(SEND_URL, { method: 'POST', body: fd });\r\n                    var data = await res.json();\r\n                    if (data.success) {\r\n                        okEl.textContent = '\u2713 ' + data.message;\r\n                        okEl.style.display = 'block';\r\n                    } else {\r\n                        errEl.textContent = data.message || 'Email delivery failed \u2014 please download the invitation.';\r\n                        errEl.style.display = 'block';\r\n                    }\r\n                } catch (ex) {\r\n                    errEl.textContent = 'Network error \u2014 your invitation is ready to download below.';\r\n                    errEl.style.display = 'block';\r\n                }\r\n                btn.disabled = false;\r\n                btn.innerHTML = 'GENERATE <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>';\r\n            }\r\n        });\r\n\r\n        \/* \u2500\u2500 DOWNLOAD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        window.szDownload = function () {\r\n            var errs = validate();\r\n            if (errs.length) { drawInvite(getSelectedBg()); }\r\n            var a = document.createElement('a');\r\n            a.download = 'airriderz-invitation.png';\r\n            a.href = document.getElementById('szCanvas').toDataURL('image\/png');\r\n            a.click();\r\n        };\r\n\r\n        \/* \u2500\u2500 BOOT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\r\n        populateYears();\r\n        populateDays('', '');\r\n        initThumbs();\r\n\r\n    }());\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Select a background: * When is your party? * MMJanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember DD YYYY Check-In Time:* (15 mins. before jump time) HH123456789101112 : MM00153045 AM\/PMAMPM End Time:* (Scheduled room end time) HH123456789101112 : MM00153045 AM\/PMAMPM What are you celebrating? * 0 of 72 max characters Who should people contact to RSVP? First Name: * Last Name: * &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.airriderz.com\/portchester\/invitation-card\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Invitation Card&#8221;<\/span><\/a><\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2617465","page","type-page","status-publish","hentry","entry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Invitation Card<\/title>\n<meta name=\"description\" content=\"Experience fun and excitement at Air Riderz Port Chester! Enjoy our wall-to-wall trampolines, ninja warrior courses, and Climb Zone. Perfect for kids, families, and group events. Visit us for unforgettable memories in Port Chester, Rye, Greenwich, and more. Invitation Card For more details, you can contact us now!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.airriderz.com\/portchester\/invitation-card\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Invitation Card\" \/>\n<meta property=\"og:description\" content=\"Experience fun and excitement at Air Riderz Port Chester! Enjoy our wall-to-wall trampolines, ninja warrior courses, and Climb Zone. Perfect for kids, families, and group events. Visit us for unforgettable memories in Port Chester, Rye, Greenwich, and more. Invitation Card For more details, you can contact us now!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.airriderz.com\/portchester\/invitation-card\/\" \/>\n<meta property=\"og:site_name\" content=\"Air Riderz\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/airriderzportchester\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-17T19:36:10+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@AirRiderz\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/invitation-card\\\/\",\"url\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/invitation-card\\\/\",\"name\":\"Invitation Card\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/#website\"},\"datePublished\":\"2026-06-17T19:35:29+00:00\",\"dateModified\":\"2026-06-17T19:36:10+00:00\",\"description\":\"Experience fun and excitement at Air Riderz Port Chester! Enjoy our wall-to-wall trampolines, ninja warrior courses, and Climb Zone. Perfect for kids, families, and group events. Visit us for unforgettable memories in Port Chester, Rye, Greenwich, and more. Invitation Card For more details, you can contact us now!\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/invitation-card\\\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/#website\",\"url\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/\",\"name\":\"Air Riderz\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/#organization\",\"name\":\"Air Riderz Trampoline Park Port Chester\",\"url\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"http:\\\/\\\/www.airriderz.com\\\/portchester\\\/wp-content\\\/uploads\\\/2020\\\/02\\\/logo.png\",\"contentUrl\":\"http:\\\/\\\/www.airriderz.com\\\/portchester\\\/wp-content\\\/uploads\\\/2020\\\/02\\\/logo.png\",\"width\":147,\"height\":111,\"caption\":\"Air Riderz Trampoline Park Port Chester\"},\"image\":{\"@id\":\"https:\\\/\\\/www.airriderz.com\\\/portchester\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/airriderzportchester\\\/\",\"https:\\\/\\\/x.com\\\/AirRiderz\",\"https:\\\/\\\/www.instagram.com\\\/airriderz_portchester\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Invitation Card","description":"Experience fun and excitement at Air Riderz Port Chester! Enjoy our wall-to-wall trampolines, ninja warrior courses, and Climb Zone. Perfect for kids, families, and group events. Visit us for unforgettable memories in Port Chester, Rye, Greenwich, and more. Invitation Card For more details, you can contact us now!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.airriderz.com\/portchester\/invitation-card\/","og_locale":"en_US","og_type":"article","og_title":"Invitation Card","og_description":"Experience fun and excitement at Air Riderz Port Chester! Enjoy our wall-to-wall trampolines, ninja warrior courses, and Climb Zone. Perfect for kids, families, and group events. Visit us for unforgettable memories in Port Chester, Rye, Greenwich, and more. Invitation Card For more details, you can contact us now!","og_url":"https:\/\/www.airriderz.com\/portchester\/invitation-card\/","og_site_name":"Air Riderz","article_publisher":"https:\/\/www.facebook.com\/airriderzportchester\/","article_modified_time":"2026-06-17T19:36:10+00:00","twitter_card":"summary_large_image","twitter_site":"@AirRiderz","twitter_misc":{"Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.airriderz.com\/portchester\/invitation-card\/","url":"https:\/\/www.airriderz.com\/portchester\/invitation-card\/","name":"Invitation Card","isPartOf":{"@id":"https:\/\/www.airriderz.com\/portchester\/#website"},"datePublished":"2026-06-17T19:35:29+00:00","dateModified":"2026-06-17T19:36:10+00:00","description":"Experience fun and excitement at Air Riderz Port Chester! Enjoy our wall-to-wall trampolines, ninja warrior courses, and Climb Zone. Perfect for kids, families, and group events. Visit us for unforgettable memories in Port Chester, Rye, Greenwich, and more. Invitation Card For more details, you can contact us now!","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.airriderz.com\/portchester\/invitation-card\/"]}]},{"@type":"WebSite","@id":"https:\/\/www.airriderz.com\/portchester\/#website","url":"https:\/\/www.airriderz.com\/portchester\/","name":"Air Riderz","description":"","publisher":{"@id":"https:\/\/www.airriderz.com\/portchester\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.airriderz.com\/portchester\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.airriderz.com\/portchester\/#organization","name":"Air Riderz Trampoline Park Port Chester","url":"https:\/\/www.airriderz.com\/portchester\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.airriderz.com\/portchester\/#\/schema\/logo\/image\/","url":"http:\/\/www.airriderz.com\/portchester\/wp-content\/uploads\/2020\/02\/logo.png","contentUrl":"http:\/\/www.airriderz.com\/portchester\/wp-content\/uploads\/2020\/02\/logo.png","width":147,"height":111,"caption":"Air Riderz Trampoline Park Port Chester"},"image":{"@id":"https:\/\/www.airriderz.com\/portchester\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/airriderzportchester\/","https:\/\/x.com\/AirRiderz","https:\/\/www.instagram.com\/airriderz_portchester\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.airriderz.com\/portchester\/wp-json\/wp\/v2\/pages\/2617465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.airriderz.com\/portchester\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.airriderz.com\/portchester\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.airriderz.com\/portchester\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.airriderz.com\/portchester\/wp-json\/wp\/v2\/comments?post=2617465"}],"version-history":[{"count":4,"href":"https:\/\/www.airriderz.com\/portchester\/wp-json\/wp\/v2\/pages\/2617465\/revisions"}],"predecessor-version":[{"id":2617469,"href":"https:\/\/www.airriderz.com\/portchester\/wp-json\/wp\/v2\/pages\/2617465\/revisions\/2617469"}],"wp:attachment":[{"href":"https:\/\/www.airriderz.com\/portchester\/wp-json\/wp\/v2\/media?parent=2617465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}