PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.44
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.44
51.1.86 51.1.84 51.1.85 51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 51.1.45 All 40 releases
king-addons / includes / extensions / Live_Chat / templates / admin-page.php

admin-page.php in King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder 51.1.44, at includes/extensions/Live_Chat/templates/admin-page.php

1,323 lines 46.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Live Chat admin page template.
4 *
5 * @package King_Addons
6 * @var array $options Current options
7 * @var bool $is_premium Whether premium is active
8 */
9
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 // Enqueue shared V3 styles
15 wp_enqueue_style(
16 'king-addons-admin-v3',
17 KING_ADDONS_URL . 'includes/admin/layouts/shared/admin-v3-styles.css',
18 [],
19 KING_ADDONS_VERSION
20 );
21
22 // Theme mode is per-user
23 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
24 $allowed_theme_modes = ['dark', 'light', 'auto'];
25 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
26 $theme_mode = 'dark';
27 }
28
29 $current_tab = isset($_GET['tab']) ? sanitize_text_field($_GET['tab']) : 'inbox';
30 $conversation_id = isset($_GET['conversation']) ? intval($_GET['conversation']) : 0;
31 $saved = isset($_GET['saved']) && $_GET['saved'] === '1';
32 ?>
33 <style>
34 /* Page specific styles */
35 .ka-live-chat-page .ka-admin-wrap {
36 --ka-accent: #0066ff;
37 --ka-accent-hover: #0052cc;
38 }
39
40 /* Widget Mode Selector */
41 .ka-widget-mode-selector {
42 display: grid;
43 gap: 12px;
44 }
45
46 .ka-mode-option {
47 display: flex;
48 align-items: flex-start;
49 gap: 16px;
50 padding: 16px 20px;
51 background: #f8f9fa;
52 border: 2px solid #e5e5ea;
53 border-radius: 14px;
54 cursor: pointer;
55 transition: all 0.2s ease;
56 }
57
58 .ka-mode-option:hover {
59 border-color: #c5c5ca;
60 background: #f5f5f7;
61 }
62
63 .ka-mode-option.active,
64 .ka-mode-option:has(input:checked) {
65 border-color: var(--ka-accent);
66 background: #f0f7ff;
67 }
68
69 .ka-mode-option input {
70 display: none;
71 }
72
73 .ka-mode-icon {
74 width: 48px;
75 height: 48px;
76 background: linear-gradient(135deg, var(--ka-accent) 0%, #5ac8fa 100%);
77 border-radius: 12px;
78 display: flex;
79 align-items: center;
80 justify-content: center;
81 flex-shrink: 0;
82 }
83
84 .ka-mode-icon .dashicons {
85 color: #fff;
86 font-size: 24px;
87 width: 24px;
88 height: 24px;
89 }
90
91 .ka-mode-content {
92 flex: 1;
93 }
94
95 .ka-mode-title {
96 display: block;
97 font-size: 15px;
98 font-weight: 600;
99 color: #1d1d1f;
100 margin-bottom: 4px;
101 }
102
103 .ka-mode-desc {
104 display: block;
105 font-size: 13px;
106 color: #6e6e73;
107 line-height: 1.4;
108 }
109
110 .ka-v3-dark .ka-mode-option {
111 background: #1e1e1e;
112 border-color: #3a3a3a;
113 }
114
115 .ka-v3-dark .ka-mode-option:hover {
116 background: #2a2a2a;
117 border-color: #4a4a4a;
118 }
119
120 .ka-v3-dark .ka-mode-option.active,
121 .ka-v3-dark .ka-mode-option:has(input:checked) {
122 border-color: var(--ka-accent);
123 background: #0d1f33;
124 }
125
126 .ka-v3-dark .ka-mode-title {
127 color: #f5f5f7;
128 }
129
130 .ka-v3-dark .ka-mode-desc {
131 color: #8e8e93;
132 }
133
134 /* Inbox Layout */
135 .ka-inbox-layout {
136 display: grid;
137 grid-template-columns: 380px 1fr;
138 gap: 24px;
139 min-height: 600px;
140 }
141
142 .ka-inbox-list {
143 background: #fff;
144 border-radius: 20px;
145 box-shadow: 0 2px 20px rgba(0, 0, 0, 0.04);
146 overflow: hidden;
147 display: flex;
148 flex-direction: column;
149 }
150
151 .ka-inbox-header {
152 padding: 20px;
153 border-bottom: 1px solid #f1f1f4;
154 }
155
156 .ka-inbox-filters {
157 display: flex;
158 gap: 8px;
159 margin-bottom: 12px;
160 }
161
162 .ka-inbox-filter {
163 padding: 6px 12px;
164 border: none;
165 background: #f5f5f7;
166 border-radius: 8px;
167 font-size: 13px;
168 cursor: pointer;
169 transition: all 0.2s;
170 }
171
172 .ka-inbox-filter:hover,
173 .ka-inbox-filter.active {
174 background: var(--ka-accent);
175 color: #fff;
176 }
177
178 .ka-inbox-search {
179 width: 100%;
180 padding: 10px 14px;
181 border: 1px solid #e5e5ea;
182 border-radius: 10px;
183 font-size: 14px;
184 }
185
186 .ka-inbox-search:focus {
187 outline: none;
188 border-color: var(--ka-accent);
189 }
190
191 .ka-inbox-conversations {
192 flex: 1;
193 overflow-y: auto;
194 }
195
196 .ka-inbox-item {
197 display: flex;
198 align-items: flex-start;
199 gap: 12px;
200 padding: 16px 20px;
201 border-bottom: 1px solid #f1f1f4;
202 cursor: pointer;
203 transition: background 0.2s;
204 }
205
206 .ka-inbox-item:hover,
207 .ka-inbox-item.active {
208 background: #f8f9fa;
209 }
210
211 .ka-inbox-item.unread {
212 background: #f0f7ff;
213 }
214
215 .ka-inbox-avatar {
216 width: 44px;
217 height: 44px;
218 border-radius: 50%;
219 background: var(--ka-accent);
220 color: #fff;
221 display: flex;
222 align-items: center;
223 justify-content: center;
224 font-weight: 600;
225 font-size: 16px;
226 flex-shrink: 0;
227 }
228
229 .ka-inbox-item-content {
230 flex: 1;
231 min-width: 0;
232 }
233
234 .ka-inbox-item-header {
235 display: flex;
236 justify-content: space-between;
237 align-items: center;
238 margin-bottom: 4px;
239 }
240
241 .ka-inbox-item-name {
242 font-weight: 600;
243 font-size: 14px;
244 color: #1d1d1f;
245 }
246
247 .ka-inbox-item-time {
248 font-size: 12px;
249 color: #86868b;
250 }
251
252 .ka-inbox-item-preview {
253 font-size: 13px;
254 color: #6e6e73;
255 white-space: nowrap;
256 overflow: hidden;
257 text-overflow: ellipsis;
258 }
259
260 .ka-inbox-badge {
261 background: var(--ka-accent);
262 color: #fff;
263 font-size: 11px;
264 font-weight: 600;
265 padding: 2px 6px;
266 border-radius: 10px;
267 margin-left: 8px;
268 }
269
270 .ka-inbox-empty {
271 padding: 40px 20px;
272 text-align: center;
273 color: #86868b;
274 }
275
276 /* Conversation View */
277 .ka-conversation-view {
278 background: #fff;
279 border-radius: 20px;
280 box-shadow: 0 2px 20px rgba(0, 0, 0, 0.04);
281 display: flex;
282 flex-direction: column;
283 overflow: hidden;
284 }
285
286 .ka-conversation-header {
287 padding: 20px;
288 border-bottom: 1px solid #f1f1f4;
289 display: flex;
290 justify-content: space-between;
291 align-items: center;
292 }
293
294 .ka-conversation-info {
295 display: flex;
296 align-items: center;
297 gap: 12px;
298 }
299
300 .ka-conversation-details h3 {
301 margin: 0 0 4px;
302 font-size: 16px;
303 font-weight: 600;
304 }
305
306 .ka-conversation-email {
307 font-size: 13px;
308 color: #6e6e73;
309 }
310
311 .ka-conversation-actions {
312 display: flex;
313 gap: 8px;
314 }
315
316 .ka-conversation-btn {
317 padding: 8px 16px;
318 border: 1px solid #e5e5ea;
319 background: #fff;
320 border-radius: 8px;
321 font-size: 13px;
322 cursor: pointer;
323 transition: all 0.2s;
324 display: flex;
325 align-items: center;
326 gap: 6px;
327 }
328
329 .ka-conversation-btn:hover {
330 border-color: var(--ka-accent);
331 color: var(--ka-accent);
332 }
333
334 .ka-conversation-btn--danger:hover {
335 border-color: #ff3b30;
336 color: #ff3b30;
337 }
338
339 .ka-conversation-btn--primary {
340 background: var(--ka-accent);
341 color: #fff;
342 border-color: var(--ka-accent);
343 }
344
345 .ka-conversation-btn--primary:hover {
346 background: var(--ka-accent-hover);
347 color: #fff;
348 }
349
350 /* Messages */
351 .ka-conversation-messages {
352 flex: 1;
353 overflow-y: auto;
354 padding: 20px;
355 display: flex;
356 flex-direction: column;
357 gap: 16px;
358 max-height: 400px;
359 }
360
361 .ka-message {
362 max-width: 70%;
363 padding: 12px 16px;
364 border-radius: 16px;
365 font-size: 14px;
366 line-height: 1.5;
367 }
368
369 .ka-message--visitor {
370 background: #f5f5f7;
371 color: #1d1d1f;
372 align-self: flex-start;
373 border-bottom-left-radius: 4px;
374 }
375
376 .ka-message--admin {
377 background: var(--ka-accent);
378 color: #fff;
379 align-self: flex-end;
380 border-bottom-right-radius: 4px;
381 }
382
383 .ka-message-meta {
384 font-size: 11px;
385 margin-top: 6px;
386 opacity: 0.7;
387 }
388
389 /* Reply Form */
390 .ka-conversation-reply {
391 padding: 20px;
392 border-top: 1px solid #f1f1f4;
393 }
394
395 .ka-reply-form {
396 display: flex;
397 gap: 12px;
398 }
399
400 .ka-reply-textarea {
401 flex: 1;
402 padding: 12px 16px;
403 border: 1px solid #e5e5ea;
404 border-radius: 12px;
405 font-size: 14px;
406 resize: none;
407 min-height: 80px;
408 }
409
410 .ka-reply-textarea:focus {
411 outline: none;
412 border-color: var(--ka-accent);
413 }
414
415 .ka-reply-send {
416 padding: 12px 24px;
417 background: var(--ka-accent);
418 color: #fff;
419 border: none;
420 border-radius: 12px;
421 font-size: 14px;
422 font-weight: 500;
423 cursor: pointer;
424 transition: background 0.2s;
425 align-self: flex-end;
426 }
427
428 .ka-reply-send:hover {
429 background: var(--ka-accent-hover);
430 }
431
432 .ka-reply-send:disabled {
433 opacity: 0.6;
434 cursor: not-allowed;
435 }
436
437 /* Visitor Info Sidebar */
438 .ka-visitor-info {
439 padding: 20px;
440 border-top: 1px solid #f1f1f4;
441 background: #fafafa;
442 }
443
444 .ka-visitor-info h4 {
445 margin: 0 0 12px;
446 font-size: 13px;
447 font-weight: 600;
448 color: #86868b;
449 text-transform: uppercase;
450 }
451
452 .ka-visitor-info-item {
453 display: flex;
454 gap: 8px;
455 font-size: 13px;
456 margin-bottom: 8px;
457 word-break: break-all;
458 }
459
460 .ka-visitor-info-label {
461 color: #86868b;
462 flex-shrink: 0;
463 width: 80px;
464 }
465
466 .ka-visitor-info-value {
467 color: #1d1d1f;
468 }
469
470 /* Empty State */
471 .ka-conversation-empty {
472 display: flex;
473 flex-direction: column;
474 align-items: center;
475 justify-content: center;
476 height: 100%;
477 color: #86868b;
478 }
479
480 .ka-conversation-empty svg {
481 width: 80px;
482 height: 80px;
483 margin-bottom: 16px;
484 opacity: 0.3;
485 }
486
487 /* Status Badge */
488 .ka-status-open {
489 color: #34c759;
490 }
491
492 .ka-status-closed {
493 color: #86868b;
494 }
495
496 /* Loading */
497 .ka-loading {
498 display: flex;
499 align-items: center;
500 justify-content: center;
501 padding: 40px;
502 }
503
504 .ka-loading-spinner {
505 width: 32px;
506 height: 32px;
507 border: 3px solid #f1f1f4;
508 border-top-color: var(--ka-accent);
509 border-radius: 50%;
510 animation: ka-spin 0.8s linear infinite;
511 }
512
513 @keyframes ka-spin {
514 to { transform: rotate(360deg); }
515 }
516
517 /* Responsive */
518 @media (max-width: 1024px) {
519 .ka-inbox-layout {
520 grid-template-columns: 1fr;
521 }
522
523 .ka-inbox-list {
524 max-height: 400px;
525 }
526 }
527
528 /* Dark Mode - Full Dark Theme */
529 .ka-v3-dark .ka-live-chat-page {
530 background: #0a0a0a;
531 }
532
533 .ka-v3-dark .ka-admin-wrap {
534 background: #0a0a0a;
535 }
536
537 .ka-v3-dark .ka-inbox-list,
538 .ka-v3-dark .ka-conversation-view,
539 .ka-v3-dark .ka-card {
540 background: #141414;
541 border-color: #2a2a2a;
542 }
543
544 .ka-v3-dark .ka-inbox-header {
545 border-color: #2a2a2a;
546 }
547
548 .ka-v3-dark .ka-inbox-item {
549 border-color: #2a2a2a;
550 }
551
552 .ka-v3-dark .ka-inbox-item:hover,
553 .ka-v3-dark .ka-inbox-item.active {
554 background: #1e1e1e;
555 }
556
557 .ka-v3-dark .ka-inbox-item.unread {
558 background: #0d1f33;
559 }
560
561 .ka-v3-dark .ka-inbox-item-name,
562 .ka-v3-dark .ka-conversation-details h3,
563 .ka-v3-dark .ka-card-header h2 {
564 color: #f5f5f7;
565 }
566
567 .ka-v3-dark .ka-inbox-item-preview,
568 .ka-v3-dark .ka-inbox-item-time {
569 color: #8e8e93;
570 }
571
572 .ka-v3-dark .ka-inbox-search,
573 .ka-v3-dark .ka-reply-textarea,
574 .ka-v3-dark .ka-row-field input,
575 .ka-v3-dark .ka-row-field select,
576 .ka-v3-dark .ka-row-field textarea {
577 background: #1e1e1e;
578 border-color: #3a3a3a;
579 color: #f5f5f7;
580 }
581
582 .ka-v3-dark .ka-inbox-search:focus,
583 .ka-v3-dark .ka-row-field input:focus,
584 .ka-v3-dark .ka-row-field select:focus,
585 .ka-v3-dark .ka-row-field textarea:focus {
586 border-color: var(--ka-accent);
587 background: #1e1e1e;
588 }
589
590 .ka-v3-dark .ka-inbox-filter {
591 background: #1e1e1e;
592 color: #f5f5f7;
593 }
594
595 .ka-v3-dark .ka-inbox-filter.active,
596 .ka-v3-dark .ka-inbox-filter:hover {
597 background: var(--ka-accent);
598 color: #fff;
599 }
600
601 .ka-v3-dark .ka-message--visitor {
602 background: #1e1e1e;
603 color: #f5f5f7;
604 }
605
606 .ka-v3-dark .ka-message--admin {
607 background: var(--ka-accent);
608 color: #fff;
609 }
610
611 .ka-v3-dark .ka-visitor-info {
612 background: #0f0f0f;
613 border-color: #2a2a2a;
614 }
615
616 .ka-v3-dark .ka-visitor-info dt {
617 color: #8e8e93;
618 }
619
620 .ka-v3-dark .ka-visitor-info dd {
621 color: #f5f5f7;
622 }
623
624 .ka-v3-dark .ka-conversation-btn {
625 background: #1e1e1e;
626 border-color: #3a3a3a;
627 color: #f5f5f7;
628 }
629
630 .ka-v3-dark .ka-conversation-btn:hover {
631 background: #2a2a2a;
632 border-color: var(--ka-accent);
633 color: var(--ka-accent);
634 }
635
636 .ka-v3-dark .ka-conversation-header,
637 .ka-v3-dark .ka-card-header {
638 border-color: #2a2a2a;
639 }
640
641 .ka-v3-dark .ka-conversation-empty {
642 color: #6e6e73;
643 }
644
645 .ka-v3-dark .ka-conversation-empty svg {
646 stroke: #4a4a4a;
647 }
648
649 .ka-v3-dark .ka-row-label {
650 color: #c7c7cc;
651 }
652
653 .ka-v3-dark .ka-row-desc {
654 color: #6e6e73;
655 }
656
657 .ka-v3-dark .ka-tabs {
658 background: #141414;
659 border-color: #2a2a2a;
660 }
661
662 .ka-v3-dark .ka-tab {
663 color: #8e8e93;
664 }
665
666 .ka-v3-dark .ka-tab:hover,
667 .ka-v3-dark .ka-tab.active {
668 color: var(--ka-accent);
669 }
670
671 .ka-v3-dark .ka-admin-header {
672 border-color: #2a2a2a;
673 }
674
675 .ka-v3-dark .ka-admin-title {
676 color: #f5f5f7;
677 }
678
679 .ka-v3-dark .ka-admin-subtitle {
680 color: #8e8e93;
681 }
682
683 /* Save Button Styles */
684 .ka-save-btn {
685 display: inline-flex;
686 align-items: center;
687 gap: 8px;
688 padding: 14px 28px;
689 background: linear-gradient(135deg, #0066ff 0%, #0052cc 100%);
690 color: #fff;
691 border: none;
692 border-radius: 12px;
693 font-size: 15px;
694 font-weight: 600;
695 cursor: pointer;
696 transition: all 0.2s ease;
697 box-shadow: 0 4px 15px rgba(0, 102, 255, 0.25);
698 }
699
700 .ka-save-btn:hover {
701 transform: translateY(-2px);
702 box-shadow: 0 6px 20px rgba(0, 102, 255, 0.35);
703 }
704
705 .ka-save-btn:active {
706 transform: translateY(0);
707 }
708
709 .ka-save-btn .dashicons {
710 font-size: 18px;
711 width: 18px;
712 height: 18px;
713 }
714
715 .ka-card-footer {
716 background: transparent;
717 box-shadow: none;
718 padding: 24px 0;
719 }
720
721 .ka-v3-dark .ka-save-btn {
722 background: linear-gradient(135deg, #0077ff 0%, #0055cc 100%);
723 box-shadow: 0 4px 15px rgba(0, 102, 255, 0.3);
724 }
725
726 .ka-v3-dark .ka-save-btn:hover {
727 box-shadow: 0 6px 20px rgba(0, 102, 255, 0.4);
728 }
729 </style>
730
731 <div class="wrap ka-live-chat-page">
732 <script>
733 (function() {
734 const mode = '<?php echo esc_js($theme_mode); ?>';
735 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
736 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
737 document.documentElement.classList.toggle('ka-v3-dark', isDark);
738 document.body.classList.toggle('ka-v3-dark', isDark);
739 document.body.classList.add('ka-admin-v3');
740 })();
741 </script>
742
743 <div class="ka-admin-wrap">
744 <!-- Header -->
745 <div class="ka-admin-header">
746 <div class="ka-admin-header-left">
747 <div class="ka-admin-header-icon" style="background: linear-gradient(135deg, #0066ff 0%, #5ac8fa 100%);">
748 <span class="dashicons dashicons-format-chat"></span>
749 </div>
750 <div>
751 <h1 class="ka-admin-title"><?php esc_html_e('Live Chat', 'king-addons'); ?></h1>
752 <p class="ka-admin-subtitle"><?php esc_html_e('Real-time customer support', 'king-addons'); ?></p>
753 </div>
754 </div>
755 <div class="ka-admin-header-actions">
756 <?php if (!empty($options['enabled'])): ?>
757 <span class="ka-status-badge enabled">
758 <span class="ka-status-badge-dot"></span>
759 <?php esc_html_e('Online', 'king-addons'); ?>
760 </span>
761 <?php else: ?>
762 <span class="ka-status-badge disabled">
763 <span class="ka-status-badge-dot"></span>
764 <?php esc_html_e('Offline', 'king-addons'); ?>
765 </span>
766 <?php endif; ?>
767 <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="Theme" data-active="<?php echo esc_attr($theme_mode); ?>">
768 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
769 <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>"><?php esc_html_e('Light', 'king-addons'); ?></button>
770 <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>"><?php esc_html_e('Dark', 'king-addons'); ?></button>
771 <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>"><?php esc_html_e('Auto', 'king-addons'); ?></button>
772 </div>
773 </div>
774 </div>
775
776 <?php if ($saved): ?>
777 <div class="notice notice-success is-dismissible" style="margin: 20px 0;">
778 <p><?php esc_html_e('Settings saved successfully.', 'king-addons'); ?></p>
779 </div>
780 <?php endif; ?>
781
782 <!-- Tabs -->
783 <div class="ka-tabs">
784 <a href="<?php echo esc_url(admin_url('admin.php?page=king-addons-live-chat&tab=inbox')); ?>"
785 class="ka-tab <?php echo $current_tab === 'inbox' ? 'active' : ''; ?>">
786 <?php esc_html_e('Inbox', 'king-addons'); ?>
787 </a>
788 <a href="<?php echo esc_url(admin_url('admin.php?page=king-addons-live-chat&tab=settings')); ?>"
789 class="ka-tab <?php echo $current_tab === 'settings' ? 'active' : ''; ?>">
790 <?php esc_html_e('Settings', 'king-addons'); ?>
791 </a>
792 </div>
793
794 <?php if ($current_tab === 'inbox'): ?>
795 <!-- Inbox View -->
796 <div class="ka-inbox-layout">
797 <!-- Conversations List -->
798 <div class="ka-inbox-list">
799 <div class="ka-inbox-header">
800 <div class="ka-inbox-filters">
801 <button type="button" class="ka-inbox-filter active" data-status="all">
802 <?php esc_html_e('All', 'king-addons'); ?>
803 </button>
804 <button type="button" class="ka-inbox-filter" data-status="open">
805 <?php esc_html_e('Open', 'king-addons'); ?>
806 </button>
807 <button type="button" class="ka-inbox-filter" data-status="closed">
808 <?php esc_html_e('Closed', 'king-addons'); ?>
809 </button>
810 </div>
811 <input type="text" class="ka-inbox-search" placeholder="<?php esc_attr_e('Search conversations...', 'king-addons'); ?>">
812 </div>
813 <div class="ka-inbox-conversations" id="ka-inbox-conversations">
814 <div class="ka-loading">
815 <div class="ka-loading-spinner"></div>
816 </div>
817 </div>
818 </div>
819
820 <!-- Conversation View -->
821 <div class="ka-conversation-view" id="ka-conversation-view">
822 <div class="ka-conversation-empty">
823 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
824 <path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"/>
825 </svg>
826 <p><?php esc_html_e('Select a conversation to view messages', 'king-addons'); ?></p>
827 </div>
828 </div>
829 </div>
830
831 <?php else: ?>
832 <!-- Settings View -->
833 <form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post">
834 <input type="hidden" name="action" value="king_addons_live_chat_save">
835 <?php wp_nonce_field('king_addons_live_chat_save', 'king_live_chat_nonce'); ?>
836
837 <!-- General Settings -->
838 <div class="ka-card">
839 <div class="ka-card-header">
840 <span class="dashicons dashicons-admin-settings"></span>
841 <h2><?php esc_html_e('General Settings', 'king-addons'); ?></h2>
842 </div>
843 <div class="ka-card-body">
844 <div class="ka-row">
845 <div class="ka-row-label"><?php esc_html_e('Enable Chat Widget', 'king-addons'); ?></div>
846 <div class="ka-row-field">
847 <label class="ka-toggle">
848 <input type="checkbox" name="enabled" value="1" <?php checked(!empty($options['enabled'])); ?>>
849 <span class="ka-toggle-slider"></span>
850 <span class="ka-toggle-label"><?php esc_html_e('Show chat widget on frontend', 'king-addons'); ?></span>
851 </label>
852 </div>
853 </div>
854
855 <!-- Widget Mode -->
856 <div class="ka-row">
857 <div class="ka-row-label"><?php esc_html_e('Widget Mode', 'king-addons'); ?></div>
858 <div class="ka-row-field">
859 <div class="ka-widget-mode-selector">
860 <label class="ka-mode-option <?php echo ($options['widget_mode'] ?? 'live_chat') === 'live_chat' ? 'active' : ''; ?>">
861 <input type="radio" name="widget_mode" value="live_chat" <?php checked(($options['widget_mode'] ?? 'live_chat'), 'live_chat'); ?>>
862 <span class="ka-mode-icon">
863 <span class="dashicons dashicons-format-chat"></span>
864 </span>
865 <span class="ka-mode-content">
866 <span class="ka-mode-title"><?php esc_html_e('Live Chat', 'king-addons'); ?></span>
867 <span class="ka-mode-desc"><?php esc_html_e('Real-time messaging with polling. Visitors can have ongoing conversations.', 'king-addons'); ?></span>
868 </span>
869 </label>
870 <label class="ka-mode-option <?php echo ($options['widget_mode'] ?? 'live_chat') === 'contact_form' ? 'active' : ''; ?>">
871 <input type="radio" name="widget_mode" value="contact_form" <?php checked(($options['widget_mode'] ?? 'live_chat'), 'contact_form'); ?>>
872 <span class="ka-mode-icon">
873 <span class="dashicons dashicons-email-alt"></span>
874 </span>
875 <span class="ka-mode-content">
876 <span class="ka-mode-title"><?php esc_html_e('Contact Form', 'king-addons'); ?></span>
877 <span class="ka-mode-desc"><?php esc_html_e('Simple contact form. Messages are sent via email, no real-time chat.', 'king-addons'); ?></span>
878 </span>
879 </label>
880 </div>
881 </div>
882 </div>
883
884 <div class="ka-grid-2">
885 <div class="ka-row">
886 <div class="ka-row-label"><?php esc_html_e('Position', 'king-addons'); ?></div>
887 <div class="ka-row-field">
888 <select name="position">
889 <option value="right" <?php selected($options['position'], 'right'); ?>><?php esc_html_e('Right', 'king-addons'); ?></option>
890 <option value="left" <?php selected($options['position'], 'left'); ?>><?php esc_html_e('Left', 'king-addons'); ?></option>
891 </select>
892 </div>
893 </div>
894 <div class="ka-row">
895 <div class="ka-row-label"><?php esc_html_e('Z-Index', 'king-addons'); ?></div>
896 <div class="ka-row-field">
897 <input type="number" name="z_index" value="<?php echo esc_attr($options['z_index']); ?>" min="1">
898 </div>
899 </div>
900 <div class="ka-row">
901 <div class="ka-row-label"><?php esc_html_e('Bottom Offset', 'king-addons'); ?></div>
902 <div class="ka-row-field">
903 <input type="number" name="offset_bottom" value="<?php echo esc_attr($options['offset_bottom']); ?>" min="0">
904 <span style="color:#64748b;margin-left:6px">px</span>
905 </div>
906 </div>
907 <div class="ka-row">
908 <div class="ka-row-label"><?php esc_html_e('Side Offset', 'king-addons'); ?></div>
909 <div class="ka-row-field">
910 <input type="number" name="offset_side" value="<?php echo esc_attr($options['offset_side']); ?>" min="0">
911 <span style="color:#64748b;margin-left:6px">px</span>
912 </div>
913 </div>
914 </div>
915 </div>
916 </div>
917
918 <!-- Appearance -->
919 <div class="ka-card">
920 <div class="ka-card-header">
921 <span class="dashicons dashicons-art"></span>
922 <h2><?php esc_html_e('Appearance', 'king-addons'); ?></h2>
923 </div>
924 <div class="ka-card-body">
925 <div class="ka-grid-2">
926 <div class="ka-row">
927 <div class="ka-row-label"><?php esc_html_e('Button Size', 'king-addons'); ?></div>
928 <div class="ka-row-field">
929 <input type="number" name="button_size" value="<?php echo esc_attr($options['button_size']); ?>" min="40" max="80">
930 <span style="color:#64748b;margin-left:6px">px</span>
931 </div>
932 </div>
933 <div class="ka-row">
934 <div class="ka-row-label"><?php esc_html_e('Button Color', 'king-addons'); ?></div>
935 <div class="ka-row-field">
936 <input type="text" name="button_color" value="<?php echo esc_attr($options['button_color']); ?>" class="ka-color-picker">
937 </div>
938 </div>
939 <div class="ka-row">
940 <div class="ka-row-label"><?php esc_html_e('Chat Width', 'king-addons'); ?></div>
941 <div class="ka-row-field">
942 <input type="number" name="chat_width" value="<?php echo esc_attr($options['chat_width']); ?>" min="300" max="500">
943 <span style="color:#64748b;margin-left:6px">px</span>
944 </div>
945 </div>
946 <div class="ka-row">
947 <div class="ka-row-label"><?php esc_html_e('Chat Height', 'king-addons'); ?></div>
948 <div class="ka-row-field">
949 <input type="number" name="chat_height" value="<?php echo esc_attr($options['chat_height']); ?>" min="400" max="700">
950 <span style="color:#64748b;margin-left:6px">px</span>
951 </div>
952 </div>
953 </div>
954
955 <h4 style="margin: 24px 0 16px; color: #6e6e73; font-size: 13px; text-transform: uppercase;"><?php esc_html_e('Colors', 'king-addons'); ?></h4>
956 <div class="ka-grid-2">
957 <div class="ka-row">
958 <div class="ka-row-label"><?php esc_html_e('Header Background', 'king-addons'); ?></div>
959 <div class="ka-row-field">
960 <input type="text" name="header_bg" value="<?php echo esc_attr($options['header_bg']); ?>" class="ka-color-picker">
961 </div>
962 </div>
963 <div class="ka-row">
964 <div class="ka-row-label"><?php esc_html_e('Header Text', 'king-addons'); ?></div>
965 <div class="ka-row-field">
966 <input type="text" name="header_text_color" value="<?php echo esc_attr($options['header_text_color']); ?>" class="ka-color-picker">
967 </div>
968 </div>
969 <div class="ka-row">
970 <div class="ka-row-label"><?php esc_html_e('Chat Background', 'king-addons'); ?></div>
971 <div class="ka-row-field">
972 <input type="text" name="chat_bg" value="<?php echo esc_attr($options['chat_bg']); ?>" class="ka-color-picker">
973 </div>
974 </div>
975 </div>
976
977 <h4 style="margin: 24px 0 16px; color: #6e6e73; font-size: 13px; text-transform: uppercase;"><?php esc_html_e('Message Bubbles', 'king-addons'); ?></h4>
978 <div class="ka-grid-2">
979 <div class="ka-row">
980 <div class="ka-row-label"><?php esc_html_e('Visitor Message BG', 'king-addons'); ?></div>
981 <div class="ka-row-field">
982 <input type="text" name="visitor_msg_bg" value="<?php echo esc_attr($options['visitor_msg_bg']); ?>" class="ka-color-picker">
983 </div>
984 </div>
985 <div class="ka-row">
986 <div class="ka-row-label"><?php esc_html_e('Visitor Message Text', 'king-addons'); ?></div>
987 <div class="ka-row-field">
988 <input type="text" name="visitor_msg_text" value="<?php echo esc_attr($options['visitor_msg_text']); ?>" class="ka-color-picker">
989 </div>
990 </div>
991 <div class="ka-row">
992 <div class="ka-row-label"><?php esc_html_e('Admin Message BG', 'king-addons'); ?></div>
993 <div class="ka-row-field">
994 <input type="text" name="admin_msg_bg" value="<?php echo esc_attr($options['admin_msg_bg']); ?>" class="ka-color-picker">
995 </div>
996 </div>
997 <div class="ka-row">
998 <div class="ka-row-label"><?php esc_html_e('Admin Message Text', 'king-addons'); ?></div>
999 <div class="ka-row-field">
1000 <input type="text" name="admin_msg_text" value="<?php echo esc_attr($options['admin_msg_text']); ?>" class="ka-color-picker">
1001 </div>
1002 </div>
1003 </div>
1004 </div>
1005 </div>
1006
1007 <!-- Texts -->
1008 <div class="ka-card">
1009 <div class="ka-card-header">
1010 <span class="dashicons dashicons-editor-textcolor"></span>
1011 <h2><?php esc_html_e('Texts', 'king-addons'); ?></h2>
1012 </div>
1013 <div class="ka-card-body">
1014 <div class="ka-grid-2">
1015 <div class="ka-row">
1016 <div class="ka-row-label"><?php esc_html_e('Header Title', 'king-addons'); ?></div>
1017 <div class="ka-row-field">
1018 <input type="text" name="header_title" value="<?php echo esc_attr($options['header_title']); ?>">
1019 </div>
1020 </div>
1021 <div class="ka-row">
1022 <div class="ka-row-label"><?php esc_html_e('Header Subtitle', 'king-addons'); ?></div>
1023 <div class="ka-row-field">
1024 <input type="text" name="header_subtitle" value="<?php echo esc_attr($options['header_subtitle']); ?>">
1025 </div>
1026 </div>
1027 </div>
1028 <div class="ka-row">
1029 <div class="ka-row-label"><?php esc_html_e('Input Placeholder', 'king-addons'); ?></div>
1030 <div class="ka-row-field">
1031 <input type="text" name="placeholder" value="<?php echo esc_attr($options['placeholder']); ?>">
1032 </div>
1033 </div>
1034 <div class="ka-row">
1035 <div class="ka-row-label"><?php esc_html_e('Welcome Message', 'king-addons'); ?></div>
1036 <div class="ka-row-field">
1037 <textarea name="welcome_message" rows="2"><?php echo esc_textarea($options['welcome_message']); ?></textarea>
1038 <p class="ka-row-desc"><?php esc_html_e('Shown as first message when chat is opened', 'king-addons'); ?></p>
1039 </div>
1040 </div>
1041 <div class="ka-row">
1042 <div class="ka-row-label"><?php esc_html_e('Offline Message', 'king-addons'); ?></div>
1043 <div class="ka-row-field">
1044 <textarea name="offline_message" rows="2"><?php echo esc_textarea($options['offline_message']); ?></textarea>
1045 </div>
1046 </div>
1047
1048 <!-- Contact Form Mode specific -->
1049 <div class="ka-contact-form-fields" style="display: <?php echo ($options['widget_mode'] ?? 'live_chat') === 'contact_form' ? 'block' : 'none'; ?>;">
1050 <h4 style="margin: 24px 0 16px; color: #6e6e73; font-size: 13px; text-transform: uppercase;"><?php esc_html_e('Contact Form Mode', 'king-addons'); ?></h4>
1051 <div class="ka-row">
1052 <div class="ka-row-label"><?php esc_html_e('Subject Label', 'king-addons'); ?></div>
1053 <div class="ka-row-field">
1054 <input type="text" name="subject_label" value="<?php echo esc_attr($options['subject_label'] ?? __('Subject', 'king-addons')); ?>">
1055 </div>
1056 </div>
1057 <div class="ka-row">
1058 <div class="ka-row-label"><?php esc_html_e('Message Label', 'king-addons'); ?></div>
1059 <div class="ka-row-field">
1060 <input type="text" name="message_label" value="<?php echo esc_attr($options['message_label'] ?? __('Your message', 'king-addons')); ?>">
1061 </div>
1062 </div>
1063 <div class="ka-row">
1064 <div class="ka-row-label"><?php esc_html_e('Submit Button', 'king-addons'); ?></div>
1065 <div class="ka-row-field">
1066 <input type="text" name="submit_button" value="<?php echo esc_attr($options['submit_button'] ?? __('Send Message', 'king-addons')); ?>">
1067 </div>
1068 </div>
1069 <div class="ka-row">
1070 <div class="ka-row-label"><?php esc_html_e('Success Message', 'king-addons'); ?></div>
1071 <div class="ka-row-field">
1072 <textarea name="success_message" rows="2"><?php echo esc_textarea($options['success_message'] ?? __('Thank you! Your message has been sent. We\'ll get back to you soon.', 'king-addons')); ?></textarea>
1073 </div>
1074 </div>
1075 </div>
1076 </div>
1077 </div>
1078
1079 <!-- Pre-chat Form -->
1080 <div class="ka-card">
1081 <div class="ka-card-header">
1082 <span class="dashicons dashicons-id-alt"></span>
1083 <h2><?php esc_html_e('Pre-chat Form', 'king-addons'); ?></h2>
1084 </div>
1085 <div class="ka-card-body">
1086 <div class="ka-grid-2">
1087 <div class="ka-row">
1088 <div class="ka-row-label"><?php esc_html_e('Require Name', 'king-addons'); ?></div>
1089 <div class="ka-row-field">
1090 <label class="ka-toggle">
1091 <input type="checkbox" name="require_name" value="1" <?php checked(!empty($options['require_name'])); ?>>
1092 <span class="ka-toggle-slider"></span>
1093 </label>
1094 </div>
1095 </div>
1096 <div class="ka-row">
1097 <div class="ka-row-label"><?php esc_html_e('Require Email', 'king-addons'); ?></div>
1098 <div class="ka-row-field">
1099 <label class="ka-toggle">
1100 <input type="checkbox" name="require_email" value="1" <?php checked(!empty($options['require_email'])); ?>>
1101 <span class="ka-toggle-slider"></span>
1102 </label>
1103 </div>
1104 </div>
1105 <div class="ka-row">
1106 <div class="ka-row-label"><?php esc_html_e('Name Label', 'king-addons'); ?></div>
1107 <div class="ka-row-field">
1108 <input type="text" name="name_label" value="<?php echo esc_attr($options['name_label']); ?>">
1109 </div>
1110 </div>
1111 <div class="ka-row">
1112 <div class="ka-row-label"><?php esc_html_e('Email Label', 'king-addons'); ?></div>
1113 <div class="ka-row-field">
1114 <input type="text" name="email_label" value="<?php echo esc_attr($options['email_label']); ?>">
1115 </div>
1116 </div>
1117 </div>
1118 <div class="ka-row">
1119 <div class="ka-row-label"><?php esc_html_e('Start Chat Button', 'king-addons'); ?></div>
1120 <div class="ka-row-field">
1121 <input type="text" name="start_chat_button" value="<?php echo esc_attr($options['start_chat_button']); ?>">
1122 </div>
1123 </div>
1124 </div>
1125 </div>
1126
1127 <!-- Email Notifications -->
1128 <div class="ka-card">
1129 <div class="ka-card-header">
1130 <span class="dashicons dashicons-email"></span>
1131 <h2><?php esc_html_e('Email Notifications', 'king-addons'); ?></h2>
1132 </div>
1133 <div class="ka-card-body">
1134 <div class="ka-row">
1135 <div class="ka-row-label"><?php esc_html_e('Admin Email', 'king-addons'); ?></div>
1136 <div class="ka-row-field">
1137 <input type="email" name="admin_email" value="<?php echo esc_attr($options['admin_email']); ?>">
1138 <p class="ka-row-desc"><?php esc_html_e('Where to send new conversation notifications', 'king-addons'); ?></p>
1139 </div>
1140 </div>
1141 <div class="ka-grid-2">
1142 <div class="ka-row">
1143 <div class="ka-row-label"><?php esc_html_e('New Conversation', 'king-addons'); ?></div>
1144 <div class="ka-row-field">
1145 <label class="ka-toggle">
1146 <input type="checkbox" name="notify_new_conversation" value="1" <?php checked(!empty($options['notify_new_conversation'])); ?>>
1147 <span class="ka-toggle-slider"></span>
1148 <span class="ka-toggle-label"><?php esc_html_e('Email on new conversation', 'king-addons'); ?></span>
1149 </label>
1150 </div>
1151 </div>
1152 <div class="ka-row">
1153 <div class="ka-row-label"><?php esc_html_e('New Messages', 'king-addons'); ?></div>
1154 <div class="ka-row-field">
1155 <label class="ka-toggle">
1156 <input type="checkbox" name="notify_new_message" value="1" <?php checked(!empty($options['notify_new_message'])); ?>>
1157 <span class="ka-toggle-slider"></span>
1158 <span class="ka-toggle-label"><?php esc_html_e('Email on each new message', 'king-addons'); ?></span>
1159 </label>
1160 </div>
1161 </div>
1162 </div>
1163 <div class="ka-grid-2">
1164 <div class="ka-row">
1165 <div class="ka-row-label"><?php esc_html_e('Admin Email Subject', 'king-addons'); ?></div>
1166 <div class="ka-row-field">
1167 <input type="text" name="email_subject_admin" value="<?php echo esc_attr($options['email_subject_admin']); ?>">
1168 <p class="ka-row-desc"><?php esc_html_e('Use {visitor_name}, {site_name}', 'king-addons'); ?></p>
1169 </div>
1170 </div>
1171 <div class="ka-row">
1172 <div class="ka-row-label"><?php esc_html_e('Visitor Email Subject', 'king-addons'); ?></div>
1173 <div class="ka-row-field">
1174 <input type="text" name="email_subject_visitor" value="<?php echo esc_attr($options['email_subject_visitor']); ?>">
1175 </div>
1176 </div>
1177 </div>
1178 </div>
1179 </div>
1180
1181 <!-- Advanced -->
1182 <div class="ka-card">
1183 <div class="ka-card-header">
1184 <span class="dashicons dashicons-admin-generic"></span>
1185 <h2><?php esc_html_e('Advanced', 'king-addons'); ?></h2>
1186 </div>
1187 <div class="ka-card-body">
1188 <div class="ka-row">
1189 <div class="ka-row-label"><?php esc_html_e('Polling Interval', 'king-addons'); ?></div>
1190 <div class="ka-row-field">
1191 <input type="number" name="poll_interval" value="<?php echo esc_attr($options['poll_interval']); ?>" min="2000" max="10000" step="500">
1192 <span style="color:#64748b;margin-left:6px">ms</span>
1193 <p class="ka-row-desc"><?php esc_html_e('How often to check for new messages (lower = faster but more server load)', 'king-addons'); ?></p>
1194 </div>
1195 </div>
1196 </div>
1197 </div>
1198
1199 <!-- Save Button -->
1200 <div class="ka-card ka-card-footer">
1201 <button type="submit" class="ka-save-btn">
1202 <span class="dashicons dashicons-saved"></span>
1203 <?php esc_html_e('Save Settings', 'king-addons'); ?>
1204 </button>
1205 </div>
1206 </form>
1207 <?php endif; ?>
1208 </div>
1209
1210 <script>
1211 (function() {
1212 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
1213 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
1214 const segment = document.getElementById('ka-v3-theme-segment');
1215 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
1216 let mode = (segment && segment.getAttribute('data-active') ? segment.getAttribute('data-active') : 'dark').toString();
1217 let mqlHandler = null;
1218
1219 function saveUISetting(key, value) {
1220 const body = new URLSearchParams();
1221 body.set('action', 'king_addons_save_dashboard_ui');
1222 body.set('nonce', nonce);
1223 body.set('key', key);
1224 body.set('value', value);
1225 fetch(ajaxUrl, {
1226 method: 'POST',
1227 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
1228 body: body.toString()
1229 });
1230 }
1231
1232 function updateSegment(activeMode) {
1233 if (!segment) {
1234 return;
1235 }
1236 segment.setAttribute('data-active', activeMode);
1237 segment.querySelectorAll('.ka-v3-segmented-btn').forEach((btn) => {
1238 const theme = btn.getAttribute('data-theme');
1239 btn.setAttribute('aria-pressed', theme === activeMode ? 'true' : 'false');
1240 });
1241 }
1242
1243 function applyTheme(isDark) {
1244 document.body.classList.toggle('ka-v3-dark', isDark);
1245 document.documentElement.classList.toggle('ka-v3-dark', isDark);
1246 }
1247
1248 function setThemeMode(nextMode, save) {
1249 mode = nextMode;
1250 updateSegment(nextMode);
1251
1252 if (mqlHandler && mql) {
1253 if (mql.removeEventListener) {
1254 mql.removeEventListener('change', mqlHandler);
1255 } else if (mql.removeListener) {
1256 mql.removeListener(mqlHandler);
1257 }
1258 mqlHandler = null;
1259 }
1260
1261 if (nextMode === 'auto') {
1262 applyTheme(!!(mql && mql.matches));
1263 mqlHandler = (e) => {
1264 if (mode !== 'auto') {
1265 return;
1266 }
1267 applyTheme(!!e.matches);
1268 };
1269 if (mql) {
1270 if (mql.addEventListener) {
1271 mql.addEventListener('change', mqlHandler);
1272 } else if (mql.addListener) {
1273 mql.addListener(mqlHandler);
1274 }
1275 }
1276 } else {
1277 applyTheme(nextMode === 'dark');
1278 }
1279
1280 if (save) {
1281 saveUISetting('theme_mode', nextMode);
1282 }
1283 }
1284
1285 window.kaV3ToggleDark = function() {
1286 const isDark = document.body.classList.contains('ka-v3-dark');
1287 setThemeMode(isDark ? 'light' : 'dark', true);
1288 };
1289
1290 if (segment) {
1291 segment.addEventListener('click', function(e) {
1292 const btn = e.target.closest('.ka-v3-segmented-btn');
1293 if (!btn) return;
1294 e.preventDefault();
1295 setThemeMode((btn.getAttribute('data-theme') || 'dark').toString(), true);
1296 });
1297 }
1298
1299 if (segment) {
1300 setThemeMode(mode, false);
1301 }
1302 })();
1303
1304 // Widget mode toggle
1305 document.querySelectorAll('input[name="widget_mode"]').forEach(function(radio) {
1306 radio.addEventListener('change', function() {
1307 const contactFormFields = document.querySelector('.ka-contact-form-fields');
1308 const modeOptions = document.querySelectorAll('.ka-mode-option');
1309
1310 modeOptions.forEach(function(opt) {
1311 opt.classList.remove('active');
1312 });
1313
1314 this.closest('.ka-mode-option').classList.add('active');
1315
1316 if (contactFormFields) {
1317 contactFormFields.style.display = this.value === 'contact_form' ? 'block' : 'none';
1318 }
1319 });
1320 });
1321 </script>
1322 </div>
1323