- the freshly attached card images did not show: text_only is the
explicit no-image variant, so vitec:attach-card-images now flips a
card to "vertical" whenever it carries (or receives) an image; and
the new placeholder PNGs sat in the sshfs 770 trap - fix-asset-perms
covers them, with public/product-audit added to its targets
- new generic vitec:wrap-cards-grid --page=<slug>: wraps a page's cards
into vitec_cols_33_33_33 containers (b13 columns 221/222/223), three
per container, section-aware - every top-level intro paragraph starts
a section, other element types close it, so the category headings on
/products keep their grids beneath them. Existing grid containers are
pooled and reused, surplus ones hidden
- the first apply aborted mid-move and left a half state (15 empty
shells, three cards moved; diagnosis migrations/check_grid_447.php,
kept) - v2 repairs such states by design: global container pool,
hard asserts after the create pass, try/catch around the move pass,
and a final "no card left top-level" verification
- applied on /products and verified live: 38 cards in 15 grids
(sections 5/7/3/6/2/4/2/6/3 -> 2/3/1/2/1/2/1/2/1 containers), order
intro -> grids -> banner -> faq intact, children delivered in the
known items/contentElements shape
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The headless-mixed set was active although the site runs full headless. On
any request whose Accept header equals exactly 'application/json' it
re-imported the headless page configuration, and 'page < lib.headlessPage'
replaced the whole page object - dropping every field later sets had added:
mainNavigation, footerMenu, metaMenu, megaMenu, jsonLd. The header is not
part of the page cache key, so whichever request rendered first decided what
everyone got, which made it look like a concurrency race. Removing the set
restores the full 15-key payload for every Accept variant.
fix-asset-perms.sh only covered _assets, fileadmin/icons and the extension's
Resources/Public, so anything an importer wrote under public/fileadmin kept
the mount's permissions and returned 403 - most visibly the success-story
images in the megamenu. It now covers public/fileadmin as a whole.