PluginProbe
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder / 51.1.49
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder v51.1.49
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 51.1.46 51.1.47 51.1.49 All 37 releases
king-addons / includes / extensions / Docs_KB / templates / admin-page.php

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

1,032 lines 45.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Docs & Knowledge Base 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 $saved = isset($_GET['saved']) && $_GET['saved'] === '1';
15 $pages = get_pages(['post_status' => 'publish']);
16 $roles = wp_roles()->get_names();
17
18 // Theme mode is per-user
19 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
20 $allowed_theme_modes = ['dark', 'light', 'auto'];
21 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
22 $theme_mode = 'dark';
23 }
24 ?>
25 <style>
26 /* Page specific styles */
27 .ka-docs-kb-page .ka-admin-wrap {
28 --ka-accent: #0066ff;
29 --ka-accent-hover: #0052cc;
30 }
31
32 /* Layout Preview */
33 .ka-layout-preview {
34 display: grid;
35 grid-template-columns: repeat(3, 1fr);
36 gap: 16px;
37 margin-top: 16px;
38 }
39
40 .ka-layout-option {
41 position: relative;
42 border: 2px solid #e5e5ea;
43 border-radius: 16px;
44 overflow: hidden;
45 cursor: pointer;
46 transition: all 0.2s ease;
47 }
48
49 .ka-layout-option:hover {
50 border-color: #c5c5ca;
51 }
52
53 .ka-layout-option.active {
54 border-color: var(--ka-accent);
55 }
56
57 .ka-layout-option input {
58 position: absolute;
59 opacity: 0;
60 cursor: pointer;
61 }
62
63 .ka-layout-preview-img {
64 width: 100%;
65 height: 120px;
66 background: #f5f5f7;
67 display: flex;
68 align-items: center;
69 justify-content: center;
70 padding: 16px;
71 }
72
73 .ka-layout-preview-img svg {
74 width: 100%;
75 height: 100%;
76 max-width: 160px;
77 }
78
79 .ka-layout-preview-label {
80 padding: 12px;
81 text-align: center;
82 font-weight: 500;
83 color: #1d1d1f;
84 background: #fff;
85 border-top: 1px solid #f1f1f4;
86 }
87
88 .ka-layout-option.active .ka-layout-preview-label {
89 color: var(--ka-accent);
90 }
91
92 /* Box Layout Preview */
93 .ka-layout-box-preview {
94 display: grid;
95 grid-template-columns: 1fr 1fr;
96 gap: 8px;
97 }
98
99 .ka-layout-box-item {
100 background: #fff;
101 border: 1px solid #e5e5ea;
102 border-radius: 8px;
103 padding: 10px;
104 }
105
106 .ka-layout-box-item-header {
107 display: flex;
108 align-items: center;
109 gap: 6px;
110 margin-bottom: 6px;
111 }
112
113 .ka-layout-box-icon {
114 width: 16px;
115 height: 16px;
116 background: var(--ka-accent);
117 border-radius: 4px;
118 }
119
120 .ka-layout-box-title {
121 height: 6px;
122 width: 50px;
123 background: #1d1d1f;
124 border-radius: 3px;
125 }
126
127 .ka-layout-box-line {
128 height: 4px;
129 background: #e5e5ea;
130 border-radius: 2px;
131 margin-bottom: 4px;
132 }
133
134 .ka-layout-box-line:last-child {
135 width: 70%;
136 }
137
138 /* Card Layout Preview */
139 .ka-layout-card-preview {
140 display: grid;
141 grid-template-columns: 1fr 1fr;
142 gap: 8px;
143 }
144
145 .ka-layout-card-item {
146 background: #fff;
147 border-radius: 12px;
148 box-shadow: 0 2px 8px rgba(0,0,0,0.06);
149 padding: 12px;
150 text-align: center;
151 }
152
153 .ka-layout-card-icon {
154 width: 32px;
155 height: 32px;
156 background: linear-gradient(135deg, var(--ka-accent), #5ac8fa);
157 border-radius: 10px;
158 margin: 0 auto 8px;
159 }
160
161 .ka-layout-card-title {
162 height: 6px;
163 width: 60%;
164 background: #1d1d1f;
165 border-radius: 3px;
166 margin: 0 auto 6px;
167 }
168
169 .ka-layout-card-count {
170 height: 4px;
171 width: 30px;
172 background: #86868b;
173 border-radius: 2px;
174 margin: 0 auto;
175 }
176
177 /* Modern Layout Preview */
178 .ka-layout-modern-preview {
179 display: flex;
180 flex-direction: column;
181 gap: 8px;
182 }
183
184 .ka-layout-modern-item {
185 display: flex;
186 align-items: center;
187 gap: 10px;
188 background: #fff;
189 border-radius: 12px;
190 padding: 10px 12px;
191 box-shadow: 0 1px 4px rgba(0,0,0,0.04);
192 }
193
194 .ka-layout-modern-icon {
195 width: 36px;
196 height: 36px;
197 background: linear-gradient(135deg, var(--ka-accent), #5ac8fa);
198 border-radius: 10px;
199 flex-shrink: 0;
200 }
201
202 .ka-layout-modern-content {
203 flex: 1;
204 }
205
206 .ka-layout-modern-title {
207 height: 6px;
208 width: 80px;
209 background: #1d1d1f;
210 border-radius: 3px;
211 margin-bottom: 4px;
212 }
213
214 .ka-layout-modern-desc {
215 height: 4px;
216 width: 120px;
217 background: #e5e5ea;
218 border-radius: 2px;
219 }
220
221 .ka-layout-modern-arrow {
222 width: 16px;
223 height: 16px;
224 color: #86868b;
225 }
226
227 /* Pro Badge */
228 .ka-pro-badge-inline {
229 display: inline-flex;
230 align-items: center;
231 gap: 4px;
232 background: linear-gradient(135deg, #f59e0b, #f97316);
233 color: #fff;
234 font-size: 10px;
235 font-weight: 600;
236 padding: 2px 8px;
237 border-radius: 10px;
238 margin-left: 8px;
239 text-transform: uppercase;
240 }
241
242 /* Stats Cards */
243 .ka-stats-grid {
244 display: grid;
245 grid-template-columns: repeat(4, 1fr);
246 gap: 16px;
247 margin-bottom: 24px;
248 }
249
250 .ka-stat-card {
251 background: #fff;
252 border-radius: 16px;
253 padding: 20px;
254 box-shadow: 0 2px 12px rgba(0,0,0,0.04);
255 }
256
257 .ka-stat-value {
258 font-size: 32px;
259 font-weight: 700;
260 color: #1d1d1f;
261 margin-bottom: 4px;
262 }
263
264 .ka-stat-label {
265 font-size: 13px;
266 color: #6e6e73;
267 }
268
269 .ka-stat-card--accent .ka-stat-value {
270 color: var(--ka-accent);
271 }
272
273 /* Dark Mode */
274 .ka-v3-dark .ka-layout-option {
275 border-color: #3a3a3a;
276 background: #1e1e1e;
277 }
278
279 .ka-v3-dark .ka-layout-option:hover {
280 border-color: #4a4a4a;
281 }
282
283 .ka-v3-dark .ka-layout-option.active {
284 border-color: var(--ka-accent);
285 }
286
287 .ka-v3-dark .ka-layout-preview-img {
288 background: #141414;
289 }
290
291 .ka-v3-dark .ka-layout-preview-label {
292 background: #1e1e1e;
293 color: #f5f5f7;
294 border-color: #2a2a2a;
295 }
296
297 .ka-v3-dark .ka-layout-box-item,
298 .ka-v3-dark .ka-layout-card-item,
299 .ka-v3-dark .ka-layout-modern-item {
300 background: #2a2a2a;
301 border-color: #3a3a3a;
302 }
303
304 .ka-v3-dark .ka-layout-box-title,
305 .ka-v3-dark .ka-layout-card-title,
306 .ka-v3-dark .ka-layout-modern-title {
307 background: #f5f5f7;
308 }
309
310 .ka-v3-dark .ka-layout-box-line,
311 .ka-v3-dark .ka-layout-modern-desc {
312 background: #4a4a4a;
313 }
314
315 .ka-v3-dark .ka-stat-card {
316 background: #1e1e1e;
317 }
318
319 .ka-v3-dark .ka-stat-value {
320 color: #f5f5f7;
321 }
322
323 /* Save Button */
324 .ka-save-btn {
325 display: inline-flex;
326 align-items: center;
327 gap: 8px;
328 padding: 14px 28px;
329 background: linear-gradient(135deg, #0066ff 0%, #0052cc 100%);
330 color: #fff;
331 border: none;
332 border-radius: 12px;
333 font-size: 15px;
334 font-weight: 600;
335 cursor: pointer;
336 transition: all 0.2s ease;
337 box-shadow: 0 4px 15px rgba(0, 102, 255, 0.25);
338 }
339
340 .ka-save-btn:hover {
341 transform: translateY(-2px);
342 box-shadow: 0 6px 20px rgba(0, 102, 255, 0.35);
343 }
344
345 .ka-save-btn .dashicons {
346 font-size: 18px;
347 width: 18px;
348 height: 18px;
349 }
350
351 .ka-card-footer {
352 background: transparent;
353 box-shadow: none;
354 padding: 24px 0;
355 }
356 </style>
357
358 <div class="wrap ka-docs-kb-page">
359 <script>
360 (function() {
361 const mode = '<?php echo esc_js($theme_mode); ?>';
362 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
363 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
364 document.documentElement.classList.toggle('ka-v3-dark', isDark);
365 document.body.classList.toggle('ka-v3-dark', isDark);
366 })();
367 </script>
368
369 <div class="ka-admin-wrap">
370 <!-- Header -->
371 <div class="ka-admin-header">
372 <div class="ka-admin-header-left">
373 <div class="ka-admin-header-icon" style="background: linear-gradient(135deg, #0066ff 0%, #5ac8fa 100%);">
374 <span class="dashicons dashicons-book-alt"></span>
375 </div>
376 <div>
377 <h1 class="ka-admin-title"><?php esc_html_e('Docs & Knowledge Base', 'king-addons'); ?></h1>
378 <p class="ka-admin-subtitle"><?php esc_html_e('Create beautiful documentation for your website', 'king-addons'); ?></p>
379 </div>
380 </div>
381 <div class="ka-admin-header-actions">
382 <?php if (!empty($options['enabled'])): ?>
383 <span class="ka-status-badge enabled">
384 <span class="ka-status-badge-dot"></span>
385 <?php esc_html_e('Enabled', 'king-addons'); ?>
386 </span>
387 <?php else: ?>
388 <span class="ka-status-badge disabled">
389 <span class="ka-status-badge-dot"></span>
390 <?php esc_html_e('Disabled', 'king-addons'); ?>
391 </span>
392 <?php endif; ?>
393 <a href="<?php echo esc_url(admin_url('edit.php?post_type=' . \King_Addons\Docs_KB::POST_TYPE)); ?>" class="ka-btn ka-btn-secondary">
394 <span class="dashicons dashicons-admin-page"></span>
395 <?php esc_html_e('All Docs', 'king-addons'); ?>
396 </a>
397 <a href="<?php echo esc_url(admin_url('post-new.php?post_type=' . \King_Addons\Docs_KB::POST_TYPE)); ?>" class="ka-btn ka-btn-primary">
398 <span class="dashicons dashicons-plus-alt"></span>
399 <?php esc_html_e('Add New Doc', 'king-addons'); ?>
400 </a>
401 <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="<?php echo esc_attr(esc_html__('Theme', 'king-addons')); ?>" data-active="<?php echo esc_attr($theme_mode); ?>">
402 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
403 <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>">
404 <span class="ka-v3-segmented-icon" aria-hidden="true">☀︎</span>
405 <?php esc_html_e('Light', 'king-addons'); ?>
406 </button>
407 <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>">
408 <span class="ka-v3-segmented-icon" aria-hidden="true"></span>
409 <?php esc_html_e('Dark', 'king-addons'); ?>
410 </button>
411 <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>">
412 <?php esc_html_e('Auto', 'king-addons'); ?>
413 </button>
414 </div>
415 </div>
416 </div>
417
418 <?php if ($saved): ?>
419 <div class="notice notice-success is-dismissible" style="margin: 20px 0;">
420 <p><?php esc_html_e('Settings saved successfully.', 'king-addons'); ?></p>
421 </div>
422 <?php endif; ?>
423
424 <!-- Quick Stats -->
425 <?php
426 $total_docs = wp_count_posts(\King_Addons\Docs_KB::POST_TYPE)->publish ?? 0;
427 $total_categories = wp_count_terms(['taxonomy' => \King_Addons\Docs_KB::TAXONOMY, 'hide_empty' => false]);
428 $total_views = 0;
429 $total_feedback = 0;
430
431 if ($is_premium && !empty($options['analytics_enabled'])) {
432 global $wpdb;
433 $total_views = $wpdb->get_var($wpdb->prepare(
434 "SELECT SUM(meta_value) FROM {$wpdb->postmeta} WHERE meta_key = %s",
435 '_kng_doc_views'
436 )) ?: 0;
437 }
438 ?>
439 <div class="ka-stats-grid">
440 <div class="ka-stat-card">
441 <div class="ka-stat-value"><?php echo esc_html(number_format_i18n($total_docs)); ?></div>
442 <div class="ka-stat-label"><?php esc_html_e('Total Articles', 'king-addons'); ?></div>
443 </div>
444 <div class="ka-stat-card">
445 <div class="ka-stat-value"><?php echo esc_html(number_format_i18n($total_categories)); ?></div>
446 <div class="ka-stat-label"><?php esc_html_e('Categories', 'king-addons'); ?></div>
447 </div>
448 <div class="ka-stat-card ka-stat-card--accent">
449 <div class="ka-stat-value"><?php echo $is_premium ? esc_html(number_format_i18n($total_views)) : ''; ?></div>
450 <div class="ka-stat-label"><?php esc_html_e('Total Views', 'king-addons'); ?> <?php if (!$is_premium): ?><span class="ka-pro-badge-inline">PRO</span><?php endif; ?></div>
451 </div>
452 <div class="ka-stat-card">
453 <div class="ka-stat-value"><?php echo $is_premium && !empty($options['search_enabled']) ? esc_html(count(get_option('king_addons_docs_search_logs', []))) : ''; ?></div>
454 <div class="ka-stat-label"><?php esc_html_e('Searches', 'king-addons'); ?> <?php if (!$is_premium): ?><span class="ka-pro-badge-inline">PRO</span><?php endif; ?></div>
455 </div>
456 </div>
457
458 <!-- Settings Form -->
459 <form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post">
460 <input type="hidden" name="action" value="king_addons_docs_kb_save">
461 <?php wp_nonce_field('king_addons_docs_kb_save', 'king_docs_kb_nonce'); ?>
462
463 <!-- General Settings -->
464 <div class="ka-card">
465 <div class="ka-card-header">
466 <span class="dashicons dashicons-admin-settings"></span>
467 <h2><?php esc_html_e('General Settings', 'king-addons'); ?></h2>
468 </div>
469 <div class="ka-card-body">
470 <div class="ka-row">
471 <div class="ka-row-label"><?php esc_html_e('Enable Documentation', 'king-addons'); ?></div>
472 <div class="ka-row-field">
473 <label class="ka-toggle">
474 <input type="checkbox" name="enabled" value="1" <?php checked(!empty($options['enabled'])); ?>>
475 <span class="ka-toggle-slider"></span>
476 <span class="ka-toggle-label"><?php esc_html_e('Show docs section on your site', 'king-addons'); ?></span>
477 </label>
478 </div>
479 </div>
480 <div class="ka-grid-2">
481 <div class="ka-row">
482 <div class="ka-row-label"><?php esc_html_e('Documentation Slug', 'king-addons'); ?></div>
483 <div class="ka-row-field">
484 <div style="display: flex; align-items: center; gap: 8px;">
485 <span style="color: #6e6e73;"><?php echo esc_html(home_url('/')); ?></span>
486 <input type="text" name="docs_slug" value="<?php echo esc_attr($options['docs_slug']); ?>" style="width: 120px;">
487 </div>
488 <p class="ka-row-desc"><?php esc_html_e('URL slug for your documentation', 'king-addons'); ?></p>
489 </div>
490 </div>
491 <div class="ka-row">
492 <div class="ka-row-label"><?php esc_html_e('Main Docs Page', 'king-addons'); ?></div>
493 <div class="ka-row-field">
494 <select name="main_page_id">
495 <option value="0"><?php esc_html_e('— Use Archive Template —', 'king-addons'); ?></option>
496 <?php foreach ($pages as $page): ?>
497 <option value="<?php echo esc_attr($page->ID); ?>" <?php selected($options['main_page_id'], $page->ID); ?>>
498 <?php echo esc_html($page->post_title); ?>
499 </option>
500 <?php endforeach; ?>
501 </select>
502 </div>
503 </div>
504 </div>
505 <div class="ka-row">
506 <div class="ka-row-label"><?php esc_html_e('Articles Per Page', 'king-addons'); ?></div>
507 <div class="ka-row-field">
508 <input type="number" name="docs_per_page" value="<?php echo esc_attr($options['docs_per_page']); ?>" min="1" max="50" style="width: 80px;">
509 </div>
510 </div>
511 </div>
512 </div>
513
514 <!-- Layout Settings -->
515 <div class="ka-card">
516 <div class="ka-card-header">
517 <span class="dashicons dashicons-layout"></span>
518 <h2><?php esc_html_e('Layout & Appearance', 'king-addons'); ?></h2>
519 </div>
520 <div class="ka-card-body">
521 <div class="ka-row">
522 <div class="ka-row-label"><?php esc_html_e('Category Layout', 'king-addons'); ?></div>
523 <div class="ka-row-field">
524 <div class="ka-layout-preview">
525 <!-- Box Layout -->
526 <label class="ka-layout-option <?php echo $options['layout'] === 'box' ? 'active' : ''; ?>">
527 <input type="radio" name="layout" value="box" <?php checked($options['layout'], 'box'); ?>>
528 <div class="ka-layout-preview-img">
529 <div class="ka-layout-box-preview">
530 <div class="ka-layout-box-item">
531 <div class="ka-layout-box-item-header">
532 <div class="ka-layout-box-icon"></div>
533 <div class="ka-layout-box-title"></div>
534 </div>
535 <div class="ka-layout-box-line"></div>
536 <div class="ka-layout-box-line"></div>
537 <div class="ka-layout-box-line"></div>
538 </div>
539 <div class="ka-layout-box-item">
540 <div class="ka-layout-box-item-header">
541 <div class="ka-layout-box-icon"></div>
542 <div class="ka-layout-box-title"></div>
543 </div>
544 <div class="ka-layout-box-line"></div>
545 <div class="ka-layout-box-line"></div>
546 <div class="ka-layout-box-line"></div>
547 </div>
548 </div>
549 </div>
550 <div class="ka-layout-preview-label"><?php esc_html_e('Box', 'king-addons'); ?></div>
551 </label>
552
553 <!-- Card Layout -->
554 <label class="ka-layout-option <?php echo $options['layout'] === 'card' ? 'active' : ''; ?>">
555 <input type="radio" name="layout" value="card" <?php checked($options['layout'], 'card'); ?>>
556 <div class="ka-layout-preview-img">
557 <div class="ka-layout-card-preview">
558 <div class="ka-layout-card-item">
559 <div class="ka-layout-card-icon"></div>
560 <div class="ka-layout-card-title"></div>
561 <div class="ka-layout-card-count"></div>
562 </div>
563 <div class="ka-layout-card-item">
564 <div class="ka-layout-card-icon"></div>
565 <div class="ka-layout-card-title"></div>
566 <div class="ka-layout-card-count"></div>
567 </div>
568 </div>
569 </div>
570 <div class="ka-layout-preview-label"><?php esc_html_e('Card', 'king-addons'); ?></div>
571 </label>
572
573 <!-- Modern Layout -->
574 <label class="ka-layout-option <?php echo $options['layout'] === 'modern' ? 'active' : ''; ?>">
575 <input type="radio" name="layout" value="modern" <?php checked($options['layout'], 'modern'); ?>>
576 <div class="ka-layout-preview-img">
577 <div class="ka-layout-modern-preview">
578 <div class="ka-layout-modern-item">
579 <div class="ka-layout-modern-icon"></div>
580 <div class="ka-layout-modern-content">
581 <div class="ka-layout-modern-title"></div>
582 <div class="ka-layout-modern-desc"></div>
583 </div>
584 <svg class="ka-layout-modern-arrow" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
585 </div>
586 <div class="ka-layout-modern-item">
587 <div class="ka-layout-modern-icon"></div>
588 <div class="ka-layout-modern-content">
589 <div class="ka-layout-modern-title"></div>
590 <div class="ka-layout-modern-desc"></div>
591 </div>
592 <svg class="ka-layout-modern-arrow" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
593 </div>
594 </div>
595 </div>
596 <div class="ka-layout-preview-label"><?php esc_html_e('Modern', 'king-addons'); ?></div>
597 </label>
598 </div>
599 </div>
600 </div>
601
602 <div class="ka-grid-2">
603 <div class="ka-row">
604 <div class="ka-row-label"><?php esc_html_e('Columns', 'king-addons'); ?></div>
605 <div class="ka-row-field">
606 <select name="columns">
607 <option value="2" <?php selected($options['columns'], 2); ?>>2</option>
608 <option value="3" <?php selected($options['columns'], 3); ?>>3</option>
609 <option value="4" <?php selected($options['columns'], 4); ?>>4</option>
610 </select>
611 </div>
612 </div>
613 <div class="ka-row">
614 <div class="ka-row-label"><?php esc_html_e('Show Article Count', 'king-addons'); ?></div>
615 <div class="ka-row-field">
616 <label class="ka-toggle">
617 <input type="checkbox" name="show_article_count" value="1" <?php checked(!empty($options['show_article_count'])); ?>>
618 <span class="ka-toggle-slider"></span>
619 </label>
620 </div>
621 </div>
622 <div class="ka-row">
623 <div class="ka-row-label"><?php esc_html_e('Show Category Icon', 'king-addons'); ?></div>
624 <div class="ka-row-field">
625 <label class="ka-toggle">
626 <input type="checkbox" name="show_category_icon" value="1" <?php checked(!empty($options['show_category_icon'])); ?>>
627 <span class="ka-toggle-slider"></span>
628 </label>
629 </div>
630 </div>
631 </div>
632
633 <h4 style="margin: 24px 0 16px; color: #6e6e73; font-size: 13px; text-transform: uppercase;"><?php esc_html_e('Colors', 'king-addons'); ?></h4>
634 <div class="ka-grid-3">
635 <div class="ka-row">
636 <div class="ka-row-label"><?php esc_html_e('Primary Color', 'king-addons'); ?></div>
637 <div class="ka-row-field">
638 <input type="text" name="primary_color" value="<?php echo esc_attr($options['primary_color']); ?>" class="ka-color-picker">
639 </div>
640 </div>
641 <div class="ka-row">
642 <div class="ka-row-label"><?php esc_html_e('Icon Color', 'king-addons'); ?></div>
643 <div class="ka-row-field">
644 <input type="text" name="category_icon_color" value="<?php echo esc_attr($options['category_icon_color']); ?>" class="ka-color-picker">
645 </div>
646 </div>
647 <div class="ka-row">
648 <div class="ka-row-label"><?php esc_html_e('Link Color', 'king-addons'); ?></div>
649 <div class="ka-row-field">
650 <input type="text" name="link_color" value="<?php echo esc_attr($options['link_color']); ?>" class="ka-color-picker">
651 </div>
652 </div>
653 </div>
654 </div>
655 </div>
656
657 <!-- Single Article Settings -->
658 <div class="ka-card">
659 <div class="ka-card-header">
660 <span class="dashicons dashicons-media-document"></span>
661 <h2><?php esc_html_e('Single Article', 'king-addons'); ?></h2>
662 </div>
663 <div class="ka-card-body">
664 <div class="ka-grid-2">
665 <div class="ka-row">
666 <div class="ka-row-label"><?php esc_html_e('Table of Contents', 'king-addons'); ?></div>
667 <div class="ka-row-field">
668 <label class="ka-toggle">
669 <input type="checkbox" name="toc_enabled" value="1" <?php checked(!empty($options['toc_enabled'])); ?>>
670 <span class="ka-toggle-slider"></span>
671 <span class="ka-toggle-label"><?php esc_html_e('Auto-generate TOC from headings', 'king-addons'); ?></span>
672 </label>
673 </div>
674 </div>
675 <div class="ka-row">
676 <div class="ka-row-label"><?php esc_html_e('Sticky TOC', 'king-addons'); ?></div>
677 <div class="ka-row-field">
678 <label class="ka-toggle">
679 <input type="checkbox" name="toc_sticky" value="1" <?php checked(!empty($options['toc_sticky'])); ?>>
680 <span class="ka-toggle-slider"></span>
681 <span class="ka-toggle-label"><?php esc_html_e('Keep TOC visible on scroll', 'king-addons'); ?></span>
682 </label>
683 </div>
684 </div>
685 <div class="ka-row">
686 <div class="ka-row-label"><?php esc_html_e('TOC Headings', 'king-addons'); ?></div>
687 <div class="ka-row-field">
688 <select name="toc_headings">
689 <option value="h2" <?php selected($options['toc_headings'], 'h2'); ?>>H2 only</option>
690 <option value="h2,h3" <?php selected($options['toc_headings'], 'h2,h3'); ?>>H2, H3</option>
691 <option value="h2,h3,h4" <?php selected($options['toc_headings'], 'h2,h3,h4'); ?>>H2, H3, H4</option>
692 </select>
693 </div>
694 </div>
695 <div class="ka-row">
696 <div class="ka-row-label"><?php esc_html_e('Sidebar', 'king-addons'); ?></div>
697 <div class="ka-row-field">
698 <label class="ka-toggle">
699 <input type="checkbox" name="sidebar_enabled" value="1" <?php checked(!empty($options['sidebar_enabled'])); ?>>
700 <span class="ka-toggle-slider"></span>
701 <span class="ka-toggle-label"><?php esc_html_e('Show category navigation sidebar', 'king-addons'); ?></span>
702 </label>
703 </div>
704 </div>
705 <div class="ka-row">
706 <div class="ka-row-label"><?php esc_html_e('Prev/Next Navigation', 'king-addons'); ?></div>
707 <div class="ka-row-field">
708 <label class="ka-toggle">
709 <input type="checkbox" name="navigation_enabled" value="1" <?php checked(!empty($options['navigation_enabled'])); ?>>
710 <span class="ka-toggle-slider"></span>
711 </label>
712 </div>
713 </div>
714 <div class="ka-row">
715 <div class="ka-row-label"><?php esc_html_e('Print Button', 'king-addons'); ?></div>
716 <div class="ka-row-field">
717 <label class="ka-toggle">
718 <input type="checkbox" name="print_button" value="1" <?php checked(!empty($options['print_button'])); ?>>
719 <span class="ka-toggle-slider"></span>
720 </label>
721 </div>
722 </div>
723 </div>
724 </div>
725 </div>
726
727 <!-- Search Settings -->
728 <div class="ka-card">
729 <div class="ka-card-header">
730 <span class="dashicons dashicons-search"></span>
731 <h2><?php esc_html_e('Search', 'king-addons'); ?></h2>
732 </div>
733 <div class="ka-card-body">
734 <div class="ka-row">
735 <div class="ka-row-label"><?php esc_html_e('Enable Search', 'king-addons'); ?></div>
736 <div class="ka-row-field">
737 <label class="ka-toggle">
738 <input type="checkbox" name="search_enabled" value="1" <?php checked(!empty($options['search_enabled'])); ?>>
739 <span class="ka-toggle-slider"></span>
740 <span class="ka-toggle-label"><?php esc_html_e('Show live search on docs pages', 'king-addons'); ?></span>
741 </label>
742 </div>
743 </div>
744 <div class="ka-grid-2">
745 <div class="ka-row">
746 <div class="ka-row-label"><?php esc_html_e('Search Placeholder', 'king-addons'); ?></div>
747 <div class="ka-row-field">
748 <input type="text" name="search_placeholder" value="<?php echo esc_attr($options['search_placeholder']); ?>">
749 </div>
750 </div>
751 <div class="ka-row">
752 <div class="ka-row-label"><?php esc_html_e('Minimum Characters', 'king-addons'); ?></div>
753 <div class="ka-row-field">
754 <input type="number" name="search_min_chars" value="<?php echo esc_attr($options['search_min_chars']); ?>" min="1" max="5" style="width: 80px;">
755 </div>
756 </div>
757 </div>
758 </div>
759 </div>
760
761 <!-- Pro: Internal Docs -->
762 <div class="ka-card <?php echo !$is_premium ? 'ka-card-pro' : ''; ?>">
763 <div class="ka-card-header">
764 <span class="dashicons dashicons-lock"></span>
765 <h2><?php esc_html_e('Internal Documentation', 'king-addons'); ?> <span class="ka-pro-badge-inline">PRO</span></h2>
766 </div>
767 <div class="ka-card-body">
768 <?php if (!$is_premium): ?>
769 <div class="ka-pro-overlay">
770 <p><?php esc_html_e('Create private documentation visible only to specific user roles.', 'king-addons'); ?></p>
771 <a href="#" class="ka-btn ka-btn-primary"><?php esc_html_e('Upgrade to Pro', 'king-addons'); ?></a>
772 </div>
773 <?php endif; ?>
774 <div class="ka-row">
775 <div class="ka-row-label"><?php esc_html_e('Enable Internal Docs', 'king-addons'); ?></div>
776 <div class="ka-row-field">
777 <label class="ka-toggle">
778 <input type="checkbox" name="internal_docs_enabled" value="1" <?php checked(!empty($options['internal_docs_enabled'])); ?> <?php echo !$is_premium ? 'disabled' : ''; ?>>
779 <span class="ka-toggle-slider"></span>
780 </label>
781 </div>
782 </div>
783 <div class="ka-row">
784 <div class="ka-row-label"><?php esc_html_e('Allowed Roles', 'king-addons'); ?></div>
785 <div class="ka-row-field">
786 <?php foreach ($roles as $role_key => $role_name): ?>
787 <label style="display: inline-flex; align-items: center; margin-right: 16px; margin-bottom: 8px;">
788 <input type="checkbox" name="internal_docs_roles[]" value="<?php echo esc_attr($role_key); ?>"
789 <?php checked(in_array($role_key, $options['internal_docs_roles'] ?? [])); ?>
790 <?php echo !$is_premium ? 'disabled' : ''; ?>>
791 <span style="margin-left: 6px;"><?php echo esc_html($role_name); ?></span>
792 </label>
793 <?php endforeach; ?>
794 </div>
795 </div>
796 </div>
797 </div>
798
799 <!-- Pro: Feedback -->
800 <div class="ka-card <?php echo !$is_premium ? 'ka-card-pro' : ''; ?>">
801 <div class="ka-card-header">
802 <span class="dashicons dashicons-thumbs-up"></span>
803 <h2><?php esc_html_e('Article Feedback', 'king-addons'); ?> <span class="ka-pro-badge-inline">PRO</span></h2>
804 </div>
805 <div class="ka-card-body">
806 <?php if (!$is_premium): ?>
807 <div class="ka-pro-overlay">
808 <p><?php esc_html_e('Let readers rate your articles with helpful/not helpful feedback.', 'king-addons'); ?></p>
809 <a href="#" class="ka-btn ka-btn-primary"><?php esc_html_e('Upgrade to Pro', 'king-addons'); ?></a>
810 </div>
811 <?php endif; ?>
812 <div class="ka-row">
813 <div class="ka-row-label"><?php esc_html_e('Enable Feedback', 'king-addons'); ?></div>
814 <div class="ka-row-field">
815 <label class="ka-toggle">
816 <input type="checkbox" name="feedback_enabled" value="1" <?php checked(!empty($options['feedback_enabled'])); ?> <?php echo !$is_premium ? 'disabled' : ''; ?>>
817 <span class="ka-toggle-slider"></span>
818 </label>
819 </div>
820 </div>
821 <div class="ka-row">
822 <div class="ka-row-label"><?php esc_html_e('Feedback Question', 'king-addons'); ?></div>
823 <div class="ka-row-field">
824 <input type="text" name="feedback_question" value="<?php echo esc_attr($options['feedback_question']); ?>" <?php echo !$is_premium ? 'disabled' : ''; ?>>
825 </div>
826 </div>
827 </div>
828 </div>
829
830 <!-- Pro: Related Docs -->
831 <div class="ka-card <?php echo !$is_premium ? 'ka-card-pro' : ''; ?>">
832 <div class="ka-card-header">
833 <span class="dashicons dashicons-admin-links"></span>
834 <h2><?php esc_html_e('Related Articles', 'king-addons'); ?> <span class="ka-pro-badge-inline">PRO</span></h2>
835 </div>
836 <div class="ka-card-body">
837 <?php if (!$is_premium): ?>
838 <div class="ka-pro-overlay">
839 <p><?php esc_html_e('Show related articles at the end of each doc to keep readers engaged.', 'king-addons'); ?></p>
840 <a href="#" class="ka-btn ka-btn-primary"><?php esc_html_e('Upgrade to Pro', 'king-addons'); ?></a>
841 </div>
842 <?php endif; ?>
843 <div class="ka-grid-2">
844 <div class="ka-row">
845 <div class="ka-row-label"><?php esc_html_e('Show Related Articles', 'king-addons'); ?></div>
846 <div class="ka-row-field">
847 <label class="ka-toggle">
848 <input type="checkbox" name="related_enabled" value="1" <?php checked(!empty($options['related_enabled'])); ?> <?php echo !$is_premium ? 'disabled' : ''; ?>>
849 <span class="ka-toggle-slider"></span>
850 </label>
851 </div>
852 </div>
853 <div class="ka-row">
854 <div class="ka-row-label"><?php esc_html_e('Number of Articles', 'king-addons'); ?></div>
855 <div class="ka-row-field">
856 <input type="number" name="related_count" value="<?php echo esc_attr($options['related_count']); ?>" min="1" max="6" style="width: 80px;" <?php echo !$is_premium ? 'disabled' : ''; ?>>
857 </div>
858 </div>
859 </div>
860 </div>
861 </div>
862
863 <!-- Pro: Analytics -->
864 <div class="ka-card <?php echo !$is_premium ? 'ka-card-pro' : ''; ?>">
865 <div class="ka-card-header">
866 <span class="dashicons dashicons-chart-area"></span>
867 <h2><?php esc_html_e('Analytics & Reports', 'king-addons'); ?> <span class="ka-pro-badge-inline">PRO</span></h2>
868 </div>
869 <div class="ka-card-body">
870 <?php if (!$is_premium): ?>
871 <div class="ka-pro-overlay">
872 <p><?php esc_html_e('Track views, search analytics, and get email reports.', 'king-addons'); ?></p>
873 <a href="#" class="ka-btn ka-btn-primary"><?php esc_html_e('Upgrade to Pro', 'king-addons'); ?></a>
874 </div>
875 <?php endif; ?>
876 <div class="ka-row">
877 <div class="ka-row-label"><?php esc_html_e('Enable Analytics', 'king-addons'); ?></div>
878 <div class="ka-row-field">
879 <label class="ka-toggle">
880 <input type="checkbox" name="analytics_enabled" value="1" <?php checked(!empty($options['analytics_enabled'])); ?> <?php echo !$is_premium ? 'disabled' : ''; ?>>
881 <span class="ka-toggle-slider"></span>
882 <span class="ka-toggle-label"><?php esc_html_e('Track article views and search queries', 'king-addons'); ?></span>
883 </label>
884 </div>
885 </div>
886 <div class="ka-grid-2">
887 <div class="ka-row">
888 <div class="ka-row-label"><?php esc_html_e('Email Reports', 'king-addons'); ?></div>
889 <div class="ka-row-field">
890 <label class="ka-toggle">
891 <input type="checkbox" name="analytics_email_report" value="1" <?php checked(!empty($options['analytics_email_report'])); ?> <?php echo !$is_premium ? 'disabled' : ''; ?>>
892 <span class="ka-toggle-slider"></span>
893 <span class="ka-toggle-label"><?php esc_html_e('Weekly analytics summary', 'king-addons'); ?></span>
894 </label>
895 </div>
896 </div>
897 <div class="ka-row">
898 <div class="ka-row-label"><?php esc_html_e('Report Email', 'king-addons'); ?></div>
899 <div class="ka-row-field">
900 <input type="email" name="analytics_email" value="<?php echo esc_attr($options['analytics_email']); ?>" <?php echo !$is_premium ? 'disabled' : ''; ?>>
901 </div>
902 </div>
903 </div>
904 </div>
905 </div>
906
907 <!-- Save Button -->
908 <div class="ka-card ka-card-footer">
909 <button type="submit" class="ka-save-btn">
910 <span class="dashicons dashicons-saved"></span>
911 <?php esc_html_e('Save Settings', 'king-addons'); ?>
912 </button>
913 </div>
914 </form>
915 </div>
916
917 <script>
918 (function() {
919 const segment = document.getElementById('ka-v3-theme-segment');
920 if (!segment) {
921 return;
922 }
923
924 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
925 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
926 const buttons = segment.querySelectorAll('.ka-v3-segmented-btn');
927 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
928 let mode = (segment.getAttribute('data-active') || 'dark').toString();
929 let mqlHandler = null;
930
931 function setPressedState(activeMode) {
932 segment.setAttribute('data-active', activeMode);
933 buttons.forEach((btn) => {
934 const theme = btn.getAttribute('data-theme');
935 btn.setAttribute('aria-pressed', theme === activeMode ? 'true' : 'false');
936 });
937 }
938
939 function saveUISetting(key, value) {
940 try {
941 const body = new URLSearchParams();
942 body.set('action', 'king_addons_save_dashboard_ui');
943 body.set('nonce', nonce);
944 body.set('key', key);
945 body.set('value', value);
946
947 fetch(ajaxUrl, {
948 method: 'POST',
949 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
950 body: body.toString(),
951 credentials: 'same-origin'
952 });
953 } catch (e) {}
954 }
955
956 function applyTheme(isDark) {
957 document.body.classList.toggle('ka-v3-dark', isDark);
958 document.documentElement.classList.toggle('ka-v3-dark', isDark);
959 }
960
961 function setThemeMode(nextMode, save) {
962 mode = nextMode;
963 setPressedState(nextMode);
964
965 if (mqlHandler && mql) {
966 if (mql.removeEventListener) {
967 mql.removeEventListener('change', mqlHandler);
968 } else if (mql.removeListener) {
969 mql.removeListener(mqlHandler);
970 }
971 mqlHandler = null;
972 }
973
974 if (nextMode === 'auto') {
975 applyTheme(!!(mql && mql.matches));
976 mqlHandler = (e) => {
977 if (mode !== 'auto') {
978 return;
979 }
980 applyTheme(!!e.matches);
981 };
982 if (mql) {
983 if (mql.addEventListener) {
984 mql.addEventListener('change', mqlHandler);
985 } else if (mql.addListener) {
986 mql.addListener(mqlHandler);
987 }
988 }
989 } else {
990 applyTheme(nextMode === 'dark');
991 }
992
993 if (save) {
994 saveUISetting('theme_mode', nextMode);
995 }
996 }
997
998 window.kaV3ToggleDark = function() {
999 const isDark = document.body.classList.contains('ka-v3-dark');
1000 setThemeMode(isDark ? 'light' : 'dark', true);
1001 };
1002
1003 segment.addEventListener('click', (e) => {
1004 const btn = e.target && e.target.closest ? e.target.closest('.ka-v3-segmented-btn') : null;
1005 if (!btn) {
1006 return;
1007 }
1008 e.preventDefault();
1009 const theme = (btn.getAttribute('data-theme') || 'dark').toString();
1010 setThemeMode(theme, true);
1011 });
1012
1013 setThemeMode(mode, false);
1014 })();
1015
1016 // Layout option selection
1017 document.querySelectorAll('.ka-layout-option input').forEach(function(input) {
1018 input.addEventListener('change', function() {
1019 document.querySelectorAll('.ka-layout-option').forEach(function(opt) {
1020 opt.classList.remove('active');
1021 });
1022 this.closest('.ka-layout-option').classList.add('active');
1023 });
1024 });
1025
1026 // Color picker init
1027 jQuery(document).ready(function($) {
1028 $('.ka-color-picker').wpColorPicker();
1029 });
1030 </script>
1031 </div>
1032