Dotclear 2.37 - 2026-02-13
===========================================================
* 🐘 PHP 8.2+ is required, PHP 8.3, 8.4 and 8.5 compliance
* Breaking change: PHP 8.1 is no longer supported
* Breaking change: Adjust return type of isSpam method of antispam filter (filter now must return null or true or false)
* Breaking change: type property is now mandatory in _define.php of modules (plugins, themes)
* Breaking change: Switch from DotAddict to Dotclear for plugins/themes repositories
* Breaking change: Use only one category (Actualités) for Dotclear news feed
* Breaking change: Upgrade jQuery from 3.7.1 to 4.0.0 and jQuery migrate from 3.5.0 to 4.0.1
* UX/UI: Media sub-folders are now sorted in lexical order (based on their names)
* UX/UI: Add a user preference option to use dynamic letter spacing rather than normal
* UX/UI: Add a visual indicator (header border color and collapser background color) when one of monitored forms is unsaved, checked every 5s
* UX/UI: Review color input appearance
* UX/UI: Review CSS breakpoints (now 600, 1024 and 1280px)
* UX/UI: Sortable items: reduce sortable handler area to button only (was entire row before) and give more room for the handler
* UX/UI: Add two user preferences to use a dense layout for favorites icons, and for dashboard modules boxes
* UX/UI: Adjust badge horizontal position on icons with dense layout
* UX/UI: Add an header label for Antispam filter's settings link in list
* UX/UI: about:config and user:prefs plugins: give focus to 1st focusable element on menu selection
* UX/UI: Switch order of two options of Antispam plugin in blog parameters page, add some explanation about the "only moderate spam" option
* UX/UI: Cope with last opened folder in media manager
* UX/UI: Cope with last media directory opened from user (stored in user prefs)
* UX/UI: Use specific labels for user statuses (in order to avoid confusion with other usages of these labels)
* UX/UI: Add some statistics on users list and blog list
* UX/UI: Add date and modification date (and time) columns for users list
* UX/UI: Widgets management, CSS review
* A11y: Use aria-current rather than aria-selected for current tab
* A11y: Enforce some contrasts in dark mode (AA minimum)
* Core: Add an option for each category to disabled feedback (enabled by default)
* Core: Simple Menu, a data (string) may be add to each item and it's value will be rendered as data-menuitem HTML attribute
* Core: Add a max_level parameter (0 = all, n = number of levels) for categories retrieval in blog->getCategories() and categories->getChildren()
* Core: Blog settings and User preferences, if unknown type, try to detect type from given value and use it if possible
* Core: Add a dotclear helper (JS) to give focus to the 1st focusable child in an element (take care of tab order)
* Theme: Berlin, cope with motion reduce setting (a11y)
* Fix: Blank target of Simple Menu item was not correctly preserved when changing order of menu items
* Fix: Checking $_POST[…] for a checkbox which may be not present is $_POST if not checked
* Fix: Some cleanup was missing in last 2.36 update
* Fix: Cope with GD not available for OTP QR Code in user pref
* Fix: Media item deletion with a search filter
* Fix: Ensure given value of Html/Form/Strong field is string
* Fix: Antispam filters order management if drag'n'drop is disabled in user prefs
* Fix: Menu was hidden in some cases
* Fix: Use key attribute of keydown event rather than code in order to ignore keyboard layout (standard Editor)
* Fix: Success message on user deactivation
* Fix: cope with encapsulated tags (code in pre for example) for smilies replacements
* Fix: Blogroll, use "Category status" rather than "Link status" for categories
* Fix: Search module (plugins/themes) with 0 results
* Fix: Cope with Codemirror editor for dirty forms monitoring
* Fix: Return URL from secondary page of actions (entries, …), was limited to last 10 selected in 1st page
* Fix: Usage of CKEditor and classic editor for non admin users
* Fix: Avoid overflow of figcaption for centered figures
* Fix: Theme editor, give priority to named template set rather than generic one when searching template files

