Document the portable caching strategy for distributors on different servers, splitting the PHP-served bundle from server-served static files and giving ready Apache and nginx configurations.
Core changes:
- Performance reference (docs/PERFORMANCE.md):
- New section on static asset caching and compression
- nginx gzip/expires snippet and font-versioning caveat
- Admin editor help (admin/info/editor/ru.md):
- Caching/compression snippet for the .htaccess tab plus nginx note
Benefits:
- Clear per-server guidance for varied SLAED installations
Re-enable and extend the Apache caching/compression rules so Apache and LiteSpeed installs get sane defaults out of the box; nginx installs use the server-config snippet documented separately.
Core changes:
- Apache fallback (.htaccess):
- Enable mod_deflate for js/css/svg/xml/json/txt (woff2/woff excluded)
Enable mod_expires with per-type TTLs
- images/css/js 30 days, fonts 1 year
- Replace the old flat FilesMatch that missed woff2 and svg
Benefits:
- Cached and compressed static assets on Apache/LiteSpeed by default
Technical notes:
- nginx ignores .htaccess; see docs for the equivalent server config
- Font 1-year TTL is safe once font URLs are versioned
Improve LCP and CLS on the lite theme by preloading the actual hero image of each page, reserving space for static images, and giving the search field an accessible name.
Core changes:
- Conditional LCP preload (templates/lite/index.php, layouts):
getTemplateLcpPreload() emits one preload from an explicit render flag
- main-module slider -> <season>.jpg
- head-content pages -> <season>-cat.jpg
- verified with is_file(); at most one resource per page
- Add {{{ preload }}} slot to home.html and app.html heads
- Layout shift and a11y (layouts, partials/main-slider.html):
- width/height on slider images (1920x440) and footer tech icons (74x74)
- aria-label on the header search input
Benefits:
- Earlier LCP discovery for the season hero background
- Reduced CLS from dimensioned images
- Named search control for assistive tech
Technical notes:
- Preload chosen by page flag at render time, never by HTML regex
- No markup churn to the bi bi-* icon API
Make the CSS/JS bundle URL change on any real content change and let browsers cache it for a year, so repeat visits skip re-downloading unchanged bundles while deploys never serve stale assets.
Core changes:
- Asset fingerprint (core/system.php):
- Add ASSETS_VER constant as an in-code, release-bumped cache key
Include filesize() alongside filemtime() in doCss()/doScript() bits
- invalidates the bundle even if a deploy preserves file mtimes
- Asset response headers (core/classes/cache.php, index.php):
- Add optional immutable flag to Cache::setHeaders()
- Serve the go=asset bundle with max-age=31536000, immutable
Benefits:
- Year-long bundle caching without risk of stale assets
- Portable: works on any server, no web-server config required
Technical notes:
- ASSETS_VER must be bumped on releases that ship changed CSS/JS/fonts
- Backward compatible: setHeaders immutable defaults to false
Limit the length of the URL stored in session tracking to avoid oversized values in the tracking table from very long query strings.
Core changes:
- Session tracking (core/system.php):
- Truncate urlencode($request) to 2048 chars in updateSessionTrack()
Benefits:
- Bounded storage for tracked request URLs
- Avoids overlong rows from crafted or accidental long query strings
floats 5 -> 2: drop vestigial float on absolute .sl-float-panel and on .sl-searchbox (always overridden in flex parent); .sl-copyright float -> block (only in-flow footer child). Only text-wrap floats stay
remove 5 redundant
text-decoration: none !important(base enforces none; zero underline rules in project)tokenize: 109 spacing literals (4/6/8/12px) -> --sl-space-* in gap/padding/margin; border-radius 6px -> --sl-radius-soft, 8px -> new --sl-radius-card; 3x soft box-shadow -> --sl-shadow-xs; duplicated footer gradient -> --sl-bg-footer-stripe; 2x #fff -> --sl-color-bg (admin theme now has zero hardcoded hex)
a11y: add prefers-reduced-motion guard and :focus-visible rings (using the existing --sl-focus-primary convention)
drop 2 reducible !important (.sl-ratings-inner-row grid, .sl-changelog-commit:hover already win by order/specificity)
- merge identical callout rules; drop duplicate .sl-geo-flag img rule
- split one 481-char gradient onto multiple lines (180-char rule)
.sl-progress-infolabel/value -> CSS grid (1fr auto): pins percent right, label wraps cleanly (flex shrank it)- base.css base styles use existing tokens (body/a/optgroup colors)
- repeated black-overlay rgba -> --sl-overlay-10/12/15/20 tokens
- remove 2 confirmed-dead rules (.sl-left, td.sl-fl-col-icon-m)
eliminate the legacy .sl-clrfix util entirely: .sl-com-cont -> display:flow-root, footbox band hook -> :last-child; drop the class from header/advantage/comment wrappers (header is already flex)
The CSS grid #container (shell refactor) makes #sidebar a stretched grid item with a definite, tall height. The legacy IE clearfix hack height:1% then resolves to ~1% of that height, collapsing .sl-block, .sl-post-vote and .sl-main-list>li so their content overflows and overlapping blocks appear (sidebar login over poll, forum block over news). Use display:flow-root for float containment without the definite-height side effect.