[ 'type' => 'number', 'default' => 0 ], 'imgUrl' => [ 'type' => 'string', 'default' => '' ], 'imgAlt' => [ 'type' => 'string', 'default' => '' ], 'imgWidth' => [ 'type' => 'number', 'default' => 80 ], 'imgHeight' => [ 'type' => 'number', 'default' => 0 ], 'imgFit' => [ 'type' => 'string', 'default' => 'contain' ], 'imgPosition' => [ 'type' => 'string', 'default' => 'top' ], ]; } /** * Build card image HTML from shared image attributes. * * @param array $a Block attributes (must include imgId, imgUrl, etc.) * @return array [ 'html' => string, 'position' => string, 'card_class' => string ] */ function oribi_card_image_html( $a ) { $img_id = ! empty( $a['imgId'] ) ? intval( $a['imgId'] ) : 0; $img_url = ! empty( $a['imgUrl'] ) ? $a['imgUrl'] : ''; $img_alt = ! empty( $a['imgAlt'] ) ? $a['imgAlt'] : ''; $img_w = ! empty( $a['imgWidth'] ) ? intval( $a['imgWidth'] ) : 80; $img_h = ! empty( $a['imgHeight'] ) ? intval( $a['imgHeight'] ) : 0; $img_fit = ! empty( $a['imgFit'] ) ? $a['imgFit'] : 'contain'; $img_pos = ! empty( $a['imgPosition'] ) ? $a['imgPosition'] : 'top'; $result = [ 'html' => '', 'position' => $img_pos, 'card_class' => '', ]; if ( ! $img_url ) { return $result; } $result['card_class'] = 'img-' . $img_pos; // Build inline style for dimensions $styles = []; if ( $img_pos !== 'background' ) { if ( $img_w > 0 ) $styles[] = 'width:' . $img_w . 'px'; $styles[] = 'max-width:100%'; if ( $img_h > 0 ) { $styles[] = 'height:' . $img_h . 'px'; } else { $styles[] = 'height:auto'; } } $style_str = implode( ';', $styles ); $fit_class = 'oribi-card-img oribi-card-img--' . ( $img_pos === 'background' ? 'cover' : esc_attr( $img_fit ) ); if ( $img_id ) { $result['html'] = wp_get_attachment_image( $img_id, 'large', false, [ 'class' => $fit_class, 'style' => $style_str, 'alt' => $img_alt, ] ); } else { $result['html'] = '' . esc_attr( $img_alt )
                        . ''; } // Wrap in container $result['html'] = '
' . $result['html'] . '
'; return $result; } /** * Shared icon attributes added to every card block that supports an icon. */ function oribi_card_icon_attributes() { return [ 'icon' => [ 'type' => 'string', 'default' => '' ], 'iconType' => [ 'type' => 'string', 'default' => 'emoji' ], 'faIcon' => [ 'type' => 'string', 'default' => '' ], ]; } /** * Render an icon from block attributes. * * Accepts either: * - iconType = 'fontawesome' + faIcon = 'fas fa-cloud' → * - iconType = 'emoji' + icon = 'text' -> text (escaped) * * Legacy: if $icon_or_attrs is a plain string it behaves like before. * * @param array|string $icon_or_attrs Block attributes array, or legacy icon string. * @return string Rendered HTML. */ function oribi_render_icon( $icon_or_attrs ) { // Legacy string call if ( is_string( $icon_or_attrs ) ) { $icon = $icon_or_attrs; if ( empty( $icon ) ) return ''; if ( preg_match( '/^fa[srldb]\s+fa-/', $icon ) ) { return ''; } return wp_kses_post( $icon ); } // Array (block attributes) $a = $icon_or_attrs; $iconType = ! empty( $a['iconType'] ) ? $a['iconType'] : 'emoji'; if ( $iconType === 'fontawesome' ) { $fa = ! empty( $a['faIcon'] ) ? trim( $a['faIcon'] ) : ''; if ( empty( $fa ) ) return ''; return ''; } // emoji / text $icon = ! empty( $a['icon'] ) ? $a['icon'] : ''; if ( empty( $icon ) ) return ''; return wp_kses_post( $icon ); } /** * Return true when the given block attributes specify a non-empty icon. */ function oribi_has_icon( $a ) { $iconType = ! empty( $a['iconType'] ) ? $a['iconType'] : 'emoji'; if ( $iconType === 'fontawesome' ) { return ! empty( $a['faIcon'] ); } return ! empty( $a['icon'] ); } /** * Render a standard card section wrapper. * * @param array $a Block attributes (variant, label, heading, lead, columns). * @param string $content InnerBlocks rendered HTML. * @param string $grid_class CSS class for the grid container (e.g. 'grid'). * @param int $default_cols Default column count if not set in attributes. * @return string Rendered HTML. */ function oribi_render_card_section( $a, $content, $grid_class = 'grid', $default_cols = 3 ) { $cls = ( ! empty( $a['variant'] ) && $a['variant'] === 'alt' ) ? 'section section-alt' : 'section'; $cols = ! empty( $a['columns'] ) ? intval( $a['columns'] ) : $default_cols; $grid = $grid_class . '-' . $cols; ob_start(); ?>