Dotclear 2.36 - 2025-11-13
===========================================================
* 🐘 PHP 8.1+ is required, PHP 8.2, 8.3 and 8.4 compliance
* Breaking change: Media::getFSDir() has been removed
* Breaking change: Add a MediaFile file descriptor (extends File class)
* Breaking change: File class no longer allow dynamic properties
* Breaking change: ThemeConfig::cleanCSS method has been removed
* Breaking change: dcCore instance parameter is no longer provided by Rest server
* Breaking change: dcCore::app()->spamfilters is no longer taken into account
* Breaking change: The deprecated Error::toHTML() method has been removed
* Core: Unlock theme modification even for old ones (overload attribute in _define.php of themes is no longer used)
* Core: Add Webauthn (Passkeys), OTP and oAuth2 support (to be configured in inc/oauth2.php, an example is provided in inc/oauth2.php.in), a new table credential will be added to the DB
* Core: Frontend session is now supported
* Core: Add a dotclear_exit() proxy function (loaded by App) for exit()/die()
* Core: Add PDO drivers for mysql and pgsql and rename sqlite
* Core: Allow load and forget a service, useful for example to open a secondary connection of a DB
* Core: Add DB method to get a connection on the fly
* Core: Set session TTL to 20 hours rather than 2, it's better for accessibility
* Core: Allow opening a Frontend context during Backend one, using the same session
* Core: Sanitize sqlStatement given conditions (or, and, groups)
* Core: Add a boolean 3rd parameter to Listing::userColumns() to transform if necessary, all columns' value to Component if already not (as Text)
* Core: Let's be gentle with old installations, but not too old, so welcome back the deprecated bootstrap() method to App ;-)
* Core: Add CLI mode for installation
* Core: Add adminPageHTMLBody behavior (called just before closing body)
* Core: Move hard coded store URLs to release file
* Core: Bump minimum required PHP version to 8.2 for future releases (after 2.36)
* Core: Add a maintenance task to empty feeds cache folder
* UX/UI: For entries with closed comments or closed trackbacks, display comments/trackbacks counters with a specific color (aria-details added if necessary).
* Core: Add download attribute to Html/Form/Link (a)
* UX/UI: Add comments/trackbacks status information for post and page
* UX/UI: Review entry link toolbar icon (standard Editor and CKEditor)
* UX/UI: Plugin with setting link(s): remove hr and add a vertical separation (blank)
* UX/UI: Enforce visibility of informative/warning message from media listing (no results from filter, empty folder)
* UX/UI: Add unique id (if not given) of all toolbar's element
* UX/UI: Add group management for standard Editor toolbar elements (spacers are no longer needed)
* UX/UI: Entry edition page: Ask to reset the url base if title has changed and if entry is not published (only if title is used in entry URL format)
* UX/UI: Add some padding to textarea (2px is not enough, the cursor was difficult to see at the beginning of a line)
* UX/UI: Theme preview have been removed
* UX/UI: User preferences: show a warning message if QR code image cannot be provided
* UX/UI: Allow using theme editor as a favorite, use a better name
* UX/UI: Differentiates list of options (used in HTML) and list of values for select filters, group months by year for posts filter
* UX/UI: Groups months by year for menu simple archive item
* UX/UI: Replace grid.png by grid.svg (was the last PNG image in admin)
* Theme: Berlin, use CSS grid for widgets layout (with 2 or 3 columns)
* Theme: Review management of widget title/subtitle formats
* Fix: Link color in warning message on dark scheme
* Fix: Fix link color in warning message on dark scheme
* Fix: Page plugin, use the correct editor for HTML after conversion
* Fix: Cope with search filter when deleting item in media insertion popup
* Fix: CKEditor: allow insertion of link (direct/entry) on empty selection
* Fix: All editors: Use entry title as link text if current selection is empty
* Fix: Ensure storing integer value in post_limit, post_offset and post_count properties when importing from Wordpress
* Fix: Fix progress bar progression in import/export plugin, and autosubmit JS script
* Fix: Allow entry preview for non admin users
* Fix: Flat export without check zip format
* Fix: Do not insert custom CSS stylesheet if the current theme is not customCSS (frontend)
* Fix: Thumbnails deletion on search media delete action
* Fix: Isolate upgrade dependencies classes (Menu and Helper)
* Fix: CSS variable name for #help-button color
* Fix: Ensure that some transient user preferences (media_manager_dir, media_file_mode) are not already stored in DB before adding them
* Fix: Media manager, back to first page when changing directory (fav, last or sub-directory)
* Fix: Cope with media item deletion from search results
* Fix: Take care of empty value for given REST function
* Fix: Use process way for admin URLs set by JS (and ensure popup=1 is set when opening a popup)
* Fix: Avoid removing media from post if no IDs given
* Dev: Switch from Atoum to PHPUnit for unit tests
* Dev: Add a development mode to theme editor (if set then the editor will behave as before overloading system, directly editing themes files). This mode may be set via a themeEditorDevMode behavior callback
* Dev: Temporary removal of links to the documentation (until the new server is operational) in CONTRIBUTING.md
* Locales: Norwegian (bokmål), Thai and Vietnamese languages added
* Locales: Bengali, Catalan, Esperanto, Spanish (Argentina),Basque,Hindi,Croatian,Occitan,Serbian,Telugu removed

