v0.1.3

<p>A big admin-UX pass: Cmd/Ctrl+K spotlight search replaces the sidebar, per-file metadata fields become a general mechanism, drag-and-drop lands for uploads and reordering, and Users gets the same master-detail treatment as Views.</p>

25 September 2026

Added

  • Admin "spotlight" search: a Cmd/Ctrl+K popup with arrow-key navigation, replacing the always-visible sidebar searchbar - the sidebar itself is replaced by a top toolbar (logo, page title, search, and a dropdown menu for former sidebar links).
  • Drag-and-drop file upload in the Files tab (hand-rolled, reuses the existing file input's htmx wiring via DataTransfer - no external library).
  • Drag-and-drop reordering via sortablejs: view-assigned fields (View::reorderFields()) and repeater-shaped fieldtypes (blocks, stack, via a new ui/repeater/reorder route).
  • Per-file custom metadata fields generalized: App::fileFields(string $type) resolves declared fields from files/{type}/index.json per mime-category (image/video/audio/document/etc.), the same TemplateFields mechanism pages/views already use - alt text is now just the first field defined this way, not a hardcoded constructor parameter on PageFile/PageImage.
  • Users admin page rewritten into the same two-panel master-detail layout as Views; the separate /admin/user/{username} page is removed.
  • Per-view tab visibility: a view's index.json can declare a "tabs" key to restrict which of the built-in editor tabs (data/files/history) it shows.
  • History tab pagination, fetching one entry past the limit to detect "load more" instead of a fixed 20-entry log.

Fixed

  • Page::parents()'s ancestor walk (added last release) could spin unbounded on a malformed/relative URL - replaced with a segment-count-bounded walk.
  • SessionRoot::isLoggedIn() now checks for a session cookie before touching session storage, so anonymous visitors no longer trigger session_start()'s file lock just to answer "are you logged in".
  • App::views() now only lists view directories that actually contain an index.json, excluding template-partial folders like views/fields/views/ui that previously polluted the admin's view list.
  • The file picker converted from a nested <form> to a plain <div> + buttons - a form here silently truncated the outer page-data form it renders inside.
  • Hidden dotfiles (e.g. .DS_Store) are now skipped when listing a page's files and during rebuild.

Changed

  • deploy.php's production composer install now passes --classmap-authoritative.
  • Delete buttons across the admin (files, pages) switched from a labeled button to an icon-only button.

Comments

No comments yet. Be the first!

Loading form…