Changelogs for the Darkify WordPress Plugin. Stay up to date with the latest improvements, feature releases, and bug fixes for the Darkify WordPress Plugin. Explore our full Darkify changelogs to see what’s new and discover how we’re constantly improving the best WordPress dark mode plugin.
Fixed Primary buttons, switches and selected states on Darkify’s own settings screens ignored the Admin Panel Palette and stayed on a near-white default. Those parts are drawn from a `–primary` / `–primary-foreground` pair, and the pair had been left out of the palette map on the grounds that overwriting half of a contrast pair makes a button unreadable. Both halves are now taken from the palette’s own button fill and button text — a pair its author already chose to be readable together — so a chosen palette finally reaches the last part of the screen it never did.
Fixed Switch tracks and thumbs rendered transparent under some palettes. A palette that did not carry a field was still writing that field’s variable, as the literal text `undefined`, and a custom property that parses but never resolves takes its whole declaration down with it — so the track did not fall back to a default colour, it lost its background outright. A missing field now clears the variable instead of writing it, leaving the stylesheet’s own value to stand.
Fixed Toggles were hard to see once they did have a colour, because the checked track took the palette’s button fill — a colour chosen to sit on the page background, not to be read at a glance against a card, and measuring between 1.21 and 2.86 against each palette’s card. The track now takes the palette’s accent colour (4.29 to 14.50 across the same palettes) and the thumb takes the page background, so the moving part reads clearly against the part that does not.
Fixed Changing a colour preset in Live Preview only partly applied until the preview was reloaded. Rules written in terms of Darkify’s variables follow a preset instantly, but the engine also writes colours inline as it walks the page — gradients, shadows, overlays, image brightness, icon colour — and an inline declaration has no variable in it to re-resolve. Worse, the gradient and shadow writers refuse to run twice by design, so a second pass changed nothing at all. Live Preview now clears those markers and re-runs the writers against the new colours, so a hero gradient follows the preset with everything else.
Changed Dark mode in wp-admin is now rendered by Dark Reader instead of the per-element engine. The old engine walked every element on the screen, read its computed style, and re-walked on any DOM change — workable on a page that settles, and untenable in wp-admin, which never does. Dark Reader works a stylesheet at a time and generates an inverted sheet once, so the cost no longer scales with how busy the screen is. The front end is untouched and still uses the original engine.
Fixed The block editor became unresponsive with Admin Panel Dark Mode on, and stayed that way — typing, adding a block or opening the inserter could each trigger it. Every DOM change queued a fresh walk of the whole editor, each visited element forcing a style recalculation, and the editor changes the DOM continuously; the work never finished before more arrived. The new admin engine does no per-element work at all.
Added Admin Panel Palette and Block Editor Palette settings, chosen independently. Both default to Auto, which derives a colour for every colour on screen rather than pinning a background and a text colour — that derivation is what lets unfamiliar admin screens from other plugins come out right, and a preset gives it up. Presets remain available for anyone who wants a fixed look, and the block editor’s toolbar picker still overrides both for that user.
Fixed The classic editor’s dark mode button did nothing whenever the admin itself was light. Its state had been folded into the admin’s, so a light admin ruled out a dark writing area — a combination people deliberately choose. The two are independent again, and the editor body now follows the chosen palette instead of a fixed grey.
Fixed Short admin screens were painted in two tones, with a horizontal seam roughly a screen-height down. WordPress colours `body` and leaves `html` unpainted, so the two were being darkened from different starting points and the join showed wherever the content was shorter than the window. Both now resolve to the same colour, measured rather than predicted, so it holds under every palette.
Fixed Darkify’s own settings screens rendered card borders and toggle backgrounds in red. Those screens ship their own dark theme, so darkening them a second time layered two themes over each other — and the modern colour values they use could not be parsed by the darkening engine, leaving the unresolved ones to settle on the theme’s error colour. Those screens are now left to the theme they already have.
Fixed The Darkify menu icon in the WordPress sidebar sat noticeably brighter than every other icon. WordPress renders a menu icon as a background image, which cannot take the menu’s colour the way its own font icons do, so ours stayed flat white. It now takes its colour from the menu like everything around it, under any admin colour scheme.
Fixed Resizing the browser window could freeze the page outright. Whether the admin menu needs its own scrollbar is a measurement that its own answer changes, and with a single threshold a menu sitting near that boundary flipped between the two answers without ever settling — a resize drag holds it there. The test now needs clear evidence in each direction before it changes its mind.
Changed The block editor has one dark mode toggle instead of two. The admin bar carried a second one alongside the toolbar button, both doing the same thing. The toolbar button is the one that survives, because the admin bar is hidden in the editor’s fullscreen mode — which is its default.
Fixed The Help screen collapsed awkwardly at narrower widths — review cards wrapping to a word per line, plugin titles crushed against their install button, a tab clipped mid-word behind the upgrade button. Each of those laid itself out from the browser window’s width while sitting in a column that only ever had a fraction of it. They now measure the space they are actually given, which also means collapsing the WordPress menu reflows them correctly.
Fixed Several Help screen elements were unreadable in dark mode: video play buttons vanished into their own white circles, the Lite vs Pro table header became a bright white band, and hovering a plugin card drew a hard white outline. Each used a colour that inverts between light and dark against something that does not — imagery, or a full-width band.
Fixed Brand-coloured icons — star ratings, coloured logo marks — lost their colour and read as the same flat grey as body text. The icon recolouring introduced in 2.0.4 mapped every icon onto the page’s text colour unconditionally, with no exception for a colour that was never meant to blend in; a five-star testimonial rating was the clearest case, gold turning grey. Icon colour now runs through the same hue-preserving ramp gradients already use, so a brand colour keeps its hue and only its depth shifts for a dark backdrop.
Fixed A background writer added in 2.0.4 for empty decorative overlay divs (Elementor’s `.elementor-background-overlay` and similar) was also catching real, content-bearing elements that simply never picked up one of the class-based repaint’s own classes — a countdown timer’s number box, a page-builder button. Flattening a background with no matching foreground adjustment is how a white button with dark text, or a navy countdown box, ended up the same dark shade as its own text and effectively vanished. The writer now skips anything with real text content, which an empty overlay div never has.
Fixed A dark icon sitting on its own light background — a WordPress social icon link’s circle, for instance — was being recoloured to the page’s light text colour, because the contrast check only looked at the page’s general dark backdrop, not what the icon is actually sitting on. That turned a perfectly readable dark icon on a light circle into a light icon on the same light circle: invisible. Icon colour is now judged against the real, current colour immediately behind it, and left untouched whenever it already reads clearly there.
Added Border Color and Hover Border Color controls for buttons, in every color preset, for both the site-wide switch and the mobile switch. A button’s border was the one color dark mode never touched, so an outline button kept its light-design brand edge — a bright ring around a dark fill — and no setting could reach it. Each preset now ships a border color that matches its button fill, so solid buttons look exactly as before and outline buttons finally follow the palette.
Fixed Card outlines drawn as a shadow ring (`0 0 0 1px`) disappeared in dark mode. A ring like that is a border written in the wrong property, and it was being painted black like a real shadow — black on near-black is nothing at all — so a card outlined this way lost its edge while the card beside it, outlined with a real border, kept one. Rings now take the palette’s border color, and turning shadows off no longer deletes them.
Fixed Body text and headings came out tinted on themes whose text color is a tinted near-black — inks like #0A232A or #101828, which most modern themes use instead of pure black. Those read as highly saturated brand colors and were lifted to a light teal or blue, overriding the text color chosen in settings. Near-black and near-white text is now treated as ink, while genuinely saturated deep colors stay on the brand path.
Fixed Hover effects, dropdowns, sliders and reveal animations snapped to their end state instead of easing. Darkify pauses CSS transitions while it reads a page’s real colors, and that pause was applied to the whole document — including elements the pass never looked at — on passes triggered by any class change anywhere on the page. The pause is now scoped to the element being read.
Fixed Live Preview hid the site header on many themes. The panel filters out cookie banners, chat widgets and popups so the preview shows the page itself, and headers named “sticky-bar”, “top bar” and similar were caught by that filter — hiding the part of the page most worth previewing. Semantic headers, banner landmarks and header/nav class names are now recognized and kept.
Improved The translation template and the Polish translation cover the new border color controls.
Fixed Pages could freeze or crawl once dark mode was on, worse the larger the page. Every element was watched for class changes individually, and each watcher had to be re-registered across the whole document whenever anything changed — on a 2,929-element page that came to 1.23 million registrations during load and 6.31 million on a single toggle, growing with the square of the page size. One watcher now covers the document, registered once, and the cost no longer scales with the page.
Improved Pages that keep changing after load — infinite scroll, carousels, WooCommerce cart and fragment refreshes, page builders and anything React-rendered — no longer re-scan the entire document on every change. Only the newly inserted parts are examined, so a long page stays as responsive as a short one.
Improved Switching between light and dark now only revisits the elements Darkify actually styled, and reads each one’s colours once instead of twice, so the toggle settles noticeably faster on large pages.
Fixed The dark mode toggle snapped between states instead of animating. Darkify pauses CSS transitions while it reads a page’s real colours, and the switcher was being caught by that pause even though its colours are never read.
Improved Pausing transitions during a pass is now a single rule on the page root rather than an inline style written to and removed from every element, which removed one forced style recalculation per element from every pass.
Changed The screen no longer dims while a page loads in dark mode. The brightness baseline added in 2.0.2 covered the gap before the first pass, but on a slow page it read as a grey overlay sitting over the whole site until loading finished, and it returned on every navigation. The page background is painted dark from the first frame instead, and the safety timeout that clears it drops from 2s to 0.8s.
Added A developer diagnostics mode for support and debugging, off by default and invisible to visitors. Add `?darkify_debug=1` to any URL, then run `darkifyDebug.report()` in the browser console for pass counts, timings and the number of elements Darkify processed.
Added Polish translation. The whole settings panel — every section, field label, description, button and message, including the license screen and the mobile switch settings — now reads in Polish when Site Language is set to Polski.
Added The settings panel can be translated at all. Most of what you see on screen is drawn by the React admin, and none of that text was ever collected into the plugin’s translation template, so roughly 280 strings were invisible to translators. The template now covers the panel as well as the rest of the plugin.
Fixed Translations never loaded. The plugin looked for its language files in a folder that cannot exist, so the settings screen stayed in English on every site, in every language.
Fixed The settings panel stayed English on a translated site even once the language files were found, because its text was prepared before WordPress had loaded the translations.
Fixed Saving settings failed while Chrome’s built-in page translation was switched on. Browser translation rewrites the page underneath the settings panel, and the crash landed on Save — which is what made it look like saving was broken. The panel now declines browser translation and ships real translations instead.
Fixed Changing the site language could leave the settings panel empty, reporting that the section no longer exists. Some section and tab links were built from their own translated titles, so they changed with the language and stopped matching.
Fixed Hovering a WordPress admin menu item while on Darkify’s screens showed no submenu on sites whose admin menu is taller than the screen, leaving other plugins’ submenus unreachable without navigating away first.
Added Fine-Tuning — a new section in Colors for the parts of a design that a background and text colour cannot describe on their own: how gradients, shadows and brand colours are carried into dark mode.
Added Gradient Backgrounds control. Gradients live in a different CSS property than a solid colour, so they used to sit out dark mode entirely and stayed bright. Each colour stop is now run through the same ramp a solid background gets, so a gradient section and the solid section beside it still look like one design. Flatten to a solid dark background, or leave gradients untouched, if you prefer.
Added Box & Text Shadows control. A shadow coloured for a light page stays lit on a dark one and cancels out the dimming. Shadows now keep their geometry — so cards keep their depth — while losing the colour that made them glow. They can also be remapped, removed, or left alone.
Added Accent & Icon Colors control. Brand colours keep their hue while their depth is matched to your preset, so an intense accent stays on-brand without glowing on a dark page. This is not an inversion: a blue icon stays blue. Switch to Flatten to replace brand colours with your preset colours instead.
Added Color Overrides. Pin any light-mode colour to an exact dark-mode replacement, and choose whether it applies everywhere or only to text, icons, backgrounds, borders or shadows. Overrides are matched against the colour the element actually renders with, so a handful of colours can be pinned without changing how the rest of the site is handled.
Added Your settings are now written out when the plugin first runs, so the site matches what the settings screen shows. Previously a fresh install rendered the Classic switcher on the frontend while the settings screen showed Orbit.
Improved Scrollbar dark mode now covers the browser’s own furniture — the page scrollbar, the scrollbars of every scrolling box inside the page, and the controls the browser renders itself — in Firefox as well as Chromium and Safari. The thumb is drawn as an inset pill rather than a full-width slab, and scrollbar dark mode is now on by default.
Improved Pages that load straight into dark mode no longer flash their light-mode colours while the page is still being read. A brightness baseline covers the gap and lifts as soon as the real colours are in place.
Fixed Section backgrounds built from a tinted off-white — the light grey-blues most themes use to separate one band of a page from the next — were read as brand colours and kept a hue you never chose instead of following your background setting. Astra, Kadence and GeneratePress layouts are all affected.
Fixed Small controls could disappear into the page. Price slider tracks and handles, quantity steppers, thin dividers and progress bars now keep enough contrast to be seen and used, while large dark sections are left as the design intended.
Fixed Icons drawn as grey SVG shapes stayed at their light-mode colour, so plus/minus and similar glyphs read as near-black on a dark page.
Fixed Buttons a theme styles as plain text links — “Remove”, “Edit”, “Cancel” — no longer get a filled box behind them, while icon buttons keep their dark hover state.
Fixed A single colour the engine could not read no longer stops the rest of the page being processed, which could leave a page dark at the top and light below.
Changed Fine-Tuning sits directly after Preset in the Colors section, with an icon that matches what it does.
Changed The frontend script no longer loads jQuery, removing a dependency from pages that did not otherwise need it.
Added Sunrise & sunset scheduling for Time Based Auto Dark Mode — dark mode turns on at sunset and off at sunrise, calculated from your site’s timezone with no location prompt for visitors.
Added Fixed times / Sunrise & sunset switcher in the Time Based Auto Dark Mode settings; your fixed start and end times stay saved when you switch between the two.
Fixed The settings sidebar no longer loses its full height on sites with a long WordPress admin menu — the admin menu scrolls on its own again, separately from the plugin’s own settings area.
Added Complete React-based admin panel redesign, replacing the legacy Codestar framework with a fast single-page interface.
Added Modern shadcn/ui component system — buttons, selects, dialogs, popovers, sliders, switches, tooltips, toasts, calendar, and a redesigned color picker.
Added New Admin Header with quick access to Save, Reset, documentation, and support links.
Added Live Admin Preview — a built-in preview frame that renders your homepage with dark mode applied and updates as you change settings.
Added Responsive preview viewports to inspect the dark mode result at desktop, tablet, and mobile breakpoints, mirroring the WordPress Customizer.
Added Redesigned sidebar navigation with collapsible sections and section/tab organization for every settings group.
Added Dedicated, redesigned Help page.
Added Auto-save for independent toggle settings — supported switches save instantly without pressing the Save button.
Added Save keyboard shortcut (Ctrl/Cmd+S) for a faster workflow.
Improved Reorganized settings into clearer sections and tabs for easier navigation and discovery.
Improved Real-time preview updates — style and color changes reflect in the Live Preview without a full page reload; only structural changes trigger a reload.
Improved Debounced, coalesced saving so rapid edits submit the complete option set once, preventing partial saves across sections.
Improved Legacy admin bookmarks and deep links now redirect to the matching page in the new interface.
Improved Conditional field visibility — settings show and hide based on their dependencies for a cleaner panel.
Improved Responsive admin layout with automatic sidebar collapse on smaller screens.
Improved Overall performance and load time from the new build pipeline and streamlined assets.
Improved UI/UX refinements across spacing, typography, icons, and color presets.
Improved Get Help now opens inside the admin interface, keeping the sidebar and toolbar accessible instead of switching to a separate full-screen page.
Improved Redesigned Help page with a single welcome card and inline video tutorials that stack cleanly on smaller screens.
Fixed Live Preview synchronization so settings changes stay in sync with the preview frame.
Fixed Default value handling so fields fall back to correct defaults when unset.
Fixed Admin dark mode initialization flicker on panel load.
Fixed Sidebar and navigation behavior, including active-state and collapse handling.
Fixed Responsive behavior on tablet and mobile viewports.
Fixed Switcher style preview updates so the selected toggler renders correctly.
Fixed Replace Images / Replace Videos field validation.
Fixed Menu Switch settings handling and behavior.
Fixed Device-specific visibility options.
Fixed Header and layout rendering issues in the admin panel.
Fixed License page incorrectly showing an “Active” status after resetting all settings.
Fixed License card alignment on the License screen.
Added Different Switch in Mobile — configure a completely separate floating switch for mobile screens, including its own toggler style, size, background, icon color, border, and attention effect.
Improved When enabled, the mobile switch settings override the default switch only on mobile devices (≤600px); desktop continues to use the default configuration.
Fixed Mobile switch icon centering — the swap between the default and mobile switch now toggles visibility without overriding the flexbox centering, so the icon stays perfectly centered in every switch style.
Added New Frontend Iframe Dark Mode option to enable or disable dark mode specifically for frontend iframes (enabled by default for backward compatibility).
Added Dark mode now synchronizes with content loaded inside iframes. Same-origin iframes are styled directly (dark class, CSS variables, and element processing injected into the frame); cross-origin iframes receive the active theme through a postMessage bridge.
Added Real-time iframe theme sync — toggling dark mode or changing the color palette updates iframe content instantly, on both initial load and live changes, without a page reload.
Improved Iframe sections now respect the Dark Primary / Dark Secondary structure, matching the primary/secondary background logic used for regular page elements.
Improved Cross-origin iframes (embedded third-party widgets) now dim to 60% brightness in dark mode instead of using color inversion, preventing visual artifacts such as incorrect color shifts on sites with non-white backgrounds.
Improved Renamed “Frontend Iframe Dark Mode” setting label and description to accurately reflect the actual behavior — same-origin iframes receive full dark mode; cross-origin iframes are dimmed.
Fixed Iframe colors lagged one palette behind due to the palette being applied after the iframe sync; the palette is now applied before iframes are synced.
Fixed Live theme changes did not reach cross-origin iframes — the broadcast was skipped by the cross-origin document-access guard, so updates only appeared after a manual reload.
Fixed Draggable floating switch position now works correctly — the initializer was defined but never invoked, so enabling “Switch Dragging” had no effect on the frontend.
Added Switch Attention Effect option — enable an animation (pulse) to draw visitor attention to the floating dark mode switcher.
Added Attention Effect Style selector with Pulse, Radiance, Leap, Swing, Drift, and Nudge options (Pulse available; others coming soon).
Improved Renamed “Customization” tab to “Floating Switch” for clearer admin panel labeling.
Improved “Alternative Dark Mode Switch” field moved to a more logical position within the Floating Switch tab.
Fixed PHP 8.1+ undefined-index and trim(null) notices in CSS attribute parser when malformed CSS attributes lack a colon separator.
Fixed Dark mode not applying inside the Gutenberg editor (WordPress 7 compatibility).
Fixed SyntaxError when pseudo-element selectors (`:before`, `::after`, etc.) are used in “Disallowed Elements” or “Allow Only Elements” fields — `element.matches()` does not support pseudo-elements.
Fixed “Disallowed Elements” with pseudo-element selectors (e.g. `li#menu-item-448:before`) now correctly blocks darkification of `::before`/`::after` pseudo-elements on matching elements.
Fixed “Allow Only Elements” with pseudo-element selectors now correctly restricts pseudo-element darkification to only the specified elements.
Fixed When “Allow Only Elements” contains only pseudo-element selectors, DOM element processing is no longer incorrectly blocked.
Fixed Switcher CSS now always loads in the instead of the footer, resolving display issues with headless themes, shortcodes, menu switchers, Gutenberg blocks, and Elementor widgets.
Improved Switcher CSS is now conditionally enqueued — only the style(s) actually used on the current page are loaded (detected from plugin settings, menu settings, post shortcodes, blocks, and Elementor post data).
Removed Eliminated the duplicate `darkify-admin-switch` style enqueue that ran on every page load via the `init` hook.
Removed Removed the unused `darkify-pro-editor-styles` style registration which was never enqueued.
Added Dark mode now applies to ::before and ::after pseudo-elements that have a light background color. Colors alternate between primary and secondary dark backgrounds, matching the same primary/secondary logic used for regular section elements.
Added Color theme change option on Gutenberg block editor.
Updated Minor CSS improvements.
Added Gutenberg block integration with dedicated block support.
Added Custom block controls for switch styling within the block editor.
Added Elementor integration with dedicated widget support.
Added Custom Elementor controls for switch styling.
Improved Compatibility with Gutenberg editor interface and block settings panel.
Improved Compatibility with Elementor editor panel.
Fixed Iframe background issue.
Added Custom admin dark mode CSS option.
Fixed Classic editor styling issue.
Updated Minor CSS improvements.
Fixed Switcher animation.
Tested WordPress 6.9.1 compatibility.
Fixed Menu switcher css load issue.
Added Preset size options for the Switcher.
Added Custom size option for the Switcher.
Fixed Switcher load animation issue.
Fixed Fatal error on Avada (Fusion Builder) admin pages caused by missing FusionBuilder class.
Tested WordPress 6.9 compatibility.
Fixed Gutenberg block editor dark mode issue.
Fixed PHP warning caused by undefined `$unique_id` property in Admin class
Fixed Dark mode rendering issue in the admin panel when using MainWP.
Fixed Issue with Pick a Time.
New Added 4 new switch toggler styles.
New Added an option to enable/disable Dark Mode in the Block Editor.
New Added an option to enable/disable Dark Mode in the Classic Editor.
Fix Resolved a JavaScript error that was causing unexpected behavior.
Update Improved overall code performance and maintainability.
Update Compatibility with WordPress security standards.
Update All bundled PHP libraries, including Appsero Client, to latest stable versions.
Added composer.json for proper dependency handling.
Added proper escaping and translation-ready strings.
Added Documentation and demo links for all available fields.
Update Strings adjusted for full translation support.
Fixed To work > from custom CSS field.
Added Option to display the switcher before or after the menu items.
Update Menu switcher can now be added to multiple menus.
Added Option to display the switcher before or after the menu items.
Fixed Flickering issue on default dark mode browser refresh.
New Demo for color presets.
Updated Improved in preset colors for looking good elements like buttons, inputs etc.
Fixed Uncode theme darkmode loading issue on reload by adding high priority for darkify JS.
Fixed Switcher shortcode animation issue.
Updated Updated description link.
New Button hover color and background.
Updated Redesigned admin UI-UX for better useability.
Updated CSS & JS codebase for better performance & future maintainability.
Fixed Invert specific images option.
Fixed Exclude Image option not working issue when using line break.
Fixed Low Brightness option not working sometimes.
Fixed Time Based Auto Dark Mode.
Fixed Admin notice issue.
Fixed The translation-related warning was found with WP 6.8.
Added Help title for showing on tooltips.
Updated Licence agreement.
Updated Some codebase.
Updated Codebase and improved variable assignments for better formatting.
Fixed Flickering issue on default dark mode browser refresh.
Updated Full plugin codebase and added autoload support for future development.
Updated Admin options for a more intuitive experience.
New Help page in the admin panel to showcase help video.
Fixed White flicker issue on dark mode refresh.
New License key option.
New Help page in the admin panel to showcase help video.
improvement Enhanced DarkifyProFields class structure for better readability and maintainability.
Updated Code adjustments for full compatibility with the latest WordPress version.
Updated Improved code compatibility with the latest PHP versions.
Fixed PHP warning and ensured compatibility with the latest WordPress version.
improvement Coding standards.
New 8 color presets for dark mode.
New Initial release.