<?php
/**
 * Front page for staging rebuild.
 *
 * Slider + nav chrome come from theme for pixel match + working JS.
 * Body sections below slider now come from the_content() so the markup
 * (and eventually Kubio blocks) live in the real WP "Home" page and are
 * editable inside the Kubio editor while the public look stays identical.
 */

if (! defined('ABSPATH')) {
    exit;
}

get_header();

$slides = [
    [
        'title'    => 'Greenwood Shoppes',
        'location' => 'Greenwood, Indiana',
        'url'      => '/property/greenwood-shoppes/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_GW-W1894-004e-scaled.jpg',
    ],
    [
        'title'    => 'Ridgehaven Shopping Center',
        'location' => 'Minnetonka, Minnesota',
        'url'      => '/property/ridgehaven-shopping-center/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_RH-Aerial-Press-Release-1.jpg',
    ],
    [
        'title'    => 'Frankford Pavilion Shopping Center',
        'location' => 'Dallas, Texas',
        'url'      => '/property/frankford-pavilion/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_Frankford_Pav_Aerial__39-edited2-scaled.jpg',
    ],
    [
        'title'    => 'H-E-B Crossing',
        'location' => 'San Antonio, Texas',
        'url'      => '/property/h-e-b-crossing/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_HB-OM-Photo.e.jpg',
    ],
    [
        'title'    => 'Tacoma Central',
        'location' => 'Tacoma, Washington',
        'url'      => '/property/tacoma-central/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_TW-Center-Photo-e.jpg',
    ],
    [
        'title'    => 'North by Northwest Business Park',
        'location' => 'Indianapolis, Indiana',
        'url'      => '/property/north-by-northwest-business-park/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_Aerial-View-0290-scaled.jpg',
    ],
    [
        'title'    => 'St. James Crossing',
        'location' => 'Westmont, Illinois',
        'url'      => '/property/st-james-crossing/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_SJ-48994-124-Edited-2.jpg',
    ],
    [
        'title'    => 'Park Place Plaza',
        'location' => 'St. Louis, Minnesota',
        'url'      => '/property/minneapolis-2/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_PK-1650-Park-Place-Blvd-scaled.jpg',
    ],
    [
        'title'    => 'Main Street Square',
        'location' => 'Downers Grove, Illinois',
        'url'      => '/property/main-street-square/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_MAIN-STREET-SQUARE-5257e-scaled.jpg',
    ],
    [
        'title'    => 'Dempster Crossing',
        'location' => 'Morton Grove, Illinois',
        'url'      => '/property/dempster-crossing/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_Aerials-Dempster-Crossing3e-2.jpg',
    ],
    [
        'title'    => 'North Garland Crossing',
        'location' => 'Garland, Texas',
        'url'      => '/property/north-garland-crossing/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_GR-Ground-141-scaled.jpg',
    ],
    [
        'title'    => 'Alderwood Crossing Shopping Center',
        'location' => 'Seattle, Washington',
        'url'      => '/property/alderwood-shopping-center/',
        'image'    => 'https://www.biancoproperties.com/wp-content/files_mf/cache/th_9044ac1328c996081ace0548c25df4ac_LW-DSC00343D-2.75x1-2JPG.jpg',
    ],
];
?>
<div id="slider">
    <div id="slides">
        <div class="slides_container">
            <?php foreach ($slides as $slide) : ?>
                <div class="slide">
                    <a href="<?php echo esc_url($slide['url']); ?>"><img src="<?php echo esc_url($slide['image']); ?>" alt="<?php echo esc_attr($slide['title']); ?>"></a>
                    <div class="caption">
                        <div class="title"><?php echo esc_html($slide['title']); ?></div>
                        <div class="location"><?php echo esc_html($slide['location']); ?></div>
                        <div class="link"><a href="<?php echo esc_url($slide['url']); ?>">Learn More &gt;</a></div>
                    </div>
                </div>
            <?php endforeach; ?>
        </div>
        <a class="prev" href="#"><img src="<?php echo esc_url(get_template_directory_uri() . '/images/arrow-prev.png'); ?>" alt="Previous"></a>
        <a class="next" href="#"><img src="<?php echo esc_url(get_template_directory_uri() . '/images/arrow-next.png'); ?>" alt="Next"></a>
    </div>
</div>

<?php
if (have_posts()) {
    while (have_posts()) {
        the_post();
        the_content();
    }
}
?>
<div class="clear"></div>
<?php
get_footer();
