- Replace PERFORMANCE_AUDIT_* notes with consolidated PERFORMANCE.md and new ARCHITECTURE.md
- Update README/CONTRIBUTING/SECURITY/UPGRADING and docs guides
- table.html: single-call rows_html contract (drop open/close two-pass and dead footer_html)
- table-row.html: is_truncate, is_forum_user cell flags
- Sort-indicator CSS, sl-cell-ellipsis truncation, tokenized icon sizes
- Footer forum teaser: clickable user icon, fix list overflow and even column distribution
- Decode HTML-entity-encoded titles before escaped output across forum/news/files/pages/faq/jokes/center* blocks
- parser: decode entities in plain [code] blocks (fixes double-encoded <, ", &)
- Add getForumTopics() helper; drop triplicated forum-topic query assembly
- voting block: move HTML wrapper to block-content fragment, fix array_rand crash on empty set
- forum block: CSS truncation, plain escaped poster name
- Reindent blocks to 4 spaces; normalize legacy file headers
The Apache rules section of the editor help now notes that Nginx and IIS do not read .htaccess and shows the error_page directive needed to route HTTP errors to the styled CMS error page.
setExit() now renders a single styled card (logo, gradient divider, message, home/search) for every error and notice, in both the lite and admin themes. Assets resolve through an absolute <base href> built from homeurl so the page keeps its styling even when served from a deep URL, and all <head> tags are emitted via fragments (head-base, head-meta, meta-refresh) instead of inline HTML. The login divider and the message divider share a single --sl-line-gradient token. access.php becomes a thin guard, and _ERROR404 is reworded into a neutral, universal _ERROR_PAGE across all six locales.
Saving an info/help doc ran the Markdown source through filterHtml(), which (for the CodeMirror branch) applied nl2br + htmlspecialchars + $/quote escaping and corrupted the file on the first save. Info docs are rendered in trusted mode (filterContent safe=false), so store the raw Markdown with normalized LF line endings instead. Wrap the rendered doc in a scoped .sl-markdown container (via the generic div partial) and add spacing rules so the help pages no longer render cramped.
getAdminInfo() was an AJAX duplicate of setTplAdminInfoPage() reachable only via the index.php dispatch case 'getAdminInfo', which nothing in the UI ever triggered. Drop the function and its dispatch case.
The info/help tab in every admin section reused the generic _INFO label ('Информация'). Introduce a dedicated _DOCS constant ('Справка' / 'Documentation') in all six locales and switch the tab bars to it, leaving _INFO for the generic tooltip/nav usages that genuinely mean 'information'.
Bring admin inputs to the same modern validation UX as lite and remove duplicate or ambiguous class hooks, keeping the admin palette.
Core changes:
- Modern validation (assets/css/base.css):
- Replace required:valid/:invalid text coloring with :user-invalid/:user-valid border and ring
- Add danger and success focus tokens
- Wrap the over-specific input :hover exclusions in :where() so focus and validation win
- Class consolidation (assets/css/theme.css, fragments, partials):
- Rename the .sl-field width utility to .sl-field-auto so it no longer clashes with the lite .sl-field
- Reduce the duplicated .sl-changelog-filter-field input rule to width:100%
- Toggle ids sl_block_ become sl-block-; drop the dead --sl-shadow-input fallback
Benefits:
- Consistent modern validation across both themes
- Unambiguous class names and less duplication
Technical notes:
- :user-invalid and :where() target modern browsers
- Visual behavior preserved; neutral value text
Give the lite theme one field look, modern validation, a Yes/No switch and custom checkbox aligned with admin, and remove legacy class hooks.
Core changes:
- Unified field styling (assets/css/base.css, assets/css/theme.css):
- Canonical .sl-field for input/textarea/select with focus ring and disabled state
- Field height aligned to the 30px buttons; neutral value text
- :user-invalid/:user-valid validation as border and ring, only after interaction
- Form field, checkbox and switch design tokens
- Controls aligned with admin (assets/css/theme.css, fragments):
- Custom checkbox with brand check mark
- Yes/No segmented switch (.sl-radio-switch) in the lite green palette
- Class consolidation:
- Tabs hook div[id^="sl_tabs_"] becomes .sl-tabs plus data-sl-tabs with a hyphenated id (assets/js/tabs.js, fragments/navi-tabs-wrap.html)
- Toggle ids sl_block_ become sl-block- (partials/block-sidebar.html)
- Tokenize duplicate and seasonal colors; drop the dead --sl-shadow-input fallback
Benefits:
- One field class and a consistent modern look across lite forms
- No underscore class or id hooks left
- Easier theming through tokens
Technical notes:
- :user-invalid, :where() and :has() target modern browsers
- No markup behavior change beyond class and id renames