Журнал изменений
The admin alert component defines title, text, close and actions parts that no admin source ever emits: the admin alert fragment renders only the body/lines/flash structure, and the parser callouts use body-only markup. The rules were vocabulary parity with the lite theme without consumers.
Core changes:
- Alerts (templates/admin/assets/css/theme.css):
Remove .sl-alert-title, .sl-alert-text, .sl-alert-close (+ hover) and .sl-alert-actions
- Buttons (templates/admin/assets/css/theme.css):
Mark .sl-but-red as a reserved danger-action variant so future audits do not flag it as dead again; it gets wired to destructive actions in a follow-up change
Benefits:
- Admin CSS describes only what admin markup can actually produce
Technical notes:
Verified with computed-style probes over 55 admin components: the only diff is the probe element that carried the removed classes
Tone variants (sl-alert-info/success/warn/error/accent) and the flash bar are dynamic via the type flag and stay untouched
Three demo pages that link the production lite theme.css still emitted pre-consolidation alias-only chips, which render unstyled since the alias selectors left the theme.
Core changes:
- components-terra.html (demo/):
- Chip examples migrated to sl-chip [sl-chip-<tone>] plus semantic hooks
Rate-sites example drops the hook: it carries site-card positioning (position: absolute + opacity) that breaks the demo row
- modul-search.html (demo/):
JS result renderer emits canonical chip classes for date, category, comments, reads and author meta
- voting-block.html (demo/):
- Five vote-count links gain the canonical sl-chip class
Benefits:
- Demo pages render chips exactly like production templates
Technical notes:
Verified by rendering all theme-linked demo pages over HTTP: zero alias elements without sl-chip, clean consoles
A full browser audit of demo/ found 24 legacy admin concept pages that reference asset families removed from the admin theme during the Bootstrap Icons migration (b735d5a4): the templates/admin/images/icons/ directory (Noto emoji SVGs and old PNG icons) and the retired PNG logos.
Core changes:
- Removed pre-bootstrap concept mockups (demo/):
18 emoji-icon concepts (admin-*-2026, icon panels, command center); admin-pulse-2026 additionally hung the page load
- Legacy layout demos (admin-layout-demo, -2, admin-left-blocks-demo)
- icon-hover-gradient-demo and both statistic-monitor-etalon pages
Benefits:
- demo/ keeps only pages that render without broken assets
- The favoured bi-alive direction demos are untouched and clean
Technical notes:
- All files remain recoverable from git history
Verified with a Playwright pass over all demo pages (console, network, rendered DOM)
Add the live component catalog (demo/components-fable.html) that renders every lite-theme control with the production CSS, and align it with the consolidated vocabulary.
Core changes:
- Catalog page (demo/components-fable.html):
Buttons, chips, tips/popovers, alerts, forms, navigation, rating/voting, status glyphs, tone palette and a component-to-emitter summary table
Chip section documents the post-consolidation contract: canonical sl-chip + tone classes with semantic names kept as JS/htmx hooks only
Forum meta, tabs state and visibility utility notes match the current CSS (no .selected, no .sl-thide, geo-ip meta chip via getIpHtml)
Benefits:
- One reviewable page showing the real rendering of every control
- Documents which fragment emits each component and who consumes it
Technical notes:
Static page linking the production base.css/theme.css; page scaffolding is namespaced cf- and does not touch the sl- vocabulary
Geoip::getIpHtml() feeds 20+ call sites: comment/forum/pm meta rows where the IP renders as a green pill, and plain admin/frontend lists. The pill look lived in scoped context CSS; the renderer now signals the meta context explicitly and the last scoped chip rules leave the lite theme.
Core changes:
- Renderer (core/classes/geoip.php):
getIpHtml(string $ip, bool $meta = false) passes an is_geo_meta flag to the span fragment; default keeps every existing call site unchanged
- Meta call sites (core/system.php, core/user.php, modules/forum/index.php):
- Comments, private message view and forum posts pass meta = true
- Fragment (templates/lite/fragments/span.html):
- is_geo_meta adds sl-chip sl-chip-success ahead of the sl-geo-ip hook
- CSS (templates/lite/assets/css/theme.css):
- Drop the scoped .sl-cargs / .sl-fp-meta geo-ip pill rules
Add .sl-chip.sl-geo-ip a { color: inherit } so the inner IP link keeps the chip tone (replaces the two scoped link rules)
Benefits:
- The last context re-implementation of the chip recipe is gone
- Display context is an explicit contract instead of CSS scoping
Technical notes:
Same accepted chip-metric shift as the date/edit chips: padding 8 -> 11px, gap 4 -> 6px; verified via computed-style probes (only those two diffs)
Chip path verified live as moderator on a commented page; plain path is parameter-default identical, admin theme fragment ignores the new flag
- php -l clean on all touched PHP files
The changelog module carried a private button system (sl-changelog-button primary/secondary) that duplicated the role of the theme-wide .sl-but pill. The filter and reset buttons now fall through to the default button class.
Core changes:
- Module (modules/changelog/index.php):
Drop the is_changelog_primary / is_changelog_secondary flags from the filter and reset button fragments
- Emitter (templates/lite/fragments/button.html):
- Remove both changelog branches; the buttons take the sl-but default
- CSS (templates/lite/assets/css/theme.css):
- Delete the .sl-changelog-button* blocks
Rescope the mobile flex rule to .sl-changelog-filter-actions .sl-but so the buttons keep their full-width wrap layout on narrow screens
Benefits:
- One button component across the theme; changelog stops shipping its own
- Filter card visuals now follow the theme automatically
Technical notes:
Intended visual change confined to the changelog filter card: flat blue buttons become the standard theme pills
- Verified with desktop and 480px screenshots (layout intact) and php -l
- Card/commit styling and --sl-changelog-* tokens untouched
theme.css kept three ~15-line selector lists only to map ~30 semantic meta names (sl-date, sl-hits, sl-favor, ...) onto the shared chip recipe and its six tones. Emitters now output the canonical classes directly; the semantic names stay in the markup as hooks for JS/htmx and context rules.
Core changes:
- Emitters (templates/lite/fragments + partials):
span.html, inline-badge.html, date-badge.html, card.html, link.html, comment-action-ajax.html, table-row.html, main-content-item.html, main-carousel-item.html, partials/view.html emit sl-chip plus the tone matching the current rendering
- Non-link elements keep their alias tone (info/success/warn/danger)
- Links emit plain sl-chip: the a.alias selector always beat the bare
tone list, so every link chip already rendered the success default
- is_comments skips sl-chip when chip_tone is set to avoid a duplicate
class token (voting comments link passes both)
- CSS cleanup (templates/lite/assets/css/theme.css):
Base, link-default and tone blocks keep only .sl-chip / a.sl-chip / .sl-chip-<tone> selectors; alias selectors removed
- Dead .sl-news-info selector dropped (no emitter anywhere)
Hover block generalized to .sl-chip:has(> a):hover; favourite toggles keep their hook-based hover (spans are clickable via htmx)
Context rules untouched: .sl-block-modules .sl-module and the site-card .sl-rate-sites positioning keep working via the retained hooks
Benefits:
- Chip vocabulary defined once; new meta labels need no CSS edits
- Markup declares its component explicitly instead of via a CSS alias map
Technical notes:
.sl-votes, .sl-coms and .sl-favor remain in the DOM as JS/AJAX hooks (voting live refresh in plugins/system/slaed.js, favourite toggle)
Verified: 132 computed-style probes of the post-migration markup are identical to the pre-migration rendering; live home/news/forum pixel diffs confined to dynamic counters; DOM hook classes asserted live
The forum/comment meta rows re-implemented the chip recipe with scoped selectors (.sl-cargs > , .sl-fp-meta .sl-grey > ) instead of using the shared chip component. Date and edit badges now come out of the emitter as canonical info chips.
Core changes:
- Emitter (templates/lite/fragments/inline-badge.html):
is_comment_date and is_topic_edit branches emit sl-chip sl-chip-info
- sl-topic-post / sl-topic-edit stay in the markup as semantic hooks
- All three producers (comments, forum posts, private messages) render
into the same meta rows, verified before the change
- Context CSS (templates/lite/assets/css/theme.css):
- Drop the scoped pill recipe and tint for date/edit badges
Keep a full scoped pill rule for .sl-geo-ip until Geoip::getIpHtml() can signal the meta display context (follow-up package)
Remove .sl-topic-post/.sl-topic-edit from the plain-glyph list; those entries were unreachable outside the chip contexts
- Add a compact rule so date/edit chip glyphs keep the 13px meta size
Benefits:
- One chip recipe instead of a parallel scoped implementation
- Emitters own the component classes; contexts stop restyling markup
Technical notes:
Accepted micro-shift on these chips only: padding 8px -> 11px and icon gap 4px -> 6px (canonical chip metrics); verified with computed-style probes and live forum topic / comment screenshots
- Geo-ip pill verified pixel-identical via probes
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