PluginProbe
404 Solution / 4.3.3
404 Solution v4.3.3
4.3.5 4.3.4 4.3.3 4.3.2 4.3.1 4.3.0 4.2.0 4.1.19 4.1.18 4.1.17 4.1.16 4.1.15 4.1.13 4.1.12 4.1.11 4.1.10 4.1.9 4.1.8 4.1.7 4.1.6 4.1.5 4.1.4 4.1.3 trunk 2.30.0 All 109 releases
404-solution / includes / html / adminThemes.css

adminThemes.css in 404 Solution 4.3.3, at includes/html/adminThemes.css

1,155 lines 41.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * 404 Solution Admin Theme Styles
3 *
4 * This file defines the theme system for the admin pages.
5 * Themes are applied via the data-theme attribute on the body element.
6 *
7 * Available themes:
8 * - default: Default WordPress styling - no custom theme applied
9 * - mono: Monochrome Minimal (Light) - Grayscale with blue accents
10 * - calm: Calm Ops (Light) - Balanced blues and greens
11 * - neon: Neon Slate (Dark) - Dark with violet and cyan accents
12 * - obsidian: Obsidian Blue (Dark) - Deep blue dark theme
13 *
14 * Note: The "default" theme does not set a data-theme attribute,
15 * allowing WordPress to use its default admin styling.
16 */
17
18 /* ===== Default Theme: Monochrome Minimal (Light) =====
19 *
20 * Host-theme adaptability: the default branch (no data-theme attribute, or
21 * data-theme="mono") layers WP core admin CSS variables UNDER neutral hex
22 * fallbacks. Where WordPress core exposes a semantic var for a role
23 * (currently only the admin-theme accent family), the abj404 var falls
24 * through to it so host admin-theme plugins (WP Dark Mode, Material Admin,
25 * the user's chosen WP admin color scheme, etc.) can recolor the plugin
26 * without overriding our rules.
27 *
28 * Roles with no WP-core counterpart (surface, text, border, row-hover, etc.)
29 * keep a neutral hex. Host plugins can still recolor those by retargeting
30 * the --abj404-* variable directly. The rules below assume nothing about
31 * how each color relates to any other.
32 *
33 * Other theme branches (calm/neon/obsidian) are intentional themed palettes
34 * and keep their explicit hex values unchanged.
35 */
36 :root,
37 html:not([data-theme]),
38 html:not([data-theme]) body,
39 html[data-theme="mono"],
40 body[data-theme="mono"] {
41 /* Surfaces and text: no WP-core admin var exists for these roles; keep
42 neutrals so a host theme can override by retargeting --abj404-*. */
43 --abj404-bg: #F8FAFC;
44 --abj404-bg-muted: #F5F7FA;
45 --abj404-surface: #ffffff;
46 --abj404-surface-hover: #F6F7F7;
47 --abj404-surface-muted: #F1F5F9;
48 --abj404-text: #111827;
49 --abj404-text-muted: #6B7280;
50 --abj404-border: #E5E7EB;
51
52 /* Neutral primary (used for button-primary fill, autocomplete active row).
53 No WP-core neutral var exists; #374151 is a quiet slate that reads as
54 "WordPress-ish" without competing with the user's admin color scheme. */
55 --abj404-primary: #374151;
56
57 /* Accent / link / focus: route through WP's admin-theme color so the
58 plugin follows whatever admin color scheme the user has selected
59 (Profile, Admin Color Scheme) or whatever a host theme plugin sets. */
60 --abj404-accent: var(--wp-admin-theme-color, #2271b1);
61 --abj404-link: var(--wp-admin-theme-color, #2271b1);
62 --abj404-focus: var(--wp-admin-theme-color, #2271b1);
63
64 /* Status colors: WP core has no semantic vars for info/success/warning/
65 danger in the admin (notice borders are hardcoded). Keep neutrals; host
66 themes can override --abj404-* directly. */
67 --abj404-info: #3B82F6;
68 --abj404-success: #10B981;
69 --abj404-warning: #F59E0B;
70 --abj404-danger: #EF4444;
71
72 /* Table chrome and badges: no WP-core counterpart; keep neutrals. */
73 --abj404-table-header: #F1F5F9;
74 --abj404-row-hover: #F5F7FA;
75 --abj404-row-selected: #DBEAFE;
76 --abj404-badge-bg: #EFF1F5;
77 --abj404-badge-text: #374151;
78
79 /* Derived / aliased semantic vars used by 404solutionStyles.css. Aliasing
80 here means a host theme that retargets the base var (e.g. --abj404-surface)
81 automatically recolors everything that depends on it. */
82 --abj404-accent-hover: var(--wp-admin-theme-color-darker-10, #135e96);
83 --abj404-on-accent: #ffffff;
84 --abj404-bg-hover: var(--abj404-surface-hover);
85 --abj404-bg-subtle: var(--abj404-bg-muted);
86 --abj404-border-light: var(--abj404-border);
87 --abj404-card-bg: var(--abj404-surface);
88 --abj404-card-header-hover: var(--abj404-surface-hover);
89 --abj404-input-bg: var(--abj404-surface);
90 --abj404-surface-alt: var(--abj404-surface-muted);
91 --abj404-text-secondary: var(--abj404-text-muted);
92 --abj404-link-hover: var(--abj404-accent);
93
94 /* Status surface families (notice / pill backgrounds). Neutrals; host themes
95 can retarget. Other theme branches inherit unless they override. */
96 --abj404-success-bg: #D4EDDA;
97 --abj404-success-border: #C3E6CB;
98 --abj404-success-text: #155724;
99 --abj404-info-bg: #F0F6FC;
100 --abj404-info-border: #C3E1FF;
101 --abj404-info-text: #0C5A99;
102 --abj404-warning-bg: #FFF8E5;
103 --abj404-warning-border: #F0B429;
104 --abj404-warning-text: #614200;
105 --abj404-danger-bg: #FCF0F1;
106 --abj404-danger-border: #D63638;
107 --abj404-danger-text: #8A2424;
108
109 /* Shadows (elevation tokens). Translucent black layers safely composite
110 over any theme background. Dark themes can override below if needed. */
111 --abj404-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
112 --abj404-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.15);
113 --abj404-shadow-lg: 0 4px 20px rgba(0, 0, 0, 0.25);
114 --abj404-shadow-up: 0 -2px 8px rgba(0, 0, 0, 0.05);
115
116 /* Modal/overlay dim. */
117 --abj404-overlay-bg: rgba(0, 0, 0, 0.5);
118
119 /* Tooltip chrome. */
120 --abj404-tooltip-bg: #1D2327;
121 --abj404-tooltip-text: #FFFFFF;
122
123 /* Row striping for dark themes (no-op on light themes, transparent layer
124 over base row background). */
125 --abj404-row-stripe-soft: transparent;
126 --abj404-row-stripe-med: transparent;
127 --abj404-cell-stripe: transparent;
128
129 /* Legacy dark-mode hooks (body.abj404-dark-mode). These are overridden
130 by the dark-mode class below; default to inherit so light themes are
131 unaffected if the class is applied. */
132 --abj404-dark-text-soft: var(--abj404-text);
133 --abj404-dark-text-muted: var(--abj404-text-muted);
134 --abj404-dark-accent-border: var(--abj404-accent);
135 --abj404-dark-surface-deep: var(--abj404-surface);
136 --abj404-dark-border-deep: var(--abj404-border);
137
138 /* Captured-row danger highlight tints (lighter than the danger surface
139 used by notices). Used by tbody row backgrounds for broken
140 destinations. */
141 --abj404-danger-row-bg: #FFE7E7;
142 --abj404-danger-row-bg-hover: #FFD8D8;
143 --abj404-danger-row-text: #A02222;
144
145 /* Captured-row zebra stripe (light theme). */
146 --abj404-row-stripe: #FAFAFA;
147 --abj404-row-stripe-hover: #F5F5F5;
148
149 /* Loading overlay scrim. Default: translucent white over light tables.
150 Dark themes override below. */
151 --abj404-loading-overlay-bg: rgba(255, 255, 255, 0.8);
152
153 /* Setup-wizard chrome. The wizard is rendered on first-run admin pages and
154 uses the legacy body.abj404-dark-mode hook for its dark variant. These
155 tokens carry the wizard's specific (non-semantic) palette so the rules in
156 setupWizardStyles.css stay literal-free; overrides live in the
157 body.abj404-dark-mode block below. */
158 --abj404-wizard-overlay-bg: rgba(255, 255, 255, 0.85);
159 --abj404-wizard-modal-bg: #ffffff;
160 --abj404-wizard-modal-border: #c3c4c7;
161 --abj404-wizard-modal-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
162 --abj404-wizard-header-bg: #2271b1;
163 --abj404-wizard-header-text: #ffffff;
164 --abj404-wizard-close-bg: rgba(255, 255, 255, 0.1);
165 --abj404-wizard-close-bg-hover: rgba(255, 255, 255, 0.2);
166 --abj404-wizard-close-border: rgba(255, 255, 255, 0.3);
167 --abj404-wizard-close-focus-outline: rgba(255, 255, 255, 0.5);
168 --abj404-wizard-intro-text: #50575e;
169 --abj404-wizard-heading-text: #1d2327;
170 --abj404-wizard-content-text: inherit;
171 --abj404-wizard-option-bg: #f6f7f7;
172 --abj404-wizard-option-bg-hover: #eef0f0;
173 --abj404-wizard-option-selected-bg: #e6f2ff;
174 --abj404-wizard-option-selected-border: #2271b1;
175 --abj404-wizard-focus-outline: #2271b1;
176 --abj404-wizard-accent: #2271b1;
177 --abj404-wizard-accent-hover: #135e96;
178 --abj404-wizard-label-text: #1d2327;
179 --abj404-wizard-desc-text: #646970;
180 --abj404-wizard-footer-bg: #f6f7f7;
181 --abj404-wizard-skip-bg: #f6f7f7;
182 --abj404-wizard-skip-border: #c3c4c7;
183 --abj404-wizard-skip-text: #50575e;
184 --abj404-wizard-skip-bg-hover: #f0f0f1;
185 --abj404-wizard-skip-border-hover: #8c8f94;
186 --abj404-wizard-skip-text-hover: #1d2327;
187 --abj404-wizard-loading-overlay-bg: rgba(255, 255, 255, 0.9);
188 --abj404-wizard-loading-text: #1d2327;
189 --abj404-wizard-toast-bg: #d63638;
190 --abj404-wizard-toast-text: #ffffff;
191 --abj404-wizard-toast-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
192 --abj404-wizard-spinner-track: #c3c4c7;
193 --abj404-wizard-spinner-head: #2271b1;
194 }
195
196 /* Dark-theme overrides for tokens added above. */
197 html[data-theme="neon"],
198 body[data-theme="neon"],
199 html[data-theme="obsidian"],
200 body[data-theme="obsidian"] {
201 --abj404-row-stripe-soft: rgba(255, 255, 255, 0.02);
202 --abj404-row-stripe-med: rgba(255, 255, 255, 0.05);
203 --abj404-cell-stripe: rgba(255, 255, 255, 0.03);
204 --abj404-row-stripe: rgba(255, 255, 255, 0.02);
205 --abj404-row-stripe-hover: rgba(255, 255, 255, 0.05);
206 --abj404-loading-overlay-bg: rgba(12, 15, 19, 0.8);
207 }
208
209 /* Legacy body.abj404-dark-mode hook (used by setup wizard etc). */
210 body.abj404-dark-mode {
211 --abj404-dark-text-soft: #B0B0B0;
212 --abj404-dark-text-muted: #A0A0A0;
213 --abj404-dark-accent-border: #5AA2FF;
214 --abj404-dark-surface-deep: #1A2332;
215 --abj404-dark-border-deep: #3D3D3D;
216
217 /* Setup-wizard dark variant. Overrides the wizard tokens defined in the
218 default branch; light values stay untouched when the dark-mode class
219 isn't present. */
220 --abj404-wizard-overlay-bg: rgba(0, 0, 0, 0.75);
221 --abj404-wizard-modal-bg: #1e1e1e;
222 --abj404-wizard-modal-border: #3d3d3d;
223 --abj404-wizard-intro-text: #b0b0b0;
224 --abj404-wizard-heading-text: #e0e0e0;
225 --abj404-wizard-content-text: #e0e0e0;
226 --abj404-wizard-option-bg: #2d2d2d;
227 --abj404-wizard-option-bg-hover: #3d3d3d;
228 --abj404-wizard-option-selected-bg: #1a3a5c;
229 --abj404-wizard-option-selected-border: #5aa2ff;
230 --abj404-wizard-focus-outline: #5aa2ff;
231 --abj404-wizard-accent: #5aa2ff;
232 --abj404-wizard-label-text: #e0e0e0;
233 --abj404-wizard-desc-text: #a0a0a0;
234 --abj404-wizard-footer-bg: #2d2d2d;
235 --abj404-wizard-skip-bg: #3d3d3d;
236 --abj404-wizard-skip-border: #505050;
237 --abj404-wizard-skip-text: #b0b0b0;
238 --abj404-wizard-skip-bg-hover: #4d4d4d;
239 --abj404-wizard-skip-border-hover: #606060;
240 --abj404-wizard-skip-text-hover: #e0e0e0;
241 --abj404-wizard-loading-overlay-bg: rgba(30, 30, 30, 0.9);
242 --abj404-wizard-loading-text: #e0e0e0;
243 --abj404-wizard-toast-bg: #dc3545;
244 --abj404-wizard-spinner-track: #505050;
245 --abj404-wizard-spinner-head: #5aa2ff;
246 }
247
248 /* ===== Host Dark-Mode Adaptation =====
249 *
250 * Detects host admin-theme plugins that flip WordPress admin to dark mode.
251 * WP Dark Mode plugin signals via `html.wp-dark-mode-active` and
252 * `html[data-darkmode-scheme="dark"]`. When the host has gone dark and the
253 * user has NOT explicitly selected one of our themed palettes, remap the
254 * base abj404 vars to dark equivalents. Everything downstream consumes the
255 * vars, so all surfaces follow.
256 *
257 * Scoped with `:not([data-theme])` so intentional plugin themes
258 * (mono/calm/neon/obsidian) win over host detection. A user who explicitly
259 * picked "Calm Ops" keeps Calm Ops even when the host enables dark mode.
260 */
261 html.wp-dark-mode-active:not([data-theme]),
262 html.wp-dark-mode-active:not([data-theme]) body:not([data-theme]),
263 html[data-darkmode-scheme="dark"]:not([data-theme]),
264 html[data-darkmode-scheme="dark"]:not([data-theme]) body:not([data-theme]) {
265 --abj404-bg: #0E1421;
266 --abj404-bg-muted: #131A28;
267 --abj404-surface: #1A2233;
268 --abj404-surface-hover: #222B40;
269 --abj404-surface-muted: #1F2738;
270 --abj404-text: #DCE3EF;
271 --abj404-text-muted: #B0BCD0;
272 --abj404-border: #2B3853;
273
274 --abj404-primary: #4F7CD6;
275 --abj404-accent: var(--wp-admin-theme-color, #5B8DEF);
276 --abj404-link: var(--wp-admin-theme-color, #8AB4FF);
277 --abj404-focus: #8AB4FF;
278 --abj404-accent-hover: var(--wp-admin-theme-color-darker-10, #3D6BCB);
279
280 --abj404-info: #5B8DEF;
281 --abj404-success: #3CC07B;
282 --abj404-warning: #F1A93B;
283 --abj404-danger: #EF6464;
284
285 --abj404-table-header: #1F2738;
286 --abj404-row-hover: #1A2233;
287 --abj404-row-selected: #1A2A46;
288 --abj404-badge-bg: #1F2738;
289 --abj404-badge-text: #D5DEF0;
290
291 /* Derived vars must be re-aliased: the default branch aliases point at
292 the light-mode values that were in scope when they were declared. */
293 --abj404-card-bg: var(--abj404-surface);
294 --abj404-card-header-hover: var(--abj404-surface-hover);
295 --abj404-input-bg: var(--abj404-surface);
296 --abj404-surface-alt: var(--abj404-surface-muted);
297 --abj404-text-secondary: var(--abj404-text-muted);
298 --abj404-bg-hover: var(--abj404-surface-hover);
299 --abj404-bg-subtle: var(--abj404-bg-muted);
300 --abj404-border-light: var(--abj404-border);
301 --abj404-link-hover: var(--abj404-accent);
302
303 /* Status families: keep readable on dark surfaces. */
304 --abj404-success-bg: #143626;
305 --abj404-success-border: #1F5236;
306 --abj404-success-text: #A8E8C2;
307 --abj404-info-bg: #15243C;
308 --abj404-info-border: #29456E;
309 --abj404-info-text: #B8D2F4;
310 --abj404-warning-bg: #3B2D10;
311 --abj404-warning-border: #6D4E18;
312 --abj404-warning-text: #F5D38F;
313 --abj404-danger-bg: #3B1A1B;
314 --abj404-danger-border: #6D2C2E;
315 --abj404-danger-text: #F4B8B9;
316
317 /* Row striping over dark surfaces. */
318 --abj404-row-stripe-soft: rgba(255, 255, 255, 0.02);
319 --abj404-row-stripe-med: rgba(255, 255, 255, 0.05);
320 --abj404-cell-stripe: rgba(255, 255, 255, 0.03);
321 --abj404-row-stripe: rgba(255, 255, 255, 0.02);
322 --abj404-row-stripe-hover: rgba(255, 255, 255, 0.05);
323
324 /* Loading overlay scrim. Dark scrim over dark tables. */
325 --abj404-loading-overlay-bg: rgba(12, 15, 19, 0.8);
326
327 /* Captured-row danger tint (subtle red wash over dark surface). */
328 --abj404-danger-row-bg: #3A1A1B;
329 --abj404-danger-row-bg-hover: #4A2122;
330 --abj404-danger-row-text: #F4B8B9;
331 }
332
333 /* Apply the same card/header treatment to host-dark-mode that the explicit
334 data-theme branch gets, so .abj404-card flips off white without depending
335 on darkmode.js inversion. */
336 html.wp-dark-mode-active:not([data-theme]) body .abj404-card,
337 html[data-darkmode-scheme="dark"]:not([data-theme]) body .abj404-card {
338 background: var(--abj404-surface) !important;
339 border-color: var(--abj404-border) !important;
340 }
341
342 html.wp-dark-mode-active:not([data-theme]) body .abj404-card-header,
343 html[data-darkmode-scheme="dark"]:not([data-theme]) body .abj404-card-header {
344 border-bottom-color: var(--abj404-border) !important;
345 }
346
347 html.wp-dark-mode-active:not([data-theme]) body .abj404-card-header:hover,
348 html[data-darkmode-scheme="dark"]:not([data-theme]) body .abj404-card-header:hover {
349 background: var(--abj404-surface-hover) !important;
350 }
351
352 html.wp-dark-mode-active:not([data-theme]) body .abj404-card-title,
353 html[data-darkmode-scheme="dark"]:not([data-theme]) body .abj404-card-title,
354 html.wp-dark-mode-active:not([data-theme]) body .abj404-card-content,
355 html[data-darkmode-scheme="dark"]:not([data-theme]) body .abj404-card-content {
356 color: var(--abj404-text) !important;
357 }
358
359 /* === Calm Ops (Light) === */
360 html[data-theme="calm"],
361 body[data-theme="calm"] {
362 --abj404-bg: #F7FAFD;
363 --abj404-bg-muted: #F1F6FE;
364 --abj404-surface: #ffffff;
365 --abj404-surface-hover: #F1F6FE; /* Light blue-gray for hover */
366 --abj404-surface-muted: #E9F0FB;
367 --abj404-text: #17223B;
368 --abj404-text-muted: #5A6B86;
369 --abj404-border: #E1E8F5;
370 --abj404-primary: #1E6BD6;
371 --abj404-accent: #00A27A;
372 --abj404-info: #2B8AE2;
373 --abj404-success: #20B67A;
374 --abj404-warning: #F6A700;
375 --abj404-danger: #D53F3F;
376 --abj404-focus: #5AA2FF;
377 --abj404-table-header: #E9F0FB;
378 --abj404-row-hover: #F1F6FE;
379 --abj404-row-selected: #D7E8FF;
380 --abj404-badge-bg: #EEF2F8;
381 --abj404-badge-text: #3E546E;
382 --abj404-link: var(--abj404-accent);
383 }
384
385 /* === Neon Slate (Dark) === */
386 html[data-theme="neon"],
387 body[data-theme="neon"] {
388 --abj404-bg: #0C0F13;
389 --abj404-bg-muted: #11151A;
390 --abj404-surface: #151A21;
391 --abj404-surface-hover: #1B222B; /* Slightly lighter than surface for hover */
392 --abj404-surface-muted: #1B222B;
393 --abj404-text: #DDE3EB; /* Reduced from #E5EAF2 to prevent halation */
394 --abj404-text-muted: #B4BFD0; /* Improved from #A6B0C3 for better contrast */
395 --abj404-border: #273141;
396 --abj404-primary: #7C3AED;
397 --abj404-accent: #22D3EE;
398 --abj404-info: #60A5FA;
399 --abj404-success: #34D399;
400 --abj404-warning: #F59E0B;
401 --abj404-danger: #F87171;
402 --abj404-focus: #38BDF8;
403 --abj404-table-header: #1F2732;
404 --abj404-row-hover: #192028;
405 --abj404-row-selected: #0E2936;
406 --abj404-badge-bg: #202734;
407 --abj404-badge-text: #D0D8E6; /* Reduced from #CFD8E6 for consistency */
408 --abj404-link: var(--abj404-accent);
409 --abj404-button-bg: #3D4A5C; /* Much brighter than surface for clear button visibility */
410 --abj404-button-border: #5A6B7F; /* Bright border for definition */
411 --abj404-button-hover-bg: #4A5A6E; /* Lighter hover state */
412 --abj404-button-text: #E8EDF3; /* Slightly brighter text for buttons */
413 }
414
415 /* === Obsidian Blue (Dark) === */
416 html[data-theme="obsidian"],
417 body[data-theme="obsidian"] {
418 --abj404-bg: #0A0F1A;
419 --abj404-bg-muted: #0E1522;
420 --abj404-surface: #121826;
421 --abj404-surface-hover: #172032; /* Slightly lighter than surface for hover */
422 --abj404-surface-muted: #172032;
423 --abj404-text: #DEE5F0; /* Reduced from #E6ECF7 to prevent halation */
424 --abj404-text-muted: #B8C4D8; /* Improved from #A9B7CC for better contrast */
425 --abj404-border: #223149;
426 --abj404-primary: #1D4ED8;
427 --abj404-accent: #A78BFA;
428 --abj404-info: #60A5FA;
429 --abj404-success: #22C55E;
430 --abj404-warning: #F59E0B;
431 --abj404-danger: #EF4444;
432 --abj404-focus: #93C5FD;
433 --abj404-table-header: #1B253A;
434 --abj404-row-hover: #141C2C;
435 --abj404-row-selected: #1A2A46;
436 --abj404-badge-bg: #1A2438;
437 --abj404-badge-text: #D5DEF0; /* Reduced from #DCE6F7 for consistency */
438 --abj404-link: #93C5FD;
439 --abj404-button-bg: #2D3F5C; /* Much brighter than surface for clear button visibility */
440 --abj404-button-border: #4A6085; /* Bright border for definition */
441 --abj404-button-hover-bg: #3A4F6E; /* Lighter hover state */
442 --abj404-button-text: #E8EFF7; /* Slightly brighter text for buttons */
443 }
444
445 /* ===== Mode Toggle Button Overrides ===== */
446 /* Exclude mode buttons from general button styles - they have their own distinct styling */
447 /* Non-active mode button - should look like a subtle link/tab */
448 html[data-theme] body.wp-admin .abj404-mode-btn:not(.active),
449 body[data-theme].wp-admin .abj404-mode-btn:not(.active),
450 html[data-theme] body .abj404-mode-btn:not(.active),
451 body[data-theme] .abj404-mode-btn:not(.active) {
452 background: transparent !important;
453 border: none !important;
454 box-shadow: none !important;
455 color: var(--abj404-text-muted) !important;
456 }
457
458 html[data-theme] body.wp-admin .abj404-mode-btn:not(.active):hover,
459 body[data-theme].wp-admin .abj404-mode-btn:not(.active):hover,
460 html[data-theme] body .abj404-mode-btn:not(.active):hover,
461 body[data-theme] .abj404-mode-btn:not(.active):hover {
462 background: var(--abj404-surface-muted) !important;
463 color: var(--abj404-text) !important;
464 transform: none !important;
465 }
466
467 /* Active mode button - should be prominent */
468 html[data-theme] body.wp-admin .abj404-mode-btn.active,
469 body[data-theme].wp-admin .abj404-mode-btn.active,
470 html[data-theme] body .abj404-mode-btn.active,
471 body[data-theme] .abj404-mode-btn.active {
472 background: var(--abj404-accent) !important;
473 border: none !important;
474 color: #fff !important;
475 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12) !important;
476 }
477
478 html[data-theme] body.wp-admin .abj404-mode-btn.active:hover,
479 body[data-theme].wp-admin .abj404-mode-btn.active:hover,
480 html[data-theme] body .abj404-mode-btn.active:hover,
481 body[data-theme] .abj404-mode-btn.active:hover {
482 opacity: 0.9 !important;
483 transform: none !important;
484 }
485
486 /* ===== Card Styling for Themes ===== */
487 /* Apply theme surface color to cards */
488 html[data-theme] body .abj404-card,
489 body[data-theme] .abj404-card {
490 background: var(--abj404-surface) !important;
491 border-color: var(--abj404-border) !important;
492 }
493
494 html[data-theme] body .abj404-card-header,
495 body[data-theme] .abj404-card-header {
496 border-bottom-color: var(--abj404-border) !important;
497 }
498
499 html[data-theme] body .abj404-card-header:hover,
500 body[data-theme] .abj404-card-header:hover {
501 background: var(--abj404-surface-hover) !important;
502 }
503
504 html[data-theme] body .abj404-card-title,
505 body[data-theme] .abj404-card-title {
506 color: var(--abj404-text) !important;
507 }
508
509 html[data-theme] body .abj404-card-content,
510 body[data-theme] .abj404-card-content {
511 color: var(--abj404-text) !important;
512 }
513
514 /* Filter-row link theming lives further down under the .subsubsub selectors;
515 no per-theme overrides are needed for the native pipe-separated layout. */
516
517 /* ===== Logs Table Layout Improvements ===== */
518 /* Better column distribution for logs table */
519 .abj404-logs-table {
520 table-layout: fixed !important;
521 width: 100%;
522 }
523
524 /* URL column - most important, give it good width */
525 .abj404-logs-table th:nth-child(1),
526 .abj404-logs-table td:nth-child(1) {
527 width: 22%;
528 word-break: break-all;
529 }
530
531 /* IP Address column - fixed width for consistent display */
532 .abj404-logs-table th:nth-child(2),
533 .abj404-logs-table td:nth-child(2) {
534 width: 15%;
535 white-space: nowrap;
536 }
537
538 /* Referrer column - constrain with ellipsis */
539 .abj404-logs-table th:nth-child(3),
540 .abj404-logs-table td:nth-child(3) {
541 width: 28%;
542 max-width: 0;
543 overflow: hidden;
544 text-overflow: ellipsis;
545 white-space: nowrap;
546 }
547
548 /* Action column */
549 .abj404-logs-table th:nth-child(4),
550 .abj404-logs-table td:nth-child(4) {
551 width: 18%;
552 }
553
554 /* Date column */
555 .abj404-logs-table th:nth-child(5),
556 .abj404-logs-table td:nth-child(5) {
557 width: 12%;
558 white-space: nowrap;
559 }
560
561 /* User column */
562 .abj404-logs-table th:nth-child(6),
563 .abj404-logs-table td:nth-child(6) {
564 width: 5%;
565 }
566
567 /* Referrer links - full width with ellipsis */
568 .abj404-logs-table td:nth-child(3) a {
569 display: block;
570 overflow: hidden;
571 text-overflow: ellipsis;
572 white-space: nowrap;
573 }
574
575 /* ===== Apply theme colors to WordPress admin elements ===== */
576 /* Using high specificity selectors to avoid !important */
577 /* Note: Selectors check both html[data-theme] and body[data-theme] */
578 /* to support early theme application before body element is ready */
579
580 /* Background colors for WordPress admin wrapper elements */
581 html[data-theme] body.wp-admin #wpcontent,
582 body[data-theme].wp-admin #wpcontent,
583 html[data-theme] body.wp-admin #wpbody,
584 body[data-theme].wp-admin #wpbody,
585 html[data-theme] body.wp-admin #wpbody-content,
586 body[data-theme].wp-admin #wpbody-content {
587 background-color: var(--abj404-bg);
588 }
589
590 /* Body background color */
591 html[data-theme] body.wp-admin,
592 body[data-theme].wp-admin {
593 background-color: var(--abj404-bg) !important;
594 }
595
596 /* Background colors */
597 html[data-theme] body .wrap,
598 body[data-theme] .wrap,
599 html[data-theme] body.wp-admin #wpwrap .wrap,
600 body[data-theme].wp-admin #wpwrap .wrap {
601 background-color: var(--abj404-bg);
602 color: var(--abj404-text);
603 }
604
605 /* Page headings (like "404 Solution Options") */
606 html[data-theme] body .wrap h1,
607 html[data-theme] body .wrap h2,
608 html[data-theme] body .wrap > h1,
609 html[data-theme] body .wrap > h2,
610 body[data-theme] .wrap h1,
611 body[data-theme] .wrap h2,
612 body[data-theme] .wrap > h1,
613 body[data-theme] .wrap > h2 {
614 color: var(--abj404-text);
615 }
616
617 /* Post boxes (the main content containers) */
618 html[data-theme] body .postbox,
619 html[data-theme] body .postbox-container .metabox-holder .postbox,
620 body[data-theme] .postbox,
621 body[data-theme] .postbox-container .metabox-holder .postbox {
622 background-color: var(--abj404-surface);
623 border-color: var(--abj404-border);
624 color: var(--abj404-text);
625 }
626
627 html[data-theme] body .postbox .inside,
628 body[data-theme] .postbox .inside {
629 background-color: var(--abj404-surface);
630 color: var(--abj404-text);
631 }
632
633 /* Postbox headers */
634 html[data-theme] body .postbox h2,
635 html[data-theme] body .postbox h3,
636 html[data-theme] body .postbox .hndle,
637 html[data-theme] body .hndle,
638 body[data-theme] .postbox h2,
639 body[data-theme] .postbox h3,
640 body[data-theme] .postbox .hndle,
641 body[data-theme] .hndle {
642 background-color: var(--abj404-surface-muted);
643 border-bottom-color: var(--abj404-border);
644 color: var(--abj404-text);
645 }
646
647 /* Tables */
648 body[data-theme] table.wp-list-table,
649 body[data-theme] .widefat {
650 background-color: var(--abj404-surface);
651 border-color: var(--abj404-border);
652 color: var(--abj404-text);
653 }
654
655 body[data-theme] table.wp-list-table thead th,
656 body[data-theme] .widefat thead th,
657 body[data-theme] table.wp-list-table tfoot th,
658 body[data-theme] .widefat tfoot th {
659 background-color: var(--abj404-table-header);
660 border-color: var(--abj404-border);
661 color: var(--abj404-text);
662 }
663
664 body[data-theme] table.wp-list-table tbody tr,
665 body[data-theme] .widefat tbody tr {
666 background-color: var(--abj404-surface);
667 border-color: var(--abj404-border);
668 }
669
670 body[data-theme] table.wp-list-table tbody tr:hover,
671 body[data-theme] .widefat tbody tr:hover {
672 background-color: var(--abj404-row-hover);
673 }
674
675 body[data-theme] table.wp-list-table tbody tr.selected,
676 body[data-theme] .widefat tbody tr.selected {
677 background-color: var(--abj404-row-selected);
678 }
679
680 body[data-theme] table.wp-list-table tbody td,
681 body[data-theme] .widefat tbody td {
682 border-color: var(--abj404-border);
683 color: var(--abj404-text);
684 }
685
686 /* Form elements */
687 html[data-theme] body.wp-admin input[type="text"],
688 html[data-theme] body.wp-admin input[type="number"],
689 html[data-theme] body.wp-admin input[type="email"],
690 html[data-theme] body.wp-admin input[type="password"],
691 html[data-theme] body.wp-admin input[type="search"],
692 html[data-theme] body.wp-admin textarea,
693 html[data-theme] body.wp-admin select,
694 body[data-theme].wp-admin input[type="text"],
695 body[data-theme].wp-admin input[type="number"],
696 body[data-theme].wp-admin input[type="email"],
697 body[data-theme].wp-admin input[type="password"],
698 body[data-theme].wp-admin input[type="search"],
699 body[data-theme].wp-admin textarea,
700 body[data-theme].wp-admin select,
701 html[data-theme] body input[type="text"],
702 html[data-theme] body input[type="number"],
703 html[data-theme] body input[type="email"],
704 html[data-theme] body input[type="password"],
705 html[data-theme] body input[type="search"],
706 html[data-theme] body textarea,
707 html[data-theme] body select,
708 body[data-theme] input[type="text"],
709 body[data-theme] input[type="number"],
710 body[data-theme] input[type="email"],
711 body[data-theme] input[type="password"],
712 body[data-theme] input[type="search"],
713 body[data-theme] textarea,
714 body[data-theme] select {
715 background-color: var(--abj404-surface) !important;
716 border-color: var(--abj404-border) !important;
717 color: var(--abj404-text) !important;
718 border-radius: 4px !important;
719 }
720
721 html[data-theme] body.wp-admin input[type="text"]:focus,
722 html[data-theme] body.wp-admin input[type="number"]:focus,
723 html[data-theme] body.wp-admin input[type="email"]:focus,
724 html[data-theme] body.wp-admin input[type="password"]:focus,
725 html[data-theme] body.wp-admin input[type="search"]:focus,
726 html[data-theme] body.wp-admin textarea:focus,
727 html[data-theme] body.wp-admin select:focus,
728 body[data-theme].wp-admin input[type="text"]:focus,
729 body[data-theme].wp-admin input[type="number"]:focus,
730 body[data-theme].wp-admin input[type="email"]:focus,
731 body[data-theme].wp-admin input[type="password"]:focus,
732 body[data-theme].wp-admin input[type="search"]:focus,
733 body[data-theme].wp-admin textarea:focus,
734 body[data-theme].wp-admin select:focus,
735 html[data-theme] body input[type="text"]:focus,
736 html[data-theme] body input[type="number"]:focus,
737 html[data-theme] body input[type="email"]:focus,
738 html[data-theme] body input[type="password"]:focus,
739 html[data-theme] body input[type="search"]:focus,
740 html[data-theme] body textarea:focus,
741 html[data-theme] body select:focus,
742 body[data-theme] input[type="text"]:focus,
743 body[data-theme] input[type="number"]:focus,
744 body[data-theme] input[type="email"]:focus,
745 body[data-theme] input[type="password"]:focus,
746 body[data-theme] input[type="search"]:focus,
747 body[data-theme] textarea:focus,
748 body[data-theme] select:focus {
749 border-color: var(--abj404-focus) !important;
750 outline-color: var(--abj404-focus) !important;
751 }
752
753 /* Select dropdown options */
754 html[data-theme] body.wp-admin select option,
755 body[data-theme].wp-admin select option,
756 html[data-theme] body select option,
757 body[data-theme] select option {
758 background-color: var(--abj404-surface) !important;
759 color: var(--abj404-text) !important;
760 }
761
762 /* jQuery UI Autocomplete dropdown */
763 html[data-theme] .ui-autocomplete,
764 body[data-theme] .ui-autocomplete,
765 html[data-theme] .ui-menu,
766 body[data-theme] .ui-menu {
767 background-color: var(--abj404-surface) !important;
768 border-color: var(--abj404-border) !important;
769 color: var(--abj404-text) !important;
770 }
771
772 html[data-theme] .ui-autocomplete .ui-menu-item,
773 body[data-theme] .ui-autocomplete .ui-menu-item,
774 html[data-theme] .ui-menu .ui-menu-item,
775 body[data-theme] .ui-menu .ui-menu-item {
776 background-color: var(--abj404-surface) !important;
777 color: var(--abj404-text) !important;
778 }
779
780 html[data-theme] .ui-autocomplete .ui-menu-item .ui-menu-item-wrapper,
781 body[data-theme] .ui-autocomplete .ui-menu-item .ui-menu-item-wrapper,
782 html[data-theme] .ui-menu .ui-menu-item .ui-menu-item-wrapper,
783 body[data-theme] .ui-menu .ui-menu-item .ui-menu-item-wrapper {
784 color: var(--abj404-text) !important;
785 }
786
787 html[data-theme] .ui-autocomplete .ui-menu-item:hover,
788 body[data-theme] .ui-autocomplete .ui-menu-item:hover,
789 html[data-theme] .ui-menu .ui-menu-item:hover,
790 body[data-theme] .ui-menu .ui-menu-item:hover,
791 html[data-theme] .ui-autocomplete .ui-state-active,
792 body[data-theme] .ui-autocomplete .ui-state-active,
793 html[data-theme] .ui-autocomplete .ui-state-focus,
794 body[data-theme] .ui-autocomplete .ui-state-focus {
795 background-color: var(--abj404-surface-muted) !important;
796 color: var(--abj404-text) !important;
797 border-color: var(--abj404-primary) !important;
798 }
799
800 html[data-theme] .ui-autocomplete .ui-menu-item-wrapper.ui-state-active,
801 body[data-theme] .ui-autocomplete .ui-menu-item-wrapper.ui-state-active {
802 background-color: var(--abj404-primary) !important;
803 color: #ffffff !important;
804 }
805
806 /* Autocomplete category headers */
807 html[data-theme] .ui-autocomplete-category,
808 body[data-theme] .ui-autocomplete-category {
809 background-color: var(--abj404-surface-muted) !important;
810 color: var(--abj404-text-muted) !important;
811 font-weight: bold;
812 padding: 4px 8px;
813 }
814
815 /* Buttons */
816 /* High specificity selectors to override WordPress defaults */
817 html[data-theme] body.wp-admin button,
818 html[data-theme] body.wp-admin input[type="button"],
819 html[data-theme] body.wp-admin input[type="submit"],
820 html[data-theme] body.wp-admin input[type="reset"],
821 body[data-theme].wp-admin button,
822 body[data-theme].wp-admin input[type="button"],
823 body[data-theme].wp-admin input[type="submit"],
824 body[data-theme].wp-admin input[type="reset"],
825 html[data-theme] body .button,
826 html[data-theme] body .button-secondary,
827 body[data-theme] .button,
828 body[data-theme] .button-secondary {
829 background-color: var(--abj404-button-bg, var(--abj404-surface)) !important;
830 border-color: var(--abj404-button-border, var(--abj404-border)) !important;
831 color: var(--abj404-button-text, var(--abj404-text)) !important;
832 border-radius: 8px !important;
833 border-style: solid !important;
834 border-width: 1px !important;
835 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3) !important;
836 }
837
838 html[data-theme] body.wp-admin button:hover,
839 html[data-theme] body.wp-admin input[type="button"]:hover,
840 html[data-theme] body.wp-admin input[type="submit"]:hover,
841 html[data-theme] body.wp-admin input[type="reset"]:hover,
842 body[data-theme].wp-admin button:hover,
843 body[data-theme].wp-admin input[type="button"]:hover,
844 body[data-theme].wp-admin input[type="submit"]:hover,
845 body[data-theme].wp-admin input[type="reset"]:hover,
846 html[data-theme] body .button:hover,
847 html[data-theme] body .button-secondary:hover,
848 body[data-theme] .button:hover,
849 body[data-theme] .button-secondary:hover {
850 background-color: var(--abj404-button-hover-bg, var(--abj404-surface-muted)) !important;
851 border-color: var(--abj404-primary) !important;
852 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 2px 5px rgba(0, 0, 0, 0.4) !important;
853 transform: translateY(-1px);
854 }
855
856 html[data-theme] body .button-primary,
857 body[data-theme] .button-primary,
858 html[data-theme] body input[type="submit"].button-primary,
859 body[data-theme] input[type="submit"].button-primary {
860 background-color: var(--abj404-primary) !important;
861 border-color: var(--abj404-primary) !important;
862 color: #ffffff !important;
863 border-radius: 8px !important;
864 }
865
866 html[data-theme] body .button-primary:hover,
867 body[data-theme] .button-primary:hover,
868 html[data-theme] body input[type="submit"].button-primary:hover,
869 body[data-theme] input[type="submit"].button-primary:hover {
870 opacity: 0.9;
871 }
872
873 /* Links */
874 body[data-theme] a {
875 color: var(--abj404-link);
876 }
877
878 body[data-theme] a:hover {
879 color: var(--abj404-accent);
880 }
881
882 /* Navigation tabs */
883 body[data-theme] .nav-tab-wrapper,
884 body[data-theme] .wrap .nav-tab-wrapper {
885 background-color: var(--abj404-bg);
886 border-bottom-color: var(--abj404-border);
887 }
888
889 body[data-theme] .nav-tab,
890 body[data-theme] a.nav-tab {
891 background-color: var(--abj404-surface);
892 border-color: var(--abj404-border);
893 color: var(--abj404-text);
894 }
895
896 body[data-theme] .nav-tab:hover,
897 body[data-theme] a.nav-tab:hover {
898 background-color: var(--abj404-surface-muted);
899 color: var(--abj404-text);
900 }
901
902 body[data-theme] .nav-tab-active,
903 body[data-theme] .nav-tab-active:hover,
904 body[data-theme] a.nav-tab-active,
905 body[data-theme] a.nav-tab-active:hover {
906 background-color: var(--abj404-bg);
907 border-bottom-color: var(--abj404-bg);
908 color: var(--abj404-text);
909 }
910
911 /* Filter navigation (All, Manual Redirects, etc.) */
912 html[data-theme] body.wp-admin .subsubsub a,
913 body[data-theme].wp-admin .subsubsub a,
914 html[data-theme] body .subsubsub a,
915 body[data-theme] .subsubsub a {
916 color: var(--abj404-link) !important;
917 }
918
919 html[data-theme] body.wp-admin .subsubsub a:hover,
920 body[data-theme].wp-admin .subsubsub a:hover,
921 html[data-theme] body .subsubsub a:hover,
922 body[data-theme] .subsubsub a:hover {
923 color: var(--abj404-link-hover) !important;
924 }
925
926 html[data-theme] body.wp-admin .subsubsub a.current,
927 body[data-theme].wp-admin .subsubsub a.current,
928 html[data-theme] body .subsubsub a.current,
929 body[data-theme] .subsubsub a.current {
930 color: var(--abj404-text) !important;
931 font-weight: 600;
932 }
933
934 /* Notices and messages */
935 body[data-theme] .notice,
936 body[data-theme] .updated,
937 body[data-theme] .error {
938 background-color: var(--abj404-surface);
939 border-left-color: var(--abj404-info);
940 color: var(--abj404-text);
941 }
942
943 body[data-theme] .notice.notice-success,
944 body[data-theme] .updated {
945 border-left-color: var(--abj404-success);
946 }
947
948 body[data-theme] .notice.notice-warning {
949 border-left-color: var(--abj404-warning);
950 }
951
952 body[data-theme] .notice.notice-error,
953 body[data-theme] .error {
954 border-left-color: var(--abj404-danger);
955 }
956
957 /* Pagination */
958 body[data-theme] .tablenav,
959 body[data-theme] .tablenav-pages {
960 background-color: var(--abj404-surface);
961 color: var(--abj404-text);
962 }
963
964 body[data-theme] .tablenav .tablenav-pages a {
965 background-color: var(--abj404-surface);
966 border-color: var(--abj404-border);
967 color: var(--abj404-link);
968 }
969
970 /* Muted text */
971 body[data-theme] .description,
972 body[data-theme] .form-text,
973 body[data-theme] p.description {
974 color: var(--abj404-text-muted);
975 }
976
977 /* File input styling */
978 html[data-theme] body.wp-admin input[type="file"],
979 body[data-theme].wp-admin input[type="file"],
980 html[data-theme] body input[type="file"],
981 body[data-theme] input[type="file"] {
982 background-color: var(--abj404-surface) !important;
983 border: 1px solid var(--abj404-border) !important;
984 border-radius: 8px !important;
985 color: var(--abj404-text) !important;
986 padding: 6px 12px !important;
987 }
988
989 html[data-theme] body.wp-admin input[type="file"]::-webkit-file-upload-button,
990 body[data-theme].wp-admin input[type="file"]::-webkit-file-upload-button,
991 html[data-theme] body input[type="file"]::-webkit-file-upload-button,
992 body[data-theme] input[type="file"]::-webkit-file-upload-button {
993 background-color: var(--abj404-surface-muted) !important;
994 border: 1px solid var(--abj404-border) !important;
995 border-radius: 6px !important;
996 color: var(--abj404-text) !important;
997 padding: 6px 12px !important;
998 margin-right: 12px !important;
999 cursor: pointer !important;
1000 }
1001
1002 html[data-theme] body.wp-admin input[type="file"]::-webkit-file-upload-button:hover,
1003 body[data-theme].wp-admin input[type="file"]::-webkit-file-upload-button:hover,
1004 html[data-theme] body input[type="file"]::-webkit-file-upload-button:hover,
1005 body[data-theme] input[type="file"]::-webkit-file-upload-button:hover {
1006 background-color: var(--abj404-primary) !important;
1007 border-color: var(--abj404-primary) !important;
1008 color: #ffffff !important;
1009 }
1010
1011 /* Chips navigation - preserve scroll spy functionality */
1012 /* Override general button styles for chips to maintain their distinct states */
1013 html[data-theme] body.wp-admin .abj404-chip,
1014 body[data-theme].wp-admin .abj404-chip,
1015 html[data-theme] body .abj404-chip,
1016 body[data-theme] .abj404-chip {
1017 background-color: var(--abj404-surface) !important;
1018 border-color: var(--abj404-border) !important;
1019 color: var(--abj404-text) !important;
1020 border-radius: 8px !important;
1021 opacity: 0.5;
1022 }
1023
1024 html[data-theme] body.wp-admin .abj404-chip:hover,
1025 body[data-theme].wp-admin .abj404-chip:hover,
1026 html[data-theme] body .abj404-chip:hover,
1027 body[data-theme] .abj404-chip:hover {
1028 background-color: var(--abj404-surface-muted) !important;
1029 border-color: var(--abj404-text-muted) !important;
1030 opacity: 0.7;
1031 }
1032
1033 /* Section visible (pressed/shown) */
1034 html[data-theme] body.wp-admin .abj404-chip[aria-pressed="true"],
1035 body[data-theme].wp-admin .abj404-chip[aria-pressed="true"],
1036 html[data-theme] body .abj404-chip[aria-pressed="true"],
1037 body[data-theme] .abj404-chip[aria-pressed="true"] {
1038 background-color: var(--abj404-bg-muted) !important;
1039 border-color: var(--abj404-accent) !important;
1040 box-shadow: inset 0 0 0 1px currentColor !important;
1041 opacity: 0.9;
1042 }
1043
1044 /* Section currently in viewport - Scroll Spy Active State */
1045 html[data-theme] body.wp-admin .abj404-chip.active,
1046 body[data-theme].wp-admin .abj404-chip.active,
1047 html[data-theme] body .abj404-chip.active,
1048 body[data-theme] .abj404-chip.active {
1049 background-color: var(--abj404-accent) !important;
1050 border-color: var(--abj404-accent) !important;
1051 color: #fff !important;
1052 font-weight: 600 !important;
1053 box-shadow: 0 2px 8px rgba(34, 113, 177, 0.3) !important;
1054 opacity: 1 !important;
1055 transform: scale(1.05) !important;
1056 }
1057
1058 html[data-theme] body.wp-admin .abj404-chip.active:hover,
1059 body[data-theme].wp-admin .abj404-chip.active:hover,
1060 html[data-theme] body .abj404-chip.active:hover,
1061 body[data-theme] .abj404-chip.active:hover {
1062 background-color: var(--abj404-accent) !important;
1063 box-shadow: 0 3px 12px rgba(34, 113, 177, 0.4) !important;
1064 }
1065
1066 /* Active chip - make dot brighter/white */
1067 html[data-theme] body.wp-admin .abj404-chip.active .abj404-chip-dot,
1068 body[data-theme].wp-admin .abj404-chip.active .abj404-chip-dot,
1069 html[data-theme] body .abj404-chip.active .abj404-chip-dot,
1070 body[data-theme] .abj404-chip.active .abj404-chip-dot {
1071 background: #fff !important;
1072 box-shadow: 0 0 6px rgba(255, 255, 255, 0.6) !important;
1073 }
1074
1075 /* Special styling for dark themes */
1076 body[data-theme="neon"] .postbox,
1077 body[data-theme="obsidian"] .postbox {
1078 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
1079 }
1080
1081 html[data-theme="neon"] input[type="checkbox"],
1082 html[data-theme="neon"] input[type="radio"],
1083 html[data-theme="obsidian"] input[type="checkbox"],
1084 html[data-theme="obsidian"] input[type="radio"] {
1085 filter: invert(1) hue-rotate(180deg);
1086 }
1087
1088 /* ===== Typography optimizations for dark themes ===== */
1089 /* Improve readability by adjusting font rendering and weights for dark backgrounds */
1090
1091 /* Font smoothing for crisper text rendering on dark backgrounds */
1092 body[data-theme="neon"],
1093 body[data-theme="obsidian"] {
1094 -webkit-font-smoothing: antialiased;
1095 -moz-osx-font-smoothing: grayscale;
1096 text-rendering: optimizeLegibility;
1097 }
1098
1099 /* Reduce font weight on dark backgrounds (text appears heavier on dark) */
1100 body[data-theme="neon"] .postbox,
1101 body[data-theme="neon"] .postbox .inside,
1102 body[data-theme="neon"] p,
1103 body[data-theme="neon"] td,
1104 body[data-theme="neon"] th,
1105 body[data-theme="neon"] label,
1106 body[data-theme="obsidian"] .postbox,
1107 body[data-theme="obsidian"] .postbox .inside,
1108 body[data-theme="obsidian"] p,
1109 body[data-theme="obsidian"] td,
1110 body[data-theme="obsidian"] th,
1111 body[data-theme="obsidian"] label {
1112 font-weight: 400;
1113 }
1114
1115 /* Adjust bold/strong elements to use medium weight instead of bold */
1116 body[data-theme="neon"] strong,
1117 body[data-theme="neon"] b,
1118 body[data-theme="neon"] .button-primary,
1119 body[data-theme="obsidian"] strong,
1120 body[data-theme="obsidian"] b,
1121 body[data-theme="obsidian"] .button-primary {
1122 font-weight: 500;
1123 }
1124
1125 /* Increase line height for better readability in body text */
1126 body[data-theme="neon"] .postbox .inside,
1127 body[data-theme="neon"] .form-text,
1128 body[data-theme="neon"] .description,
1129 body[data-theme="neon"] p.description,
1130 body[data-theme="obsidian"] .postbox .inside,
1131 body[data-theme="obsidian"] .form-text,
1132 body[data-theme="obsidian"] .description,
1133 body[data-theme="obsidian"] p.description {
1134 line-height: 1.6;
1135 }
1136
1137 /* Improve table readability with better spacing */
1138 body[data-theme="neon"] table.wp-list-table tbody td,
1139 body[data-theme="neon"] .widefat tbody td,
1140 body[data-theme="obsidian"] table.wp-list-table tbody td,
1141 body[data-theme="obsidian"] .widefat tbody td {
1142 padding-top: 12px;
1143 padding-bottom: 12px;
1144 line-height: 1.5;
1145 }
1146
1147 /* ===== Loading Overlay for Dark Themes ===== */
1148 /* Override the white loading overlay with a dark semi-transparent background */
1149 html[data-theme="neon"] .abj404-loading-overlay,
1150 body[data-theme="neon"] .abj404-loading-overlay,
1151 html[data-theme="obsidian"] .abj404-loading-overlay,
1152 body[data-theme="obsidian"] .abj404-loading-overlay {
1153 background: rgba(12, 15, 19, 0.8) !important;
1154 }
1155