['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], 'cloudAnim' => ['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], 'scene' => ['type' => 'string', 'default' => ''], ], 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], 'isDashboard' => ['type' => 'boolean', 'default' => false], 'deviceAnim' => ['type' => 'boolean', 'default' => false], 'tvStick' => ['type' => 'boolean', 'default' => false], 'cameraAnim' => ['type' => 'boolean', 'default' => false], 'neverGoesDark' => ['type' => 'boolean', 'default' => false], 'brandedAnim' => ['type' => 'boolean', 'default' => false], 'hospitalityAnim' => ['type' => 'boolean', 'default' => false], 'retailAnim' => ['type' => 'boolean', 'default' => false], 'corporateAnim' => ['type' => 'boolean', 'default' => false], 'educationAnim' => ['type' => 'boolean', 'default' => false], 'outdoorAnim' => ['type' => 'boolean', 'default' => false], 'liveDataAnim' => ['type' => 'boolean', 'default' => false], 'healthcareAnim' => ['type' => 'boolean', 'default' => false], 'transitAnim' => ['type' => 'boolean', 'default' => false], 'fitnessAnim' => ['type' => 'boolean', 'default' => false], 'lobbyAnim' => ['type' => 'boolean', 'default' => false], 'conferenceAnim' => ['type' => 'boolean', 'default' => false], 'dayPartAnim' => ['type' => 'boolean', 'default' => false], 'wayfindAnim' => ['type' => 'boolean', 'default' => false], 'storefrontAnim' => ['type' => 'boolean', 'default' => false], 'announcementAnim' => ['type' => 'boolean', 'default' => false], 'campusWayfindAnim' => ['type' => 'boolean', 'default' => false], 'emergencyAnim' => ['type' => 'boolean', 'default' => false], 'enclosureAnim' => ['type' => 'boolean', 'default' => false], 'brightnessAnim' => ['type' => 'boolean', 'default' => false], 'cellularAnim' => ['type' => 'boolean', 'default' => false], 'designerAnim' => ['type' => 'boolean', 'default' => false], 'mediaLibraryAnim' => ['type' => 'boolean', 'default' => false], 'publishAnim' => ['type' => 'boolean', 'default' => false], 'screenGroupsAnim' => ['type' => 'boolean', 'default' => false], 'monitoringAnim' => ['type' => 'boolean', 'default' => false], 'patientWayfindAnim' => ['type' => 'boolean', 'default' => false], 'waitingRoomAnim' => ['type' => 'boolean', 'default' => false], 'multiZoneAnim' => ['type' => 'boolean', 'default' => false], 'membershipAnim' => ['type' => 'boolean', 'default' => false], 'videoMotionAnim' => ['type' => 'boolean', 'default' => false], 'brandLayoutAnim' => ['type' => 'boolean', 'default' => false], 'menuBoardAnim' => ['type' => 'boolean', 'default' => false], 'galleryIds' => ['type' => 'array', 'default' => [], 'items' => ['type' => 'number']], ], '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 '
  • Partners
  • '; echo '
  • About
  • '; echo ''; 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

    > >

    > '; echo '
    '; echo '
    '; echo '
    '; echo '
    '; } else { echo wp_kses_post($a['visual']); } ?>

    Email Us
    Existing Customer Support
    Client Portal
    Location

    < class="oribi-card">

    > < class="oribi-card">
    >

    > < class="oribi-card">
    >

    > ' . '
    ' . '
    Media Library
    ' . '
    ' . '
    IMG
    2.4 MB
    ' . '
    VID
    18 MB
    ' . '
    HTML
    64 KB
    ' . '
    ' . '
    + Upload
    ' . '
    '; case 'scheduler': return ''; case 'data-feed': return ''; case 'templates': return ''; case 'team': return ''; case 'analytics': return ''; default: return ''; } } /* ── Value Section ─────────────────────────────────────────────────────────── */ function oribi_render_value_section($a, $content) { return oribi_render_card_section($a, $content, 'grid', 3); } /* ── Value Card ────────────────────────────────────────────────────────────── */ function oribi_render_value_card($a) { $img = oribi_card_image_html($a); $img_cls = $img['card_class'] ? ' ' . $img['card_class'] : ''; ob_start(); if ($img['html'] && $img['position'] === 'background'): ?>

    < 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); $has_label = !empty($a['label']); ob_start(); if ($has_label): ?>

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

    0:00 0:02 0:04 0:06 0:08 0:00 HTML; } function oribi_render_platform_row($a) { $rev = !empty($a['reversed']) ? ' reverse' : ''; $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']) : 300; // Only render animated dashboard when explicitly flagged $is_dashboard = !empty($a['isDashboard']); if ($is_dashboard) { // Render animated dashboard chart SVG // Text uses class hooks: .ct = title, .cl = label, .cv = value // JS will dynamically set fill colours based on data-theme $visual_html = '
    Performance API Cache DB Queue Worker 0% 0% 0% 0% 0% Requests/sec Read Write Update Delete 0 0 0 0 Traffic Trend Distribution 100% Service A Service B Service C Service D
    '; $visual_cls = 'platform-visual has-dashboard'; } elseif ($img_url) { $img_style = 'width:' . $img_w . 'px;max-width:100%;height:auto;border-radius:var(--radius-sm);object-fit:contain;display:block;margin-inline:auto;'; if ($img_id) { $visual_html = wp_get_attachment_image($img_id, 'full', false, ['style' => $img_style, 'alt' => $img_alt]); } else { $visual_html = '' . esc_attr($img_alt) . ''; } $visual_cls = 'platform-visual has-img'; } elseif (!empty($a['deviceAnim'])) { $da_screen = '
    '; $da = ''; $visual_html = $da; $visual_cls = 'platform-visual has-anim'; } elseif (!empty($a['tvStick'])) { $ts = ''; $visual_html = $ts; $visual_cls = 'platform-visual has-tv-stick'; } elseif (!empty($a['neverGoesDark'])) { /* ── Never Goes Dark: player + TV + cloud connection/break animation ── */ $ngd = ''; /* ngd-stage */ $visual_html = $ngd; $visual_cls = 'platform-visual has-ngd'; } elseif (!empty($a['brandedAnim'])) { /* ── Custom Display Solutions: branded screens cascade animation ── */ $bd = ''; /* bd-stage */ $visual_html = $bd; $visual_cls = 'platform-visual has-branded'; } elseif (!empty($a['retailAnim'])) { /* ── Retail Sign: TV cycling 3 promo slides ── */ $ra = ''; // retail-stage $visual_html = $ra; $visual_cls = 'platform-visual has-retail'; } elseif (!empty($a['corporateAnim'])) { /* ── Corporate: Meeting room door panel ── */ $ca = ''; // corp-stage $visual_html = $ca; $visual_cls = 'platform-visual has-corporate'; } elseif (!empty($a['educationAnim'])) { /* ── Education: Campus schedule board ── */ $ea = ''; // edu-stage $visual_html = $ea; $visual_cls = 'platform-visual has-education'; } elseif (!empty($a['outdoorAnim'])) { /* ── Outdoor Marketplace: wide board cycling 2 slides ── */ $oa = ''; // outdoor-stage $visual_html = $oa; $visual_cls = 'platform-visual has-outdoor'; } elseif (!empty($a['liveDataAnim'])) { /* ── Live Data: Operations centre KPI board ── */ $la = ''; // ld-stage $visual_html = $la; $visual_cls = 'platform-visual has-live-data'; } elseif (!empty($a['healthcareAnim'])) { /* ── Healthcare: Queue management display ── */ $hca = ''; // hc-stage $visual_html = $hca; $visual_cls = 'platform-visual has-healthcare'; } elseif (!empty($a['transitAnim'])) { /* ── Transit: Split-flap departure board ── */ $ta = ''; // transit-stage $visual_html = $ta; $visual_cls = 'platform-visual has-transit'; } elseif (!empty($a['fitnessAnim'])) { /* ── Fitness: Class schedule with live capacity bar ── */ $fa = ''; // fit-stage $visual_html = $fa; $visual_cls = 'platform-visual has-fitness'; } elseif (!empty($a['lobbyAnim'])) { /* ── Hotel Lobby Welcome Display ── */ $lb = ''; $visual_html = $lb; $visual_cls = 'platform-visual has-lobby'; } elseif (!empty($a['conferenceAnim'])) { /* ── Conference Room Door Panel ── */ $cf = ''; $visual_html = $cf; $visual_cls = 'platform-visual has-conference'; } elseif (!empty($a['dayPartAnim'])) { /* ── Day-Part Retail Promo Display (JS-driven clock) ── */ $dp = ''; $visual_html = $dp; $visual_cls = 'platform-visual has-daypart'; } elseif (!empty($a['wayfindAnim'])) { /* ── In-Store Wayfinding Kiosk ── */ $wf = ''; $visual_html = $wf; $visual_cls = 'platform-visual has-wayfind'; } elseif (!empty($a['storefrontAnim'])) { /* ── Window / Storefront Display ── */ $sf = ''; $visual_html = $sf; $visual_cls = 'platform-visual has-storefront'; } elseif (!empty($a['announcementAnim'])) { /* ── Corporate Announcement Board ── */ $an = ''; $visual_html = $an; $visual_cls = 'platform-visual has-announcement'; } elseif (!empty($a['campusWayfindAnim'])) { /* ── Campus Wayfinding Kiosk ── */ $cw = ''; $visual_html = $cw; $visual_cls = 'platform-visual has-campus-wayfind'; } elseif (!empty($a['emergencyAnim'])) { /* ── Emergency Override Alert ── */ $em = ''; $visual_html = $em; $visual_cls = 'platform-visual has-emergency'; } elseif (!empty($a['enclosureAnim'])) { /* ── Outdoor Weather-Resistant Enclosure ── */ $en = ''; $visual_html = $en; $visual_cls = 'platform-visual has-enclosure'; } elseif (!empty($a['brightnessAnim'])) { /* ── High-Brightness Comparison ── */ $br = ''; $visual_html = $br; $visual_cls = 'platform-visual has-brightness'; } elseif (!empty($a['cellularAnim'])) { /* ── Cellular Connectivity Tower ── */ $cl = ''; $visual_html = $cl; $visual_cls = 'platform-visual has-cellular'; } elseif (!empty($a['designerAnim'])) { /* ── Drag-and-Drop Editor Canvas ── */ $ds = ''; $visual_html = $ds; $visual_cls = 'platform-visual has-designer'; } elseif (!empty($a['mediaLibraryAnim'])) { /* ── Media Library Grid ── */ $ml = ''; $visual_html = $ml; $visual_cls = 'platform-visual has-media-library'; } elseif (!empty($a['publishAnim'])) { /* ── Draft → Publish Workflow ── */ $pb = ''; $visual_html = $pb; $visual_cls = 'platform-visual has-publish'; } elseif (!empty($a['screenGroupsAnim'])) { /* ── Screen Group Hierarchy Tree ── */ $sg = ''; $visual_html = $sg; $visual_cls = 'platform-visual has-screen-groups'; } elseif (!empty($a['monitoringAnim'])) { /* ── Remote Monitoring Dashboard ── */ $mo = ''; $visual_html = $mo; $visual_cls = 'platform-visual has-monitoring'; } elseif (!empty($a['patientWayfindAnim'])) { /* ── Hospital Patient Wayfinding Kiosk ── */ $pw = ''; $visual_html = $pw; $visual_cls = 'platform-visual has-patient-wayfind'; } elseif (!empty($a['waitingRoomAnim'])) { /* ── Waiting Room Information Display ── */ $wr = ''; $visual_html = $wr; $visual_cls = 'platform-visual has-waiting-room'; } elseif (!empty($a['multiZoneAnim'])) { /* ── Multi-Zone Layout Display ── */ $mz = ''; $visual_html = $mz; $visual_cls = 'platform-visual has-multi-zone'; } elseif (!empty($a['membershipAnim'])) { /* ── Seasonal Membership Promo Cycling ── */ $mb = ''; $visual_html = $mb; $visual_cls = 'platform-visual has-membership'; } elseif (!empty($a['hospitalityAnim'])) { /* ── Hospitality Sign: Rotating Menu (Breakfast, Lunch, Dinner) ── */ $ha = ''; // hosp-stage $visual_html = $ha; $visual_cls = 'platform-visual has-hospitality'; } elseif (!empty($a['videoMotionAnim'])) { /* ── Video & Motion Graphics: TV with kinetic text, promo, loop preview ── */ $vm = ''; // vidmo-stage $visual_html = $vm; $visual_cls = 'platform-visual has-video-motion'; } elseif (!empty($a['brandLayoutAnim'])) { /* ── Branded Layout Design: template builder with brand guide ── */ $bl = ''; // blay-stage $visual_html = $bl; $visual_cls = 'platform-visual has-brand-layout'; } elseif (!empty($a['menuBoardAnim'])) { /* ── Digital Menu Board: TV with rotating menu categories ── */ $mb = ''; // menu-stage $visual_html = $mb; $visual_cls = 'platform-visual has-menu-board'; } elseif (!empty($a['cameraAnim'])) { $visual_html = oribi_render_camera_animation(); $visual_cls = 'platform-visual has-video-editor'; /* ── Gallery TV Slideshow ───────────────────────────────── */ } elseif (!empty($a['galleryIds']) && is_array($a['galleryIds']) && count($a['galleryIds']) > 0) { $slides = ''; $count = 0; foreach ($a['galleryIds'] as $gid) { $gid = intval($gid); if (!$gid) continue; $url = wp_get_attachment_url($gid); $alt = get_post_meta($gid, '_wp_attachment_image_alt', true); if (!$url) continue; $active = $count === 0 ? ' is-active' : ''; $slides .= '
    '; $slides .= '' . esc_attr($alt) . ''; $slides .= '
    '; $count++; } if ($count > 0) { $visual_html = ''; // stage $visual_cls = 'platform-visual has-gallery-tv'; } else { $visual_html = oribi_render_icon($a['visual'] ?? ''); $visual_cls = 'platform-visual'; } } 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(); ?>

    '; case 'event': return ' '; case 'dashboard': return ' '; case 'wayfinding': return ' '; default: return ''; } } function oribi_render_use_cases($a) { $cases = [ ['title' => $a['case1Title'], 'desc' => $a['case1Desc'], 'mod' => 'menu'], ['title' => $a['case2Title'], 'desc' => $a['case2Desc'], 'mod' => 'event'], ['title' => $a['case3Title'], 'desc' => $a['case3Desc'], 'mod' => 'dashboard'], ['title' => $a['case4Title'], 'desc' => $a['case4Desc'], 'mod' => 'wayfinding'], ]; ob_start(); ?>