Журнал изменений
The lite theme carried two redundant state vocabularies: .sl-thide as an exact duplicate of .sl-none (display: none) and a third .selected tab-state class toggled by the shared tab script alongside .sl-is-active and aria-selected. Nothing in templates emits .selected.
Core changes:
- Visibility utility (templates/lite):
Replace sl-thide with sl-none in menu.html, layouts/bare.html, layouts/admin.html and the is_top_hidden branch of fragments/link.html
Drop the .sl-thide rule from theme.css
- Admin theme untouched: its .sl-thide is a different component
(collapsed block + footer icon buttons), verified before scoping
- Tab state (plugins/system/slaed.js, templates/lite/assets/css/theme.css):
Stop toggling the legacy selected class in the shared tab script and drop it from the initial-tab detection
Remove the .sl-tabs-link.selected selector; .sl-is-active and aria-selected remain the canonical pair
- Safe for the admin theme: its CSS styles only .sl-is-active
Benefits:
- One visibility utility and one tab-state vocabulary across the lite theme
- Shared tab script writes only state that stylesheets actually consume
Technical notes:
Verified with computed-style probes (only the two intended diffs: the removed .sl-thide rule and the orphaned .selected styling) and a live admin tab-switching run (activation, aria, panel display, clean console)
- No PHP involved; markup contract (is_top_hidden flag) unchanged
Several components had their declarations split across distant blocks or duplicated outright, hiding the effective values from readers. This change consolidates each component into a single block with zero visual diff.
Core changes:
- Buttons (templates/lite/assets/css/theme.css):
Merge the .sl-but colour block into the base pill block in the Buttons section
- hover/active/disabled and htmx-request loader rules moved along with it
- background shorthand kept before background-clip to preserve the cascade
- Radio groups (templates/lite/assets/css/theme.css):
Fold the stray .sl-radio-group override (misplaced under the Associations comment) into the primary block
- Keeps the effective computed values: flex, wrap, centered, gap md
- Progress bars (templates/lite/assets/css/theme.css):
Move the fill width transition from the voting section into the main .sl-progress-line div block
- Popover arrows (templates/lite/assets/css/theme.css):
Move --sl-float-arrow-color into the source .sl-tip and .sl-menu panel blocks and drop the late micro-blocks
- Misc duplicates (templates/lite/assets/css/theme.css):
- position: relative moved into the main .sl-block block (vote tools anchor)
- Early .sl-login-avatar block removed (fully subsumed by the login block)
- Duplicate flex declarations dropped from .sl-fp-nickname
Benefits:
- One source of truth per component; no conflicting same-specificity overrides
- Readers see the real effective values where the component is defined
Technical notes:
CSS-only change, verified with computed-style probes (167 probes identical) and full-page screenshot diffs on catalog, home, news and forum pages
- No markup, PHP or JS involved; no behavior change
Mini chip buttons rendered as native <button> elements picked up the UA border and appearance, breaking the flat 26px pill look shared with anchor-based mini buttons.
Core changes:
- Mini chip button base (templates/lite/assets/css/theme.css):
Add border: 0 and appearance: none to .sl-but-mini
- -webkit-appearance included for older WebKit builds
- Anchor and span variants are unaffected (no UA chrome to reset)
Benefits:
- Identical rendering for <button>, <a> and <span> mini chip controls
Technical notes:
- CSS-only change, no markup or PHP involved
- No backward compatibility impact
Ports the approved demo designs into the system: the voting widget gains animated results, live auto-refresh driven by the global live_u config, and unified play/stop status glyphs across every context.
Core changes:
- Voting widget (core/system.php, voting-widget/voting-view):
Widget wrapped in .sl-vote with data-sl-vote-live/url on active results; is_lead marks the leading answer (trophy follows the max)
- Result rows expose data-sl-votes/percent; counters wrapped for JS
Corner tool cluster: admin gear menu (now also in the block) before the status glyph, aligned to the block title line
Dormant go=1 getVotingView dispatcher case now echoes and serves as the live endpoint; closed polls never render live attributes
- Status glyphs (voting-home.html, theme.css, lang/*):
One 16px glyph everywhere: play-circle (success, pulse) while the poll is active, stop-circle (warning, static) when it has ended
Same inline typography as .sl-tip-icon so both pixel-snap alike; poll list rows show the marker before the info tip
- _VOTING_ACT/_VOTING_LIVE/_VOTING_END constants in six locales
- Client mechanics (plugins/system/slaed.js, theme.css):
setVoteBlocks: cold-start intro counts bars, percents and vote numbers up from zero; live polling tweens from previous values, moves the lead class and copies the votes/comments chips verbatim
Toggle animations honour data-sl-toggle-display; float panels can right-align to their trigger via data-sl-float-align=end and clamp to the trigger instead of the viewport edge
Any htmx .sl-but shows the system loading dots while its request is in flight; interactive option rows with accent-color controls
- Voting block query (blocks/voting.php):
Four display modes collapsed into one prepared query; random mode uses ORDER BY RAND() LIMIT 1 instead of loading every id
Benefits:
- Polls feel alive without page reloads and respect reduced motion
- Status is readable at a glance in the block, the module and lists
Technical notes:
- Live updates re-render fully only when the answer set changes
- The totals chip updates without digit animation by request
Rebuilds the sidebar user block on a universal PHP data contract, fixes four long-standing bugs found along the way and standardises every cookie and frontend session key on the configurable user_c prefix.
Core changes:
- User block (blocks/user_info.php, block-user-info.html):
Private message counters via one prepared query, cached in the session for 60s and invalidated by deletePrivatCounts() on every mailbox mutation and on logout (core/user.php)
Group and points meta line with next-group progress data (ngroup_name/points/pct), groups resolved in a single query
Fixes: sidebar login posted user_pass without a CSRF token (never worked), logout pointed at unknown op sl-logout, settings pointed at the account overview, inbox links led to the missing privat module
- Unread badge .sl-pm-new replaces the autoplay-blocked audio alert
- Session summary (core/system.php, session-summary/session-row):
Counters aggregated in one query; detail rows load lazily through the new getUserSessionRows endpoint (hx-trigger click once)
- Table markup replaced with the div grid shared with the admin theme
Optional auto-refresh driven by the new live_u config (admin field plus _LIVE_UPD constant in all six admin locales)
- State naming and cookies (core/security.php, core/system.php):
Cookies and frontend $_SESSION keys follow $conf[user_c]-<feature>; legacy stats_id/shop cookies migrated with one-release fallbacks
Cart links carry the CSRF token the go=2 gate demanded (the cart was silently broken); emptying the cart now clears cookie and superglobal
- Avatar defaults (core/user.php, uploads/avatars/default):
getUserAvatarUrl() is the single resolver: user.svg, guest.svg and deleted.svg replace the 0/00.gif magic strings across seven call sites; registration stores an empty avatar and the resolver decides
- Avatar gallery accepts .svg and excludes system files by name
Benefits:
- Sidebar login, logout and cart actually work again
- One config knob (live_u) will drive every live block
- Distribution-safe: pure PHP, no server-specific rules
Technical notes:
getCookies() filters to [a-zA-Z0-9_-]; base64 cookies are read from $_COOKIE directly with the user_c prefix
- Old default/00.gif rows in the users table fall back gracefully
Adds six standalone HTML showcases used to iterate on the sidebar user block and the voting widget before porting the chosen designs into the lite theme.
Core changes:
- User block labs (demo/user-block-*.html):
42 full-block variants: logged-in, guest, geo details and 2026 trends
- surfaces (glassmorphism, liquid glass, neumorphism), bento, density
- live session feed, accordions, group-progress ring, drag constructor
- All variants reuse real block data and lite theme tokens/classes
- Voting block lab (demo/voting-block.html):
17 variants for form and results states on the real widget anatomy
- system-markup section with effects layered on sl-* selectors only
- merged live variant that became the shipped widget behaviour
Benefits:
Design decisions reviewed in-browser against real markup before touching templates
- Serves as a reference gallery for future block redesigns
Query controls move into a single-row .sl-search-panel; results render as a divider list (.sl-search-line) with breadcrumb, title, clamped snippet and meta chips. Adds fragments/search-form.html and a demo/ reference page.
One H1 per page: page/module titles render H1, de-polluted pager/footer/ sidebar/related/category headings down to their proper level, and view sub-headings normalized. Heading sizes tokenized (--sl-h1..--sl-h4 in base.css) with framework classes wired to them in theme.css; getModuleNavi gains an is_heading flag so view pages do not emit a second H1.
home.html and app.html were ~98% duplicate; the common chrome moves into partials/site-header.html and partials/site-footer.html, slimming both layouts to include stubs. Footer/admin home links point at "/" instead of "index.php"; app.html marks the content region with a <main> landmark.
Portable, PHP-level redirects in core/security.php (proxy-aware via X-Forwarded-Proto, GET-only, default off):
- bare /index.php -> / (301) to kill the duplicate homepage URL
- opt-in forcessl (http->https) and forcehost (www->canonical homeurl host)
Admin config SEO tab gains forcessl/forcehost toggles (constants in all 6 languages); getPublicUrl() returns root with trailing slash; help doc admin/info/config/ru.md documents canonical behavior and the new toggles.