VITEC headless v14: 5-bug fix unifies plugin renderers + cleanup

Resolves a cascade of TYPO3 v14 breaking changes that left every VITEC
plugin's JSON output silently empty:

1. `list_type` column dropped — all renderer page-discovery queries now
   filter by `CType = 'vitec_X'`.
2. `#[AsAllowedCallable]` attribute added to every public render() —
   without it v14 throws AllowedCallableException, which headless
   silently filters via its "Oops, an error occurred!" guard.
3. `$GLOBALS['TSFE']->id` is null inside JSON cObj context — page id
   now read from the `frontend.page.information` request attribute
   (TSFE fallback kept for legacy entry points).
4. page.tsconfig wizard items migrated to `CType = vitec_X` directly
   (legacy `CType=list, list_type=...` no longer exists in v14).
5. ContainerChildrenProcessor + ContentElementResolver dispatch the
   PLUGIN_RENDERERS map by CType (primary) with list_type fallback.

Beyond the bug fix this commit also contains:
- Datasheets renderer rewritten to "products with newest datasheet"
  semantics (filtered via Download.hideondatasheets).
- New vitec/card content block — multi-purpose card with backend
  preview and layout/background/aspect/alignment/border/shadow options.
- New vitec_container CType (b13 single-column container, FlexForm
  cssClass propagated into the JSON envelope).
- ContentElementResolver service for contentelement/contentelementcta
  link resolution; ContainerChildrenProcessor for nested plugin
  resolution inside b13 containers.
- Vitecset setup.typoscript: ContentElement import moved to top so
  lib.contentElement is defined before VITEC's tt_content blocks.
- Cleanup: 98 .bak.<timestamp> debugging backups removed; *.bak.* and
  /public/_assets_install/ added to .gitignore.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
o-rascheandClaude Opus 4.7 committed 2026-06-15 14:29:17 +02:00
1 parent 64ea55d29d
commit 3aaf8fdad5
98 files changed
+5650 -10154

No files matched your search

@@ -0,0 +1 @@
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;color:#ffffffde;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#242424;font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;font-weight:400;line-height:1.5}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}a{color:#646cff;-webkit-text-decoration:inherit;text-decoration:inherit;font-weight:500}a:hover{color:#535bf2}body{place-items:center;min-width:320px;min-height:100vh;margin:0;display:flex}h1{font-size:3.2em;line-height:1.1}button{cursor:pointer;background-color:#1a1a1a;border:1px solid #0000;border-radius:8px;padding:.6em 1.2em;font-family:inherit;font-size:1em;font-weight:500;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}@media (prefers-color-scheme:light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}.vitec-element{box-shadow:none;color:inherit;background-color:#0000;background-image:none;border:none;border-radius:0;margin-top:.5rem;margin-bottom:.5rem;padding:0;position:relative}@media (min-width:900px){.vitec-element--full-width{width:calc(100% + 4rem);margin-left:-2rem}}.vitec-element__stack{flex-direction:column;display:flex}.vitec-space-before--extra-small{margin-top:.5rem}.vitec-space-before--small{margin-top:1rem}.vitec-space-before--medium{margin-top:2.5rem}.vitec-space-before--large{margin-top:4rem}.vitec-space-before--extra-large{margin-top:6rem}.vitec-space-after--extra-small{margin-bottom:.5rem}.vitec-space-after--small{margin-bottom:1rem}.vitec-space-after--medium{margin-bottom:2.5rem}.vitec-space-after--large{margin-bottom:4rem}.vitec-space-after--extra-large{margin-bottom:6rem}*,:before,:after{box-sizing:border-box}body,html{color:#1f2937;background:#f4f7fb;width:100%;min-height:100vh;margin:0;font-family:Roboto,system-ui,-apple-system,sans-serif}#page{flex-direction:column;width:100%;min-height:100vh;display:flex}#header{color:#f8fafc;background:linear-gradient(120deg,#26358cbf 20%,#f4793680 100%);flex-direction:column;justify-content:center;gap:1rem;width:100%;min-height:300px;padding:1rem 1.75rem;display:flex;box-shadow:0 12px 30px #0f274947}.header-chrome{z-index:2;flex-direction:column;gap:1rem;display:flex;position:relative}#header.header--with-hero{min-height:0;box-shadow:none;background:0 0;justify-content:flex-start;gap:0;padding:0;position:relative;overflow:hidden}#header.header--with-hero .header-chrome{padding:1.65rem 1.75rem 0;position:absolute;inset:0 0 auto}.header-hero{color:#f8fafc;background:#0f172a;width:100%;min-height:620px;margin-left:0;position:relative;top:0;overflow:hidden}.header-hero-media,.header-hero-overlay{position:absolute;inset:0}.header-hero-media{opacity:.45;background-position:50%;background-repeat:no-repeat;background-size:cover}.header-hero-overlay{background:linear-gradient(120deg,#26358cc7 20%,#f4793694 100%)}.header-hero-content{z-index:1;align-items:center;min-height:620px;padding-top:9.5rem;padding-bottom:4rem;display:flex;position:relative}.header-hero-copy{line-height:1.6}.header-hero-copy p{margin:0 0 1rem}.header-hero-copy p:last-of-type{margin-bottom:0}.header-hero-copy a{color:inherit}.header-hero-copy mark{color:inherit;background:#facc15d9;padding:0 .2rem}.header-hero-image-sr{clip:rect(0,0,0,0);border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.header-top-row{justify-content:space-between;align-items:center;gap:1rem;width:100%;display:flex}.header-logo-link{align-items:center;display:inline-flex}.header-logo{object-fit:contain;width:auto;height:34px}.mobile-nav-toggle{color:#f8fafc;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);background:#0f172a33;border:1px solid #f8fafc2e;border-radius:999px;min-width:auto;padding:.6rem;display:none}.mobile-nav-toggle:hover{background:#0f172a52}.mobile-nav-toggle__icon{flex-direction:column;justify-content:space-between;width:1.3rem;height:1rem;display:inline-flex}.mobile-nav-toggle__icon span{transform-origin:50%;background:currentColor;border-radius:999px;width:100%;height:2px;transition:transform .2s,opacity .2s;display:block}.mobile-nav-toggle__icon--open span:first-child{transform:translateY(7px)rotate(45deg)}.mobile-nav-toggle__icon--open span:nth-child(2){opacity:0}.mobile-nav-toggle__icon--open span:nth-child(3){transform:translateY(-7px)rotate(-45deg)}.mobile-nav-drawer{color:#f8fafc;background:linear-gradient(#0f172a 0%,#1e3a8a 100%);border-left:1px solid #f8fafc1f;width:min(24rem,100vw)}.mobile-nav-drawer__inner{min-height:100%;padding:1.25rem}.mobile-nav-drawer__header{justify-content:space-between;align-items:center;gap:1rem;margin-bottom:1.25rem;display:flex}.mobile-nav-close{color:#f8fafc;border:1px solid #f8fafc24;border-radius:999px;min-width:auto;padding:.35rem .85rem}.mobilLine truncated