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 / Age_Gate / 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/Age_Gate/templates/admin-page.php

686 lines 44.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Admin page for Age Gate - V3 Apple-inspired Design.
4 *
5 * @package King_Addons
6 */
7
8 use King_Addons\Age_Gate;
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 $pages = get_pages(['number' => 200]);
23 $page_options = [];
24 foreach ($pages as $page) {
25 $page_options[$page->ID] = $page->post_title;
26 }
27
28 $post_types = get_post_types(['public' => true], 'objects');
29 $elementor_templates = get_posts([
30 'post_type' => 'elementor_library',
31 'posts_per_page' => 50,
32 ]);
33
34 // Theme mode is per-user
35 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
36 $allowed_theme_modes = ['dark', 'light', 'auto'];
37 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
38 $theme_mode = 'dark';
39 }
40 ?>
41 <script>
42 (function() {
43 const mode = '<?php echo esc_js($theme_mode); ?>';
44 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
45 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
46 document.documentElement.classList.toggle('ka-v3-dark', isDark);
47 document.body && document.body.classList.add('ka-admin-v3');
48 document.body && document.body.classList.toggle('ka-v3-dark', isDark);
49 })();
50 </script>
51
52 <div class="ka-admin-wrap">
53 <!-- Header -->
54 <div class="ka-admin-header">
55 <div class="ka-admin-header-left">
56 <div class="ka-admin-header-icon purple">
57 <span class="dashicons dashicons-lock"></span>
58 </div>
59 <div>
60 <h1 class="ka-admin-title"><?php esc_html_e('Age Gate', 'king-addons'); ?></h1>
61 <p class="ka-admin-subtitle"><?php esc_html_e('Age verification overlay for restricted content', 'king-addons'); ?></p>
62 </div>
63 </div>
64 <div class="ka-admin-header-actions">
65 <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="Theme" data-active="<?php echo esc_attr($theme_mode); ?>">
66 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
67 <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>
68 <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>
69 <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>
70 </div>
71 <span class="ka-status <?php echo !empty($options['general']['enabled']) ? 'ka-status-enabled' : 'ka-status-disabled'; ?>">
72 <span class="ka-status-dot"></span>
73 <?php echo !empty($options['general']['enabled']) ? esc_html__('Enabled', 'king-addons') : esc_html__('Disabled', 'king-addons'); ?>
74 </span>
75 </div>
76 </div>
77
78 <?php settings_errors('king_addons_age_gate'); ?>
79
80 <!-- Tabs -->
81 <div class="ka-tabs">
82 <button type="button" class="ka-tab active" data-tab="general"><?php esc_html_e('General', 'king-addons'); ?></button>
83 <button type="button" class="ka-tab" data-tab="display"><?php esc_html_e('Display Rules', 'king-addons'); ?></button>
84 <button type="button" class="ka-tab" data-tab="design"><?php esc_html_e('Design', 'king-addons'); ?></button>
85 <button type="button" class="ka-tab" data-tab="behaviour"><?php esc_html_e('Behaviour', 'king-addons'); ?></button>
86 <button type="button" class="ka-tab" data-tab="pro">
87 <?php esc_html_e('Pro Features', 'king-addons'); ?>
88 <?php if (!$is_premium): ?><span class="ka-pro-badge">PRO</span><?php endif; ?>
89 </button>
90 </div>
91
92 <form method="post" action="options.php">
93 <?php settings_fields('king_addons_age_gate'); ?>
94
95 <!-- General Tab -->
96 <div class="ka-tab-content active" data-tab="general">
97 <div class="ka-card">
98 <div class="ka-card-header">
99 <span class="dashicons dashicons-admin-settings"></span>
100 <h2><?php esc_html_e('General Settings', 'king-addons'); ?></h2>
101 </div>
102 <div class="ka-card-body">
103 <div class="ka-row">
104 <div class="ka-row-label"><?php esc_html_e('Enable', 'king-addons'); ?></div>
105 <div class="ka-row-field">
106 <label class="ka-toggle">
107 <input type="checkbox" name="king_addons_age_gate_options[general][enabled]" value="1" <?php checked(!empty($options['general']['enabled'])); ?>>
108 <span class="ka-toggle-slider"></span>
109 <span class="ka-toggle-label"><?php esc_html_e('Turn on age verification', 'king-addons'); ?></span>
110 </label>
111 </div>
112 </div>
113 <div class="ka-row">
114 <div class="ka-row-label"><?php esc_html_e('Audience', 'king-addons'); ?></div>
115 <div class="ka-row-field">
116 <select name="king_addons_age_gate_options[general][audience]">
117 <option value="guests" <?php selected($options['general']['audience'], 'guests'); ?>><?php esc_html_e('Guests only', 'king-addons'); ?></option>
118 <option value="all" <?php selected($options['general']['audience'], 'all'); ?>><?php esc_html_e('Guests and logged-in users', 'king-addons'); ?></option>
119 </select>
120 <p class="ka-row-desc"><?php esc_html_e('Show gate to logged-in users too?', 'king-addons'); ?></p>
121 </div>
122 </div>
123 <div class="ka-row">
124 <div class="ka-row-label"><?php esc_html_e('Verification Mode', 'king-addons'); ?></div>
125 <div class="ka-row-field">
126 <div class="ka-radio-group">
127 <label class="ka-radio-item">
128 <input type="radio" name="king_addons_age_gate_options[general][mode]" value="confirm" <?php checked($options['general']['mode'], 'confirm'); ?>>
129 <?php esc_html_e('Simple confirmation (Yes/No)', 'king-addons'); ?>
130 </label>
131 <label class="ka-radio-item">
132 <input type="radio" name="king_addons_age_gate_options[general][mode]" value="minimum" <?php checked($options['general']['mode'], 'minimum'); ?>>
133 <?php esc_html_e('Minimum age text', 'king-addons'); ?>
134 </label>
135 <label class="ka-radio-item" style="<?php echo $is_premium ? '' : 'opacity: 0.6;'; ?>">
136 <input type="radio" name="king_addons_age_gate_options[general][mode]" value="dob" <?php checked($options['general']['mode'], 'dob'); ?> <?php disabled(!$is_premium); ?>>
137 <?php esc_html_e('Date of birth', 'king-addons'); ?>
138 <?php if (!$is_premium): ?><span class="ka-pro-badge">PRO</span><?php endif; ?>
139 </label>
140 </div>
141 </div>
142 </div>
143 <div class="ka-row">
144 <div class="ka-row-label"><?php esc_html_e('Minimum Age', 'king-addons'); ?></div>
145 <div class="ka-row-field">
146 <input type="number" min="0" name="king_addons_age_gate_options[general][min_age]" value="<?php echo esc_attr($options['general']['min_age']); ?>" style="max-width: 100px;">
147 <span style="color: #86868b; margin-left: 8px;"><?php esc_html_e('years', 'king-addons'); ?></span>
148 </div>
149 </div>
150 <div class="ka-row">
151 <div class="ka-row-label"><?php esc_html_e('Cookie Lifetime', 'king-addons'); ?></div>
152 <div class="ka-row-field">
153 <input type="number" min="0" name="king_addons_age_gate_options[general][cookie_days]" value="<?php echo esc_attr($options['general']['cookie_days']); ?>" style="max-width: 100px;">
154 <span style="color: #86868b; margin-left: 8px;"><?php esc_html_e('days (0 = session)', 'king-addons'); ?></span>
155 </div>
156 </div>
157 </div>
158 </div>
159 </div>
160
161 <!-- Display Tab -->
162 <div class="ka-tab-content" data-tab="display">
163 <div class="ka-card">
164 <div class="ka-card-header">
165 <span class="dashicons dashicons-visibility"></span>
166 <h2><?php esc_html_e('Display Rules', 'king-addons'); ?></h2>
167 </div>
168 <div class="ka-card-body">
169 <div class="ka-row">
170 <div class="ka-row-label"><?php esc_html_e('Scope', 'king-addons'); ?></div>
171 <div class="ka-row-field">
172 <select name="king_addons_age_gate_options[display][scope]">
173 <option value="site" <?php selected($options['display']['scope'], 'site'); ?>><?php esc_html_e('Entire site', 'king-addons'); ?></option>
174 <option value="posts" <?php selected($options['display']['scope'], 'posts'); ?>><?php esc_html_e('All posts', 'king-addons'); ?></option>
175 <option value="pages" <?php selected($options['display']['scope'], 'pages'); ?>><?php esc_html_e('All pages', 'king-addons'); ?></option>
176 </select>
177 </div>
178 </div>
179 <div class="ka-row">
180 <div class="ka-row-label"><?php esc_html_e('Exclude Pages', 'king-addons'); ?></div>
181 <div class="ka-row-field">
182 <select name="king_addons_age_gate_options[display][exclude_ids][]" multiple size="5" style="max-width: 100%; min-height: 120px;">
183 <?php foreach ($page_options as $id => $title): ?>
184 <option value="<?php echo esc_attr($id); ?>" <?php selected(in_array($id, $options['display']['exclude_ids'], true)); ?>>
185 <?php echo esc_html($title); ?>
186 </option>
187 <?php endforeach; ?>
188 </select>
189 <p class="ka-row-desc"><?php esc_html_e('Hold Ctrl/Cmd to select multiple', 'king-addons'); ?></p>
190 </div>
191 </div>
192 <div class="ka-row">
193 <div class="ka-row-label"><?php esc_html_e('Display Mode', 'king-addons'); ?></div>
194 <div class="ka-row-field">
195 <select name="king_addons_age_gate_options[display][mode]" <?php disabled(!$is_premium); ?>>
196 <option value="global" <?php selected($options['display']['mode'], 'global'); ?>><?php esc_html_e('Global (use scope)', 'king-addons'); ?></option>
197 <option value="custom" <?php selected($options['display']['mode'], 'custom'); ?> <?php disabled(!$is_premium); ?>><?php esc_html_e('Custom rules', 'king-addons'); ?></option>
198 </select>
199 <?php if (!$is_premium): ?>
200 <p class="ka-row-desc"><?php esc_html_e('Custom rules available in Pro', 'king-addons'); ?></p>
201 <?php endif; ?>
202 </div>
203 </div>
204 <?php if ($is_premium): ?>
205 <div class="ka-row">
206 <div class="ka-row-label"><?php esc_html_e('Custom Post Types', 'king-addons'); ?></div>
207 <div class="ka-row-field">
208 <select name="king_addons_age_gate_options[display][cpt_scope][]" multiple size="4" style="max-width: 100%; min-height: 100px;">
209 <?php foreach ($post_types as $slug => $pt): ?>
210 <option value="<?php echo esc_attr($slug); ?>" <?php selected(in_array($slug, $options['display']['cpt_scope'], true)); ?>>
211 <?php echo esc_html($pt->labels->name); ?>
212 </option>
213 <?php endforeach; ?>
214 </select>
215 </div>
216 </div>
217 <div class="ka-row">
218 <div class="ka-row-label"><?php esc_html_e('Archives', 'king-addons'); ?></div>
219 <div class="ka-row-field">
220 <label class="ka-toggle">
221 <input type="checkbox" name="king_addons_age_gate_options[display][archives]" value="1" <?php checked(!empty($options['display']['archives'])); ?>>
222 <span class="ka-toggle-slider"></span>
223 <span class="ka-toggle-label"><?php esc_html_e('Show on archives', 'king-addons'); ?></span>
224 </label>
225 </div>
226 </div>
227 <?php endif; ?>
228 </div>
229 </div>
230 </div>
231
232 <!-- Design Tab -->
233 <div class="ka-tab-content" data-tab="design">
234 <div class="ka-card">
235 <div class="ka-card-header">
236 <span class="dashicons dashicons-art pink"></span>
237 <h2><?php esc_html_e('Appearance', 'king-addons'); ?></h2>
238 </div>
239 <div class="ka-card-body">
240 <div class="ka-row">
241 <div class="ka-row-label"><?php esc_html_e('Template', 'king-addons'); ?></div>
242 <div class="ka-row-field">
243 <select name="king_addons_age_gate_options[design][template]">
244 <option value="center-card" <?php selected($options['design']['template'], 'center-card'); ?>><?php esc_html_e('Centered card', 'king-addons'); ?></option>
245 <option value="bottom-card" <?php selected($options['design']['template'], 'bottom-card'); ?>><?php esc_html_e('Bottom card', 'king-addons'); ?></option>
246 </select>
247 </div>
248 </div>
249 <div class="ka-row">
250 <div class="ka-row-label"><?php esc_html_e('Overlay', 'king-addons'); ?></div>
251 <div class="ka-row-field">
252 <div class="ka-grid-2">
253 <div>
254 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Color', 'king-addons'); ?></label>
255 <input type="color" name="king_addons_age_gate_options[design][overlay_color]" value="<?php echo esc_attr($options['design']['overlay_color']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
256 </div>
257 <div>
258 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Opacity', 'king-addons'); ?></label>
259 <input type="number" step="0.05" min="0" max="1" name="king_addons_age_gate_options[design][overlay_opacity]" value="<?php echo esc_attr($options['design']['overlay_opacity']); ?>" style="max-width: 100px;">
260 </div>
261 </div>
262 </div>
263 </div>
264 <div class="ka-row">
265 <div class="ka-row-label"><?php esc_html_e('Card', 'king-addons'); ?></div>
266 <div class="ka-row-field">
267 <div class="ka-grid-2">
268 <div>
269 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Background', 'king-addons'); ?></label>
270 <input type="color" name="king_addons_age_gate_options[design][card_background]" value="<?php echo esc_attr($options['design']['card_background']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
271 </div>
272 <div>
273 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Width (px)', 'king-addons'); ?></label>
274 <input type="number" min="280" name="king_addons_age_gate_options[design][card_width]" value="<?php echo esc_attr($options['design']['card_width']); ?>" style="max-width: 100px;">
275 </div>
276 </div>
277 </div>
278 </div>
279 <div class="ka-row">
280 <div class="ka-row-label"><?php esc_html_e('Text Content', 'king-addons'); ?></div>
281 <div class="ka-row-field">
282 <input type="text" name="king_addons_age_gate_options[design][title]" value="<?php echo esc_attr($options['design']['title']); ?>" placeholder="<?php esc_attr_e('Title', 'king-addons'); ?>" style="margin-bottom: 12px;">
283 <input type="text" name="king_addons_age_gate_options[design][subtitle]" value="<?php echo esc_attr($options['design']['subtitle']); ?>" placeholder="<?php esc_attr_e('Subtitle', 'king-addons'); ?>">
284 </div>
285 </div>
286 <div class="ka-row">
287 <div class="ka-row-label"><?php esc_html_e('Text Color', 'king-addons'); ?></div>
288 <div class="ka-row-field">
289 <input type="color" name="king_addons_age_gate_options[design][text_color]" value="<?php echo esc_attr($options['design']['text_color']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
290 </div>
291 </div>
292 <div class="ka-row">
293 <div class="ka-row-label"><?php esc_html_e('Button Labels', 'king-addons'); ?></div>
294 <div class="ka-row-field">
295 <div class="ka-grid-2">
296 <div>
297 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Yes', 'king-addons'); ?></label>
298 <input type="text" name="king_addons_age_gate_options[design][button_yes]" value="<?php echo esc_attr($options['design']['button_yes']); ?>">
299 </div>
300 <div>
301 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('No', 'king-addons'); ?></label>
302 <input type="text" name="king_addons_age_gate_options[design][button_no]" value="<?php echo esc_attr($options['design']['button_no']); ?>">
303 </div>
304 </div>
305 </div>
306 </div>
307 <div class="ka-row">
308 <div class="ka-row-label"><?php esc_html_e('Typography', 'king-addons'); ?></div>
309 <div class="ka-row-field">
310 <div class="ka-grid-2" style="gap: 16px;">
311 <div>
312 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Title Size', 'king-addons'); ?></label>
313 <input type="number" min="10" name="king_addons_age_gate_options[design][title_size]" value="<?php echo esc_attr($options['design']['title_size']); ?>" style="max-width: 100px;">
314 </div>
315 <div>
316 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Body Size', 'king-addons'); ?></label>
317 <input type="number" min="10" name="king_addons_age_gate_options[design][body_size]" value="<?php echo esc_attr($options['design']['body_size']); ?>" style="max-width: 100px;">
318 </div>
319 <div>
320 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Title Weight', 'king-addons'); ?></label>
321 <input type="number" min="100" step="100" name="king_addons_age_gate_options[design][title_weight]" value="<?php echo esc_attr($options['design']['title_weight']); ?>" style="max-width: 100px;">
322 </div>
323 <div>
324 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Body Weight', 'king-addons'); ?></label>
325 <input type="number" min="100" step="100" name="king_addons_age_gate_options[design][body_weight]" value="<?php echo esc_attr($options['design']['body_weight']); ?>" style="max-width: 100px;">
326 </div>
327 </div>
328 </div>
329 </div>
330 <div class="ka-row">
331 <div class="ka-row-label"><?php esc_html_e('Button Styles', 'king-addons'); ?></div>
332 <div class="ka-row-field">
333 <div class="ka-grid-2" style="gap: 16px;">
334 <div>
335 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Yes Text', 'king-addons'); ?></label>
336 <input type="color" name="king_addons_age_gate_options[design][button_yes_color]" value="<?php echo esc_attr($options['design']['button_yes_color']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
337 </div>
338 <div>
339 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Yes BG', 'king-addons'); ?></label>
340 <input type="color" name="king_addons_age_gate_options[design][button_yes_bg]" value="<?php echo esc_attr($options['design']['button_yes_bg']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
341 </div>
342 <div>
343 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('No Text', 'king-addons'); ?></label>
344 <input type="color" name="king_addons_age_gate_options[design][button_no_color]" value="<?php echo esc_attr($options['design']['button_no_color']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
345 </div>
346 <div>
347 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('No BG', 'king-addons'); ?></label>
348 <input type="color" name="king_addons_age_gate_options[design][button_no_bg]" value="<?php echo esc_attr($options['design']['button_no_bg']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
349 </div>
350 </div>
351 </div>
352 </div>
353 <?php if ($is_premium): ?>
354 <div class="ka-row">
355 <div class="ka-row-label"><?php esc_html_e('Hover Styles', 'king-addons'); ?></div>
356 <div class="ka-row-field">
357 <div class="ka-grid-2" style="gap: 16px;">
358 <div>
359 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Yes Hover BG', 'king-addons'); ?></label>
360 <input type="color" name="king_addons_age_gate_options[design][button_yes_hover_bg]" value="<?php echo esc_attr($options['design']['button_yes_hover_bg']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
361 </div>
362 <div>
363 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Yes Hover Text', 'king-addons'); ?></label>
364 <input type="color" name="king_addons_age_gate_options[design][button_yes_hover_color]" value="<?php echo esc_attr($options['design']['button_yes_hover_color']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
365 </div>
366 <div>
367 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('No Hover BG', 'king-addons'); ?></label>
368 <input type="color" name="king_addons_age_gate_options[design][button_no_hover_bg]" value="<?php echo esc_attr($options['design']['button_no_hover_bg']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
369 </div>
370 <div>
371 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('No Hover Text', 'king-addons'); ?></label>
372 <input type="color" name="king_addons_age_gate_options[design][button_no_hover_color]" value="<?php echo esc_attr($options['design']['button_no_hover_color']); ?>" style="width: 60px; height: 40px; padding: 2px; border: 1px solid rgba(0,0,0,0.1); border-radius: 8px;">
373 </div>
374 </div>
375 </div>
376 </div>
377 <div class="ka-row">
378 <div class="ka-row-label"><?php esc_html_e('Animation', 'king-addons'); ?></div>
379 <div class="ka-row-field">
380 <select name="king_addons_age_gate_options[design][animation]">
381 <option value="none" <?php selected($options['design']['animation'], 'none'); ?>><?php esc_html_e('None', 'king-addons'); ?></option>
382 <option value="fade" <?php selected($options['design']['animation'], 'fade'); ?>><?php esc_html_e('Fade', 'king-addons'); ?></option>
383 <option value="slide-up" <?php selected($options['design']['animation'], 'slide-up'); ?>><?php esc_html_e('Slide up', 'king-addons'); ?></option>
384 <option value="zoom" <?php selected($options['design']['animation'], 'zoom'); ?>><?php esc_html_e('Zoom', 'king-addons'); ?></option>
385 </select>
386 </div>
387 </div>
388 <div class="ka-row">
389 <div class="ka-row-label"><?php esc_html_e('Elementor Template', 'king-addons'); ?></div>
390 <div class="ka-row-field">
391 <select name="king_addons_age_gate_options[design][elementor_template]">
392 <option value="0"><?php esc_html_e('— None —', 'king-addons'); ?></option>
393 <?php foreach ($elementor_templates as $tmpl): ?>
394 <option value="<?php echo esc_attr($tmpl->ID); ?>" <?php selected((int)$options['design']['elementor_template'], (int)$tmpl->ID); ?>>
395 <?php echo esc_html($tmpl->post_title); ?>
396 </option>
397 <?php endforeach; ?>
398 </select>
399 </div>
400 </div>
401 <div class="ka-row">
402 <div class="ka-row-label"><?php esc_html_e('Brand Assets', 'king-addons'); ?></div>
403 <div class="ka-row-field">
404 <input type="url" name="king_addons_age_gate_options[design][logo]" value="<?php echo esc_attr($options['design']['logo']); ?>" placeholder="<?php esc_attr_e('Logo URL', 'king-addons'); ?>" style="margin-bottom: 12px;">
405 <input type="url" name="king_addons_age_gate_options[design][background_image]" value="<?php echo esc_attr($options['design']['background_image']); ?>" placeholder="<?php esc_attr_e('Background image URL', 'king-addons'); ?>">
406 </div>
407 </div>
408 <?php endif; ?>
409 </div>
410 </div>
411 </div>
412
413 <!-- Behaviour Tab -->
414 <div class="ka-tab-content" data-tab="behaviour">
415 <div class="ka-card">
416 <div class="ka-card-header">
417 <span class="dashicons dashicons-controls-play"></span>
418 <h2><?php esc_html_e('Behaviour Settings', 'king-addons'); ?></h2>
419 </div>
420 <div class="ka-card-body">
421 <div class="ka-row">
422 <div class="ka-row-label"><?php esc_html_e('On Denial', 'king-addons'); ?></div>
423 <div class="ka-row-field">
424 <select name="king_addons_age_gate_options[behaviour][deny_action]">
425 <option value="redirect" <?php selected($options['behaviour']['deny_action'], 'redirect'); ?>><?php esc_html_e('Redirect to page', 'king-addons'); ?></option>
426 <option value="block" <?php selected($options['behaviour']['deny_action'], 'block'); ?>><?php esc_html_e('Show blocked message', 'king-addons'); ?></option>
427 </select>
428 </div>
429 </div>
430 <div class="ka-row">
431 <div class="ka-row-label"><?php esc_html_e('Redirect Page', 'king-addons'); ?></div>
432 <div class="ka-row-field">
433 <select name="king_addons_age_gate_options[behaviour][deny_redirect_page]">
434 <option value="0"><?php esc_html_e('— Select page —', 'king-addons'); ?></option>
435 <?php foreach ($page_options as $id => $title): ?>
436 <option value="<?php echo esc_attr($id); ?>" <?php selected((int)$options['behaviour']['deny_redirect_page'], (int)$id); ?>>
437 <?php echo esc_html($title); ?>
438 </option>
439 <?php endforeach; ?>
440 </select>
441 </div>
442 </div>
443 <div class="ka-row">
444 <div class="ka-row-label"><?php esc_html_e('Block Message', 'king-addons'); ?></div>
445 <div class="ka-row-field">
446 <input type="text" name="king_addons_age_gate_options[behaviour][block_message]" value="<?php echo esc_attr($options['behaviour']['block_message']); ?>">
447 </div>
448 </div>
449 <div class="ka-row">
450 <div class="ka-row-label"><?php esc_html_e('Reset on Change', 'king-addons'); ?></div>
451 <div class="ka-row-field">
452 <label class="ka-toggle">
453 <input type="checkbox" name="king_addons_age_gate_options[behaviour][reset_on_rule_change]" value="1" <?php checked(!empty($options['behaviour']['reset_on_rule_change'])); ?>>
454 <span class="ka-toggle-slider"></span>
455 <span class="ka-toggle-label"><?php esc_html_e('Invalidate decisions on save', 'king-addons'); ?></span>
456 </label>
457 </div>
458 </div>
459 <?php if ($is_premium): ?>
460 <div class="ka-row">
461 <div class="ka-row-label"><?php esc_html_e('Repeat Prompt', 'king-addons'); ?></div>
462 <div class="ka-row-field">
463 <select name="king_addons_age_gate_options[behaviour][repeat_mode]">
464 <option value="days" <?php selected($options['behaviour']['repeat_mode'], 'days'); ?>><?php esc_html_e('Remember N days', 'king-addons'); ?></option>
465 <option value="session" <?php selected($options['behaviour']['repeat_mode'], 'session'); ?>><?php esc_html_e('Every session', 'king-addons'); ?></option>
466 <option value="once" <?php selected($options['behaviour']['repeat_mode'], 'once'); ?>><?php esc_html_e('Forever', 'king-addons'); ?></option>
467 </select>
468 </div>
469 </div>
470 <div class="ka-row">
471 <div class="ka-row-label"><?php esc_html_e('Consent Checkbox', 'king-addons'); ?></div>
472 <div class="ka-row-field">
473 <label class="ka-toggle">
474 <input type="checkbox" name="king_addons_age_gate_options[behaviour][consent_checkbox]" value="1" <?php checked(!empty($options['behaviour']['consent_checkbox'])); ?>>
475 <span class="ka-toggle-slider"></span>
476 <span class="ka-toggle-label"><?php esc_html_e('Require consent checkbox', 'king-addons'); ?></span>
477 </label>
478 </div>
479 </div>
480 <?php endif; ?>
481 </div>
482 </div>
483 </div>
484
485 <!-- Pro Tab -->
486 <div class="ka-tab-content" data-tab="pro">
487 <?php if (!$is_premium): ?>
488 <div class="ka-pro-notice">
489 <h2><?php esc_html_e('Pro Features', 'king-addons'); ?></h2>
490 <p><?php esc_html_e('Upgrade to Pro for DOB validation, geo rules, and advanced features.', 'king-addons'); ?></p>
491 <a href="https://kingaddons.com/pricing/" target="_blank" class="ka-btn ka-btn-pink"><?php esc_html_e('Upgrade Now', 'king-addons'); ?></a>
492 </div>
493 <?php else: ?>
494 <div class="ka-card">
495 <div class="ka-card-header">
496 <span class="dashicons dashicons-calendar-alt"></span>
497 <h2><?php esc_html_e('Date of Birth Validation', 'king-addons'); ?></h2>
498 </div>
499 <div class="ka-card-body">
500 <div class="ka-row">
501 <div class="ka-row-label"><?php esc_html_e('Date Format', 'king-addons'); ?></div>
502 <div class="ka-row-field">
503 <select name="king_addons_age_gate_options[dob][format]">
504 <option value="dmy" <?php selected($options['dob']['format'], 'dmy'); ?>>DD/MM/YYYY</option>
505 <option value="mdy" <?php selected($options['dob']['format'], 'mdy'); ?>>MM/DD/YYYY</option>
506 <option value="ymd" <?php selected($options['dob']['format'], 'ymd'); ?>>YYYY/MM/DD</option>
507 </select>
508 </div>
509 </div>
510 <div class="ka-row">
511 <div class="ka-row-label"><?php esc_html_e('Max Age', 'king-addons'); ?></div>
512 <div class="ka-row-field">
513 <input type="number" min="10" name="king_addons_age_gate_options[dob][max_age]" value="<?php echo esc_attr($options['dob']['max_age']); ?>" style="max-width: 100px;">
514 </div>
515 </div>
516 <div class="ka-row">
517 <div class="ka-row-label"><?php esc_html_e('Error Messages', 'king-addons'); ?></div>
518 <div class="ka-row-field">
519 <input type="text" name="king_addons_age_gate_options[dob][error_invalid]" value="<?php echo esc_attr($options['dob']['error_invalid']); ?>" placeholder="<?php esc_attr_e('Invalid date message', 'king-addons'); ?>" style="margin-bottom: 12px;">
520 <input type="text" name="king_addons_age_gate_options[dob][error_denied]" value="<?php echo esc_attr($options['dob']['error_denied']); ?>" placeholder="<?php esc_attr_e('Under age message', 'king-addons'); ?>">
521 </div>
522 </div>
523 </div>
524 </div>
525 <div class="ka-card">
526 <div class="ka-card-header">
527 <span class="dashicons dashicons-admin-site"></span>
528 <h2><?php esc_html_e('Geo Rules', 'king-addons'); ?></h2>
529 </div>
530 <div class="ka-card-body">
531 <div class="ka-row">
532 <div class="ka-row-label"><?php esc_html_e('Enable', 'king-addons'); ?></div>
533 <div class="ka-row-field">
534 <label class="ka-toggle">
535 <input type="checkbox" name="king_addons_age_gate_options[geo][enabled]" value="1" <?php checked(!empty($options['geo']['enabled'])); ?>>
536 <span class="ka-toggle-slider"></span>
537 <span class="ka-toggle-label"><?php esc_html_e('Country-based minimum age', 'king-addons'); ?></span>
538 </label>
539 </div>
540 </div>
541 <div class="ka-row">
542 <div class="ka-row-label"><?php esc_html_e('Default Age', 'king-addons'); ?></div>
543 <div class="ka-row-field">
544 <input type="number" min="0" name="king_addons_age_gate_options[geo][default_age]" value="<?php echo esc_attr($options['geo']['default_age']); ?>" style="max-width: 100px;">
545 </div>
546 </div>
547 <div class="ka-row">
548 <div class="ka-row-label"><?php esc_html_e('Country Map', 'king-addons'); ?></div>
549 <div class="ka-row-field">
550 <textarea name="king_addons_age_gate_options[geo][map]" rows="5" placeholder="US=21&#10;UK=18&#10;DE=16" style="max-width: 300px;"><?php
551 foreach ($options['geo']['map'] as $code => $age) {
552 echo esc_html($code . '=' . $age . "\n");
553 }
554 ?></textarea>
555 <p class="ka-row-desc"><?php esc_html_e('One per line: CODE=AGE', 'king-addons'); ?></p>
556 </div>
557 </div>
558 </div>
559 </div>
560 <?php endif; ?>
561 </div>
562
563 <!-- Submit -->
564 <div class="ka-card">
565 <div class="ka-submit">
566 <button type="submit" class="ka-btn ka-btn-primary"><?php esc_html_e('Save Settings', 'king-addons'); ?></button>
567 </div>
568 </div>
569 </form>
570 </div>
571
572 <script>
573 (function($) {
574 'use strict';
575
576 // Tab navigation
577 const tabs = document.querySelectorAll('.ka-tab');
578 const contents = document.querySelectorAll('.ka-tab-content');
579
580 tabs.forEach(tab => {
581 tab.addEventListener('click', function(e) {
582 e.preventDefault();
583 const target = this.dataset.tab;
584 tabs.forEach(t => t.classList.remove('active'));
585 contents.forEach(c => c.classList.remove('active'));
586 this.classList.add('active');
587 document.querySelector(`.ka-tab-content[data-tab="${target}"]`).classList.add('active');
588 });
589 });
590 })(jQuery);
591
592 // Theme segmented control (dashboard-style)
593 (function() {
594 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
595 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
596 const segment = document.getElementById('ka-v3-theme-segment');
597 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
598 let mode = (segment && segment.getAttribute('data-active') ? segment.getAttribute('data-active') : 'dark').toString();
599 let mqlHandler = null;
600
601 function saveUISetting(key, value) {
602 const body = new URLSearchParams();
603 body.set('action', 'king_addons_save_dashboard_ui');
604 body.set('nonce', nonce);
605 body.set('key', key);
606 body.set('value', value);
607 fetch(ajaxUrl, {
608 method: 'POST',
609 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
610 body: body.toString()
611 });
612 }
613
614 function updateSegment(activeMode) {
615 if (!segment) {
616 return;
617 }
618 segment.setAttribute('data-active', activeMode);
619 segment.querySelectorAll('.ka-v3-segmented-btn').forEach((btn) => {
620 const theme = btn.getAttribute('data-theme');
621 btn.setAttribute('aria-pressed', theme === activeMode ? 'true' : 'false');
622 });
623 }
624
625 function applyTheme(isDark) {
626 document.body.classList.toggle('ka-v3-dark', isDark);
627 document.documentElement.classList.toggle('ka-v3-dark', isDark);
628 }
629
630 function setThemeMode(nextMode, save) {
631 mode = nextMode;
632 updateSegment(nextMode);
633
634 if (mqlHandler && mql) {
635 if (mql.removeEventListener) {
636 mql.removeEventListener('change', mqlHandler);
637 } else if (mql.removeListener) {
638 mql.removeListener(mqlHandler);
639 }
640 mqlHandler = null;
641 }
642
643 if (nextMode === 'auto') {
644 applyTheme(!!(mql && mql.matches));
645 mqlHandler = (e) => {
646 if (mode !== 'auto') {
647 return;
648 }
649 applyTheme(!!e.matches);
650 };
651 if (mql) {
652 if (mql.addEventListener) {
653 mql.addEventListener('change', mqlHandler);
654 } else if (mql.addListener) {
655 mql.addListener(mqlHandler);
656 }
657 }
658 } else {
659 applyTheme(nextMode === 'dark');
660 }
661
662 if (save) {
663 saveUISetting('theme_mode', nextMode);
664 }
665 }
666
667 window.kaV3ToggleDark = function() {
668 const isDark = document.body.classList.contains('ka-v3-dark');
669 setThemeMode(isDark ? 'light' : 'dark', true);
670 };
671
672 if (segment) {
673 segment.addEventListener('click', function(e) {
674 const btn = e.target.closest('.ka-v3-segmented-btn');
675 if (!btn) return;
676 e.preventDefault();
677 setThemeMode((btn.getAttribute('data-theme') || 'dark').toString(), true);
678 });
679 }
680
681 if (segment) {
682 setThemeMode(mode, false);
683 }
684 })();
685 </script>
686