vitec_card: flipcard layout + card-back fields; shared-column repair

- layout_variant gains the value "flipcard" (onChange: reload)
- "Card Back" palette in the Layout tab directly below layout_variant:
  back_headline (Text, max 100) and back_text (Textarea, richtext),
  displayCond-gated on the flipcard layout; serialised unconditionally -
  the frontend keys the back face on layout_variant, not on field
  presence (spec 7.7)
- backend preview: flipcard badge + back-headline line
- repair "[ Missing label ]" in the card selects: layout_variant /
  background_variant are columns SHARED with vitec_ctabanner, and the
  index-wise Content Blocks merge dropped four card-only values from
  the base item list. Overrides/tt_content.php now pins the base column
  to the cta-banner lists and hands vitec_card its full lists via
  columnsOverrides (respected by FormEngine and DataHandler; an items
  override can only extend, never shorten - array_replace_recursive)
- spec v1.19 incl. head-matter fix (version table was stuck at 1.17)

Server follow-up: database:updateschema "*.add,*.change" + cache:flush

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
orascheandClaude Fable 5 committed 2026-09-25 12:16:16 +02:00
1 parent 43519505bc
commit 6db2234851
5 files changed
+123 -3

No files matched your search

@@ -99,6 +99,8 @@ fields:
type: Select
renderType: selectSingle
default: vertical
# displayCond of the card-back fields depends on this value
onChange: reload
items:
- label: Vertical (image top, content below)
value: vertical
@@ -116,6 +118,27 @@ fields:
value: feature
- label: Compact (small card, tight spacing)
value: compact
- label: Flip Card (front / back)
value: flipcard
# Card back - only shown when layout_variant = flipcard. displayCond needs
# the storage column (vitec_ vendor prefix); the JSON keys stay the plain
# identifiers back_headline / back_text and are emitted on EVERY card
# (empty when unset) - the frontend keys the back face on layout_variant.
- identifier: card_back
type: Palette
label: Card Back
description: Reverse side of the card. Only used (and only shown) when the layout variant is "Flip Card".
fields:
- identifier: back_headline
type: Text
max: 100
displayCond: 'FIELD:vitec_layout_variant:=:flipcard'
- type: Linebreak
- identifier: back_text
type: Textarea
enableRichtext: true
displayCond: 'FIELD:vitec_layout_variant:=:flipcard'
- identifier: background_variant
type: Select
@@ -54,6 +54,19 @@
<source>If set, the whole card becomes clickable. Overrides individual CTAs visually in the frontend.</source>
</trans-unit>
<trans-unit id="back_headline.label">
<source>Back Headline</source>
</trans-unit>
<trans-unit id="back_headline.description">
<source>Headline on the reverse side of the card. Only used by the Flip Card layout.</source>
</trans-unit>
<trans-unit id="back_text.label">
<source>Back Text</source>
</trans-unit>
<trans-unit id="back_text.description">
<source>Text on the reverse side of the card. Only used by the Flip Card layout.</source>
</trans-unit>
<!-- ============================================================== -->
<!-- layout_variant -->
<!-- ============================================================== -->
@@ -84,6 +97,9 @@
<trans-unit id="layout_variant.items.compact.label">
<source>Compact (small card, tight spacing)</source>
</trans-unit>
<trans-unit id="layout_variant.items.flipcard.label">
<source>Flip Card (front / back)</source>
</trans-unit>
<!-- ============================================================== -->
<!-- background_variant -->
@@ -31,6 +31,7 @@
<f:case value="icon_card">✦</f:case>
<f:case value="feature">⭐</f:case>
<f:case value="compact">▫</f:case>
<f:case value="flipcard">🔄</f:case>
<f:defaultCase>▢</f:defaultCase>
</f:switch>
</div>
@@ -65,6 +66,10 @@
</div>
</f:if>
<f:if condition="{data.back_headline}">
<div class="vitec-preview__body-text">🔄 Back: {data.back_headline}</div>
</f:if>
<div class="vitec-preview__ctas">
<f:if condition="{data.primary_cta_label}">
<span class="vitec-preview__cta-btn">{data.primary_cta_label} →</span>
@@ -90,6 +95,7 @@
<f:case value="icon_card">✦ Icon Card</f:case>
<f:case value="feature">⭐ Feature</f:case>
<f:case value="compact">▫ Compact</f:case>
<f:case value="flipcard">🔄 Flip Card</f:case>
<f:defaultCase>{data.layout_variant}</f:defaultCase>
</f:switch>
</span>