Consolidate the current performance and rendering cleanup batch across template, parser, debug metrics, scheduler, and breadcrumb handling. The changes remove repeated runtime probes, tighten debug metric timing, and move category breadcrumb context into module view data.
Core changes:
- Template and parser hot paths:
- Add request-local caching and reduce repeated filesystem and parser work
- Cover parser behavior with updated fixture tests
- Debug metrics and scheduler:
- Report final debug panel metrics through the same timing snapshot as the footer
- Gate scheduler pseudo-trigger work earlier and cache planned run state
- Breadcrumb context:
- Remove frontend schema probing for item breadcrumbs
- Pass category ids from category-backed module view handlers
- Build lite theme breadcrumbs from prepared head context
Benefits:
- Fewer database metadata probes and repeated runtime checks
- More accurate debug performance output
- Cleaner module-owned breadcrumb data flow
Technical notes:
- The setHead payload now exposes head_cid/head_item from cid/title
- getItemCrumb is removed because schema detection no longer belongs in frontend rendering
Site-side user content now uses the Toast UI markdown editor instead of the plain textarea, matching the comment and voting flows this branch polishes.
Formatting-only pass over the four theme stylesheets: one property per line, uniform 2-space indentation, one blank line above each comment and none below, single-line English section comments in the "Name: scope" format.
Core changes:
- Formatting (admin and lite base.css, theme.css):
48 compact one-line rules expanded (alert tone remaps, keyframe frames)
One blank line between blocks at every nesting level, no doubles, no blanks inside declaration blocks
Over-long values wrapped at list commas; quoted data URIs stay atomic
- Comments:
- 13 multi-line comment paragraphs condensed to single lines
Around 45 bare section names received scope descriptions (Header, Footer, Buttons, Layout, ...)
Stray comments hoisted out of foreign blocks: / Buttons / sat inside a media query, a leftover label inside @keyframes dropped
- Remaining Russian words in comments translated
Technical notes:
Zero behavior change proven per file: the normalized token stream (comments stripped, whitespace collapsed) is byte-identical before and after the pass
Two data-URI lines in the admin theme stay over 180 chars; the quoted string cannot wrap without changing the value
One UI stream across the lite theme: chips become the single meta component with a tone vocabulary, floats get a touch-safe open/close model, voting and login reuse system components, and 2026 phone viewports get layout and input fixes.
Core changes:
- Chips (theme.css, link.html, core/system.php):
Explicit sl-chip-* tone wins on links too; each tone rule pairs its resting tint with --sl-chip-hover-bg, consumed by one nested &:hover on clickable chips
- favourite toggles and author wrapper chips (:has(> a)) deepen the
same way; transition lives on the base chip rule
New link.html params: chip_tone renders any link as a toned chip, icon_name reused for the chip glyph (space instead of inside flex chips)
Voting widget: comments chip is info blue and links to the real #comm anchor; "other polls" becomes an accent chip in the votes row
Login dropdown: standard sl-but submit, danger/success chips for lost password and registration; dead sl-login-submit rules and tokens removed
- Floats (plugins/system/slaed.js, theme.css):
mouseleave closes over a 300ms grace timer: a panel fading display to none is not hit-testable, so it must stay fully open while the cursor crosses the gap into it
placeFloat parks off-screen only before the first measure and cancels a pending close; re-placing never yanks the panel from under the cursor
- pointerdown outside closes hover floats (touch has no mouseleave)
Tip panels force text-align left inside centered hosts (forum name plate); in-body comments condensed to single lines above functions
- Editor autofocus (plugins/editors/toastui/driver.php):
Toast UI constructor now receives autofocus from the driver flag; pages with a comment editor no longer auto-scroll to it on load
- Profile header (account-profile.html, theme.css):
User "..." menu before the admin gear, right-aligned like comments; .sl-com-edit pins to the third grid column
- Mobile 2026 (theme.css):
Grid row-gap in percent never joins the auto height calc, so stacked footer rows overflowed under the bottom menu by the summed gaps; fixed token row-gap and block footer columns fix the overlap
- 15px body text and 16px fields under 768px (stops iOS focus zoom)
40px coarse-pointer hit zones on compact controls via ::after overlay, visual size unchanged
Profile info table stacks label/value cells; footer menu matches the 8px page gutter with compact dividers
Benefits:
- One chip vocabulary instead of per-case styling
- Touch users can open, reach and dismiss popovers reliably
- Poll pages open at the top; phone footer renders without overlap
Technical notes:
Verified via Playwright against live pages at 390/430px mobile and 1400px desktop; token contracts unchanged, no console errors
Theme updates backing the unified float/tip/list work in both themes.
Core changes:
- Float panels (lite + admin theme.css):
Closed panels use display none with an allow-discrete transition so hidden menus stop inflating scrollWidth (phantom scrollbar under every moderator list table); @starting-style keeps the fade-in
One generic open rule (.sl-float:hover / :focus-within) replaces the menu- and tip-scoped variants; dead .sl-dropdown* blocks removed
- List tables (lite):
td.sl-cell-ellipsis becomes the flexible truncating column (width 100% + max-width 0) instead of a fixed 450px link cap
- sl-table-col-num keeps the gear+number pair on one line
- Tip + name pairs are flex rows: exact 6px gap, centred icon
- Page layout (lite):
40px side gutters between 769-1400px keep the fixed idea/feedback tabs off the content column
Login toggle styled as a span trigger; the dropdown arrow reuses the shared .sl-float-panel::after geometry instead of a custom pair
- Debug (lite + admin):
min-inline-size 0 on .sl-debug-section stops unbreakable tokens from stretching the page on mobile
Benefits:
- No horizontal scrollbars from invisible panels or wide titles
- Consistent popover arrows and hover behaviour everywhere
The legacy click dropdown on user names is gone. Everywhere the "i" tip shows profile facts on hover and a click on the name navigates to the profile; hover previews, click navigates.
Core changes:
- Shared helpers (core/helpers.php, core/system.php):
getUserTip() builds the hover tip (group, points, regdate, gender, origin, warnings) once for comments, forum posts and PM; guests get "Status: Guest", orphaned uids without a name "Status: User deleted"
user_info() takes an icon flag; name links next to the tip render without the person icon
- New _USERDEL constant in all six languages
- Call sites (setComShow, forum, PM in core/user.php):
report + username_html replace the per-site dropdown data keys; guest names show as entered, empty ones fall back to _ANONYM
- Favorites list cells reordered to match its header
- Templates (comment, forum-post, account-profile, login-nav):
- Click dropdown markup removed; tip + bold name pair instead
Profile: name is plain text (final point), Message/Back moved into the "..." user menu next to the admin actions menu
- Login is a hover/focus trigger; no toggle-control navigation stub
- Float behaviour (slaed.js):
mouseleave keeps a panel open while focus is inside (login form), focusout ignores focus moves between inner fields
Benefits:
- One mechanism instead of four ad-hoc dropdown variants
- Login form no longer closes mid-typing
Every frontend list now renders the moderator gear menu before the number anchor in one cell and moves the date column into the info tip before the title, freeing ~120px for titles.
Core changes:
- Generic list row (table-row.html, table.html):
Moderator popover merged into the sl-table-col-num cell, the separate "Functions" column and its col_func header removed
Date cell replaced by a report tip before the title link; data-sort keeps tablesort clean; col_date header removed
- List modules (files, pages, news, links, media, faq, help, shop):
- time_text/time_iso/time_label replaced by one getTplTitleTip call
- col_func / col_date dropped from table_open
- Voting and content:
- voting-home.html: gear menu ordered before the number anchor
content: cells reordered to match the header (title, number) fixing the header/body column misalignment
Benefits:
- Identical gear+number pattern across all modules
- Header and body columns always match for guests and moderators
The toolbar classifier measured a mid-parse column width and never re-ran, so icons spilled over the sidebar; the editor mount div also shrink-wrapped to the toolbar instead of matching the other fields.
Core changes:
- Toolbar refit (slaed-tags.js):
Pin the toolbar to the real remaining row width (minus md tabs) so the native ResizeObserver reclassifies against honest numbers
- Re-run on window load, window resize and editor changeMode
- Editor sizing and reflash (slaed-icons.css):
Mount div gets flex basis / width 100% like every .sl-field input, in both markdown and wysiwyg modes
overflow-x clip on the toolbar row keeps the brief all-icons re-render inside the frame; dropdown and popups stay visible
Benefits:
- Icons never paint over the sidebar at any viewport width
- Surplus icons land in the native "..." dropdown as designed
The voting button relied on HTMX implicitly including the enclosing form's token; make it explicit like the other form-based ajax actions (addComment, addPrivateMessage).
Core changes:
- Voting widget (core/system.php):
- Pass hx_include => '#form'.$votid to the vote action so the form (token + answers) is included
- Action fragment (templates/{lite,admin}/fragments/comment-action-ajax.html):
- Render an optional hx-include attribute when provided (no-op for other callers)