1<!doctype html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8"> 5 <meta http-equiv="x-ua-compatible" content="ie=edge"> 6 7 <!-- Mobile Metas --> 8 <meta name="viewport" content="width=device-width, user-scalable=1, initial-scale=1, maximum-scale=1"> 9 <meta name="mobile-web-app-capable" content="yes"> 10 11 <!-- Meta tags --> 12 <title>News | Boschendal Wine Estate Updates and Awards | Boschendal</title> 13 14 <meta name="generator" content="OrderEazi CMS"> 15 <meta name="title" content="News | Boschendal Wine Estate Updates and Awards | Boschendal" /> 16 <meta name="description" content="Stay up to date with Boschendal's latest news, including wine awards, harvest updates and estate announcements from one of South Africa's oldest wine farms." /> 17 <meta name="keywords" content="boschendal news, boschendal wine awards, boschendal harvest, south african wine news, boschendal announcements, boschendal press releases, wine estate updates" /> 18 19 <!-- Canonical SEO --> 20 <link rel="canonical" href="https://www.boschendalwines.com/news" /> 21 22 <!-- Open Graph Tags --> 23 <meta property="og:title" content="News | Boschendal Wine Estate Updates and Awards | Boschendal" /> 24 <meta property="og:url" content="https://www.boschendalwines.com/news" /> 25 <meta property="og:type" content="website" /> 26 <meta property="og:description" content="Stay up to date with Boschendal's latest news, including wine awards, harvest updates and estate announcements from one of South Africa's oldest wine farms." /> 27 <meta property="og:image" content="https://content.storefront7.co.za/stores/za.co.storefront8.luro5t.boschendal/pictures/boschendall-white-full_9gx3.png" /> 28 <meta property="og:image:width" content="1200" /> 29 <meta property="og:image:height" content="630" /> 30 31 <!-- Twitter Card Tags --> 32 <meta name="twitter:card" content="summary_large_image" /> 33 <meta name="twitter:title" content="News | Boschendal Wine Estate Updates and Awards | Boschendal" /> 34 <meta name="twitter:description" content="Stay up to date with Boschendal's latest news, including wine awards, harvest updates and estate announcements from one of South Africa's oldest wine farms." /> 35 <meta name="twitter:image" content="https://content.storefront7.co.za/stores/za.co.storefront8.luro5t.boschendal/pictures/boschendall-white-full_9gx3.png" /> 36 <meta name="twitter:image:width" content="1200" /> 37 <meta name="twitter:image:height" content="675" /> 38 39 <!-- Breadcrumb structured data (BreadcrumbList) --> 40 41 <!-- Organization structured data (Organization) --> 42 43 44 45
45<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
45 46 47 <!-- Stylesheets --> 48 <link data-stylesheet="main" rel="stylesheet" href="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.brampton/themes/Boschendal_SF8/61b4e2ec-7623-4099-acd1-8076be189f32.css?r=2026092607" /> 49 50 51 <style 52 53 54 type="text/css"> 55 <style> 56.banner-overlay { 57 position: absolute; 58 top: 0; 59 left: 0; 60 width: 100%; 61 height: 100%; 62 display: flex; 63 flex-direction: column; 64 justify-content: flex-start; 65 align-items: center; 66 text-align: center; 67 padding: 40px 20px 0; 68 box-sizing: border-box; 69} 70 71.banner-overlay__title { 72 font-family: Georgia, 'Times New Roman', serif; 73 font-weight: 400; 74 font-size: clamp(28px, 5vw, 56px); 75 line-height: 1.1; 76 letter-spacing: 2px; 77 color: #ffffff; 78 text-transform: uppercase; 79 margin: 0 0 30px; 80 max-width: 500px; 81} 82 83.banner-overlay__logo { 84 width: 90%; 85 max-width: 520px; 86 height: auto; 87 margin-top: auto; 88 margin-bottom: 30px; 89} 90</style> 91 </style> 92 93 94 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/codemirror.min.css" /> 95 <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.min.css"> 96 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css" /> 97 <link rel="stylesheet" href="https://content.storefront7.co.za/common/css/flatpickr/material_blue.css" /> 98 99
99<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
99 100
100<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" defer></script>
100 101
101<script src="https://use.fontawesome.com/36070ee43c.js" defer></script>
101 102
102<script src="//content.storefront7.co.za/common/scripts/lazyload.min.js"></script>
102 103
103<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.matchHeight/0.7.2/jquery.matchHeight-min.js" type="text/javascript"></script>
103 104 105
105<script src="//content.storefront7.co.za/common/scripts/jquery.mustache.min.js" type="text/javascript"></script>
105 106
106<script src="//content.storefront7.co.za/common/scripts/mustache.min.js" type="text/javascript"></script>
106 107
107<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.client.sdk.min.js?v=26092607"></script>
107 108
108<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.events.appear.min.js?v=26092607"></script>
108 109
109<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-tiny-pubsub/0.7.0/ba-tiny-pubsub.min.js"></script>
109 110
110<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js" type="text/javascript"></script>
110 111 112
113<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.optin.min.js?v=26092607"></script>
vendor: 1 bytes, line 113
113
114<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.facebook-pixel.min.js?v=26092607"></script>
vendor: 1 bytes, line 114
114
115<script type="text/javascript"> 116 var optinMaxAgeMinutes = 43200; 117 118 // Initialize Optin SDK 119 120 Optin.Add('Google Analytics 4', 'G-53ZR0Z0N7B', 'performance'); 121 122 Optin.Add('Google Tag Manager', 'GTM-NLM8TF3', 'performance'); 123 124</script>
124 125<noscript> 126</noscript> 127 128 129
129<script type="text/javascript"> 130 var sdk = new SDK.default(); 131 Optin.Initialize(); 132 </script>
132 133 134 <!-- Enhanced eComerce --> 135 136 137
137<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.seo.enhancedecommerce.min.js?v=26092607" 138 id="enhanced-ecommerce" 139 data-product-impressions="True" 140 data-product-click-tracking="True" 141 data-product-details="True" 142 data-checkout-tracking="True" 143 data-purchase-tracking="True" 144 data-cart-changes="True"></script>
144 145 146 147
147<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.api.min.js?v=26092607" 148 id="ApiScript" 149 data-api-key="fpt4bubtmwduh99rpsf16xsnb9pcibed" 150 data-reference="BOT-SESSION-2"> 151</script>
151 152 153 154 155 <!--[if lt IE 9]> 156
156<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
156 157
157<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
157 158 <![endif]-->
vendor: 84 bytes, lines 158-163
158 159 160 <script src="https://www.google.com/recaptcha/api.js" defer></script> 161 162 163
163<meta name="google-site-verification" content="WijcxTgU7QE_CEHnPVHqBC67HeMqPEREX-rw7O0WUFg" /> 164 165
166<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.google-analytics-4.min.js?v=26092607"></script>
166 167
167<script defer> 168 $(function () { 169 if(window.SFGA) SFGA.Init('G-53ZR0Z0N7B', '', 'False' == 'True'); 170 }); 171 </script>
171 172 173 174 175 <link rel="icon" type="image/x-icon" href="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.boschendal/pictures/6_sac4.ico?height=32&width=32" /> 176 177 178 179</head> 180<body>
vendor: 77 bytes, lines 180-182
180 181 <noscript> 182 <iframe src="https://www.googletagmanager.com/ns.html?id=
182GTM-NLM8TF3
vendor: 101 bytes, lines 182-186
182" 183 height="0" width="0" style="display:none;visibility:hidden"></iframe> 184 </noscript> 185 186
186<div id="notification"> 187 <div class="alert" id="message"> 188 <div class="ui-notify #{style}"> 189 <div class="ui-notify-contain"> 190 <p><i class="fa fa-#{icon}"></i>#{text}</p> 191 <a data-dismiss="alert" class="btn btn-ok">OK</a> 192 <a href="/checkout/cart" class="btn btn-view-cart">View Cart</a> 193 </div> 194 <a class="notify-close" data-dismiss="alert"><i class="fa fa-close"></i></a> 195 </div> 196 </div> 197 </div> 198 <zone section="Before Header"> 199</zone> 200 201 <!-- header starts --> 202<header class="masthead header-b"> 203 <div class="top-bar"> 204 <div class="container"> 205 <button class="btn-country-selector" data-toggle="modal" data-target="#currency-selector"> 206 <span class="country-delivery-flag"><i class="flag-sm flag-sm-ZA"></i></span> 207 <span class="country-currency-name">ZAR</span> 208 <span class="country-currency-code">(R)</span> 209</button> 210 <button type="button" class="btn-branch-selector" id="branch-selector-btn" aria-label="Select branch" title="Select your branch for stock and checkout" style="display: none;"> 211 <i class="fa fa-map-marker" aria-hidden="true"></i> 212 <span class="branch-selector-label" id="branch-selector-label">Choose branch</span> 213</button> 214 215 <div class="utils"> 216 <a class="util-mail" href="mailto:[email protected]"><i class="fa fa-envelope"></i>[email protected]</a> 217 </div> 218 <minicart> 219 <span class="placeholder"></span> 220 </minicart> 221
221<script id="minicart_html" type="text/html"> 222 <ul class="mini-cart"> 223 <li class="dropdown"> 224 <a class="desktop-menu-mini-cart dropdown-toggle" data-toggle="dropdown" href="/checkout/cart" role="button" aria-haspopup="true" aria-expanded="false"> 225 <i class="fa fa-shopping-cart"></i><span class="mini-cart-count">{{ItemCount}}</span> <span class="mini-cart-text-contain">item(s)</span><i class="fa fa-chevron-down"></i> 226 </a> 227 <a class="mobile-menu-mini-cart" href="/checkout/cart"> 228 <i class="fa fa-shopping-cart"></i><span class="mini-cart-count">{{ItemCount}}</span> <span class="mini-cart-text-contain">item(s)</span> 229 </a> 230 <div class="dropdown-menu"> 231 {{^HasItems}} 232 <p class="cart-empty">Your cart is empty.</p> 233 {{/HasItems}} 234 {{#HasItems}} 235 <ul class="mini-cart-content"> 236 {{#Items}} 237 <li> 238 <div class="mini-cart-item"> 239 <a href="{{Url}}" class="mini-cart-img-contain"> 240 <span class="mini-cart-img" role="img" aria-label="" style="background-image: url('{{Picture}}');"></span> 241 </a> 242 <a href="{{Url}}" class="mini-cart-title"> 243 {{Name}} 244 </a> 245 <span class="mini-cart-extra">x{{Qty}}</span> 246 {{#IsEnquiryProduct}} 247 <span class="mini-cart-enquiry">Enquiry</span> 248 {{/IsEnquiryProduct}} 249 {{#Price}} 250 <span class="mini-cart-price">{{PriceText}}</span><span class="incl-text">Incl. VAT</span> 251 {{/Price}} 252 <button type="button" class="mini-cart-remove" data-basket-item-id="{{Id}}" 253 sf-ga-trigger="click" 254 sf-ga-event="remove_from_cart" 255 sf-ga-data-endpoint='/ajax/google-analytics-4/cart/item?itemId={{Id}}'><i class="fa fa-close"></i></button> 256 </div> 257 </li> 258 {{/Items}} 259 </ul> 260 {{#Total}} 261 <div class="mini-cart-total clearfix"> 262 <span class="mini-cart-total-title">Total</span> 263 <span class="mini-cart-total-amount">{{TotalText}}</span> 264 </div> 265 {{/Total}} 266 {{#AllowWallet}} 267 <div class="mini-cart-total clearfix"> 268 <span class="mini-cart-total-title">Available Wallet Credit</span> 269 <span class="mini-cart-total-amount">{{TotalWalletPointsAvailableText}}</span> 270 </div> 271 {{/AllowWallet}} 272 273 <div class="mini-cart-footer clearfix"> 274 <a href="/checkout/cart" class="btn">View Cart</a> 275 <button onclick="Cart.MiniCart.ClearCart()" class="btn btn-danger">Clear Cart</button> 276 </div> 277 {{/HasItems}} 278 </div> 279 </li> 280 </ul> 281 </script>
281 282
282<script> 283 $(function () { 284 if (window.location.pathname.indexOf('checkout') <= 0) 285 Cart.MiniCart.GetMiniCart(); 286 else { 287 $('minicart').remove(); 288 } 289 }); 290 </script>
290 291 292 <account-menu> 293 <span class="placeholder"></span> 294</account-menu> 295
296<script id="accountmenu_html" type="text/html"> 297 <ul class="account-dropdown"> 298 {{#LoggedIn}} 299 <li class="dropdown"> 300 <button type="button" class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 301 <span class="user-name-switch">{{Name}}</span><i class="fa fa-user"></i><i class="fa fa-chevron-down"></i> 302 </button> 303 <div class="dropdown-menu"> 304 <ul> 305 {{#Links}} 306 <li><a href="{{Url}}"><i class="{{Icon}}"></i>{{Text}}</a></li> 307 {{/Links}} 308 {{^HideAccountSwitch}} 309 {{#MultipleAccounts}} 310 <li><a href="/account/switch"><i class="fa fa-users"></i>Switch Account</a></li> 311 {{/MultipleAccounts}} 312 {{/HideAccountSwitch}} 313 <li><a href="/account/logout" class="btn">Sign Out</a></li> 314 </ul> 315 </div> 316 </li> 317 {{/LoggedIn}} 318 {{^LoggedIn}} 319 <li class="account-lnk-sign-in"><a href="/account/login">Sign In</a></li> 320 <li class="account-lnk-register"><a href="/account/register">Register</a></li> 321 {{/LoggedIn}} 322 </ul> 323</script>
vendor: 1 bytes, line 323
323
324<script> 325 sdk.profile.get({ 326 success: function (response) { 327 var data = response.data; 328 var roles = data.Roles == undefined ? "" : data.Roles; 329 var profileModel = { 330 Backoffice: data.LoggedIn ? roles.indexOf("BackOffice") > -1 : false, 331 MultipleAccounts: data.LoggedIn ? roles.indexOf("MultipleAccounts") > -1 : false, 332 HideAccountSwitch: data.HideAccountSwitch 333 } 334 $('account-menu').html(Mustache.render($('#accountmenu_html').html(), $.extend({}, data, profileModel))); 335 }, 336 error: function (resp) { console.log("Error Loading Account Menu:", resp) } 337 }); 338</script>
338 339 </div> 340 </div><!-- /.top-bar --> 341 <nav class="navbar"> 342 <div class="sub-bar"> 343 <div class="container"> 344 <div class="navbar-header"> 345 <div class="navbar-toggle-contain"> 346 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> 347 <span class="sr-only">Toggle navigation</span> 348 <span class="icon-bar"></span> 349 <span class="icon-bar"></span> 350 <span class="icon-bar"></span> 351 <span class="navbar-helper-text">Menu</span> 352 </button> 353 </div> 354 <a class="navbar-brand" href="/"> 355 <img class="img-responsive update" src="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.boschendal/pictures/boschendall-white-full_9gx3.png" alt="Boschendal" /> 356</a> 357 358<a class="navbar-brand scrolling-logo" style="display: none;" href="/"> 359 <img class="img-responsive update" src="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.brampton/files/boschendal-white-small-c8m0.png" alt="store-logo-scroll" /> 360</a> 361 362 <div class="mobile-account"> 363 <account-menu></account-menu> 364 </div> 365 <div class="mobile-cart"> 366 <minicart></minicart> 367 </div> 368 </div> 369 <div class="navbar-ctas"> 370 <div class="mini-search"> 371 <form method="get" action="/products/browse"> 372 <input type="search" name="keywords" placeholder="Search" autocomplete="off" solr-predictive /> 373 <button type="submit" class="btn"> 374 <i class="fa fa-search"></i> 375 </button> 376 </form> 377 </div> 378 <!-- /.mini-search --> 379
379<script type="text/javascript"> 380 381 $('[name=keywords]').on('keypress', 382 function(e) { 383 384 if (e.which === 32 || e.which === 13 || e.which === 45 || e.which === 46) return; 385 386 if (e.which < 48 || 387 (e.which > 57 && e.which < 65) || 388 (e.which > 90 && e.which < 97) || 389 e.which > 122) { 390 e.preventDefault(); 391 } 392 }); 393 394 $('[name=keywords]').on('input', 395 function(e) { 396 $(this).val(function(i, v) { 397 return v.replace(/[<>]/g, ''); 398 }); 399 }); 400 401 $('.mini-search form').on('submit', 402 function(e) { 403 var term = $('input[name=keywords]').val(); 404 if (window.SFGA) SFGA.Event('search', '{"search_term":"' + term + '"}'); 405 if (window.FBQ) FBQ.search({ search_string: term }) 406 }); 407 408 </script>
408 409 410 </div> 411 </div> 412 </div> 413 <zone section="Before Menu"> 414</zone> 415 416 <div class="nav-contain"> 417 <div class="container"> 418 <div class="predictive-search row"> 419 <div class="container"> 420 <div class="predictive-search-holder"> 421 <div class="result-contain clearfix" style="display:none;"> 422 <div class="search-results col-md-8 col-lg-8"> 423 <div class="product-result-holder"> 424 <h4>Matching Products Found<small class="hidden-xs">Found: <span></span></small><a href="/products/browse" title="view all search results">View All</a></h4> 425 <div class="product-results"> 426 <p>NONE</p> 427 </div> 428 </div> 429 </div> 430 <div class="search-side-bar col-md-4 col-lg-4"> 431 <div class="category-result-holder"> 432 <h4>Matching Categories Found</h4> 433 <div class="category-results"> 434 <p>NONE</p> 435 </div> 436 </div> 437 <div class="brand-result-holder hidden-xs"> 438 <h4>Matching Brands Found</h4> 439 <div class="brand-results"> 440 <p>NONE</p> 441 </div> 442 </div> 443 <div class="suggestion-result-holder hidden-xs"> 444 <h4>Suggestions</h4> 445 <div class="suggestion-results"> 446 <p>NONE</p> 447 </div> 448 </div> 449 </div> 450</div> 451<div class="search-more-characters clearfix " style="display:none;"> 452 <p>Search term too short. Please add more characters.</p> 453</div> 454<div class="search-loading clearfix" style="display:none;"> 455 <p>Searching...</p> 456</div> 457<div class="search-noresults clearfix" style="display:none;"> 458 <p>No results found matching "<span></span>"...</p> 459</div> 460 </div> 461 </div> 462 </div> 463 <div id="navbar" class="navbar-collapse collapse"> 464 <ul class="nav navbar-nav"> 465 <li class=""> 466 <a data-type="Page" data-contextId="222" href="/our-story" target=""><i class="nav-icon "></i>Our Story</a> 467 </li> 468 <li class=""> 469 <a data-type="Page" data-contextId="223" href="/our-winemakers" target=""><i class="nav-icon "></i>Our Winemakers</a> 470 </li> 471 <li class=""> 472 <a data-type="Page" data-contextId="224" href="/wines" target=""><i class="nav-icon "></i>Wines</a> 473 </li> 474 <li class=""> 475 <a data-type="Link" data-contextId="33" href="/products/splash" target=""><i class="nav-icon "></i>Shop</a> 476 </li> 477 <li class=""> 478 <a data-type="Page" data-contextId="225" href="/estate" target=""><i class="nav-icon "></i>The Estate</a> 479 </li> 480 <li class="dropdown"> 481 <a data-type="Link" data-contextId="377" href="#" target="_self" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><i class="nav-icon"></i>Partnerships<i class="fa fa-chevron-down"></i></a> 482 <ul class="dropdown-menu"> 483 <li data-contextId="378" data-path="/partnerships/paul-womens-month-campaign"><a href="/partnerships/paul-womens-month-campaign" target="_self"><i class="nav-icon "></i>PAUL Bakeries</a></li> 484 </ul> 485 </li> 486 <li class=""> 487 <a data-type="Link" data-contextId="362" href="/news" target="_self"><i class="nav-icon "></i>News</a> 488 </li> 489 <li class=""> 490 <a data-type="Page" data-contextId="226" href="/contact" target=""><i class="nav-icon "></i>Contact Us</a> 491 </li> 492</ul> 493 </div> 494 </div> 495 </div> 496 </nav> 497</header> 498<!-- header ends --> 499 500 <zone section="Before Main"> 501</zone> 502 503 <!-- main content starts --> 504 <main class="main-content"> 505 <div class="news-post-contain"> 506 <div class="page-header"> 507 <div class="container"> 508 <h1>News</h1> 509 </div> 510 </div> 511 <div class="container"> 512 <div class="row"> 513 <div class="col-sm-8 col-lg-8 col-md-9"> 514 <div class="col-sm-12 col-md-6"> 515 <div class="news-post-item news-top-story"> 516 <a class="news-post-img" href="/news/trophy-wine-show-2026"> 517 <img class="img-responsive" src="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.brampton/pictures/639167677069119242/trophy-wine-show-2026---press-piece-news-banner-mmtbm0.png" alt="Boschendal Winning Trophy's" loading="lazy" /> 518 </a> 519 <div class="news-post-content"> 520 <div class="news-post-meta"> 521 <h2> 522 <a href="/news/trophy-wine-show-2026">Boschendal Wins Big at Trophy Wine Show 2026</a> 523 </h2> 524 <div class="news-post-date"> 525 Tuesday, 09 June 2026 526 </div> 527 </div> 528 <div class="news-article-summary"> 529 <p>Boschendal secured three trophies at the Trophy Wine Show 2026, including Best Red Blend and Best Pinot Noir, plus gold medals across major 2026 wine competitions.
529</p> 530 </div> 531 </div> 532 </div> 533 </div> 534 <div class="col-sm-12 col-md-6"> 535 <div class="news-post-item news-side-item"> 536 <a class="news-post-img" href="/harvest-2026-1"> 537 <img class="img-responsive" src="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.brampton/pictures/639186103589090189/1-4wtw1s.png" alt="Boschendal Wine Estate" loading="lazy" /> 538 </a> 539 <div class="news-post-content"> 540 <div class="news-post-meta"> 541 <h2> 542 <a href="/harvest-2026-1">Harvest 2026 | Wine Estate</a> 543 </h2> 544 <div class="news-post-date"> 545 Thursday, 02 April 2026 546 </div> 547 </div> 548 </div> 549 </div> 550 </div> 551 <div style="float: right;"> 552 <style> 553 .navigation-pager a[disabled="disabled"] { 554 pointer-events:none; 555 cursor:not-allowed; 556 opacity: .4; 557 } 558</style> 559 560 <nav class="navigation-pager" aria-label="Page navigation"> 561 <ul class="pagination"> 562 <li> 563 <a href="/news?&page=1" disabled="disabled" aria-label="First"> 564 <span aria-hidden="true"><i class="fa fa-angle-double-left"></i></span> 565 </a> 566 </li> 567 <li> 568 <a href="/news?&page=0" disabled="disabled" aria-label="Previous"> 569 <span aria-hidden="true"><i class="fa fa-angle-left"></i></span> 570 </a> 571 </li> 572 <li class="pagination-select"> 573 <select name="page" data-qs="1" class="js-select"> 574 <option value="1" selected>1</option> 575 </select> 576 </li> 577 <li> 578 <a href="/news?&page=2" disabled="disabled" aria-label="Next"> 579 <span aria-hidden="true"><i class="fa fa-angle-right"></i></span> 580 </a> 581 </li> 582 <li> 583 <a href="/news?&page=1" disabled="disabled" aria-label="Last"> 584 <span aria-hidden="true"><i class="fa fa-angle-double-right"></i></span> 585 </a> 586 </li> 587 </ul> 588 </nav> 589 590 </div> 591 </div> 592 <div class="col-sm-4 col-lg-4 col-md-3"> 593 <div class="blog-sidebar clearfix"> 594 595 596 <h3>Archives</h3> 597 <ol class="blog-list"> 598 <li><a href="/news?year=2026&month=6">June 2026 (1)</a></li> 599 <li><a href="/news?year=2026&month=4">April 2026 (1)</a></li> 600 </ol> 601 602</div> 603 </div> 604 </div> 605 </div> 606</div> 607 608 609 </main> 610 <zone section="After Main"> 611</zone> 612 613 614 <!-- main content ends --> 615 <zone section="Before Footer"> 616</zone> 617 618 <!-- footer starts --> 619<footer class="footer"> 620 <div class="footer-top"> 621 <div class="container"> 622 <div class="row"> 623 <div class="col-sm-3"> 624 <span class="footer-title">Quick Links</span> 625 <ul class="footer-list"> 626 <li><a href="/">Home</a></li> 627 <li><a href="/our-story">Our story</a></li> 628 <li><a href="/our-winemakers">Our Winemakers</a></li> 629 <li><a href="/wines">Wines</a></li> 630 <li><a href="/products/splash">Shop</a></li> 631 <li><a href="/contact">Contact us</a></li> 632 </ul> 633 </div> 634 <div class="col-sm-3"> 635 <span class="footer-title">Policies</span> 636 <ul class="footer-list"> 637 <li><a href="/privacy-policy">Privacy Policy</a></li> 638 <li><a href="/terms">Terms & Conditions</a></li> 639 <li><a href="/shipping-and-delivery">Shipping & Delivery</a></li> 640 </ul> 641 </div> 642 <div class="col-sm-3"> 643 <span class="footer-title">Connect</span> 644 <ul class="footer-list"> 645 <li class="social-list-item"> 646 <a class="social-link" href="https://www.facebook.com/boschendal/"> 647 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z" /></svg> 648 </a> 649</li> 650 <li class="social-list-item"> 651 <a class="social-link" href="https://www.instagram.com/boschendal/"> 652 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z" /></svg> 653 </a> 654</li> 655 <li class="social-list-item"> 656 <a class="social-link" href="https://x.com/boschendalwines"> 657 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
657<path d="M64 32C28.7 32 0 60.7 0 96V416c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zm297.1 84L257.3 234.6 379.4 396H283.8L209 298.1 123.3 396H75.8l111-126.9L69.7 116h98l67.7 89.5L313.6 116h47.5zM323.3 367.6L153.4 142.9H125.1L296.9 367.6h26.3z" /></svg> 658 </a> 659</li> 660 </ul> 661 </div> 662 663 </div> 664 </div> 665 </div> 666 <div class="footer-bottom"> 667 <div class="container"> 668 <p> 669 Copyright © 2026 Boschendal | All rights reserved. Powered by: <a rel="noopener noreferrer" href="https://ordereazi.com" target="_blank">OrderEazi</a> 670</p> 671 672 </div> 673 </div> 674</footer> 675<!-- footer ends --> 676 <zone section="After Footer"> 677</zone> 678 679 680 <!-- Modals --> 681 <div class="modal fade" id="currency-selector" role="dialog"> 682 <div class="modal-dialog" role="document"> 683 <div class="modal-content"> 684 <div class="modal-header"> 685 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="fa fa-close"></i></button> 686 <h4 class="modal-title">Choose your delivery country and preferred currency</h4> 687 </div> 688 <div class="modal-body"> 689 <div id="currency-form" class="form-horizontal"> 690 <div class="form-group"> 691 <label class="col-md-4 control-label">Delivery Country</label> 692 <div class="col-md-8"> 693 <select id="Country" class="js-select-countries"> 694 <option value="ZAF" title="ZA" selected='selected'>South Africa</option> 695 </select> 696 </div> 697 </div> 698 <div class="form-group"> 699 <label class="col-md-4 control-label">Currency</label> 700 <div class="col-md-8"> 701 <select id="Currency"class="js-select-with-search"> 702 <option value="ZAR" selected='selected' >ZAR (R)</option> 703 </select> 704 </div> 705 </div> 706 <div class="form-group"> 707 <div class="col-md-offset-4 col-md-4"> 708 <button type="button" data-loading-text='<i class="fa fa-circle-o-notch fa-spin"></i> Switching' class="btn">Continue</button> 709 </div> 710 </div> 711 </div> 712 </div> 713 </div> 714 </div> 715</div> 716 <link rel="stylesheet" href="/scss/branch-selector.css" /> 717 718<div id="branch-selector-overlay" class="branch-selector-overlay" aria-hidden="true"></div> 719<div id="branch-selector-drawer" class="branch-selector-drawer" role="dialog" aria-labelledby="branch-selector-title" aria-modal="true"> 720 <div class="branch-selector-drawer-header"> 721 <h2 id="branch-selector-title" class="branch-selector-drawer-title">Select your branch</h2> 722 <button type="button" class="branch-selector-close" id="branch-selector-close" aria-label="Close">×</button> 723 </div> 724 <div class="branch-selector-drawer-body"> 725 <p class="branch-selector-hint text-muted small">Stock and checkout will use this branch’s inventory. Your choice is saved.</p> 726 <div id="branch-selector-geo" class="branch-selector-geo text-muted small" style="display: none;"> 727 <span id="branch-selector-geo-text"></span> 728 <button type="button" class="btn btn-primary btn-sm" id="branch-selector-geo-try" style="display: none;">Use my location</button> 729 </div> 730 <div id="branch-selector-search-wrap" class="branch-selector-search" style="display: none;"> 731 <input type="search" class="form-control input-sm" id="branch-selector-search" placeholder="Search..." autocomplete="off" /> 732 </div> 733 <div id="branch-selector-list" class="branch-selector-list"> 734 <span class="branch-selector-loading" id="branch-selector-loading">Loading…</span> 735 <ul class="list-unstyled" id="branch-selector-ul" style="display: none;"></ul> 736 <button type="button" class="btn btn-default btn-sm branch-selector-load-more" id="branch-selector-load-more" style="display: none;">Load more</button> 737 </div> 738 <button type="button" class="btn btn-default btn-sm" id="branch-selector-clear" style="display: none;">Clear branch</button> 739 </div> 740</div> 741 742 743 <!-- Generic Quick Quote --> 744 <div class="modal fade" id="newsletter-modal" role="dialog"> 745 <div class="modal-dialog" role="document"> 746 <div class="modal-content"> 747 <div class="modal-header"> 748 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><i class="fa fa-close"></i></button> 749 <h4 class="modal-title sub-font"><i>
749Don't miss a single thing, sign up to our newsletter</i></h4> 750 </div> 751 <div class="modal-body"> 752 <div id="globalNewsletter"> 753 <div style="position: relative;display:block;width:100%; height:300px;"> 754 <div class="overlay-container" style="position: absolute;width: 100%;height: 100%;top: 0;left: 0;z-index: 2;cursor: pointer;"> 755 <div class="overlay" style="text-align: center;margin: 0 auto;height: 150px;width: 250px;position: relative;left: 0;margin-top: -75px;top: 50%;border-radius: 70px;"> 756 <span class="fa fa-spinner fa-spin" style="vertical-align: middle;position: absolute;left: 50%;margin: 0 auto;font-size: 50px;top: 50%;color: #333;margin-top: -25px;margin-left: -25px;"></span> 757 </div> 758 </div> 759 </div> 760 </div> 761 762
762<script> 763 $(document).ready(function(){ 764 var script = document.createElement("script"); 765 script.src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.validate.min.js"; 766 document.head.appendChild(script); 767 $("#globalNewsletter").load("https://bof9t2465b.execute-api.eu-west-1.amazonaws.com/Prod/form/get-form?key=6d82cada-be5e-4350-abda-c4d697677a63"); 768 }); 769 </script>
769 770 </div> 771 </div> 772 </div> 773 </div> 774 775 <!-- Scripts --> 776
776<script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery.dotdotdot/1.7.4/jquery.dotdotdot.min.js" defer></script>
776 777
777<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js" defer></script>
777 778
778<script src="https://cdnjs.cloudflare.com/ajax/libs/malihu-custom-scrollbar-plugin/3.1.5/jquery.mCustomScrollbar.concat.min.js" defer></script>
778 779
779<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.js" defer></script>
779 780
780<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.29.0/codemirror.min.js" defer></script>
780 781
781<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js" defer></script>
781 782
782<script src="https://cdnjs.cloudflare.com/ajax/libs/bootbox.js/5.5.2/bootbox.min.js" defer></script>
782 783
783<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/flatpickr.min.js" defer type="text/javascript"></script>
783 784 785
785<script src="//content.storefront7.co.za/common/scripts/jquery.notify.min.js" defer></script>
785 786
786<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.core.min.js?v=26092607" defer></script>
786 787
787<script src="//content.storefront7.co.za/common/scripts/Emmerce.min.js" defer></script>
787 788
788<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.pages.main.min.js?v=26092607" defer></script>
788 789
789<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.content.min.js?v=26092607" id="ContentEddietor" data-api-key="" defer></script>
789 790
790<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.ui.min.js?v=26092607" defer></script>
790 791
791<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront.branch-selector.js?v=26092607" defer></script>
791 792
792<script src="//content.storefront7.co.za/common/scripts/raty.js" defer></script>
792 793 794
794<script>window.__featureToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uUmVmZXJlbmNlIjoiQk9ULVNFU1NJT04tMiIsImFjYyI6IjAiLCJzdG9yZSI6IjIiLCJ2ZXIiOiIxNzkwMzYwMzUzIiwiZmVhdHVyZXMiOiJBZGRUb0NhcnQsQWRkVG9HaWZ0UmVnaXN0cnksQWRkVG9XaXNobGlzdCxDcmVhdGVBZGRyZXNzLE1hbmFnZUFkZHJlc3NlcyxNYW5hZ2VQcm9maWxlLFBsYWNlT3JkZXJzLFJlbW92ZUFkZHJlc3MsUmVvcmRlcixVc2VGaWx0ZXJzLFVzZVNlYXJjaCxWaWV3QWxsQnJhbmNoZXMsVmlld0F2YWlsYWJpbGl0eSxWaWV3QnVsa1ByaWNpbmcsVmlld0NvdXBvbnMsVmlld0VucXVpcnlIaXN0b3J5LFZpZXdHaWZ0UmVnaXN0cnksVmlld0dpZnRWb3VjaGVycyxWaWV3SW52b2ljZXMsVmlld09yZGVySGlzdG9yeSxWaWV3UHJpY2luZyxWaWV3UHJvZHVjdERlc2NyaXB0aW9uLFZpZXdQcm9kdWN0RG9jdW1lbnRhdGlvbixWaWV3UHJvZHVjdE5vdGVzLFZpZXdQcm9kdWN0VmFsaWRDb21tLFZpZXdXYWxsZXQsVmlld1dpc2hsaXN0IiwibmJmIjoxNzkwNDA3MzY1LCJleHAiOjE3OTA0MTA5NjUsImlhdCI6MTc5MDQwNzM2NSwiaXNzIjoiY29tbWVyY2UtZmVhdHVyZXMiLCJhdWQiOiJzdG9yZWZyb250In0.RLkPuxWF88Is0ZEIFBsrkn_3I115ATcjw5345IRjD10";</script>
794 795
795<script src="https://resources.storefront7.co.za/release/V8.018.007/scripts/storefront-features.js?v=26092607"></script>
795 796 797 <!-- PageScripts --> 798 799
799<script> 800 $(function() { 801 $('.news-post-summary').dotdotdot({ 802 ellipsis: '...', 803 wrap: 'word', 804 height: 110, 805 watch: true 806 }); 807 808 $('.news-post-item h2').dotdotdot({ 809 ellipsis: '...', 810 wrap: 'word', 811 height: 44, 812 watch: true 813 }); 814 $('.news-top-story h2').dotdotdot({ 815 ellipsis: '...', 816 wrap: 'word', 817 height: 99, 818 watch: true 819 }); 820 }); 821 </script>
821 822 823 824 825
825<script 826 827 828 type="text/javascript" 829 > 830 //Variables 831var header = $('.masthead').outerHeight(); 832var topBar = $('.top-bar').outerHeight(); 833 834function HeaderLayout(){ 835 //$('.category-header h1').prependTo('.product-category-contain'); 836 837 $('.navbar-ctas').prepend('<button class="search-trigg"><i class="fa fa-search"></i></button>'); 838 $('.mini-search').appendTo('.nav-contain > .container').wrap('<div class="search-target">'); 839 $('.predictive-search').appendTo('.search-target'); 840 841 $('.search-trigg').on('click', function () { 842 $(this).toggleClass('active'); 843 $('.mini-search').slideToggle(); 844 setTimeout(function () { 845 $('.mini-search input').focus(); 846 }, 400); 847 }); 848 849 $('.mini-search input').focus(function () { 850 $(this).parent().parent().addClass('focused'); 851 }); 852 853 $('.mini-search input').off('click', function () { 854 $(this).parent().parent().removeClass('focused'); 855 $('.result-contain').css('display', 'none'); 856 }); 857 858 $('.mini-search input').blur(function () { 859 $(this).val(''); 860 $(this).parent().parent().removeClass('focused'); 861 }); 862 863 //Header scroll - Logo switch 864 const body = document.body; 865 const scrollUp = "scroll-up"; 866 const scrollDown = "scroll-down"; 867 let lastScroll = 0; 868 869 window.addEventListener("scroll", () => { 870 const currentScroll = window.pageYOffset; 871 872 // Adjust threshold from 1 to 10 for more reliability 873 if (currentScroll <= 0) { 874 // Reached Top 875 body.classList.remove(scrollUp, scrollDown); // Reset both classes 876 $('.navbar-brand.scrolling-logo').css('display', 'none'); 877 $('.navbar-brand:not(.scrolling-logo)').css('display', 'inline-block'); 878 lastScroll = currentScroll; 879 return; 880 } 881 882 if (currentScroll > lastScroll && !body.classList.contains(scrollDown)) { 883 // Scrolling down 884 body.classList.remove(scrollUp); 885 body.classList.add(scrollDown); 886 $('.navbar-brand.scrolling-logo').css('display', 'inline-block'); 887 $('.navbar-brand:not(.scrolling-logo)').css('display', 'none'); 888 } else if (currentScroll < lastScroll && body.classList.contains(scrollDown)) { 889 // Scrolling up 890 body.classList.remove(scrollDown); 891 body.classList.add(scrollUp); 892 } 893 894 lastScroll = currentScroll; 895 }); 896} 897 898function NavSplit() { 899 // Select all li elements inside the ul.navbar-nav 900 var navItems = $('ul.navbar-nav > li'); 901 902 // Fixed split index: first 4 items go to the left 903 var splitIndex = 5; 904 905 // Get the first 5 and the rest 906 var firstHalf = navItems.slice(0, splitIndex); 907 var secondHalf = navItems.slice(splitIndex); 908 909 // Create two new divs to hold the split items 910 var leftNav = $('<div class="left-nav"></div>'); 911 var rightNav = $('<div class="right-nav"></div>'); 912 913 var topBarAccount = $('.top-bar account-menu'); 914 var topBarCart = $('.top-bar minicart'); 915 916 // Append the items 917 leftNav.append(firstHalf); 918 rightNav.append(secondHalf); 919 920 if ($(window).width() > 991) { 921 //prevent account and cart into mobile menu logic - but keep on desktop 922 rightNav.append(topBarAccount).append(topBarCart); 923 } 924 925 // Clear the original ul container 926 $('ul.navbar-nav').empty(); 927 928 // Append the split navs and socials 929 $('ul.navbar-nav').append(leftNav).append(rightNav); 930} 931 932function FooterLayout() { 933 //var headerLogo = $('.navbar-brand img').first().clone(); // clone the logo 934 var footerLogoSrc = $('<img class="img-responsive" src="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.brampton/files/logo-bosch-an52.png" alt="store-logo">'); 935 var footer = $('.footer'); 936 var footerTop = $('.footer-top'); 937 var footerTopContent = footerTop.children(); 938 939 // Create new layout structure
940 var container = $('<div class="container"></div>'); 941 var row = $('<div class="row"></div>'); 942 943 // Create footer logo section 944 var logoSection = $(` 945<div class="footer-logo col-md-4"> 946<div class="cloned-logo"></div> 947<ul class="footer-information"> 948<li>Boschendal Estate, Pniel St, Groot Drakenstein,</li> 949<li>Franschhoek, Western Cape, South Africa, 7680</li> 950<li>+27 (0) 21 271 0688 | [email protected]</li> 951</ul> 952</div> 953`); 954 955 // Insert the cloned header logo into the placeholder 956 logoSection.find('.cloned-logo').append(footerLogoSrc); 957 958 var newFooterTop = $('<div class="footer-top col-md-8"></div>').append(footerTopContent); 959 960 // Compose final layout 961 row.append(logoSection).append(newFooterTop); 962 container.append(row); 963 964 // Replace old .footer-top with new container 965 footerTop.replaceWith(container); 966 967 // Insert Aware.org image after the first paragraph inside .footer-bottom 968 var awareOrg = $('<img src="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.brampton/files/aware-org-rxs5.png" alt="No Under 18 Logo">'); 969 awareOrg.insertAfter($('.footer-bottom').find('p').first()); 970 971 $('.footer-top [class*="col-sm-"]').each(function () { 972 const $el = $(this); 973 $el.removeClass(function (i, className) { 974 return (className.match(/col-sm-\d+/g) || []).join(' '); 975 }).addClass('col-md-3'); // or any desired class 976 }); 977 978 function convertToAccordion() { 979 if ($(window).width() < 991 && $('#footerAccordion').length === 0) { 980 $('.footer-top .col-md-3').each(function (i) { 981 const title = $(this).find('.footer-title').first().text(); 982 const content = $(this).find('ul').clone(); 983 984 const panel = $(` 985<div class="panel panel-default"> 986<div class="panel-heading"> 987<a data-toggle="collapse" data-parent="#footerAccordion" href="#collapse_${i}" class="${i === 0 ? '' : 'collapsed'}" aria-expanded="${i === 0}"> 988<h4 class="panel-title">${title} <i class="fa fa-chevron-down"></i></h4> 989</a> 990</div> 991<div id="collapse_${i}" class="panel-collapse collapse ${i === 0 ? 'in' : ''}"> 992<div class="panel-body"></div> 993</div> 994</div> 995`); 996 997 panel.find('.panel-body').append(content); 998 999 if ($('#footerAccordion').length === 0) { 1000 $('.footer-top .row').after('<div class="panel-group" id="footerAccordion"></div>'); 1001 } 1002 1003 $('#footerAccordion').append(panel); 1004 $(this).hide(); 1005 }); 1006 } 1007 } 1008 1009 function revertToColumns() { 1010 if ($(window).width() >= 991 && $('#footerAccordion').length) { 1011 $('#footerAccordion').remove(); // Remove the accordion 1012 $('.footer-top .col-md-3').show(); // Show original columns 1013 } 1014 } 1015 1016 // Initial load 1017 if ($(window).width() < 991) { 1018 convertToAccordion(); 1019 } 1020 1021 // Resize handler 1022 $(window).on('resize', function () { 1023 if ($(window).width() < 991) { 1024 convertToAccordion(); 1025 } else { 1026 revertToColumns(); 1027 } 1028 }); 1029} 1030 1031function BuildMobileMenu(){ 1032 1033 var menuItems = $('.navbar-nav .left-nav, .navbar-nav .right-nav').children(); 1034 var itemsToHtml = ""; 1035 menuItems.each(function () { 1036 var item = $(this); 1037 var children = item.children('ul').children('li'); 1038 var linkText = item.find('> a').text(); 1039 var linkUrl = item.find('> a').attr('href'); 1040 itemsToHtml += '<li><a class="nav-item" href="' + linkUrl + '">' + linkText + (children.length > 0 ? '<i class="fa fa-angle-right"></i>' : "") + '</a>'; 1041 //Multi level 1042 if (children.length > 0) { 1043 itemsToHtml += '<ul class="level-2 menu">{#innerItems}</ul>'; 1044 var childItemHtml = ""; 1045 children.each(function () { 1046 var child = $(this); 1047 var childText = child.find('> a').text(); 1048 var childLink = child.find('> a').attr('href'); 1049 childItemHtml += '<li><a class="nav-item" href="' + childLink + '">' + childText + '</a></li>'; 1050 }); 1051 itemsToHtml = itemsToHtml.replace('{#innerItems}', childItemHtml); 1052 } 1053 itemsToHtml += '</li>'; 1054 }); 1055 1056 $('.mobile-menu-contain .level-1.menu').empty().html(itemsToHtml); 1057} 1058 1059function FilterBrowse(){ 1060 // Get the current URL path 1061 var currentPath = window.location.pathname + window.location.search; 1062 1063 $('.product-filter-contain .sidebar-ul.categories li a').each(function() {
1064 // Check if the href of the anchor matches the current path 1065 if ($(this).attr('href') === currentPath) { 1066 // Add the 'active' class to the parent list item 1067 $(this).parent().addClass('active'); 1068 } 1069 }); 1070 1071 $('.product-box-contain.product-wrap .product-box-img').each(function() { 1072 let hoverImg = $(this).attr('data-hover'); // or $(this).data('hover') 1073 1074 // check if hoverImg exists and is not the "no-image" placeholder 1075 if (hoverImg && hoverImg !== '/images/no-image.png') { 1076 this.style.setProperty('--hover-img', `url(${hoverImg})`); 1077 $(this).addClass('img-hover'); 1078 } 1079 }); 1080 1081 1082} 1083 1084function Overview(){ 1085 // Target the input 1086 const $input = $('.product-detail-quantity .form-control'); 1087 1088 // Wrap input with container and append buttons 1089 $input.wrap('<div class="quantity-controls"></div>') 1090 .before('<button type="button" class="btn input-decrement"><i class="fa fa-minus"></i></button>') 1091 .after('<button type="button" class="btn input-increment"><i class="fa fa-plus"></i></button>'); 1092 1093 // Handle increment 1094 $('.input-increment').click(function () { 1095 let $input = $(this).siblings('input'); 1096 let current = parseInt($input.val()); 1097 $input.val(current + 1); 1098 }); 1099 1100 // Handle decrement 1101 $('.input-decrement').click(function () { 1102 let $input = $(this).siblings('input'); 1103 let current = parseInt($input.val()); 1104 let min = parseInt($input.attr('min')) || 1; 1105 if (current > min) { 1106 $input.val(current - 1); 1107 } 1108 }); 1109} 1110 1111var $paragraph = $(".paragraph.readmore"); 1112var $readmore_btn = $(`<div class="btn btn-content btn-primary-outline readmore" style="cursor:pointer; margin-top:0.5em;">Read More</div>`); 1113 1114function readMore() { 1115 $readmore_btn.insertAfter($paragraph); 1116 1117 $('.btn.readmore').on('click', function () { 1118 // Find the sibling paragraph element just before the button 1119 var paragraph = $(this).prev('.paragraph.readmore'); 1120 1121 // Toggle the class 1122 paragraph.toggleClass('expand'); 1123 1124 // Toggle button text 1125 $(this).text(paragraph.hasClass('expand') ? 'Read Less' : 'Read More'); 1126 }); 1127} 1128 1129 1130$(document).ready(function (){ 1131 1132 //Header 1133 HeaderLayout(); 1134 1135 //NavSplit 1136 NavSplit(); 1137 1138 //Footer 1139 FooterLayout(); 1140 1141 //Browse Page active link 1142 FilterBrowse(); 1143 1144 //Product Details 1145 Overview(); 1146 1147 //CMS Custom 1148 readMore(); 1149 1150 setTimeout(function(){ 1151 1152 //MobileMenu 1153 BuildMobileMenu(); 1154 }, 1000); 1155}); 1156 </script>
1156 1157
1157<script 1158 1159 1160 type="text/javascript" 1161 > 1162 $(document).ready(function () { 1163 function parallaxScroll() { 1164 var scrollTop = $(window).scrollTop(); 1165 1166 $('.parallax_bg .imageslider2-slide').each(function () { 1167 var $el = $(this); 1168 var offsetTop = $el.offset().top; 1169 var height = $el.outerHeight(); 1170 1171 // Only animate when in viewport 1172 if (scrollTop + $(window).height() > offsetTop && scrollTop < offsetTop + height) { 1173 // Calculate how far the viewport has scrolled past the element 1174 var yOffset = (scrollTop - offsetTop) * 1; // scroll factor 1175 1176 // Start from 50% and add yOffset 1177 $el.css('background-position', 'center calc(50% + ' + yOffset + 'px)'); 1178 } 1179 }); 1180 } 1181 1182 // Bind scroll and resize 1183 $(window).on('scroll resize', parallaxScroll); 1184 1185 // Initial state 1186 $('.parallax_bg .imageslider2-slide').css('background-position', 'center 50%'); 1187 1188 parallaxScroll(); 1189}); 1190 1191 </script>
1191 1192
1192<script 1193 1194 1195 type="text/javascript" 1196 > 1197 $(document).ready(function () { 1198 CyberCellar.Initialise(); 1199}); 1200 1201var CyberCellar = (function ($) { 1202 var _Initialise = function () { 1203 CyberCellar.LoadAgeCookie(); 1204 }; 1205 1206 var _LoadAgeCookie = function () { 1207 var cookie = CyberCellar.GetAgeCookie(); 1208 if (cookie == '1') { 1209 CyberCellar.SetAgeCookie(); 1210 } 1211 else { 1212 var modalHtml = '<div class="modal fade" id="AgeRestrictionModal" role="dialog" style="display:none;background-image:url(\'//content.storefront7.co.za/stores/za.co.storefront8.luro5t.brampton/pictures/638833370229554131/mask-group-11-b231hj.png\');background-color: transparent;background-position: center;background-size: contain;background-repeat: no-repeat;">' + 1213 '<div class="modal-dialog" role="document">' + 1214 '<div class="modal-content" style="text-align:center;">' + 1215 '<div class="modal-body">' + 1216 '<img class="store-logo" src="//content.storefront7.co.za/stores/za.co.storefront8.luro5t.brampton/files/logo-age-gate-rk8s.png" alt="Boschendal Logo Age Gate" />' + 1217 '<h4 class="age-gate-heading age-gate-logo">ENTER THE YEAR OF BIRTH TO EXPERIENCE BOSCHENDAL WINES</h4>' + 1218 '<div class="year-inputs" style="display:flex;justify-content:center;gap:10px;margin:15px 0;">' + 1219 '<input type="text" maxlength="1" class="year-digit form-control text-center" style="width:50px;font-size:20px;" />' + 1220 '<input type="text" maxlength="1" class="year-digit form-control text-center" style="width:50px;font-size:20px;" />' + 1221 '<input type="text" maxlength="1" class="year-digit form-control text-center" style="width:50px;font-size:20px;" />' + 1222 '<input type="text" maxlength="1" class="year-digit form-control text-center" style="width:50px;font-size:20px;" />' + 1223 '</div>' + 1224 '<button type="button" class="btn btn-primary btn-lite" id="age-continue">VIEW OUR WINES</button><br/>' + 1225 '<div style="margin-top:30px;"><p><input type="checkbox" id="age-remember" value="1" checked="checked" tabindex="1" /><label> Remember me</label></p></div>' + 1226 '<p id="age-error" style="color:red;display:none;margin-top:10px;"></p>' + 1227 '</div>' + 1228 '</div>' + 1229 '</div>' + 1230 '</div>'; 1231 1232 $('body').append(modalHtml); 1233 1234 $('#AgeRestrictionModal').modal({ 1235 backdrop: 'static', 1236 keyboard: false 1237 }); 1238 1239 // Handle input event for smooth UX & allow 0-9 properly 1240 $(document).on('input', '.year-digit', function () { 1241 let val = $(this).val().replace(/\D/g, ''); // Keep only numbers 1242 1243 // If user typed/pasted multiple digits, take the last one 1244 if (val.length > 1) { 1245 val = val.slice(-1); 1246 } 1247 1248 $(this).val(val); 1249 1250 // If a digit is entered, focus the next input 1251 if (val !== '') { 1252 $(this).next('.year-digit').focus(); 1253 } 1254 1255 // When all four digits are filled, auto-validate the age 1256 let allFilled = true; 1257 let year = ''; 1258 $('.year-digit').each(function () { 1259 let v = $(this).val(); 1260 if (v === '') { 1261 allFilled = false; 1262 } 1263 year += v; 1264 }); 1265 1266 if (allFilled && year.length === 4) { 1267 autoValidateYear(year); 1268 } 1269 }); 1270 1271 // Backspace handling: clear current, then go to previous input if empty 1272 $(document).on('keydown', '.year-digit', function (e) { 1273 if (e.which === 8) { // Backspace key 1274 if ($(this).val() !== '') { 1275 $(this).val(''); 1276 e.preventDefault(); 1277 } else { 1278 $(this).prev('.year-digit').focus(); 1279 } 1280 } 1281 }); 1282 1283 // Prevent non-numeric characters 1284 $(document).on('keypress', '.year-digit', function (e) { 1285 if (e.which < 48 || e.which > 57) { 1286 e.preventDefault(); 1287 } 1288 }); 1289 1290 // Smart paste handling: auto-fill all boxes if a full year like "2005" is pasted 1291 $(document).on('paste', '.year-digit', function (e) { 1292 e.preventDefault(); 1293 let pasted = (e.originalEvent || e).clipboardData.getData('text').replace(/\D/g, ''); // Keep only numbers 1294 1295 if (pasted.length > 0) { 1296 let inputs = $('.year-digit');
1297 let startIndex = inputs.index(this); 1298 1299 // Auto-fill the inputs sequentially 1300 for (let i = 0; i < pasted.length && startIndex + i < inputs.length; i++) { 1301 $(inputs[startIndex + i]).val(pasted[i]); 1302 } 1303 1304 // If we pasted a full year, auto-validate 1305 if (pasted.length === 4 && startIndex === 0) { 1306 autoValidateYear(pasted); 1307 } else { 1308 // Move focus to the next empty input 1309 let nextEmpty = inputs.filter(function () { 1310 return $(this).val() === ''; 1311 }).first(); 1312 1313 if (nextEmpty.length) { 1314 nextEmpty.focus(); 1315 } else { 1316 inputs.last().focus(); 1317 } 1318 } 1319 } 1320 }); 1321 1322 // Function to validate the user's age automatically 1323 function autoValidateYear(year) { 1324 let errorMsg = $('#age-error'); 1325 let currentYear = new Date().getFullYear(); 1326 let age = currentYear - parseInt(year, 10); 1327 1328 if (isNaN(year) || year.length !== 4) { 1329 errorMsg.text("Please enter all 4 digits of your birth year.").show(); 1330 return; 1331 } 1332 1333 if (age >= 18) { 1334 // Automatically click the continue button 1335 $('#age-continue').click(); 1336 } else { 1337 errorMsg.text("You must be at least 18 years old.").show(); 1338 setTimeout(function () { 1339 window.location = "https://www.google.co.za"; 1340 }, 1500); 1341 } 1342 } 1343 1344 // Handle continue button 1345 $('#AgeRestrictionModal').on('click', '#age-continue', function () { 1346 var year = ''; 1347 $('.year-digit').each(function () { 1348 year += $(this).val(); 1349 }); 1350 1351 var errorMsg = $('#age-error'); 1352 var currentYear = new Date().getFullYear(); 1353 1354 if (year.length !== 4 || isNaN(year)) { 1355 errorMsg.text("Please enter all 4 digits of your birth year.").show(); 1356 return; 1357 } 1358 1359 var age = currentYear - parseInt(year, 10); 1360 1361 if (age >= 18) { 1362 CyberCellar.SetAgeCookie(); 1363 $('#AgeRestrictionModal').modal('hide'); 1364 } else { 1365 errorMsg.text("You must be at least 18 years old.").show(); 1366 setTimeout(function () { 1367 window.location = "https://www.google.co.za"; 1368 }, 1500); 1369 } 1370 }); 1371 } 1372 return true; 1373 }; 1374 1375 1376 var _SetAgeCookie = function () { 1377 var maxAge = 86400;//86400=24hours 1378 //If 'Remember me' is checked then this should be set to 365 days i.e. 365*86400 1379 if ($('#age-remember').is(':checked')) 1380 maxAge *= 365; 1381 1382 document.cookie = "cc:age-gate=1; samesite=Strict; secure; path=/;max-age=" + maxAge + ";"; 1383 1384 return true; 1385 }; 1386 1387 var _GetAgeCookie = function () { 1388 var cookieName = 'cc:age-gate'; 1389 1390 // Split cookie string and get all individual name=value pairs in an array 1391 var cookieArr = document.cookie.split(";"); 1392 1393 // Loop through the array elements 1394 for (var i = 0; i < cookieArr.length; i++) { 1395 var cookiePair = cookieArr[i].split("="); 1396 1397 /* Removing whitespace at the beginning of the cookie name and compare it with the given string */ 1398 if (cookieName == cookiePair[0].trim()) { 1399 // Decode the cookie value and return 1400 return cookiePair[1]; 1401 } 1402 } 1403 1404 // Return empty string if not found 1405 return ''; 1406 }; 1407 1408 return { 1409 Initialise: _Initialise, 1410 LoadAgeCookie: _LoadAgeCookie, 1411 SetAgeCookie: _SetAgeCookie, 1412 GetAgeCookie: _GetAgeCookie 1413 }; 1414})(jQuery); 1415 </script>
1415 1416
1416<script 1417 1418 1419 type="text/javascript" 1420 > 1421 (function ($) { 1422 'use strict'; 1423 1424 if (window.location.href.indexOf('/checkout/details') === -1) return; 1425 1426 function injectWarehouseField() { 1427 var $form = $('form[action="/createorder"]'); 1428 if (!$form.length) return; 1429 if ($form.find('#SpecialInstructions').length) return; 1430 1431 observer.disconnect(); 1432 1433 $('<input>', { 1434 type: 'hidden', 1435 id: 'SpecialInstructions', 1436 name: 'SpecialInstructions', 1437 value: 'Online' 1438 }).appendTo($form); 1439 } 1440 1441 var observer = new MutationObserver(function () { 1442 injectWarehouseField(); 1443 }); 1444 1445 observer.observe(document.body, { childList: true, subtree: true }); 1446 1447})(jQuery); 1448 </script>
1448 1449 1450 1451 <!-- Lazy Load Images --> 1452
1452<script> 1453 $(window).on("load", function () { 1454 lazyload(); 1455 ProductSEO.Init(); 1456 }); 1457 </script>
1457 1458 1459
1460<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"16b565c73d8e4f90a840f3892b5fe19d","spa":2}' crossorigin="anonymous"></script>
1460 1461</body> 1462</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.