CMS changes landed in
[layout.php](/Users/tyemeclifford/Documents/GH/blog/themes/neon/layout.php),
[style.css](/Users/tyemeclifford/Documents/GH/blog/themes/neon/assets/style.css),
[app.js](/Users/tyemeclifford/Documents/GH/blog/themes/neon/assets/app.js),
and
[lone-embed.php](/Users/tyemeclifford/Documents/GH/blog/lone-embed.php):
skip link, named search/forms, current page state, live notices/empty
states, labelled media/embed controls, visible focus states, theme
control pressed states, and a focus-trapped/lightbox dialog with proper
ARIA.
Mac app changes landed in
[main.m](/Users/tyemeclifford/Documents/GH/blog/macclient/AppKitClient/main.m),
and I rebuilt
[TCMS](/Users/tyemeclifford/Documents/GH/blog/macclient/TCMS.app/Contents/MacOS/TCMS):
AppKit controls/tables/fields/previews now get accessibility
labels/help/value text, workspace sections are named, media/comment
tables expose useful context, and status messages are announced via
macOS accessibility notifications.
Manual content actions now confirm clearly:
Draft shows “Draft Saved”
Publish shows “Published”
Update shows “Updated”
Delete first asks “Delete Post/Page?” and then shows “Deleted” after the
API succeeds
Autosave stays quiet so it does not spam popups.
Updated:
[macclient/AppKitClient/main.m](/Users/tyemeclifford/Documents/GH/blog/macclient/AppKitClient/main.m)
[macclient/README.md](/Users/tyemeclifford/Documents/GH/blog/macclient/README.md)
[CHANGELOG.md](/Users/tyemeclifford/Documents/GH/blog/CHANGELOG.md)
Changed:
[themes/neon/assets/app.js](/Users/tyemeclifford/Documents/GH/blog/themes/neon/assets/app.js)
Scans each single post’s .markdown content.
Collects images, native videos, shortcode/video iframes, and direct
image/video links.
Opens media in a lightbox with Previous/Next, count, caption, Escape
close, and arrow-key navigation.
Clicking a displayed image advances to the next item.
[themes/neon/assets/style.css](/Users/tyemeclifford/Documents/GH/blog/themes/neon/assets/style.css)
Added clickable media styling, embed “View” buttons, and responsive
lightbox layout.
Works in dark and light modes.
[CHANGELOG.md](/Users/tyemeclifford/Documents/GH/blog/CHANGELOG.md)
Added the feature note.
What changed in
[main.m](/Users/tyemeclifford/Documents/GH/blog/macclient/AppKitClient/main.m):
Media list now paginates with Previous/Next and 10/25/50/100 per page.
Selecting an image loads an inline preview.
Selecting audio/video loads an AVPlayerView with native playback
controls.
Added an Open button and double-click support to open media in the
default Mac app.
Media file sizes now display as readable values like 1.4 MB.
I also updated
[build-app.sh](/Users/tyemeclifford/Documents/GH/blog/macclient/build-app.sh)
to link AVKit and AVFoundation, and to honor the app’s
CFBundleExecutable from Info.plist so the rebuilt bundle launches with
the expected TCMS executable.
Changed:
[app/View.php](/Users/tyemeclifford/Documents/GH/blog/app/View.php):
generated URLs now honor a base path like /blog.
[app/Config.php](/Users/tyemeclifford/Documents/GH/blog/app/Config.php):
added base_path support and derives it from base_url or SCRIPT_NAME.
[app/App.php](/Users/tyemeclifford/Documents/GH/blog/app/App.php): route
parsing strips the base path, and PHP can safely serve theme/upload
assets for virtual subdirectory previews.
[.htaccess](/Users/tyemeclifford/Documents/GH/blog/.htaccess): removed
hardcoded RewriteBase /.
[themes/neon/layout.php](/Users/tyemeclifford/Documents/GH/blog/themes/neon/layout.php):
root-relative social links like /feed.xml now become /blog/feed.xml.
[README.md](/Users/tyemeclifford/Documents/GH/blog/README.md):
documented subdirectory setup.
What changed:
Replaced the cache/search/scoring flow with a simpler weighted search.
Search cache now stores only plain page fields: title, description, raw
content, tags, category.
Removed the persisted normalized search payloads and legacy helper
paths.
Search renders through normal listing templates for theme compatibility.
Added fail-open behavior: unexpected search errors log and return no
results instead of blanking the page.
Kept excerpts and highlighting, but made them plain-text based and
safer.
The important change: search still intercepts the route early, but
before themes render it now feeds results through the normal
home/listing state. That avoids themes going blank when they do not know
how to render a custom search state.
I also made search safer:
Indexes raw page text instead of fully rendered content.
Uses raw content for excerpts.
Guards the search call so exceptions do not white-screen the page.
Updated Dark Neon so it still detects search pages correctly after this
compatibility change.
What changed:
Removed the enlarged nested search cache fields I had added, which could
push larger sites into memory/time failures.
Added a self-heal so existing oversized search caches regenerate into
the smaller format.
Stopped fuzzy matching against full body content; it now only fuzzes
title/tags/category/description.
Hardened search-term splitting and malformed input handling.