.im-tr-wrap{max-width:860px;margin:0 auto;padding:24px 0 60px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC",sans-serif;color:#1f2937;font-size:16px;line-height:1.7} .im-tr-wrap *,.im-tr-wrap *::before,.im-tr-wrap *::after{box-sizing:border-box} .im-tr-page{background:#fff;border-radius:12px;box-shadow:0 2px 16px rgba(0,0,0,.07);overflow:hidden} .im-tr-header{background:linear-gradient(135deg,#009dff,#3de1fe,#53eee0);padding:36px 40px 28px;color:#fff} .im-tr-header h1{margin:0 0 8px;font-size:26px;font-weight:700} .im-tr-header p{margin:0 0 8px;opacity:.9;font-size:15px} .im-tr-progress-bar{background:rgba(255,255,255,.3);border-radius:20px;height:10px;margin-top:16px;overflow:hidden} .im-tr-progress-fill{background:#fff;height:100%;border-radius:20px;transition:width .5s ease;width:0} .im-tr-progress-text{font-size:14px;font-weight:600;margin-top:8px;opacity:.9} .im-tr-section{padding:32px 40px;border-bottom:1px solid #f3f4f6} .im-tr-section:last-child{border-bottom:none} .im-tr-section h2{margin:0 0 20px;font-size:20px;font-weight:700;color:#111827;display:flex;align-items:center;gap:10px} .im-tr-section h2 .im-tr-step{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;background:linear-gradient(135deg,#009dff,#3de1fe);color:#fff;border-radius:50%;font-size:14px;font-weight:700;flex-shrink:0} .im-tr-video-wrap{position:relative;width:100%;padding-bottom:56.25%;border-radius:10px;overflow:hidden;background:#0f172a;margin-bottom:20px} .im-tr-video-wrap iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none} .im-tr-dl-section{display:block} .im-tr-dl-btn{display:inline-flex;align-items:center;justify-content:center;gap:12px;background:linear-gradient(135deg,#009dff,#3de1fe,#53eee0);color:#fff;padding:18px 36px;border-radius:12px;text-decoration:none;font-size:18px;font-weight:700;min-height:56px;box-shadow:0 4px 14px rgba(0,157,255,.35);transition:all .3s;border:none;cursor:pointer;font-family:inherit;max-width:100%;box-sizing:border-box;word-break:break-word;text-align:center} .im-tr-dl-btn:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(0,157,255,.45);color:#fff} .im-tr-dl-btn svg{flex-shrink:0} .im-tr-quiz{margin-top:28px;border-top:2px solid #e5e7eb;padding-top:24px} .im-tr-quiz-title{font-size:16px;font-weight:700;color:#009dff;margin:0 0 20px;display:flex;align-items:center;gap:8px} .im-tr-q{background:#f9fafb;border:1px solid #e5e7eb;border-radius:10px;padding:20px 24px;margin-bottom:16px;transition:border-color .3s} .im-tr-q.correct{border-color:#10b981;background:#ecfdf5} .im-tr-q.wrong{border-color:#ef4444;background:#fef2f2} .im-tr-q-text{font-size:15px;font-weight:600;color:#111827;margin:0 0 14px} .im-tr-opt{display:flex;align-items:center;gap:10px;padding:10px 14px;border:1.5px solid #d1d5db;border-radius:8px;margin-bottom:8px;cursor:pointer;transition:all .15s;position:relative;font-size:15px;color:#374151} .im-tr-opt:hover{border-color:#009dff;background:#e6f9ff} .im-tr-opt.selected{border-color:#009dff;background:#e6f9ff;color:#009dff;font-weight:600} .im-tr-opt.locked{cursor:default;pointer-events:none;opacity:.85} .im-tr-opt.locked.selected.correct-opt{border-color:#10b981;background:#d1fae5;color:#065f46} .im-tr-opt.locked.selected.wrong-opt{border-color:#ef4444;background:#fee2e2;color:#991b1b} .im-tr-opt input[type=radio]{position:absolute;opacity:0;width:0;height:0;pointer-events:none} .im-tr-opt .im-tr-ck{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:2px solid #d1d5db;border-radius:50%;flex-shrink:0;transition:all .2s;background:#fff;position:relative} .im-tr-opt .im-tr-ck::after{content:"";width:10px;height:10px;border-radius:50%;background:#fff;opacity:0;transition:opacity .15s} .im-tr-opt.selected .im-tr-ck{background:linear-gradient(135deg,#009dff,#3de1fe,#53eee0);border-color:transparent} .im-tr-opt.selected .im-tr-ck::after{opacity:1} .im-tr-opt .im-tr-letter{font-weight:700;min-width:16px} .im-tr-q-feedback{margin-top:8px;font-size:14px;font-weight:600;display:none} .im-tr-q-feedback.show{display:block} .im-tr-q-feedback.err{color:#ef4444} .im-tr-q-feedback.ok{color:#10b981} .im-tr-btn-row{display:flex;gap:12px;margin-top:20px;flex-wrap:wrap} .im-tr-submit{display:inline-flex;align-items:center;gap:8px;background:linear-gradient(135deg,#009dff,#3de1fe,#53eee0);color:#fff;border:none;padding:13px 32px;border-radius:8px;font-size:16px;font-weight:700;cursor:pointer;transition:all .3s;font-family:inherit} .im-tr-submit:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(0,157,255,.3)} .im-tr-submit:disabled{background:#94a3b8;cursor:not-allowed;transform:none;box-shadow:none} .im-tr-retry{display:none;align-items:center;gap:8px;background:#f59e0b;color:#fff;border:none;padding:13px 32px;border-radius:8px;font-size:16px;font-weight:700;cursor:pointer;transition:all .3s;font-family:inherit} .im-tr-retry:hover{background:#d97706;transform:translateY(-1px)} .im-tr-locked-overlay{position:relative} .im-tr-locked-overlay::after{content:"✓ Completed";position:absolute;top:12px;right:16px;background:#10b981;color:#fff;padding:4px 12px;border-radius:6px;font-size:12px;font-weight:700} .im-tr-hidden{display:none} .im-tr-center{text-align:center;padding:60px 40px} .im-tr-icon{width:72px;height:72px;border-radius:50%;font-size:36px;line-height:72px;margin:0 auto 24px;font-weight:700} .im-tr-icon.ok{background:#d1fae5;color:#065f46} .im-tr-icon.err{background:#fee2e2;color:#991b1b} .im-tr-center h1{font-size:24px;margin:0 0 12px} .im-tr-center p{color:#6b7280;font-size:15px;margin-bottom:5px;} .im-tr-notice{background:#e6f9ff;border-left:4px solid #009dff;padding:12px 16px;border-radius:0 8px 8px 0;color:#007acc;font-size:14px;margin-bottom:20px} @media(max-width:600px){.im-tr-header,.im-tr-section{padding:24px 20px}.im-tr-q{padding:16px 18px}.im-tr-dl-section{width:100%}.im-tr-dl-btn{width:100%;padding:15px 18px;font-size:16px;min-height:52px;gap:10px;line-height:1.35}.im-tr-dl-btn svg{width:22px;height:22px}} @keyframes imTrFadeIn{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}} .im-tr-fade-in{animation:imTrFadeIn .5s ease} @keyframes imTrSpin{to{transform:rotate(360deg)}} .im-tr-btn-loading{position:relative;color:transparent!important} .im-tr-btn-loading::after{content:"";position:absolute;width:20px;height:20px;top:50%;left:50%;margin:-10px 0 0 -10px;border:3px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:imTrSpin .6s linear infinite} '; echo ''; } /* ============================================================ AJAX: Training Complete Handler ============================================================ */ add_action('wp_ajax_im_training_complete', 'im_ajax_training_complete'); add_action('wp_ajax_nopriv_im_training_complete', 'im_ajax_training_complete'); function im_ajax_training_complete() { $token = sanitize_text_field($_POST['im_training_token'] ?? ''); $candidate = $token ? IM_Candidate::get_by_training_token($token) : null; if (!$candidate) { wp_send_json_error(['message' => 'Invalid or expired training link.']); } if (!wp_verify_nonce($_POST['im_nonce'] ?? '', 'im_training_' . $token)) { wp_send_json_error(['message' => 'Security verification failed. Please refresh and try again.']); } IM_Candidate::mark_training_completed($candidate->id); IM_Mailer::send_training_complete($candidate->id); $name = esc_html($candidate->preferred_name ?: $candidate->first_name); wp_send_json_success(['message' => 'ok', 'name' => $name]); } /* ============================================================ Shortcode: [im_training] ============================================================ */ add_shortcode('im_training', function () { im_enqueue_training_styles(); ob_start(); $token_str = sanitize_text_field($_GET['im_training_token'] ?? ''); // No token if (!$token_str): ?>
This training link is invalid. Please check your email for the correct link.
You have already completed all training modules.
Your trial account information has been sent to your email. Thank you!
This training link is invalid or no longer active. Please contact us if you need assistance.
There are currently no training modules available. Please contact the recruitment team.
Welcome, = $name ?>! Please complete the training modules below to get started.