✨ Enhancements
- New
panel.uploadsoption sets how many files the Panel uploads at the same time (default:3)
// site/config/config.php
return [
'panel' => [
'uploads' => 5
]
];- New
Kirby\Image\Svgclass to read information from SVG markup #8546 - Animated GIF thumbs from the
imagickdriver are smaller - New
$helper.number.format(value, options)formats numbers in the Panel's interface language. #8674
🏎️ Performance
- Natural sorting in the Panel (e.g. structure fields with
sortBy) is 5–30× faster for large lists. #8675
🐛 Bug fixes
- Content storage:
- Saving no longer replaces secondary language content with the default language under certain circumstances #8591
- Hooks that chain several model actions without returning the result no longer break the action that triggered them, e.g.
publishing changes in the Panel. #8548 Kirby\Filesystem\Dir::remove()no longer fails when a parallel request removes the directory at the same time #8606- Deleting a page with subpages or files that cannot be deleted no longer removes the page's content and some of its files and subpages before failing. #8656
- Translations
- Queries:
- Array values are only called if they are closures, never as PHP functions by name #8575
- A context variable set to
nullno longer falls back to the global query function of the same name #8575 - Fixed queries containing uppercase
AND/OR(e.g.page.title == "ORANGE") #8573 - Fixed names starting with
true,falseornull(e.g.page.nullable) #8573
- Media handling
- Pages no longer break when images are uploaded in parallel while being resized #8374
- Batch uploads in the Panel no longer fill up all PHP-FPM workers and leave the Panel unresponsive. #8526
- SVGs without
width/heightattributes render in the Panel file preview #8014 - More accurate dimensions for SVG files: a missing width or height is derived from the
viewBoxratio, theviewBoxoffset no longer reduces the size, decimals are rounded instead of cut off, and comma-separatedviewBoxvalues are supported #8546 imagickthumb driver resizes and crops all frames of animated GIFs, not just one- Converting an animated GIF to JPG or PNG with the
imagickorimdriver creates a thumb of the first frame, instead of publishing the original GIF and leaving extra files in the media folder - Converting an animated GIF to WebP with the
imdriver keeps all frames intact - Converting an animated GIF to AVIF with the
imagickorimdriver creates a small still thumb of the first frame instead of a large file with one image per frame imagickandimthumb drivers create intact thumbs of animated WebPs instead of glitchy frames, andimagickno longer fails to convert them to GIF- Grayscale thumbs of GIFs with the
imagickdriver use the brightness of each color instead of its red channel - Focus points at 1% or less crop from the correct position instead of the opposite edge #8685
- Thumbs with an unknown crop position are cropped from the center instead of failing #8685
- File sizes in the upload dialog use the same units and number format as the file view (e.g.
2.5 GBinstead of2.7BB). #8674 - Thumb job files no longer stay in the media folder when a template reads the size of a new thumb #6511
- Database
Kirby\Database\Database::connect()usesPDO::connect()on PHP 8.4+.Kirby\Database\Database::connection()now returns the driver subclass (e.g.Pdo\Sqlite), so driver-specific methods work without PHP 8.5 deprecations. #8669Kirby\Database\Query::count()counts the groups of grouped queries and the distinct rows ofdistinct()queries with a select list. This also fixes the totalKirby\Database\Query::page(). #8670
- Panel
- Clicking a link in a
linkfield preview inside a table (e.g. a structure field) no longer also opens the row. #8672 <select>elements use correct colors for dark Panel theme #8567- Page/file pickers no longer hang with a loading spinner when the user's role isn't allowed to list any page/file #8544
- Fixed Cmd/Ctrl+S in a pages, files or users field dialog clearing the field instead of applying the selection. #8488
- Page create dialog: title and slug templates no longer HTML-escape special characters like
Ⅹ - Range inputs format their value in the Panel's interface language. #8674
- Panel activation banner does not try anymore to open license dialog if user has no permission #8555
- Clicking a link in a
- Http
Kirby\Http\Uri::idn()andKirby\Http\Uri::unIdn()no longer drop the host when the IDN conversion fails. #8678Kirby\Http\Idn::decodeEmail()andKirby\Http\Idn::encodeEmail()keep the address as is when the domain cannot be converted and no longer throw for an empty domain #8678Kirby\Http\Idn::decodeEmail()andKirby\Http\Idn::encodeEmail()split at the last@, so quoted local parts like"a@b"@example.comare converted correctly #8678
♻️ Refactored
Kirby\Toolkit\V::email()validates the value type explicitly instead of catching all errors #8678