Replace legacy float grids and the absolute-positioned pager with modern CSS Grid and flexbox, and tidy the forum foot, breadcrumbs and list info.
Core changes:
- Grid system (theme.css):
sl-grid-1-2/1-3/1-4 use CSS Grid (repeat(N, minmax(0, 1fr))) with responsive 2/1 column fallbacks; drop float and clearfix :after
- Pager (theme.css):
sl-pager is now flex (compact "< numbers >"), wraps cleanly; remove absolute arrows, fixed height and the mobile/forum-foot overrides
- Forum foot (theme.css):
One flex row: pager left, buttons right; info line with separator; grouped the top/foot pull-right button spacing
- Header breadcrumbs (theme.css):
- Vertically centered, adopt the Magistral title font
- Forum list info (theme.css):
Three equal-height columns; permissions right-aligned to the edge; green/red can/cannot colors via tokens
Benefits:
- Less CSS, no legacy float/clearfix hacks
- Responsive grids and pager out of the box
- Consistent forum and pager presentation across modules
Technical notes:
- Lite theme styles only; admin theme untouched
- Card .sl-grid system left as-is
Align the lite template fragments with the consolidated PHP helpers: header breadcrumbs, forum topic list, permissions legend, favorite button and the block title bar.
Core changes:
- Header banner (lite-head-banner.html):
- Show breadcrumbs in the title slot, fall back to module name
- Forum topic list (forum-category-row.html, forum-category-table.html):
Single title link with the status icon inline; drop the separate icon column and the matching header colspan for topic lists
- Forum info/foot (forum-list-info.html, forum-topic-view.html):
- Restore the access permissions block (was commented out)
- Drop legacy sl-grid-1-* and the clearfix wrapper on flex containers
- Reusable fragments (span.html, block-all.html):
- span supports an id (inline htmx target for the favorite button)
- block-all accepts optional icon_name/href for the title bar
Benefits:
- Consistent forum heading and breadcrumbs
- No phantom clearfix box inside flex containers
- Inline favorite target avoids heading shift
Technical notes:
- Escaping boundary preserved; PHP passes data, templates own markup
- Backward compatible (new keys are optional)
Consolidate duplicated logic behind shared core helpers, add item-level breadcrumb resolution, and fix forum topic-list pager and the inline favorite button across the lite theme and forum module.
Core changes:
- Entity decode helper (core/system.php, 16 files):
Add getDecodedText() and replace 25 inline html_entity_decode(..., ENT_QUOTES | ENT_HTML5, 'UTF-8') call sites
- Decode forum topic titles in the list so quotes render, not "
Forum topic state helper (core/system.php, modules/forum/index.php, blocks/center_forum.php):
Add getForumTopicState() as the single source for the is_topic_* status flag; drop the duplicated if/elseif chains
- Item breadcrumbs (core/helpers.php, templates/lite/index.php):
- Add getItemCrumb() guarded via information_schema (cid + title)
getThemeHeadVars() resolves the category trail for op=view items and appends the current item title as the last crumb
- Forum list fixes (modules/forum/index.php):
Stop the topic loop from clobbering the page category; use $catid so the pager and the moderator move form get the correct id
- Merge the status icon into the single topic title link
- Inline favorite button (core/user.php):
Wrap the favorite toggle in an inline span instead of a block div so it no longer shifts headings
- Block title bar (core/system.php):
render_blocks() forwards optional icon_name/href to the block-all wrapper; center_forum block supplies them
Benefits:
- Single source of truth for decode and topic-state logic
- Correct forum pagination and clean heading layout
- Uniform item breadcrumbs across category modules
Technical notes:
- Behavior preserved; shop/content without cid are safely skipped
- No backward-incompatible changes
Prevent the generated PHP CS Fixer cache from being tracked, keeping the working tree clean after running the style fixer.
Core changes:
- Ignore rule (.gitignore):
- Add .php-cs-fixer.cache under a dedicated PHP CS Fixer section
Benefits:
- No accidental commits of tool-generated cache
- Cleaner status output
Technical notes:
- Tooling-only change, no runtime impact
- 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.