v0.0.49

6 July 2026

Item shard path revised to two-level, FieldTypeCode language option, Dir symlink fixes, Hx::trigger JSON encoding, and resize condition fix.

Added

  • FieldTypeCode language option : the highlighted language is now configurable via the field's language option (defaults to 'php'). Added a create() factory method to read this from field options.

Changed

  • Item shard path revised to two levels: _{field}/{xx}/{uuid}/ (first two hex chars of md5(uuid)). The previous v0.0.46 structure was two-level sharding off a four-char prefix; this normalizes to the same single two-char shard level used elsewhere (e.g. file variant storage).
  • Hx::trigger() : encodes events as a JSON object ({"event": true, ...}) instead of a comma-separated string. The JSON form is required for HTMX 4 to recognize multiple events correctly.
  • Dir::isEmpty() : rewritten to use opendir/readdir for a short-circuit early return; no longer scans the full directory just to check if it's empty.
  • Dir::deleteRecursive() : symlinks are now unlinked (not followed) during recursive deletion.
  • Dir::copy() : symlinks are now recreated as symlinks rather than being dereferenced and copied as regular files.
  • PageFiles image resize condition fixed: operator precedence bug where $w && $size[0] > $w || $h && $size[1] > $h was evaluated incorrectly; now ($w && $size[0] > $w) || ($h && $size[1] > $h).
  • App::render() : shutdown() now called after rendering (not before), so Clockwork and other shutdown listeners see the complete render output.