Dotclear 2.35 - 2025-08-13
===========================================================
* 🐘 PHP 8.1+ is required, PHP 8.2, 8.3 and 8.4 compliance
* Breaking change: App::auth()->blog_count is no longer public, use App::auth()->getBlogCount() instead
* Breaking change: App::frontend()->smilies is an array (may not be initialized) and no longer accept false value
* Breaking change: restCheckStoreUpdateV2 behavior use now an single associative ArrayObject rather than two arrays
* Breaking change: Put the global __() function in a separate file, L10n::bootstrap() should be call in order to have this function defined
* Breaking change: HtmlFilter now trim returning string
* Breaking change: User favorites, remove unused case (using array) in getFavorite($id) method
* Core: Propose to reset entry URL when publication date is changed (if not already published)
* Core: Allow using patterns for house cleaning during upgrade
* Core: Add an option to Antispam to publish immediately moderated comments/trackbacks if they are recognized as not being a spam
* Core: Reset host cache list if force refresh is required (upgrade dashboard)
* Core: Add a host cache in StoreReader (with log)
* Core: Remove old IE code from standard Editor Wysiwyg mode
* Core: Add a JS helper, dotclear.DOMready to use when DOM content is loaded (backend/frontend)
* Core: Add also media_private to idx_media_media_path SQL index as this field is often used in queries with media_path and media_dir
* Core: Make idx_media_media_path SQL index generic, not only for PostgreSQL
* Core: Adds a meta tag that can be disabled to prevent indexing by AI engines in Blog parameters (advanced section)
* Core: Add two behaviors in themeEditor themeEditorWriteFile, themeEditorDeleteFile to let 3rd party plugins play with it
* Core: Cope with mjs (javascript module) in themeEditor
* Core: Remove link to current selected theme stylesheet which is not useful on themes' list page
* Core: Display a warning message if theme is too old to be overloaded with themeEditor
* Core: Add a specific define value for theme supporting overloading (DC 2.35+)
* Core: Allow modification of distributed themes as the new system will not modify original files
* Core: Cope with index.php?tf=resource.ext and with custom theme template path (var)
* Core: Add a behavior (adminDashboardMessage) to provide 3rd party modules message on dashboard
* Core: Add a behavior (adminConvertBeforePostEdit) to allow 3rd party conversion before editing entry content (post/page)
* Core: Set default antispam moderation TTL to 7 days rather than 0 (immediate)
* Core: Rewriting the method for building category lists without using recursion
* Core: Call coreContentFilter behavior for preview button (wiki mode)
* Core: Add a status information for blogroll links and categories
* Core: Cope with full URL for public media when looking for 1st image in entry
* Core: Use XML format rather than serialized PHP Object to cache feeds
* Core: Use IntersectionObserver rather than an EventListener for Goto Top button (show/hide) and Help button (position and aspect)
* Core: Optimize getLangsCombo method
* UX/UI: Review prefix of back button text (::before)
* UX/UI: Review editors' name, use description rather than name in user pref if available
* UX/UI: Use an animated SVG rather than GIF for autocomplete loading indicator
* UX/UI: Review responsive table header management on small devices (WIP)
* UX/UI: Use a dialog for inline quote insertion in legacyEditor rather than two consecutive prompts
* UX/UI: Add aria-label to set to today button
* UX/UI: Add aria-label to show/hide password button
* UX/UI: Add an Ok button to notices in order to close them
* UX/UI: Review maintenance tasks messages using Ajax
* UX/UI: Slight review of toolbar buttons background on standard Editor
* UX/UI: Review theme editor help
* UX/UI: Add a global help sidebar only if has not already been loaded
* UX/UI: Add a last donation date personal reminder in donation fieldset on dashboard
* UX/UI: Add some note about video insertion sizes
* UX/UI: Slight review CSS of responsive tables
* UX/UI: Add a plugins settings page with all available links to different kinds of plugins settings
* UX/UI: Review Theme Editor plugin icon (light/dark)
* UX/UI: Review look and position of title on auth page
* UX/UI: Force sub-categories to be displayed under the category
* UX/UI: After update done, go directly to authentication (Upgrade) instead of requiring a another click from user
* UX/UI: If secondary notes should be hidden (in user pref), also hide informative notes
* UX/UI: Switch to light-dark() and cope with color scheme for backend CSS
* Fix: No need for spl_autoload_register callback to return anything
* Fix: Do not use french feed for Finnish language
* Fix: Do not request multiple times the list of fonts during blowup config rendering
* Fix: Fix form children selector in dotclear.enterKeyInForm() helper
* Fix: Fix CSS for outgoing-link image
* Fix: Set media link (not image nor video nor audio) content to current selected text (or url if none) in standard Editor
* Fix: Set media link (not image nor video nor audio) content to current selected text (or url if none) in CKEditor
* Fix: Avoid loading more than once util.js (Frontend)
* Fix: Fix fields' color (to cope with light/dark mode) for Blue Silence theme
* Fix: Fix fields' color (to cope with light/dark mode) for Blowup theme
* Fix: Do not list minified versions of files in themeEditor
* Fix: No need to change field backgrounds in order to cope with light/dark modes in Ductile
* Fix: Prevent unsaved media properties if necessary
* Fix: Berlin theme: style only aside without any classes
* Fix: Try to cope with non UTF-8 encoded theme's files in themeEditor if necessary
* Fix: Review composition of list of plugins in notice/success/warning/error
* Fix: Display delete button as soon as file saved (even with JS) in themeEditor
* Fix: Review dynamic activation/deactivation of delays in maintenance settings tab
* Fix: Maintenance plugin: display expired task(s) message only if requested in plugin settings
* Fix: Select the correct radio button for maintenance alert depending on current settings
* Fix: Quick entry creation without category
* Fix: No need to load more than once legacyEditor resources (JS, CSS, …)
* Fix: Fix miniTidy by reverting HTML5 closing single tags to XHTML form as xml_parser will use XHTML format.
* Fix: Cope with footnotes CKEditor plugin which force background color
* Fix: Do not display generic help on plugin config if help is already set
* Fix: Filter contextual help content to avoid malformed HTML
* Fix: default smilies definition path
* Fix: Put ul of sub-categories inside the li, not after
* Fix: Fix: Its better to have a form to save stuff in maintenance!
* Fix: Target = _blank is for opening in another tab/window
* Fix: Fix comment preview content, the publicBeforeCommentPreview behavior effect was ignored
* Fix: Fix helper message for comments and trackbacks TTL
* Fix: Use new-stuff class rather than top-add as this one might be hidden by ads-blockers
* Fix: Keep some space between username and logout icon
* 🐛 → Various bugs, a11y concerns and typos fixed
* 🌼 → Some locales and cosmetic adjustments

