v0.24.1

Latest release

30 October 2026

Virtual pages served from a source page, page-numbered children, and a paginated admin tree.

Added

  • A view with "virtual": true marks pages that come from a source page and never enter the registry. Page::virtual($name, $data) builds one under its source, with the overlay folder at its URL (if any) laid over the data. The first save() creates that overlay folder, keeping the page's uuid.
  • App::resolve($uri) finds a stored page, or asks the parent through child() when its view sets "children": {"source": true}.
  • relation and pages fields accept a path to a virtual page in place of a uuid. A virtual page owns its files for the request through PageFiles::own().
  • Query::parse($query) reads the query DSL into plain data, so a source page can map it onto an API's own filters.
  • RecordCollection::total() counts every record the query matches, ignoring limit and offset.
  • Page::paginate($query, $limit), Page::pageCount() and Page::pageLimit() slice children by ?page=N. The size comes from pagination.limit in the view's config or the app's (default 20); 0 turns it off.
  • The admin tree pages long child lists with previous, next and a page jump field. treeLimit in the phlat/admin addon config sets the size (default 12).

Changed

  • Admin fields start collapsed. A field's open option defaults to closed; set "open": "open" to start it expanded.
  • The admin page actions moved from the editor footer into the statusbar.
  • phlat registry:check skips the overlay folders of virtual pages.