1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8" /> 5 <meta http-equiv="Content-Security-Policy" content="img-src * data:; connect-src 'self' https://www.google-analytics.com https://analytics.google.com https://www.google.com https://cdn.weglot.com https://cdn-api-weglot.com https://connect.facebook.net https://www.facebook.com https://vice-prod.sdiapi.com https://reports.sdiapi.com ; default-src 'self' 'unsafe-inline' 'unsafe-eval' *.google.com *.gstatic.com *.googletagmanager.com *.googleadservices.com *.windows.net *.google-analytics.com *.doubleclick.net *.weglot.com *.cdn-api.weglot.com *.facebook.com *.facebook.net *.sdiapi.com ;" /> 6 <meta name="viewport" content="width=device-width, minimum-scale=1.0, user-scalable=yes"> 7 <title>Home â Local Foods Plymouth</title> 8 <meta name="description" content="" /> 9 <meta name="keywords" content="" /> 10 11
11<script> 12 vice={config: { 13 viceAccountId: 'c27bb423-83d9-4612-ad7e-3e95d5a9822c', 14 viceSiteId: '6f5d3c6e-95f0-41ab-8eb9-d7cd845f05ef', 15 } 16 } 17 </script>
17 18
18<script src='//vice-prod.sdiapi.com/vice_loader/c27bb423-83d9-4612-ad7e-3e95d5a9822c/6f5d3c6e-95f0-41ab-8eb9-d7cd845f05ef'> 19 </script>
19 20 21
21<script src="/Scripts/jquery-3.5.1.js"></script>
21 22 23
23<script src="/Scripts/jquery.validate.js"></script>
vendor: 2 bytes, line 23
23
24<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
vendor: 2 bytes, line 24
24
25<script src="/Scripts/jquery.tmpl.min.js"></script>
25 26 27 28
28<script src="/js/uikit.min.js?v5.06"></script>
28 29
29<script src="/js/uikit-icons.min.js?v5.06"></script>
29 30
30<script src="/top/back-to-top.js"></script>
30 31 32 <link href="/css/uikit.min.css?v5.06" rel="stylesheet" /> 33 <link href="/css/font-awesome.min.css" rel="stylesheet" /> 34 <link href="/top/back-to-top.css" rel="stylesheet" /> 35 36
36<script src="/Scripts/modernizr-2.6.2.js"></script>
vendor: 2 bytes, line 36
36
37<script src="/Scripts/modernizr-2.8.3.js"></script>
vendor: 85 bytes, lines 37-43
37 38 39 40 41 <script src="//www.google.com/recaptcha/api.js"></script> 42 43
43<script src="/Scripts/checkout.js?v5.06"></script>
43 44 45 46 47 48 <link rel="stylesheet" href="/Content/Site.css?v5.06" /> 49 <link rel="stylesheet" href="https://lfmimages.blob.core.windows.net/400952-lfp/assets/css/Theme.css?v5.06" /> 50 <link rel="stylesheet" href="https://lfmimages.blob.core.windows.net/400952-lfp/assets/css/Site-Specific.css?v5.06" /> 51 52 <!-- Anything site specific that needs to be included in the head should be placed here. --> <link rel="icon" href="https://lfmimages.blob.core.windows.net/400952-lfp/favicon.ico"> <meta property="og:title" content="Online Farmers Market in Plymouth, NH | Local Foods Plymouth" /> <meta property="og:description" content="Shop fresh, local food from small farms and makers across the region. Weekly online ordering with Thursday pickup in Plymouth, NH and delivery available." /> <meta property="og:image" content="https://lfmimages.blob.core.windows.net/400952-lfp/Logo.jpg" /> <meta property="og:url" content="https://shop.localfoodsplymouth.org/" /> <title>Online Farmers Market in Plymouth, NH | Local Foods Plymouth</title> <meta name="description" content="Shop fresh, local food from small farms and makers across the region. Weekly online ordering with Thursday pickup in Plymouth, NH and delivery available." /> 53</head> 54<body class="uk-height-1-1"> 55 <a href="#main-content" class="lfm-skip-link">Skip to main content</a> 56 57 <div id="global-overlay"> 58 <span id="global-spinner" uk-spinner="ratio: 3.0"></span> 59 </div> 60 61 <header id="header"> 62 <!-- Any site specific scripts that need to be included in the header should be placed here. -->� 63 <div id="main-nav"><div id="weglot"></div><div class="uk-container nav-center"><div id="logo"><img src="https://lfmimages.blob.core.windows.net/400952-lfp/Logo.jpg" id="logo-img" alt="Site Logo" /></div><div id="menu-box" class="uk-visible@s"> 64<nav class="uk-navbar-container" uk-navbar> 65<div class="uk-navbar-left"> 66<ul class="uk-navbar-nav uk-flex-between"> 67<li class="menu-item"><a href="//shop.localfoodsplymouth.org/Index">HOME</a></li> 68<li class="menu-item"><a href="//shop.localfoodsplymouth.org/Products">SHOP NOW</a></li> 69<li class="menu-item"><a href="//shop.localfoodsplymouth.org/Account/Register">SIGN UP!</a></li> 70<li class="menu-item"><a href="//shop.localfoodsplymouth.org/Contact">CONTACT US</a></li> 71<li class="menu-item"><a target="_blank" href="https://plymouthenergy.org/">PAREI</a></li> 72<li class="menu-item"><a target="_blank" href="https://secure.lglforms.com/form_engine/s/wNHi1pQIn44PLdSe57N0bQ">DONATE $20 TO CELEBRATE 20 YEARS</a></li> 73 </ul> 74</div> 75</nav> 76</div> 77<a id="toggle-menu" href="#offcanvas" class="uk-navbar-toggle uk-hidden@s" title="Mobile Main Menu" u
77k-toggle uk-navbar-toggle-icon></a><div id="offcanvas" uk-offcanvas><div id="offcanvas-menu" class="uk-offcanvas-bar uk-offcanvas-bar-light"><ul class="uk-nav-default" uk-nav><li class="mobile-menu-item"><a href="//shop.localfoodsplymouth.org/Index">HOME</a></li> 78<li class="mobile-menu-item"><a href="//shop.localfoodsplymouth.org/Products">SHOP NOW</a></li> 79<li class="mobile-menu-item"><a href="//shop.localfoodsplymouth.org/Account/Register">SIGN UP!</a></li> 80<li class="mobile-menu-item"><a href="//shop.localfoodsplymouth.org/Contact">CONTACT US</a></li> 81<li class="mobile-menu-item"><a target="_blank" href="https://plymouthenergy.org/">PAREI</a></li> 82<li class="mobile-menu-item"><a target="_blank" href="https://secure.lglforms.com/form_engine/s/wNHi1pQIn44PLdSe57N0bQ">DONATE $20 TO CELEBRATE 20 YEARS</a></li> 83</ul> 84</div> 85</div> 86</div></div> 87 88 89<div class="sticky-bar" uk-sticky> 90 <div class="lfm-nav-container"> 91 <div class="uk-flex uk-flex-between"> 92 <div id="period-message"> 93 <!--period message used to be here--> 94 </div> 95 96 <nav class="uk-navbar-container uk-navbar-transparent" uk-navbar="mode: click"> 97 <div class="uk-navbar-right"> 98 <ul class="uk-navbar-nav top-bar-navbar"> 99 <li> 100 <div class="uk-button-group"> 101 <div class="uk-inline"> 102 <button class="uk-button top-bar-button" type="button"> <span uk-icon="user" aria-hidden="true"></span></button> 103 <div uk-dropdown="mode: click; target: !.uk-button-group; pos:bottom-right;" class="top-bar-dropdown"> 104 <ul class="uk-nav uk-dropdown-nav"> 105<li id="logged-out-products-link"><a href="//shop.localfoodsplymouth.org/Products">Shop</a></li><li id="logged-out-login-link"><a href="//shop.localfoodsplymouth.org/Account/Login">Login</a></li> </ul> 106 </div> 107 </div> 108 </div> 109 </li> 110 <li> 111 <div class="uk-button-group"> 112 <div class="uk-inline"> 113 <button id="cart-trigger-btn" class="uk-button top-bar-button" onclick="openCart();" type="button" aria-label="View Shopping Cart" aria-expanded="false" aria-controls="shopping-cart"> 114 <span uk-icon="cart" aria-label="shopping cart"></span> 115 <span class="uk-badge" id="item-count" style=display:none;>0</span> 116 </button> 117 118 <!-- off-canvas shopping cart--> 119 <dialog id="shopping-cart" aria-labelledby="cart-panel-heading"> 120 <div class="uk-offcanvas-bar uk-offcanvas-bar-light"> 121 <h2 id="cart-panel-heading" class="visually-hidden">Shopping Cart</h2> 122 <button id="cart-continue-shopping" class="uk-button uk-button-small uk-button-primary uk-margin-small-bottom" style="width:100%;" type="button" onclick="closeCart();">Continue Shopping</button> 123 <div> 124 <div id="cart-alert-area-success" class="uk-alert-success uk-margin-small-bottom" uk-alert role="status" aria-live="polite" aria-atomic="true" style="display:none;"> 125 <a href="#" class="uk-alert-close" uk-close></a> 126 <p id="cart-alert-success-text"></p> 127 </div> 128 129 <div class="" > 130 <div class="uk-text-bold" id="cart-selected-sub-text">For Distribution on: Thu Oct, 1</div> 131 </div> 132 <div id="order-list-body" class="uk-margin-small-top" > 133 <div id="order-icon-table" class="uk-overflow-auto" style=display:none;> 134 135 <div id="cart-message" class="uk-margin-bottom uk-text-danger" style="display:none;"></div> 136 137 <div class="shopping-cart-text" id="cart-selected-sub-nameloc"> 138 139 </div> 140 <div class="uk-margin-small-top shopping-cart-text" id="cart-ordernum-text" style="border-bottom: thin solid #333; padding-bottom: 2px;"> 141 142 </div> 143 <table class="uk-table uk-table-small"> 144 <tbody id="order-items"> 145 </tbody> 146 </table> 147 </div> 148 </div> 149 150 <div id="cart-items-empty" class="uk-margin-small-top" > 151 <div class=""> 152 There are no items in your cart for this distribution day. 153 </div> 154 <div> 155 <a class="uk-button uk-button-small uk-button-secondary" href="/Products">Shop</a> 156 </div> 157 </div> 158 159 <div id="edit-order-row" class="edit-order-button uk-margin-small-top" style=display:none;> 160 <div class="order-total" id="order-total" aria-live="polite" aria-atomic="true">Total: $0.00</div> 161 162 <div class="uk-margin-small-top"> 163 <a id="edit-order-button" class="uk-button uk-button-small uk-button-secondary" href="/Order/Edit/0"></a> 164 </div> 165 </div> 166 167 <!-- subscriptions --> 168 <div id="subscription-list-body" class="uk-margin-medium-top"> 169 <div id="order-icon-subs" class="uk-overflow-auto" style=display:none;> 170 <hr /> 171 <div class="uk-gri
171d uk-grid-small"> 172 <div class="uk-width-1-1">Subscription Orders</div> 173 174 <div class="uk-width-1-1" id="cart-subs-items"> 175 176 </div> 177 </div> 178 </div> 179 </div> 180 181 <!-- pre-orders--> 182 <div id="pre-order-list-body" class="uk-margin-medium-top"> 183 <div id="order-icon-pre-orders" class="uk-overflow-auto" style=display:none;> 184 <hr /> 185 <div class="uk-grid uk-grid-small"> 186 <div class="uk-width-1-1">Pre-Orders</div> 187 188 <div class="uk-width-1-1" id="cart-pre-orders"> 189 190 </div> 191 </div> 192 </div> 193 </div> 194 195 </div> 196 </div> 197 </dialog> 198 </div> 199 </div> 200 </li> 201 </ul> 202 </div> 203 </nav> 204 </div> 205 </div> 206</div> 207 208 </header> 209 <a href="#0" class="cd-top" aria-label="Back to top" role="button">Top</a> 210 <div id="content" class="content-area"> 211 <span id="main-content" tabindex="-1"></span> 212 <div id="aria-status" role="status" aria-live="polite" aria-atomic="true" class="visually-hidden"></div> 213 214 215 216<section style='margin: 0px; display: block; font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial; color: var(--text); background: var(--bg);'><style style="margin: 0px; box-sizing: border-box;"> 217 .lfp-home { 218 --bg: #ffffff; --text: #0f172a; --muted: #475569; --border: #e2e8f0; --soft: #f8fafc; --card: #ffffff; --shadow: 0 4px 12px rgba(0, 0, 0, .08), 0 1px 3px rgba(0, 0, 0, .05); --primary: #166534; --primaryHover: #14532d; --max: 1100px; --r: 16px; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial; color: var(--text); background: var(--bg); 219 } 220 221 .lfp-home * { 222 box-sizing: border-box 223 } 224 225 .lfp-wrap { 226 max-width: var(--max); margin: 0 auto; padding: 0 clamp(18px, 5vw, 24px) 227 } 228 229 .lfp-muted { 230 color: var(--muted) 231 } 232 233 .lfp-h1 { 234 margin: 0 0 12px; font-size: clamp(34px, 4.2vw, 58px); line-height: 1.08; letter-spacing: -.8px; font-weight: 800; 235 } 236 237 .lfp-h2 { 238 margin: 0 0 10px; font-size: 22px; letter-spacing: -.2px; font-weight: 700; 239 } 240 241 .lfp-h3 { 242 margin: 0 0 8px; font-size: 16px; font-weight: 600; 243 } 244 245 .lfp-p { 246 margin: 0; font-size: 15px; line-height: 1.6 247 } 248 249 .lfp-lede { 250 font-size: 17px; color: var(--muted); max-width: 70ch; line-height: 1.6; 251 } 252 253 .lfp-section { 254 padding: 40px 0 255 } 256 257 .lfp-section-soft { 258 padding: 40px 0; background: var(--soft); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border) 259 } 260 261 .lfp-card { 262 background: var(--card); border: 1px solid var(--border); border-radius: var(--r); box-shadow: var(--shadow) 263 } 264 265 .lfp-card-pad { 266 padding: 20px 267 } 268 269 .lfp-pill { 270 display: inline-block; font-size: 12px; font-weight: 800; color: #0f172a; background: #f1f5f9; border: 1px solid var(--border); padding: 6px 10px; border-radius: 999px; margin-bottom: 10px; 271 } 272 273 .lfp-btnrow { 274 display: flex; gap: 10px; flex-wrap: wrap; margin-top: 16px 275 } 276 277 .lfp-btn { 278 display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border: 1px solid var(--border); background: #fff; text-decoration: none; color: var(--text); transition: all 0.15s ease; 279 } 280 281 .lfp-btn:hover { 282 background: #f1f5f9 283 } 284 285 .lfp-btn-primary { 286 background: var(--primary); border-color: var(--primary); color: #fff; box-shadow: 0 2px 8px rgba(22, 101, 52, .12); 287 } 288 289 .lfp-btn-primary:hover { 290 background: var(--primaryHover); border-color: var(--primaryHover); box-shadow: 0 4px 12px rgba(22, 101, 52, .16); 291 } 292 /* Banner image */ 293 294 .lfp-hero { 295 padding: 28px 0; background: var(--soft); border-bottom: 1px solid var(--border) 296 } 297 298 .lfp-banner { 299 overflow: hidden; border-radius: var(--r); border: 1px solid var(--border); box-shadow: var(--shadow); background: #fff; 300 } 301 302 .lfp-banner img { 303 display: block; width: 100%; height: auto 304 } 305 /* Hero card - simplified single column */ 306 307 .lfp-hero-card { 308 margin-top: 18px 309 } 310 311 .lfp-kicker { 312 font-size: 14px; color: var(--muted); margin-bottom: 12px; font-weight: 500; 313 } 314 315 .lfp-weekbar { 316 display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-top: 18px 317 } 318 319 .lfp-weekitem { 320 background: var(--soft); border: 1px solid var(--border); border-radius: 14px; padding: 12px 321 } 322 323 .lfp-weeklabel { 324 font-size: 12px; color: var(--muted); margin-bottom: 4px; font-weight: 500; 325 } 326 327 .lfp-weekvalue { 328 font-size: 14px; font-weight: 700; 329 } 330 331 .lfp-newhere { 332 margin-top: 18px; padding: 16px; background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: var(--r); display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; 333 } 334 335 .lfp-newhere-text { 336 flex: 1; min-width: 280px; 337 } 338 339 .lfp-newhere-text strong { 340 font-weight: 700; color: var(--text); 341 } 342 343 .lfp-newhere .lfp-btnrow { 344 margin: 0; flex-shrink: 0; 345 } 346 /* Grids */ 347 348 .lfp-grid2 { 349 display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px 350 } 351 352 .lfp-grid3 { 353 display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px 354 } 355 /* Steps */ 356 357 .lfp-step { 358 padding: 18px 359 } 360 361 .lfp-num { 362 width: 36px; height: 36px; border-radius: 12px; background: #eef2ff; border: 1px solid #e0e7ff; display: flex; align-items: center; justify-content: center; font-weight: 800; color: #1e3a8a; margin-bottom: 10px; font-size: 16px; 363 } 364 /* Lists */ 365 366 .lfp-ul { 367 margin: 10px 0 0 20px; color: var(--muted); line-height: 1.6; 368 } 369 370 .lfp-ul li { 371 margin: 7px 0 372 } 373 /* Food Share section styling */ 374 375 .lfp-foodshare-wrap { 376 background: linear-gradient(180deg, #f0fdf4, #ffffff); padding: 28px; border-radius: var(--r); border: 1px solid #bbf7d0; 377 } 378 /* Responsive */ 379 380 @media (max-width: 980px) { 381 .lfp-weekbar { 382 grid-template-columns: 1fr 1fr 383 } 384 .lfp-grid3 { 385 grid-template-columns: 1fr 386 } 387 .lfp-grid2 { 388 grid-template-columns: 1fr 389 } 390 .lfp-newhere { 391 flex-direction: column; align-items: flex-start; 392 } 393 } 394 395 </style> <!-- HERO --><div style="margin: 0px; box-sizing: border-box; padding: 28px 0px; background: var(--soft); border-bottom: 1px solid var(--border);"><div style="margin: 0px auto; box-sizing: border-box; max-width: var(--max); padding: 0px clamp(18px, 5vw, 24px);"><div style="margin: 0px; box-sizing: border-box; overflow: hidden; border-radius: var(--r); border: 1px solid var(--border); box-shadow: var(--shadow); background: rgb(255, 255, 255);"><img src="https://lfmimages.blob.core.windows.net/400952-lfp/content/image_6e16d64c.png" alt="Local Foods Plymouth - local farms and food makers" style="max-width: 100%; height: auto; box-sizing: border-box; border: 0px; width: 100%;" class="fr-fil fr-dib"></div><div style="margin: 18px 0px 0px; box-sizing: border-box; background: var(--card); border: 1px solid var(--border); border-radius: var(--r); box-shadow: var(--shadow); padding: 20px;"><div style="margin: 0px 0px 12px; box-sizing: border-box; font-size: 14px; color: var(--muted); font-weight: 500;">Online farmers market • Weekly pickup • Delivery available</div><h1 style='margin: 0px 0px 12px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 800; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 36px; line-height: 42px; letter-spacing: -0.8px;'>
395Online Farmers Market in Plymouth, NH</h1><p style="margin: 15px 0px; box-sizing: border-box; font-size: 17px; color: var(--muted); max-width: 70ch; line-height: 1.6;">Your online farmers market for fresh, locally grown and produced food from across the region. Shop each week from dozens of small farms and food makers — from produce and meat to eggs, baked goods, and pantry staples.</p><div style="margin: 16px 0px 0px; box-sizing: border-box; display: flex; gap: 10px; flex-wrap: wrap;"><a href="/Products" style="margin: 0px; background: var(--primary); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border-color: var(--primary); border-top-style: ; border-top-width: ; border-right-style: ; border-right-width: ; border-bottom-style: ; border-bottom-width: ; border-left-style: ; border-left-width: ; border-image-source: ; border-image-slice: ; border-image-width: ; border-image-outset: ; border-image-repeat: ; text-decoration: none; color: rgb(0, 119, 221); transition: 0.15s; box-shadow: rgba(22, 101, 52, 0.12) 0px 2px 8px; cursor: pointer;">Shop this week</a> <a href="#lfp-how" style="margin: 0px; background: rgb(255, 255, 255); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border: 1px solid var(--border); text-decoration: none; color: rgb(0, 119, 221); transition: 0.15s; cursor: pointer;">How it works</a></div><div style="margin: 18px 0px 0px; box-sizing: border-box; display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px;"><div style="margin: 0px; box-sizing: border-box; background: var(--soft); border: 1px solid var(--border); border-radius: 14px; padding: 12px;"><div style="margin: 0px 0px 4px; box-sizing: border-box; font-size: 12px; color: var(--muted); font-weight: 500;">Store opens</div><div style="margin: 0px; box-sizing: border-box; font-size: 14px; font-weight: 700;">Fri 12 PM</div></div><div style="margin: 0px; box-sizing: border-box; background: var(--soft); border: 1px solid var(--border); border-radius: 14px; padding: 12px;"><div style="margin: 0px 0px 4px; box-sizing: border-box; font-size: 12px; color: var(--muted); font-weight: 500;">Pickup</div><div style="margin: 0px; box-sizing: border-box; font-size: 14px; font-weight: 700;">Thu 3:30 – 8 PM</div></div><div style="margin: 0px; box-sizing: border-box; background: var(--soft); border: 1px solid var(--border); border-radius: 14px; padding: 12px;"><div style="margin: 0px 0px 4px; box-sizing: border-box; font-size: 12px; color: var(--muted); font-weight: 500;">Location</div><div style="margin: 0px; box-sizing: border-box; font-size: 14px; font-weight: 700;"><a href="https://maps.app.goo.gl/ff56ubfrvQY4wX249" target="_blank" rel="noopener noreferrer" style="margin: 0px; background: 0px 0px; box-sizing: border-box; color: rgb(0, 119, 221); text-decoration: none; cursor: pointer;">14 Fairgrounds Rd</a></div></div><div style="margin: 0px; box-sizing: border-box; background: var(--soft); border: 1px solid var(--border); border-radius: 14px; padding: 12px;"><div style="margin: 0px 0px 4px; box-sizing: border-box; font-size: 12px; color: var(--muted); font-weight: 500;">Delivery</div><div style="margin: 0px; box-sizing: border-box; font-size: 14px; font-weight: 700;">Available</div></div></div><!-- New Here inline callout --><div style="margin: 18px 0px 0px; box-sizing: border-box; padding: 16px; background: rgb(240, 253, 244); border: 1px solid rgb(187, 247, 208); border-radius: var(--r); display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;"><div style="margin: 0px; box-sizing: border-box; flex: 1 1 0%; min-width: 280px;"><strong style="margin: 0px; font-weight: 700; box-sizing: border-box; color: var(--text);">New here?</strong> Create an account — no membership required! Then shop weekly when the store opens. <a href="https://mailchi.mp/localfoodsplymouth/gtqjxrzo5s" target="_blank" rel="noopener noreferrer" style="margin: 0px; background: 0px 0px; box-sizing: border-box; color: rgb(0, 119, 221); text-decoration: none; cursor: pointer;">Join the email list</a> for updates.</div><div style="margin: 0px; box-sizing: border-box; display: flex; gap: 10px; flex-wrap: wrap; flex-shrink: 0;"><a href="https://shop.localfoodsplymouth.org/Account/Register" target="_blank" rel="noopener noreferrer" style="margin: 0px; background: var(--primary); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border-color: var(--primary); border-top-style: ; border-top-width: ; border-right-style: ; border-right-width: ; border-bottom-style: ; border-bottom-width: ; border-left-style: ; border-left-width: ; border-image-source: ; border-image-slice: ; border-image-width: ; border-image-outset: ; border-image-repeat: ; text-decoration: none; color: rgb(0, 119, 221); transition: 0.15s; box-shadow: rgba(22, 101, 52, 0.12) 0px 2px 8px; cursor: pointer;">Create an account</a></div></div></div></div></div><!-- PICKUP OPTIONS --><div style="margin: 0px; box-sizing: border-box; padding: 40px 0px;"><div style="margin: 0px auto; box-sizing: border-box; max-width: var(--max); padding: 0px clamp(18px, 5vw, 24px);"><div style="margin: 0px; box-sizing: border-box; background: var(--card); border: 1px solid var(--border); border-radius: var(--r); box-shadow: var(--shadow); padding: 20px;"><h2 style='margin: 0px 0px 10px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 700; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 24px; letter-spacing: -0.2px; line-height: 30px;'>Pickup options</h2><h3 style='margin: 16px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>Staffed pickup (3:30 - 5:30)</h3><p style="margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Pull up, give us the name on your order, and our team will bring your box to your vehicle. No need to get out, but if you'd like to chat, park in the lot and come say hello!</p><h3 style='margin: 20px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>After-hours self-service pickup (5:30 – 8:00 PM)</h3><p style="margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Can't make the staffed pickup window? Choose after-hours pickup at checkout. Your order will be staged for self-service.</p><div style="margin: 16px 0px 0px; padding: 16px; background: rgb(248, 250, 252); border-radius: 14px; border: 1px solid rgb(226, 232, 240); box-sizing: border-box;"><p style="margin: 0px 0px 10px; box-sizing: border-box; font-size: 15px; line-height: 1.6;"><strong style="margin: 0px; font-weight: 700; box-sizing: border-box;">At checkout:</strong></p><ol style="margin: 10px 0px 0px 20px; padding-left: 30px; box-sizing: border-box; color: var(--muted); line-height: 1.6;"><li style="margin: 7px 0px; box-sizing: border-box;">Under <strong style="margin: 0px; font-weight: 700; box-sizing: border-box;">Distribution Information</strong>, click <strong style="margin: 0px; font-weight: 700; box-sizing: border-box;">Select Location</strong></li><li style="margin: 7px 0px; box-sizing: border-box;">Choose <strong style="margin: 0px; font-weight: 700; box-sizing: border-box;">After Hours Pickup</strong></li><li style="margin: 7px 0px; box-sizing: border-box;">Complete your order</li></ol><p style="margin: 12px 0px 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Your bags will be labeled and ready for pickup between 5:30 – 8:00 PM. Please take only the bags with your name.</p></div></div></div></div><!-- HOW IT WORKS --><div id="lfp-how" style="margin: 0px; box-sizing: border-box; padding: 40px 0px; background: var(--soft); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);"><div style="margin: 0px auto; box-sizing: border-box; max-width: var(--max); padding: 0px clamp(18px, 5vw, 24px);"><h2 style='margin: 0px 0px 10px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 700; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 24px; letter-spacing: -0.2px; line-height: 30px;'>How it works</h2><p style="max-width: 80ch; margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">We bring local food together in one place so it's easier for you to eat seasonally and support your neighbors. For producers, we handle the backend — marketing, sales, and fulfillment — so they can focus on what they do best: growing and making great food.</p><p style="margin: 12px 0px 0px; max-width: 80ch; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Local Foods Plymouth serves Plymouth, NH and nearby towns including Campton, Ashland, Holderness, Rumney, Thornton, and Bristol, with a single weekly pickup location in Plymouth and limited local delivery.</p><div style="margin: 20px 0px 0px; box-sizing: border-box; display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px;"><div style="margin: 0px; box-sizing: border-box; background: var(--card); border: 1px solid var(--border); border-radius: var(--r); box-shadow: var(--shadow); padding: 18px;"><div style="margin: 0px 0px 10px; box-sizing: border-box; width: 36px; height: 36px; border-radius: 12px; background: rgb(238, 242, 255); border: 1px solid rgb(224, 231, 255); display: flex; align-items: center; justify-content: center; font-weight: 800; color: rgb(30, 58, 138); font-size: 16px;">1</div><h3 style='margin: 0px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>Shop online each week</h3><p style="margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">New items as the seasons change. One checkout.</p></div><div style="margin: 0px; box-sizing: border-box; background: var(--card); border: 1px solid var(--border); border-radius: var(--r); box-shadow: var(--shadow); padding: 18px;"><div style="margin: 0px 0px 10px; box-sizing: border-box; width: 36px; height: 36px; border-radius: 12px; background: rgb(238, 242, 255); border: 1px solid rgb(224, 231, 255); display: flex; align-items: center; justify-content: center; font-weight: 800; color: rgb(30, 58, 138); font-size: 16px;">
3952</div><h3 style='margin: 0px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>We coordinate with farms & makers</h3><p style="margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Ordering, packing, and fulfillment handled behind the scenes.</p></div><div style="margin: 0px; box-sizing: border-box; background: var(--card); border: 1px solid var(--border); border-radius: var(--r); box-shadow: var(--shadow); padding: 18px;"><div style="margin: 0px 0px 10px; box-sizing: border-box; width: 36px; height: 36px; border-radius: 12px; background: rgb(238, 242, 255); border: 1px solid rgb(224, 231, 255); display: flex; align-items: center; justify-content: center; font-weight: 800; color: rgb(30, 58, 138); font-size: 16px;">3</div><h3 style='margin: 0px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>Pick up Thursday (or choose delivery)</h3><p style="margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Pickup 3:30 – 8 PM at: 14 Fairgrounds Rd., Plymouth NH 03264</p><p style="margin: 6px 0px 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Limited delivery available.</p></div></div><p style="margin: 16px 0px 15px; font-size: 13px; box-sizing: border-box; color: var(--muted);">Local Foods Plymouth is a program of the <a href="http://plymouthenergy.org" target="_blank" rel="noopener noreferrer" style="margin: 0px; background: 0px 0px; box-sizing: border-box; color: rgb(0, 119, 221); text-decoration: none; cursor: pointer;">Plymouth Area Renewable Energy Initiative (PAREI)</a>.</p></div></div><!-- GETTING STARTED --><div style="margin: 0px; box-sizing: border-box; padding: 40px 0px;"><div style="margin: 0px auto; box-sizing: border-box; max-width: var(--max); padding: 0px clamp(18px, 5vw, 24px);"><h2 style='margin: 0px 0px 10px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 700; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 24px; letter-spacing: -0.2px; line-height: 30px;'>Getting started</h2><div style="margin: 14px 0px 0px; box-sizing: border-box; display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px;"><div style="margin: 0px; box-sizing: border-box; background: var(--card); border: 1px solid var(--border); border-radius: var(--r); box-shadow: var(--shadow); padding: 20px;"><div style="margin: 0px 0px 10px; box-sizing: border-box; display: inline-block; font-size: 12px; font-weight: 800; color: rgb(15, 23, 42); background: rgb(241, 245, 249); border: 1px solid var(--border); padding: 6px 10px; border-radius: 999px;">Producers</div><h3 style='margin: 0px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>Sell through Local Foods Plymouth</h3><p style="margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Are you a local farmer or food producer looking to reach more customers?</p><div style="margin: 16px 0px 0px; box-sizing: border-box; display: flex; gap: 10px; flex-wrap: wrap;"><a href="mailto:[email protected]?subject=Interested%20in%20Joining%20LFP%20As%20a%20Vendor" style="margin: 0px; background: var(--primary); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border-color: var(--primary); border-top-style: ; border-top-width: ; border-right-style: ; border-right-width: ; border-bottom-style: ; border-bottom-width: ; border-left-style: ; border-left-width: ; border-image-source: ; border-image-slice: ; border-image-width: ; border-image-outset: ; border-image-repeat: ; text-decoration: none; color: rgb(0, 119, 221); transition: 0.15s; box-shadow: rgba(22, 101, 52, 0.12) 0px 2px 8px; cursor: pointer;">Contact us</a></div></div><div style="margin: 0px; box-sizing: border-box; background: var(--card); border: 1px solid var(--border); border-radius: var(--r); box-shadow: var(--shadow); padding: 20px;"><div style="margin: 0px 0px 10px; box-sizing: border-box; display: inline-block; font-size: 12px; font-weight: 800; color: rgb(15, 23, 42); background: rgb(241, 245, 249); border: 1px solid var(--border); padding: 6px 10px; border-radius: 999px;">Customers</div><h3 style='margin: 0px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>Create an account and start shopping</h3><p style="margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Want to eat fresher food and support local farms?</p><div style="margin: 16px 0px 0px; box-sizing: border-box; display: flex; gap: 10px; flex-wrap: wrap;"><a href="https://shop.localfoodsplymouth.org/Account/Register" target="_blank" rel="noopener noreferrer" style="margin: 0px; background: var(--primary); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border-color: var(--primary); border-top-style: ; border-top-width: ; border-right-style: ; border-right-width: ; border-bottom-style: ; border-bottom-width: ; border-left-style: ; border-left-width: ; border-image-source: ; border-image-slice: ; border-image-width: ; border-image-outset: ; border-image-repeat: ; text-decoration: none; color: rgb(0, 119, 221); transition: 0.15s; box-shadow: rgba(22, 101, 52, 0.12) 0px 2px 8px; cursor: pointer;">Create an account</a> <a href="/Products" style="margin: 0px; background: rgb(255, 255, 255); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border: 1px solid var(--border); text-decoration: none; color: rgb(0, 119, 221); transition: 0.15s; cursor: pointer;">
395Shop this week</a></div></div></div></div></div><!-- FARM TO COMMUNITY FOOD SHARE --><div id="lfp-foodshare" style="margin: 0px; box-sizing: border-box; padding: 40px 0px; background: var(--soft); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);"><div style="margin: 0px auto; box-sizing: border-box; max-width: var(--max); padding: 0px clamp(18px, 5vw, 24px);"><div style="margin: 0px; box-sizing: border-box; background: linear-gradient(rgb(240, 253, 244), rgb(255, 255, 255)); padding: 28px; border-radius: var(--r); border: 1px solid rgb(187, 247, 208);"><div style="margin: 0px 0px 10px; box-sizing: border-box; display: inline-block; font-size: 12px; font-weight: 800; color: rgb(15, 23, 42); background: rgb(241, 245, 249); border: 1px solid var(--border); padding: 6px 10px; border-radius: 999px;">Food access</div><h2 style='margin: 0px 0px 10px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 700; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 24px; letter-spacing: -0.2px; line-height: 30px;'>Farm to Community Food Share</h2><p style="max-width: 85ch; margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">Local Foods Plymouth is committed to bringing farm-fresh, locally grown, nutritious food to under-served community members experiencing food insecurity. Barriers like transportation, income, and digital access can make healthy food harder to reach.</p><p style="margin: 12px 0px 0px; max-width: 85ch; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">As part of our neighbor helping neighbor mission, we believe it's our responsibility to be the network that shares our community's harvest. All people have the right to eat healthy — that's why we created the Farm to Community Food Share Program.</p><div style="margin: 18px 0px 0px; box-sizing: border-box; display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px;"><div style="box-shadow: none; background: white; margin: 0px; box-sizing: border-box; border: 1px solid var(--border); border-radius: var(--r); padding: 20px;"><h3 style='margin: 0px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>How it works</h3><ul style="margin: 10px 0px 0px 20px; padding-left: 30px; box-sizing: border-box; color: var(--muted); line-height: 1.6;"><li style="margin: 7px 0px; box-sizing: border-box;">Donations are allocated on at least a monthly basis to the organizations below.</li><li style="margin: 7px 0px; box-sizing: border-box;">12% of your donation supports program operations.</li><li style="margin: 7px 0px; box-sizing: border-box;">The remainder goes directly to providing healthy food for our neighbors.</li></ul></div><div style="box-shadow: none; background: white; margin: 0px; box-sizing: border-box; border: 1px solid var(--border); border-radius: var(--r); padding: 20px;"><h3 style='margin: 0px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>Who we support</h3><ul style="margin: 10px 0px 0px 20px; padding-left: 30px; box-sizing: border-box; color: var(--muted); line-height: 1.6;"><li style="margin: 7px 0px; box-sizing: border-box;">The Bridge House Homeless Shelter</li><li style="margin: 7px 0px; box-sizing: border-box;">The Plymouth Area Senior Center</li><li style="margin: 7px 0px; box-sizing: border-box;">Boulder Point Veterans Housing</li><li style="margin: 7px 0px; box-sizing: border-box;">Plymouth Area Community Closet</li></ul></div></div><div style="margin: 16px 0px 0px; padding: 18px; background: white; border-radius: 14px; border: 1px solid rgb(226, 232, 240); box-sizing: border-box;"><h3 style='margin: 0px 0px 8px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 600; color: rgb(68, 68, 68); text-transform: none; box-sizing: border-box; font-size: 18px; line-height: 24px;'>How to donate</h3><p style="margin: 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">To make a donation at any time, choose <strong style="margin: 0px; font-weight: 700; box-sizing: border-box;">"Farm to Community Food Share"</strong> in the LFP store.</p><div style="margin: 16px 0px 0px; box-sizing: border-box; display: flex; gap: 10px; flex-wrap: wrap;"><a href="/Products" style="margin: 0px; background: var(--primary); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border-color: var(--primary); border-top-style: ; border-top-width: ; border-right-style: ; border-right-width: ; border-bottom-style: ; border-bottom-width: ; border-left-style: ; border-left-width: ; border-image-source: ; border-image-slice: ; border-image-width: ; border-image-outset: ; border-image-repeat: ; text-decoration: none; color: rgb(0, 119, 221); transition: 0.15s; box-shadow: rgba(22, 101, 52, 0.12) 0px 2px 8px; cursor: pointer;">Donate in the store</a></div><p style="margin: 16px 0px 0px; box-sizing: border-box; color: var(--muted); font-size: 15px; line-height: 1.6;">You can also make a secure online donation through our partner, Little Green Light:</p><div style="margin: 16px 0px 0px; box-sizing: border-box; display: flex; gap: 10px; flex-wrap: wrap;"><a href="https://secure.lglforms.com/form_engine/s/EjFI88dMNBYF73-WGX7bjg" target="_blank" rel="noopener noreferrer" style="margin: 0px; background: var(--primary); box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 11px 16px; border-radius: 12px; font-weight: 700; font-size: 14px; border-color: var(--primary); border-top-style: ; border-top-width: ; border-right-style: ; border-right-width: ; border-bottom-style: ; border-bottom-width: ; border-left-style: ; border-left-width: ; border-image-source: ; border-image-slice: ; border-image-width: ; border-image-outset: ; border-image-repeat: ; text-decoration: none; color: rgb(0, 119, 221); transition: 0.15s; box-shadow: rgba(22, 101, 52, 0.12) 0px 2px 8px; cursor: pointer;">Donate online</a></div></div></div></div></div></section> 396 397 </div> 398 399 <div class="uk-clearfix"></div><footer id="footer">
399<div class="nav-center footer-center-color uk-grid"><div class="uk-width-1-6@l uk-width-1-1@m uk-width-1-1@s"></div><div class="uk-width-2-3@l uk-width-1-1@m uk-width-1-1@s"><ul class="footer-list"><li><a class="" href="/Home/Page/privacy">Privacy Policy</a> </li><li><a class="" href="/Home/Page/terms_of_service">Terms of Service</a> </li><li><a class="" href="/Home/Page/refunds">Refund Policy</a> </li><li><a class="" target="_blank" href="https://lfp.lfmadmin.com/grow/Home/Index">Producer Login</a> </li><li><a class="" href="/Contact">Contact Us</a></li></ul><ul class="footer-list"><li>© Powered By -<a href="http://home.localfoodmarketplace.com">Local Food Marketplace Inc.</a></li></ul></div><div class="uk-width-1-6@l uk-width-1-1@m uk-width-1-1@s"></div></div></footer> 400 <!-- Any site specific scripts that need to be included in the footer should be placed here. --> 401 402
402<script type="text/x-jquery-tmpl" id="tmplOrderItem"> 403 <tr class="shopping-cart-row shopping-cart-text"> 404 <td> 405 <div class="shopping-cart-product-name">${itemName}</div> 406 <div class="shopping-cart-unit-name">${itemUnit} - ${itemUnitPrice}</div> 407 </td> 408 <td class="uk-flex uk-flex-center"> 409 {{if canDeleteItem}} 410 <button type="button" uk-icon="icon: minus; ratio: 1" class="uk-icon-link shopping-cart-adjustor" onclick="decreaseQty('${itemId}');" aria-label="Decrease quantity of ${itemName}"></button> 411 {{/if}} 412 <input type="text" class="uk-input uk-form-small uk-text-center" value="${itemQty}" readonly="readonly" id="cart-qty-${itemId}" style="width: 50px;" aria-label="Quantity of ${itemName}" /> 413 {{if canDeleteItem}} 414 <button type="button" uk-icon="icon: plus; ratio: 1" class="uk-icon-link shopping-cart-adjustor" onclick="increaseQty('${itemId}');" aria-label="Increase quantity of ${itemName}"></button> 415 {{/if}} 416 </td> 417 </tr> 418 </script>
418 419 420
420<script type="text/x-jquery-tmpl" id="tmplSubsItem"> 421 <div class="uk-margin-top"> 422 <div class="shopping-cart-text">{{html name}}</div> 423 424 {{each orders}} 425 <div class="uk-margin-small-top shopping-cart-text" style="border-bottom: thin solid #333; padding-bottom: 2px;"> 426 Order# ${orderId} 427 </div> 428 {{each items}} 429 <ul class=""> 430 <li class="shopping-cart-text">${name}</li> 431 </ul> 432 {{/each}} 433 <div class="uk-margin-small-top"> 434 <button class="uk-button uk-button-small uk-button-secondary" onclick="window.location='${orderLink}';">Subscription Checkout</button> 435 </div> 436 <hr /> 437 {{/each}} 438 439 </div> 440 </script>
440 441 442
442<script type="text/x-jquery-tmpl" id="tmplPreOrder"> 443 <div class="uk-margin-small-top"> 444 <div class="uk-text-bold">{{html distribDay}}</div> 445 <div class="shopping-cart-text">${pickupDay}</div> 446 <div class="shopping-cart-text">${locName}</div> 447 448 <div class="uk-margin-small-top shopping-cart-text" style="border-bottom: thin solid #333; padding-bottom: 2px;"> 449 Order# ${orderId} 450 </div> 451 <div class="shopping-cart-text uk-margin-small-top">${itemCount} item(s)</div> 452 <div class="shopping-cart-text">Total: ${orderTotal}</div> 453 454 <div class="uk-margin-small-top"> 455 <button class="uk-button uk-button-small uk-button-secondary" onclick="window.location='${orderLink}';">Review and Confirm Pre-Order</button> 456 </div> 457 <hr /> 458 459 </div> 460 </script>
460 461 462
462<script type="text/javascript"> 463 var baseUrl = "//shop.localfoodsplymouth.org/"; 464 465 // display the shopping cart 466 function displayCart(onReady) { 467 468 // clear cart message 469 $("#cart-message").html(""); 470 $("#cart-message").hide(); 471 472 $.ajax({ 473 type: "POST", 474 contentType: "application/json; charset=utf-8", 475 dataType: "json", 476 url: baseUrl + 'api/ProductApi/getOrderInfo', 477 success: function (data) { 478 479 $("#item-count").html(data.itemCount); 480 $("#order-total").html("Total: " + data.orderTotal); 481 482 // clear carts first 483 $("#order-items").empty(); 484 $("#cart-subs-items").empty(); 485 $("#cart-pre-orders").empty(); 486 487 //set for delete order item 488 orderId = data.orderId; 489 490 // hide/show stuff 491 if (data.orderItemCount > 0) { 492 // build items 493 $(data.orderItems).each(function (i, item) { 494 $("#order-items").append($("#tmplOrderItem").tmpl(item)); 495 }); 496 $("#order-icon-table").show(); 497 $("#edit-order-row").show(); 498 $("#order-list-body").show(); 499 $("#cart-items-empty").hide(); 500 $("#edit-order-button").attr("href", baseUrl + 'Order/Edit/' + data.orderId); 501 $("#edit-order-button").text(data.orderButtonText); 502 $("#cart-selected-sub-text").html(data.selectedSubText); 503 $("#cart-selected-sub-nameloc").html(data.selectedSubNameAndLoc); 504 $("#cart-ordernum-text").html(data.orderNumberText); 505 } 506 else { 507 $("#order-icon-table").hide(); 508 } 509 510 if (data.hasSubscriptions) { 511 // build subs list 512 $(data.subsDays).each(function (i, item) { 513 $("#cart-subs-items").append($("#tmplSubsItem").tmpl(item)); 514 }); 515 $("#order-icon-subs").show(); 516 } 517 else { 518 $("#order-icon-subs").hide(); 519 } 520 521 if (data.hasPreOrders) { 522 // build pre-order list 523 $(data.preOrders).each(function (i, item) { 524 $("#cart-pre-orders").append($("#tmplPreOrder").tmpl(item)); 525 }); 526 $("#order-icon-pre-orders").show(); 527 } 528 else { 529 $("#order-icon-pre-orders").hide(); 530 } 531 if (typeof onReady === 'function') { onReady(); } 532 }, 533 error: function (error) { 534 console.log(error.responseText); 535 } 536 }); 537 } 538 539 function openProducer(pGuid) { 540 url = baseUrl + "Producer/" + pGuid; 541 window.open(url, "+blank"); 542 } 543 544 function hideCartMessage() { 545 $("#cart-message").hide(); 546 } 547 548 function updateCartMessage(message) { 549 $("#cart-message").html(message); 550 $("#cart-message").show(); 551 } 552 553 function deleteOrderItem(itemId) { 554 var id = itemId; 555 $.ajax({
556 type: "GET", 557 contentType: "application/json; charset=utf-8", 558 dataType: "json", 559 url: baseUrl + 'api/ProductApi/deleteOrderItem/?id=' + id + "&orderId=" + orderId, 560 561 success: function (data) { 562 if (data.success) { 563 var href = window.location.href; 564 var contains = href.includes("Order"); 565 displayCart() 566 567 // handle analytics 568 if (data.gaItem != null) { 569 window.dataLayer = window.dataLayer || []; 570 function gtag() { dataLayer.push(arguments); } 571 gtag("event", "remove_from_cart", data.gaItem); 572 } 573 } 574 else { 575 displayCart() 576 hideLoading(); 577 $("#cart-message").html(data.message); 578 $("#cart-message").show(); 579 } 580 581 if (contains) { location.reload() } 582 }, 583 error: function (error) { 584 console.log(error.responseText); 585 } 586 }); 587 } 588 589 function increaseQty(itemId) { 590 hideCartMessage(); 591 592 var id = itemId; 593 594 var qty = $("#cart-qty-" + itemId).val(); 595 if (!qty || isNaN(qty)) { 596 updateCartMessage("The current quantity of the item is not a valid number"); 597 return; 598 } 599 600 // increase the qty 601 qty++; 602 603 $.ajax({
604 type: "GET", 605 contentType: "application/json; charset=utf-8", 606 dataType: "json", 607 url: baseUrl + 'api/ProductApi/changeOrderItem/?id=' + id + "&orderId=" + orderId + "&qty=1", 608 609 success: function (data) { 610 if (data.success) { 611 var href = window.location.href; 612 var contains = href.includes("Order"); 613 displayCart() 614 } 615 else { 616 displayCart() 617 updateCartMessage(data.message); 618 } 619 620 if (contains) { location.reload() } 621 }, 622 error: function (error) { 623 console.log(error.responseText); 624 } 625 }); 626 } 627 628 function decreaseQty(itemId) { 629 hideCartMessage(); 630 631 var id = itemId; 632 633 var qty = $("#cart-qty-" + itemId).val(); 634 if (!qty || isNaN(qty)) { 635 updateCartMessage("The current quantity of the item is not a valid number"); 636 return; 637 } 638 639 // decrease the qty 640 qty--; 641 642 if (qty <= 0) { 643 deleteOrderItem(itemId); 644 return; 645 } 646 647 $.ajax({
648 type: "GET", 649 contentType: "application/json; charset=utf-8", 650 dataType: "json", 651 url: baseUrl + 'api/ProductApi/changeOrderItem/?id=' + id + "&orderId=" + orderId + "&qty=-1", 652 653 success: function (data) { 654 if (data.success) { 655 var href = window.location.href; 656 var contains = href.includes("Order"); 657 displayCart() 658 } 659 else { 660 displayCart() 661 662 $("#cart-message").html(data.message); 663 $("#cart-message").show(); 664 } 665 666 if (contains) { location.reload() } 667 }, 668 error: function (error) { 669 console.log(error.responseText); 670 } 671 }); 672 } 673 674 // -- Scroll-lock helpers for native <dialog> elements (shared by all six site dialogs) -- 675 // Measures and compensates for scrollbar width to prevent layout shift on lock. 676 var _dialogOpenCount = 0; 677 678 // -- Focus-trap helpers (2.1.2) -- 679 // Attaches/detaches a keydown handler on the dialog that manually cycles 680 // Tab/Shift+Tab between the first and last focusable elements. 681 // This is a belt-and-suspenders fallback: showModal() should trap focus 682 // natively, but Chromium's built-in trap breaks when overflow is set on 683 // the <dialog> element itself (crbug.com/1450137). Even after fixing that 684 // CSS bug we keep this handler so the trap works in all supported browsers. 685 var FOCUSABLE_SELECTORS = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])'; 686 687 function _trapFocus(e) { 688 if (e.key !== 'Tab') return; 689 var dlg = e.currentTarget; 690 // Filter to elements that are actually reachable by the browser's tab order: 691 // hidden UIKit switcher panels (display:none) satisfy the selector but are 692 // skipped by the browser, making our computed "last" wrong and causing escape. 693 var focusable = Array.prototype.slice.call(dlg.querySelectorAll(FOCUSABLE_SELECTORS)).filter(function (el) { 694 return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length); 695 }); 696 if (!focusable.length) { e.preventDefault(); return; } 697 var first = focusable[0]; 698 var last = focusable[focusable.length - 1]; 699 // document.activeElement can equal dlg itself when Chromium places the 700 // <dialog> element at the end of its own tab cycle (after all children).
701 // Without this check the condition below would be false and focus would 702 // escape to the browser chrome on the very next Tab press. 703 if (e.shiftKey) { 704 if (document.activeElement === first || document.activeElement === dlg) { e.preventDefault(); last.focus(); } 705 } else { 706 if (document.activeElement === last || document.activeElement === dlg) { e.preventDefault(); first.focus(); } 707 } 708 } 709 710 function openDialog(dlg) { 711 if (dlg.open) return; 712 if (_dialogOpenCount === 0) { 713 var sw = window.innerWidth - document.documentElement.clientWidth; 714 document.body.style.paddingRight = sw > 0 ? sw + 'px' : ''; 715 document.body.style.overflow = 'hidden'; 716 } 717 _dialogOpenCount++; 718 dlg.showModal(); 719 dlg.addEventListener('keydown', _trapFocus); 720 } 721 function closeDialog(dlg) { 722 if (!dlg.open) return; 723 dlg.removeEventListener('keydown', _trapFocus); 724 dlg.close(); 725 _dialogOpenCount = Math.max(0, _dialogOpenCount - 1); 726 if (_dialogOpenCount === 0) { 727 document.body.style.overflow = ''; 728 document.body.style.paddingRight = ''; 729 } 730 } 731 // -- End scroll-lock / focus-trap helpers -- 732 733 function openCart() { 734 var dlg = document.getElementById('shopping-cart'); 735 if (!dlg.open) { openDialog(dlg); } 736 var trigger = document.getElementById('cart-trigger-btn'); 737 if (trigger) trigger.setAttribute('aria-expanded', 'true'); 738 // Focus the first static element immediately so Escape works from the start 739 var continueShopping = document.getElementById('cart-continue-shopping'); 740 if (continueShopping) continueShopping.focus(); 741 // Refresh cart data; re-focus the first interactive element once content is rendered 742 displayCart(function () { 743 var first = dlg.querySelector('button:not([disabled]), a[href], input:not([disabled])'); 744 if (first) first.focus(); 745 }); 746 } 747 748 function closeCart() { 749 var dlg = document.getElementById('shopping-cart'); 750 closeDialog(dlg); 751 } 752 753 // -- Cart focus management (ACC-001 / ACC-027b) -------------------------- 754 // This script runs at end of <body>, so DOM is already ready â no 755 // DOMContentLoaded wrapper needed (and it would never fire anyway). 756 (function () { 757 var cartDlg = document.getElementById('shopping-cart'); 758 if (!cartDlg) return; 759 760 // Return focus to the trigger and reset aria-expanded on any close 761 cartDlg.addEventListener('close', function () { 762 var trigger = document.getElementById('cart-trigger-btn'); 763 if (trigger) { 764 trigger.setAttribute('aria-expanded', 'false'); 765 trigger.focus(); 766 } 767 }); 768 769 // Backdrop click: click on the <dialog> element itself (not its children) 770 cartDlg.addEventListener('click', function (e) { 771 if (e.target === this) closeDialog(this); 772 }); 773 }()); 774 // -- End cart focus management ----------------------------------------- 775 776 function announceStatus(message) { 777 var el = document.getElementById("aria-status"); 778 if (el) { 779 el.textContent = ""; 780 setTimeout(function () { el.textContent = message; }, 50); 781 } 782 } 783 784 // -- Modal focus management utility (T2-011) -- 785 // lfmOpenModal(modalId, triggerEl) - opens a UIKit modal and records the 786 // trigger so focus is returned to it automatically when the modal closes. 787 // lfmCloseModal(modalId) - programmatically closes a UIKit modal. 788 (function () { 789 var _triggers = {}; 790 791 window.lfmOpenModal = function (modalId, triggerEl) { 792 _triggers[modalId] = triggerEl || document.activeElement; 793 UIkit.modal(modalId).show(); 794 }; 795 796 window.lfmCloseModal = function (modalId) { 797 UIkit.modal(modalId).hide(); 798 }; 799 800 // Return focus to the recorded trigger element when any modal closes, 801 // and detach the focus trap from the inner dialog div. 802 UIkit.util.on(document, 'hidden', '.uk-modal', function (e) { 803 var id = '#' + e.target.id; 804 var dialog = e.target.querySelector('[role="dialog"], .uk-modal-dialog'); 805 if (dialog) { dialog.removeEventListener('keydown', _trapFocus); } 806 var trigger = _triggers[id]; 807 if (trigger && typeof trigger.focus === 'function') { 808 trigger.focus(); 809 } 810 delete _triggers[id]; 811 }); 812
813 // On open: stamp ARIA roles/labels, attach focus trap, move focus to first element. 814 UIkit.util.on(document, 'shown', '.uk-modal', function (e) { 815 var FOCUSABLE = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])'; 816 var dialog = e.target.querySelector('[role="dialog"], .uk-modal-dialog'); 817 if (!dialog) return; 818 819 // -- 4.1.2 / 1.3.1: ensure role, aria-modal, aria-labelledby on every modal -- 820 if (!dialog.getAttribute('role')) { 821 dialog.setAttribute('role', 'dialog'); 822 } 823 if (!dialog.getAttribute('aria-modal')) { 824 dialog.setAttribute('aria-modal', 'true'); 825 } 826 if (!dialog.getAttribute('aria-labelledby')) { 827 // Look for a title element with an id inside .uk-modal-title 828 var titleEl = dialog.querySelector('.uk-modal-title [id], .uk-modal-title[id]'); 829 if (titleEl) { 830 var titleId = titleEl.id || titleEl.getAttribute('id'); 831 if (titleId) { 832 dialog.setAttribute('aria-labelledby', titleId); 833 } 834 } 835 } 836 // -- end ARIA stamp -- 837 838 dialog.addEventListener('keydown', _trapFocus); 839 var first = dialog.querySelector(FOCUSABLE); 840 if (first) { first.focus(); } 841 }); 842 }()); 843 // -- End modal focus management utility -- 844 </script>
844 845</body> 846</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.