[ 'type' => 'string', 'default' => 'normal' ], 'label' => [ 'type' => 'string', 'default' => '' ], 'heading' => [ 'type' => 'string', 'default' => '' ], 'lead' => [ 'type' => 'string', 'default' => '' ], 'columns' => [ 'type' => 'number', 'default' => $default_cols ], ]; } /* ── Block category ────────────────────────────────────────────────────────── */ add_filter( 'block_categories_all', function ( $cats ) { array_unshift( $cats, [ 'slug' => 'oribi', 'title' => 'OTS Theme' ] ); return $cats; } ); /* ── Enqueue editor assets ─────────────────────────────────────────────────── */ add_action( 'enqueue_block_editor_assets', function () { $dir = get_template_directory(); $uri = get_template_directory_uri(); wp_enqueue_script( 'oribi-blocks', $uri . '/blocks/editor.js', [ 'wp-blocks', 'wp-element', 'wp-block-editor', 'wp-components', 'wp-i18n' ], filemtime( $dir . '/blocks/editor.js' ), true ); wp_enqueue_style( 'oribi-blocks-editor', $uri . '/blocks/editor.css', [ 'wp-edit-blocks' ], filemtime( $dir . '/blocks/editor.css' ) ); } ); /* ── Register all blocks ───────────────────────────────────────────────────── */ add_action( 'init', function () { /* Shared supports - exposes color pickers and font-size selector in the block inspector for every Oribi block. Individual blocks can override these by merging their own array if needed. */ $block_supports = [ 'color' => [ 'text' => true, 'background' => true, 'link' => true, ], 'typography' => [ 'fontSize' => true, 'lineHeight' => true, ], 'spacing' => [ 'padding' => true, 'margin' => true, ], ]; /* ── TEMPLATE-PART HELPER BLOCKS ──────────────────────────────────────── */ register_block_type( 'oribi/site-header', [ 'render_callback' => 'oribi_render_site_header', ] ); register_block_type( 'oribi/site-footer', [ 'render_callback' => 'oribi_render_site_footer', ] ); /* ── STANDALONE BLOCKS ─────────────────────────────────────────────────── */ register_block_type( 'oribi/hero', [ 'attributes' => [ 'label' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'highlightWord' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], 'primaryBtnText' => [ 'type' => 'string', 'default' => 'Get in Touch' ], 'primaryBtnUrl' => [ 'type' => 'string', 'default' => '/contact' ], 'secondaryBtnText' => [ 'type' => 'string', 'default' => '' ], 'secondaryBtnUrl' => [ 'type' => 'string', 'default' => '' ], 'stat1Value' => [ 'type' => 'string', 'default' => '' ], 'stat1Label' => [ 'type' => 'string', 'default' => '' ], 'stat2Value' => [ 'type' => 'string', 'default' => '' ], 'stat2Label' => [ 'type' => 'string', 'default' => '' ], 'svcLaptop1' => [ 'type' => 'string', 'default' => 'Data Backup' ], 'svcLaptop2' => [ 'type' => 'string', 'default' => 'Endpoint Security' ], 'svcLaptop3' => [ 'type' => 'string', 'default' => 'Patch Management' ], 'svcCloud1' => [ 'type' => 'string', 'default' => 'Email Protection' ], 'svcCloud2' => [ 'type' => 'string', 'default' => 'License Management' ], 'svcCloud3' => [ 'type' => 'string', 'default' => 'Cloud Backup' ], 'svcDesktop1' => [ 'type' => 'string', 'default' => 'Network Monitoring' ], 'svcDesktop2' => [ 'type' => 'string', 'default' => 'Threat Detection' ], 'svcDesktop3' => [ 'type' => 'string', 'default' => 'Cloud Management' ], 'svcPhone1' => [ 'type' => 'string', 'default' => 'Mobile Security' ], 'svcPhone2' => [ 'type' => 'string', 'default' => 'Data Encryption' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_hero', ] ); register_block_type( 'oribi/page-hero', [ 'attributes' => [ 'label' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_page_hero', ] ); register_block_type( 'oribi/cta-banner', [ 'attributes' => [ 'heading' => [ 'type' => 'string', 'default' => '' ], 'text' => [ 'type' => 'string', 'default' => '' ], 'btnText' => [ 'type' => 'string', 'default' => '' ], 'btnUrl' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_cta_banner', ] ); register_block_type( 'oribi/intro-section', [ 'attributes' => [ 'variant' => [ 'type' => 'string', 'default' => 'normal' ], 'label' => [ 'type' => 'string', 'default' => '' ], 'heading' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], 'visual' => [ 'type' => 'string', 'default' => '' ], 'reversed' => [ 'type' => 'boolean', 'default' => false ], 'imgId' => [ 'type' => 'number', 'default' => 0 ], 'imgUrl' => [ 'type' => 'string', 'default' => '' ], 'imgAlt' => [ 'type' => 'string', 'default' => '' ], 'imgWidth' => [ 'type' => 'number', 'default' => 280 ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_intro_section', ] ); register_block_type( 'oribi/contact-section', [ 'attributes' => [ 'heading' => [ 'type' => 'string', 'default' => "Let's Talk" ], 'lead' => [ 'type' => 'string', 'default' => '' ], 'email' => [ 'type' => 'string', 'default' => 'solutions@oribi-tech.com' ], 'supportUrl' => [ 'type' => 'string', 'default' => 'https://portal.oribi-tech.com/helpdesk/technical-support-1' ], 'portalUrl' => [ 'type' => 'string', 'default' => 'https://portal.oribi-tech.com/' ], 'location' => [ 'type' => 'string', 'default' => 'Saratoga Springs, Upstate New York' ], 'formHeading' => [ 'type' => 'string', 'default' => 'Want to Learn More?' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_contact_section', ] ); /* ── PARENT / CHILD PAIRS ──────────────────────────────────────────────── */ /* Feature Section (parent) */ register_block_type( 'oribi/feature-section', [ 'attributes' => oribi_card_section_attributes( 3 ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_feature_section', ] ); /* Feature Card (child) */ register_block_type( 'oribi/feature-card', [ 'attributes' => array_merge( [ 'icon' => [ 'type' => 'string', 'default' => '' ], 'iconType' => [ 'type' => 'string', 'default' => 'emoji' ], 'faIcon' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], 'url' => [ 'type' => 'string', 'default' => '' ], 'centered' => [ 'type' => 'boolean', 'default' => false ], ], oribi_card_image_attributes() ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_feature_card', ] ); /* Value Section (parent) */ register_block_type( 'oribi/value-section', [ 'attributes' => oribi_card_section_attributes( 3 ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_value_section', ] ); /* Value Card (child) */ register_block_type( 'oribi/value-card', [ 'attributes' => array_merge( [ 'icon' => [ 'type' => 'string', 'default' => '' ], 'iconType' => [ 'type' => 'string', 'default' => 'emoji' ], 'faIcon' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], ], oribi_card_image_attributes() ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_value_card', ] ); /* Addon Section (parent) */ register_block_type( 'oribi/addon-section', [ 'attributes' => oribi_card_section_attributes( 3 ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_addon_section', ] ); /* Addon Card (child) */ register_block_type( 'oribi/addon-card', [ 'attributes' => array_merge( [ 'icon' => [ 'type' => 'string', 'default' => '' ], 'iconType' => [ 'type' => 'string', 'default' => 'emoji' ], 'faIcon' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], 'tag' => [ 'type' => 'string', 'default' => '' ], ], oribi_card_image_attributes() ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_addon_card', ] ); /* Image Section (parent) */ register_block_type( 'oribi/image-section', [ 'attributes' => oribi_card_section_attributes( 3 ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_image_section', ] ); /* Image Card (child) */ register_block_type( 'oribi/image-card', [ 'attributes' => array_merge( [ 'icon' => [ 'type' => 'string', 'default' => '' ], 'iconType' => [ 'type' => 'string', 'default' => 'emoji' ], 'faIcon' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], 'url' => [ 'type' => 'string', 'default' => '' ], ], oribi_card_image_attributes() ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_image_card', ] ); /* Stat Section (parent) */ register_block_type( 'oribi/stat-section', [ 'attributes' => oribi_card_section_attributes( 3 ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_stat_section', ] ); /* Stat Card (child) */ register_block_type( 'oribi/stat-card', [ 'attributes' => array_merge( [ 'icon' => [ 'type' => 'string', 'default' => '' ], 'iconType' => [ 'type' => 'string', 'default' => 'emoji' ], 'faIcon' => [ 'type' => 'string', 'default' => '' ], 'value' => [ 'type' => 'string', 'default' => '' ], 'label' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], ], oribi_card_image_attributes() ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_stat_card', ] ); /* Link Section (parent) */ register_block_type( 'oribi/link-section', [ 'attributes' => oribi_card_section_attributes( 3 ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_link_section', ] ); /* Link Card (child) */ register_block_type( 'oribi/link-card', [ 'attributes' => array_merge( [ 'icon' => [ 'type' => 'string', 'default' => '' ], 'iconType' => [ 'type' => 'string', 'default' => 'emoji' ], 'faIcon' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], 'linkText' => [ 'type' => 'string', 'default' => '' ], 'linkUrl' => [ 'type' => 'string', 'default' => '' ], ], oribi_card_image_attributes() ), 'supports' => $block_supports, 'render_callback' => 'oribi_render_link_card', ] ); /* Pricing Section (parent) */ register_block_type( 'oribi/pricing-section', [ 'attributes' => [ 'variant' => [ 'type' => 'string', 'default' => 'normal' ], 'label' => [ 'type' => 'string', 'default' => '' ], 'heading' => [ 'type' => 'string', 'default' => '' ], 'lead' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_pricing_section', ] ); /* Pricing Card (child) */ register_block_type( 'oribi/pricing-card', [ 'attributes' => [ 'icon' => [ 'type' => 'string', 'default' => '' ], 'iconType' => [ 'type' => 'string', 'default' => 'emoji' ], 'faIcon' => [ 'type' => 'string', 'default' => '' ], 'name' => [ 'type' => 'string', 'default' => '' ], 'tagline' => [ 'type' => 'string', 'default' => '' ], 'price' => [ 'type' => 'string', 'default' => '' ], 'pricePer' => [ 'type' => 'string', 'default' => '' ], 'features' => [ 'type' => 'array', 'default' => [] ], 'btnText' => [ 'type' => 'string', 'default' => 'Get Started' ], 'btnUrl' => [ 'type' => 'string', 'default' => '/contact' ], 'featured' => [ 'type' => 'boolean', 'default' => false ], 'badge' => [ 'type' => 'string', 'default' => '' ], 'imgId' => [ 'type' => 'number', 'default' => 0 ], 'imgUrl' => [ 'type' => 'string', 'default' => '' ], 'imgAlt' => [ 'type' => 'string', 'default' => '' ], 'imgWidth' => [ 'type' => 'number', 'default' => 80 ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_pricing_card', ] ); /* Platform Section (parent) */ register_block_type( 'oribi/platform-section', [ 'attributes' => [ 'label' => [ 'type' => 'string', 'default' => '' ], 'heading' => [ 'type' => 'string', 'default' => '' ], 'lead' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_platform_section', ] ); /* Platform Row (child) */ register_block_type( 'oribi/platform-row', [ 'attributes' => [ 'heading' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], 'btnText' => [ 'type' => 'string', 'default' => 'Learn More' ], 'btnUrl' => [ 'type' => 'string', 'default' => '' ], 'visual' => [ 'type' => 'string', 'default' => '' ], 'reversed' => [ 'type' => 'boolean', 'default' => false ], 'imgId' => [ 'type' => 'number', 'default' => 0 ], 'imgUrl' => [ 'type' => 'string', 'default' => '' ], 'imgAlt' => [ 'type' => 'string', 'default' => '' ], 'imgWidth' => [ 'type' => 'number', 'default' => 300 ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_platform_row', ] ); /* FAQ Section (parent) */ register_block_type( 'oribi/faq-section', [ 'attributes' => [ 'variant' => [ 'type' => 'string', 'default' => 'normal' ], 'label' => [ 'type' => 'string', 'default' => '' ], 'heading' => [ 'type' => 'string', 'default' => '' ], 'lead' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_faq_section', ] ); /* FAQ Item (child) */ register_block_type( 'oribi/faq-item', [ 'attributes' => [ 'question' => [ 'type' => 'string', 'default' => '' ], 'answer' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_faq_item', ] ); /* Comparison Table */ register_block_type( 'oribi/comparison-table', [ 'attributes' => [ 'variant' => [ 'type' => 'string', 'default' => 'normal' ], 'label' => [ 'type' => 'string', 'default' => '' ], 'heading' => [ 'type' => 'string', 'default' => '' ], 'lead' => [ 'type' => 'string', 'default' => '' ], 'columns' => [ 'type' => 'array', 'default' => [] ], 'rows' => [ 'type' => 'array', 'default' => [] ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_comparison_table', ] ); /* Trust Section (parent) */ register_block_type( 'oribi/trust-section', [ 'attributes' => [ 'label' => [ 'type' => 'string', 'default' => '' ], 'heading' => [ 'type' => 'string', 'default' => '' ], 'lead' => [ 'type' => 'string', 'default' => '' ], 'btnText' => [ 'type' => 'string', 'default' => '' ], 'btnUrl' => [ 'type' => 'string', 'default' => '' ], 'btnSub' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_trust_section', ] ); /* Trust Item (child) */ register_block_type( 'oribi/trust-item', [ 'attributes' => [ 'heading' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_trust_item', ] ); /* ── ANIMATED HERO BLOCKS (OTS Signs) ─────────────────────────────────── */ /* Animated Hero - full homepage hero with particle background */ register_block_type( 'oribi/hero-animated', [ 'attributes' => [ 'label' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'highlightWord' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], 'primaryBtnText' => [ 'type' => 'string', 'default' => 'Get Started' ], 'primaryBtnUrl' => [ 'type' => 'string', 'default' => '/contact' ], 'secondaryBtnText' => [ 'type' => 'string', 'default' => '' ], 'secondaryBtnUrl' => [ 'type' => 'string', 'default' => '' ], 'stat1Value' => [ 'type' => 'string', 'default' => '' ], 'stat1Label' => [ 'type' => 'string', 'default' => '' ], 'stat2Value' => [ 'type' => 'string', 'default' => '' ], 'stat2Label' => [ 'type' => 'string', 'default' => '' ], 'stat3Value' => [ 'type' => 'string', 'default' => '' ], 'stat3Label' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_hero_animated', ] ); /* Animated Page Hero - inner pages with particle background */ register_block_type( 'oribi/page-hero-animated', [ 'attributes' => [ 'label' => [ 'type' => 'string', 'default' => '' ], 'title' => [ 'type' => 'string', 'default' => '' ], 'description' => [ 'type' => 'string', 'default' => '' ], ], 'supports' => $block_supports, 'render_callback' => 'oribi_render_page_hero_animated', ] ); } ); /* ══════════════════════════════════════════════════════════════════════════════ RENDER CALLBACKS ══════════════════════════════════════════════════════════════════════════════ */ /* ── Site Header ───────────────────────────────────────────────────────────── */ function oribi_render_site_header() { $has_logo = has_custom_logo(); ob_start(); ?> '; echo '
  • Solutions
  • '; echo '
  • Features
  • '; echo '
  • Pricing
  • '; echo '
  • About
  • '; echo '
  • Contact
  • '; echo ''; } /* ── Site Footer ───────────────────────────────────────────────────────────── */ function oribi_render_site_footer() { $year = gmdate( 'Y' ); ob_start(); ?> ' . esc_html( $word ) . '', wp_kses_post( $text ) ); } /* ── Hero ──────────────────────────────────────────────────────────────────── */ function oribi_render_hero( $a ) { ob_start(); ?>
    365
    Secure

    > >

    >

    Email Us
    Existing Customer Support
    Client Portal
    Location

    < class="oribi-card">

    > < class="oribi-card">
    >

    > < class="oribi-card">
    >

    >

    < class="oribi-card image-card">

    > < class="oribi-card image-card">

    > < class="oribi-card image-card">

    >

    ' . esc_html( $a['linkText'] ?? 'Learn More' ) . ''; } ob_start(); if ( $img['html'] && $img['position'] === 'left' ) : ?> inner_blocks ); ob_start(); ?>

    'card-image', 'style' => $img_style, 'alt' => $img_alt, ] ); } else { $img_html = '' . esc_attr( $img_alt ) . ''; } } ob_start(); ?>

    $img_style, 'alt' => $img_alt ] ); } else { $visual_html = '' . esc_attr( $img_alt ) . ''; } $visual_cls = 'platform-visual has-img'; } else { $visual_html = oribi_render_icon( $a['visual'] ?? '' ); $visual_cls = 'platform-visual'; } ob_start(); ?>

    Feature
    ✓'; elseif ( $val === false ) echo ''; else echo wp_kses_post( $val ); ?>
    '; for ( $i = 1; $i <= $count; $i++ ) { $html .= '
    '; } $html .= ''; return $html; } /* ── Animated Hero (homepage) ──────────────────────────────────────────────── */ function oribi_render_hero_animated( $a ) { ob_start(); ?>