Журнал изменений

Официальный сайт SLAED CMS

Журнал изменений

Фильтр и поиск

Всего: 1252 Доступных коммитов | Отфильтровано: 1252 Коммиты | Страница: 1 из 126
Сегодня (12.10.2026)
Feature: Every login lands in one journal the profile and the panel read, the admin etalon gains its home, and the stand plays the Phoenix return
Автор: Eduard Laas | Дата: 15:42 12.10.2026

ADMIN-LOG batches 0 and 1 (roadmap steps 58 and 59): the login attempts of the site and of the panel are rows of _login_log, shown to a user in the profile and to the admin in a tab of "Безопасность". The admin etalon of the stand becomes one page with the panel home and the comments view, and a new stand shows the effects of the 8.0 "Phoenix" release over that etalon for the owner to choose from.

Core changes:

  1. Login journal (core/system.php, admin/index.php, modules/account/index.php, storage/update/sql/table.sql, storage/update/sql/table_update6_3.sql):
  2. New table _login_log: account, panel flag, result, way, ip, agent, time

    • Created by the install schema and by the 6.2 update, nothing carried over
  3. addLoginReport() becomes addLoginLog(): one row per attempt, the file block of admin.log/user.log kept until batch 2

    • Results ok, password and blocked; the way login or oauth; a name without an account writes uid 0
    • No attempted password is written
  4. getLoginLog() reads the rows by account, side, result, way and period with their total
  5. cachegc removes rows older than 90 days, a thousand per statement
  6. Profile screen (modules/account/index.php, core/user.php, lang/*.php):
  7. op=logins: the own logins of a user with the pager, a tile in the personal menu
  8. The words of the journal in six locales, shared by the profile and the panel
  9. Security tab (admin/modules/security.php):
  10. op=logins: every login with filters by account, side and result; the tab strip is one array of the module
  11. Monitor (core/monitor.php, modules/presentation/index.php):
  12. The refused logins of the panel are counted from _login_log and always return an integer
  13. Tests (tests/Unit/LoginLogTest.php, tests/Support/login_probe.php, tests/Support/journal_probe.php, tests/Unit/JournalSecretTest.php):
  14. LoginLogTest over a disposable schema: rows per attempt, uid 0, own rows only, panel filters, monitor count, cachegc, 6.2 update
  15. The journal probe follows the new name and parameters and deletes the rows it writes
  16. Plan and reference (docs/9-ADMIN-LOG-2026.md, docs/ARCHITECTURE.md, docs/ROADMAP-2026.md):
  17. Batches 0 and 1 closed with their decisions; steps 58 and 59 ticked
  18. Admin etalon (public/demo/admin/index.html, admin.css, admin.js, comments.html):
  19. One page in two views: the panel home without name and the comments with ?name=comments; comments.html redirects
  20. The home: the column of the live panel, the module cards, the dial on hover of a card
  21. "Новые" and "Ждут проверки" merge into one block "Ждут внимания", the same rows as the bell, every queue present in the rail too
  22. Every new piece marked and described in the stand legend
  23. Phoenix stand (public/demo/phoenix.html, public/demo/assets/phoenix.js, public/demo/assets/phoenix-fx.css):
  24. Fifteen faces played over the live etalon in a frame: ten of the logo and five of the logo with the page ground
  25. Fire in the blue of the project with a warm heart, theme tokens only, both themes
  26. The event plays at the entry, a quiet state follows, and the event plays again after the hand rests a chosen time

Benefits:

  • One journal of logins replaces two text files as the source of the profile, the panel and the monitor
  • A user sees where their account was entered; the admin filters attempts without reading log files
  • The etalon and the Phoenix stand let the owner pick what moves into the theme

Technical notes:

  • New table _login_log; install schema and 6.2 update both create it
  • addLoginReport() is renamed to addLoginLog() with new parameters; every caller is updated
  • The stand files are demo only and ship no change to the theme
Feature: The schema takes one set of conventions for connection, text and time, and every journal of the site gets its plan
Автор: Eduard Laas | Дата: 13:45 12.10.2026

The connection runs one collation, one SQL mode and the zone of PHP on every path, text columns sit on their domains in utf8mb4_unicode_520_ci read from one place with every outside value cut to its column, and no time is text any more: a moment a person reads is DATETIME, a machine timer unix seconds. The plan of the site journals joins the roadmap before the last schema batches, and the admin stand gains its pager, settings search, motion option and bell tip.

Core changes:

  1. Connection contract, SCHEMA batch 1 (core/classes/pdo.php, core/system.php, admin/modules/config.php):
  2. Database::__construct() takes the collation and sets SET NAMES, a fixed sql_mode and time_zone from date('P')

    • A zone offset the server refuses falls back to the zone name, a refused name is logged and the site keeps running
    • The zone line of core/system.php, $conf['db']['sync'] and the panel switch dbsync with its constants are gone
  3. The referer list groups by its newest row, so it runs under ONLY_FULL_GROUP_BY
  4. setup.php, update.php, tools/node-profile.php and the probes pass the configured collation
  5. Text columns, SCHEMA batch 2 (storage/update/sql/*, core/security.php, writers in admin/ and modules/):
  6. utf8mb4_unicode_520_ci comes from {collate} of config/db.php alone; the 6.2 path converts column by column (setconv)
  7. ip, modul, scope, lang and user names take one declaration each; filterCutText() cuts a stored, escaped value without splitting an entity, and every uncut writer uses it

  8. Fixed choices (bpos, action, lang, modul, apar) are checked against their values instead of cut
  9. Time columns, SCHEMA batch 3 (storage/update/sql/*, mail, node service, rating, oauth, blocks, messages):
  10. Timers in unix seconds: _mail.ntime and locked, _node_publish.due, _blocks.time, _rating.time

    • The mail claim and its reaper, the publication queue and the poll window read UNIX_TIMESTAMP()
  11. Moments as DATETIME: _blocks.expire and _message.expire (NULL for none, set from days in the panel), _rating_votes.created and annulled, _rating_targets.created, _user_oauth.linked and lastlog

  12. _users.lastvis is NULL for never; the forum new mark compares ltime with getUserLastVisit()
  13. _users_temp.time leaves, the activation sweeps by regdate; format_time() takes a NULL moment
  14. The 6.2 path converts values through runiftype(), a step that runs only while a column keeps its old type
  15. Journals plan and roadmap (docs/9-ADMIN-LOG-2026.md, docs/ROADMAP-2026.md, docs/2027-*.md, docs/7-SCHEMA-2026.md):
  16. The action journal goes to storage/logs/admin.log in the JSON format of Logger, written in checkAdminPost()
  17. The login table _login_log of the 2027 core plan moves into it; logins are written at one point
  18. Roadmap steps 58-62 stand before the remaining schema batches
  19. Admin stand (public/demo/admin/*, public/demo/ux-07-motion.html):
  20. Pager line aligned, a way down in the upper pager, only the key tip where no pages are
  21. Settings search beside the heading, motion switch in Options, the bell as a theme tip on hover
  22. Key tip in subtle green and scroll arrows in subtle blue, full colour on hover

Benefits:

  • One connection state on every path: NOW() and date() write the same moment, MySQL and MariaDB refuse alike
  • A write never fails on an overlong value, and a time column can no longer hold text
  • Every journal of the site is planned in one place, without a second record of a login

Technical notes:

  • Breaking: Database::__construct() requires the collation; _users_temp.time, $conf['db']['sync'] and dbsync are gone
  • Breaking: _mail, _node_publish, _blocks, _message, _rating*, _user_oauth and _users.lastvis change type; update.php converts a 6.2 base, the stand was converted by hand and /schema shows no drift

  • New guards: SchemaConventionTest, SchemaTimeTest, the time values of UpdateSiteTest
Feature: The group list of the panel becomes a ladder with a rank composer, the rank pictures leave, and the ranks plan closes into its reference
Автор: Eduard Laas | Дата: 01:59 12.10.2026

Roadmap steps 52 and 53, RANKS batches 2 and 3: the groups screen wears the face of the stand grp-10 - the point groups as a ladder by threshold and the special groups by members, a form that composes a rank from presets, icons, counts and colours beside a preview and two contrast tiles, and opens a new group as the next step of the ladder. The pictures of the site theme are deleted, and the plan is deleted with its lasting part in the reference and the help.

Core changes:

  1. Ladder (admin/modules/groups.php, partials/group-ladder.html, fragments/group-step.html):
  2. groups() counts the members of every group in one query with GROUP BY: a special group the users whose grp it is, a point group every user at or above its threshold

  3. two lists of one step: the threshold or the mark "Специальная", the node on the rail, the rank before the name in the group colour, the description, "Участников: N" over the share bar, the dial; the special list has a dashed rail

  4. the name links to the form; the members link goes to the user list filtered by group or by threshold, the address op=users_show the old dial carried reached no handler

  5. each list reverses in place by its sort button; nothing is stored
  6. Composer (admin/modules/groups.php, partials/group-form.html, assets/js/admin-ui.js):
  7. add() builds three parts: eighteen presets (getRankPresets()), the console with forty icons, the icon window, the counts and the rank swatches (getRankTones()), and the group fields with fourteen swatches (getGroupTones())

  8. getGroupNext() opens a new group filled as the next step: threshold half again above the top, rounded up, the top rank with one more lit mark, the next group colour; an alert names the top step

  9. setRankForm() runs the preview at three sizes, the light and dark contrast tiles against their own surface, the hint where the threshold will stand, the toolbars with one Tab stop and arrow keys, and the leave guard through setConfirmTask() and beforeunload

  10. save() writes icon:lit:total:#rrggbb, clamps the counts, honours rank_sync, refuses a bad icon or colour and a threshold another point group holds

  11. the icon window announces its pick with an input event, and the icon picker takes an accessible label
  12. Theme (admin base.css and theme.css, lite base.css and theme.css, tools/ui-contract.php, tools/ui-audit-baseline.json, tools/ui-contrast.json):

  13. sl-ladder-* and sl-rank-* of the panel; a painted group name reads --sl-group-text, which clamps the lightness of currentColor in light-dark() so any stored colour holds 4.5:1

  14. new admin tokens --sl-group-text, --sl-ladder-width, --sl-ladder-ring, --sl-ladder-bar-height, --sl-ladder-bar-mix, --sl-wheel-bg, --sl-wheel-eye-width; --sl-d-group, --sl-d-share and --sl-d-swatch registered under data

  15. .sl-profile-rank-img and the site token --sl-rank-height gone, the third recorded exception to the frozen API
  16. the contract records the chosen icon of the console and the open tab of the icon window as an allowed duplicate
  17. Pictures (public/templates/lite/images/ranks/):
  18. the fourteen rank pictures and the folder deleted
  19. Strings (admin/lang/*.php):
  20. the captions of both screens, the eighteen preset names and the colour names in six locales
  21. _POINTSNEEDED reads "Порог пунктов", _CANCEL is new, _GROUPSI and _COLOR gone with their only reader
  22. Tests (tests/Unit/GroupFormTest.php, tests/Support/group_probe.php):
  23. save() refuses a taken threshold and a bad icon or colour, ignores the threshold of a special group, clamps the counts and binds the rank to the group colour

  24. getGroupNext() on the stand ladder, on a low ladder and on an empty one
  25. Reference and plans (admin/info/groups/ru.md, docs/TEMPLATES.md, docs/VERSIONS.md, docs/ROADMAP-2026.md, docs/8-RANKS-2026.md, core/system.php):

  26. the help describes the ladder and the composer as they stand; it stays Russian only, as every help of the panel
  27. "Rank" and "Group Ladder And Rank Composer" in the template reference; the ranks in VERSIONS
  28. the comment and the reference no longer say the panel reads ranks from the site theme
  29. the plan file deleted, steps 52 and 53 ticked

Benefits:

  • an administrator sees the ladder of the site at a glance and composes a rank with its contrast measured
  • a new group arrives as the next step instead of an empty form
  • the rank is described as it stands, with no plan left to drift from the code

Technical notes:

  • Breaking: templates/lite/images/ranks/ is gone; a site's own pictures are mapped by update.php
  • Breaking: the site API loses --sl-rank-height and .sl-profile-rank-img
  • no schema, address or API change
  • tests: ui:gates green, phpstan and php-cs-fixer clean; the 11 failing NodeProfileTest methods fail on the clean HEAD as well (installer probe); AssetVersionTest fails on the stand until the configuration is rebuilt, its version map in config/local.php predates the edit of lite base.css

Вчера (11.10.2026)
Feature: The rank of a group is a row of Bootstrap Icons drawn from one stored string, and the pictures leave every reader
Автор: Eduard Laas | Дата: 23:56 11.10.2026

Roadmap step 51, RANKS batch 1: _groups.rank changes meaning from a picture file of the theme to the string icon:lit:total:#rrggbb, one parser and one renderer draw it as N lit marks of M in the colour of the rank, and the seven readers that built a path to images/ranks/ pass the raw column instead. The migration writes the darkened tones that hold 3:1 on both surfaces.

Core changes:

  1. Rank helpers (core/system.php):
  2. getRankData() splits the string and checks the icon, the colour and 0 <= lit <= total, 1 <= total <= 10; anything else, an old picture name included, gives an empty array and no rank

  3. getRankView() renders the rank fragment with the group line as title and accessible name, or nothing
  4. Readers (core/user.php, modules/forum/index.php, modules/account/index.php, blocks/user_info.php, modules/users/index.php, admin/modules/groups.php):

  5. the comment, the forum post, the profile, the user block, the group table of the users statistics and the list of the panel call getRankView() on the raw column; no reader builds a path or tests a file any more

  6. the group table of stats() was a seventh reader the plan had not named
  7. groups() no longer needs $conf
  8. Fragment and theme (fragments/rank.html of both themes, theme.css of both themes, tools/ui-contract.php):
  9. one markup in both themes: sl-rank with role="img", the marks aria-hidden, the lit ones sl-is-active
  10. the lit mark takes --sl-d-rank, written by the fragment and registered under data; the muted one --sl-border-strong; the marks stand at --sl-space-1 and take the size of the place they are printed in

  11. Templates (fragments/comment.html, fragments/forum-post.html, partials/account-profile.html, partials/block-user-info.html):

  12. rank_link, rank_src, rank_url, has_rank_image and rank_alt become one rank_html
  13. the dead rank_html branch of the forum post, which no caller fed, is gone, so the personal title stays escaped
  14. Migration (storage/update/sql/table_update6_3.sql):
  15. one UPDATE over picture names maps the fifteen pictures onto the icon strings of the plan; a site's own picture becomes no lit mark of five in its group colour; only values ending in a picture extension change, so a second run changes nothing

  16. run on the stand: 11 rows, then 0
  17. Tests and plans (tests/Unit/RankDataTest.php, tools/ui-audit-baseline.json, docs/8-RANKS-2026.md, docs/ROADMAP-2026.md):

  18. RankDataTest: a valid string, each bound, old picture names, bad icons, bad colours, the marks of the view
  19. the plan records the seventh reader, --sl-d-rank and font-size: inherit; step 51 ticked

Benefits:

  • a rank works in every theme without picture files and can be any icon, count and colour
  • one parser and one renderer instead of seven ways to build a path

Technical notes:

  • Breaking: _groups.rank holds icon:lit:total:#rrggbb; an old picture name is not drawn until update.php ran
  • Breaking: the templates take rank_html in place of rank_link, rank_src, rank_url and has_rank_image; a theme with its own copy of these templates shows no rank

  • the group form of the panel still offers pictures until batch 2; saving a group there writes a file name back
  • no schema, address or API change
  • tests: ui:gates green, phpstan and php-cs-fixer clean; the screenshot rig moved only forum-topic and profile; the 11 failing NodeProfileTest methods fail on the clean HEAD as well (installer probe)

Feature: The pager pages with the arrow keys, explains them in a tip, and the pager plan closes into its reference
Автор: Eduard Laas | Дата: 23:30 11.10.2026

Roadmap step 50, PAGER batch 2: the left and right arrows follow the back and forward link of the first pager on show, an "i" beside "to the top" explains the keys in the system tip, and the pager plan is deleted with its lasting part in the template reference and the change log.

Core changes:

  1. Pager keys (public/plugins/system/slaed.js, core/helpers.php):
  2. setPagerKeys() clicks the rel="prev" or rel="next" link of the first visible pager outside a dialog, so an htmx pager swaps its part as it does for the pointer

    • a key already handled, a key with a modifier, a field, an editable, a tab list, an open window and the file desk
keep their arrows
  • getTplPagerView() hands each arrow its key_name, ArrowLeft or ArrowRight
  • Pager fragments (fragments/pager.html, fragments/pager-link.html of both themes):
  • the arrows carry aria-keyshortcuts
  • the side group gains the key tip sl-pager-keys: a quiet round trigger with a tooltip panel listing the two keys as kbd and the note that a field keeps them

  • the pair stays byte for byte the same in lite and admin
  • Pager theme (theme.css of both themes, tools/ui-contract.php, tools/ui-audit-baseline.json):
  • sl-pager-tip, sl-pager-tip-head, sl-pager-tip-keys, sl-pager-tip-note and the key caps on existing tokens
  • the open or hovered trigger wears the tint of a pressed control; the tip is hidden under pointer: coarse
  • the contract records the key list and the panel login list as an allowed duplicate group
  • Strings (lang/*.php):
  • _PAGEKEYS, _PAGEPREV, _PAGENEXT, _PAGEKEYNOTE, _KEYLEFT, _KEYRIGHT in six locales
  • the French _PAGETOP reads "Haut de page"
  • Tests (tests/Unit/PagerKeysTest.php, tests/Unit/PagerViewTest.php):
  • PagerKeysTest: the listener stands aside where the arrows belong to someone else, follows the first pager on show and clicks its link; the tip in both themes and its strings in six locales

  • PagerViewTest: the arrows carry their key
  • Reference and plans (docs/TEMPLATES.md, docs/VERSIONS.md, docs/ROADMAP-2026.md, docs/6-PAGER-2026.md):
  • "Segmented Switch" and "Pager" in the template reference; the switch and the pager in VERSIONS
  • the plan file deleted, step 50 ticked

Benefits:

  • a reader turns the pages of a list from the keyboard without hunting for the arrow buttons
  • the pager and the switch are described as they stand, with no plan left to drift from the code

Technical notes:

  • Breaking: a theme with its own pager.html or pager-link.html has no key tip and no aria-keyshortcuts; the keys still work as long as its arrows sit in .sl-pager-nav with rel

  • no schema, address or API change
Feature: A Node list hints its search, the Node header plan closes into its reference, and the pager takes the face of its stand
Автор: Eduard Laas | Дата: 19:36 11.10.2026

Roadmap steps 47 to 49: the search field of a Node list offers up to five titles of its type as the reader types, the header plan is deleted with its lasting part in the reference, and the pager of both themes becomes the approved face of pg-09 and pg-14 - the arrows and the numbers on the segmented rail with its travelling plate, "to the top" beside them, the page line under them, narrowing by its own column.

Core changes:

  1. Search hints (core/user.php, public/index.php, modules/node/index.php, partials/node/head.html, partials/node/hints.html):
  2. getNodeHint() answers the light route go=1&op=getNodeHint with up to five links to what the search of the type finds under the read rights of the visitor; a word under the search minimum or a type outside the search answers nothing

  3. the field is a combobox that asks after 300 ms through htmx; the list #sl-node-hints is a listbox
  4. Hint keys and face (public/plugins/system/slaed.js, lite theme.css):
  5. setHintKeys(): the arrows walk the hints round by aria-activedescendant, Enter opens the chosen one, Esc closes the list before the lens hears it; the list opens only with options and closes when the focus leaves

  6. sl-node-hints and sl-node-hint in the lite theme
  7. Node header reference (docs/NODE.md, docs/TEMPLATES.md, docs/VERSIONS.md, docs/5-NODE-HEAD-2026.md):
  8. the header, the views, the live list, the search and the feed described as they stand; the change in VERSIONS
  9. the plan file deleted
  10. Pager view (core/helpers.php):
  11. getTplPagerView() marks each number of the window is_far or is_near the current page, never an anchor, and hands range_from, range_to and range_text to the pager when the caller names the page size and the total

  12. the arrows carry rel="prev" and rel="next"; the dots are a pager-link cell instead of an inline badge
  13. Pager fragments (fragments/pager.html, fragments/pager-link.html, fragments/inline-badge.html of both themes):
  14. one pair of files, byte for byte the same in lite and admin: a nav labelled _PAGENAV, the arrows as sl-but-mini, the numbers as sl-seg-cell in sl-seg sl-seg-pager with data-sl-knob="pager", the side group with "Наверх" on #top, the line "Страница 3 из 10 · Показаны 21–30 · Всего 97"

  15. the admin sl-pnum row and the is_pager_dots branch of both inline badges are gone
  16. Pager theme (theme.css and base.css of both themes):
  17. .sl-pager is the container its steps measure: under 520px of its column the far numbers and the range go, under 320px the neighbours too; the site centres the row, the panel starts it at the left and pushes the line right

  18. the digits of the rail read at --sl-text for AA, a number in hand takes --sl-primary-strong
  19. the forum foot gives the pager a width and wraps it under the buttons; the panel list foot wraps under 560px
  20. --sl-pnum-width, --sl-pnum-height, --sl-pnum-border, --sl-pnum-arrow-width, --sl-pnum-arrow-height and the admin --sl-card-shadow struck from the frozen API by the owner's decision: their one reader was the drawn arrow of the old panel pager

  21. Strings (lang/*.php):
  22. _PAGENAV and _PAGERANGE in six locales
  23. Tests, gates and plans (tests/Unit/PagerViewTest.php, tests/Unit/NodeRouteTest.php, tests/Support/route_probe.php, tools/ui-contract.php, tools/ui-audit-baseline.json, tools/ui-contrast.json, tools/ui-shots.mjs, docs/6-PAGER-2026.md, docs/ROADMAP-2026.md):

  24. PagerViewTest: the anchors, the dots, the marks at the first, a middle and the last page, the arrows, the range
  25. NodeRouteTest::theSearchHintsFollowTheSearchOfTheType over real requests
  26. the contrast crawler measures the chosen cell of a rail against the plate under it, not against the track
  27. the contract drops the pager fragment forks and the stale duplicate group, the freeze exception is recorded
  28. steps 47 to 49 ticked, the decisions of PAGER batch 1 recorded

Benefits:

  • a reader reaches a material from the search field without leaving the list
  • one pager markup for both themes, readable on a phone and in a 329px column, with the plate travelling between pages

Technical notes:

  • Breaking: the pager fragments take new keys and print new classes; a theme with its own copy of pager.html or pager-link.html keeps its old face and loses the marks; .sl-pager-nextprev, .sl-pager-prev, .sl-pager-next, .sl-pnum-nav, .sl-pnum-cur and .sl-pnum-dots are gone

  • Breaking: six admin API tokens removed, listed above
  • no schema, address or API change; the light route getNodeHint is a new public read
  • tests: ui:gates green, phpstan and php-cs-fixer clean; the screenshot rig moved only the five pages with a pager; the 11 failing NodeProfileTest methods fail on the clean HEAD as well (installer probe)

Feature: A Node list lives in place, swapping its part on every filter, sort and page, and shows more without a reload
Автор: Eduard Laas | Дата: 03:34 11.10.2026

Roadmap step 46, NODE-HEAD batch 6: the header and the list of a Node type are one part that htmx swaps in place, with the address pushed and the title a reload shows, and "Show more" appends the next page under the cards. Two faults of batch 4 found by the browser check are repaired: the stuck bar flipping on a phone and a header window closed by any swap of the page.

Core changes:

  1. Part answer (modules/node/index.php, core/system.php):
  2. setNodeList() answers an HX-Request with the part alone headed by its <title>, every answer with Vary: HX-Request

  3. getHeadTitle() is the one rule of the title of a site page; setHead() and the part both call it
  4. more_href links the next page under every view but the rail; _NODE_MORE in six locales
  5. Live list template (partials/node/list.html, partials/node/head.html, fragments/mode-switch.html):
  6. #sl-node-list is the target of its swaps and the history element of htmx without a snapshot cache, so back and forward ask the part again

  7. the filter toolbar, the three windows and the foot #sl-node-foot are boosted; "Добавить" carries hx-boost="false"; the view switch posts through hx-post

  8. "Показать ещё" #sl-node-more appends the cards of the next page to #sl-node-items by hx-select and redraws the foot by hx-select-oob

  9. Script and theme (public/plugins/system/slaed.js, lite theme.css):
  10. data-sl-swap-reveal brings a swapped part back when its head went above the screen
  11. setToggleBlocks() gives a block its default once, marked by data-sl-toggle-ready; a later run keeps the state it stands in, read by isToggleOpen() as setToggleBlock() reads it

  12. .sl-node-list takes overflow-anchor: none, so scroll anchoring no longer unsticks the bar
  13. Tests and plans (tests/Unit/NodeRouteTest.php, tests/Support/route_probe.php, docs/5-NODE-HEAD-2026.md, docs/ROADMAP-2026.md):

  14. NodeRouteTest::anHtmxRequestGetsTheListPartAlone over real requests: the part, the whole page, Vary, the title, "Show more" and the boosted regions

  15. the decisions of batch 6 recorded, step 46 ticked

Benefits:

  • a reader narrows, sorts and pages a list without a full reload, and every state keeps its own address
  • one title rule for a page and its swapped part

Technical notes:

  • no schema, address or API change; a list answers the same URL with the part to htmx and the page otherwise
  • a theme with its own copy of partials/node/list.html works as before without the live part
Эта неделя (10.10.2026)
Feature: A Node list wears the face of its stand with windows, month heads and counted words, and offers the views of its type
Автор: Eduard Laas | Дата: 23:01 10.10.2026

Roadmap steps 44 and 45: the draft header of a Node list becomes the approved face of nh-13 - a sticky bar with the windows of the categories, the letters and the sorts, month heads and counts in the plural form of the locale - and a type now offers views of its list: cards, compact, list, accordion, tiles and a rail, the choice of the visitor kept in a cookie. The stand pages of the panel UX plan for 2027 follow the owner's choices of the menu and gain the rail.

Core changes:

  1. Header face (partials/node/head.html, theme.css, base.css, modules/node/index.php):
  2. sl-node-head sticks with data-sl-sticky; the windows of the categories, letters and sorts open one at a time through data-sl-toggle-group; the lens opens the search over the stuck bar

  3. the stuck bar takes the lens below 900 px of its own width, measured by @container on the bar
  4. token --sl-node-find-width with the component node-find in the contract
  5. Windows and counts (core/system.php, core/classes/node/query.php, category-row.html):
  6. setCategories() draws "all materials" first and the top level with its subcategory chips, the chosen one marked
  7. getLetterNavi() marks the chosen letter and tells each count; NodeQuery::getNodeLetters() counts the letters of a category live, the stored counts serve the list without one

  8. getPluralForm() picks the form a constant carries by the plural rule of the locale (three forms ru, uk, pl)
  9. Month heads (fragments/date-head.html, partials/node/list.html, privat-list.html, modules/account/index.php):
  10. a list by publication in cards or compact is headed month by month with the count of its cards on the page
  11. one date head for the mailbox and the Node list: sl-pmf-day became sl-date-head, its token keeps its name
  12. Views of a list (core/classes/node/query.php, config/node.php, modules/node/profiles/*.json):
  13. list.views checked against NodeQuery::VIEWS, its first view the default

    • an empty list, the default, offers the one view of the display mode by NodeQuery::MODEVIEW
    • news offers cards, compact and tiles; docs list and rail; faq accordion and list
  14. the type form of the panel gains the allowed views and the default view
  15. View switch and cards (mode-switch.html, modules/node/index.php, docs/card.html, media/card.html, theme.css):
  16. the list answers a POST of the switch: its token of scope view sets the cookie view-<type> and answers 303 to the same list; a view outside the type or a foreign token changes nothing, a stale cookie falls back

  17. fragments/mode-switch.html draws the colour mode and the view switch, cells carry aria-pressed
  18. list is node/docs/card with the thumbnail and the date, accordion node/faq/card, tiles node/media/card with the play mark only for media; containers sl-node-compact, sl-node-row, sl-node-tiles, sl-node-rail

  19. the rail is the tabs of slaed.js on two panes; sl-pmf-split/aside/view renamed to sl-duo/-aside/-main
  20. partials/node/media/list.html deleted, the common list draws the tiles
  21. Strings (lang/, admin/lang/, modules/node/lang/, modules/node/admin/lang/):
  22. _PRSORT and the panel _SORT became one _SORT in lang/; _CATVORH removed with the category toggle
  23. the views, the windows and the counted materials in six locales
  24. Panel UX stand (public/demo/ux-01 to ux-09, demo.js, demo.css, docs/2027-ADMIN-UX.md):
  25. the menu keeps the two panel blocks with a filter above them in place of four groups
  26. the list view icons, saved views that keep the filter, the view and the sort, the icon pair of the top bar
  27. ux-09-rail.html: the menu folds into a rail of icons with the same fan as the full menu
  28. Tests and gates (NodeRouteTest, NodeQueryTest, NodeProfileTest, SegKnobTest, route_probe.php, node_probe.php, tools/ui-contract.php, tools/ui-audit-baseline.json, tools/ui-contrast.json):

  29. a list answers only the views of its type and falls back to its first; POST answers 303, PUT 405
  30. header links, counts, month heads and letters of a category over real requests
  31. list.views refused when repeated or outside the registry

Benefits:

  • one face for every Node list, its controls links the server answers
  • a type chooses how its list reads without a template of its own

Technical notes:

  • Breaking: config/node.php needs node.defaults.list.views ([]); without it every type is refused at list
  • Breaking: POST to a Node list answers 303 instead of 405
  • docs/5-NODE-HEAD-2026.md records the decisions of batches 4 and 5
Feature: A Node list gets a header of its own with counts, sorts and personal filters, the feed is fixed, and the segmented switch lands
Автор: Eduard Laas | Дата: 16:39 10.10.2026

Roadmap steps 38 to 43: the editor plan closes into its reference, the segmented switch with its travelling knob becomes a part of both themes, and the Node list header is built in its first three batches - the decisions, a feed that names and dates its list and revalidates, the script of the bar, and the data of the header with a draft template. The rank plan and the panel UX plan for 2027 join the docs with their stand pages.

Core changes:

  1. Editor reference (docs/EDITORS.md, docs/TEMPLATES.md, docs/VERSIONS.md, docs/4-EDITOR-2026.md):
  2. the shell, its runtime, the manifests with a list type and what a page may tell an editor described as they stand
  3. the plan file deleted, its lasting part in the reference
  4. Segmented switch and the top link (slaed.js, base.css and theme.css of both themes, mode-switch.html, foot-controls.html):
  5. sl-seg with data-sl-knob: a knob that travels to the chosen cell, the header mode switch stands on it
  6. one "Наверх" on #top with smooth scrolling in CSS; getFootControls() and the mode switch lose their dead keys
  7. dead flags of link.html, span.html and toggle-form-block.html cleared; tests/Unit/SegKnobTest.php
  8. Node feed (core/user.php, tests/Support/route_probe.php):
  9. the channel names the site, the type and a readable category; links its list; lastBuildDate is the newest item
  10. a closed or unknown category answers 404; the tag is computed before rendering and answers 304
  11. the copyright names the site
  12. Header script (slaed.js, public/demo/nh-08 to nh-13, demo.js, demo.css):
  13. data-sl-toggle-group, data-sl-sticky with data-sl-stuck, data-sl-lens; the stand pages stand on them
  14. Header data (modules/node/index.php, partials/node/head.html, list.html and media/list.html of lite):
  15. getNodeHead() replaces getNodeNavi(): count with "N of M" for a narrowed list, the sorts of the type, the other direction, reset, the feed with the category, the form and the category switch; every link keeps the filters

  16. getNodeSortWay() is the one default direction of a sort for the list and the header
  17. personal filters new=1 and fav=1 for a signed-in visitor, any other value 400, fav on a type without favorites 400; a guest's one narrows nothing and is answered noindex

  18. Counts and their cache (core/classes/node/query.php, core/system.php, core/classes/node/service.php):
  19. NodeQuery::getNodeTally() counts the total, the main and extra categories, the first signs and the next publication or expiry; getNodeReadSet() names the readable set; setNodeFavorite() and getNodeOwnCount() serve the filters

  20. getNodeCountMap() keeps one file per type, an entry per readable set, until a write, a type version or the next publication; deleteNodeCountMap() is called after every material write and by deleteCategoryMap()

  21. category tiles carry their count, a closed tile none; a letter without materials is not linked; the total shows
  22. Previous visit (core/system.php, modules/account/index.php):
  23. getUserLastVisit() keeps lastvis per account in the session; updateSessionTrack() and setUserLogin() ask it before they move the column

  24. Constants (lang/.php, admin/lang/.php, modules/node/lang/.php, modules/node/admin/lang/.php):
  25. _ASC and _DESC moved from the panel language to the site language, _NODE_UPDATED to the site language of Node
  26. _NODE_SINCE and _NODE_INFAV in six locales
  27. Plans and stands (docs/ROADMAP-2026.md, docs/5-NODE-HEAD-2026.md, docs/6-PAGER-2026.md, docs/8-RANKS-2026.md, docs/2027-ADMIN-UX.md, docs/NODE.md, public/demo/grp-01 to grp-10, public/demo/ux-01 to ux-08):

  28. the decisions of NODE-HEAD batches 0 and 3 recorded, steps 38 to 43 ticked
  29. the rank plan joins the roadmap as steps 51 to 53, the schema steps move to 54 to 61
  30. the panel UX plan for 2027 with its stand pages, outside the roadmap
  31. Panel settings (admin/modules/config.php):
  32. the CSS file field of the settings is no longer required
  33. Theme gates (tools/ui-contract.php, tools/ui-audit-baseline.json, tools/ui-contrast.json):
  34. the contract and the registries follow the switch and the new rules

Benefits:

  • a reader sees how many materials a list holds and narrows or sorts it with plain links that keep each other
  • the counts cost no query on a cached request and change at the moment a material does
  • the feed is a list of its own for readers and search engines, with revalidation instead of no-store

Technical notes:

  • breaking: partials/node/list.html receives head_html instead of navi_html; getNodeNavi() is gone; a theme with its own copy of the list template draws no header until it follows

  • breaking: getFootControls() lost its label and debug parameters
  • new data cache file per Node type: nodecount; no schema change
  • tests: NodeRouteTest gains the feed and two header tests, NodeQueryTest the new public methods, SegKnobTest; ui:gates green, phpstan and php-cs-fixer clean; the screenshot rig moved only node-list as intended

  • the 11 failing NodeProfileTest methods fail on the clean HEAD as well (installer probe)
Эта неделя (09.10.2026)
Feature: The editor shell previews a template with bundled samples and a text through a route, and the screenshot rig runs four times faster
Автор: Eduard Laas | Дата: 19:02 09.10.2026

Step 37 of the roadmap, EDITOR batch 10: every frame of the shell can show what the reader will see, a file template filled with sample files of the panel theme and a text rendered by the parser through a POST route, both in a sandboxed frame. The screenshot rig that guards such changes now walks the manifest in parallel, shoots only the states a change can reach, and no longer reports the live figures of the stand as theme changes.

Core changes:

  1. Preview data and route (core/classes/editor.php, core/helpers.php, public/index.php):
  2. preview is a key of the page like vars: 'text' or the sample values of a template with an address to open

    • getPageData() validates it, getViewData() hands the frame its route, token, module and store, or the values
    • getTplTextarea() passes 'text' for every field
  3. getEditorPreview() answers go=1 on the site and go=5 in the panel, POST only (405 otherwise)

    • the save filter of the format and checkEditorTextRoom() run first, as a save runs them
    • an attachment of a closed owner is drawn in the context of an unsaved text, [getUploadOwner($mod), 0]
    • the answer ends there, so the debug block of the door stays out of the frame
  4. File template samples (admin/modules/uploads.php, core/classes/filemanager.php, public/templates/admin/assets/samples/):
  5. getTemplateSample() fills the variables as the parser does for one file: picture, sound, video, PDF, archive
  6. four bundled samples, 24 KB together; a PDF falls back to its link in the sandbox and the pane links the sample
  7. FileManager::getFileKind() becomes public and static for it
  8. Shell and runtime (public/plugins/system/editor.js, editor-frame.html and editor-kit.html of both themes):
  9. the eye in the capsule and a palette row; the pane under the text, beside it on the full screen
  10. the page is written by srcdoc with the stylesheets and colour mode of the page, sandbox="allow-same-origin" without scripts
  11. an older answer is dropped, the frame height follows the page through a ResizeObserver
  12. Theme (theme.css of both themes, tools/ui-contract.php, lang/*.php):
  13. pane, sheet and side-by-side full screen rules on existing tokens; --sl-d-view-height registered
  14. _EDITOR_SAMPLE in six locales
  15. Screenshot rig (tools/ui-shots.mjs, tools/ui-shots.json, package.json):
  16. the viewport is stretched to the document once instead of a full-page shot per try, which fired a resize every time
  17. a pool of four slots, each with its own PHP session, saved between runs
  18. a DOM snapshot beside every picture; a check shoots only a state whose DOM moved, which loaded a public file changed since the capture, or which a changed CSS rule still matches; a DIFF names the elements that moved

  19. PNG comparison in Node through pngjs with the former metric; noise floors kept between runs and measured from a fresh load
  20. masks after a step that navigates, no focus in a base state, list boxes scrolled alike
  21. the footer timing of the panel and the live rings, bars and charts of the presentation are masked

Benefits:

  • an author sees the rendered text or template before saving, in every engine of the shell
  • a full before takes about 3.5 to 4 minutes and an after about 3, against 10 to 15 for each before
  • the false differences of the front page, the presentation and the file block code state are gone

Technical notes:

  • new route op getEditorPreview in go=1 and go=5; no schema change
  • new dev dependency pngjs 7.0.0
  • tests: EditorFormatTest::previewFollowsItsCaller; ui:gates green, phpstan and php-cs-fixer clean
  • the 11 failing NodeProfileTest methods fail on the clean HEAD as well (installer probe)

Страница 1 из 126. Всего: 1252

1 2 3 4 5 6 7 8 9 10 … 126
Хотите опробовать SLAED CMS в действии?
Идеи и предложения
Обратная связь
Подтверждение

Поделиться
QR-код

Предварительный просмотр