Dotclear 2.34 - 2025-05-13
===========================================================
* 🐘 PHP 8.1+ is required, PHP 8.2, 8.3 and 8.4 compliance
* Breaking change: No longer argument dcCore::app() given in SpamFilter::__construct()
* Breaking change: Use standard pagination template on search result pages in dotty template set
* Breaking change: use input type search for search widget, may have impact on theme's CSS
* Core: Add a flag — SOCKET_VERIFY_PEER, to be defined to false in inc/config.php — to ignore peer verification (host and certificate) on socket connection (use with caution)
* Core: Add an optional parameter for postType to specify the admin URL of list of it's entries
* Core: Plugins adding buttons on legacyEditor/CKEditor should have at least 1010 priority, 1005 is reserved for additional syntaxes to legacyEditor (as legacyMarkdown)
* Core: Move default location of upgrade backups from root to var folder, also move old backup files in this new location if they still are in root folder
* Core: Add two helper methods to Tpl class, getCurrentTag() and getFiltersParams(), useful to when using Ctx::global_filters()
* Core: Core version code review
* Core: Complete actions behaviors (new behaviour adminAfterProcessAction)
* Core: Add a new behavior 'coreContentFilter' to replace too restrictive old 'coreAfterPostContentFormat' (used in post content/excerpt, comment content, category description)
* Core: Add a template value tpl:CommentIfUs similar to tpl:CommentIfMe but for all blog's active users (use with caution, especially on large number of users)
* Core: Use DirectoryIterator rather than opendir/readdir/closedir
* Core: Add a Dotclear constant to limit DB update with new media (default = 1000). May be set in inc/config.php (DC_MEDIA_UPDATE_DB_LIMIT)
* Core: Check limit before doing something to allow setting DC_MEDIA_UPDATE_DB_LIMIT to 0 to never add missing media in DB
* Core: Cope with unattended request on CSP report URL
* Core: Add a force rebuild thumbnails in current directory. To be use with caution with large number of media in it as it is not asynchronous yet.
* Core: Allow reusable core script (JS) for entry selection
* Core: Add Span and Strong as child of Html/Form/Text class, add items/separator/format management to Text
* UX/UI: Add template set information in theme details
* UX/UI: Review left header positioning in tables on small devices
* UX/UI: No longer use ▶ as main menu active item indicator (confusing with fold-able stuff), back to : character
* UX/UI: Differenciate dotty/mustek template-set based themes in blog appearance page
* UX/UI: Display entry types in list (search, tags)
* UX/UI: Add generic translate attribute management and use it to avoid browser translation of some languages information (list, codes, …)
* UX/UI: Remove light gray background on editor's toolbar. Add a visible separator between groups of tools on legacyEditor toolbar.
* UX/UI: Adjust color/background for disabled textarea
* UX/UI: Use type search for back-end search inputs
* UX/UI: Precise which password is required (admin one) on user page validation
* UX/UI: Add translate="no" to several fields (id, names, urls, emails, langs, …)
* UX/UI: Stick main menu to the top
* UX/UI: Add a scroll-behavior: smooth for body
* UX/UI: Add a user option to sitck main menu on top othe page as far as possible
* UX/UI: Cope with enter key to validate sidebar widgets settings form
* Fix: Review management of favorites icon's legends
* Fix: In Blog::getLangs() set a table alias P for post table in SQL statement as it may be used in some cases
* Fix: Fix breadcrumb for comment
* Fix: Rollback jQuery UI from 1.14.2 to 1.12.1 as 1.13.* and 1.14.* cause problems with nested drag'n'drop jQuery plugin (categories)
* Fix: legacyEditor: Don't put a space at the beginning of the toolbar, don't repeat spaces
* Fix: legacyEditor: Do not display spacers if they are in first or last position in toolbar
* Fix: Missing tab id for system settings of maintenance plugin
* Fix: Display of founded trackbacks links and proposed trackback excerpt (on auto discover action)
* Fix: Default color palette for CKEditor
* Fix: Switch back some password fields to input fields as browsers try to do more than required (especially on Windows), even if autocomplete="…" is not defined!
* Fix: Optional disabled modules management
* Fix: Labels for next/previous post buttons
* Fix: Avoid ambiguity in statistics displayed above list of entries. The links to various entry status list are displayed only if only one post type in list.
* Fix: Use fully qualified class for MailSocket() method in config.php.in template
* Fix: URL regexp for lang scheme
* Fix: Labels for items pagination (aka no of item per page in admin lists)
* Fix: Don't sort twice files in media directory
* Fix: Tags user option display
* Fix: Cope with {{tpl:lang…}} or {tpl:lang…} or already compiled <?= __(…) ?> or <?php echo __(…); ?> in widget settings
* Fix: Avoid sorting dirs/files if not necessary
* Fix: Media settings URL (in blog parameters) in footer on media page
* Fix: Don't escape twice link properties
* Fix: Disabled module update
* Fix: Module install
* Fix: Do not use autocomplete for login in new user page
* Fix: Use positioning in sprintf formats as some languages may use another order in sentences than English.
* Fix: Return button (label and URL) on user permission page (user action)
* Fix: Do not remove path part of themes_url when composing resource's URL, only if themes_url begins with http(s)://
* Fix: Do plugins installation (Install.php / _install.php) if necessary (on upload, download, install and update) on upgrade dashboard
* Fix: Empty/Delete uninstall Cleaner use a non prefixed table name as input.
* Fix: CKEditor loading of media CSS alignment
* Tests: Remove unnecessary sleep() in Files unit tests
* 🐛 → Various bugs, a11y concerns and typos fixed
* 🌼 → Some locales and cosmetic adjustments

