Loading indication now matches the reference theme's post_ajax() contract:
- Stop overwriting the 加载更多 button label with 正在加载...; the button
keeps its own text and the .post_ajax_loader skeleton carries the busy
state instead.
- Add the reference fallback loader (.loading ring + 加载中...) when no
skeleton exists in the DOM, and reinsert the skeleton after the last
card on every page load like beforeSend does.
- Retext the loader string to 加载中... (zib__('loading')) and make the
ajax_trigger default a translatable string.
- Route ajax-list.js / comments.js / widgets frontend.js through the
.is-loading class instead of inline display, which outranked the class
rule and could freeze the skeleton shut.
- Drop the search.php inline display:none that defeated .is-loading, and
remove the unproduced .post-ajax-loader / [data-aksrt-ajax-loader] shims.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Clicking 加载更多 showed no skeleton at all, and the placeholder shape did
not match the reference theme's post cards.
- Class-name mismatch: pagination.js queried .post-ajax-loader while every
PHP producer emits .post_ajax_loader, so showSkeleton() never found a
target and the loader stayed hidden. Accept both spellings.
- Inline display:none on the loader (pagination, comments, widget tab
panes) outranked .is-loading, so even the correct selector could not
reveal it. Drop the inline style; the reference uses a bare
<div class="post_ajax_loader"> and toggles visibility from JS.
- loadNextPage() set indicator.style.display = "flex", which forced the
.posts-item.card skeleton blocks (inline-block layout) into a single
row instead of stacking vertically — the visible symptom. Remove those
inline writes and drive .is-loading from CSS for every surface.
- Scope the hide/show rules on the class itself rather than requiring an
.ajaxpager ancestor: homepage tab panes, archive streams and comment
lists sit at three different depths.
- Rebuild aksrt_render_placeholder() on zib_get_post_placeholder's
structure — list = t1/k1/k2 + two s1, card = t1 item-heading/k2 + two
s1, thumb wrapped in post-graphic + radius8 item-thumbnail, all carrying
ajax-item so the loader is not mistaken for a real card.
- Add mini/mini_thumb modes so ContentRenderer::placeholder() stops
hand-rolling the same markup; normalize its 'lists' arg to 'list'.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The action bar used a locally invented pill-chip style that overrode the
reference theme's 80px icon-over-text columns, and the JS toggled a
class no stylesheet targeted — so likes/favorites showed no selected
state at all.
- restore reference markup: <svg class="icon"> + <text>/<count> and the
actived class, with data-stat-count/data-base-count preserved
- toggle actived plus a transient action-animation so the lovestar
keyframes finally reach the DOM
- drop the CSS overrides and now-dead action-btn/.action-btn--reward
and .post-actions-card rules; main.css already carried the reference
rules the overrides were shadowing
- Rewrite post_list/filter schema (PHP + JS) with the reference theme's
field set, order, defaults and dependencies; topics fields excluded
(no topics taxonomy), AKSRT private filter_* toggles dropped
- Support dynamic checkbox options in AksField (options as formData key)
so cat_custom_filter.custom_filters lists the custom_filter dimensions
- Map PostDisplay filter settings to the new keys without legacy fallback;
cat_custom_filter now carries lists/dropdown fieldsets and array filters
- Wire the archive chain to reference semantics: cat_custom_filter
overrides per-category filter projects, custom_filter_show gates the
default display, dimension chip groups render on category/tag archives
- Filter archive queries (main query + AJAX endpoint) by _aksrt_cf_{key}
meta with exact-quoted LIKE matching
- Add advanced-filter settings reference contract test
The comment three-dot menu relied on the legacy data-toggle=dropdown
delegation living in comment-move-form.js; when that bundle chain does
not evaluate (stale cache or an earlier top-level error), the menu
appears dead. Move the comment action dropdown to its own top-level
document delegation in comments.js (data-aksrt-comment-drop), keep the
.open-driven CSS contract including the mobile drop-fixed-sm sheet,
sync aria-expanded, close on outside click / Escape / menu item click,
and stay idempotent for AJAX-injected comments.
- Rebuild checkin details modal HTML 1:1 with reference theme:
colorful header c-blue, user card (points/level), daily reward
card and 7-day continuous mini cards
- Signed entry buttons (header dropdown, user-card badge, user
center) become clickable checkin-details-link modal triggers
instead of disabled buttons
- Swap data-signin-btn to details link in place after successful
signin (reference .initiate-checkin replacement behavior)
- Add aksrt-checkin-details-modal runtime shell (modal-mini 400px)
- Remove dead code: legacy lite modal, admin-ajax details handler,
/signin/history route, signin calendar; rebuild public bundles
- Update contract tests to the new checkin modal contract
The image-mode cover reserves +50px for the title/breadcrumb overlay
(calc(scale% + 50px)), but the slide cover wrapper was given a bare
inline padding-bottom by aksrt_render_slider, permanently defeating the
.cover-slide rule, and the video cover used a bare video_scale%.
- aksrt_render_slider: add scale_extra so scale mode emits
calc(ratio% + extra); the single cover passes 50px so all three
modes share one height formula
- drop the unreachable static slide fallback and function_exists guard
(the helper is unconditionally loaded by inc/bootstrap.php), the
always-true cover_url/ep_count conditions, and the dead --scale-ratio
and inner swiper padding emitted in scale mode
- remove the dead cover CSS cluster with no producer: .single-cover-slide
(main.css/main.min.css/cover.css), .single-cover-slider family
(components/base.css), .single-cover-slide-wrap and .single-cover__*
helpers (cover.css), and initSlideCovers in misc.js
- rebuild public bundles via tools/build-public-assets.mjs
- add single-cover-height-contract test covering the shared formula
and the dead-code removals