settings.header)settings.sets[]{
"name": "TextWithImage",
"view": "Default",
"section": "SectionA",
"settings": {
"sets": [
{
"image": {
"link": "https://example.com/media/sample.jpg",
"alt": "Sample text"
},
"title": "Sample title",
"text": "Sample text",
"buttonText": "Sample button text",
"buttonLink": "/sample",
"verticalAlignment": 0,
"horizontalAlignment": 2
},
"..."
],
"id": "Component Id",
"section": "SectionA",
"type": "NoirTextWithImage",
"name": "TextWithImage",
"configuredInContentApi": true,
"view": "Default",
"displayName": "Sample text",
"cssClass": "",
"header": "",
"alignment": "Left"
},
"translations": {
"clickToLearnMoreAbout": "Sample text",
"noImageAltAvailable": "Sample text"
}
}settings.idsettings.sets[]settings.cssClasssettings.headersettings.alignment (Left, Center, Right)settings.Animation — entrance animation. Defaults to None. Values: None, SlideSides, SlideVertical, Stomp.set.image.linkset.image.altset.titleset.textset.buttonTextset.buttonLinkset.horizontalAlignment (numeric)set.verticalAlignment (numeric)translations.clickToLearnMoreAbouttranslations.noImageAltAvailableComponents/TextWithImage/Default.jsx-data='textwithimagedefault.initComponent({{ animation | serialize | escape }})'.animation is not None, the section is rendered with textWithImage--loading, which covers its content with skeleton placeholders so the page is not blank before the animation. init() removes it, then calls initAnimation(el). Without an animation there is no loading state.initAnimation(el) does nothing when animation is None. Otherwise it adds is-inview to the section once 30% of it (or 30% of the viewport height) is visible, which starts the CSS animation. Browsers without IntersectionObserver get is-inview immediately.horizontalAlignment and verticalAlignment are numeric enums interpreted in Liquid.alt falls back to: set.image.alt → set.title → settings.header → translations.noImageAltAvailable.widthClass based on how many sets exist:md:w-1/2md:w-1/3md:flex-1onlyImage = set.image and set.title == null to switch image sizing (cover vs contain).horizontalAlignment: 0 = left, 2 = center, 3 = rightverticalAlignment: 0 = top, 2 = center, 3 = bottombuttonText and buttonLink exist.settings.Animation is not None, the section gets textWithImage--anim plus textWithImage--anim-slideSides, textWithImage--anim-slideVertical or textWithImage--anim-stomp.