Dotclear 2.33.1 - 2025-03-02
===========================================================
Fix: Remove improper <br> before end of paragraph (</p>) in legacyEditor if any
Fix: Link color in table item headers on small devices
Fix: Non admin users cannot create a new post

Dotclear 2.33 - 2025-02-13
===========================================================
* 🐘 PHP 8.1+ is required, PHP 8.2, 8.3 and 8.4 compliance
* Core: Get title and description from SVG if exist
* Core: Add optional release date to modules and display them if present
* Core: Status management revamped (entries, comments, users, blogs, ...)
* Core: New behavior coreBlogBeforeGetPostsAddingParameters (used for some db requests)
* UX/UI: Add left/right arrow key navigation from post to post (or page to page)
* UX/UI: Adjust (small) image size in some popup display
* UX/UI: Add media title to metadata list
* UX/UI: Add direct submit on quick menu selection (search field)
* UX/UI: Add a required attribute to password of the chosen action is delete on blogs page management
* UX/UI: Add count of available updates for plugins and themes in tab title
* UX/UI: Review "Lock theme update" note, thanks Gérard Barré for this suggestion
* UX/UI: Adjust size and positions of sub/sup texts
* UX/UI: Add media title as ordering criteria
* UX/UI: Apply a lexical sort for names and titles of media
* UX/UI: During meta (tags) search, add a second loop looking after the beginning (those results will be displayed at the end of the list)
* UX/UI: Remove stats (no of entries, usage frequency) on autocomplete list (tags)
* UX/UI: Classic editor: Set some CSS attributes to avoid dynamic inline style insertion during copy'n'paste
* UX/UI: Switch from : to ▶ character for current/active menu-item indicator (with a fallback to :)
* UX/UI: Remove metadata frequency information (not useful in backend)
* UX/UI: Cope with large SVG icon in sidebar of entry edition page
* UX/UI: Media item page: on display list of entries using the media, display now two lists (inside entry/entry attachments).
* UX/UI: Cope with alternate text and description of video and audio media during insertion
* Fix: Lock/unlock button (on input/textarea) was not accessible
* Fix: Don't display a warning about missing permission for super-admin newly created users
* Fix: SQL error on changing existing user id, the prefs were created from the old id, not the new one
* Fix: On some servers, OPCache API might be restricted. Try to detect this.
* Fix: Don't display twice the media title in media metadata list
* Fix: In en empty media folder, uploaded files using the enhanced uploader were not displayed
* Fix: Ensure there is at least one available language to download before showing the according form
* Fix: XMP metadata were badly read from image file
* Fix: Cope with non existing settings in Ductile configuration
* Fix: Boxes alignment on blog appearance page
* Fix: Date format label in blog parameters
* Fix: Sortable blocks system on dashboard
* 🛡 Security: Fix potential XSS, thanks Ratnesh Kumar for reporting this issue
* 🛡 Security: Escape HTML content in filters' input fields
* 🛡 Security: Disallow double (or more) extensions on media upload file, fix a potential RCE reported by Ratnesh Kumar.
* 🐛 → Various bugs, a11y concerns and typos fixed
* 🌼 → Some locales and cosmetic adjustments

Dotclear 2.32.1 - 2024-11-27
===========================================================
* Fix: A category could not be renamed
* Fix: The categories page doesn't display any categories if there's only one for the blog
* Fix: Cast number values to int in blog parameters form as they might be non-existent
* Fix: Replace return button by a cancel button in intermediary steps during creation of a new SimpleMenu item
* Fix: legacyEditor with pseudo empty excerpt (thanks Ben Griffith for documenting this issue)