1<!DOCTYPE html> 2�<html lang="en"><head><meta content="null" property="og:site_name"/><meta content="http://willowsandpine-restaurant.com/oakland-dimond-district-willows-and-pine-restaurant-and-catering-reservations" property="og:url"/><meta content="website" property="og:type"/><meta content="..." property="og:description"/><meta content="Willows And Pine Restaurant And Catering - Reservations" property="og:title"/><!-- Google tag (gtag.js) -->
vendor: 71 bytes, line 2
2<script async="async" src="https://www.googletagmanager.com/gtag/js?id=
2G-VG24VK2VKT
vendor: 11 bytes, line 2
2"></script>
2<script> 3 window.dataLayer = window.dataLayer || []; 4 function gtag(){dataLayer.push(arguments);} 5 gtag('set', 'linker', {'domains': ['tmt.spotapps.co','spothopperapp.com']}); 6 gtag('js', new Date()); 7 gtag('config', 'G-9EPG6G1Q7B'); 8 gtag('config', 'G-VG24VK2VKT'); 9 </script>
9<!-- wcache 2026-09-30 11:46:35.491100Z --><!-- 10smart_footer: true, 11smart_footer_version: 2, 12scripting_active: false 13--><link href="https://willowsandpine-restaurant.com/oakland-dimond-district-willows-and-pine-restaurant-and-catering-reservations" rel="canonical"/><meta charset="utf-8"/><meta content="IE=edge" http-equiv="X-UA-Compatible"/><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="" name="description"/><meta content="" name="author"/><meta content="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/social_back.jpg" property="og:image"/><meta content="Willows And Pine Restaurant And Catering image" property="og:image:alt"/><meta content="image/png" property="og:image:type"/><meta content="146038661917665" property="fb:app_id"/><meta content="summary_large_image" name="twitter:card"/><meta content="Willows And Pine Restaurant And Catering - Reservations" name="twitter:title"/><meta content="..." name="twitter:description"/><meta content="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/social_back.jpg" name="twitter:image"/><title>Willows And Pine Restaurant And Catering - Reservations</title>
13<script>document.cookie='resolution='+Math.max(screen.width,screen.height)+("devicePixelRatio" in window ? ","+devicePixelRatio : ",1")+'; path=/';</script>
13<link href="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/favicons/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180"/><link href="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/favicons/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/><link href="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/favicons/favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/><link href="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/favicons/site.webmanifest" rel="manifest"/><link color="#5bbad5" href="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/favicons/safari-pinned-tab.svg" rel="mask-icon"/><link href="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/favicons/favicon.ico" rel="shortcut icon"/><meta content="#da532c" name="msapplication-TileColor"/><meta content="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/favicons/browserconfig.xml" name="msapplication-config"/><meta content="#ffffff" name="theme-color"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/custom-scrollbar/jquery.mCustomScrollbar.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/font-awesome-4.7.0/css/font-awesome.min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/hover_css/css/hover-min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/owlcarousel/owl.carousel.min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/owlcarousel/owl.theme.default.min.css" rel="stylesheet"/><link href="https://static.spotapps.co/web-lib/leaflet/[email protected]/dist/leaflet.css" rel="stylesheet"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/css/style.css?version2" id="mainCSS" rel="stylesheet"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/css/bottom_navigation_v1.css?v1725607068" rel="stylesheet"/><link href="css/custom.css?v1725607068&domain=willowsandpine-restaurant.com" rel="stylesheet"/><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/icons_font/css/social_icons.css" rel="stylesheet"/><!--[if IE 7]><link rel="stylesheet" href="lib/icons_font/css/social_icons-ie7.css"><![endif]--><link href="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/twitter_x_font_icon/css/twitter_x.css" rel="stylesheet"/><!--[if IE 7]><link rel="stylesheet" href="lib/twitter_x_font_icon/css/twitter_x-ie7.css"><![endif]--><style> 14 15 html { 16 height: auto; 17 min-height: 100%; 18 } 19 .tmt-page.party-background.drink-menu { 20 background-color: #ebebeb; 21 background-color: #1a1a1a; 22 } 23 .tmt-page.party-background.drink-menu { 24 background-image: url('//static.spotapps.co/spots/2b/fe8d8a5a114f878ff1d9f0c143faeb/wide_medium'); 25 } 26 .tmt-page.party-background.drink-menu:before { 27 display: block; 28 -webkit-backdrop-filter: blur(5px); 29 backdrop-filter: blur(5px); 30 background-color: rgba(255,255,255,0.8); 31 background-color: rgba(0,0,0,0.8); 32 33 } 34 .tmt-page.party-background.drink-menu>div:first-child:before { 35 display: none; 36 } 37 38 </style>
38<script src="https://static.spotapps.co/websites/lib/lazysizes/lazysizes.min.js" async=""></script>
38<script> 39function ga_check(){ 40 return true; 41} 42</script>
42<script> 43function universal_ga(action, type, category, ev_action, label){ 44 if(typeof ga === 'function') 45 { 46 if(!(action && label)) 47 ga(action, type, category) 48 else 49 ga(action, type, category, ev_action, label) 50 } 51 52 if(typeof gtag === 'function') 53 { 54 if(!(action && label)) 55 { 56 hash = category 57 ev_label = hash["eventLabel"] 58 var splits = ev_label.match(/.{1,100}/g) ?? []; 59 delete(hash["eventLabel"]) 60 61 if(splits.length <= 1) 62 hash["eventLabel"] = ev_label 63 else 64 { 65 for (let i = 0; i < splits.length; i++) { 66 var key = "eventLabel_"+i 67 hash[key] = splits[i] 68 } 69 } 70 console.log(hash) 71 gtag("event", hash["eventCategory"], hash); 72 } 73 else 74 { 75 var hash = { 76 eventCategory: category, 77 eventAction: ev_action 78 } 79 80 var splits = label.match(/.{1,100}/g) ?? []; 81 if(splits.length <= 1) 82 hash["eventLabel"] = label 83 else 84 { 85 for (let i = 0; i < splits.length; i++) { 86 var key = "eventLabel_"+i 87 hash[key] = splits[i] 88 } 89 } 90 gtag("event", hash["eventCategory"], hash); 91 } 92 } 93} 94</script>
94<script> function getPromotionUrlParams(){ 95 var params_str = sessionStorage.getItem('shUrlParams'); 96 if (params_str != null){ 97 return JSON.parse(params_str); 98 }else{ 99 return {}; 100 } 101 } 102 103 function getPromotionSourceDetails(){ 104 var params_str = localStorage.getItem('promotionSourceDetails'); 105 if (params_str != null){ 106 return JSON.parse(params_str); 107 }else{ 108 return {}; 109 } 110 } 111 112 function getLastEmailVisitInDays(){ 113 var promotionSourceDetails = getPromotionSourceDetails(); 114 if (!promotionSourceDetails['last_visit_email'] ){ 115 return null; 116 } 117 return Math.floor((new Date() - new Date(promotionSourceDetails['last_visit_email'])) / (1000 * 60 * 60 * 24)); 118 } 119 120 function getLastSocialVisitInDays(){ 121 var promotionSourceDetails = getPromotionSourceDetails(); 122 if (!promotionSourceDetails['last_visit_social'] ){ 123 return null; 124 } 125 return Math.floor((new Date() - new Date(promotionSourceDetails['last_visit_social'])) / (1000 * 60 * 60 * 24)); 126 } 127 128 var shUrlParams = getPromotionUrlParams(); 129 var promotionSourceDetails = getPromotionSourceDetails(); 130 131 new URL(document.location).searchParams.forEach(function(value, paramName){ 132 133 shUrlParams[paramName] = value; 134 135 if (paramName == 'source' && value =='social' ){ 136 promotionSourceDetails['last_visit_social'] = new Date(); 137 localStorage.setItem('promotionSourceDetails', JSON.stringify(promotionSourceDetails)); 138 } 139 140 if (paramName == 'source' && value =='email' ){ 141 promotionSourceDetails['last_visit_email'] = new Date(); 142 localStorage.setItem('promotionSourceDetails', JSON.stringify(promotionSourceDetails)); 143 } 144 145 }); 146 147 sessionStorage.setItem('shUrlParams', JSON.stringify(shUrlParams)) 148</script>
148<style>a:focus:not(:focus-visible){outline:none;box-shadow:none;} 149a.get-directions-footer-link{display:inline-block;transform-origin:left center;transition:transform .2s ease;} 150a.get-directions-footer-link:hover{transform:scale(1.08);} 151@media (prefers-reduced-motion:reduce){a.get-directions-footer-link{transition:none;transform:none;}} 152a.get-directions-footer-link,a.get-directions-footer-link:hover{color:inherit!important;}</style></head><body class="drink-menu party party-background reservations-tmt-page tmt-page" id="tmtPage"><div><header style="background-color:#000000;"><style> 153 154 155.navbar.nav-v6 .container { 156 padding-top: 10px; 157 padding-bottom: 10px; 158} 159.navbar.nav-v6.nav-scroll .container { 160 padding-top: 0px; 161 padding-bottom: 0px; 162} 163.navbar.nav-v6 .header-logo img { 164 max-width: 100%; 165} 166.navbar.nav-v6.nav-scroll .header-logo img { 167 max-width: 80%; 168} 169 170@media (max-width: 767px) { 171 /* DO NOT change mobile nav height on page scroll */ 172 .navbar.nav-v6 .navbar-header, 173 .navbar.nav-v6.nav-scroll .navbar-header { 174 padding-top: 10px; 175 padding-bottom: 10px; 176 } 177 .navbar.nav-v6 .socialnav, 178 .navbar.nav-v6.nav-scroll .socialnav { 179 margin-top: 10px; 180 } 181 .navbar.nav-v6 .container, 182 .navbar.nav-v6.nav-scroll .container { 183 padding-top: 0; 184 padding-bottom: 0; 185 } 186 .navbar.nav-v6 .header-logo, 187 .navbar.nav-v6.nav-scroll .header-logo { 188 height: 70px; 189 } 190 .navbar.nav-v6 .header-logo img { 191 max-height: 100%; 192 } 193 .navbar.nav-v6.nav-scroll .header-logo img { 194 max-width: 100%; 195 } 196 /* HOME page CHANGE mobile nav height on page scroll */ 197 /* Remove body.home-page from below code if there should be mobile nav height change on ALL pages */ 198 body.home-page .navbar.nav-v6 .navbar-header { 199 padding-top: 10px; 200 padding-bottom: 10px; 201 } 202 body.home-page .navbar.nav-v6.nav-scroll .navbar-header{ 203 padding-top: 0px; 204 padding-bottom: 0px; 205 } 206 body.home-page .navbar.nav-v6 .socialnav { 207 margin-top: 10px; 208 } 209 body.home-page .navbar.nav-v6.nav-scroll .socialnav { 210 margin-top: 0px; 211 } 212 body.home-page .navbar.nav-v6 .container{ 213 padding-top: 0; 214 padding-bottom: 0; 215 } 216 body.home-page .navbar.nav-v6.nav-scroll .container { 217 padding-top: 0; 218 padding-bottom: 0; 219 } 220 body.home-page .navbar.nav-v6 .header-logo { 221 height: 70px; 222 } 223 body.home-page .navbar.nav-v6.nav-scroll .header-logo { 224 height: 50px; 225 } 226 body.home-page .navbar.nav-v6 .header-logo img { 227 max-height: 100%; 228 max-width: 100%; 229 } 230 body.home-page .navbar.nav-v6.nav-scroll .header-logo img { 231 max-width: 80%; 232 } 233} 234 235 236.navbar-regular .navbar-collapse.collapse.in { 237 background-color: transparent; 238 width: 100%; 239} 240.navbar.nav-v6{ 241 background-color: #fff; 242 -webkit-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0); 243 -moz-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0); 244 box-shadow: 0px 2px 5px 0px rgba(0,0,0,0); 245 -moz-transition: all 0.3s ease-in-out; 246 -webkit-transition: all 0.3s ease-in-out; 247 -o-transition: all 0.3s ease-in-out; 248 transition: all 0.3s ease-in-out; 249} 250.navbar.nav-v6.nav-scroll{ 251 background-color: #fff; 252 -webkit-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.2); 253 -moz-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.2); 254 box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.2); 255} 256.drink-menu .navbar.nav-v6{ 257 background-color: #fff; 258 -webkit-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0); 259 -moz-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0); 260 box-shadow: 0px 2px 5px 0px rgba(0,0,0,0); 261 -moz-transition: all 0.3s ease-in-out; 262 -webkit-transition: all 0.3s ease-in-out; 263 -o-transition: all 0.3s ease-in-out; 264 transition: all 0.3s ease-in-out; 265} 266.drink-menu .navbar.nav-v6.nav-scroll{ 267 background-color: #fff; 268 -webkit-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.2); 269 -moz-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.2); 270 box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.2); 271} 272.navbar-regular.nav-v6 .navbar-nav>li>a, 273.navbar-regular.nav-v6 .navbar-nav>li>a:hover, 274.navbar-regular.nav-v6 .navbar-nav>.active>a, 275.navbar-regular.nav-v6 .navbar-nav>.active>a:focus, 276.navbar-regular.nav-v6 .navbar-nav>.active>a:hover{ 277 border: none; 278 border-right: 1px solid #272727; 279 background-color: transparent; 280 color: #272727; 281 -moz-transition: all 0.3s ease-in-out; 282 -webkit-transition: all 0.3s ease-in-out; 283 -o-transition: all 0.3s ease-in-out; 284 transition: all 0.3s ease-in-out; 285} 286.navbar-regular.nav-v6 .navbar-nav>li>a { 287 color: #272727; 288} 289.drink-menu .navbar.nav-v6 .navbar-nav>li>a { 290 color: #272727; 291 border-right: 1px solid #272727; 292} 293.drink-menu .navbar-regular.nav-v6 .navbar-nav>li>a:hover, 294.drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a, 295.drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a:focus, 296.drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a:hover{ 297 color: #272727; 298} 299li.drop-down-link .sub-menu { 300 background-color: #fff; 301 color: #272727; 302 } 303.nav-scroll li.drop-down-link .sub-menu { 304 background-color: #fff; 305 color: #272727; 306} 307.drink-menu li.drop-down-link .sub-menu { 308 background-color: #fff; 309 color: #272727; 310 } 311.drink-menu .nav-scroll li.drop-down-link .sub-menu { 312 background-color: #fff; 313 color: #272727; 314} 315li.drop-down-link .sub-menu a, 316li.drop-down-link div.drop-down { 317 color: #272727; 318} 319.nav-scroll li.drop-down-link .sub-menu a, 320.nav-scroll li.drop-down-link li.drop-down-link div.drop-down { 321 color: #272727; 322} 323.drink-menu li.drop-down-link .sub-menu a, 324.drink-menu li.drop-down-link div.drop-down { 325 color: #272727; 326} 327.drink-menu .nav-scroll li.drop-down-link .sub-menu a, 328.drink-menu .nav-scroll li.drop-down-link div.drop-down { 329 color: #272727; 330} 331 332li.drop-down-link .sub-menu a:hover, 333li.drop-down-link .sub-menu a:focus { 334 color: #272727; 335} 336.drink-menu li.drop-down-link .sub-menu a:hover, 337.drink-menu li.drop-down-link .sub-menu a:focus { 338 color: #272727; 339} 340
341.navbar-regular.nav-v6 .navbar-toggle .icon-bar { 342 background-color: #272727; 343 -moz-transition: all 0.3s ease-in-out; 344 -webkit-transition: all 0.3s ease-in-out; 345 -o-transition: all 0.3s ease-in-out; 346 transition: all 0.3s ease-in-out; 347} 348.drink-menu .navbar-regular.nav-v6 .navbar-toggle .icon-bar { 349 background-color: #272727; 350} 351.navbar-regular.nav-v6 [aria-expanded="true"].navbar-toggle .icon-bar { 352 background-color: #272727; 353} 354.drink-menu .navbar-regular.nav-v6 [aria-expanded="true"].navbar-toggle .icon-bar{ 355 background-color: #272727; 356} 357.navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a, 358.navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a:hover, 359.navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a, 360.navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:focus, 361.navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:hover{ 362 border: none; 363 border-right: 1px solid #272727; 364 color: #272727; 365} 366.navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a { 367 color: #272727; 368} 369.drink-menu .navbar.nav-v6.nav-scroll .navbar-nav>li>a { 370 color: #272727; 371 border-right: 1px solid #272727; 372} 373.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a:hover, 374.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a, 375.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:focus, 376.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:hover{ 377 color: #272727; 378} 379 380.nav-scroll li.drop-down-link .sub-menu a:hover, 381.nav-scroll li.drop-down-link .sub-menu a:focus { 382 color: #272727; 383} 384.drink-menu .nav-scroll li.drop-down-link .sub-menu a:hover, 385.drink-menu .nav-scroll li.drop-down-link .sub-menu a:focus { 386 color: #272727; 387} 388 389.navbar-regular.nav-v6.nav-scroll .navbar-toggle .icon-bar { 390 background-color: #272727; 391} 392.drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-toggle .icon-bar { 393 background-color: #272727; 394} 395.navbar-regular.nav-v6.nav-scroll [aria-expanded="true"].navbar-toggle .icon-bar { 396 background-color: #272727; 397} 398.drink-menu .navbar-regular.nav-v6.nav-scroll [aria-expanded="true"].navbar-toggle .icon-bar{ 399 background-color: #272727; 400} 401.navbar.nav-v6 .header-logo-text{ 402 color: #272727; 403 -moz-transition: all 0.3s ease-in-out; 404 -webkit-transition: all 0.3s ease-in-out; 405 -o-transition: all 0.3s ease-in-out; 406 transition: all 0.3s ease-in-out; 407} 408.navbar.nav-v6.nav-scroll .header-logo-text{ 409 color: #272727; 410} 411.navbar.nav-v6 .social-icon{ 412 color: #272727; 413 -moz-transition: all 0.3s ease-in-out; 414 -webkit-transition: all 0.3s ease-in-out; 415 -o-transition: all 0.3s ease-in-out; 416 transition: all 0.3s ease-in-out; 417} 418.navbar.nav-v6.nav-scroll .social-icon{ 419 color: #272727; 420} 421.navbar.nav-v6 .social-square .contact-icon:hover { 422 color: #272727; 423 background-color: #272727; 424} 425.navbar.nav-v6.nav-scroll .social-square .contact-icon:hover { 426 color: #272727; 427 background-color: #272727; 428} 429 430.drink-menu .navbar.nav-v6 .header-logo-text{ 431 color: #272727; 432} 433.drink-menu .navbar.nav-v6.nav-scroll .header-logo-text{ 434 color: #272727; 435} 436.drink-menu .navbar.nav-v6 .social-icon{ 437 color: #272727; 438} 439.drink-menu .navbar.nav-v6.nav-scroll .social-icon{ 440 color: #272727; 441} 442.drink-menu .navbar.nav-v6 .social-square .contact-icon:hover { 443 color: #272727; 444 background-color: #272727; 445} 446.drink-menu .navbar.nav-v6.nav-scroll .social-square .contact-icon:hover { 447 color: #272727; 448 background-color: #272727; 449} 450.navbar.nav-v6 .container { 451 border-bottom: 1px solid transparent; 452 -moz-transition: all 0.3s ease-in-out; 453 -webkit-transition: all 0.3s ease-in-out; 454 -o-transition: all 0.3s ease-in-out; 455 transition: all 0.3s ease-in-out; 456} 457.navbar.nav-v6.nav-scroll .container { 458 border-bottom: 1px solid transparent; 459} 460.drink-menu .navbar.nav-v6 .container { 461 border-bottom: 1px solid transparent; 462} 463.drink-menu .navbar.nav-v6.nav-scroll .container { 464 border-bottom: 1px solid transparent; 465} 466@media(min-width: 768px) { 467 .nav-v6 .navbar-collapse { 468 display: flex !important; 469 justify-content: end; 470 } 471 .nav-v6 .navbar-nav, 472 .nav-v6 .socialnav.hidden-xs { 473 float: none !important; 474 } 475} 476@media (max-width: 767px) { 477 .navbar.nav-v6 .container, 478 .navbar.nav-v6.nav-scroll .container, 479 .drink-menu .navbar.nav-v6 .container, 480 .drink-menu .navbar.nav-v6.nav-scroll .container { 481 border-bottom: none; 482 } 483 .navbar.nav-v6 .navbar-header { 484 border-bottom: 2px solid transparent; 485 } 486 .navbar.nav-v6.nav-scroll .navbar-header { 487 border-bottom: 2px solid transparent; 488 } 489 .drink-menu .navbar.nav-v6 .navbar-header { 490 border-bottom: 2px solid transparent; 491 } 492 .drink-menu .navbar.nav-v6.nav-scroll .navbar-header { 493 border-bottom: 2px solid transparent; 494 } 495 li.drop-down-link .sub-menu, 496 .drink-menu li.drop-down-link .sub-menu { 497 width: 100% !important; 498 background-color: transparent; 499 } 500 .nav-scroll li.drop-down-link .sub-menu, 501 .drink-menu .nav-scroll li.drop-down-link .sub-menu { 502 background-color: transparent; 503 } 504 .navbar-regular.nav-v6 .navbar-nav>li>a:hover, 505 .navbar-regular.nav-v6 .navbar-nav>.active>a, 506 .navbar-regular.nav-v6 .navbar-nav>.active>a:focus, 507 .navbar-regular.nav-v6 .navbar-nav>.active>a:hover{ 508 background-color: #272727; 509 color: #272727; 510 } 511 .navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a:hover, 512 .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a, 513 .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:focus, 514 .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:hover{ 515 background-color: #272727; 516 color: #272727; 517 } 518 .drink-menu .navbar-regular.nav-v6 .navbar-nav>li>a:hover, 519 .drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a, 520 .drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a:focus, 521 .drink-menu .navbar-regular.nav-v6 .navbar-nav>.active>a:hover{ 522 background-color: #272727; 523 color: #272727; 524 } 525 .drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>li>a:hover, 526 .drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a, 527 .drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:focus, 528 .drink-menu .navbar-regular.nav-v6.nav-scroll .navbar-nav>.active>a:hover{ 529 background-color: #272727; 530 color: #272727; 531 } 532 533 .navbar-regular.nav-v6 li.drop-down-link.active .drop-down .fa.fa-angle-up { 534 color: #272727; 535 } 536 .navbar-regular.nav-v6.nav-scroll li.drop-down-link.active .drop-down .fa.fa-angle-up { 537 color: #272727; 538 } 539 540 .drink-menu .navbar-regular.nav-v6 li.drop-down-link.active .drop-down .fa.fa-angle-up { 541 color: #272727; 542 } 543 .drink-menu .navbar-regular.nav-v6.nav-scroll li.drop-down-link.active .drop-down .fa.fa-angle-up { 544 color: #272727; 545 } 546 547} 548</style><!-- nav --><nav class="navbar nav-v4 nav-v6 nav-v6-drop navbar-regular navbar-fixed-top" id="navbar" role="navigation"><div id="skip"><a class="visuallyhidden skip-content" href="#content">Skip to main content</a></div><div class="container"><a class="header-logo logo-top" href="/#"><img alt="Willows And Pine Restaurant And Catering logo top - Homepage" aria-label="Homepage" class="img-responsive logo-top" src="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/logo.png"/></a><a class="header-logo logo-scroll" href="/"><img alt="Willows And Pine Restaurant And Catering logo scroll - Homepage" aria-label="Homepage" class="img-responsive logo-scroll" src="https://static.spotapps.co/website_images/ab_websites/294822_website_v1/logo.png"/></a><ul class="socialnav visible-xs">
548<li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.facebook.com/146038661917665" target="_blank"><i class="social-icon fa fa-facebook"></i><span>Facebook page</span></a></li><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.instagram.com/willowsandpine.restaurant" target="_blank"><i class="social-icon fa fa-instagram"></i><span>Instagram page</span></a></li><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.google.com/search?client=opera&q=Willow+%26+Pine+3525+Fruitvale+Avenue&sourceid=opera&ie=UTF-8&oe=UTF-8#lrd=0x808f8719a1d52003:0xfdee9d74c11af989,1,,,," target="_blank"><i aria-hidden="true" class="social-icon fa fa-google"></i><span>Google page</span></a></li></ul><div class="navbar-header"><button class="navbar-toggle" data-target="#navbar-collapse-1" data-toggle="collapse" type="button"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button></div><div class="collapse navbar-collapse" id="navbar-collapse-1"><ul class="nav navbar-nav navbar-right"><li class=" nav-menu-page"><a class="" href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-food-menu" id="/Oakland-Dimond-District-Willows-And-Pine-Restaurant-And-Catering-food-menu_link" target="_self"> 549 550 Menu 551 552 </a></li><li class=" "><a class="" href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-drink-menu" id="/Oakland-Dimond-District-Willows-And-Pine-Restaurant-And-Catering-drink-menu_link" target="_self"> 553 554 Drinks 555 556 </a></li><li class=" "><a class="" href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-happy-hours-specials" id="/Oakland-Dimond-District-Willows-And-Pine-Restaurant-And-Catering-happy-hours-specials_link" target="_self"> 557 558 Specials 559 560 </a></li><li class=" "><a class="" href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-events" id="/Oakland-Dimond-District-Willows-And-Pine-Restaurant-And-Catering-events_link" target="_self"> 561 562 Events 563 564 </a></li><li class=" drop-down-link"><a aria-expanded="false" class="drop-down" href="#" id="#_link1" role="button" target=""> 565 566 Order 567 <i aria-hidden="true" class="fa fa-angle-down"></i><i aria-hidden="true" class="fa fa-angle-up"></i></a><ul class="sub-menu"><li><a class="sub-menu-link" href="https://order.online/store/26140395?slug=willows-and-pine-restaurant--catering-11838364&pickup=true&hideModal=true&redirected=true" target="_self"> 568 Doordash<span class="visuallyhidden">order online</span></a></li><li><a class="sub-menu-link" href="https://www.ubereats.com/store/willows-%26-pine/jltJVqKvS4KJqDbzUF2Mwg?diningMode=PICKUP&mod=storeDeliveryTime&modctx=%257B%2522entryPoint%2522%253A%2522store-auto-surface%2522%252C%2522encodedStoreUuid%2522%253A%2522jltJVqKvS4KJqDbzUF2Mwg%2522%257D&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMlZhY2F2aWxsZSUyMFByZW1pdW0lMjBPdXRsZXRzJTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyZGY3ZTM0NzgtZGFkYy05YWI3LWMyNjctZTdlNGM1YWQ5NjAyJTIyJTJDJTIycmVmZXJlbmNlVHlwZSUyMiUzQSUyMnViZXJfcGxhY2VzJTIyJTJDJTIybGF0aXR1ZGUlMjIlM0EzOC4zNjU0NzIyJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTEyMS45NTY4ODAzJTdE&ps=1&utm_campaign=place-action-link&utm_medium=organic&utm_source=google" target="_blank"> 569 ubereats<span class="visuallyhidden">order online</span></a></li><li><a class="sub-menu-link" href="https://www.toasttab.com/local/order/willows-pine-3525-fruitvale-avenue/r-4e1059a1-e39a-4625-b8d3-5c97c2d806a4?diningOption=takeout&rwg_token=AOZt1jVNC2fDHmAiVlkuTEc7eiA7GGkNsR0Dr9hqaZX6QsuN1SgtkDULZU4iPuvbZm-qG_tk4FCqVqks0kgf-BcyXCJDlLVNqg%3D%3D" target="_blank"> 570 toast<span class="visuallyhidden">order online</span></a></li></ul></li><li class="active nav-reservations-link"><a class="link-reservations-sh" href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-reservations#" id="/Oakland-Dimond-District-Willows-And-Pine-Restaurant-And-Catering-reservations#_link" target="_self"> 571 572 Reserve 573 574 </a></li><li class=" nav-parties-link"><a class="link-parties-sh" href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-party#" id="/Oakland-Dimond-District-Willows-And-Pine-Restaurant-And-Catering-party#_link" target="_self"> 575 576 Parties 577 578 </a></li><li class=" nav-catering-link"><a class="link-catering-sh" href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-catering#" id="/Oakland-Dimond-District-Willows-And-Pine-Restaurant-And-Catering-catering#_link" target="_self"> 579 580 Catering 581 582 </a></li></ul><ul class="socialnav hidden-xs"><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.facebook.com/146038661917665" target="_blank"><i class="social-icon fa fa-facebook"></i><span>Facebook page</span></a></li><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.instagram.com/willowsandpine.restaurant" target="_blank"><i class="social-icon fa fa-instagram"></i><span>Instagram page</span></a></li><li class="social-links social-icons-holder social-square"><a class="pull-left contact-icon" href="https://www.google.com/search?client=opera&q=Willow+%26+Pine+3525+Fruitvale+Avenue&sourceid=opera&ie=UTF-8&oe=UTF-8#lrd=0x808f8719a1d52003:0xfdee9d74c11af989,1,,,," target="_blank"><i aria-hidden="true" class="social-icon fa fa-google"></i><span>Google page</span></a></li></ul></div></div></nav></header><main id="content" role="main"><article><div class="pagecontent"><div class="tabs-container"><div class="scrolling"><h1 style="display: none;">Reservations</h1><div class="tmt-iframe-holder"><div class="custom-loader loader-1" id="loader"></div><iframe allowfullscreen="allowfullscreen" class="tmt-iframe hide-iframe" frameborder="0" height="100%" id="pageIframe" onload="iframeTMTpageInit()" scrolling="no" src="//tmt.spotapps.co/reservations?spot_id=294822&source=pop_up&destination=reservations&promotion=reservations" title="Reservations" width="100%"></iframe></div></div></div></div></article></main></div><style type="text/css"> 583 .navbar-fixed-bottom.nav-v1 { 584 bottom: -100px; 585 } 586 .navbar-fixed-bottom.nav-v1 .nav.navbar-nav.navbar-right { 587 background-color: #fff; 588 } 589 .navbar-fixed-bottom.nav-v1 .bottom-svg-border path, 590 .navbar-fixed-bottom.nav-v1 .bottom-svg-border polygon { 591 fill: #000; 592 } 593 .navbar-fixed-bottom.nav-v1 .bottom-list-item a { 594 color: #000; 595 } 596 .navbar-fixed-bottom.nav-v1 .bottom-list-item a:hover, 597 .navbar-fixed-bottom.nav-v1 .bottom-list-item a:focus { 598 color: #008752; 599 } 600</style><nav aria-label="mobile footer" class="navbar-fixed-bottom nav-v1" id="bottom-navbar"><div><ul class="nav navbar-nav navbar-right"><li class="bottom-list-item "><a class="bottom-link " href="https://order.online/store/26140395?slug=willows-and-pine-restaurant--catering-11838364&pickup=true&hideModal=true&redirected=true" id="bottom_link_4" target="_self"> 601 Order </a></li><li class="bottom-list-item "><a class="bottom-link " href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-reservations" id="bottom_link_3" target="_self"> 602 Reserve </a></li><li class="bottom-list-item "><a class="bottom-link " href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-party" id="bottom_link_5" target="_self"> 603 Parties </a></li><li class="bottom-list-item "><a class="bottom-link " href="/oakland-dimond-district-willows-and-pine-restaurant-and-catering-catering" id="bottom_link_6" target="_self"> 604 Catering </a></li></ul></div></nav>
604<script src="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/jquery/jquery.min.js"></script>
604<script src="https://static.spotapps.co/web/willowsandpine-restaurant--com/lib/bootstrap/js/bootstrap.min.js"></script>
604<script src="https://static.spotapps.co/web/willowsandpine-restaurant--com/js/tmt_script.js"></script>
604<script> 605 606 $("#bottom_link_4").on("click", function(){ 607 if (ga_check()) 608 universal_ga('send', 'event', 'Button', 'Click', 'Order Online'); 609 }); 610 $("#bottom_link_3").on("click", function(){ 611 if (ga_check()) 612 universal_ga('send', 'event', 'Button', 'Click', 'Reserve'); 613 }); 614 $("#bottom_link_5").on("click", function(){ 615 if (ga_check()) 616 universal_ga('send', 'event', 'Button', 'Click', 'Private Party'); 617 }); 618 $("#bottom_link_6").on("click", function(){ 619 if (ga_check()) 620 universal_ga('send', 'event', 'Button', 'Click', 'Catering'); 621 }); 622 $('.header-logo, .nav-v2-home-btn').click(function(event) { 623 if ( window.location.pathname == '/' || window.location.pathname == '/index.php') { 624 event.preventDefault(); 625 var windowScrollTop = $(window).scrollTop(); 626 if(windowScrollTop > 150) { 627 $('html, body').animate({scrollTop: 0}, 750); 628 } 629 } 630 }); 631 632$(".banner-section a.banner-pin").click(function(e) { 633 // target element id 634 var id = $(this).attr('href'); 635 636 // target element 637 var section = $(id); 638 if (section.length === 0) { 639 return; 640 } 641 642 // prevent standard hash navigation (avoid blinking in IE) 643 e.preventDefault(); 644 645 // top position relative to the document 646 var pos = section.offset().top - 100 + 10; 647 648 // animated top scrolling 649 $('body, html').animate({scrollTop: pos}, 750); 650}); 651 652$(document).ready(function() { 653 var navHeight = $('nav.navbar').height(); 654 $('html').css("scroll-padding-top", navHeight); 655}); 656$(document).on('scroll', function (e) { 657 if($(document).scrollTop() > 0) { 658 $('.navbar.nav-v6').addClass('nav-scroll'); 659 }else { 660 $('.navbar.nav-v6').removeClass('nav-scroll'); 661 } 662}); 663 664function scrollStop (callback, refresh = 66) { 665 666 // Make sure a valid callback was provided 667 if (!callback || typeof callback !== 'function') return; 668 669 // Setup scrolling variable 670 let isScrolling; 671 672 // Listen for scroll events 673 window.addEventListener('scroll', function (event) { 674 675 // Clear our timeout throughout the scroll 676 window.clearTimeout(isScrolling); 677 678 // Set a timeout to run after scrolling ends 679 isScrolling = setTimeout(callback, refresh); 680 681 }, false); 682 683} 684 685$(function() { 686 setDropDownMenuWidth(); 687 688 // Function to set drop-down menu position (css top property) 689 setDropDownMenuTop(); 690 691 function setDropDownMenuWidth() { 692 var tabs_list = $('.navbar-collapse .navbar-nav'); 693 $(tabs_list).find('li.drop-down-link').each(function() { 694 var sub_menu_width = $(this).outerWidth(true); 695 if (sub_menu_width < 100) { 696 sub_menu_width = 100; 697 } 698 $(this).find('.sub-menu').css('width', sub_menu_width+'px'); 699 700 }); 701 }; 702 703 function setDropDownMenuTop() { 704 var sub_menu_top = ($('.navbar.nav-v6 .container').outerHeight() + $('.drop-down-link').outerHeight())/2; 705 $('li.drop-down-link .sub-menu').css('top', sub_menu_top-2 +'px'); 706 }; 707 708 $( window ).resize(function() { 709 setDropDownMenuWidth(); 710 setDropDownMenuTop(); 711 }); 712 713 $(window).on('scroll', function (e) { 714 setDropDownMenuTop(); 715 }); 716 717 scrollStop(function () { 718 setDropDownMenuTop(); 719 if($(document).scrollTop() == 0) { 720 setTimeout(setDropDownMenuTop, 200); 721 } 722 }); 723 724 $('.nav a:not(.drop-down)').on('click', function () { 725 $('.navbar-collapse').collapse('hide'); 726 }); 727 728}); 729 730$( '.drop-down-link .drop-down' ).click(function(event) { 731 event.preventDefault(); 732 event.stopPropagation(); 733 var drop_down = $(this).closest('.drop-down-link'); 734 var drop_down_a = $(this); 735 736 if($(drop_down_a).attr("aria-expanded") == "true") { 737 $(drop_down_a).attr("aria-expanded",false) 738 } else { 739 $(drop_down_a).attr("aria-expanded",true) 740 } 741 742 var sub_menu = $(this).closest('.drop-down-link').find( '.sub-menu' ); 743 if ( $(sub_menu).is( ':hidden' ) ) { 744 $(sub_menu).slideDown(); 745 $(drop_down).addClass('active'); 746 } else { 747 $(sub_menu).slideUp(); 748 $(drop_down).removeClass('active'); 749 } 750}); 751$('#navbar-collapse-1').on('hide.bs.collapse', function (e) { 752 var clickedElement = $(event.target); 753 if (clickedElement.hasClass('drop-down')) { 754 return false;
755 } 756}); 757$('#navbar-collapse-1').on('hidden.bs.collapse', function () { 758 closeOpenedDropDownMenus(); 759 function closeOpenedDropDownMenus() { 760 var tabs_list = $('.navbar-collapse .navbar-nav'); 761 $(tabs_list).find('li.drop-down-link').each(function() { 762 if( $(this).hasClass('active') ) { 763 var sub_menu = $(this).find('.sub-menu'); 764 $(sub_menu).slideUp(); 765 $(this).removeClass('active'); 766 } 767 }); 768 }; 769}); setTimeout(function(){ 770 $('.navbar-fixed-bottom.nav-v1').addClass('show-bottom-nav'); triggerShowFooterEvents(); 771 }, 4000); 772</script>
772<script> 773(function() { 774 var name = "Willows And Pine Restaurant And Catering"; 775 var pid = "ChIJAyDVoRmHj4ARifkawXSd7v0"; 776 function build_url() { 777 var q = encodeURIComponent(name).replace(/'/g, "%27"); 778 return "https://www.google.com/maps/search/?api=1" 779 + "&query=" + q 780 + "&query_place_id=" + encodeURIComponent(pid); 781 } 782 window.google_map_url = build_url(); 783 window.open_google_map = function() { 784 window.open(build_url(), "_blank"); 785 }; 786})(); 787</script>
787<script> 788 789 var spot_id = 294822; 790 var sh_generic_form_params=JSON.parse('{"generic_contact_form_active":true,"texting_permissions_active":true,"title":"Contact us","instructions":"Please fill out the form and we will be in touch.","reasons":["To host a special event","To get a special event catered","To apply for a job"],"custom_hours":"","hours":"","active_tmt_cta_links":{"cta_private_party":"https://willowsandpine-restaurant.com/-party","cta_catering":"https://willowsandpine-restaurant.com/-catering","cta_reservations":"https://willowsandpine-restaurant.com/-reservations","cta_jobs":null},"spot_name":"Willows And Pine Restaurant And Catering","label_for_texting_permission":"Iâd like to get texts about specials, events, and other exclusive offers and announcements not available to general public"}'); 791 792 if (false){ 793 console.log("Check SpotHopper configuration. Probably there is no 'WEBSITE::DOMAIN_NAME' key for your website"); 794 } 795 796 if (navigator.userAgent.match(/iPhone/i) 797 || navigator.userAgent.match(/iPad/i) 798 || navigator.userAgent.match(/iPod/i)){ 799 $(document).ready(function(){ 800 document.body.className += " " + "webkit-mobile-body"; 801 }); 802 } 803 804 var promotion_url_param_domain = getPromotionUrlParams()['domain']; 805 if ( promotion_url_param_domain && ( new URL(document.location).host == 'localhost:4000' || new URL(document.location).host == 'wcache.spotapps.co' || new URL(document.location).host == 'website-editor.spotapps.co' || new URL(document.location).host == 'website-editor-staging.spotapps.co' || new URL(document.location).host == 'wcache-staging.spotapps.co')){ 806 $("a[href^='/']").each(function(){ 807 if (this.href.indexOf('domain=') == -1){ 808 var sh_internal_url = new URL(this.href); 809 sh_internal_url.searchParams.set("domain", promotion_url_param_domain); 810 this.href = sh_internal_url.toString(); 811 } 812 }) 813 } 814 815 816 function cta_link_matches_href(href, url){ 817 var domain = 'willowsandpine-restaurant.com'; 818 if(typeof url === 'undefined'){ 819 return false; 820 } 821 var partsOfURL = url.split(domain); 822 if (partsOfURL.length != 2){ 823 return href == url; 824 }else{ 825 var urlPath = partsOfURL[1]; 826 if (urlPath.substring(0,1) == "/"){ 827 urlPath = urlPath.substring(1,urlPath.length); 828 } 829 return href.indexOf(urlPath, domain.length + href.indexOf(domain)-1) !== -1; 830 } 831 } 832 833 var all_cta_links = [{"id":1053069,"spot_id":294822,"url":"https://willowsandpine-restaurant.com/-drink-menu","cta_link_type":"drink_menu","created_at":"2024-08-29T13:43:01+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"","position":null},{"id":1053067,"spot_id":294822,"url":"https://willowsandpine-restaurant.com/-specials","cta_link_type":"specials","created_at":"2024-08-29T13:43:00+00:00","updated_at":"2024-09-02T07:38:39+00:00","made_of_food":false,"link_name":"","position":null},{"id":987575,"spot_id":294822,"url":"https://willowsandpine-restaurant.com/-party","cta_link_type":"private_parties","created_at":"2024-06-27T23:31:55+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"Private Parties","target":null,"website_footer_label":"Parties","position":3},{"id":1053068,"spot_id":294822,"url":"https://willowsandpine-restaurant.com/-events","cta_link_type":"events","created_at":"2024-08-29T13:43:01+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"","position":null},{"id":1053070,"spot_id":294822,"url":"https://willowsandpine-restaurant.com/-food-menu","cta_link_type":"food_menu","created_at":"2024-08-29T13:43:01+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"","position":null},{"id":987577,"spot_id":294822,"url":"https://willowsandpine-restaurant.com/-reservations","cta_link_type":"reservations","created_at":"2024-06-27T23:31:55+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"Reservations","target":null,"website_footer_label":"Reserve","position":1},{"id":987574,"spot_id":294822,"url":"https://willowsandpine-restaurant.com/-catering","cta_link_type":"catering","created_at":"2024-06-27T23:31:54+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"Catering","target":null,"website_footer_label":"Catering","position":4},{"id":1020960,"spot_id":294822,"url":"https://order.online/store/26140395?slug=willows-and-pine-restaurant--catering-11838364&pickup=true&hideModal=true&redirected=true","cta_link_type":"order","created_at":"2024-0
8337-30T19:00:54+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"Doordash","target":null,"website_footer_label":"DoorDash","position":0},{"id":1020961,"spot_id":294822,"url":"https://www.ubereats.com/store/willows-%26-pine/jltJVqKvS4KJqDbzUF2Mwg?diningMode=PICKUP&mod=storeDeliveryTime&modctx=%257B%2522entryPoint%2522%253A%2522store-auto-surface%2522%252C%2522encodedStoreUuid%2522%253A%2522jltJVqKvS4KJqDbzUF2Mwg%2522%257D&pl=JTdCJTIyYWRkcmVzcyUyMiUzQSUyMlZhY2F2aWxsZSUyMFByZW1pdW0lMjBPdXRsZXRzJTIyJTJDJTIycmVmZXJlbmNlJTIyJTNBJTIyZGY3ZTM0NzgtZGFkYy05YWI3LWMyNjctZTdlNGM1YWQ5NjAyJTIyJTJDJTIycmVmZXJlbmNlVHlwZSUyMiUzQSUyMnViZXJfcGxhY2VzJTIyJTJDJTIybGF0aXR1ZGUlMjIlM0EzOC4zNjU0NzIyJTJDJTIybG9uZ2l0dWRlJTIyJTNBLTEyMS45NTY4ODAzJTdE&ps=1&utm_campaign=place-action-link&utm_medium=organic&utm_source=google","cta_link_type":"order2","created_at":"2024-07-30T19:00:54+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"Ubereats","target":null,"website_footer_label":"UberEats","position":11},{"id":1020962,"spot_id":294822,"url":"https://www.toasttab.com/local/order/willows-pine-3525-fruitvale-avenue/r-4e1059a1-e39a-4625-b8d3-5c97c2d806a4?diningOption=takeout&rwg_token=AOZt1jVNC2fDHmAiVlkuTEc7eiA7GGkNsR0Dr9hqaZX6QsuN1SgtkDULZU4iPuvbZm-qG_tk4FCqVqks0kgf-BcyXCJDlLVNqg%3D%3D","cta_link_type":"order3","created_at":"2024-07-30T19:00:54+00:00","updated_at":"2024-09-02T07:38:40+00:00","made_of_food":false,"link_name":"Toasttab","target":null,"website_footer_label":"Toast","position":null}]; 834 835 function find_cta_link(href) { 836 for (var i=0; i< all_cta_links.length; i++){ 837 var cta_link = all_cta_links[i]; 838 if ( cta_link_matches_href(href, cta_link.url)){ 839 return cta_link; 840 } 841 } 842 } 843 844 function find_cta_links(href) { 845 var cta_links = [] 846 for (var i=0; i< all_cta_links.length; i++){ 847 var cta_link = all_cta_links[i]; 848 if ( cta_link_matches_href(href, cta_link.url)){ 849 cta_links.push(cta_link); 850 } 851 } 852 return cta_links; 853 } 854 855 856 function get_current_page_cta_link_types(){ 857 var types = []; 858 var cta_links = find_cta_links(document.location.href); 859 for (var i=0; i<cta_links.length; i++){ 860 types.push(cta_links[i].cta_link_type); 861 } 862 return types; 863 } 864 865 866 function is_food_menu_page(){ 867 var cta_link_types = get_current_page_cta_link_types(); 868 for (var i=0; i<cta_link_types.length; i++){ 869 if ('food_menu' == cta_link_types[i]) 870 return true; 871 } 872 return false; 873 } 874 875 876 function get_form_cat_from_cta(){ 877 var cta_link = find_cta_link(document.location.href); 878 if (cta_link == null) { 879 return null; 880 } 881 if (cta_link.cta_link_type == 'private_parties'){ 882 return 'private_party'; 883 }else if (cta_link.cta_link_type == 'reservations'){ 884 return 'reservation'; 885 }else if (cta_link.cta_link_type == 'catering'){ 886 return 'catering'; 887 }else if (cta_link.cta_link_type == 'job_listing'){ 888 return 'job_listings'; 889 }else if (cta_link.cta_link_type == 'gift_cards'){ 890 return 'gift_cards'; 891 } 892 return null; 893 } 894 895 function element_has_events_defined(elem){ 896 if ($._data(elem, "events") === undefined){ 897 return false; 898 } 899 return true; 900 } 901 902 function create_ga_events_for_cta_clicks(){ 903 if (typeof $ === 'function'){ 904 905 var cta_link_of_the_page = find_cta_link(location.href); 906 907 908 $("a").each(function(index, elem){ 909 var href = $(elem).attr('href'); 910 911 if (href === undefined ){ 912 return; 913 } 914 915 if (href.substring(0,4) == 'tel:'){ 916 if (!element_has_events_defined(elem)){ // not footer links 917 $(elem).on("click", function(){ 918 universal_ga('send', 'event', { 919 eventCategory: 'Button', 920 eventAction: 'Click', 921 eventLabel: 'Phone', 922 transport: 'beacon' 923 }); 924 }); 925 926 if (cta_link_of_the_page){ 927 $(elem).on("click", function(){ 928 universal_ga('send', 'event', { 929 eventCategory: 'Button', 930 eventAction: 'Click', 931 eventLabel: cta_link_of_the_page.cta_link_type + ' page phone', 932 transport: 'beacon' 933 }); 934 }); 935 } 936 } else { 937 if (cta_link_of_the_page){ 938 $(elem).on("click", function(){ 939 universal_ga('send', 'event', { 940 eventCategory: 'Button', 941 eventAction: 'Click', 942 eventLabel: cta_link_of_the_page.cta_link_type + ' page phone footer', 943 transport: 'beacon' 944 }); 945 }); 946 } 947 } 948 949 950 }else{ 951 var cta_link = find_cta_link(href); 952 if (elem.className != null && elem.className.indexOf("bottom-link") > -1){ 953 // console.log("bottom link detected"); 954 }else{ 955 if (cta_link != null){ 956 $(elem).on("click", function(){ 957 universal_ga('send', 'event', { 958 eventCategory: 'Website Link', 959 eventAction: 'Click', 960 eventLabel: cta_link.cta_link_type, 961 transport: 'beacon' 962 }); 963 }); 964 } 965 } 966 } 967 968 969 }); 970 } 971 } 972 973 if (typeof angular === "undefined") { 974 create_ga_events_for_cta_clicks(); 975 } else { 976 angular.element(document).ready(function () { 977 create_ga_events_for_cta_clicks(); 978 }); 979 } 980 981 982 function triggerShowFooterEvents(){
983 if (window.screen.availWidth < 768){ 984 universal_ga('send', 'event', { 985 eventCategory: 'Mobile Footer', 986 eventAction: 'View', 987 eventLabel: '', 988 transport: 'beacon' 989 }); 990 } 991 } 992 993 994 995 996 //////////// 997 function smartFooterV2() 998 { 999 var list= document.getElementsByClassName("bottom-list-item"); 1000 if (!list) return; 1001 1002 if (document.getElementById("bottom-navbar") == null){ 1003 return; 1004 } 1005 1006 var bottomNav = document.querySelector('#bottom-navbar .navbar-nav'); 1007 var footerLinkPaddingLeft = $('#bottom-navbar .navbar-nav li a').css('padding-left'); 1008 var footerLinkPaddingRight = $('#bottom-navbar .navbar-nav li a').css('padding-right'); 1009 1010 bottomNav.innerHTML = ''; 1011 var linksWithPosition = all_cta_links.filter(e => e.position != null && e.position >= 0); 1012 linksWithPosition.sort(function(a,b) { 1013 return a.position - b.position; 1014 }); 1015 1016 var footerLinkStyle = (footerLinkPaddingLeft == '0px' || footerLinkPaddingRight == '0px' ? 'style="padding-left: 8px; padding-right: 8px;"' : ''); 1017 1018 linksWithPosition.forEach((e, i) => { 1019 var target = e.target || getUrlTarget(e.url); 1020 bottomNav.insertAdjacentHTML('beforeend', 1021 `<li class="bottom-list-item" style="white-space: nowrap;width: auto;"><a ${footerLinkStyle} class="bottom-link smart-footer-link" data-type="${e.cta_link_type}" data-position="${i}" target="${target}" href="${e.url}">${e.website_footer_label}</a></li>`); 1022 }) 1023 1024 var intervalCount = 0 1025 var interval = setInterval(() => { 1026 if(intervalCount == 50){ 1027 clearInterval(interval); 1028 } 1029 removeOverflowingFooterLinks(); 1030 intervalCount ++; 1031 }, 200); 1032 1033 $('.smart-footer-link').on("click", function(){ 1034 if (typeof shUrlParams !== "undefined" && shUrlParams['source'] === undefined){ 1035 shUrlParams['source'] = 'footer'; 1036 sessionStorage.setItem('shUrlParams', JSON.stringify(shUrlParams)); 1037 } 1038 1039 var visibleLinks = $('.smart-footer-link').map(function (e) { 1040 return $(this).data('type'); 1041 }).toArray().join(','); 1042 1043 universal_ga('send', 'event', { 1044 eventCategory: 'Button', 1045 eventAction: 'Click_footer_2', 1046 eventLabel: "type:" + $(this).data('type') + "|position:" + $(this).data('position') + "|visible:" + visibleLinks, 1047 transport: 'beacon' 1048 }); 1049 }); 1050 } 1051 1052 function removeOverflowingFooterLinks(){ 1053 var bottomNavLinks = document.querySelectorAll('#bottom-navbar .navbar-nav li'); 1054 var width_sum = 0; 1055 1056 bottomNavLinks.forEach(e => { 1057 width_sum += e.getBoundingClientRect().width; 1058 if ((width_sum) > window.innerWidth) { 1059 console.log(`%cLink %c${e.textContent} %cdeleted couldn't fit screen`,"color: #fff;background: #202124;", "background: red;color: #fff", "color: #fff;background: #202124;"); 1060 e.remove(); 1061 } 1062 }); 1063 } 1064 1065 function getUrlTarget(url){ 1066 if(url.startsWith('tel')){ 1067 return '_self'; 1068 } 1069 if(url.startsWith('/') || url.includes('tmt.spotapps.co') || url.includes(window.location.host)){ 1070 return '_self'; 1071 } 1072 return '_blank'; 1073 } 1074 1075 function npb() 1076 { 1077 var list= document.getElementsByClassName("bottom-list-item"); 1078 if (!list) return; 1079 1080 if (document.getElementById("bottom-navbar") == null){ 1081 return; 1082 } 1083 1084 var url = "" 1085 for (var i=0; i < all_cta_links.length; i++) 1086 { 1087 if (all_cta_links[i].cta_link_type == "order"){ 1088 url = all_cta_links[i].url; 1089 } 1090 } 1091 1092 if ( url == ""){ 1093 return; 1094 } 1095 1096 for (i=0; i < list.length; i++) 1097 { 1098 console.log(cta_link_matches_href(list[i].firstChild.href, url)); 1099 if (cta_link_matches_href(list[i].firstChild.href,url)) return; 1100 1101 }; 1102 1103 var item = list[list.length-1] 1104 document.getElementById("bottom-navbar").getElementsByClassName("nav navbar-nav")[0].appendChild(item.cloneNode(true)); 1105 var width_sum = 0; 1106 for (i=0; i < list.length; i++) { 1107 width_sum += list[i].getBoundingClientRect().width; 1108 } 1109 1110 var item = list[list.length-1] 1111 if ((width_sum - 10) > window.innerWidth) { item.parentNode.removeChild(item); console.log("link deleted couldn't fit screen"); return; } 1112 1113 item.firstChild.text = "Order"; 1114 item.firstChild.href = url; 1115 item.firstChild.id = "bottom_link_" + list.length; 1116 1117 $(item.firstChild).on("click", function(){ 1118 1119 if (typeof shUrlParams !== "undefined" && shUrlParams['source'] === undefined){ 1120 shUrlParams['source'] = 'footer'; 1121 sessionStorage.setItem('shUrlParams', JSON.stringify(shUrlParams)); 1122 } 1123 1124 universal_ga('send', 'event', { 1125 eventCategory: 'Button', 1126 eventAction: 'Click', 1127 eventLabel: 'Plan B-2 Order', 1128 transport: 'beacon' 1129 }); 1130 }); 1131 1132 1133 } 1134 1135function activateSmartFooter(){ 1136 var smart_footer_active = true; 1137 var smart_footer_version = 2; 1138 var man_bottom_active = false;
1139 if(window.location.hash == '#smartFooterV2=enabled'){ 1140 smartFooterV2(); 1141 return; 1142 } 1143 if (smart_footer_active && !man_bottom_active){ 1144 if(smart_footer_version == 2 ){ 1145 smartFooterV2(); 1146 }else { 1147 npb(); 1148 } 1149 } 1150 } 1151 1152 activateSmartFooter(); 1153 1154 var corona_config_str = '{"id":224796,"spot_id":294822,"promote_pick_up":true,"promote_gift_cards":true,"promote_happy_hour":true,"promote_events":true,"instructions_on_food_page":false,"food_page_instruction_text":"To place a delivery or curbside pick-up order, please call:","food_page_instruction_phone":null,"created_at":"2024-06-27T23:12:06+00:00","updated_at":"2025-07-14T21:12:54+00:00","food_page_button_color":null,"food_page_button_text_color":null,"food_page_link_color":null,"food_page_text_color":null,"wine_and_beer_to_go_license":true,"all_alcoholic_to_go_lincense":false,"current_operating_status":"Offering To Go and Dine-in with Full Capacity","contact_tracing_active":false,"contact_tracing_text":"In cooperation with health guidelines for contact tracing, please fill out the form below.","contact_tracing_address_required":false,"collapse_all":false,"deliveries_priority_value":5,"pick_ups_priority_value":5,"reservations_priority_value":3,"private_parties_priority_value":4,"catering_priority_value":5,"gift_cards_priority_value":1,"jobs_priority_value":0,"food_and_drinks_priority_value":4,"specials_priority_value":3,"national_days_priority_value":3,"holidays_priority_value":3,"sports_priority_value":3,"walk_ins_priority_value":5,"collecting_emails_priority_value":3,"collecting_phone_numbers_priority_value":3,"growing_social_media_followers_priority_value":3,"increasing_revenue_vs_saving_time_priority_value":3,"events_priority_value":3,"shopping_cart_type":"TMT","shopping_cart_active":false}'; 1155 var corona_config = corona_config_str != '' ? JSON.parse('{"id":224796,"spot_id":294822,"promote_pick_up":true,"promote_gift_cards":true,"promote_happy_hour":true,"promote_events":true,"instructions_on_food_page":false,"food_page_instruction_text":"To place a delivery or curbside pick-up order, please call:","food_page_instruction_phone":null,"created_at":"2024-06-27T23:12:06+00:00","updated_at":"2025-07-14T21:12:54+00:00","food_page_button_color":null,"food_page_button_text_color":null,"food_page_link_color":null,"food_page_text_color":null,"wine_and_beer_to_go_license":true,"all_alcoholic_to_go_lincense":false,"current_operating_status":"Offering To Go and Dine-in with Full Capacity","contact_tracing_active":false,"contact_tracing_text":"In cooperation with health guidelines for contact tracing, please fill out the form below.","contact_tracing_address_required":false,"collapse_all":false,"deliveries_priority_value":5,"pick_ups_priority_value":5,"reservations_priority_value":3,"private_parties_priority_value":4,"catering_priority_value":5,"gift_cards_priority_value":1,"jobs_priority_value":0,"food_and_drinks_priority_value":4,"specials_priority_value":3,"national_days_priority_value":3,"holidays_priority_value":3,"sports_priority_value":3,"walk_ins_priority_value":5,"collecting_emails_priority_value":3,"collecting_phone_numbers_priority_value":3,"growing_social_media_followers_priority_value":3,"increasing_revenue_vs_saving_time_priority_value":3,"events_priority_value":3,"shopping_cart_type":"TMT","shopping_cart_active":false}') : null; 1156 1157 1158 //corona instuctions 1159 function show_corona_instructions(text, phone, btnText){ 1160 //format to US number 1161 var match = phone.match(/^(\d{3})(\d{3})(\d{4})$/); 1162 1163 if(corona_config.shopping_cart_type == "TMT" && corona_config.shopping_cart_active == true) { 1164 var linkLocation = "https://tmt.spotapps.co/ordering-menu/?spot_id="+corona_config.spot_id+"&images=yes&accordion=true"; 1165 var btnLinkLocation = "https://tmt.spotapps.co/ordering-menu/?spot_id="+corona_config.spot_id+"&images=yes&accordion=true"; 1166 }else { 1167 var linkLocation = 'tel:+1'+phone+''; 1168 var btnLinkLocation = 'tel:+1'+ match[1] + '-' + match[2] + '-' + match[3] +'' 1169 } 1170 var appendPhone = 'tel:+1'+phone+''; 1171 //inject html content 1172 if ($('.food-menu-nav').length) { 1173 //new template 1174 var pageEl = $('.food-menu-nav').css('margin','20px auto 10px auto'); 1175 var textColor = rgb2hex($('.section-header').css('color')); 1176 var linkColor = rgb2hex($('.food-menu-nav-item.active').css('background-color')); 1177 var fontSize = parseInt($('.food-menu-nav-item').css('font-size')); 1178 fontSize = fontSize + Math.round(fontSize * 0.25); 1179
1180 // var html = '<div id="show-corona-instructions" style="padding:20px;flex: 0 1 100%;" class="text-center"><p style="color:'+textColor+';">'+text+' <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="color:'+linkColor+';"href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></p><a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="font-size:'+fontSize+'px" class="food-menu-nav-item custom-temp-btn hvr-fade active" href="tel:+1'+phone+'">'+btnText+'</a></div>'; 1181 var html = '<div id="show-corona-instructions" style="padding:20px;flex: 0 1 100%;" class="text-center"><p style="color:'+textColor+';">'+text+' <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="text-decoration: underline;color:'+textColor+';" href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></p><a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="display: inline-block !important;font-size:'+fontSize+'px" class="food-menu-nav-item custom-temp-btn hvr-fade active" href="'+btnLinkLocation +'">'+btnText+'</a></div>'; 1182 1183 }else { 1184 //old template 1185 var pageEl = $('.tabnav'); 1186 var textColor = rgb2hex($('.menu-item-name-traditional').css('color')); 1187 var linkColor = rgb2hex($('.style-traditional .tabnav .nav>li.active>a').css('color')); 1188 1189 var linkTextColor = getContrast50(linkColor); 1190 var fontSize = parseInt($('.menu-item-name-traditional').css('font-size')); 1191 fontSize = fontSize + Math.round(fontSize * 0.25); 1192 var textTransform = $('.style-traditional .tabnav .nav>li>a').css('text-transform'); 1193 1194 // var html = '<div id="show-corona-instructions" style="padding:20px;flex: 0 1 100%;" class="text-center"><p style="color:'+textColor+';margin-bottom:20px;">'+text+' <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="color:'+linkColor+';"href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></p><a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="margin: 20px auto; padding: 10px 50px 10px 30px; cursor: pointer; background-color: '+linkColor+'; background: '+linkColor+'; text-decoration: none; color: '+textColor+'; border: 2px solid '+linkColor+';font-size:'+fontSize+'px;text-transform: '+textTransform+'" href="tel:+1'+phone+'">'+btnText+'</a></div>'; 1195 var html = '<div id="show-corona-instructions" style="padding:20px;flex: 0 1 100%;" class="text-center"><p style="color:'+textColor+';margin-bottom:20px;">'+text+' <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="text-decoration: underline;color:'+textColor+';"href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></p><a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Corona Instructions Phone\');" style="margin: 20px auto; padding: 10px 30px 10px 30px; cursor: pointer; background-color: '+linkColor+'; background: '+linkColor+'; text-decoration: none; color: '+linkTextColor+'; border: 2px solid '+linkColor+';font-size:'+fontSize+'px;text-transform: '+textTransform+'" href="'+btnLinkLocation+'">'+btnText+'</a></div>'; 1196 1197 } 1198 //html content 1199 pageEl.prepend(html); 1200 } 1201 1202 function rgb2hex(rgb) { 1203 if(typeof rgb !== "undefined"){ 1204 rgbColor = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); 1205 if (!rgbColor) { 1206 rgba = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(,\s*\d+\.*\d+)?\)$/); 1207 return "#" + hex(rgba[1]) + hex(rgba[2]) + hex(rgba[3]); 1208 } 1209 function hex(x) { 1210 return ("0" + parseInt(x).toString(16)).slice(-2); 1211 } 1212 return "#" + hex(rgbColor[1]) + hex(rgbColor[2]) + hex(rgbColor[3]); 1213 } 1214 return rgb; 1215 } 1216 1217 function getContrast50(hexcolor){ 1218 return (parseInt(hexcolor, 16) > 0xffffff/2) ? '#000':'#fff'; 1219 } 1220 1221 function show_corona_sidebar_instructions(text, phone){ 1222 //format to US number 1223 var match = phone.match(/^(\d{3})(\d{3})(\d{4})$/); 1224 var divWidth = 230; 1225 var top = 50; 1226 var linkSize = '1.6em'; 1227 var pSize = $('p').css('font-size'); 1228 var appendPhone = 'tel:+1'+phone+''; 1229 1230 if ($(window).width() < 1600) 1231 var top = 30; 1232 if ($(window).width() < 1200){ 1233 var divWidth = 180; 1234 var linkSize = '1.4em'; 1235 var pSize ='1.1em'; 1236 } 1237 1238 if($('.food-menu-nav').length){ //new template 1239 var textColor = $('.food-menu-nav-item.active').css('color'); 1240 var linkColor = $('.food-menu-nav-item.active').css('background-color'); 1241 1242 var linkTextColor = $('.food-menu-nav-item.active').css('color'); 1243 var parent = $('.food-menu-page'); 1244 } 1245 else { //old template 1246 var textColor = $('.menu-item-name-traditional').css('color'); 1247 var linkColor = $('.style-traditional .tabnav .nav>
1247li.active>a').css('color'); 1248 var parent = $('.food-menu').length ? $('.food-menu') : $('.drink-menu'); 1249 var linkTextColor = getContrast50(linkColor); 1250 } 1251 1252 // $(parent).append('<div id="corona-instructions-sidebar" style="display:none;position:fixed;width:'+divWidth+'px;top:'+top+'vh;right:0;background-color:'+linkColor+';padding:15px;text-align:center;color:'+textColor+';text-transform:uppercase;"><p style="margin:0 0 5px;font-size:'+pSize+';">'+text+'</p><i class="fa fa-phone" aria-hidden="true"></i> <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Food Page Side Element Phone\');" style="font-size:'+linkSize+';color:'+textColor+';" href="tel:+1'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></div>'); 1253 $(parent).append('<div id="corona-instructions-sidebar" style="display:none;position:fixed;width:'+divWidth+'px;top:'+top+'vh;right:0;background-color:'+linkColor+';padding:15px;text-align:center;color:'+linkTextColor+';text-transform:uppercase;"><p style="margin:0 0 5px;font-size:'+pSize+';">'+text+'</p><i class="fa fa-phone" aria-hidden="true"></i> <a onclick="ga(\'send\', \'event\', \'Button\', \'Click\', \'Food Page Side Element Phone\');this.href=\'' + appendPhone + '\';" style="font-size:'+linkSize+';color:'+linkTextColor+';" href="/call-us/'+phone+'">'+ match[1] + '-' + match[2] + '-' + match[3] +'</a></div>'); 1254 1255 //check if resolution is bigger than tablet resolution 1256/* if ($(window).width() > 991) { 1257 //detect scroll 1258 window.onscroll = function (e) { 1259 if ($(window).scrollTop() == 0) { 1260 $('#corona-instructions-sidebar').hide(); 1261 }else { 1262 $('#corona-instructions-sidebar').show(); 1263 } 1264 } 1265 } */ 1266 } 1267 1268 function check_corona_config(config){ 1269 console.log(config) 1270 if (config) { 1271 if (config.instructions_on_food_page && config.food_page_instruction_text && config.food_page_instruction_phone) { 1272 if (!config.promote_deliveries && config.promote_pick_up) { 1273 var btnText = 'Call For Pick Up'; 1274 } 1275 if (config.promote_deliveries && !config.promote_pick_up) { 1276 var btnText = 'Call For Delivery'; 1277 } 1278 if (config.promote_deliveries && config.promote_pick_up) { 1279 var btnText = 'Call For Pick Up Or Delivery'; 1280 } 1281 1282 if(typeof btnText !== "undefined"){ // check if pick up or delivery are true 1283 if(config.shopping_cart_type == "TMT" && config.shopping_cart_active == true) { 1284 var btnText = 'ORDER NOW'; 1285 if($('.food-menu-nav').length){ //new template 1286 var textColor = rgb2hex($('.section-header').css('color')); 1287 var linkColor = rgb2hex($('.food-menu-nav-item.active').css('background-color')); 1288 var fontSize = parseInt($('.food-menu-nav-item').css('font-size')); 1289 fontSize = fontSize + Math.round(fontSize * 0.25); 1290 } 1291 else { //old template 1292 var textColor = rgb2hex($('.menu-item-name-traditional').css('color')); 1293 var linkColor = rgb2hex($('.style-traditional .tabnav .nav>li.active>a').css('color')); 1294 1295 var linkTextColor = getContrast50(linkColor); 1296 var fontSize = parseInt($('.menu-item-name-traditional').css('font-size')); 1297 fontSize = fontSize + Math.round(fontSize * 0.25); 1298 } 1299 show_corona_instructions('For online orders, use our own <a style="text-decoration:underline;color: '+textColor+';" href="https://tmt.spotapps.co/ordering-menu/?spot_id='+config.spot_id+'&images=yes&accordion=true#"> commission free ordering platform! </a> or call:', config.food_page_instruction_phone, btnText); 1300 show_corona_sidebar_instructions(btnText, config.food_page_instruction_phone); 1301 } else { 1302 show_corona_instructions(config.food_page_instruction_text, config.food_page_instruction_phone, btnText); 1303 show_corona_sidebar_instructions(btnText, config.food_page_instruction_phone); 1304 } 1305 1306 } 1307 } 1308 } 1309 } 1310 1311 1312 if (is_food_menu_page() && !window.location.search.includes("contactless=true")){ 1313 $( document ).ready(function() { 1314 setTimeout(function(){ 1315 check_corona_config(corona_config); 1316 }, 300); 1317 }); 1318 } 1319 1320 1321 1322 function isPhone(phone){ 1323 var regex = /^(\+\d{1,2}\s?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/; 1324 return regex.test(phone); 1325 } 1326 1327 function sendEmail_MT (input_id) { 1328 const $loader = $("[data-id=newsletter-widget-2] .sph-loading-img"); 1329 1330 const $step = { 1331 form: $("[data-id=newsletter-widget-2] .sph-email-form"), 1332 message: $("[data-id=newsletter-widget-2] .sph-response-message"), 1333 } 1334 1335 const $field = { 1336 email: $("[data-id=newsletter-widget-2] #sph-newsletter-input-" + input_id), 1337 phone: $("[data-id=newsletter-widget-2] #sph-newsletter-phone-" + input_id), 1338 consent: $("[data-id=newsletter-widget-2] #sph-newsletter-checkbox-phone-" + input_id), 1339 }; 1340 1341 const $error = { 1342 email: $("[data-id=newsletter-widget-2] #sph-newsletter-email-error-" + input_id), 1343 phone: $("[data-id=newsletter-widget-2] #sph-newsletter-phone-error-" + input_id), 1344 }; 1345 1346 if ($field.email.val().trim() === "") { 1347 $error.email 1348 .html("This field is required") 1349 .show(); 1350 } 1351 else if (!isEmail($field.email.val().trim())) { 1352 $error.email 1353 .html("Please use the format â[email protected]â") 1354 .show(); 1355 } else { 1356 $error.email 1357 .html("") 1358 .hide(); 1359 } 1360 1361 if ($field.consent.is(':checked') && $field.phone.val().trim() === "") { 1362 $error.phone 1363 .html("This field is required") 1364 .show(); 1365 } else if ($field.phone.val().trim().length > 0 && !isPhone($field.phone.val().trim())) { 1366 $error.phone 1367 .html("The phone number must contain 10 digits") 1368 .show(); 1369 } else { 1370 $error.phone 1371 .html("") 1372 .hide(); 1373 } 1374 1375 const errorField = $step.form.find('.sh-form-error:visible'); 1376 1377 if (errorField.length > 0) { 1378 const input = errorField.first().next(); 1379 1380 document.activeElement.blur(); 1381 1382 setTimeout(() => { 1383 input.focus(); 1384 }, 160) 1385 1386 return; 1387 } 1388 1389 $loader 1390 .show() 1391 .prev() 1392 .hide(); 1393 1394 $.ajax({ 1395 method: "POST", 1396 url: "https://www.spothopperapp.com/api/spots/294822/contacts/add_with_texting_permission", 1397 crossDomain: true, 1398 dataType: 'json', 1399 data: { 1400 email: $field.email.val().trim(), 1401 phone: $field.phone.val().trim(), 1402 texting_permission: $field.consent.is(':checked'), 1403 }, 1404 success: function (data) { 1405 afterRequestSubmission(data); 1406 }, 1407 error: function () { 1408 afterRequestSubmission("Something went wrong. Please try again later."); 1409 } 1410 }); 1411 1412 function afterRequestSubmission (data) { 1413 $step.form.hide(); 1414 1415 $step.message 1416 .html(data) 1417 .show() 1418 .trigger('focus'); 1419 } 1420 } 1421</script>
1421<script>function addPromotionParamsToTMTLinks() 1422{ 1423 if (sessionStorage.getItem('shUrlParams')) { 1424 let shParams = JSON.parse(sessionStorage.getItem('shUrlParams')); 1425 if (!Object.keys(shParams).length) 1426 return; 1427 if(!shParams.source) 1428 return; 1429 $('a').each(function () { 1430 if (this.href.includes('tmt.spotapps.co')) { 1431 if(this.href.includes('&source=') || this.href.includes('&destination=') || this.href.includes('&promotion=')) 1432 return; 1433 1434 this.href = this.href + '&source=' + shParams.source; 1435 if(shParams.destination) 1436 this.href = this.href + '&destination=' + shParams.destination; 1437 if(shParams.promotion) 1438 this.href = this.href + '&promotion=' + shParams.promotion; 1439 if(shParams.fb_post_id) 1440 this.href = this.href + '&fb_post_id=' + shParams.fb_post_id; 1441 if(shParams.email_post_id) 1442 this.href = this.href + '&email_post_id=' + shParams.email_post_id; 1443 } 1444 }) 1445 } 1446} 1447setTimeout(function() { 1448 addPromotionParamsToTMTLinks(); 1449 addFooterToSourceParam(); 1450},600) 1451 1452function addFooterToSourceParam() 1453{ 1454 $('.bottom-link').each(function (){ 1455 if(shouldAddSourceParam(this.href)) 1456 this.href = this.href + '&source=footer'; 1457 }) 1458 $('#sh-multiple-links-content-holder a').each(function (){ 1459 if(shouldAddSourceParam(this.href)) 1460 this.href = this.href + '&source=footer'; 1461 }) 1462} 1463function shouldAddSourceParam(link){ 1464 if (link.includes('tmt.spotapps.co') && !link.includes('&source=')){ 1465 return true; 1466 } 1467 return false; 1468} 1469</script>
1469<script> 1470;(async () => { 1471if (typeof window.focusTrap === 'undefined') { 1472 await getScript('https://unpkg.com/tabbable/dist/index.umd.js'); 1473 await getScript('https://unpkg.com/focus-trap/dist/focus-trap.umd.js'); 1474} 1475 1476document.querySelectorAll('.modal').forEach((element) => { 1477 const trap = window.focusTrap?.createFocusTrap(element, { 1478 allowOutsideClick: true, 1479 }); 1480 1481 $(element).on('shown.bs.modal', () => { 1482 trap?.activate(); 1483 }); 1484 1485 $(element).on('hidden.bs.modal', () => { 1486 trap?.deactivate(); 1487 }); 1488}); 1489 1490async function getScript (source) { 1491 return new Promise((resolve, reject) => { 1492 const script = document.createElement('script'); 1493 script.src = source; 1494 script.async = true; 1495 1496 script.onload = resolve; 1497 script.onerror = reject; 1498 1499 document.head.appendChild(script); 1500 }); 1501} 1502})(); 1503</script>
1503<script src="https://wcache-plugins.spotapps.co/production/wcpl_bootstrap_ada_fix/wcpl_bootstrap_ada_fix.js"></script>
1503<link href="https://wcache-plugins.spotapps.co/production/wcpl_bday_club/wcpl_bday_club.css" rel="stylesheet" media="screen"/>
1503<script src="https://wcache-plugins.spotapps.co/production/wcpl_bday_club/wcpl_bday_club.js"></script>
1503<script src="https://wcache-plugins.spotapps.co/production/wcpl_ga_tracking/wcpl_ga_tracking.js"></script>
1503<script src="https://wcache-plugins.spotapps.co/production/wcpl_media_controls/script.js"></script>
1503<link href="https://wcache-plugins.spotapps.co/production/wcpl_website_editor_interpreter/website_interpreter_helper_style.css" rel="stylesheet" media="screen"/>
1503<script>var changes_log_array = {};</script>
1503<script src="https://wcache-plugins.spotapps.co/production/wcpl_website_editor_interpreter/website_interpreter.js"></script>
1503</body></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.