1<!doctype html> 2<html 3 4 lang="en" 5> 6 <head>
6<script data-source-attribution="shopify.event_observer.bootstrap"> 7(function(){let e=navigator,t=`prototype`,n=`sendBeacon`,r=e[n],i=fetch,a=XMLHttpRequest[t],{open:o,send:s}=a,c=`EventListener`,l=`add${c}`,u=`remove${c}`,d=EventTarget[t],f=d[l],p=d[u],m=e=>Error((e=document.currentScript)&&[e?.src,e?.id||e?.dataset?.sourceAttribution]),h=(e=[],t=0)=>(e.p=n=>e[t++%1e3]=n,[e,t=>(e.forEach(e.p=t),e.length=0)]),[g,_]=h(),[v,y]=h(),b,x=new WeakMap,S=e=>e&&g.p([e,b||[m()]]);d[l]=function(e,t,n){let r=this,i=t?.handleEvent||t,a=x.get(t),o=m();i?.call&&!a&&x.set(t,a=function(e){b=[o,e.type];try{i.call(t==i?this:t,e)}finally{b=null}}),v.p([e,o,a,r?.tagName||r+``,r?.id]),f.call(r,e,a||t,n)},d[u]=function(e,t,n){p.call(this,e,x.get(t)||t,n)},a.open=function(e,t){x.set(this,[t+``,e]),o.apply(this,arguments)},a.send=function(e){S(x.get(this)),s.call(this,e)},fetch=(e,t)=>(S([(e?.url||e)+``,t?.method]),i(e,t)),e[n]=(t,n)=>(S([t+``,``]),r.call(e,t,n)),setTimeout(()=>import("//fresherdinners.com.sg/cdn/shopifycloud/storefront/assets/storefront/event_observer_reporter-ed358274.js").then(e=>e.$(_,y,f,i,`79351316693`)))})(); 8//# sourceURL=event-observer-collector.js 9</script>
9 10 11
11<script 12 src="https://code.jquery.com/jquery-4.0.0.min.js" 13 integrity="sha256-OaVG6prZf4v69dPg6PhVattBXkcOWQB62pdZ3ORyrao=" 14 crossorigin="anonymous" 15 ></script>
15 16 <link rel="preconnect" href="https://fonts.googleapis.com"> 17 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 18 <link 19 href="https://fonts.googleapis.com/css2?family=Bitter:ital,wght@0,100..900;1,100..900&display=swap" 20 rel="stylesheet" 21 > 22 <link rel="preconnect" href="https://fonts.googleapis.com"> 23 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 24 <link href="https://fonts.googleapis.com/css2?family=Candal&display=swap" rel="stylesheet"><link 25 rel="icon" 26 type="image/png" 27 href="//fresherdinners.com.sg/cdn/shop/files/image-1_cb25f2ee-7806-44b6-a804-2d0f13ad6a46.png?crop=center&height=32&v=1782209738&width=32" 28 > 29 30<meta charset="utf-8"> 31<meta 32 http-equiv="X-UA-Compatible" 33 content="IE=edge" 34> 35<meta 36 name="viewport" 37 content="width=device-width,initial-scale=1" 38> 39<meta 40 name="view-transition" 41 content="same-origin" 42> 43<meta 44 name="theme-color" 45 content="" 46> 47 48<meta 49 property="og:site_name" 50 content="Fresher Dinners" 51> 52<meta 53 property="og:url" 54 content="https://fresherdinners.com.sg/" 55> 56<meta 57 property="og:title" 58 content="Fresher Dinners" 59> 60<meta 61 property="og:type" 62 content="website" 63> 64<meta 65 property="og:description" 66 content="Fresher Dinners offers delicious dinner delivery across Singapore. Discover a modern tingkat with freshly prepared meals and flexible meal subscriptions, delivered warm daily." 67><meta 68 property="og:image" 69 content="http://fresherdinners.com.sg/cdn/shop/files/fresher_dinners_angled_v3_1_1.png?v=1783472802" 70 > 71 <meta 72 property="og:image:secure_url" 73 content="https://fresherdinners.com.sg/cdn/shop/files/fresher_dinners_angled_v3_1_1.png?v=1783472802" 74 > 75 <meta 76 property="og:image:width" 77 content="1856" 78 > 79 <meta 80 property="og:image:height" 81 content="2304" 82 ><meta 83 name="twitter:card" 84 content="summary_large_image" 85> 86<meta 87 name="twitter:title" 88 content="Fresher Dinners" 89> 90<meta 91 name="twitter:description" 92 content="Fresher Dinners offers delicious dinner delivery across Singapore. Discover a modern tingkat with freshly prepared meals and flexible meal subscriptions, delivered warm daily." 93> 94 95<title> 96 Fresher Dinners 97</title> 98 99<link 100 rel="canonical" 101 href="https://fresherdinners.com.sg/" 102> 103 104 105 <meta 106 name="description" 107 content="Fresher Dinners offers delicious dinner delivery across Singapore. Discover a modern tingkat with freshly prepared meals and flexible meal subscriptions, delivered warm daily." 108 > 109 110<link href="//fresherdinners.com.sg/cdn/shop/t/2/assets/overflow-list.css?v=78235234226353326431775201778" as="style" rel="preload"> 111<link href="//fresherdinners.com.sg/cdn/shop/t/2/assets/base.css?v=143910886164487506111787316882" rel="stylesheet" type="text/css" media="all" /> 112<link href="//fresherdinners.com.sg/cdn/shop/t/2/assets/custom.css?v=147914268826806071381787315194" rel="stylesheet" type="text/css" media="all" /> 113 114<link 115 rel="preload" 116 as="font" 117 href="//fresherdinners.com.sg/cdn/fonts/bitter/bitter_n4.0eb1d888c7dcf4b324dcc95156ce047a083f85f9.woff2" 118 type="font/woff2" 119 crossorigin 120 fetchpriority="low" 121 ><link 122 rel="preload" 123 as="font" 124 href="//fresherdinners.com.sg/cdn/fonts/bitter/bitter_n4.0eb1d888c7dcf4b324dcc95156ce047a083f85f9.woff2" 125 type="font/woff2" 126 crossorigin 127 fetchpriority="low" 128 ><link 129 rel="preload" 130 as="font" 131 href="//fresherdinners.com.sg/cdn/fonts/inter/inter_n9.5eeac4b640934cb12c98bb58e5b212c8a842a731.woff2" 132 type="font/woff2" 133 crossorigin 134 fetchpriority="low" 135 ><link 136 rel="preload" 137 as="font" 138 href="//fresherdinners.com.sg/cdn/fonts/inter/inter_n7.02711e6b374660cfc7915d1afc1c204e633421e4.woff2" 139 type="font/woff2" 140 crossorigin 141 fetchpriority="low" 142 >
143<script async crossorigin fetchpriority="high" src="/cdn/shopifycloud/importmap-polyfill/es-modules-shim.2.4.0.js"></script>
vendor: 1 bytes, line 143
143
144<script type="importmap"> 145 { 146 "imports": { 147 "@theme/overflow-list": "//fresherdinners.com.sg/cdn/shop/t/2/assets/overflow-list.js?v=46858356770684902511775201778", 148 "@theme/product-title": "//fresherdinners.com.sg/cdn/shop/t/2/assets/product-title-truncation.js?v=81744426891537421781775201778", 149 "@theme/component": "//fresherdinners.com.sg/cdn/shop/t/2/assets/component.js?v=184240237101443119871775201778", 150 "@theme/dialog": "//fresherdinners.com.sg/cdn/shop/t/2/assets/dialog.js?v=150888536568694194021775201778", 151 "@theme/events": "//fresherdinners.com.sg/cdn/shop/t/2/assets/events.js?v=147926035229139604561775201778", 152 "@theme/focus": "//fresherdinners.com.sg/cdn/shop/t/2/assets/focus.js?v=60436577539430446401775201778", 153 "@theme/morph": "//fresherdinners.com.sg/cdn/shop/t/2/assets/morph.js?v=102085577784545683451775201778", 154 "@theme/paginated-list": "//fresherdinners.com.sg/cdn/shop/t/2/assets/paginated-list.js?v=95298315036233333871775201778", 155 "@theme/performance": "//fresherdinners.com.sg/cdn/shop/t/2/assets/performance.js?v=171015751390534793081775201778", 156 "@theme/product-form": "//fresherdinners.com.sg/cdn/shop/t/2/assets/product-form.js?v=37993400097492174081775201778", 157 "@theme/recently-viewed-products": "//fresherdinners.com.sg/cdn/shop/t/2/assets/recently-viewed-products.js?v=94729125001750262651775201778", 158 "@theme/scrolling": "//fresherdinners.com.sg/cdn/shop/t/2/assets/scrolling.js?v=162288454571026455011775201778", 159 "@theme/section-renderer": "//fresherdinners.com.sg/cdn/shop/t/2/assets/section-renderer.js?v=152586934315572818121775201778", 160 "@theme/section-hydration": "//fresherdinners.com.sg/cdn/shop/t/2/assets/section-hydration.js?v=108434990705342316311775201778", 161 "@theme/money-formatting": "//fresherdinners.com.sg/cdn/shop/t/2/assets/money-formatting.js?v=182191346160333327151775201778", 162 "@theme/utilities": "//fresherdinners.com.sg/cdn/shop/t/2/assets/utilities.js?v=137979405375850297411775201778", 163 "@theme/variant-picker": "//fresherdinners.com.sg/cdn/shop/t/2/assets/variant-picker.js?v=124079696159966615681775201778", 164 "@theme/media-gallery": "//fresherdinners.com.sg/cdn/shop/t/2/assets/media-gallery.js?v=14624021005636302161775201778", 165 "@theme/quick-add": "//fresherdinners.com.sg/cdn/shop/t/2/assets/quick-add.js?v=8173316780029216301775201778", 166 "@theme/paginated-list-aspect-ratio": "//fresherdinners.com.sg/cdn/shop/t/2/assets/paginated-list-aspect-ratio.js?v=25254270272143792451775201778", 167 "@theme/popover-polyfill": "//fresherdinners.com.sg/cdn/shop/t/2/assets/popover-polyfill.js?v=119029313658895111201775201778", 168 "@theme/component-quantity-selector": "//fresherdinners.com.sg/cdn/shop/t/2/assets/component-quantity-selector.js?v=67906657287482036641775201778", 169 "@theme/comparison-slider": "//fresherdinners.com.sg/cdn/shop/t/2/assets/comparison-slider.js?v=106705562947035711941775201778", 170 "@theme/sticky-add-to-cart": "//fresherdinners.com.sg/cdn/shop/t/2/assets/sticky-add-to-cart.js?v=48956925339276737091775201778", 171 "@theme/fly-to-cart": "//fresherdinners.com.sg/cdn/shop/t/2/assets/fly-to-cart.js?v=48483246440248933081775201778" 172 } 173 } 174</script>
174 175
176<script 177 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/view-transitions.js?v=7106414069516106341775201778" 178 async 179 180></script>
180 181 182<link 183 rel="modulepreload" 184 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/utilities.js?v=137979405375850297411775201778" 185 fetchpriority="low" 186> 187<link 188 rel="modulepreload" 189 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/component.js?v=184240237101443119871775201778" 190 fetchpriority="low" 191> 192<link 193 rel="modulepreload" 194 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/section-renderer.js?v=152586934315572818121775201778" 195 fetchpriority="low" 196> 197<link 198 rel="modulepreload" 199 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/section-hydration.js?v=108434990705342316311775201778" 200 fetchpriority="low" 201> 202<link 203 rel="modulepreload" 204 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/morph.js?v=102085577784545683451775201778" 205 fetchpriority="low" 206> 207 208 209 210<link 211 rel="modulepreload" 212 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/focus.js?v=60436577539430446401775201778" 213 fetchpriority="low" 214> 215<link 216 rel="modulepreload" 217 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/recently-viewed-products.js?v=94729125001750262651775201778" 218 fetchpriority="low" 219> 220<link 221 rel="modulepreload" 222 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/scrolling.js?v=162288454571026455011775201778" 223 fetchpriority="low" 224> 225<link 226 rel="modulepreload" 227 href="//fresherdinners.com.sg/cdn/shop/t/2/assets/events.js?v=147926035229139604561775201778" 228 fetchpriority="low" 229>
230<script 231 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/popover-polyfill.js?v=119029313658895111201775201778" 232 type="module" 233 fetchpriority="low" 234></script>
vendor: 1 bytes, line 234
234
235<script 236 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/overflow-list.js?v=46858356770684902511775201778" 237 type="module" 238 fetchpriority="low" 239></script>
vendor: 1 bytes, line 239
239
240<script 241 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/quick-add.js?v=8173316780029216301775201778" 242 type="module" 243 fetchpriority="low" 244></script>
244 245 246
246<script 247 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/cart-discount.js?v=107077853990124422021775201778" 248 type="module" 249 fetchpriority="low" 250 ></script>
250 251 252
253<script 254 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/dialog.js?v=150888536568694194021775201778" 255 type="module" 256 fetchpriority="low" 257></script>
vendor: 1 bytes, line 257
257
258<script 259 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/variant-picker.js?v=124079696159966615681775201778" 260 type="module" 261 fetchpriority="low" 262></script>
vendor: 1 bytes, line 262
262
263<script 264 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/product-card.js?v=124402285637860180781775201778" 265 type="module" 266 fetchpriority="low" 267></script>
vendor: 1 bytes, line 267
267
268<script 269 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/product-form.js?v=37993400097492174081775201778" 270 type="module" 271 fetchpriority="low" 272></script>
vendor: 1 bytes, line 272
272
273<script 274 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/fly-to-cart.js?v=48483246440248933081775201778" 275 type="module" 276 fetchpriority="low" 277></script>
vendor: 1 bytes, line 277
277
278<script 279 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/accordion-custom.js?v=97588419883090888471775201778" 280 type="module" 281 fetchpriority="low" 282></script>
vendor: 1 bytes, line 282
282
283<script 284 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/media.js?v=37825095869491791421775201778" 285 type="module" 286 fetchpriority="low" 287></script>
vendor: 1 bytes, line 287
287
288<script 289 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/product-price.js?v=164492227269745550161775201778" 290 type="module" 291 fetchpriority="low" 292></script>
vendor: 1 bytes, line 292
292
293<script 294 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/product-sku.js?v=121804655373531320511775201778" 295 type="module" 296 fetchpriority="low" 297></script>
vendor: 1 bytes, line 297
297
298<script 299 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/product-title-truncation.js?v=81744426891537421781775201778" 300 type="module" 301 fetchpriority="low" 302></script>
vendor: 1 bytes, line 302
302
303<script 304 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/product-inventory.js?v=81520546963552472391775201778" 305 type="module" 306 fetchpriority="low" 307></script>
vendor: 1 bytes, line 307
307
308<script 309 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/show-more.js?v=94563802205717136101775201778" 310 type="module" 311 fetchpriority="low" 312></script>
vendor: 1 bytes, line 312
312
313<script 314 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/slideshow.js?v=17868446697736367161775201778" 315 type="module" 316 fetchpriority="low" 317></script>
vendor: 1 bytes, line 317
317
318<script 319 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/layered-slideshow.js?v=30135417790894624731775201778" 320 type="module" 321 fetchpriority="low" 322></script>
vendor: 1 bytes, line 322
322
323<script 324 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/anchored-popover.js?v=95953304814728754461775201778" 325 type="module" 326 fetchpriority="low" 327></script>
vendor: 1 bytes, line 327
327
328<script 329 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/floating-panel.js?v=151277338116891310371775201778" 330 type="module" 331 fetchpriority="low" 332></script>
vendor: 1 bytes, line 332
332
333<script 334 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/video-background.js?v=25237992823806706551775201778" 335 type="module" 336 fetchpriority="low" 337></script>
vendor: 1 bytes, line 337
337
338<script 339 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/component-quantity-selector.js?v=67906657287482036641775201778" 340 type="module" 341 fetchpriority="low" 342></script>
vendor: 1 bytes, line 342
342
343<script 344 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/media-gallery.js?v=14624021005636302161775201778" 345 type="module" 346 fetchpriority="low" 347></script>
vendor: 1 bytes, line 347
347
348<script 349 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/rte-formatter.js?v=40306132146590816021775201778" 350 type="module" 351 fetchpriority="low" 352></script>
vendor: 1 bytes, line 352
352
353<script 354 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/volume-pricing.js?v=15442793518842484731775201778" 355 type="module" 356 fetchpriority="low" 357></script>
vendor: 1 bytes, line 357
357
358<script 359 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/price-per-item.js?v=144512917617120124431775201778" 360 type="module" 361 fetchpriority="low" 362></script>
vendor: 1 bytes, line 362
362
363<script 364 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/volume-pricing-info.js?v=94479640769665442661775201778" 365 type="module" 366 fetchpriority="low" 367></script>
367 368 369 370 371 372 373 374
375<script 376 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/auto-close-details.js?v=58350291535404441581775201778" 377 defer="defer" 378></script>
378 379
380<script> 381 const Theme = { 382 translations: { 383 placeholder_image: `Placeholder image`, 384 added: `Added`, 385 recipient_form_fields_visible: `Recipient form fields are now visible`, 386 recipient_form_fields_hidden: `Recipient form fields are now hidden`, 387 recipient_form_error: `There was an error with the form submission`, 388 items_added_to_cart_one: `1 item added to cart`, 389 items_added_to_cart_other: `{{ count }} items added to cart`, 390 }, 391 routes: { 392 cart_add_url: '/cart/add.js', 393 cart_change_url: '/cart/change', 394 cart_update_url: '/cart/update', 395 cart_url: '/cart', 396 predictive_search_url: '/search/suggest', 397 search_url: '/search', 398 }, 399 template: { 400 name: 'index', 401 }, 402 }; 403</script>
403 404<style data-shopify> 405@font-face { 406 font-family: Bitter; 407 font-weight: 400; 408 font-style: normal; 409 font-display: swap; 410 src: url("//fresherdinners.com.sg/cdn/fonts/bitter/bitter_n4.0eb1d888c7dcf4b324dcc95156ce047a083f85f9.woff2") format("woff2"), 411 url("//fresherdinners.com.sg/cdn/fonts/bitter/bitter_n4.c816fa70d91ea90e3facdf24d42f14fc862a7052.woff") format("woff"); 412} 413@font-face { 414 font-family: Bitter; 415 font-weight: 700; 416 font-style: normal; 417 font-display: swap; 418 src: url("//fresherdinners.com.sg/cdn/fonts/bitter/bitter_n7.6f54d15cb20937e632243f04624136dd03296182.woff2") format("woff2"), 419 url("//fresherdinners.com.sg/cdn/fonts/bitter/bitter_n7.a83f6c3c62c7eb472ab1c4f0356455e4be4dfdc5.woff") format("woff"); 420} 421@font-face { 422 font-family: Bitter; 423 font-weight: 400; 424 font-style: italic; 425 font-display: swap; 426 src: url("//fresherdinners.com.sg/cdn/fonts/bitter/bitter_i4.67df40d17d77ae12f13ff551bfa685c46846abc0.woff2") format("woff2"), 427 url("//fresherdinners.com.sg/cdn/fonts/bitter/bitter_i4.b634e2f1232e0bcbc4eca7a49cd637dc6763bba9.woff") format("woff"); 428} 429@font-face { 430 font-family: Bitter; 431 font-weight: 700; 432 font-style: italic; 433 font-display: swap; 434 src: url("//fresherdinners.com.sg/cdn/fonts/bitter/bitter_i7.485957fb58715eb0a05a877c35d35fd280cb7e07.woff2") format("woff2"), 435 url("//fresherdinners.com.sg/cdn/fonts/bitter/bitter_i7.3f7595391ddb853e63ac4226f896c9702ca9b5b0.woff") format("woff"); 436} 437@font-face { 438 font-family: Inter; 439 font-weight: 900; 440 font-style: normal; 441 font-display: swap; 442 src: url("//fresherdinners.com.sg/cdn/fonts/inter/inter_n9.5eeac4b640934cb12c98bb58e5b212c8a842a731.woff2") format("woff2"), 443 url("//fresherdinners.com.sg/cdn/fonts/inter/inter_n9.a68b28f7e46ea1faab81e409809ee4919dd6e3f0.woff") format("woff"); 444} 445@font-face { 446 font-family: Inter; 447 font-weight: 700; 448 font-style: normal; 449 font-display: swap; 450 src: url("//fresherdinners.com.sg/cdn/fonts/inter/inter_n7.02711e6b374660cfc7915d1afc1c204e633421e4.woff2") format("woff2"), 451 url("//fresherdinners.com.sg/cdn/fonts/inter/inter_n7.6dab87426f6b8813070abd79972ceaf2f8d3b012.woff") format("woff"); 452} 453@font-face { 454 font-family: Inter; 455 font-weight: 900; 456 font-style: italic; 457 font-display: swap; 458 src: url("//fresherdinners.com.sg/cdn/fonts/inter/inter_i9.d229976d7ffd40dcab77d1b5d677b06fa3f92945.woff2") format("woff2"), 459 url("//fresherdinners.com.sg/cdn/fonts/inter/inter_i9.ed2ed118dc454c50160c647d59717916128bea79.woff") format("woff"); 460} 461@font-face { 462 font-family: Inter; 463 font-weight: 700; 464 font-style: italic; 465 font-display: swap; 466 src: url("//fresherdinners.com.sg/cdn/fonts/inter/inter_i7.b377bcd4cc0f160622a22d638ae7e2cd9b86ea4c.woff2") format("woff2"), 467 url("//fresherdinners.com.sg/cdn/fonts/inter/inter_i7.7c69a6a34e3bb44fcf6f975857e13b9a9b25beb4.woff") format("woff"); 468} 469 470 471 :root { 472 /* Page Layout */ 473 --sidebar-width: 25rem; 474 --narrow-content-width: 36rem; 475 --normal-content-width: 42rem; 476 --wide-content-width: 46rem; 477 --narrow-page-width: 90rem; 478 --normal-page-width: 120rem; 479 --wide-page-width: 150rem; 480 481 /* Section Heights */ 482 --section-height-small: 15rem; 483 --section-height-medium: 25rem; 484 --section-height-large: 35rem; 485 486 @media screen and (min-width: 40em) { 487 --section-height-small: 40svh; 488 --section-height-medium: 55svh; 489 --section-height-large: 70svh; 490 } 491 492 @media screen and (min-width: 60em) { 493 --section-height-small: 50svh; 494 --section-height-medium: 65svh; 495 --section-height-large: 80svh; 496 } 497 498 /* Letter spacing */ 499 --letter-spacing-sm: 0.06em; 500 --letter-spacing-md: 0.13em; 501 502 /* Font families */ 503 --font-body--family: Bitter, serif; 504 --font-body--style: normal; 505 --font-body--weight: 400; 506 --font-subheading--family: Bitter, serif; 507 --font-subheading--style: normal; 508 --font-subheading--weight: 400; 509 --font-heading--family: Inter, sans-serif; 510 --font-heading--style: normal; 511 --font-heading--weight: 900; 512 --font-accent--family: Inter, sans-serif; 513 --font-accent--style: normal; 514 --font-accent--weight: 700; 515 516 /* Margin sizes */ 517 --font-h1--spacing: 0.25em; 518 --font-h2--spacing: 0.25em; 519 --font-h3--spacing: 0.25em; 520 --font-h4--spacing: 0.25em; 521 --font-h5--spacing: 0.25em; 522 --font-h6--spacing: 0.25em; 523 --font-paragraph--spacing: 0.5em; 524 525 /* Heading colors */ 526 --font-h1--color: var(--color-foreground-heading); 527 --font-h2--color: var(--color-foreground-heading); 528 --font-h3--color: var(--color-foreground-heading); 529 --font-h4--color: var(--color-foreground-heading); 530 --font-h5--color: var(--color-foreground-heading); 531 --font-h6--color: var(--color-foreground-heading); 532 533 /** Z-Index / Layering */ 534 --layer-section-background: -2; 535 --layer-lowest: -1; 536 --layer-base: 0; 537 --layer-flat: 1; 538 --layer-raised: 2; 539 --layer-heightened: 4; 540 --layer-sticky: 8; 541 --layer-window-overlay: 10; 542 --layer-header-menu: 12; 543 --layer-overlay: 16; 544 --layer-menu-drawer: 18; 545 --layer-temporary: 20; 546 547 /* Max-width / Measure */ 548 --max-width--body-normal: 32.5em; 549 --max-width--body-narrow: 22.75em; 550 551 --max-width--heading-normal: 32.5em; 552 --max-width--heading-narrow: 19.5em; 553 554 --max-width--display-normal: 13em; 555 --max-width--display-narrow: 9.75em; 556 --max-width--display-tight: 3.25em; 557 558 /* Letter-spacing / Tracking */ 559 --letter-spacing--display-tight: -0.03em; 560 --letter-spacing--display-normal: 0em; 561 --letter-spacing--display-loose: 0.03em; 562 563 --letter-spacing--heading-tight: -0.03em; 564 --letter-spacing--heading-normal: 0em; 565 --letter-spacing--heading-loose: 0.03em; 566 567 --letter-spacing--body-tight: -0.03em; 568 --letter-spacing--body-normal: 0em; 569 --letter-spacing--body-loose: 0.03em; 570 571 /* Line height / Leading */ 572 --line-height: 1; 573 574 --line-height--display-tight: 1; 575 --line-height--display-normal: 1.1; 576 --line-height--display-loose: 1.2; 577 578 --line-height--heading-tight: 1.15; 579 --line-height--heading-normal: 1.25; 580 --line-height--heading-loose: 1.35; 581 582 --line-height--body-tight: 1.2; 583 --line-height--body-normal: 1.4; 584 --line-height--body-loose: 1.6; 585 586 /* Typography presets */ 587 --font-size--paragraph: 0.875rem;--font-size--h1: clamp(3.0rem, 5.6vw, 3.5rem);--font-size--h2: clamp(2.25rem, 4.8vw, 3.0rem);--font-size--h3: 2.0rem;--font-size--h4: 1.5rem;--font-size--h5: 1.0rem;--font-size--h6: 0.875rem;--font-paragraph--weight: 400;--font-paragraph--letter-spacing: var(--letter-spacing--body-normal);--font-paragraph--size: var(--font-size--paragraph);--font-paragraph--family: var(--font-body--family);--font-paragraph--style: var(--font-body--style);--font-paragraph--case: ;--font-paragraph--line-height: var(--line-height--body-loose);--font-h1--weight: var(--font-heading--weight);--font-h1--letter-spacing: var(--letter-spacing--heading-normal);--font-h1--size: var(--font-size--h1);--font-h1--family: var(--font-heading--family);--font-h1--style: var(--font-heading--style);--font-h1--case: none;--font-h1--line-height: var(--line-height--display-tight);--font-h2--weight: var(--font-heading--weight);--font-h2--letter-spacing: var(--letter-spacing--heading-normal);--font-h2--size: var(--font-size--h2);--font-h2--family: var(--font-heading--family);--font-h2--style: var(--font-heading--style);--font-h2--case: none;--font-h2--line-height: var(--line-height--display-tight);--font-h3--weight: var(--font-heading--weight);--font-h3--letter-spacing: var(--letter-spacing--heading-normal);--font-h3--size: var(--font-size--h3);--font-h3--family: var(--font-heading--family);--font-h3--style: var(--font-heading--style);--font-h3--case: none;--font-h3--line-height: var(--line-height--display-normal);--font-h4--weight: var(--font-heading--weight);--font-h4--letter-spacing: var(--letter-spacing--heading-normal);--font-h4--size: var(--font-size--h4);--font-h4--family: var(--font-heading--family);--font-h4--style: var(--font-heading--style);--font-h4--case: none;--font-h4--line-height: var(--line-height--display-tight);--font-h5--weight: var(--font-subheading--weight);--font-h5--letter-spacing: var(--letter-spacing--heading-normal);--font-h5--size: var(--font-size--h5);--font-h5--family: var(--font-subheading--family);--font-h5--style: var(--font-subheading--style);--font-h5--case: none;--font-h5--line-height: var(--line-height--display-loose);--font-h6--weight: var(--font-subheading--weight);--font-h6--letter-spacing: var(--letter-spacing--heading-normal);--font-h6--size: var(--font-size--h6);--font-h6--family: var(--font-subheading--family);--font-h6--style: var(--font-subheading--style);--font-h6--case: none;--font-h6--line-height: var(--line-height--display-loose); 588 589 /* Hardcoded font sizes */ 590 --font-size--3xs: 0.625rem; 591 --font-size--2xs: 0.75rem; 592 --font-size--xs: 0.8125rem; 593 --font-size--sm: 0.875rem; 594 --font-size--md: 1rem; 595 --font-size--lg: 1.125rem; 596 --font-size--xl: 1.25rem; 597 --font-size--2xl: 1.5rem; 598 --font-size--3xl: 2rem; 599 --font-size--4xl: 2.5rem; 600 --font-size--5xl: 3rem; 601 --font-size--6xl: 3.5rem; 602 603 /* Menu font sizes */ 604 --menu-font-sm--size: 0.875rem; 605 --menu-font-sm--line-height: calc(1.1 + 0.5 * min(16 / 14)); 606 --menu-font-md--size: 1rem; 607 --menu-font-md--line-height: calc(1.1 + 0.5 * min(16 / 16)); 608 --menu-font-lg--size: 1.125rem; 609 --menu-font-lg--line-height: calc(1.1 + 0.5 * min(16 / 18)); 610 --menu-font-xl--size: 1.25rem; 611 --menu-font-xl--line-height: calc(1.1 + 0.5 * min(16 / 20)); 612 --menu-font-2xl--size: 1.75rem; 613 --menu-font-2xl--line-height: calc(1.1 + 0.5 * min(16 / 28)); 614 615 /* Colors */ 616 --color-error: #8B0000; 617 --color-success: #006400; 618 --color-white: #FFFFFF; 619 --color-white-rgb: 255 255 255; 620 --color-black: #000000; 621 --color-instock: #3ED660; 622 --color-lowstock: #EE9441; 623 --color-outofstock: #C8C8C8; 624 625 /* Opacity */ 626 --opacity-5: 0.05; 627 --opacity-8: 0.08; 628 --opacity-10: 0.1; 629 --opacity-15: 0.15; 630 --opacity-20: 0.2;
631 --opacity-25: 0.25; 632 --opacity-30: 0.3; 633 --opacity-40: 0.4; 634 --opacity-50: 0.5; 635 --opacity-60: 0.6; 636 --opacity-70: 0.7; 637 --opacity-80: 0.8; 638 --opacity-85: 0.85; 639 --opacity-90: 0.9; 640 --opacity-subdued-text: var(--opacity-70); 641 642 --shadow-button: 0 2px 3px rgb(0 0 0 / 20%); 643 --gradient-image-overlay: linear-gradient(to top, rgb(0 0 0 / 0.5), transparent); 644 645 /* Spacing */ 646 --margin-3xs: 0.125rem; 647 --margin-2xs: 0.3rem; 648 --margin-xs: 0.5rem; 649 --margin-sm: 0.7rem; 650 --margin-md: 0.8rem; 651 --margin-lg: 1rem; 652 --margin-xl: 1.25rem; 653 --margin-2xl: 1.5rem; 654 --margin-3xl: 1.75rem; 655 --margin-4xl: 2rem; 656 --margin-5xl: 3rem; 657 --margin-6xl: 5rem; 658 659 --scroll-margin: 50px; 660 661 --padding-3xs: 0.125rem; 662 --padding-2xs: 0.25rem; 663 --padding-xs: 0.5rem; 664 --padding-sm: 0.7rem; 665 --padding-md: 0.8rem; 666 --padding-lg: 1rem; 667 --padding-xl: 1.25rem; 668 --padding-2xl: 1.5rem; 669 --padding-3xl: 1.75rem; 670 --padding-4xl: 2rem; 671 --padding-5xl: 3rem; 672 --padding-6xl: 4rem; 673 674 --gap-3xs: 0.125rem; 675 --gap-2xs: 0.3rem; 676 --gap-xs: 0.5rem; 677 --gap-sm: 0.7rem; 678 --gap-md: 0.9rem; 679 --gap-lg: 1rem; 680 --gap-xl: 1.25rem; 681 --gap-2xl: 2rem; 682 --gap-3xl: 3rem; 683 684 --spacing-scale-sm: 0.6; 685 --spacing-scale-md: 0.7; 686 --spacing-scale-default: 1.0; 687 688 /* Checkout buttons gap */ 689 --checkout-button-gap: 10px; 690 691 /* Borders */ 692 --style-border-width: 1px; 693 --style-border-radius-xs: 0.2rem; 694 --style-border-radius-sm: 0.6rem; 695 --style-border-radius-md: 0.8rem; 696 --style-border-radius-50: 50%; 697 --style-border-radius-lg: 1rem; 698 --style-border-radius-pills: 40px; 699 --style-border-radius-inputs: 4px; 700 --style-border-radius-buttons-primary: 0px; 701 --style-border-radius-buttons-secondary: 0px; 702 --style-border-width-primary: 0px; 703 --style-border-width-secondary: 1px; 704 --style-border-width-inputs: 1px; 705 --style-border-radius-popover: 14px; 706 --style-border-popover: 1px none rgb(var(--color-border-rgb) / 50%); 707 --style-border-drawer: 1px none rgb(var(--color-border-rgb) / 50%); 708 --style-border-swatch-opacity: 10%; 709 --style-border-swatch-width: 1px; 710 --style-border-swatch-style: solid; 711 712 /* Animation */ 713 --ease-out-cubic: cubic-bezier(0.33, 1, 0.68, 1); 714 --ease-out-quad: cubic-bezier(0.32, 0.72, 0, 1); 715 --ease-in-out-quad: cubic-bezier(0.455, 0.03, 0.515, 0.955); 716 --animation-speed-fast: 0.0625s; 717 --animation-speed: 0.125s; 718 --animation-speed-slow: 0.2s; 719 --animation-speed-medium: 0.15s; 720 --animation-easing: ease-in-out; 721 --animation-slideshow-easing: cubic-bezier(0.4, 0, 0.2, 1); 722 --drawer-animation-speed: 0.2s; 723 --animation-values-slow: var(--animation-speed-slow) var(--animation-easing); 724 --animation-values: var(--animation-speed) var(--animation-easing); 725 --animation-values-fast: var(--animation-speed-fast) var(--animation-easing); 726 --animation-values-allow-discrete: var(--animation-speed) var(--animation-easing) allow-discrete; 727 --animation-timing-hover: cubic-bezier(0.25, 0.46, 0.45, 0.94); 728 --animation-timing-active: cubic-bezier(0.5, 0, 0.75, 0); 729 --animation-timing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); 730 --animation-timing-default: cubic-bezier(0, 0, 0.2, 1); 731 --animation-timing-fade-in: cubic-bezier(0.16, 1, 0.3, 1); 732 --animation-timing-fade-out: cubic-bezier(0.4, 0, 0.2, 1); 733 /* Spring definitions suffixed with perceptual duration (d<ms>) and bounce (b<%>)*/ 734 --spring-d300-b0-easing: linear(0, 0.0033 0.81%, 0.027 2.42%, 0.0916 4.84%, 0.4745 15.32%, 0.6422 20.97%, 0.7175, 0.7789, 0.8283 30.64%, 0.876, 0.9111 38.71%, 0.941, 0.9611 48.39%, 0.9707, 0.978 54.84%, 0.9885 62.1%, 0.9949 70.97%, 0.9982 82.26%, 0.9997 100%); 735 --spring-d300-b0-duration: 0.4980s; 736 --spring-d280-b0-easing: linear(0, 0.0044, 0.0164 1.85%, 0.085 4.63%, 0.4571 14.81%, 0.575 18.52%, 0.6505, 0.7148 24.07%, 0.7849, 0.8393, 0.8809 35.18%, 0.9189, 0.9453 44.44%, 0.9662, 0.9793 55.55%, 0.9894 62.95%, 0.995 71.28%, 0.9982 82.39%, 0.9997 99.98%); 737 --spring-d280-b0-duration: 0.4648s; 738 --spring-d260-b0-easing: linear(0, 0.0058, 0.0216 2.15%, 0.0748 4.29%, 0.4646 15.03%, 0.5673, 0.655, 0.7279, 0.7872, 0.8349, 0.8727 34.36%, 0.9107, 0.9379 42.95%, 0.9609 48.31%, 0.9778 54.76%, 0.9887 62.27%, 0.9948 70.86%, 0.9983 82.67%, 0.9997 99.85%); 739 --spring-d260-b0-duration: 0.4316s; 740 --spring-d220-b0-easing: linear( 741 0, 742 0.0093 1.37%, 743 0.0696 4.12%, 744 0.4667 15.09%, 745 0.6322 20.58%, 746 0.6986 23.32%, 747 0.7793 27.44%, 748 0.8219 30.18%, 749 0.8721, 750 0.9089 38.42%, 751 0.9427, 752 0.9644, 753 0.978 54.88%, 754 0.9881 61.74%, 755 0.9944 69.97%, 756 0.998 80.95%, 757 0.9996 98.78% 758 ); 759 --spring-d220-b0-duration: 0.3818s; 760 --spring-d180-b0-easing: linear(0, 0.0234, 0.0805 4.48%, 0.4865 15.68%, 0.6211 20.16%, 0.7696 26.88%, 0.8064 29.12%, 0.8646, 0.9063, 0.9358, 0.9563 47.04%, 0.9757, 0.9867 60.48%, 0.9941 69.44%, 0.9979 80.64%, 0.9996 98.56%); 761 --spring-d180-b0-duration: 0.2988s; 762 763 /* View transitions */ 764 /* View transition old */ 765 --view-transition-old-main-content: var(--animation-speed) var(--animation-easing) both fadeOut; 766 767 /* View transition new */ 768 --view-transition-new-main-content: var(--animation-speed) var(--animation-easing) both fadeIn, var(--animation-speed) var(--animation-easing) both slideInTopViewTransition; 769 770 /* Focus */ 771 --focus-outline-width: 0.09375rem; 772 --focus-outline-offset: 0.2em; 773 774 /* Badges */ 775 --badge-blob-padding-block: 1px; 776 --badge-blob-padding-inline: 12px 8px; 777 --badge-rectangle-padding-block: 1px; 778 --badge-rectangle-padding-inline: 6px; 779 @media screen and (min-width: 750px) { 780 --badge-blob-padding-block: 4px; 781 --badge-blob-padding-inline: 16px 12px; 782 --badge-rectangle-padding-block: 4px; 783 --badge-rectangle-padding-inline: 10px; 784 } 785 786 /* Icons */ 787 --icon-size-2xs: 0.6rem; 788 --icon-size-xs: 0.85rem; 789 --icon-size-sm: 1.25rem; 790 --icon-size-md: 1.375rem; 791 --icon-size-lg: 1.5rem; 792 --icon-stroke-width: 1.5px; 793 794 /* Input */ 795 --input-email-min-width: 200px; 796 --input-search-max-width: 650px; 797 --input-padding-y: 0.8rem; 798 --input-padding-x: 0.8rem; 799 --input-padding: var(--input-padding-y) var(--input-padding-x); 800 --input-box-shadow-width: var(--style-border-width-inputs); 801 --input-box-shadow: 0 0 0 var(--input-box-shadow-width) var(--color-input-border); 802 --input-box-shadow-focus: 0 0 0 calc(var(--input-box-shadow-width) + 0.5px) var(--color-input-border); 803 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 804 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5)); 805 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50));
806 --input-textarea-min-height: 55px; 807 808 /* Checkbox */ 809 --checkbox-size: 22px; 810 --checkbox-border-radius: 7px; 811 --checkbox-border: 1px solid rgb(var(--color-foreground-rgb) / var(--opacity-35-55)); 812 --checkbox-label-padding: 8px; 813 814 @media screen and (min-width: 750px) { 815 --checkbox-size: 16px; 816 --checkbox-border-radius: 5px; 817 --checkbox-label-padding: 6px; 818 } 819 820 /* Button size */ 821 --button-size-sm: 30px; 822 --button-size-md: 36px; 823 --button-size: var(--minimum-touch-target); 824 --button-padding-inline: 24px; 825 --button-padding-block: 16px; 826 827 /* Button font-family */ 828 --button-font-family-primary: var(--font-body--family); 829 --button-font-family-secondary: var(--font-body--family); 830 831 /* Button text case */ 832 --button-text-case: ; 833 --button-text-case-primary: default; 834 --button-text-case-secondary: default; 835 836 /* Borders */ 837 --border-color: rgb(var(--color-border-rgb) / var(--opacity-50)); 838 --border-width-sm: 1px; 839 --border-width-md: 2px; 840 --border-width-lg: 5px; 841 --border-radius-sm: 0.25rem; 842 843 /* Drawers */ 844 --drawer-inline-padding: 25px; 845 --drawer-menu-inline-padding: 2.5rem; 846 --drawer-header-block-padding: 20px; 847 --drawer-content-block-padding: 10px; 848 --drawer-header-desktop-top: 0rem; 849 --drawer-padding: calc(var(--padding-sm) + 7px); 850 --drawer-height: 100dvh; 851 --drawer-width: 95vw; 852 --drawer-max-width: 500px; 853 854 /* Variant Picker Swatches */ 855 --variant-picker-swatch-width-unitless: 34; 856 --variant-picker-swatch-height-unitless: 34; 857 --variant-picker-swatch-width: 34px; 858 --variant-picker-swatch-height: 34px; 859 --variant-picker-swatch-radius: 32px; 860 --variant-picker-border-width: 1px; 861 --variant-picker-border-style: solid; 862 --variant-picker-border-opacity: 10%; 863 864 /* Variant Picker Buttons */ 865 --variant-picker-button-radius: 14px; 866 --variant-picker-button-border-width: 1px; 867 868 /* Slideshow */ 869 --slideshow-controls-size: 3.5rem; 870 --slideshow-controls-icon: 2rem; 871 --peek-next-slide-size: 3rem; 872 873 /* Utilities */ 874 --backdrop-opacity: 0.15; 875 --backdrop-color-rgb: var(--color-shadow-rgb); 876 --minimum-touch-target: 44px; 877 --disabled-opacity: 0.5; 878 --skeleton-opacity: 0.025; 879 880 /* Shapes */ 881 --shape--circle: circle(50% at center); 882 --shape--sunburst: polygon(100% 50%,94.62% 55.87%,98.3% 62.94%,91.57% 67.22%,93.3% 75%,85.7% 77.39%,85.36% 85.36%,77.39% 85.7%,75% 93.3%,67.22% 91.57%,62.94% 98.3%,55.87% 94.62%,50% 100%,44.13% 94.62%,37.06% 98.3%,32.78% 91.57%,25% 93.3%,22.61% 85.7%,14.64% 85.36%,14.3% 77.39%,6.7% 75%,8.43% 67.22%,1.7% 62.94%,5.38% 55.87%,0% 50%,5.38% 44.13%,1.7% 37.06%,8.43% 32.78%,6.7% 25%,14.3% 22.61%,14.64% 14.64%,22.61% 14.3%,25% 6.7%,32.78% 8.43%,37.06% 1.7%,44.13% 5.38%,50% 0%,55.87% 5.38%,62.94% 1.7%,67.22% 8.43%,75% 6.7%,77.39% 14.3%,85.36% 14.64%,85.7% 22.61%,93.3% 25%,91.57% 32.78%,98.3% 37.06%,94.62% 44.13%); 883 --shape--diamond: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); 884 --shape--blob: polygon(85.349% 11.712%, 87.382% 13.587%, 89.228% 15.647%, 90.886% 17.862%, 92.359% 20.204%, 93.657% 22.647%, 94.795% 25.169%, 95.786% 27.752%, 96.645% 30.382%, 97.387% 33.048%, 98.025% 35.740%, 98.564% 38.454%, 99.007% 41.186%, 99.358% 43.931%, 99.622% 46.685%, 99.808% 49.446%, 99.926% 52.210%, 99.986% 54.977%, 99.999% 57.744%, 99.975% 60.511%, 99.923% 63.278%, 99.821% 66.043%, 99.671% 68.806%, 99.453% 71.565%, 99.145% 74.314%, 98.724% 77.049%, 98.164% 79.759%, 97.433% 82.427%, 96.495% 85.030%, 95.311% 87.529%, 93.841% 89.872%, 92.062% 91.988%, 89.972% 93.796%, 87.635% 95.273%, 85.135% 96.456%, 82.532% 97.393%, 79.864% 98.127%, 77.156% 98.695%, 74.424% 99.129%, 71.676% 99.452%, 68.918% 99.685%, 66.156% 99.844%, 63.390% 99.942%, 60.624% 99.990%, 57.856% 99.999%, 55.089% 99.978%, 52.323% 99.929%, 49.557% 99.847%, 46.792% 99.723%, 44.031% 99.549%, 41.273% 99.317%, 38.522% 99.017%, 35.781% 98.639%, 33.054% 98.170%, 30.347% 97.599%, 27.667% 96.911%, 25.024% 96.091%, 22.432% 95.123%, 19.907% 93.994%, 17.466% 92.690%, 15.126% 91.216%, 12.902% 89.569%, 10.808% 87.761%, 8.854% 85.803%, 7.053% 83.703%, 5.418% 81.471%, 3.962% 79.119%, 2.702% 76.656%, 1.656% 74.095%, 0.846% 71.450%, 0.294% 68.740%, 0.024% 65.987%, 0.050% 63.221%, 0.343% 60.471%, 0.858% 57.752%, 1.548% 55.073%, 2.370% 52.431%, 3.283% 49.819%, 4.253% 47.227%, 5.249% 44.646%, 6.244% 42.063%, 7.211% 39.471%, 8.124% 36.858%, 8.958% 34.220%, 9.711% 31.558%, 10.409% 28.880%, 11.083% 26.196%, 11.760% 23.513%, 12.474% 20.839%, 13.259% 18.186%, 14.156% 15.569%, 15.214% 13.012%, 16.485% 10.556%, 18.028% 8.261%, 19.883
884% 6.211%, 22.041% 4.484%, 24.440% 3.110%, 26.998% 2.057%, 29.651% 1.275%, 32.360% 0.714%, 35.101% 0.337%, 37.859% 0.110%, 40.624% 0.009%, 43.391% 0.016%, 46.156% 0.113%, 48.918% 0.289%, 51.674% 0.533%, 54.425% 0.837%, 57.166% 1.215%, 59.898% 1.654%, 62.618% 2.163%, 65.322% 2.750%, 68.006% 3.424%, 70.662% 4.197%, 73.284% 5.081%, 75.860% 6.091%, 78.376% 7.242%, 80.813% 8.551%, 83.148% 10.036%, 85.349% 11.712%); 885 886 /* Buy buttons */ 887 --height-buy-buttons: calc(var(--padding-lg) * 2 + var(--icon-size-sm)); 888 889 /* Card image width and height variables */ 890 --card-width-small: 10rem; 891 892 --height-small: 10rem; 893 --height-medium: 11.5rem; 894 --height-large: 13rem; 895 --height-full: 100vh; 896 897 @media screen and (min-width: 750px) { 898 --height-small: 17.5rem; 899 --height-medium: 21.25rem; 900 --height-large: 25rem; 901 } 902 903 /* Modal */ 904 --modal-max-height: 65dvh; 905 --quick-add-modal-height: min(38.5rem, 96vh); 906 --quick-add-modal-width: min(54rem, 96vw); 907 --quick-add-modal-gallery-width: 24rem; 908 909 /* Card styles for search */ 910 --card-bg-hover: rgb(var(--color-foreground-rgb) / var(--opacity-5)); 911 --card-border-hover: rgb(var(--color-foreground-rgb) / var(--opacity-30)); 912 --card-border-focus: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 913 914 /* Cart */ 915 --cart-primary-font-family: var(--font-body--family); 916 --cart-primary-font-style: var(--font-body--style); 917 --cart-primary-font-weight: var(--font-body--weight); 918 --cart-secondary-font-family: var(--font-secondary--family); 919 --cart-secondary-font-style: var(--font-secondary--style); 920 --cart-secondary-font-weight: var(--font-secondary--weight); 921 } 922</style> 923<style data-shopify> 924 925 926 :root, 927 928 929 930 .color-scheme-1 { 931 --color-background: rgb(250 247 243 / 1.0); 932 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 933 --color-background-rgb: 250 247 243; 934 --opacity-5-15: 0.05; 935 --opacity-10-25: 0.1; 936 --opacity-35-55: 0.35; 937 --opacity-40-60: 0.4; 938 --opacity-30-60: 0.3; 939 --color-foreground: rgb(0 0 0 / 0.81); 940 --color-foreground-rgb: 0 0 0; 941 --color-foreground-heading: rgb(0 0 0 / 1.0); 942 --color-foreground-heading-rgb: 0 0 0; 943 --color-primary: rgb(0 0 0 / 0.81); 944 --color-primary-rgb: 0 0 0; 945 --color-primary-hover: rgb(0 0 0 / 1.0); 946 --color-primary-hover-rgb: 0 0 0; 947 --color-border: rgb(0 0 0 / 0.06); 948 --color-border-rgb: 0 0 0; 949 --color-shadow: rgb(0 0 0 / 1.0); 950 --color-shadow-rgb: 0 0 0; 951 --color-primary-button-text: rgb(255 255 255 / 1.0); 952 --color-primary-button-background: rgb(0 0 0 / 1.0); 953 --color-primary-button-border: rgb(0 0 0 / 1.0); 954 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 955 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 956 --color-primary-button-hover-border: rgb(0 0 0 / 1.0); 957 --color-secondary-button-text: rgb(0 0 0 / 1.0); 958 --color-secondary-button-background: rgb(0 0 0 / 0.0); 959 --color-secondary-button-border: rgb(0 0 0 / 1.0); 960 --color-secondary-button-hover-text: rgb(51 51 51 / 1.0); 961 --color-secondary-button-hover-background: rgb(250 250 250 / 1.0); 962 --color-secondary-button-hover-border: rgb(51 51 51 / 1.0); 963 --color-input-background: rgb(255 255 255 / 0.78); 964 --color-input-text: rgb(51 51 51 / 1.0); 965 --color-input-text-rgb: 51 51 51; 966 --color-input-border: rgb(223 223 223 / 1.0); 967 --color-input-hover-background: rgb(0 0 0 / 0.01); 968 --color-variant-background: rgb(255 255 255 / 1.0); 969 --color-variant-border: rgb(0 0 0 / 0.13); 970 --color-variant-text: rgb(0 0 0 / 1.0); 971 --color-variant-text-rgb: 0 0 0; 972 --color-variant-hover-background: rgb(245 245 245 / 1.0); 973 --color-variant-hover-text: rgb(0 0 0 / 1.0); 974 --color-variant-hover-border: rgb(230 230 230 / 1.0); 975 --color-selected-variant-background: rgb(0 0 0 / 1.0); 976 --color-selected-variant-border: rgb(0 0 0 / 1.0); 977 --color-selected-variant-text: rgb(255 255 255 / 1.0); 978 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 979 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 980 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 981 982 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 983 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 984 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 985 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 986 --font-h1--color: var(--color-foreground-heading); 987 --font-h2--color: var(--color-foreground-heading); 988 --font-h3--color: var(--color-foreground-heading); 989 --font-h4--color: var(--color-foreground-heading); 990 --font-h5--color: var(--color-foreground-heading); 991 --font-h6--color: var(--color-foreground-heading); 992 993 /* Shadows */ 994 995 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 996 997 998 --shadow-blur: 20px; 999 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1000 1001 } 1002 1003 1004 1005 1006 .color-scheme-2 {
1007 --color-background: rgb(245 245 245 / 1.0); 1008 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1009 --color-background-rgb: 245 245 245; 1010 --opacity-5-15: 0.05; 1011 --opacity-10-25: 0.1; 1012 --opacity-35-55: 0.35; 1013 --opacity-40-60: 0.4; 1014 --opacity-30-60: 0.3; 1015 --color-foreground: rgb(0 0 0 / 0.81); 1016 --color-foreground-rgb: 0 0 0; 1017 --color-foreground-heading: rgb(0 0 0 / 1.0); 1018 --color-foreground-heading-rgb: 0 0 0; 1019 --color-primary: rgb(0 0 0 / 0.81); 1020 --color-primary-rgb: 0 0 0; 1021 --color-primary-hover: rgb(255 255 255 / 1.0); 1022 --color-primary-hover-rgb: 255 255 255; 1023 --color-border: rgb(223 223 223 / 1.0); 1024 --color-border-rgb: 223 223 223; 1025 --color-shadow: rgb(0 0 0 / 1.0); 1026 --color-shadow-rgb: 0 0 0; 1027 --color-primary-button-text: rgb(255 255 255 / 1.0); 1028 --color-primary-button-background: rgb(0 0 0 / 1.0); 1029 --color-primary-button-border: rgb(0 0 0 / 1.0); 1030 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1031 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1032 --color-primary-button-hover-border: rgb(51 51 51 / 1.0); 1033 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1034 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1035 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1036 --color-secondary-button-hover-text: rgb(0 0 0 / 1.0); 1037 --color-secondary-button-hover-background: rgb(255 255 255 / 0.36); 1038 --color-secondary-button-hover-border: rgb(51 51 51 / 0.73); 1039 --color-input-background: rgb(0 0 0 / 0.0); 1040 --color-input-text: rgb(0 0 0 / 0.53); 1041 --color-input-text-rgb: 0 0 0; 1042 --color-input-border: rgb(0 0 0 / 0.13); 1043 --color-input-hover-background: rgb(255 255 255 / 0.36); 1044 --color-variant-background: rgb(255 255 255 / 1.0); 1045 --color-variant-border: rgb(230 230 230 / 1.0); 1046 --color-variant-text: rgb(0 0 0 / 1.0); 1047 --color-variant-text-rgb: 0 0 0; 1048 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1049 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1050 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1051 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1052 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1053 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1054 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1055 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1056 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1057 1058 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1059 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1060 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1061 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1062 --font-h1--color: var(--color-foreground-heading); 1063 --font-h2--color: var(--color-foreground-heading); 1064 --font-h3--color: var(--color-foreground-heading); 1065 --font-h4--color: var(--color-foreground-heading); 1066 --font-h5--color: var(--color-foreground-heading); 1067 --font-h6--color: var(--color-foreground-heading); 1068 1069 /* Shadows */ 1070 1071 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1072 1073 1074 --shadow-blur: 20px; 1075 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1076 1077 } 1078 1079 1080 1081 1082 .color-scheme-3 { 1083 --color-background: rgb(238 241 234 / 1.0); 1084 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1085 --color-background-rgb: 238 241 234; 1086 --opacity-5-15: 0.05; 1087 --opacity-10-25: 0.1; 1088 --opacity-35-55: 0.35; 1089 --opacity-40-60: 0.4; 1090 --opacity-30-60: 0.3; 1091 --color-foreground: rgb(0 0 0 / 0.81); 1092 --color-foreground-rgb: 0 0 0; 1093 --color-foreground-heading: rgb(0 0 0 / 1.0); 1094 --color-foreground-heading-rgb: 0 0 0; 1095 --color-primary: rgb(0 0 0 / 0.81); 1096 --color-primary-rgb: 0 0 0; 1097 --color-primary-hover: rgb(0 0 0 / 1.0); 1098 --color-primary-hover-rgb: 0 0 0; 1099 --color-border: rgb(0 0 0 / 0.81); 1100 --color-border-rgb: 0 0 0; 1101 --color-shadow: rgb(0 0 0 / 1.0); 1102 --color-shadow-rgb: 0 0 0; 1103 --color-primary-button-text: rgb(255 255 255 / 1.0); 1104 --color-primary-button-background: rgb(0 0 0 / 1.0); 1105 --color-primary-button-border: rgb(0 0 0 / 1.0); 1106 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1107 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1108 --color-primary-button-hover-border: rgb(51 51 51 / 1.0); 1109 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1110 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1111 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1112 --color-secondary-button-hover-text: rgb(0 0 0 / 0.81); 1113 --color-secondary-button-hover-background: rgb(255 255 255 / 0.36); 1114 --color-secondary-button-hover-border: rgb(0 0 0 / 0.81); 1115 --color-input-background: rgb(0 0 0 / 0.0); 1116 --color-input-text: rgb(0 0 0 / 0.81); 1117 --color-input-text-rgb: 0 0 0; 1118 --color-input-border: rgb(0 0 0 / 0.81); 1119 --color-input-hover-background: rgb(255 255 255 / 0.36); 1120 --color-variant-background: rgb(255 255 255 / 1.0); 1121 --color-variant-border: rgb(230 230 230 / 1.0); 1122 --color-variant-text: rgb(0 0 0 / 1.0); 1123 --color-variant-text-rgb: 0 0 0; 1124 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1125 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1126 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1127 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1128 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1129 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1130 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1131 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1132 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1133 1134 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1135 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1136 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1137 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1138 --font-h1--color: var(--color-foreground-heading); 1139 --font-h2--color: var(--color-foreground-heading); 1140 --font-h3--color: var(--color-foreground-heading); 1141 --font-h4--color: var(--color-foreground-heading); 1142 --font-h5--color: var(--color-foreground-heading); 1143 --font-h6--color: var(--color-foreground-heading); 1144 1145 /* Shadows */ 1146 1147 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1148 1149 1150 --shadow-blur: 20px; 1151 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1152 1153 } 1154 1155 1156 1157 1158 .color-scheme-4 { 1159 --color-background: rgb(225 237 245 / 1.0); 1160 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1161 --color-background-rgb: 225 237 245; 1162 --opacity-5-15: 0.05; 1163 --opacity-10-25: 0.1; 1164 --opacity-35-55: 0.35; 1165 --opacity-40-60: 0.4; 1166 --opacity-30-60: 0.3; 1167 --color-foreground: rgb(0 0 0 / 0.81); 1168 --color-foreground-rgb: 0 0 0; 1169 --color-foreground-heading: rgb(0 0 0 / 1.0); 1170 --color-foreground-heading-rgb: 0 0 0; 1171 --color-primary: rgb(0 0 0 / 0.81); 1172 --color-primary-rgb: 0 0 0; 1173 --color-primary-hover: rgb(0 0 0 / 1.0); 1174 --color-primary-hover-rgb: 0 0 0; 1175 --color-border: rgb(29 54 134 / 0.5); 1176 --color-border-rgb: 29 54 134; 1177 --color-shadow: rgb(0 0 0 / 1.0); 1178 --color-shadow-rgb: 0 0 0; 1179 --color-primary-button-text: rgb(255 255 255 / 1.0); 1180 --color-primary-button-background: rgb(0 0 0 / 1.0); 1181 --color-primary-button-border: rgb(29 54 134 / 1.0); 1182 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1183 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1184 --color-primary-button-hover-border: rgb(0 0 0 / 1.0); 1185 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1186 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1187 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1188 --color-secondary-button-hover-text: rgb(0 0 0 / 0.81); 1189 --color-secondary-button-hover-background: rgb(255 255 255 / 0.36); 1190 --color-secondary-button-hover-border: rgb(0 0 0 / 0.81); 1191 --color-input-background: rgb(0 0 0 / 0.0); 1192 --color-input-text: rgb(0 0 0 / 0.81); 1193 --color-input-text-rgb: 0 0 0; 1194 --color-input-border: rgb(0 0 0 / 0.81); 1195 --color-input-hover-background: rgb(255 255 255 / 0.36); 1196 --color-variant-background: rgb(255 255 255 / 1.0); 1197 --color-variant-border: rgb(230 230 230 / 1.0); 1198 --color-variant-text: rgb(0 0 0 / 1.0); 1199 --color-variant-text-rgb: 0 0 0; 1200 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1201 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1202 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1203 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1204 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1205 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1206 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1207 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1208 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1209 1210 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1211 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1212 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1213 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1214 --font-h1--color: var(--color-foreground-heading); 1215 --font-h2--color: var(--color-foreground-heading); 1216 --font-h3--color: var(--color-foreground-heading); 1217 --font-h4--color: var(--color-foreground-heading); 1218 --font-h5--color: var(--color-foreground-heading); 1219 --font-h6--color: var(--color-foreground-heading); 1220 1221 /* Shadows */ 1222 1223 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1224 1225 1226 --shadow-blur: 20px; 1227 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1228 1229 } 1230 1231 1232 1233 1234 .color-scheme-5 { 1235 --color-background: rgb(51 51 51 / 1.0); 1236 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1237 --color-background-rgb: 51 51 51; 1238 --opacity-5-15: 0.15; 1239 --opacity-10-25: 0.25; 1240 --opacity-35-55: 0.55; 1241 --opacity-40-60: 0.6; 1242 --opacity-30-60: 0.6; 1243 --color-foreground: rgb(255 255 255 / 1.0); 1244 --color-foreground-rgb: 255 255 255; 1245 --color-foreground-heading: rgb(255 255 255 / 1.0); 1246 --color-foreground-heading-rgb: 255 255 255; 1247 --color-primary: rgb(255 255 255 / 1.0); 1248 --color-primary-rgb: 255 255 255; 1249 --color-primary-hover: rgb(255 255 255 / 0.69); 1250 --color-primary-hover-rgb: 255 255 255; 1251 --color-border: rgb(255 255 255 / 0.69); 1252 --color-border-rgb: 255 255 255; 1253 --color-shadow: rgb(0 0 0 / 1.0); 1254 --color-shadow-rgb: 0 0 0; 1255 --color-primary-button-text: rgb(0 0 0 / 1.0); 1256 --color-primary-button-background: rgb(255 255 255 / 1.0); 1257 --color-primary-button-border: rgb(255 255 255 / 1.0); 1258 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1259 --color-primary-button-hover-background: rgb(0 0 0 / 1.0); 1260 --color-primary-button-hover-border: rgb(0 0 0 / 1.0); 1261 --color-secondary-button-text: rgb(255 255 255 / 1.0); 1262 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1263 --color-secondary-button-border: rgb(255 255 255 / 0.69); 1264 --color-secondary-button-hover-text: rgb(255 255 255 / 0.93); 1265 --color-secondary-button-hover-background: rgb(255 255 255 / 0.04); 1266 --color-secondary-button-hover-border: rgb(255 255 255 / 0.69); 1267 --color-input-background: rgb(51 51 51 / 1.0); 1268 --color-input-text: rgb(255 255 255 / 0.93); 1269 --color-input-text-rgb: 255 255 255; 1270 --color-input-border: rgb(255 255 255 / 0.69); 1271 --color-input-hover-background: rgb(255 255 255 / 0.04); 1272 --color-variant-background: rgb(255 255 255 / 1.0); 1273 --color-variant-border: rgb(230 230 230 / 1.0); 1274 --color-variant-text: rgb(0 0 0 / 1.0); 1275 --color-variant-text-rgb: 0 0 0; 1276 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1277 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1278 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1279 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1280 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1281 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1282 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1283 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1284 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1285 1286 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1287 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1288 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1289 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1290 --font-h1--color: var(--color-foreground-heading); 1291 --font-h2--color: var(--color-foreground-heading); 1292 --font-h3--color: var(--color-foreground-heading); 1293 --font-h4--color: var(--color-foreground-heading); 1294 --font-h5--color: var(--color-foreground-heading); 1295 --font-h6--color: var(--color-foreground-heading); 1296 1297 /* Shadows */ 1298 1299 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1300 1301 1302 --shadow-blur: 20px; 1303 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1304 1305 } 1306 1307 1308 1309 1310 .color-scheme-6 { 1311 --color-background: rgb(0 0 0 / 0.0); 1312 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1313 --color-background-rgb: 0 0 0; 1314 --opacity-5-15: 0.15; 1315 --opacity-10-25: 0.25; 1316 --opacity-35-55: 0.55; 1317 --opacity-40-60: 0.6; 1318 --opacity-30-60: 0.6; 1319 --color-foreground: rgb(255 255 255 / 1.0); 1320 --color-foreground-rgb: 255 255 255; 1321 --color-foreground-heading: rgb(255 255 255 / 1.0); 1322 --color-foreground-heading-rgb: 255 255 255; 1323 --color-primary: rgb(255 255 255 / 1.0); 1324 --color-primary-rgb: 255 255 255; 1325 --color-primary-hover: rgb(255 255 255 / 0.69); 1326 --color-primary-hover-rgb: 255 255 255; 1327 --color-border: rgb(230 230 230 / 1.0); 1328 --color-border-rgb: 230 230 230; 1329 --color-shadow: rgb(0 0 0 / 1.0); 1330 --color-shadow-rgb: 0 0 0; 1331 --color-primary-button-text: rgb(0 0 0 / 1.0); 1332 --color-primary-button-background: rgb(255 255 255 / 1.0); 1333 --color-primary-button-border: rgb(255 255 255 / 1.0); 1334 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1335 --color-primary-button-hover-background: rgb(0 0 0 / 1.0); 1336 --color-primary-button-hover-border: rgb(0 0 0 / 1.0); 1337 --color-secondary-button-text: rgb(255 255 255 / 1.0);
1337 1338 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1339 --color-secondary-button-border: rgb(255 255 255 / 1.0); 1340 --color-secondary-button-hover-text: rgb(255 255 255 / 1.0); 1341 --color-secondary-button-hover-background: rgb(255 255 255 / 0.08); 1342 --color-secondary-button-hover-border: rgb(255 255 255 / 1.0); 1343 --color-input-background: rgb(255 255 255 / 1.0); 1344 --color-input-text: rgb(0 0 0 / 0.53); 1345 --color-input-text-rgb: 0 0 0; 1346 --color-input-border: rgb(0 0 0 / 0.13); 1347 --color-input-hover-background: rgb(250 250 250 / 1.0); 1348 --color-variant-background: rgb(255 255 255 / 1.0); 1349 --color-variant-border: rgb(230 230 230 / 1.0); 1350 --color-variant-text: rgb(0 0 0 / 1.0); 1351 --color-variant-text-rgb: 0 0 0; 1352 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1353 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1354 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1355 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1356 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1357 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1358 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1359 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1360 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1361 1362 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1363 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1364 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1365 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1366 --font-h1--color: var(--color-foreground-heading); 1367 --font-h2--color: var(--color-foreground-heading); 1368 --font-h3--color: var(--color-foreground-heading); 1369 --font-h4--color: var(--color-foreground-heading); 1370 --font-h5--color: var(--color-foreground-heading); 1371 --font-h6--color: var(--color-foreground-heading); 1372 1373 /* Shadows */ 1374 1375 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1376 1377 1378 --shadow-blur: 20px; 1379 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1380 1381 } 1382 1383 1384 1385 1386 .color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7 { 1387 --color-background: rgb(0 0 0 / 0.0); 1388 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1389 --color-background-rgb: 0 0 0; 1390 --opacity-5-15: 0.15; 1391 --opacity-10-25: 0.25; 1392 --opacity-35-55: 0.55; 1393 --opacity-40-60: 0.6; 1394 --opacity-30-60: 0.6; 1395 --color-foreground: rgb(0 0 0 / 1.0); 1396 --color-foreground-rgb: 0 0 0; 1397 --color-foreground-heading: rgb(0 0 0 / 1.0); 1398 --color-foreground-heading-rgb: 0 0 0; 1399 --color-primary: rgb(0 0 0 / 1.0); 1400 --color-primary-rgb: 0 0 0; 1401 --color-primary-hover: rgb(0 0 0 / 0.53); 1402 --color-primary-hover-rgb: 0 0 0; 1403 --color-border: rgb(230 230 230 / 1.0); 1404 --color-border-rgb: 230 230 230; 1405 --color-shadow: rgb(0 0 0 / 1.0); 1406 --color-shadow-rgb: 0 0 0; 1407 --color-primary-button-text: rgb(255 255 255 / 1.0); 1408 --color-primary-button-background: rgb(0 0 0 / 1.0); 1409 --color-primary-button-border: rgb(0 0 0 / 1.0); 1410 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1411 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1412 --color-primary-button-hover-border: rgb(51 51 51 / 1.0); 1413 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1414 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1415 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1416 --color-secondary-button-hover-text: rgb(51 51 51 / 1.0); 1417 --color-secondary-button-hover-background: rgb(250 250 250 / 1.0); 1418 --color-secondary-button-hover-border: rgb(51 51 51 / 1.0); 1419 --color-input-background: rgb(255 255 255 / 1.0); 1420 --color-input-text: rgb(0 0 0 / 0.53); 1421 --color-input-text-rgb: 0 0 0; 1422 --color-input-border: rgb(0 0 0 / 0.13); 1423 --color-input-hover-background: rgb(250 250 250 / 1.0); 1424 --color-variant-background: rgb(255 255 255 / 1.0); 1425 --color-variant-border: rgb(230 230 230 / 1.0); 1426 --color-variant-text: rgb(0 0 0 / 1.0); 1427 --color-variant-text-rgb: 0 0 0; 1428 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1429 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1430 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1431 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1432 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1433 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1434 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1435 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1436 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1437 1438 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1439 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1440 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1441 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1442 --font-h1--color: var(--color-foreground-heading); 1443 --font-h2--color: var(--color-foreground-heading); 1444 --font-h3--color: var(--color-foreground-heading); 1445 --font-h4--color: var(--color-foreground-heading); 1446 --font-h5--color: var(--color-foreground-heading); 1447 --font-h6--color: var(--color-foreground-heading); 1448 1449 /* Shadows */ 1450 1451 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1452 1453 1454 --shadow-blur: 20px; 1455 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1456 1457 } 1458 1459 1460 1461 1462 .color-scheme-3a22a853-b27c-4989-9b28-b2fe84f28659 { 1463 --color-background: rgb(204 90 48 / 1.0); 1464 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1465 --color-background-rgb: 204 90 48; 1466 --opacity-5-15: 0.05; 1467 --opacity-10-25: 0.1; 1468 --opacity-35-55: 0.35; 1469 --opacity-40-60: 0.4; 1470 --opacity-30-60: 0.3; 1471 --color-foreground: rgb(255 255 255 / 1.0); 1472 --color-foreground-rgb: 255 255 255; 1473 --color-foreground-heading: rgb(255 255 255 / 1.0); 1474 --color-foreground-heading-rgb: 255 255 255; 1475 --color-primary: rgb(255 255 255 / 1.0); 1476 --color-primary-rgb: 255 255 255; 1477 --color-primary-hover: rgb(255 255 255 / 1.0); 1478 --color-primary-hover-rgb: 255 255 255; 1479 --color-border: rgb(0 0 0 / 0.06); 1480 --color-border-rgb: 0 0 0; 1481 --color-shadow: rgb(255 255 255 / 1.0); 1482 --color-shadow-rgb: 255 255 255; 1483 --color-primary-button-text: rgb(255 255 255 / 1.0); 1484 --color-primary-button-background: rgb(255 255 255 / 1.0); 1485 --color-primary-button-border: rgb(255 255 255 / 1.0); 1486 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1487 --color-primary-button-hover-background: rgb(255 255 255 / 1.0); 1488 --color-primary-button-hover-border: rgb(255 255 255 / 1.0); 1489 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1490 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1491 --color-secondary-button-border: rgb(255 255 255 / 1.0); 1492 --color-secondary-button-hover-text: rgb(51 51 51 / 1.0); 1493 --color-secondary-button-hover-background: rgb(250 250 250 / 1.0); 1494 --color-secondary-button-hover-border: rgb(51 51 51 / 1.0); 1495 --color-input-background: rgb(255 255 255 / 0.78); 1496 --color-input-text: rgb(51 51 51 / 1.0); 1497 --color-input-text-rgb: 51 51 51; 1498 --color-input-border: rgb(223 223 223 / 1.0); 1499 --color-input-hover-background: rgb(0 0 0 / 0.01); 1500 --color-variant-background: rgb(255 255 255 / 1.0); 1501 --color-variant-border: rgb(0 0 0 / 0.13); 1502 --color-variant-text: rgb(0 0 0 / 1.0); 1503 --color-variant-text-rgb: 0 0 0; 1504 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1505 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1506 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1507 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1508 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1509 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1510 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1511 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1512 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1513 1514 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1515 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1516 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1517 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1518 --font-h1--color: var(--color-foreground-heading); 1519 --font-h2--color: var(--color-foreground-heading); 1520 --font-h3--color: var(--color-foreground-heading); 1521 --font-h4--color: var(--color-foreground-heading); 1522 --font-h5--color: var(--color-foreground-heading); 1523 --font-h6--color: var(--color-foreground-heading); 1524 1525 /* Shadows */ 1526 1527 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1528 1529 1530 --shadow-blur: 20px; 1531 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1532 1533 } 1534 1535 1536 1537 1538 .color-scheme-39516907-68b0-49a6-8725-28e850d4665e { 1539 --color-background: rgb(255 255 255 / 0.78); 1540 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1541 --color-background-rgb: 255 255 255; 1542 --opacity-5-15: 0.05; 1543 --opacity-10-25: 0.1; 1544 --opacity-35-55: 0.35; 1545 --opacity-40-60: 0.4; 1546 --opacity-30-60: 0.3; 1547 --color-foreground: rgb(0 0 0 / 0.81); 1548 --color-foreground-rgb: 0 0 0; 1549 --color-foreground-heading: rgb(0 0 0 / 1.0); 1550 --color-foreground-heading-rgb: 0 0 0; 1551 --color-primary: rgb(0 0 0 / 0.81); 1552 --color-primary-rgb: 0 0 0; 1553 --color-primary-hover: rgb(0 0 0 / 1.0); 1554 --color-primary-hover-rgb: 0 0 0; 1555 --color-border: rgb(0 0 0 / 0.06); 1556 --color-border-rgb: 0 0 0; 1557 --color-shadow: rgb(0 0 0 / 1.0); 1558 --color-shadow-rgb: 0 0 0; 1559 --color-primary-button-text: rgb(255 255 255 / 1.0); 1560 --color-primary-button-background: rgb(0 0 0 / 1.0); 1561 --color-primary-button-border: rgb(0 0 0 / 1.0); 1562 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1563 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1564 --color-primary-button-hover-border: rgb(0 0 0 / 1.0); 1565 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1566 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1567 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1568 --color-secondary-button-hover-text: rgb(51 51 51 / 1.0); 1569 --color-secondary-button-hover-background: rgb(250 250 250 / 1.0); 1570 --color-secondary-button-hover-border: rgb(51 51 51 / 1.0); 1571 --color-input-background: rgb(255 255 255 / 0.78); 1572 --color-input-text: rgb(51 51 51 / 1.0); 1573 --color-input-text-rgb: 51 51 51; 1574 --color-input-border: rgb(223 223 223 / 1.0); 1575 --color-input-hover-background: rgb(0 0 0 / 0.01); 1576 --color-variant-background: rgb(255 255 255 / 1.0); 1577 --color-variant-border: rgb(0 0 0 / 0.13); 1578 --color-variant-text: rgb(0 0 0 / 1.0); 1579 --color-variant-text-rgb: 0 0 0; 1580 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1581 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1582 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1583 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1584 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1585 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1586 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1587 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1588 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1589 1590 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1591 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1592 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1593 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1594 --font-h1--color: var(--color-foreground-heading); 1595 --font-h2--color: var(--color-foreground-heading); 1596 --font-h3--color: var(--color-foreground-heading); 1597 --font-h4--color: var(--color-foreground-heading); 1598 --font-h5--color: var(--color-foreground-heading); 1599 --font-h6--color: var(--color-foreground-heading); 1600 1601 /* Shadows */ 1602 1603 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1604 1605 1606 --shadow-blur: 20px; 1607 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1608 1609 } 1610 1611 1612 1613 1614 .color-scheme-f013a9d4-f3d5-4308-84c0-11895e862b26 { 1615 --color-background: rgb(247 239 227 / 1.0); 1616 /* RGB values only to apply different opacities - Relative color values are not supported in iOS < 16.4 */ 1617 --color-background-rgb: 247 239 227; 1618 --opacity-5-15: 0.05; 1619 --opacity-10-25: 0.1; 1620 --opacity-35-55: 0.35; 1621 --opacity-40-60: 0.4; 1622 --opacity-30-60: 0.3; 1623 --color-foreground: rgb(0 0 0 / 0.81); 1624 --color-foreground-rgb: 0 0 0; 1625 --color-foreground-heading: rgb(0 0 0 / 1.0); 1626 --color-foreground-heading-rgb: 0 0 0; 1627 --color-primary: rgb(0 0 0 / 0.81); 1628 --color-primary-rgb: 0 0 0; 1629 --color-primary-hover: rgb(0 0 0 / 1.0); 1630 --color-primary-hover-rgb: 0 0 0; 1631 --color-border: rgb(0 0 0 / 0.06); 1632 --color-border-rgb: 0 0 0; 1633 --color-shadow: rgb(0 0 0 / 1.0); 1634 --color-shadow-rgb: 0 0 0; 1635 --color-primary-button-text: rgb(255 255 255 / 1.0); 1636 --color-primary-button-background: rgb(0 0 0 / 1.0); 1637 --color-primary-button-border: rgb(0 0 0 / 1.0); 1638 --color-primary-button-hover-text: rgb(255 255 255 / 1.0); 1639 --color-primary-button-hover-background: rgb(51 51 51 / 1.0); 1640 --color-primary-button-hover-border: rgb(0 0 0 / 1.0); 1641 --color-secondary-button-text: rgb(0 0 0 / 1.0); 1642 --color-secondary-button-background: rgb(0 0 0 / 0.0); 1643 --color-secondary-button-border: rgb(0 0 0 / 1.0); 1644 --color-secondary-button-hover-text: rgb(51 51 51 / 1.0); 1645 --color-secondary-button-hover-background: rgb(250 250 250 / 1.0); 1646 --color-secondary-button-hover-border: rgb(51 51 51 / 1.0); 1647 --color-input-background: rgb(255 255 255 / 0.78); 1648 --color-input-text: rgb(51 51 51 / 1.0); 1649 --color-input-text-rgb: 51 51 51; 1650 --color-input-border: rgb(223 223 223 / 1.0); 1651 --color-input-hover-background: rgb(0 0 0 / 0.01); 1652 --color-variant-background: rgb(255 255 255 / 1.0); 1653 --color-variant-border: rgb(0 0 0 / 0.13); 1654 --color-variant-text: rgb(0 0 0 / 1.0); 1655 --color-variant-text-rgb: 0 0 0; 1656 --color-variant-hover-background: rgb(245 245 245 / 1.0); 1657 --color-variant-hover-text: rgb(0 0 0 / 1.0); 1658 --color-variant-hover-border: rgb(230 230 230 / 1.0); 1659 --color-selected-variant-background: rgb(0 0 0 / 1.0); 1660 --color-selected-variant-border: rgb(0 0 0 / 1.0); 1661 --color-selected-variant-text: rgb(255 255 255 / 1.0); 1662 --color-selected-variant-hover-background: rgb(26 26 26 / 1.0); 1663
1663 --color-selected-variant-hover-text: rgb(255 255 255 / 1.0); 1664 --color-selected-variant-hover-border: rgb(26 26 26 / 1.0); 1665 1666 --input-disabled-background-color: rgb(var(--color-foreground-rgb) / var(--opacity-10)); 1667 --input-disabled-border-color: rgb(var(--color-foreground-rgb) / var(--opacity-5-15)); 1668 --input-disabled-text-color: rgb(var(--color-foreground-rgb) / var(--opacity-50)); 1669 --color-foreground-muted: rgb(var(--color-foreground-rgb) / var(--opacity-60)); 1670 --font-h1--color: var(--color-foreground-heading); 1671 --font-h2--color: var(--color-foreground-heading); 1672 --font-h3--color: var(--color-foreground-heading); 1673 --font-h4--color: var(--color-foreground-heading); 1674 --font-h5--color: var(--color-foreground-heading); 1675 --font-h6--color: var(--color-foreground-heading); 1676 1677 /* Shadows */ 1678 1679 --shadow-drawer: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1680 1681 1682 --shadow-blur: 20px; 1683 --shadow-popover: 0px 4px 20px rgb(var(--color-shadow-rgb) / var(--opacity-15)); 1684 1685 } 1686 1687 1688 body, .color-scheme-1, .color-scheme-2, .color-scheme-3, .color-scheme-4, .color-scheme-5, .color-scheme-6, .color-scheme-58084d4c-a86e-4d0a-855e-a0966e5043f7, .color-scheme-3a22a853-b27c-4989-9b28-b2fe84f28659, .color-scheme-39516907-68b0-49a6-8725-28e850d4665e, .color-scheme-f013a9d4-f3d5-4308-84c0-11895e862b26 { 1689 color: var(--color-foreground); 1690 background-color: var(--color-background); 1691 } 1692</style> 1693 1694 1695
1695<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
1695<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/79351316693/digital_wallets/dialog"> 1696<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
1696<script async="async" src="/checkouts/internal/preloads.js?locale=en-SG"></script>
vendor: 1 bytes, line 1696
1696
1697<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":79351316693,"countryCode":"SG","currencyCode":"SGD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/79351316693","merchantName":"Fresher Dinners","requiredBillingContactFields":["postalAddress","email","phone"],"requiredShippingContactFields":["postalAddress","email","phone"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex"],"total":{"type":"pending","label":"Fresher Dinners","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 1697
1697
1698<script id="shopify-features" type="application/json">{"accessToken":"f88c4f238cfa8749bd53215dcb719ee3","betas":["rich-media-storefront-analytics"],"domain":"fresherdinners.com.sg","predictiveSearch":true,"shopId":79351316693,"locale":"en"}</script>
vendor: 1 bytes, line 1698
1698
1699<script>var Shopify = Shopify || {}; 1700Shopify.shop = "nsmy7n-ge.myshopify.com"; 1701Shopify.locale = "en"; 1702Shopify.currency = {"active":"SGD","rate":"1.0"}; 1703Shopify.country = "SG"; 1704Shopify.theme = {"name":"Copy of Horizon 03-04-2026","id":157894213845,"schema_name":"Horizon","schema_version":"3.3.1","theme_store_id":2481,"role":"main"}; 1705Shopify.theme.handle = "null"; 1706Shopify.theme.style = {"id":null,"handle":null}; 1707Shopify.cdnHost = "fresherdinners.com.sg/cdn"; 1708Shopify.routes = Shopify.routes || {}; 1709Shopify.routes.root = "/"; 1710Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 1711Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 1712Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 1713Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 1713
1713
1714<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 1714
1714
1715<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 1715
1715
1716<script> 1717 window.Shopify = window.Shopify || {}; 1718 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 1719 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 1720 window.Shopify.SignInWithShop.eligible = false; 1721</script>
vendor: 1 bytes, line 1721
1721
1722<script id="shop-js-analytics" type="application/json">{"pageType":"index"}</script>
vendor: 1 bytes, line 1722
1722
1723<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 1723
1723
1724<script type="module"> 1725 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 1726 1727 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 1728 1729</script>
vendor: 1 bytes, line 1729
1729
1730<script>(function() { 1731 var isLoaded = false; 1732 function asyncLoad() { 1733 if (isLoaded) return; 1734 isLoaded = true; 1735 var urls = ["https:\/\/cdn-app.sealsubscriptions.com\/shopify\/public\/js\/sealsubscriptions.js?shop=nsmy7n-ge.myshopify.com"]; 1736 for (var i = 0; i < urls.length; i++) { 1737 var s = document.createElement('script'); 1738 s.type = 'text/javascript'; 1739 s.async = true; 1740 s.src = urls[i]; 1741 var x = document.getElementsByTagName('script')[0]; 1742 x.parentNode.insertBefore(s, x); 1743 } 1744 }; 1745 if(window.attachEvent) { 1746 window.attachEvent('onload', asyncLoad); 1747 } else { 1748 window.addEventListener('load', asyncLoad, false); 1749 } 1750})();</script>
vendor: 1 bytes, line 1750
1750
1751<script id="__st">var __st={"a":79351316693,"offset":28800,"reqid":"03149f5c-905e-4dab-8895-a283f95b88d4-1791373064","pageurl":"fresherdinners.com.sg\/","u":"1790a71864ea","p":"home"};</script>
vendor: 1 bytes, line 1751
1751
1752<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 1752
1752
1753<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 1753
1753
1754<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//fresherdinners.com.sg/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 1754
1754
1755<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//fresherdinners.com.sg/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
1755<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 1755
1755
1756<script> 1757 window.Shopify = window.Shopify || {}; 1758 window.Shopify.MCP = window.Shopify.MCP || {}; 1759 window.Shopify.MCP.enabled = true; 1760 window.Shopify.MCP.shop = "nsmy7n-ge.myshopify.com"; 1761 window.Shopify.MCP.mcpEndpoint = "https:\/\/fresherdinners.com.sg\/api\/mcp"; 1762 window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\nSet policy_types to also get the store's written policies (full text and URL).\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."},"policy_types":{"type":"array","items":{"type":"string","enum":["refund","shipping","privacy","terms_of_service","terms_of_sale","subscription","legal_notice","contact"]},"description":"Policy kinds to fetch, chosen from the user's question â e.g. [\"refund\"] for returns\/exchanges\/damaged items, [\"contact\"] for phone\/hours\/address. Include every kind the question touches. Omit it to get only FAQ answers."}},"required":["query"]}}]; 1763</script>
vendor: 1 bytes, line 1763
1763
1764<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/fresherdinners.com.sg\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 1765</script>
vendor: 1 bytes, line 1765
1765
1766<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://fresherdinners.com.sg/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 1767</script>
vendor: 1 bytes, line 1767
1767
1768<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 1769 function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent); 1770</script>
vendor: 1 bytes, line 1770
1770
1771<script data-source-attribution="shopify.dynamic_checkout.cart.bootstrap">document.addEventListener("DOMContentLoaded",(function(){function t(){return document.querySelector("shopify-accelerated-checkout-cart, shopify-accelerated-checkout")}if(t())Shopify.PaymentButton.init();else{new MutationObserver((function(e,n){t()&&(Shopify.PaymentButton.init(),n.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}})); 1772</script>
1772 1773<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://fresherdinners.com.sg/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 1774<style id="shopify-accelerated-checkout-cart"> 1775 #shopify-buyer-consent { 1776 margin-top: 1em; 1777 display: inline-block; 1778 width: 100%; 1779} 1780 1781#shopify-buyer-consent.hidden { 1782 display: none; 1783} 1784 1785#shopify-subscription-policy-button { 1786 background: none; 1787 border: none; 1788 padding: 0; 1789 text-decoration: underline; 1790 font-size: inherit; 1791 cursor: pointer; 1792} 1793 1794#shopify-subscription-policy-button::before { 1795 box-shadow: none; 1796} 1797 1798 </style> 1799<link rel="stylesheet" media="screen" href="//fresherdinners.com.sg/cdn/shop/t/2/compiled_assets/styles.css?v=23689101601640687041785990694">
1800<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
1800 1801 1802 1803 <form method="post" action="/account" id="create_customer" accept-charset="UTF-8" data-login-with-shop-sign-up="true"><input type="hidden" name="form_type" value="create_customer" /><input type="hidden" name="utf8" value="â" /><input type="hidden" name="return_to" value="/pages/profile" /> 1804 1805 1806 1807 1808</form> 1809 1810 <!-- BEGIN app block: shopify://apps/delivery-pickup/blocks/odd-block/80605365-b4f4-42ba-9b84-3d39984a49dc --> 1811 1812 1813 1814 � 1815
1815<script> 1816 function _0x2197(_0x2946b1,_0x6c7c4c){var _0x15d7c5=_0x15d7();return _0x2197=function(_0x219790,_0xc28fad){_0x219790=_0x219790-0x11e;var _0x5e1640=_0x15d7c5[_0x219790];return _0x5e1640;},_0x2197(_0x2946b1,_0x6c7c4c);}var _0x50d14b=_0x2197;(function(_0x227c2c,_0x423dfc){var _0x1ec0c9=_0x2197,_0x4f0baa=_0x227c2c();while(!![]){try{var _0x411c1e=parseInt(_0x1ec0c9(0x128))/0x1*(-parseInt(_0x1ec0c9(0x123))/0x2)+-parseInt(_0x1ec0c9(0x12b))/0x3+-parseInt(_0x1ec0c9(0x131))/0x4*(-parseInt(_0x1ec0c9(0x132))/0x5)+parseInt(_0x1ec0c9(0x133))/0x6*(parseInt(_0x1ec0c9(0x130))/0x7)+parseInt(_0x1ec0c9(0x126))/0x8*(-parseInt(_0x1ec0c9(0x12c))/0x9)+parseInt(_0x1ec0c9(0x121))/0xa+-parseInt(_0x1ec0c9(0x11e))/0xb*(-parseInt(_0x1ec0c9(0x135))/0xc);if(_0x411c1e===_0x423dfc)break;else _0x4f0baa['push'](_0x4f0baa['shift']());}catch(_0x405d49){_0x4f0baa['push'](_0x4f0baa['shift']());}}}(_0x15d7,0x9a9d2),window[_0x50d14b(0x12e)]=_0x50d14b(0x127));if(location['href'][_0x50d14b(0x12a)](_0x50d14b(0x136))){var order_id=atob(location[_0x50d14b(0x120)][_0x50d14b(0x129)]('?data=')[0x1])[_0x50d14b(0x129)]('&')[0x0][_0x50d14b(0x129)]('order_id=')[0x1],ty_link=atob(location[_0x50d14b(0x120)][_0x50d14b(0x129)](_0x50d14b(0x12f))[0x1])[_0x50d14b(0x129)]('&')[0x1][_0x50d14b(0x129)](_0x50d14b(0x137))[0x1],exist_id=localStorage[_0x50d14b(0x134)](_0x50d14b(0x122)),orderArray={};exist_id?(!JSON[_0x50d14b(0x124)](exist_id)[order_id]&&(orderArray[order_id]='0'),orderArray={...JSON['parse'](exist_id),...orderArray}):orderArray[order_id]='0',window[_0x50d14b(0x138)][_0x50d14b(0x125)](_0x50d14b(0x122),JSON[_0x50d14b(0x12d)](orderArray)),ty_link!=''&&(window[_0x50d14b(0x11f)]=ty_link);}function _0x15d7(){var _0x478bff=['997208RoDepl','{"0":1}','418478tReEui','split','includes','2243148YpOopi','81UqgdRC','stringify','prevent_checkout','?data=','35vemzzr','120NhMRkl','202715cchOqN','55716JRSdAd','getItem','20389548XjGGUI','data','order_link=','localStorage','11HvWIeX','location','href','7964580uJGPEk','order_id','6wJgwxN','parse','setItem'];_0x15d7=function(){return _0x478bff;};return _0x15d7();} 1817 </script>
1817<!-- When to load our JS in all pages --> 1818
1818<script type="text/javascript" async src="https://odd.identixweb.com/order-delivery-date/front_scripts/static/js/main.js"></script>
1818�<!-- When to load our JS only in cart page but we need to load in customer order detail and account page for reschedule order details --><!-- To load our preview using "run wizard" button that time use this JS --> 1819
1819<script type="text/javascript" async src="https://odd.identixweb.com/order-delivery-date/assets/js/odd_preview.min.js"></script>
1819 1820 1821 <!-- END app block --><!-- BEGIN app block: shopify://apps/apploy/blocks/apploy/b1c49136-afa0-4125-ac0d-1f6b7aca1d88 --><style> 1822 :root { 1823 --apploy-primary-background-color: #fff; 1824 --apploy-primary-color: #000; 1825 --apploy-primary-color-foreground: #fff; 1826 --apploy-secondary-color: #666; 1827 --apploy-secondary-color-foreground: #fff; 1828 } 1829</style> 1830<style> 1831 <!-- BEGIN app snippet: apploy-css.css -->.apploy-exclusive { display: none; } 1832.apploy-ma-sticky-header { 1833 position: fixed; 1834 top: 0; 1835 left: 0; 1836 right: 0; 1837 z-index: 1000; 1838} 1839.apploy-app-install-banner { 1840 display: none; 1841 position: fixed; 1842 left: 0; 1843 right: 0; 1844 bottom: 100px; 1845 width: 90vw; 1846 margin: 0 auto; 1847 background-color: var(--apploy-primary-background-color, #fff); 1848 display: flex; 1849 align-items: center; 1850 gap: 16px; 1851 padding: 12px; 1852 box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1); 1853 z-index: 999999; 1854 border-radius: 10px; 1855 animation: fadeIn 0.5s ease-in-out; 1856} 1857 1858.ios-safari .apploy-app-install-banner { 1859 background-color: rgba(255, 255, 255, 0.95); 1860 backdrop-filter: blur(10px); 1861 -webkit-backdrop-filter: blur(10px); 1862 border: 1px solid rgba(0, 0, 0, 0.1); 1863} 1864 1865.ios-safari .apploy-app-install-banner-subtitle { 1866 font-size: 11px; 1867 line-height: 1.3; 1868 color: #555; 1869} 1870 1871.ios-safari .apploy-app-install-button { 1872 background-color: var(--apploy-primary-color, #007AFF); 1873 border-radius: 20px; 1874 padding: 8px 16px; 1875 font-weight: 600; 1876 font-size: 14px; 1877} 1878 1879.apploy-app-install-banner-close { 1880 position: absolute; 1881 top: -5px; 1882 right: -5px; 1883 width: 1.5rem; 1884 height: 1.5rem; 1885 border: none; 1886 background: #b4b3b3; 1887 color: #000; 1888 cursor: pointer; 1889 display: flex; 1890 align-items: center; 1891 justify-content: center; 1892 padding: 10px; 1893 border-radius: 50%; 1894 transition: background-color 0.2s; 1895} 1896 1897.apploy-app-install-banner .apploy-app-install-banner-content { 1898 display: flex; 1899 align-items: center; 1900 gap: 16px; 1901 width: 100%; 1902} 1903 1904.apploy-app-install-banner .apploy-app-install-banner-logo { 1905 width: 40px; 1906 height: 40px; 1907 border-radius: 8px; 1908 object-fit: cover; 1909 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 1910 flex-shrink: 0; 1911} 1912 1913.apploy-app-install-banner .apploy-app-install-banner-text { 1914 flex: 1; 1915 min-width: 0; 1916} 1917 1918.apploy-app-install-banner .apploy-app-install-banner-title { 1919 margin: 0; 1920 font-size: 14px; 1921 font-weight: 600; 1922 color: #000; 1923} 1924 1925.apploy-app-install-banner .apploy-app-install-banner-subtitle { 1926 margin: 4px 0 0; 1927 font-size: 12px; 1928 color: #666; 1929} 1930 1931.apploy-app-install-banner .apploy-app-install-button { 1932 background-color: var(--apploy-primary-color, #5d73d0); 1933 color: var(--apploy-primary-color-foreground, #fff); 1934 border: none; 1935 border-radius: 6px; 1936 padding: 8px 16px; 1937 font-size: 14px; 1938 font-weight: 500; 1939 cursor: pointer; 1940 white-space: nowrap; 1941 transition: opacity 0.2s; 1942 flex-shrink: 0; 1943} 1944 1945.apploy-app-install-banner .apploy-app-install-button:hover { 1946 opacity: 0.9; 1947} 1948 1949.apploy-app-install-banner-qr { 1950 display: none; 1951 position: fixed; 1952 left: 20px; 1953 bottom: 80px; 1954 padding: 14px; 1955 background: #fff; 1956 border-radius: 8px; 1957 box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); 1958 z-index: 999999; 1959 transform: translateY(10px); 1960 transition: 1961 opacity 0.3s ease, 1962 transform 0.3s ease; 1963} 1964.apploy-app-install-banner-qr p { 1965 margin: 0; 1966 font-size: 12px; 1967 color: #666; 1968 text-align: center; 1969} 1970 1971.apploy-main-nav { 1972 display: none; 1973 position: fixed; 1974 bottom: 0; 1975 left: 0; 1976 right: 0; 1977 z-index: 1000; 1978 background: #fff; 1979 gap: 16px; 1980 flex-direction: row; 1981 justify-content: space-evenly; 1982 padding: 16px 0; 1983 border-top: 1px solid #e0e0e0; 1984 -webkit-user-select: none; 1985 -moz-user-select: none; 1986 -ms-user-select: none; 1987 user-select: none; 1988} 1989.apploy-main-nav-item { 1990 text-decoration: none; 1991 display: flex; 1992 flex-direction: column; 1993 align-items: center; 1994 color: #666; 1995 transition: color 0.3s ease; 1996 position: relative; 1997} 1998.apploy-main-nav-item img { 1999 width: 24px; 2000 height: 24px; 2001 transition: filter 0.3s ease; 2002} 2003.apploy-main-nav-item span { 2004 font-size: 12px; 2005} 2006.apploy-main-nav-item.active { 2007 color: var(--apploy-primary-color, #000); 2008} 2009.apploy-main-nav-item.active img { 2010 filter: brightness(0) saturate(100%) invert(27%) sepia(51%) saturate(1920%) 2011 hue-rotate(212deg) brightness(92%) contrast(89%); 2012} 2013 2014.apploy-cart-badge { 2015 position: absolute; 2016 top: -8px; 2017 right: -8px; 2018 min-width: 18px; 2019 height: 18px; 2020 padding: 0 4px; 2021 background-color: var(--apploy-secondary-color, #ff4b4b); 2022 color: var(--apploy-secondary-color-foreground, #fff); 2023 border-radius: 9px; 2024 font-size: 11px; 2025 font-weight: 600; 2026 display: flex; 2027 align-items: center; 2028 justify-content: center; 2029 line-height: 1; 2030} 2031.apploy-cart-badge:empty { 2032 display: none; 2033} 2034 2035@media only screen and (max-width: 768px) { 2036} 2037@media only screen and (min-width: 768px) { 2038 .apploy-app-install-banner { 2039 width: 200px; 2040 cursor: pointer; 2041 2042 left: 20px; 2043 bottom: 20px; 2044 right: auto; 2045 transform-origin: left; 2046 2047 transform: scale(0.8); 2048 width: auto; 2049 transition: transform 0.3s ease; 2050 } 2051 .apploy-app-install-banner:hover { 2052 transform: scale(0.85); 2053 } 2054 2055 .apploy-app-install-banner-close { 2056 display: none; 2057 } 2058 .apploy-app-install-banner-subtitle { 2059 display: none; 2060 } 2061 .apploy-app-install-banner-qr { 2062 2063 left: 20px; 2064 bottom: calc(60px + 20px); 2065 right: auto; 2066 2067 display: none; 2068 } 2069 .qr-subtitle { 2070 max-width: 200px; 2071 display: block; 2072 } 2073 2074} 2075 2076/* Bottom Sheet Variant */ 2077.apploy-app-install-banner.bottom-sheet { 2078 position: fixed !important; 2079 bottom: 0 !important; 2080 left: 0 !important; 2081 right: 0 !important; 2082 width: 100% !important; 2083 margin: 0 !important; 2084 border-radius: 12px 12px 0 0; 2085 padding: 20px; 2086 display: flex; 2087 flex-direction: column; 2088 align-items: center; 2089 gap: 16px; 2090 transform: none !important; 2091 box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.15); 2092 z-index: 999999; 2093} 2094 2095.apploy-app-install-banner.bottom-sheet .apploy-app-install-banner-content { 2096 display: flex; 2097 flex-direction: column; 2098 align-items: center; 2099 gap: 16px; 2100 width: 100%; 2101} 2102 2103.apploy-app-install-banner.bottom-sheet .apploy-app-install-banner-logo { 2104 width: 60px; 2105 height: 60px; 2106 border-radius: 12px; 2107 margin-bottom: 8px; 2108} 2109 2110.apploy-app-install-banner.bottom-sheet .apploy-app-install-banner-text { 2111 text-align: center; 2112 display: flex; 2113 flex-direction: column; 2114 align-items: center; 2115 gap: 8px; 2116} 2117 2118.apploy-app-install-banner.bottom-sheet .apploy-app-install-banner-title { 2119 font-size: 18px; 2120 font-weight: 600; 2121} 2122 2123.apploy-app-install-banner.bottom-sheet .apploy-app-install-banner-subtitle { 2124 font-size: 14px; 2125 color: #666; 2126 max-width: 80%; 2127} 2128 2129.apploy-app-install-banner.bottom-sheet .apploy-app-install-button { 2130 width: 100%; 2131 max-width: 300px; 2132 padding: 12px 24px; 2133 font-size: 16px; 2134 margin-top: 8px; 2135} 2136 2137/* Full Screen Variant */ 2138.apploy-app-install-banner.full-screen { 2139 position: fixed; 2140 top: 0; 2141 left: 0; 2142 right: 0; 2143 bottom: 0; 2144 width: 100%; 2145 height: 100%; 2146 background: rgba(0, 0, 0, 0.8); 2147 border-radius: 0; 2148 padding: 0; 2149 display: flex; 2150 justify-content: center; 2151 align-items: center; 2152} 2153 2154.apploy-app-install-banner.full-screen .apploy-app-install-banner-content { 2155 background: transparent; 2156 padding: 32px; 2157 width: 90%; 2158 max-width: 400px; 2159 display: flex; 2160 flex-direction: column; 2161 align-items: center; 2162 gap: 24px; 2163} 2164 2165.apploy-app-install-banner.full-screen .apploy-app-install-banner-logo { 2166 width: 100px; 2167 height: 100px; 2168 border-radius: 16px; 2169 margin-bottom: 16px; 2170} 2171 2172.apploy-app-install-banner.full-screen .apploy-app-install-banner-text { 2173 text-align: center; 2174 display: flex; 2175 flex-direction: column; 2176 align-items: center; 2177 gap: 12px; 2178} 2179 2180.apploy-app-install-banner.full-screen .apploy-app-install-banner-title { 2181 font-size: 28px; 2182 font-weight: 600; 2183 color: #fff; 2184} 2185 2186.apploy-app-install-banner.full-screen .apploy-app-install-banner-subtitle { 2187 font-size: 18px; 2188 color: rgba(255, 255, 255, 0.9); 2189 max-width: 90%; 2190} 2191 2192.apploy-app-install-banner.full-screen .apploy-app-install-button { 2193 width: 100%; 2194 max-width: 300px; 2195 padding: 16px 32px; 2196 font-size: 20px; 2197 border-radius: 12px; 2198 background-color: var(--apploy-primary-color, #5d73d0); 2199 color: var(--apploy-primary-color-foreground, #fff); 2200 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); 2201 transition: transform 0.2s, box-shadow 0.2s; 2202 margin-top: 16px; 2203} 2204 2205.apploy-app-install-banner.full-screen .apploy-app-install-button:hover { 2206 transform: translateY(-2px); 2207 box-shadow: 0 6px 16px rgba(0, 0, 0, 0.3); 2208} 2209 2210.apploy-app-install-banner.full-screen .apploy-app-install-banner-close { 2211 position: absolute; 2212 top: 16px; 2213 right: 16px; 2214 width: 40px; 2215 height: 40px; 2216 background: rgba(255, 255, 255, 0.2); 2217 color: #fff; 2218 border-radius: 50%; 2219 display: flex; 2220 align-items: center; 2221 justify-content: center; 2222 cursor: pointer; 2223 transition: background-color 0.2s; 2224} 2225 2226.apploy-app-install-banner.full-screen .apploy-app-install-banner-close
2226:hover { 2227 background: rgba(255, 255, 255, 0.3); 2228} 2229<!-- END app snippet --> 2230</style> 2231 2232<!-- BEGIN app snippet: app-install-banner --><template id="apploy-app-install-banner-template"> 2233 <div 2234 class="apploy-app-install-banner" 2235 id="apploy-app-install-banner" 2236 > 2237 <button 2238 class="apploy-app-install-banner-close" 2239 id="apploy-app-install-banner-close" 2240 aria-label="Close banner" 2241 > 2242 â 2243 </button> 2244 <div class="apploy-app-install-banner-content"> 2245 2246 <div class="apploy-app-install-banner-text" id="apploy-app-install-banner-text"> 2247 <h3 class="apploy-app-install-banner-title" id="apploy-app-install-banner-title"> 2248 Get the app 2249 </h3> 2250 <p class="apploy-app-install-banner-subtitle" id="apploy-app-install-banner-subtitle"> 2251 Install our app to get personalized alerts, features and benefits. 2252 </p> 2253 </div> 2254 <button class="apploy-app-install-button" id="apploy-app-install-banner-button"> 2255 Install App 2256 </button> 2257 </div> 2258 </div> 2259 2260 2261 2262</template> 2263<!-- END app snippet --> 2264 2265
2265<script src="https://cdn.shopify.com/extensions/01a11578-0c14-7aef-87f5-441165ef51b0/apploy-mobile-app-builder-362/assets/apploy-deferred-attribution.js" defer></script>
2265 2266
2267<script src="https://cdn.shopify.com/extensions/01a11578-0c14-7aef-87f5-441165ef51b0/apploy-mobile-app-builder-362/assets/apploy-bridge.js" defer></script>
vendor: 1 bytes, line 2267
2267
2268<script 2269 src="/apps/apploy/assets/themes/common.min.js" 2270 defer 2271></script>
2271 2272<!-- BEGIN app snippet: app-manager -->
2272<script 2273 type="text/javascript" 2274> 2275 class ApployAppManager { 2276 constructor() { 2277 this.appBridge = 'ReactNativeWebView'; 2278 this.userAgent = navigator.userAgent; 2279 this.deferredPrompt = null; 2280 this.hiddenElements = []; 2281 this.banner = null; 2282 this.bannerButton = null; 2283 this.bannerQR = null; 2284 this.bannerText = null; 2285 this.bannerCloseButton = null; 2286 this.mainNav = null; 2287 this.themeConfig = null; 2288 this.init(); 2289 } 2290 2291 async init() { 2292 if (this.isMobileApp()) { 2293 await this.loadThemeConfig(); 2294 this.initializeMobileApp(); 2295 this.initializeAdditionalCode(); 2296 } else { 2297 if (this.isIOSSafari()) { 2298 document.body.classList.add('ios-safari'); 2299 } 2300 this.initializeInstallExperience(); 2301 } 2302 } 2303 2304 async loadThemeConfig() { 2305 this.themeConfig = JSON.parse(sessionStorage.getItem('apploy-theme-config')); 2306 if (!this.themeConfig) { 2307 const response = await fetch(`/apps/${window.apployApiSubpath}/assets/themes/theme-config.min.json`); 2308 const themeConfig = await response.json(); 2309 const themeKey = window.Shopify.theme.schema_name.toLowerCase().replaceAll(' ', '-'); 2310 if (themeConfig['themes'][themeKey]) { 2311 this.themeConfig = themeConfig['themes'][themeKey]; 2312 } else { 2313 this.themeConfig = themeConfig['themes']['default-theme']; 2314 } 2315 if(this.themeConfig){ 2316 sessionStorage.setItem('apploy-theme-config', JSON.stringify(this.themeConfig)); 2317 } 2318 } 2319 } 2320 2321 initializeAdditionalCode() { 2322 if (window.additionalCss) { 2323 try { 2324 const style = document.createElement('style'); 2325 style.textContent = window.additionalCss; 2326 document.head.appendChild(style); 2327 } catch (error) { 2328 console.error('Error applying additional CSS:', error); 2329 } 2330 } 2331 2332 2333 if (window.additionalJavascript) { 2334 try { 2335 const scriptFunction = new Function(window.additionalJavascript); 2336 scriptFunction(); 2337 } catch (error) { 2338 console.error('Error executing additional JavaScript:', error); 2339 } 2340 } 2341 } 2342 2343 sendDataToBridge(data) { 2344 window.apployBridge.sendData(data); 2345 } 2346 2347 sendDataToMobileAppBridge(data) { 2348 window.apployBridge.sendData(data); 2349 } 2350 2351 initializeMobileApp() { 2352 this.setSalesAttribution(); 2353 2354 2355 if (window.cssSelectorsToHide) { 2356 window.cssSelectorsToHide.split(',').forEach((selector) => { 2357 this.hiddenElements.push(selector); 2358 }); 2359 } 2360 if(this.themeConfig){ 2361 this.hiddenElements = [...this.hiddenElements, ...this.themeConfig.elements_to_hide]; 2362 } 2363 } 2364 2365 2366 setSalesChannelAttributeInCart() { 2367 let attributes = { 2368 "_SalesChannel": 'Apploy' 2369 }; 2370 2371 window.apployFetch(window.Shopify.routes.root + 'cart/update.js', { 2372 method: 'POST', 2373 headers: { 2374 'Content-Type': 'application/json' 2375 }, 2376 body: JSON.stringify({ 2377 attributes: attributes 2378 }) 2379 }) 2380 .catch(error => console.error('Error adding sales channel attribute to cart:', error)); 2381 } 2382 2383 setupMainNav() { 2384 const mainNavTemplate = document.getElementById('apploy-main-nav-template'); 2385 this.mainNav = document.getElementById('apploy-main-nav'); 2386 if (this.mainNav) { 2387 this.mainNav.style.display = 'flex'; 2388 document.body.style.paddingBottom = '70px'; 2389 } 2390 } 2391 2392 initializeInstallExperience() { 2393 if (!this.isMobileApp()) { 2394 this.setupInstallBanner(); 2395 } 2396 } 2397 2398 hasInstallURL() { 2399 return window.apployAppInstallURL && window.apployAppInstallURL !== ''; 2400 } 2401 2402 getInstallBannerQrWidth() { 2403 if (!this.bannerQR) { 2404 return 200; 2405 } 2406 2407 const img = this.bannerQR.querySelector('img'); 2408 const containerWidth = this.bannerQR.clientWidth; 2409 if (containerWidth > 0) { 2410 return Math.max(50, containerWidth - 28); 2411 } 2412 2413 return Number(img?.getAttribute('width')) || 200; 2414 } 2415 2416 buildSqrcQrImageUrl(presentPageUrl) { 2417 const apiKey = window.apploySuperQrCodeApiKey; 2418 const installUrl = window.apployAppInstallURL; 2419 const apiBase = window.apploySqrcApiDomain || 'https://api.sqrc.toolstr.com'; 2420 2421 if (!apiKey || !installUrl) { 2422 return null; 2423 } 2424 2425 const separator = installUrl.includes('?') ? '&' : '?'; 2426 const data = `${installUrl}${separator}ol=${encodeURIComponent(presentPageUrl)}`; 2427 const params = new URLSearchParams(); 2428 params.set('data', data); 2429 params.set('type', 'png'); 2430 params.set('key', apiKey); 2431 params.set('width', '200'); 2432 2433 return `${apiBase}/qrcode?${params.toString()}`; 2434 } 2435 2436 async updateInstallBannerQrCode() { 2437 const img = this.bannerQR?.querySelector('img[data-sqrc-enabled="true"]'); 2438 if (!img) { 2439 return; 2440 } 2441 2442 const requestUrl = this.buildSqrcQrImageUrl(window.location.href); 2443 if (!requestUrl) { 2444 return; 2445 } 2446 2447 if ( 2448 img.dataset.sqrcRequestUrl === requestUrl && 2449 img.complete &&
2450 img.naturalWidth > 0 2451 ) { 2452 return; 2453 } 2454 2455 img.dataset.sqrcRequestUrl = requestUrl; 2456 img.src = requestUrl; 2457 this.warmSqrcResponseCache(requestUrl); 2458 } 2459 2460 async warmSqrcResponseCache(requestUrl) { 2461 if (!('caches' in window)) { 2462 return; 2463 } 2464 2465 try { 2466 const cache = await caches.open('apploy-sqrc-v1'); 2467 if (await cache.match(requestUrl)) { 2468 return; 2469 } 2470 2471 const response = await fetch(requestUrl, { 2472 mode: 'no-cors', 2473 credentials: 'omit', 2474 }); 2475 await cache.put(requestUrl, response.clone()); 2476 } catch { 2477 // Cache warm is best-effort; display uses img.src directly 2478 } 2479 } 2480 2481 setupInstallBanner() { 2482 if(document.getElementById('apploy-app-install-banner')){ 2483 return; 2484 } 2485 const installBannerTemplate = document.getElementById('apploy-app-install-banner-template'); 2486 if (installBannerTemplate) { 2487 const clone = installBannerTemplate.content.cloneNode(true); 2488 document.body.appendChild(clone); 2489 } 2490 2491 this.banner = document.getElementById('apploy-app-install-banner'); 2492 if (this.isMobile()) { 2493 this.banner.classList.add(window.apployMobileBannerType); 2494 } 2495 this.bannerButton = document.getElementById('apploy-app-install-banner-button'); 2496 this.bannerQR = document.getElementById('apploy-app-install-banner-qr'); 2497 this.bannerText = document.getElementById('apploy-app-install-banner-text'); 2498 this.bannerCloseButton = document.getElementById('apploy-app-install-banner-close'); 2499 2500 this.banner.style.display = 'none'; 2501 this.bannerButton.style.display = 'none'; 2502 if (this.bannerQR) { 2503 this.bannerQR.style.display = 'none'; 2504 this.updateInstallBannerQrCode(); 2505 } 2506 2507 2508 if (this.bannerButton) { 2509 const clickHandler = () => { 2510 if (this.hasInstallURL()) { 2511 const deferredLinkId = sessionStorage.getItem('apploy-deferred-link-id'); 2512 if (deferredLinkId) { 2513 const installUrl = new URL(window.apployAppInstallURL, window.location.origin); 2514 installUrl.searchParams.set('apploy_deferred', deferredLinkId); 2515 installUrl.searchParams.set('ol', window.location.href); 2516 window.location.href = installUrl.toString(); 2517 return; 2518 } 2519 const installUrl = new URL(window.apployAppInstallURL, window.location.origin); 2520 installUrl.searchParams.set('ol', window.location.href); 2521 window.location.href = installUrl.toString(); 2522 } 2523 }; 2524 this.bannerButton.removeEventListener('click', clickHandler); 2525 this.bannerButton.addEventListener('click', clickHandler); 2526 } 2527 2528 if (this.bannerCloseButton) { 2529 const closeHandler = () => { 2530 this.hideInstallBanner(); 2531 sessionStorage.setItem('apploy-banner-closed', 'true'); 2532 }; 2533 this.bannerCloseButton.removeEventListener('click', closeHandler); 2534 this.bannerCloseButton.addEventListener('click', closeHandler); 2535 } 2536 if (window.apployAppInstallBannerEnabled) { 2537 setTimeout(() => { 2538 this.showInstallBanner(); 2539 }, 3000); 2540 } 2541 } 2542 2543 hideInstallBanner() { 2544 if (this.banner) { 2545 this.banner.style.display = 'none'; 2546 } 2547 } 2548 2549 showInstallBanner(options = {}) { 2550 const forceAdLanding = options.forceAdLanding === true; 2551 const hasAdAttribution = 2552 forceAdLanding || 2553 !!window.apployAdAttribution || 2554 !!sessionStorage.getItem('apploy-ad-attribution'); 2555 const isMobile = this.isMobile(); 2556 const isDesktop = !isMobile; 2557 const hasInstallURL = this.hasInstallURL(); 2558 const hasDeferredPrompt = !!this.deferredPrompt; 2559 const isIOSSafari = this.isIOSSafari(); 2560 const isAndroid = this.isAndroid(); 2561 2562 const showButton = 2563 (isMobile && hasInstallURL) || // Mobile browser with store URL 2564 (isAndroid && hasDeferredPrompt); // Android PWA 2565 2566 this.bannerButton.style.display = showButton ? 'block' : 'none'; 2567 2568 const shouldShowBanner = 2569 !this.isBannerClosed() && 2570 (hasAdAttribution || 2571 (isMobile && hasInstallURL) || // Mobile app install 2572 (isAndroid && hasDeferredPrompt) || // Android PWA 2573 (isDesktop && hasInstallURL)); // Desktop QR code 2574 2575 if (shouldShowBanner) { 2576 this.banner.style.display = 'flex'; 2577 2578 if (hasAdAttribution && this.bannerText) { 2579 const title = document.getElementById('apploy-app-install-banner-title'); 2580 const subtitle = document.getElementById('apploy-app-install-banner-subtitle'); 2581 if (title) { 2582 title.textContent = 'Continue in the app'; 2583 } 2584 if (subtitle) { 2585 subtitle.textContent = 2586 'Install our app to pick up where you left off from this ad.';
2587 } 2588 } 2589 2590 if (isMobile) { 2591 this.banner.classList.add(window.apployMobileBannerType); 2592 this.banner.style.bottom = `${window.apployMobileBannerBottomOffset}px`; 2593 } else { 2594 this.banner.classList.add(window.apployDesktopBannerPosition); 2595 this.banner.style.bottom = `${window.apployDesktopBannerBottomOffset}px`; 2596 } 2597 2598 if (isDesktop && this.bannerQR) { 2599 this.updateInstallBannerQrCode(); 2600 this.banner.addEventListener('mouseenter', () => { 2601 this.bannerQR.style.display = 'block'; 2602 this.bannerQR.style.animation = 'fadeIn 0.5s ease-in-out'; 2603 this.bannerQR.style.transform = 'translateY(0)'; 2604 }); 2605 this.banner.addEventListener('mouseleave', () => { 2606 this.bannerQR.style.display = 'none'; 2607 }); 2608 } 2609 } else { 2610 this.hideInstallBanner(); 2611 } 2612 } 2613 2614 isBannerClosed() { 2615 return sessionStorage.getItem('apploy-banner-closed') === 'true'; 2616 } 2617 2618 2619 setSalesAttribution() { 2620 this.setSalesChannelAttributeInCart(); 2621 2622 document.querySelectorAll('shopify-accelerated-checkout').forEach((acceleratedCheckout) => { 2623 if (!acceleratedCheckout.querySelector('input[name="properties[_SalesChannel]"]')) { 2624 const input = document.createElement('input'); 2625 input.type = 'hidden'; 2626 input.name = 'properties[_SalesChannel]'; 2627 input.value = 'Apploy'; 2628 acceleratedCheckout.appendChild(input); 2629 } 2630 2631 }); 2632 2633 const channelId = sessionStorage.getItem('apploy_ma_channel_id'); 2634 console.log("channel id:", channelId); 2635 if (!channelId) return; 2636 document.querySelectorAll('form[action="/cart"], form[action="/cart/add"], form[action="/cart/update"], form[action="/checkout"]').forEach((form) => { 2637 if (!form.querySelector('input[name="access_token"]')) { 2638 const input = document.createElement('input'); 2639 input.type = 'hidden'; 2640 input.name = 'access_token'; 2641 input.value = channelId; 2642 form.appendChild(input); 2643 } else { 2644 const input = form.querySelector('input[name="access_token"]'); 2645 if (input) { 2646 input.value = channelId; 2647 } 2648 } 2649 }); 2650 } 2651 2652 disableSelect() { 2653 document.body.style.userSelect = 'none'; 2654 document.body.style.webkitUserSelect = 'none'; 2655 document.body.style.msUserSelect = 'none'; 2656 } 2657 2658 disableBounce() { 2659 document.body.style.overscrollBehavior = 'none'; 2660 } 2661 2662 hideElement(element) { 2663 if (element) element.style.display = 'none'; 2664 } 2665 2666 2667 2668 isMobile() { 2669 return /Android|iPhone|iPad|iPod/i.test(navigator.userAgent) || this.isIOS(); 2670 } 2671 2672 isAndroid() { 2673 return /Android/i.test(navigator.userAgent); 2674 } 2675 2676 isIOS() { 2677 return ( 2678 /iPad|iPhone|iPod/.test(navigator.userAgent) || 2679 (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1) 2680 ); 2681 } 2682 2683 isSafari() { 2684 const ua = navigator.userAgent; 2685 return ( 2686 /^((?!chrome|android).)*safari/i.test(ua) && 2687 !ua.includes("CriOS") && 2688 !ua.includes("FxiOS") 2689 ); 2690 } 2691 2692 isIOSSafari() { 2693 return this.isIOS() && this.isSafari(); 2694 } 2695 2696 isMobileApp() { 2697 2698 console.log("isMobileApp false"); 2699 return false; 2700 } 2701 2702 2703 async handleNotificationPermission() { 2704 try { 2705 let permission = Notification.permission; 2706 if (permission === 'default') { 2707 permission = await Notification.requestPermission(); 2708 } 2709 2710 let currentToken = null; 2711 let channelType = null; 2712 if (permission === 'granted') { 2713 currentToken = await window.apployFirebaseGetToken(window.apployFirebaseMessaging, { 2714 vapidKey: window.apployFirebaseVapidKey, 2715 serviceWorkerRegistration: window.apploySwRegistration, 2716 }); 2717 2718 if (currentToken) { 2719 if (window.apployFCMToken !== currentToken) { 2720 window.apployEventsManager.capturePushToken(currentToken); 2721 } 2722 } else { 2723 console.log('No registration token available. Failed to generate one.'); 2724 } 2725 } else { 2726 console.log('Notification permission denied'); 2727 window.apployEventsManager.updateEndpoint({ 2728 optOut: 'ALL', 2729 userId: window.apployCustomer?.id, 2730 category: 'PushNotification', 2731 channelType: channelType, 2732 }); 2733 } 2734 } catch (err) { 2735 console.error('An error occurred while setting up push notifications:', err); 2736 } 2737 } 2738 2739 } 2740</script>
2740 2741<!-- END app snippet --> 2742<!-- BEGIN app snippet: event-manager -->
2742<script 2743 type="text/javascript" 2744> 2745 class ApployEventsManager { 2746 constructor() { 2747 this.event_key = 'apploy_user_event'; 2748 this.storageKeys = { 2749 cartProducts: 'apploy_cart_products', 2750 purchased: 'apploy_purchased', 2751 lastCompletedCheckoutTimestamp: 'apploy_last_completed_checkout_timestamp', 2752 searchedQuery: 'apploy_searched_query', 2753 lastViewedProduct: 'apploy_last_viewed_product', 2754 lastViewedCollection: 'apploy_last_viewed_collection', 2755 }; 2756 const parentObj = this; 2757 if (window.apployAppManager.isMobileApp()) { 2758 this.refreshCartCount(); 2759 this.sendCustomerData(window.apployCustomer); 2760 // Listen to localStorage changes 2761 window.addEventListener('storage', function (event) { 2762 if (event.key === parentObj.event_key) { 2763 try { 2764 const parsedValue = JSON.parse(event.newValue); 2765 parentObj.processEvent(parsedValue); 2766 } catch (error) { 2767 // console.error("Failed to parse apploy_ma_event value", error); 2768 } 2769 } 2770 }); 2771 } 2772 } 2773 2774 trackSession() { 2775 const sessionKey = 'amplifySessionId'; 2776 let sessionId = sessionStorage.getItem(sessionKey); 2777 2778 if (!sessionId) { 2779 sessionId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; 2780 sessionStorage.setItem(sessionKey, sessionId); 2781 const secondsTimestamp = Math.floor(new Date().getTime() / 1000) * 1000; 2782 window.Amplify.Analytics.record({ 2783 name: '_session.start', 2784 attributes: { 2785 sessionId: sessionId, 2786 timestamp: secondsTimestamp, 2787 }, 2788 }); 2789 } 2790 2791 return sessionId; 2792 } 2793 2794 // Existing methods 2795 recordEvent(eventData) { 2796 const clonedEventData = { 2797 name: eventData.name, 2798 attributes: { 2799 ...eventData.data.attributes, 2800 apployAppId: window.apployAppId, 2801 }, 2802 metrics: eventData.data.metrics, 2803 }; 2804 console.log('recordEvent', clonedEventData); 2805 if (window.Amplify && window.Amplify.Analytics) { 2806 window.Amplify.Analytics.record(clonedEventData); 2807 } else { 2808 console.log('recordEvent failed: Amplify not setup'); 2809 } 2810 } 2811 2812 updateEndpoint(properties) { 2813 properties = { 2814 ...properties, 2815 attributes: { 2816 Surface: ['PWA'], 2817 Platform: window.apployAppManager.isIOS() ? ['IOS'] : ['ANDROID'], 2818 apployAppId: [window.apployAppId], 2819 }, 2820 }; 2821 if (window.Amplify && window.Amplify.Analytics) { 2822 window.Amplify.Analytics.updateEndpoint(properties); 2823 } else { 2824 console.log('updateEndpoint failed: Amplify not setup'); 2825 } 2826 } 2827 2828 /** Bound on the cart lookup that enriches cart events. */ 2829 CART_FETCH_TIMEOUT_MS = 1000; 2830 2831 async processEvent(event, storage_key = null) { 2832 try { 2833 if (!storage_key) { 2834 storage_key = this.event_key; 2835 } 2836 // Parse event if it's a string 2837 const eventData = typeof event === 'string' ? JSON.parse(event) : event; 2838 const { name, data } = eventData.eventData; 2839 if (['AddedToCart', 'RemovedFromCart', 'CompletedCheckout'].includes(eventData.eventData.name)) { 2840 this.refreshCartCount(); 2841 window.apployAppManager.setSalesAttribution(); 2842 } 2843 if (['AddedToCart', 'RemovedFromCart'].includes(eventData.eventData.name)) { 2844 // The pixel only sees the line that changed, so an abandoned-cart 2845 // notification could say "you left 1 item" to someone with five in 2846 // their cart. /cart.js is the only place the real totals live, and it 2847 // is already being fetched here â this just waits for the answer. 2848 await this.attachCartTotals(data); 2849 } 2850 let lineItems = []; 2851 if ( 2852 data?.attributes?.lineItems && 2853 data?.attributes?.lineItems.length > 0 && 2854 data?.attributes?.lineItems[0]?.id 2855 ) { 2856 lineItems = JSON.parse(JSON.stringify(data?.attributes?.lineItems)); 2857 delete data?.attributes?.lineItems; 2858 } 2859 if (eventData.eventData.name === 'CompletedCheckout') { 2860 try { 2861 if (eventData.eventData.data.attributes.lineItems) { 2862 delete eventData.eventData.data.attributes.lineItems; 2863 } 2864 } catch (error) { 2865 console.error('Error processing event:', error); 2866 } 2867 } 2868 2869 // processEvent will be called from storage event listener for mobile app 2870 if (window.apployAppManager.isMobileApp()) { 2871 console.log('sendDataToBridge.eventData', eventData); 2872 window.apployAppManager.sendDataToBridge(eventData); 2873 } 2874 2875 2876 console.log('eventData.eventData.name', eventData.eventData.name); 2877 if (eventData.eventData.name === 'CompletedCheckout') { 2878 const that = this; 2879 if (lineItems) {
2880 lineItems.forEach((item) => { 2881 const lineItemEvent = JSON.stringify({ 2882 type: 'event', 2883 eventData: { 2884 name: 'PurchasedLineItem', 2885 data: { 2886 attributes: { 2887 orderId: eventData.eventData.data.attributes.orderId || '', 2888 productId: item.productId, 2889 variantId: item.variantId, 2890 currency: eventData.eventData.data.attributes.currencyCode, 2891 productTitle: item.productTitle, 2892 variantTitle: item.variantTitle, 2893 lineItemId: item.id || Date.now(), 2894 }, 2895 metrics: { 2896 amount: item.amount, 2897 quantity: item.quantity, 2898 timestamp: eventData.eventData.data.metrics.timestamp, 2899 }, 2900 }, 2901 }, 2902 }); 2903 console.log('lineItemEvent', lineItemEvent); 2904 this.processEvent(lineItemEvent); 2905 2906 }); 2907 } 2908 2909 // clone and transform CompletedCheckout event data to monetization event data 2910 const monetizationEvent = JSON.stringify({ 2911 type: 'event', 2912 eventData: { 2913 name: '_monetization.purchase', 2914 data: { 2915 attributes: { 2916 _currency: eventData.eventData.data.attributes.currencyCode, 2917 }, 2918 metrics: { 2919 _item_price: eventData.eventData.data.metrics.totalAmount, 2920 _quantity: eventData.eventData.data.metrics.quantity, 2921 timestamp: eventData.eventData.data.metrics.timestamp, 2922 }, 2923 }, 2924 }, 2925 }); 2926 console.log('monetizationEvent', monetizationEvent); 2927 setTimeout(() => { 2928 that.processEvent(monetizationEvent); 2929 }, 10); 2930 2931 // clone and transform CompletedCheckout event data to monetization event data 2932 const monetizationEventApptap = JSON.stringify({ 2933 type: 'event', 2934 eventData: { 2935 name: 'Purchase', 2936 data: { 2937 attributes: { 2938 currency: eventData.eventData.data.attributes.currencyCode, 2939 orderId: eventData.eventData.data.attributes.orderId || '', 2940 }, 2941 metrics: { 2942 amount: eventData.eventData.data.metrics.totalAmount, 2943 quantity: eventData.eventData.data.metrics.quantity, 2944 timestamp: eventData.eventData.data.metrics.timestamp, 2945 }, 2946 }, 2947 }, 2948 }); 2949 console.log('monetizationEventApptap', monetizationEventApptap); 2950 setTimeout(() => { 2951 that.processEvent(monetizationEventApptap); 2952 }, 20); 2953 } 2954 } catch (error) { 2955 console.error('Error processing event:', error); 2956 } 2957 } 2958 2959 sendCustomerData(customerData) { 2960 window.apployAppManager.sendDataToBridge({ 2961 customerData, 2962 type: 'customer', 2963 }); 2964 } 2965 2966 sendCartCount(itemCount) { 2967 window.apployAppManager.sendDataToBridge({ itemCount, type: 'cart' }); 2968 } 2969 2970 sendCartData(cart) { 2971 const items = (cart.items || []).map((item) => ({ 2972 id: item.id, 2973 url: item.url, 2974 quantity: item.quantity, 2975 imageUrl: item.image || (item.featured_image && item.featured_image.url) || null, 2976 productTitle: item.product_title, 2977 variantTitle: item.variant_title || 'Default Title', 2978 price: item.price, 2979 })); 2980 window.apployAppManager.sendDataToBridge({ 2981 type: 'cart', 2982 itemCount: cart.item_count, 2983 totalPrice: cart.total_price, 2984 items, 2985 }); 2986 } 2987 2988 /** 2989 * Adds the whole cart's item count and value to a cart event. 2990 * 2991 * This sits on the critical path of event delivery, so it is bounded: a 2992 * slow cart costs the cart tokens, never the event. Without the timeout a 2993 * hanging /cart.js would hold the AddedToCart event until the shopper
2994 * navigated away, and that event is what triggers the abandoned-cart 2995 * journey â losing it loses the notification entirely. 2996 */ 2997 async attachCartTotals(data) { 2998 if (!data || typeof data !== 'object') { 2999 return; 3000 } 3001 if (!data.attributes || typeof data.attributes !== 'object') { 3002 data.attributes = {}; 3003 } 3004 3005 const controller = 3006 typeof AbortController !== 'undefined' ? new AbortController() : null; 3007 const timer = controller 3008 ? setTimeout(() => controller.abort(), this.CART_FETCH_TIMEOUT_MS) 3009 : null; 3010 3011 try { 3012 const response = await window.apployFetch( 3013 '/cart.js', 3014 controller ? { signal: controller.signal } : undefined, 3015 ); 3016 if (!response.ok) return; 3017 const cart = await response.json(); 3018 3019 if (typeof cart.item_count === 'number') { 3020 data.attributes.cartItemCount = cart.item_count; 3021 } 3022 if (typeof cart.total_price === 'number') { 3023 // Shopify's JS cart API reports money in the currency's minor unit, 3024 // so this is a /100 for the two-decimal currencies we have seen. 3025 // UNVERIFIED for zero-decimal currencies (JPY, KRW) â the currency is 3026 // sent alongside so a correction needs no new data. 3027 data.attributes.cartTotal = cart.total_price / 100; 3028 } 3029 if (typeof cart.currency === 'string') { 3030 data.attributes.cartCurrency = cart.currency; 3031 } 3032 } catch (error) { 3033 // Includes the abort. Non-fatal by design: the tokens fall back and the 3034 // event still ships. 3035 console.error('Error attaching cart totals:', error); 3036 } finally { 3037 if (timer) clearTimeout(timer); 3038 } 3039 } 3040 3041 refreshCartCount() { 3042 try { 3043 window 3044 .apployFetch('/cart.js') 3045 .then((response) => (response.ok ? response.json() : Promise.reject(response.statusText))) 3046 .then((data) => { 3047 if (data.item_count >= 0) { 3048 if (window.apployAppManager.themeConfig) { 3049 window.apployHandleCartUpdate(data.item_count); 3050 } 3051 3052 if (document.getElementById('apploy-cart-badge')) { 3053 document.getElementById('apploy-cart-badge').textContent = data.item_count ? data.item_count : ''; 3054 } else { 3055 this.sendCartData(data); 3056 } 3057 } 3058 }) 3059 .catch((error) => console.error('Error refreshing cart count:', error)); 3060 } catch (error) { 3061 console.error('Error refreshing cart count:', error); 3062 } 3063 } 3064 } 3065</script>
3065 3066<!-- END app snippet -->
3067<script> 3068 window.apployAppId = `ba037fbd-130c-4dea-bece-adfae6a77520`; 3069 window.apployShopDomain = window.Shopify.shop; 3070 window.apployBackendUrl = `https://apploy.toolstr.com`; 3071 window.apployIsMobileApp = false; 3072 window.apployFetch = window.fetch; 3073 window.apployAppInstallURL = ""; 3074 window.apploySuperQrCodeApiKey = ""; 3075 window.apploySqrcApiDomain = 'https://api.sqrc.toolstr.com'; 3076 window.apployAppInstallBannerEnabled = false; 3077 window.apployMobileBannerType = "floating"; 3078 window.apployDesktopBannerPosition = "bottom-left"; 3079 window.apployMobileBannerBottomOffset = 100; 3080 window.apployDesktopBannerBottomOffset = 20; 3081 window.cssSelectorsToHide = "footer"; 3082 window.additionalJavascript = ""; 3083 window.additionalCss = ""; 3084 window.apployFCMToken = localStorage.getItem('apploy_fcm_token') || null; 3085 window.apployCustomer = {"id":null}; 3086 window.apployApiSubpath = `apploy`; 3087 3088 3089 document.addEventListener('DOMContentLoaded', () => { 3090 if (typeof ApployAppManager !== 'undefined') { 3091 window.apployAppManager = new ApployAppManager(); 3092 } else { 3093 console.error('ApployAppManager class is not loaded'); 3094 } 3095 if (typeof ApployEventsManager !== 'undefined') { 3096 window.apployEventsManager = new ApployEventsManager(); 3097 } else { 3098 console.error('ApployEventsManager class is not loaded'); 3099 } 3100 }); 3101</script>
3101 3102 3103 3104 3105 3106 3107<!-- END app block --><!-- BEGIN app block: shopify://apps/seal-subscriptions/blocks/subscription-script-append/13b25004-a140-4ab7-b5fe-29918f759699 -->
3107<script defer="defer"> 3108 /** SealSubs loader,version number: 2.0 */ 3109 (function(){ 3110 var loadScript=function(a,b){var c=document.createElement("script");c.setAttribute("defer", "defer");c.type="text/javascript",c.readyState?c.onreadystatechange=function(){("loaded"==c.readyState||"complete"==c.readyState)&&(c.onreadystatechange=null,b())}:c.onload=function(){b()},c.src=a,document.getElementsByTagName("head")[0].appendChild(c)}; 3111 // Set variable to prevent the other loader from requesting the same resources 3112 window.seal_subs_app_block_loader = true; 3113 appendScriptUrl('nsmy7n-ge.myshopify.com'); 3114 3115 // get script url and append timestamp of last change 3116 function appendScriptUrl(shop) { 3117 var timeStamp = Math.floor(Date.now() / (1000*1*1)); 3118 var timestampUrl = 'https://app.sealsubscriptions.com/shopify/public/status/shop/'+shop+'.js?'+timeStamp; 3119 loadScript(timestampUrl, function() { 3120 // append app script 3121 if (typeof sealsubscriptions_settings_updated == 'undefined') { 3122 sealsubscriptions_settings_updated = 'default-by-script'; 3123 } 3124 3125 var locale = ''; 3126 if (typeof window !== 'undefined' && 3127 typeof window.Shopify !== 'undefined' && 3128 typeof window.Shopify.locale !== 'undefined' 3129 ) { 3130 locale = window.Shopify.locale; 3131 } 3132 3133 var scriptUrl = "https://cdn-app.sealsubscriptions.com/shopify/public/js/sealsubscriptions-main.js?shop="+shop+"&"+sealsubscriptions_settings_updated+`&locale=${locale}`; 3134 loadScript(scriptUrl, function(){}); 3135 }); 3136 } 3137 })(); 3138 3139 var SealSubsScriptAppended = true; 3140 3141</script>
3141 3142 3143<!-- END app block --><!-- BEGIN app block: shopify://apps/microsoft-clarity/blocks/clarity_js/31c3d126-8116-4b4a-8ba1-baeda7c4aeea -->
3144<script type="text/javascript"> 3145 (function (c, l, a, r, i, t, y) { 3146 c[a] = c[a] || function () { (c[a].q = c[a].q || []).push(arguments); }; 3147 t = l.createElement(r); t.async = 1; t.src = "https://www.clarity.ms/tag/" + i + "?ref=shopify"; 3148 y = l.getElementsByTagName(r)[0]; y.parentNode.insertBefore(t, y); 3149 3150 c.Shopify.loadFeatures([{ name: "consent-tracking-api", version: "0.1" }], error => { 3151 if (error) { 3152 console.error("Error loading Shopify features:", error); 3153 return; 3154 } 3155 3156 c[a]('consentv2', { 3157 ad_Storage: c.Shopify.customerPrivacy.marketingAllowed() ? "granted" : "denied", 3158 analytics_Storage: c.Shopify.customerPrivacy.analyticsProcessingAllowed() ? "granted" : "denied", 3159 source: 101, 3160 }); 3161 }); 3162 3163 l.addEventListener("visitorConsentCollected", function (e) { 3164 c[a]('consentv2', { 3165 ad_Storage: e.detail.marketingAllowed ? "granted" : "denied", 3166 analytics_Storage: e.detail.analyticsAllowed ? "granted" : "denied", 3167 source: 101, 3168 }); 3169 }); 3170 })(window, document, "clarity", "script", "xnsp1vmz70"); 3171</script>
3171 3172 3173 3174 3175<!-- END app block --><!-- BEGIN app block: shopify://apps/parkour-facebook-pixel/blocks/threasury_pixel/f23b2ffe-4c53-446e-ad3a-7976ffbee5c2 --> 3176
3177<script> 3178 (function () { 3179 const params = new URLSearchParams(window.location.search); 3180 const hasBuilderMode = params.get('eventBuilderMode') === 'true'; 3181 const encodedSelector = params.get('selector'); 3182 3183 if (hasBuilderMode) { 3184 sessionStorage.setItem('eventBuilderMode', '1'); 3185 } 3186 3187 const fromSession = sessionStorage.getItem('eventBuilderMode'); 3188 3189 // â Store the decoded selector globally 3190 if (encodedSelector) { 3191 try { 3192 const decoded = decodeURIComponent(encodedSelector); 3193 sessionStorage.setItem('eventBuilderSelector', decoded); 3194 window.extractedSelector = decoded; 3195 console.log('[Parkour] Builder selector loaded:', decoded); 3196 } catch (err) { 3197 console.warn('[Parkour] Failed to decode selector:', err); 3198 } 3199 } 3200 3201 // â Load eventBuilder.js if in builder mode 3202 if (hasBuilderMode || fromSession) { 3203 const s = document.createElement('script'); 3204 s.src = "https://cdn.shopify.com/extensions/01a08191-1bc5-79e2-bd0a-2c7e134c9184/parkour-pixel-111/assets/eventBuilder.js"; 3205 s.async = true; 3206 document.head.appendChild(s); 3207 } 3208 })(); 3209</script>
3209 3210
3211<script> 3212 document.addEventListener('DOMContentLoaded', function () { 3213 // Metafield emitted via | json (with </ escaped): raw template-literal 3214 // interpolation broke this whole block when the value contained a backtick or 3215 // quote, and a closing script tag inside a value was stored XSS. 3216 // base64_encode instead of | json: Shopify's json filter REFUSES multiline 3217 // metafields (emits {"error":"json not allowed for this object"}), and base64 3218 // output can never contain quotes/backslashes/closing tags â injection-proof 3219 // for every metafield type. base64_encode encodes the UTF-8 BYTES, and atob() 3220 // alone reads them back as Latin-1 â silent mojibake for any non-ASCII event 3221 // name/trigger (JSON.parse still succeeds!). TextDecoder restores real UTF-8; 3222 // for pure-ASCII values it is an exact identity. 3223 const metaData = (() => { try { return new TextDecoder().decode(Uint8Array.from(atob(''), (c) => c.charCodeAt(0))); } catch (e) { return ''; } })(); 3224 try { 3225 // custom_events is a json-TYPE metafield, so `| json` can emit a real array â 3226 // handle array, plain-JSON string, and the legacy base64 shape (mirrors 3227 // safeParseMetaData) so the tracker loads on a fresh visitor's FIRST page view. 3228 let customEvents = Array.isArray(metaData) ? metaData : null; 3229 if (!customEvents && metaData) { 3230 try { customEvents = JSON.parse(metaData); } 3231 catch (e1) { 3232 try { customEvents = JSON.parse(decodeURIComponent(atob(metaData))); } 3233 catch (e2) { customEvents = null; } 3234 } 3235 } 3236 const fromLocal = localStorage.getItem('Parkour_custom_events_fb'); 3237 // Only load the tracker when there are actually events (an empty [] used to 3238 // still boot the MutationObserver machinery on every page). 3239 const hasCustomEvents = (Array.isArray(customEvents) && customEvents.length > 0) || (fromLocal && fromLocal !== '[]'); 3240 if (hasCustomEvents) { 3241 const script = document.createElement('script'); 3242 script.src = "https://cdn.shopify.com/extensions/01a08191-1bc5-79e2-bd0a-2c7e134c9184/parkour-pixel-111/assets/customTracker.js"; 3243 script.async = true; 3244 document.head.appendChild(script); 3245 } 3246 } catch (e) { 3247 console.warn('[Parkour] customTracker.js load failed', e); 3248 } 3249 }); 3250</script>
3250 3251
3252<script> 3253const FacebookTracker = { 3254 config: { 3255 debug: localStorage.getItem('tdb') || null, 3256 storageKeys: { 3257 PREFERRED_ID: 'Parkour_preferred_id_fb', 3258 AD_INFO: 'Parkour_ad_info_fb', 3259 AD_LOGS: 'Parkour_ad_logs_fb', 3260 PIXEL_STATUS: 'Parkour_pixel_app_status_fb', 3261 PIXEL_CONFIG: 'Parkour_pixel_config_fb', 3262 CUSTOMER_HASHED: 'Parkour_Customer_params_fb', 3263 CUSTOM_EVENTS: 'Parkour_custom_events_fb', 3264 WEB_PIXEL: 'Parkour_web_pixel_fb', 3265 EXTERNAL_ID: 'Parkour_external_id', 3266 PAGE_DATA: 'Parkour_page_data', 3267 FBC: 'Parkour_fbc', 3268 FBP: 'Parkour_fbp', 3269 }, 3270 fbParams: { 3271 standard: ['fbclid', 'utm_campaign', 'ad_name', 'utm_source', 'adset_name', 'campaign_id', 'adset_id', 'ad_id', 'utm_id'] 3272 } 3273 }, 3274 3275 utils: { 3276 log(message, data = null) { 3277 if (FacebookTracker.config.debug === null) return; 3278 console.log(`[Facebook Tracker] ${message}`, data); 3279 }, 3280 stripDiacritics(str) { 3281 return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); 3282 }, 3283 normalizeField(value, field) { 3284 if (!value) return ''; 3285 let v = String(value).trim().toLowerCase(); 3286 switch (field) { 3287 case 'email': 3288 return v; 3289 case 'phone': 3290 return v.replace(/[^0-9]/g, ''); 3291 case 'city': 3292 return FacebookTracker.utils.stripDiacritics(v).replace(/[^a-z]/g, ''); 3293 case 'state': 3294 v = FacebookTracker.utils.stripDiacritics(v); 3295 v = v.replace(/\b(county|province|region|state|district)\b/g, ''); 3296 return v.replace(/[^a-z]/g, ''); 3297 case 'country': 3298 v = FacebookTracker.utils.stripDiacritics(v).replace(/[^a-z]/g, ''); 3299 return v.length === 2 ? v : ''; 3300 case 'zipCode': 3301 return v.replace(/[\s\-]/g, ''); 3302 default: 3303 return FacebookTracker.utils.stripDiacritics(v).replace(/[^a-z]/g, ''); 3304 } 3305 }, 3306 async HashString(str) { 3307 if (!str) return ''; 3308 const encoder = new TextEncoder(); 3309 const data = encoder.encode(str); 3310 const hash = await crypto.subtle.digest('SHA-256', data); 3311 return Array.from(new Uint8Array(hash)).map(b => b.toString(16).padStart(2, '0')).join(''); 3312 }, 3313 retry: async (fn, attempts = 3) => { 3314 for (let i = 0; i < attempts; i++) { 3315 try { return await fn(); } catch (e) { 3316 if (i === attempts - 1) throw e; 3317 await new Promise(r => setTimeout(r, (i + 1) * 1000)); 3318 } 3319 } 3320 }, 3321 generateId(prefix = 'CID') { 3322 return `${prefix}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; 3323 }, 3324 getCookie(name) { 3325 const match = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`)); 3326 return match ? match[2] : null; 3327 }, 3328 setCookie(name, value, days = 90) { 3329 const expires = new Date(Date.now() + days * 864e5).toUTCString(); 3330 document.cookie = `${name}=${value}; expires=${expires}; path=/; SameSite=Lax`; 3331 }, 3332 getUrlParam(name) { 3333 return new URLSearchParams(window.location.search).get(name); 3334 }, 3335 getRawUrlParam(name) { 3336 // Returns the param EXACTLY as it appears in the URL, without percent-decoding. 3337 // URLSearchParams.get() decodes %XX escapes and converts "+" to a space, which 3338 // mangles fbclid values and makes Meta flag a "modified fbclid value in fbc". 3339 const match = window.location.search.match(new RegExp('[?&]' + name + '=([^&#]*)')); 3340 return match ? match[1] : null; 3341 }, 3342 getFormattedTimestamp() { 3343 const now = new Date(); 3344 return { timestamp: now.toISOString(), formattedDate: now.toLocaleString() }; 3345 }, 3346 safeParseMetaData(data) { 3347 // Two writer generations exist in the wild: the service app stores RAW JSON 3348 // (json-type metafields), older installs stored btoa(encodeURIComponent(JSON)) 3349 // in multiline string metafields. Try both â and NEVER throw: any third/corrupt 3350 // shape must degrade to null, because a throw here aborted the rest of init() 3351 // (fbc/fbp capture, cart attribution) for the whole shop. 3352 try { 3353 return JSON.parse(data); 3354 } catch (e) { 3355 try { 3356 return JSON.parse(decodeURIComponent(atob(data))); 3357 } catch (e2) { 3358 FacebookTracker.utils.log('Unparseable metafield shape â skipping', e2); 3359 return null; 3360 } 3361 } 3362 } 3363 }, 3364 3365 storage: { 3366 set(key, value) { 3367 localStorage.setItem(key, typeof value === 'string' ? value : JSON.stringify(value)); 3368 }, 3369 get(key, type = 'json') { 3370 const val = localStorage.getItem(key); 3371 if (!val) return null; 3372 return type === 'string' ? val : JSON.parse(val); 3373 }, 3374 remove(key) { 3375 localStorage.removeItem(key); 3376 }, 3377 appendToArray(key, item) { 3378 const arr = FacebookTracker.storage.get(key) || []; 3379 FacebookTracker.storage.set(key, [...arr, item]); 3380 } 3381 }, 3382 3383 tracking: {
3384 async initializeExternalId() { 3385 let id = FacebookTracker.storage.get(FacebookTracker.config.storageKeys.EXTERNAL_ID, 'string'); 3386 if (!id) { 3387 id = FacebookTracker.utils.generateId(); 3388 FacebookTracker.storage.set(FacebookTracker.config.storageKeys.EXTERNAL_ID, id); 3389 } 3390 return id; 3391 }, 3392 3393 isFbcExpired(fbc) { 3394 if (!fbc) return true; 3395 const parts = fbc.split('.'); 3396 if (parts.length < 4) return true; 3397 const timestamp = parseInt(parts[2], 10); 3398 if (isNaN(timestamp)) return true; 3399 const sevenDaysMs = 7 * 24 * 60 * 60 * 1000; 3400 return (Date.now() - timestamp) > sevenDaysMs; 3401 }, 3402 3403 handleFbc() { 3404 // Read the fbclid EXACTLY as it appears in the URL (no decoding â that is what 3405 // produced the "modified fbclid value in fbc" warning) and the current _fbc cookie. 3406 let fbclid = FacebookTracker.utils.getRawUrlParam('fbclid'); 3407 // Recovery for %XX-RE-ENCODED fbclids (email gateways / redirectors): decode 3408 // exactly once, and only when the result is a clean base64url click id â this 3409 // restores the original value and cannot reintroduce the +âspace corruption 3410 // (decodeURIComponent leaves '+' untouched). 3411 if (fbclid && fbclid.indexOf('%') !== -1) { 3412 try { 3413 const decoded = decodeURIComponent(fbclid); 3414 if (/^[A-Za-z0-9_-]+$/.test(decoded)) fbclid = decoded; 3415 } catch (e) { /* malformed escape â keep raw */ } 3416 } 3417 const existing = FacebookTracker.utils.getCookie('_fbc'); 3418 3419 if (fbclid && fbclid != 'fbclid') { 3420 // A fbclid in the URL is a fresh click. If a _fbc cookie already exists for THIS 3421 // same fbclid (e.g. set by Meta's own pixel), keep it as-is â it carries the 3422 // authoritative timestamp/subdomain index. Only (re)build for a NEW click, which 3423 // also refreshes the timestamp and prevents sending an expired fbclid later. 3424 // Compare the click-id SEGMENT, not the string tail: Meta's fbevents.js writes a 3425 // fifth "appendix" segment (fb.1.<ts>.<fbclid>.AQYCAQIB), so endsWith() saw a 3426 // "different" click and overwrote Meta's cookie on every ad landing. 3427 if (existing && existing.split('.')[3] === fbclid) { 3428 FacebookTracker.storage.set(FacebookTracker.config.storageKeys.FBC, existing); 3429 return existing; 3430 } 3431 const fbc = `fb.1.${Date.now()}.${fbclid}`; 3432 FacebookTracker.utils.setCookie('_fbc', fbc); 3433 FacebookTracker.storage.set(FacebookTracker.config.storageKeys.FBC, fbc); 3434 return fbc; 3435 } 3436 // No fresh fbclid: reuse a stored/cookie fbc only if it is not expired; otherwise 3437 // clear it from both stores so we never send an expired fbclid (its localStorage 3438 // copy has no natural expiry). 3439 const stored = FacebookTracker.storage.get(FacebookTracker.config.storageKeys.FBC, 'string'); 3440 const cookie = FacebookTracker.utils.getCookie('_fbc'); 3441 const fbc = stored || cookie; 3442 if (fbc && !FacebookTracker.tracking.isFbcExpired(fbc)) { 3443 FacebookTracker.storage.set(FacebookTracker.config.storageKeys.FBC, fbc); 3444 return fbc; 3445 } 3446 // Clear expired fbc 3447 FacebookTracker.storage.remove(FacebookTracker.config.storageKeys.FBC); 3448 FacebookTracker.utils.setCookie('_fbc', '', -1); 3449 return null; 3450 }, 3451 3452 handleFbp() { 3453 let fbp = FacebookTracker.utils.getCookie('_fbp'); 3454 if (!fbp) { 3455 fbp = `fb.1.${Date.now()}.${Math.floor(Math.random() * 1e9)}`; 3456 FacebookTracker.utils.setCookie('_fbp', fbp); 3457 } 3458 FacebookTracker.storage.set(FacebookTracker.config.storageKeys.FBP, fbp); 3459 return fbp; 3460 }, 3461 3462 collectAdParameters() { 3463 const adData = FacebookTracker.storage.get(FacebookTracker.config.storageKeys.AD_INFO) || {}; 3464 let hasNew = false; 3465 adData.facebook = adData.facebook || {}; 3466 3467 FacebookTracker.config.fbParams.standard.forEach(param => { 3468 const value = FacebookTracker.utils.getUrlParam(param); 3469 if (value && adData.facebook[param] !== value) { 3470 adData.facebook[param] = value; 3471 hasNew = true; 3472 } 3473 }); 3474 3475 adData.referrer = document.referrer; 3476 if (hasNew) FacebookTracker.storage.set(FacebookTracker.config.storageKeys.AD_INFO, adData); 3477 return adData; 3478 }, 3479 3480 collectPageData() { 3481 return { 3482 product_name: null, 3483 selected_variant: null, 3484 product_id: null, 3485 variant_id: null, 3486 collection_ids: [], 3487 tags: null, 3488 page_type: "index", 3489 currency: "SGD", 3490 price: null 3491 } 3492 }, 3493 3494 logAdData(adParams) { 3495 if (!adParams?.facebook || Object.keys(adParams.facebook).length === 0) return; 3496 const entry = { 3497 ...adParams, 3498 url: window.location.href, 3499 referrer: document.referrer, 3500 ...FacebookTracker.utils.getFormattedTimestamp() 3501 }; 3502 FacebookTracker.storage.appendToArray(FacebookTracker.config.storageKeys.AD_LOGS, entry); 3503 FacebookTracker.utils.log('Ad data logged', entry); 3504 }, 3505 3506 async hashCustomer() {
3507 try { 3508 const customerData = { 3509 email: null, 3510 first_name: null, 3511 last_name: null, 3512 phone: null, 3513 default_address: null 3514 }; 3515 3516 // Geo context: only fetched when Shopify's own customer data is missing 3517 // fields, only when marketing consent is not denied, and cached for 24h. 3518 // Previously BOTH endpoints were hit on EVERY page view for EVERY visitor â 3519 // ipinfo's unauthenticated tier rate-limits, and shipping visitor IPs to a 3520 // third party regardless of consent state is a compliance exposure. 3521 let browsingGeo = {}, ipinfoGeo = {}; 3522 const addrPeek = customerData.default_address; 3523 const needsGeo = !(addrPeek?.province_code || addrPeek?.province) || !addrPeek?.city || !addrPeek?.country_code || !addrPeek?.zip; 3524 const consentAllows = (() => { 3525 const cp = window.Shopify && window.Shopify.customerPrivacy; 3526 if (cp && typeof cp.marketingAllowed === 'function') { 3527 try { return cp.marketingAllowed() !== false; } catch (e) { return true; } 3528 } 3529 return true; 3530 })(); 3531 if (needsGeo && consentAllows) { 3532 const cachedGeo = FacebookTracker.storage.get('Parkour_geo_fb'); 3533 if (cachedGeo && cachedGeo.exp > Date.now()) { 3534 browsingGeo = cachedGeo.browsingGeo || {}; 3535 ipinfoGeo = cachedGeo.ipinfoGeo || {}; 3536 } else { 3537 try { 3538 const [browsingResp, ipinfoResp] = await Promise.all([ 3539 fetch('/browsing_context_suggestions.json'), 3540 fetch('https://ipinfo.io/json') 3541 ]); 3542 browsingGeo = await browsingResp.json(); 3543 ipinfoGeo = await ipinfoResp.json(); 3544 FacebookTracker.storage.set('Parkour_geo_fb', { browsingGeo, ipinfoGeo, exp: Date.now() + 864e5 }); 3545 } catch (geoErr) { 3546 FacebookTracker.utils.log('Geo fetch failed, using Shopify data only', geoErr); 3547 } 3548 } 3549 } 3550 const countryCode = browsingGeo?.detected_values?.country?.handle || ipinfoGeo.country || ''; 3551 3552 const addr = customerData.default_address; 3553 const raw = { 3554 firstName: customerData.first_name || addr?.first_name || '', 3555 lastName: customerData.last_name || addr?.last_name || '', 3556 email: customerData.email || '', 3557 phone: customerData.phone || addr?.phone || '', 3558 state: addr?.province_code || addr?.province || ipinfoGeo.region || '', 3559 city: addr?.city || ipinfoGeo.city || '', 3560 country: addr?.country_code || countryCode, 3561 zipCode: addr?.zip || ipinfoGeo.postal || '' 3562 }; 3563 3564 const formatted = {}; 3565 for (const key in raw) { 3566 const normalized = FacebookTracker.utils.normalizeField(raw[key], key); 3567 if (normalized) formatted[key] = normalized; 3568 } 3569 3570 const hashed = {}; 3571 for (const key in formatted) { 3572 hashed[key] = await FacebookTracker.utils.HashString(formatted[key]); 3573 } 3574 3575 const existing = FacebookTracker.storage.get(FacebookTracker.config.storageKeys.CUSTOMER_HASHED); 3576 const newHashed = { ...existing, ...hashed }; 3577 FacebookTracker.storage.set(FacebookTracker.config.storageKeys.CUSTOMER_HASHED, newHashed); 3578 } catch (err) { 3579 FacebookTracker.utils.log('Customer hash error', err, 'error'); 3580 } 3581 }, 3582 3583 captureFirstTouch() { 3584 const PREFIX = '__parkour_'; 3585 const urlParams = new URLSearchParams(window.location.search); 3586 3587 const setOnce = (key, value) => { 3588 const existing = document.cookie.includes(`${key}=`); 3589 if (!existing) { 3590 localStorage.setItem(key, value); 3591 const expires = new Date(Date.now() + 90 * 864e5).toUTCString(); 3592 document.cookie = `${key}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`; 3593 } 3594 }; 3595 3596 const clickIds = ['fbclid', 'ttclid', 'gclid', 'ScCid', 'scCid', 'srsltid']; 3597 const utms = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content','ad_id','campaign_id','adset_id' ]; 3598
3599 [...clickIds, ...utms].forEach(param => { 3600 const val = urlParams.get(param); 3601 if (val) setOnce(`${PREFIX}${param}`, val); 3602 }); 3603 3604 setOnce(`${PREFIX}landing`, window.location.href); 3605 setOnce(`${PREFIX}referrer`, document.referrer || 'direct'); 3606 } 3607 }, 3608 3609 cart: { 3610 async updateAttributes(attributes) { 3611 // POST only OUR keys: /cart/update.js merges the provided attributes and leaves 3612 // every other attribute untouched. The old read-modify-write (GET /cart.js + 3613 // full-snapshot POST) doubled the request count on every page view and raced 3614 // the customer's own updates and the sibling TikTok/Snapchat trackers â a stale 3615 // snapshot could re-apply an OLD fbc over a freshly captured one. 3616 return FacebookTracker.utils.retry(async () => { 3617 return fetch('/cart/update.js', { 3618 method: 'POST', 3619 headers: { 'Content-Type': 'application/json' }, 3620 body: JSON.stringify({ attributes }) 3621 }).then(res => res.json()); 3622 }); 3623 } 3624 }, 3625 3626 async init() { 3627 try { 3628 // Metafields emitted via | json (with </ escaped): raw template-literal 3629 // interpolation meant a single quote/backtick in any metafield killed init() 3630 // for the whole shop (no fbc/fbp capture, no cart attribution) and a closing 3631 // script tag in a value was stored XSS. normalizeMetafield keeps downstream string 3632 // handling identical whether the metafield renders as a string or an object. 3633 const normalizeMetafield = (v) => (v == null ? '' : (typeof v === 'string' ? v : JSON.stringify(v))); 3634 // b64: Shopify's json filter refuses multiline metafields (renders 3635 // {"error":"json not allowed for this object"} â this broke pixel_config), 3636 // while base64 output is injection-proof for EVERY metafield type: its 3637 // alphabet cannot contain quotes, backslashes, or closing script tags. 3638 // TextDecoder is required: base64_encode emits UTF-8 BYTES and bare atob() 3639 // reads them as Latin-1 â silently mojibaking non-ASCII metafield content. 3640 // Identity for ASCII, so the legacy btoa(encodeURIComponent(...)) shape that 3641 // safeParseMetaData handles is unaffected. 3642 const b64 = (s) => { try { return new TextDecoder().decode(Uint8Array.from(atob(s), (c) => c.charCodeAt(0))); } catch (e) { return ''; } }; 3643 const pixelConfig = normalizeMetafield(b64('SlRWQ0pUVkU=')); 3644 const appStatus = normalizeMetafield(b64('ZEhKMVpRPT0=')); 3645 const preferredId = normalizeMetafield(b64('')); 3646 const customEvents = normalizeMetafield(b64('')); 3647 const webPixelEnabled = normalizeMetafield(b64('')); 3648 const supportExternalCheckout = normalizeMetafield(b64('')); 3649 3650 // null-guarded: an unparseable metafield must NOT clobber the last-known-good 3651 // value already in localStorage (the pixel keeps running on the previous config). 3652 if (pixelConfig) { 3653 const configDecoded = FacebookTracker.utils.safeParseMetaData(pixelConfig); 3654 if (configDecoded != null) FacebookTracker.storage.set(FacebookTracker.config.storageKeys.PIXEL_CONFIG, configDecoded); 3655 } 3656 3657 if (appStatus) { 3658 const statusDecoded = FacebookTracker.utils.safeParseMetaData((appStatus)); 3659 if (statusDecoded != null) FacebookTracker.storage.set(FacebookTracker.config.storageKeys.PIXEL_STATUS, statusDecoded); 3660 } 3661 if (webPixelEnabled) { 3662 const webPixelEnabledDecoded = FacebookTracker.utils.safeParseMetaData((webPixelEnabled)); 3663 if (webPixelEnabledDecoded != null) FacebookTracker.storage.set(FacebookTracker.config.storageKeys.WEB_PIXEL, webPixelEnabledDecoded); 3664 } 3665 if(preferredId) { 3666 FacebookTracker.storage.set(FacebookTracker.config.storageKeys.PREFERRED_ID, preferredId); 3667 } 3668 3669 if (customEvents) { 3670 const eventsDecoded = FacebookTracker.utils.safeParseMetaData(customEvents); 3671 if (eventsDecoded != null) FacebookTracker.storage.set(FacebookTracker.config.storageKeys.CUSTOM_EVENTS, eventsDecoded); 3672 } 3673 3674 // Check if external checkout support is enabled (defaults to true if metafield doesn't exist) 3675 let isExternalCheckoutEnabled = true; 3676 if (supportExternalCheckout) { 3677 try { 3678 const supportDecoded = FacebookTracker.utils.safeParseMetaData(supportExternalCheckout); 3679 isExternalCheckoutEnabled = supportDecoded?.enabled !== false; 3680 } catch (e) { 3681 FacebookTracker.utils.log('Failed to parse support_external_checkout metafield', e); 3682 // Default to true if parsing fails 3683 isExternalCheckoutEnabled = true; 3684 } 3685 } 3686 3687 // LOCAL capture first â a network failure below (cart 430 under load, geo 3688 // outage) must never cost first-touch attribution or fbc/fbp persistence. 3689 const externalId = await FacebookTracker.tracking.initializeExter
3689nalId(); 3690 FacebookTracker.tracking.handleFbc(); 3691 FacebookTracker.tracking.handleFbp(); 3692 FacebookTracker.tracking.captureFirstTouch(); 3693 3694 const pageData = FacebookTracker.tracking.collectPageData(); 3695 if (pageData) FacebookTracker.storage.set(FacebookTracker.config.storageKeys.PAGE_DATA, pageData); 3696 3697 const adParams = FacebookTracker.tracking.collectAdParameters(); 3698 if (adParams) FacebookTracker.tracking.logAdData(adParams); 3699 3700 const fbc = FacebookTracker.storage.get(FacebookTracker.config.storageKeys.FBC, 'string'); 3701 const fbp = FacebookTracker.storage.get(FacebookTracker.config.storageKeys.FBP, 'string'); 3702 3703 // Network side-effects LAST, individually guarded so one failing never 3704 // aborts the other. 3705 if (isExternalCheckoutEnabled) { 3706 try { 3707 await FacebookTracker.cart.updateAttributes({ 3708 [FacebookTracker.config.storageKeys.EXTERNAL_ID]: externalId, 3709 ...(fbc ? { [FacebookTracker.config.storageKeys.FBC]: fbc } : {}), 3710 ...(fbp ? { [FacebookTracker.config.storageKeys.FBP]: fbp } : {}) 3711 }); 3712 } catch (cartErr) { 3713 FacebookTracker.utils.log('Cart attribute update failed', cartErr); 3714 } 3715 } 3716 3717 try { 3718 await FacebookTracker.tracking.hashCustomer(); 3719 } catch (hashErr) { 3720 FacebookTracker.utils.log('hashCustomer failed', hashErr); 3721 } 3722 3723 FacebookTracker.utils.log('FacebookTracker initialized', { externalId, pageData, adParams }); 3724 } catch (e) { 3725 FacebookTracker.utils.log('Init failed', e, 'error'); 3726 } 3727 } 3728}; 3729 3730document.addEventListener('DOMContentLoaded', () => { 3731 FacebookTracker.init().catch(e => FacebookTracker.utils.log('Init error', e, 'error')); 3732}); 3733</script>
3733 3734<!-- END app block --><!-- BEGIN app block: shopify://apps/ta-banner-pop-up/blocks/bss-banner-popup/2db47c8b-7637-4260-aa84-586b08e92aea -->
3734<script id='bss-banner-config-data'> 3735 if(typeof BSS_BP == "undefined") { 3736 window.BSS_BP = { 3737 app_id: "155531739137", 3738 shop_id: "26440", 3739 is_watermark: "true", 3740 customer: null, 3741 shopDomain: "nsmy7n-ge.myshopify.com", 3742 popup: { 3743 configs: [], 3744 }, 3745 banner: { 3746 configs: [] 3747 }, 3748 window_popup: { 3749 configs: [] 3750 }, 3751 popupSettings: { 3752 delay_time: 2, 3753 gap_time: 3, 3754 }, 3755 page_type: "index", 3756 productPageId: "", 3757 productPageData: null, 3758 collectionPageId: "", 3759 noImageAvailableImgUrl: "https://cdn.shopify.com/extensions/01a1104d-b3b6-7e4e-957b-271d42cef942/version_ee29e002-2026-10-06_15h21m/assets/no-image-available.png", 3760 currentLocale: { 3761 name: "English", 3762 primary: true, 3763 iso_code: "en", 3764 }, 3765 country: { 3766 name: "Singapore", 3767 iso_code: "SG", 3768 currencySymbol: "$", 3769 // localization.market.id is deprecated by Shopify (only returns the most specific 3770 // market a buyer belongs to, breaks once a targeted market gets child markets). 3771 // Kept only as a fallback for configs not yet resynced with resolved country data 3772 // - see checkVisibilityMarket in shared/condition.js. 3773 market_id: "34349285589", 3774 }, 3775 is_locked: false, 3776 partner_development: false, 3777 excluded_ips: '[]', 3778 current_page_ids: { 3779 product: "gid://shopify/Product/", 3780 collection: "gid://shopify/Collection/", 3781 page: "gid://shopify/Page/", 3782 blog: "gid://shopify/Blog/", 3783 article: "gid://shopify/Article/" 3784 }, 3785 watermarkLogo: "https://cdn.shopify.com/extensions/01a1104d-b3b6-7e4e-957b-271d42cef942/version_ee29e002-2026-10-06_15h21m/assets/watermark_128.png", 3786 } 3787 Object.defineProperty(BSS_BP, 'plan_code', { 3788 enumerable: false, 3789 configurable: false, 3790 writable: false, 3791 value: "advanced", 3792 }); 3793 Object.defineProperty(BSS_BP, 'is_exceed_quota', { 3794 enumerable: false, 3795 configurable: false, 3796 writable: false, 3797 value: "false", 3798 }); 3799 Object.defineProperty(BSS_BP, 'is_legacy', { 3800 enumerable: false, 3801 configurable: false, 3802 writable: false, 3803 value: "false", 3804 }); 3805 } 3806</script>
3806 3807 3808 3809 <link fetchpriority="high" rel="preload" as="script" href=https://cdn.shopify.com/extensions/01a1104d-b3b6-7e4e-957b-271d42cef942/version_ee29e002-2026-10-06_15h21m/assets/bss.bp.shared.js /> 3810 <!-- BEGIN app snippet: window-popup-config --> 3811<!-- BSS Preload window popup image --><link href='https://cdn.shopify.com/s/files/1/0793/5131/6693/files/app-bss-banner-popup_0c978848-f271-4ba2-a822-be1a544c08bd_background.png?v=1787124105' as='image' rel="preload" fetchpriority='high' /><!-- Preload script --> 3812 3813 <link rel="preload" href="https://cdn.shopify.com/extensions/01a1104d-b3b6-7e4e-957b-271d42cef942/version_ee29e002-2026-10-06_15h21m/assets/bss.bp.window-popup.js" as="script"> 3814 3815 3816
3816<script id="bss-window-popup-config" type="application/json"> 3817 {"configs":[{"id":20982,"shop_id":26440,"type":2,"priority":1,"is_show_first":true,"enable":true,"name":"New Announcement Popup","device":"desktop,mobile","countries":"","enable_allowed_countries":false,"country_type":0,"exclude_countries":{"type":0,"countries":[]},"customer_type":0,"excl_customer_type":0,"excl_specific_page_stt":false,"customer_ids":"","customer_tags":"","excl_customer_ids":"","excl_customer_tags":"","pages":"all","specific_page":"","excl_specific_page":"","enable_language":false,"allowed_languages":"","enable_to_date":true,"enable_visibility_date":false,"enable_fixed_time":false,"from_date":"2026-08-19T06:57:46.102Z","to_date":"2026-08-19T06:57:46.102Z","fixed_time":"{}","custom_css":"","product_type":0,"excl_product_type":0,"product_ids":"","collections":"","tags":"","excl_product_ids":"","excl_tags":"","collection_type":0,"collection_ids":"","excl_product_collections":"","delay_type":0,"delay_time":0,"added_to_cart_items":[],"button_selectors":"","delay_time_seconds":0,"show_again_type":2,"show_again_time":0,"is_deleted":false,"selected_markets":{"list":[],"enable":false},"trigger_settings":{"atc_tags":[],"cart_amount":0,"atc_collections":[],"cart_value_operator":0,"enable_on_cart_page":false,"exit_intent_device_target":0},"enable_utm_params":false,"utm_params":{"utm_sources":["facebook"],"custom_params":[]},"created_at":"2026-08-19T07:21:46.654Z","updated_at":"2026-08-19T08:15:29.381Z","window_popup":{"id":11719,"popup_id":20982,"template":0,"content_text":{"text":"\u003ch1 style=\"text-align: center;\"\u003e\u003cspan style=\"color: rgb(0, 0, 0); font-size: 32px;\"\u003e\u003cstrong class=\"bold\"\u003eFIRST DINNER ON US!\u003c\/strong\u003e\u003c\/span\u003e\u003c\/h1\u003e","sub_text":"\u003cp style=\"font-size: 13px; text-align: center;\"\u003e\u003cspan style=\"color: rgb(0, 0, 0); font-size: 16px;\"\u003eWelcome to Fresher Dinners - a world of\u003c\/span\u003e\u003cspan style=\"color: rgb(0, 0, 0);\"\u003e\u003cbr\u003e\u003c\/span\u003e\u003cspan style=\"color: rgb(0, 0, 0); font-size: 16px;\"\u003e\u003cem\u003enever \u003c\/em\u003easking \"what to eat for dinner\" \u003cem\u003eever\u003c\/em\u003e!\u003c\/span\u003e\u003cspan style=\"color: rgb(0, 0, 0);\"\u003e\u003cbr\u003e\u003cbr\u003e\u003c\/span\u003e\u003cspan style=\"color: rgb(0, 0, 0); font-size: 16px;\"\u003e\u003cstrong class=\"bold\"\u003eFirst time?\u003c\/strong\u003e\u003c\/span\u003e\u003cspan style=\"color: rgb(0, 0, 0);\"\u003e\u003cbr\u003e\u003c\/span\u003e\u003cspan style=\"color: rgb(0, 0, 0); font-size: 16px;\"\u003eGet your 1st Dinner FREE*\u003c\/span\u003e\u003c\/p\u003e","copyable_coupon":"DINNERSONUS"},"content_order":"text,sub_text,copyable_coupon","image_settings":{"url":"","size":37,"position":"left","image_url":"https:\/\/cdn.shopify.com\/s\/files\/1\/0793\/5131\/6693\/files\/app-bss-banner-popup_0c978848-f271-4ba2-a822-be1a544c08bd_background.png?v=1787124105","video_url":"","media_type":0,"show_on_mb":true,"success_url":"","image_url_s3":"https:\/\/production-banner-bucket.s3.us-east-2.amazonaws.com\/bss_bp\/customer_images\/26440\/0c978848-f271-4ba2-a822-be1a544c08bd_background.png","target_blank":false,"enable_image_slider":false,"image_slider_setting":{"configs":[{"label":"Image 1","image_url_s3":"https:\/\/production-banner-bucket.s3.us-east-2.amazonaws.com\/bss_bp\/images_library\/2d2445af-e34d-48b9-8996-9e5f730a569e_new_arrivals.png"},{"label":"Image 2","image_url_s3":"https:\/\/production-banner-bucket.s3.us-east-2.amazonaws.com\/bss_bp\/images_library\/b8050a8a-2a34-4e50-89e1-0018a5e4c284_50_off.png"}],"show_arrow":false,"pause_on_hover":true,"btn_arrow_color":"#FFFFFF","hide_dot_on_mobile":false,"show_pagination_dot":true,"transition_duration":4},"success_target_blank":false,"enable_after_click_button":false},"max_width":520,"height_type":0,"height":390,"element_gap":20,"overlay":40,"padding":"20px 20px 20px 20px","border_radius":"16px 16px 16px 16px","border_style":0,"border_width":"0px 0px 0px 0px","border_color":"#000000","bg_type":0,"bg_color":"#FFF9F4","bg_opacity":100,"bg_gradient":"{\"color1\":\"#FF6162\",\"color2\":\"#FF9766\"}","bg_preset":0,"bg_img_url_cdn":"","bg_img_url_s3":"","bg_img_path_name":"","bg_size":"auto","font_family":"Afacad Flux","font_url":"https:\/\/banner-sale-popup.tech-arms.io\/fonts\/Afacad_Flux.ttf","font_url_cdn":"https:\/\/cdn.shopify.com\/s\/files\/1\/0793\/5131\/6693\/files\/app-bss-banner-popup_Afacad_Flux_a23fef47-1c2e-4be0-927b-88fe6bf3c7bf.ttf?v=1787127327","text_color":{"text":"#000000","sub_text":"#616161"},"btn_settings":{"url":"","handle":"","padding":"8px 8px 8px 8px","typeUrl":"","act_type":3,"animation":0,"btn_color":"#000000","btn_style":"2","full_width":false,"success_url":"","target_blank":false,"btn_txt_color":"#FFFFFF","success_btn_type":0,"success_target_blank":false,"enable_after_click_button":false},"close_btn_settings":{"bg_color":"#D4ECC6","animation":"0","delay_time":0,"button_style":"0","x_icon_color":"#036F2F","hide_close_btn":false},"coupon_settings":{"bg_color":"#000000","animation":1,"font_size":14,"full_width":false,"text_color":"#E97300","discount_id":"","border_style":1,"coupon_source":0},"form_structure":null,"email_integrations":{"klaviyo":{"listId":"","enabled":false},"shopify":{"tags":"BSSpopup","enabled":true}},"success_config":{"order":["text","sub_text","copyable_coupon","button"],"font_url":"","btn_style":{"padding":"8px 8px 8px 8px","animation":0,"btn_color":"#000000","btn_style":"2","full_width":true,"btn_txt_color":"#FFFFFF"},"discount_id":"","font_family":"","content_text":{"text":"\u003cp style=\"text-align: center\"\u003e\u003cspan style=\"font-size: 24px\"\u003e\u003cstrong\u003eTHANK YOU!\u003c\/strong\u003e\u003c\/span\u003e\u003c\/p\u003e","button":"\u003cp style=\"text-align: center\"\u003e\u003cspan style=\"font-size: 16px\"\u003e\u003cstrong\u003eContinue shopping\u003c\/strong\u003e\u003c\/span\u003e\u003c\/p\u003e","sub_text":"\u003cp style=\"text-align: center\"\u003e\u003cspan style=\"font-size: 16px\"\u003eUse the code below to get your welcome discount:\u003c\/span\u003e\u003c\/p\u003e","copyable_coupon":""},"font_url_cdn":"","coupon_source":1},"countdown_style":{"digit_style":"0","timer_color":"{\"background\":\"#000000\",\"text\":\"#000000\",\"number\":\"#fff\",\"border\":\"#ff3f3f\",\"flipLine\":\"#000\",\"accentColor\":\"#FF3366\"}","act_timer_end":1,"countdown_format":"dd:hh:mm:ss","countdown_position":"center","font_size_countdown":20},"tease_config":{"type":3,"content":"\u003cp\u003e\u003cspan style=\"color: #FFFFFF; font-size: 14px\"\u003eDonât Miss Out ð\u003c\/span\u003e\u003c\/p\u003e","bg_color":"#000000","font_url":"","animation":0,"close_pos":{"x":75,"y":17},"image_url":"https:\/\/production-banner-bucket.s3.us-east-2.amazonaws.com\/bss_bp\/customer_images\/15\/7ea5a586-84d3-4391-a68a-8693dfe49c87_dontmissout_teaser.png","image_size":100,"font_family":"","layout_type":0,"show_mobile":true,"enable_close":true,"font_url_cdn":"","show_desktop":true,"mobile_position":3,"desktop_position":3},"disable_backdrop_click":false,"position_config":{"margin_mobile":"20px 20px 20px 20px","margin_desktop":"20px 20px 20px 20px","position_mobile":4,"position_desktop":4},"auto_apply_discount":false,"countdown_success_style":null,"selected_template":{"preset":"SOCIAL_BOOST","customize":true,"modifiedFields":{"content_text.text":true,"content_text.sub_text":true}},"section_style":{},"rcm_products_config":null,"image_only":false,"layout_fields":null}}],"dictionary":null} 3818 </script>
3818 3819 3820
3820<script> 3821 const bssWindowPopupConfig = document.querySelector("script#bss-window-popup-config"); 3822 const parsedWPConfig = JSON.parse(bssWindowPopupConfig.textContent) 3823 BSS_BP.window_popup.configs = parsedWPConfig.configs; 3824 BSS_BP.window_popup.dictionary = parsedWPConfig.dictionary || {}; 3825 </script>
3825<!-- END app snippet --> 3826 <!-- BEGIN app snippet: banner-config --><!-- BSS Preload banner font --><link href='https://cdn.shopify.com/s/files/1/0793/5131/6693/files/app-bss-banner-popup_FontsFree-Net-Kiona-Bold_a008bfbc-d349-40fc-a34d-845b9596ea7d.ttf?v=1788863564' as='font' rel="preload" type="font/woff2" fetchpriority="low" crossorigin="anonymous"><link href='https://cdn.shopify.com/s/files/1/0793/5131/6693/files/app-bss-banner-popup_FontsFree-Net-Kiona-Bold_cedd5637-84e4-40dd-8626-4cb4b778f185.ttf?v=1788863630' as='font' rel="preload" type="font/woff2" fetchpriority="low" crossorigin="anonymous"><!-- Preload script --> 3827 3828 <link rel="preload" as="script" href="https://cdn.shopify.com/extensions/01a1104d-b3b6-7e4e-957b-271d42cef942/version_ee29e002-2026-10-06_15h21m/assets/bss.bp.banner.js" /> 3829 3830 3831
3831<script id="bss-banner-config" type="application/json"> 3832 {"configs":[{"id":23410,"shop_id":26440,"banner_type":0,"name":"New Discount Banner Monthly","priority":1,"enable":true,"position":0,"customer_type":0,"product_type":0,"excl_product_type":0,"excl_customer_type":0,"enable_allowed_countries":false,"enable_fixed_time":false,"enable_visibility_date":false,"close_button":false,"is_fixed":false,"countries":"","country_type":0,"exclude_countries":{"type":0,"countries":[]},"fixed_time":"{}","from_date":"2026-08-19T07:27:41.342Z","to_date":"2026-08-19T07:27:41.342Z","enable_to_date":true,"customer_ids":"","customer_tags":"","collections":"","product_ids":"","tags":"","excl_customer_ids":"","excl_customer_tags":"","excl_product_ids":"","excl_tags":"","pages":"all","specific_pages":"","enable_excl_pages":false,"excl_pages":"","show_device":"all","btn_close_color":"#ffffff","show_arrow":false,"btn_arrow_color":"#ffffff","enable_language":false,"allowed_languages":"","custom_css":"","delay_type":0,"delay_time":0,"delay_time_seconds":0,"show_again_type":0,"show_again_time":0,"collection_type":0,"collection_ids":"","excl_product_collections":"","is_deleted":false,"created_at":"2026-08-19T07:38:17.942Z","updated_at":"2026-09-08T10:32:46.618Z","email_integrations":{"klaviyo":{"listId":"","enabled":false},"shopify":{"tags":"BSSbanner","enabled":true}},"multi_config":null,"added_to_cart_items":[],"trigger_settings":{"atc_tags":[],"cart_amount":0,"atc_collections":[],"cart_value_operator":0,"enable_on_cart_page":false},"extensional_close_style":null,"font_scale_enabled":false,"font_scale":0,"selected_markets":{"list":[],"enable":false},"enable_utm_params":false,"utm_params":{"utm_sources":["facebook"],"custom_params":[]},"banner_templates":[{"id":24239,"banner_id":23410,"template":4,"banner_text":"\u003cp style=\"font-size: 13px; text-align: center;\"\u003e\u003cspan style=\"color: rgb(255, 255, 255); font-size: 20px;\"\u003eSAVE ON YOUR FIRST Monthly SUBSCRIPTION!\u003c\/span\u003e\u003c\/p\u003e","clickable":false,"redirect_url":null,"bg_type":0,"bg_color":"#0C1961","bg_opacity":100,"bg_gradient":"{\"color1\":\"#FF6162\",\"color2\":\"#FF9766\"}","bg_preset":0,"bg_img_url_cdn":null,"bg_img_url_s3":"","bg_img_path_name":null,"bg_size":"auto","text_format":2,"font_color":"#ffffff","font_size":16,"font_size_button":13,"font_family":"FontsFree-Net-Kiona-Bold","font_url":"https:\/\/production-banner-bucket.s3.us-east-2.amazonaws.com\/bss_bp\/customer_fonts\/26440\/b288ce85-b141-41d8-b4f7-bf366c5c29b6_FontsFree-Net-Kiona-Bold.ttf","font_url_cdn":"https:\/\/cdn.shopify.com\/s\/files\/1\/0793\/5131\/6693\/files\/app-bss-banner-popup_FontsFree-Net-Kiona-Bold_a008bfbc-d349-40fc-a34d-845b9596ea7d.ttf?v=1788863564","act_type":4,"act_text":"\u003cp style=\"font-size: 13px;\"\u003e\u003cspan style=\"font-size: 13px;\"\u003eCOPY CODE\u003c\/span\u003e\u003c\/p\u003e","btn_style":0,"act_content_color":"#FAF2EB","btn_text_color":"#2f4052","countdown_start_time":"2026-08-19T07:27:00.000Z","countdown_end_time":"2026-08-19T19:27:00.000Z","act_timer_end":0,"timer_color":"{\"background\":\"#494949\",\"text\":\"#ffffff\",\"number\":\"#ffffff\",\"border\":\"#ff3f3f\",\"flipLine\":\"#000\",\"accentColor\":\"#FF3366\"}","trans_countdown":"{\"day\":\"Days\",\"hours\":\"Hrs\",\"minute\":\"Mins\",\"second\":\"Secs\"}","animation_type":0,"animation_duration":"3","animation_hover_pause":false,"font_size_countdown":20,"countdown_type":0,"countdown_format":"dd:hh:mm:ss","countdown_daily":"{\"from_time\":\"00:00\",\"to_time\":\"23:59\"}","countdown_interval":"{\"start_time\":\"2026-08-19T07:27:00.000Z\",\"countdown_length\":{\"days\":31,\"hours\":0,\"minutes\":0},\"break_length\":{\"days\":31,\"hours\":0,\"minutes\":0}}","bg_padding":12,"bg_padding_bottom":12,"bg_padding_left":0,"bg_padding_right":0,"mobile_padding_enabled":true,"mb_bg_padding":"12px 0px 12px 0px","content_gap":16,"font_scale_enabled":true,"font_scale":0,"border_width":"0px 0px 0px 0px","border_radius":"0px 0px 0px 0px","border_style":0,"border_color":"#000000","content_order":"text,coupon,action","btn_copy":"{\"text_copy\":\"DINNERONUS-M\",\"success_mess\":\"COPIED â \"}","discount_id":"","discount_style":"{\"border\":7,\"background\":\"#E68806\",\"text_color\":\"#FFFFFF\",\"font_size\":13,\"animation\":1}","selected_template":null,"modified_fields":{"act_text":true,"act_type":true,"btn_copy":true,"clickable":false,"banner_text":true,"coupon_code":true,"discount_id":false,"redirect_url":false,"translations":false,"act_timer_end":false,"content_order":true,"coupon_source":true,"enable_coupon":false,"animation_type":false,"countdown_type":false,"countdown_daily":false,"trans_countdown":false,"countdown_format":false,"animation_duration":false,"countdown_end_time":false,"countdown_interval":false,"free_shipping_goal":false,"countdown_start_time":false,"animation_hover_pause":false},"enable_coupon":false,"coupon_source":0,"coupon_code":"DINNERONUS-M","btn_settings":{"url":"","handle":"","padding":"8px 8px 8px 8px","typeUrl":"","animation":0,"btn_color":"#ffffff","btn_style":"2","success_url":"","target_blank":false,"btn_txt_color":"#4A90E2","success_btn_type":0,"success_target_blank":false,"enable_after_click_button":false},"countdown_evergreen":{"days":0,"hours":0,"minutes":15},"cta_popup_config":{"popup_id":0,"delay_time":0,"popup_type":2},"digit_style":"0","auto_apply_discount":false,"free_shipping_goal":{},"form_structure":null,"button_styles":{"padding":"8px 8px 8px 8px","animation":0},"progress_bar_config":null,"slide_config":null,"created_at":"2026-08-19T07:38:17.942Z","updated_at":"2026-08-19T07:38:17.942Z"}]},{"id":23651,"shop_id":26440,"banner_type":0,"name":"New Discount Banner Weekly","priority":1,"enable":true,"position":0,"customer_type":0,"product_type":0,"excl_product_type":0,"excl_customer_type":0,"enable_allowed_countries":false,"enable_fixed_time":false,"enable_visibility_date":false,"close_button":false,"is_fixed":false,"countries":"","country_type":0,"exclude_countries":{"type":0,"countries":[]},"fixed_time":"{}","from_date":"2026-08-19T07:27:41.342Z","to_date":"2026-08-19T07:27:41.342Z","enable_to_date":true,"customer_ids":"","customer_tags":"","collections":"","product_ids":"","tags":"","excl_customer_ids":"","excl_customer_tags":"","excl_product_ids":"","excl_tags":"","pages":"all","specific_pages":"","enable_excl_pages":false,"excl_pages":"","show_device":"all","btn_close_color":"#ffffff","show_arrow":false,"btn_arrow_color":"#ffffff","enable_language":false,"allowed_languages":"","custom_css":"","delay_type":0,"delay_time":0,"delay_time_seconds":0,"show_again_type":0,"show_again_time":0,"collection_type":0,"collection_ids":"","excl_product_collections":"","is_deleted":false,"created_at":"2026-09-08T10:31:48.105Z","updated_at":"2026-09-08T10:33:52.009Z","email_integrations":{"klaviyo":{"listId":"","enabled":false},"shopify":{"tags":"BSSbanner","enabled":true}},"multi_config":null,"added_to_cart_items":[],"trigger_settings":{"atc_tags":[],"cart_amount":0,"atc_collections":[],"cart_value_operator":0,"enable_on_cart_page":false},"extensional_close_style":null,"font_scale_enabled":false,"font_scale":0,"selected_markets":{"list":[],"enable":false},"enable_utm_params":false,"utm_params":{"utm_sources":["facebook"],"custom_params":[]},"banner_templates":[{"id":24490,"banner_id":23651,"template":4,"banner_text":"\u003cp style=\"font-size: 13px; text-align: center;\"\u003e\u003cspan style=\"color: rgb(255, 255, 255); font-size: 20px;\"\u003eSAVE ON YOUR FIRST WEEKLY SUBSCRIPTION!\u003c\/span\u003e\u003c\/p\u003e","clickable":false,"redirect_url":null,"bg_type":0,"bg_color":"#61200C","bg_opacity":100,"bg_gradient":"{\"color1\":\"#FF6162\",\"color2\":\"#FF9766\"}","bg_preset":0,"bg_img_url_cdn":null,"bg_img_url_s3":"","bg_img_path_name":null,"bg_size":"auto","text_format":2,"font_color":"#ffffff","font_size":16,"font_size_button":13,"font_family":"FontsFree-Net-Kiona-Bold","font_url":"https:\/\/production-banner-bucket.s3.us-east-2.amazonaws.com\/bss_bp\/customer_fonts\/26440\/b288ce85-b141-41d8-b4f7-bf366c5c29b6_FontsFree-Net-Kiona-Bold.ttf","font_url_cdn":"https:\/\/cdn.shopify.com\/s\/files\/1\/0793\/5131\/6693\/files\/app-bss-banner-popup_FontsFree-Net-Kiona-Bold_cedd5637-84e4-40dd-8626-4cb4b778f185.ttf?v=1788863630","act_type":4,"act_text":"\u003cp style=\"font-size: 13px;\"\u003e\u003cspan style=\"font-size: 13px;\"\u003eCOPY CODE\u003c\/span\u003e\u003c\/p\u003e","btn_style":0,"act_content_color":"#FAF2EB","btn_text_color":"#2f4052","countdown_start_time":"2026-08-19T07:27:00.000Z","countdown_end_time":"2026-08-19T19:27:00.000Z","act_timer_end":0,"timer_color":"{\"background\":\"#494949\",\"text\":\"#ffffff\",\"number\":\"#ffffff\",\"border\":\"#ff3f3f\",\"flipLine\":\"#000\",\"accentColor\":\"#FF3366\"}","trans_countdown":"{\"day\":\"Days\",\"hours\":\"Hrs\",\"minute\":\"Mins\",\"second\":\"Secs\"}","animation_type":0,"animation_duration":"3","animation_hover_pause":false,"font_size_countdown":20,"countdown_type":0,"countdown_format":"dd:hh:mm:ss","countdown_daily":"{\"from_time\":\"00:00\",\"to_time\":\"23:59\"}","countdown_interval":"{\"start_time\":\"2026-08-19T07:27:00.000Z\",\"countdown_length\":{\"days\":31,\"hours\":0,\"minutes\":0},\"break_length\":{\"days\":31,\"hours\":0,\"minutes\":0}}","bg_padding":12,"bg_padding_bottom":12,"bg_padding_left":0,"bg_padding_right":0,"mobile_padding_enabled":true,"mb_bg_padding":"12px 0px 12px 0px","content_gap":16,"font_scale_enabled":true,"font_scale":0,"border_width":"0px 0px 0px 0px","border_radius":"0px 0px 0px 0px","border_style":0,"border_color":"#000000","content_order":"text,coupon,action","btn_copy":"{\"text_copy\":\"DINNERONUS-WK\",\"success_mess\":\"COPIED â \"}","discount_id":"","discount_style":"{\"border\":7,\"background\":\"#E68806\",\"text_color\":\"#FFFFFF\",\"font_size\":13,\"animation\":1}","selected_template":null,"modified_fields":{"act_text":true,"act_type":true,"btn_copy":true,"clickable":false,"banner_text":true,"coupon_code":true,"discount_id":false,"redirect_url":false,"translations":false,"act_timer_end":false,"content_order":true,"coupon_source":true,"enable_coupon":false,"animation_type":false,"countdown_type":false,"countdown_daily":false,"trans_countdown":false,"countdown_format":false,"animation_duration":false,"countdown_end_time":false,"countdown_interval":false,"free_shipping_goal":false,"countdown_start_time":false,"animation_hover_pause":false},"enable_coupon":false,"coupon_source":0,"coupon_code":"DINNERONUS-WK","btn_settings":{"url":"","handle":"","padding":"8px 8px 8px 8px","typeUrl":"","animation":0,"btn_color":"#ffffff","btn_style":"2","success_url":"","target_blank":false,"btn_txt_color":"#4A90E2","success_btn_type":0,"success_target_blank":false,"enable_after_click_button":false},"countdown_evergreen":{"days":0,"hours":0,"minutes":15},"cta_popup_config":{"popup_id":0,"delay_time":0,"popup_type":2},"digit_style":"0","auto_apply_discount":false,"free_shipping_goal":{},"form_structure":null,"button_styles":{"padding":"8px 8px 8px 8px","animation":0},"progress_bar_config":null,"slide_config":null,"created_at":"2026-09-08T10:31:48.105Z","updated_at":"2026-09-08T10:31:48.105Z"}]}],"dictionary":null } 3833 </script>
3833 3834
3834<script> 3835 const bssBannerDataScript = document.querySelector("script#bss-banner-config"); 3836 const parsed = JSON.parse(bssBannerDataScript.textContent) 3837 BSS_BP.banner.configs = parsed.configs; 3838 BSS_BP.banner.dictionary = parsed.dictionary || {}; 3839 </script>
3839<!-- END app snippet --> 3840 <!-- BEGIN app snippet: sale-popup-config -->
3840<script id="bss-sale-popup-config" type="application/json"> 3841 {"configs":[],"dictionary":null,"popup_settings":{"delay_time":2,"gap_time":3}} 3842 </script>
3842 3843 3844
3844<script> 3845 const bssSalePopupConfig = document.querySelector("script#bss-sale-popup-config"); 3846 const parsedSPConfig = JSON.parse(bssSalePopupConfig.textContent) 3847 BSS_BP.popup.configs = parsedSPConfig.configs; 3848 BSS_BP.popup.dictionary = parsedSPConfig.dictionary || {}; 3849 BSS_BP.popupSettings = parsedSPConfig.popup_settings || BSS_BP.popupSettings; 3850 </script>
3850<!-- END app snippet --> 3851 3852 3853<!-- BEGIN app snippet: support-code --> 3854<!-- END app snippet --> 3855 3856 3857
3857<script 3858 id='init_script' 3859 defer 3860 src='https://cdn.shopify.com/extensions/01a1104d-b3b6-7e4e-957b-271d42cef942/version_ee29e002-2026-10-06_15h21m/assets/bss.bp.index.js' 3861 ></script>
3861 3862 3863 3864 3865<!-- END app block --><link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
3866<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 79351316693,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "index"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 3866
3866
3867<script> 3868 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 3869</script>
vendor: 1 bytes, line 3869
3869
3870<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
3870).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 79351316693,storefrontBaseUrl: "https://fresherdinners.com.sg",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://fresherdinners.com.sg/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b"],webPixelsConfigList: [{"id":"2465595605","configuration":"{\"pixel_id\":\"27518529634509861\",\"pixel_type\":\"facebook_pixel\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"bd2f978c17a94bbb8a74d43de2165dc5","type":"APP","apiClientId":2329312,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"2465398997","configuration":"{\"accountID\":\"6a8579f86a0fcb52fe3d30d5\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"36e3d4a51ce4f54c09fc3ba4b868fb3d","type":"APP","apiClientId":161884340225,"privacyPurposes":["SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"2465267925","configuration":"{\"accountID\":\"79351316693\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"a6f52647d7c45a761e1efaaae50eaefb","type":"APP","apiClientId":242350882817,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"2375385301","configuration":"{\"projectId\":\"xnsp1vmz70\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"d8a2bb2ccbb513dc8e8b6937f4b8033e","type":"APP","apiClientId":240074326017,"privacyPurposes":[],"capabilities":["advanced_dom_events"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]}
3870,"dataSharingState":"unrestricted"},{"id":"2368176341","configuration":"{\"config\":\"{\\\"google_tag_ids\\\":[\\\"G-Z15W2036DX\\\"],\\\"target_country\\\":\\\"ZZ\\\",\\\"gtag_events\\\":[{\\\"type\\\":\\\"begin_checkout\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"search\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"remove_from_cart\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"view_item\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"add_shipping_info\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"purchase\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"page_view\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"view_item_list\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"add_payment_info\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"add_to_cart\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"},{\\\"type\\\":\\\"view_cart\\\",\\\"action_label\\\":\\\"G-Z15W2036DX\\\"}],\\\"enable_monitoring_mode\\\":false}\"}","eventPayloadVersion":"v1","runtimeContext":"OPEN","scriptVersion":"a3321ca85cf5aaf6b57585fcd8d67b3a","type":"APP","apiClientId":1780363,"privacyPurposes":[],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized","enabledFlags":["9a3ed68a"]},{"id":"2119598293","configuration":"{\"accountID\":\"111\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"2724075f63b99c0876a76433be03f895","type":"APP","apiClientId":1788279,"privacyPurposes":["ANALYTICS","MARKETING","SALE_OF_DATA"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_address","read_customer_email","read_customer_name","read_customer_personal_data","read_customer_phone"],"dataSharingControls":["share_all_events"]},"dataSharingState":"optimized"},{"id":"2041577685","configuration":"{\"appId\":\"ba037fbd-130c-4dea-bece-adfae6a77520\",\"appToken\":\"3a518b7afc920ac54fcb3579d3f50fb7\"}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"d2ac6858f372976b9c64742f15fdfe8d","type":"APP","apiClientId":206063009793,"privacyPurposes":["ANALYTICS"],"dataSharingAdjustments":{"protectedCustomerApprovalScopes":["read_customer_personal_data"],"dataSharingControls":["share_all_events"]},"dataSharingState":"unrestricted"},{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"Fresher Dinners","paymentSettings":{"currencyCode":"SGD"},"myshopifyDomain":"nsmy7n-ge.myshopify.com","countryCode":"SG","storefrontUrl":"https:\/\/fresherdinners.com.sg"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[{"id":"9495631528149","handle":"5-hour-slow-cooked-thick-congee","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54315786666197","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9384621113557","handle":"junior-dinner-2d","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"53913084592341","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9300881965269","handle":"thursday","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"53386700325077","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]},{"id":"9510888440021","handle":"angel-hair-xin-chow-fried-bee-hoon","isCollective":null,"title":null,"type":null,"untranslatedTitle":null,"url":null,"vendor":null,"remoteShopId":null,"variants":[{"id":"54376115372245","image":null,"price":null,"sku":null,"title":null,"untranslatedTitle":null}]}],"purchasingCompany":null},},"https://fresherdinners.com.sg/cdn","87a86122w399bf3b8pd0403c97m2c07468c",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"157894213845","themeStoreId":"2481","themePublished":"true","eventMetadataId":"8f22de74-232e-4cf7-891e-af75144424b9","pageType":"home","shopId":"79351316693","storefrontBaseUrl":"https:\/\/fresherdinners.com.sg","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\", \"8450a54b\"]","isMerchantRequest":"false","hashVersion":"87a86122w399bf3b8pd0403c97m2c07468c","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
3870<script> 3871 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 3872 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 3873 window.ShopifyAnalytics.meta.currency = 'SGD'; 3874 var meta = {"page":{"pageType":"home","requestId":"03149f5c-905e-4dab-8895-a283f95b88d4-1791373064"}}; 3875 for (var attr in meta) { 3876 window.ShopifyAnalytics.meta[attr] = meta[attr]; 3877 } 3878</script>
vendor: 1 bytes, line 3878
3878
3879<script class="analytics"> 3880 (function () { 3881 var customDocumentWrite = function(content) { 3882 var jquery = null; 3883 3884 if (window.jQuery) { 3885 jquery = window.jQuery; 3886 } else if (window.Checkout && window.Checkout.$) { 3887 jquery = window.Checkout.$; 3888 } 3889 3890 if (jquery) { 3891 jquery('body').append(content); 3892 } 3893 }; 3894 3895 var hasLoggedConversion = function(token) { 3896 if (token) { 3897 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 3898 } 3899 return false; 3900 } 3901 3902 var setCookieIfConversion = function(token) { 3903 if (token) { 3904 var twoMonthsFromNow = new Date(Date.now()); 3905 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 3906 3907 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 3908 } 3909 } 3910 3911 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 3912 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 3913 if (trekkie.integrations) { 3914 return; 3915 } 3916 trekkie.methods = [ 3917 'identify', 3918 'page', 3919 'ready', 3920 'track', 3921 'trackForm', 3922 'trackLink' 3923 ]; 3924 trekkie.factory = function(method) { 3925 return function() { 3926 var args = Array.prototype.slice.call(arguments); 3927 args.unshift(method); 3928 trekkie.push(args); 3929 if (method == 'track' || method == 'page') { 3930 var pageUrl; 3931 try { 3932 pageUrl = window.location.href; 3933 } catch (e) {} 3934 var pageReferrer; 3935 try { 3936 pageReferrer = document.referrer; 3937 } catch (e) {} 3938 try { 3939 if (window.__TREKKIE_SHIM_QUEUE == null) { 3940 window.__TREKKIE_SHIM_QUEUE = []; 3941 } 3942 window.__TREKKIE_SHIM_QUEUE.push({ 3943 from: 'trekkie-stub', 3944 method: method, 3945 args: args.slice(1), 3946 pageContext: { 3947 url: pageUrl, 3948 referrer: pageReferrer 3949 } 3950 }); 3951 } catch (e) { 3952 // no-op 3953 } 3954 } 3955 return trekkie; 3956 }; 3957 }; 3958 for (var i = 0; i < trekkie.methods.length; i++) { 3959 var key = trekkie.methods[i]; 3960 trekkie[key] = trekkie.factory(key); 3961 } 3962 trekkie.load = function(config) { 3963 trekkie.config = config || {}; 3964 trekkie.config.initialDocumentCookie = document.cookie; 3965 var first = document.getElementsByTagName('script')[0]; 3966var script = document.createElement('script'); 3967script.type = 'text/javascript'; 3968script.onerror = function(e) { 3969 var scriptFallback = document.createElement('script'); 3970 scriptFallback.type = 'text/javascript'; 3971 scriptFallback.onerror = function(error) { 3972 var Monorail = { 3973 produce: function produce(monorailDomain, schemaId, payload) { 3974 var currentMs = new Date().getTime(); 3975 var event = { 3976 schema_id: schemaId, 3977 payload: payload, 3978 metadata: { 3979 event_created_at_ms: currentMs, 3980 event_sent_at_ms: currentMs 3981 } 3982 }; 3983 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 3984 }, 3985 sendRequest: function sendRequest(endpointUrl, payload) { 3986 // Try the sendBeacon API 3987 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 3988 var blobData = new window.Blob([payload], { 3989 type: 'text/plain' 3990 }); 3991 3992 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 3993 return true; 3994 } // sendBeacon was not successful 3995 3996 } // XHR beacon 3997 3998 var xhr = new XMLHttpRequest(); 3999 4000 try { 4001 xhr.open('POST', endpointUrl); 4002 xhr.setRequestHeader('Content-Type', 'text/plain'); 4003 xhr.send(payload); 4004 } catch (e) { 4005 console.log(e); 4006 } 4007 4008 return false; 4009 }, 4010 isIos12: function isIos12() { 4011 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 4012 } 4013 }; 4014 Monorail.produce('monorail-edge.shopifysvc.com', 4015 'trekkie_storefront_load_errors/1.1', 4016 {shop_id: 79351316693, 4017 theme_id: 157894213845, 4018 app_name: "storefront", 4019 context_url: window.location.href, 4020 source_url: "//fresherdinners.com.sg/cdn/s/trekkie.storefront.51e69540e15035ae012ec8cc42e8f9cd792233a0.min.js"}); 4021 4022 }; 4023 scriptFallback.async = true; 4024 scriptFallback.src = '//fresherdinners.com.sg/cdn/s/trekkie.storefront.51e69540e15035ae012ec8cc42e8f9cd792233a0.min.js'; 4025 first.parentNode.insertBefore(scriptFallback, first); 4026}; 4027script.async = true; 4028script.src = '//fresherdinners.com.sg/cdn/s/trekkie.storefront.51e69540e15035ae012ec8cc42e8f9cd792233a0.min.js'; 4029first.parentNode.insertBefore(script, first); 4030 4031 }; 4032 trekkie.load( 4033 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":79351316693,"isMerchantRequest":null,"themeId":157894213845,"themeCityHash":"8824506522435598658","contentLanguage":"en","currency":"SGD","eventMetadataId":"8f22de74-232e-4cf7-891e-af75144424b9"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}} 4034 ); 4035 4036 var loaded = false;
4037 trekkie.ready(function() { 4038 if (loaded) return; 4039 loaded = true; 4040 4041 window.ShopifyAnalytics.lib = window.trekkie; 4042 4043 var originalDocumentWrite = document.write; 4044 document.write = customDocumentWrite; 4045 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 4046 document.write = originalDocumentWrite; 4047 4048 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 4049 var token = match? match[1]: undefined; 4050 if (!hasLoggedConversion(token)) { 4051 setCookieIfConversion(token); 4052 4053 } 4054 }); 4055 4056 window.ShopifyAnalytics.lib.page(null,{"pageType":"home","requestId":"03149f5c-905e-4dab-8895-a283f95b88d4-1791373064","shopifyEmitted":true}); 4057 4058 var eventsListenerScript = document.createElement('script'); 4059 eventsListenerScript.async = true; 4060 eventsListenerScript.src = "//fresherdinners.com.sg/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 4061 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 4062})();</script>
vendor: 1 bytes, line 4062
4062
4063<script 4064 defer 4065 src="https://fresherdinners.com.sg/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.6.min.js" 4066 data-application="storefront-renderer" 4067 data-shop-id="79351316693" 4068 data-render-region="gcp-us-central1" 4069 data-page-type="index" 4070 data-theme-instance-id="157894213845" 4071 data-theme-name="Horizon" 4072 data-theme-version="3.3.1" 4073 data-monorail-region="shop_domain" 4074 data-resource-timing-sampling-rate="10" 4075 data-shs="true" 4076 data-shs-beacon="true" 4077 data-shs-export-with-fetch="true" 4078 data-shs-logs-sample-rate="1" 4079 data-shs-beacon-endpoint="https://fresherdinners.com.sg/api/collect" 4080></script>
4080 4081<meta name="shopify-y" content="6b261caf-2f36-46ff-b00a-f21b1bbf4dc1" data-expiration="1822930664000"><meta name="shopify-s" content="2d19306d-7a5d-43c2-9dd5-9e351cfb82af" data-expiration="1791374864000"><meta name="new-cookie-storage-activated" content="t"> 4082</head> 4083 <style> 4084 @import url('https://fonts.googleapis.com/css2?family=Bitter:ital,wght@0,100..900;1,100..900&display=swap'); 4085 @import url('https://fonts.googleapis.com/css2?family=Candal&display=swap'); 4086 </style> 4087 <body class="index page-width-normal card-hover-effect-none 4088 4089 user-not-login 4090"> 4091 <a 4092 class="skip-to-content-link button-secondary" 4093 href="#MainContent" 4094> 4095 Skip to content 4096</a> 4097 4098 4099 4100 <div id="header-group"> 4101 <!-- BEGIN sections: header-group --> 4102<header id="shopify-section-sections--21415153402069__header_section" class="shopify-section shopify-section-group-header-group header-section"> 4103 4104 4105 4106 4107
4108<script type="application/ld+json"> 4109 { 4110 "@context": "http://schema.org", 4111 "@type": "Organization", 4112 "name": "Fresher Dinners", 4113 4114 "logo": "https:\/\/fresherdinners.com.sg\/cdn\/shop\/files\/fresherdinners-logo-live-r0fqa8b2jhosi6y07txsv88nst1ozsiuiuhhh1zagy.png?v=1772728733\u0026width=500", 4115 4116 "url": "https:\/\/fresherdinners.com.sg" 4117 } 4118</script>
4118 4119 4120<header-component 4121 id="header-component" 4122 class="header" 4123 data-theme-color="rgb(250 247 243)" 4124 4125 4126 sticky="always" 4127 4128 data-skip-node-update 4129 data-scroll-direction="none" 4130><h1 class="visually-hidden">Fresher Dinners</h1> 4131 4132 4133 4134 4135 4136 4137 <div 4138 class="header__row header__row--top color-scheme-1 section section--full-width-margin section--page-width" 4139 ref="headerRowTop"style="--border-bottom-width: 0px; --border-bottom-width-mobile: 0px;"> 4140 <div class="header__columns spacing-style"> 4141 <div 4142 class="header__column header__column--left" 4143 data-testid="header-top-left" 4144 > 4145 4146 4147 4148 4149 4150 4151 4152 <div 4153 class="header__drawer" 4154 ref="headerDrawerContainer" 4155 data-hydration-key="header-drawer-mobile" 4156 4157 > 4158 4159
4160<script 4161 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/header-drawer.js?v=121243031541024704371775201778" 4162 type="module" 4163 fetchpriority="low" 4164></script>
4164 4165 4166<header-drawer 4167 class="header-drawer " 4168 style="--menu-image-border-radius: 0px; --resource-card-corner-radius: 0px;" 4169> 4170 <details 4171 id="Details-menu-drawer-container" 4172 data-skip-node-update="true" 4173 class="menu-drawer-container" 4174 ref="details" 4175 scroll-lock 4176 > 4177 <summary 4178 class="header__icon header__icon--menu header__icon--summary" 4179 aria-label="Menu" 4180 on:click="/toggle" 4181 > 4182 <span class="svg-wrapper header-drawer-icon header-drawer-icon--open"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4183 <path d="M1 3.5H13" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 4184 <path d="M1 10.5H13" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round"/> 4185</svg> 4186</span> 4187 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4188 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4189 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4190</svg> 4191</span> 4192 </summary> 4193 <div 4194 ref="menuDrawer" 4195 class=" 4196 menu-drawer 4197 color-scheme-1 4198 " 4199 > 4200 <button 4201 class="button close-button menu-drawer__close-button" 4202 type="button" 4203 aria-label="Close" 4204 on:click="/close" 4205 > 4206 <span class="svg-wrapper header-drawer-icon header-drawer-icon--close"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4207 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4208 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4209</svg> 4210</span> 4211 </button> 4212 <nav 4213 class="menu-drawer__navigation" 4214 style="--menu-top-level-font-family: var(--font-body--family); 4215--menu-top-level-font-size-desktop: 0.875rem; --menu-top-level-font-style: var(--font-body--style); --menu-top-level-font-weight: var(--font-body--weight); --menu-top-level-font-case:none; 4216 4217 --menu-top-level-font-size: var(--menu-font-2xl--size); --menu-top-level-font-line-height: 4218 var(--menu-font-2xl--line-height); 4219 4220--menu-top-level-font-color: var(--color-foreground); --menu-top-level-font-color-rgb: var(--color-foreground-rgb); 4221 4222--menu-parent-font-family: var(--font-body--family); --menu-parent-font-style: 4223var(--font-body--style); --menu-parent-font-weight: var(--font-body--weight); --menu-parent-font-case: 4224none; 4225 4226 --menu-parent-font-size: var(--menu-font-sm--size); --menu-parent-font-line-height: 4227 var(--menu-font-sm--line-height); --menu-parent-font-color: rgb(var(--color-foreground-rgb) / 4228 var(--opacity-subdued-text)); --menu-parent-active-font-color: var(--color-foreground); 4229 4230--menu-child-font-family: var(--font-body--family); --menu-child-font-style: 4231var(--font-body--style); --menu-child-font-weight: var(--font-body--weight); --menu-child-font-case: 4232none; 4233 4234 --menu-child-font-size: var(--menu-font-md--size); --menu-child-font-line-height: var(--menu-font-md--line-height); 4235 --menu-child-font-color: var(--color-foreground); --menu-child-active-font-color: rgb(var(--color-foreground-rgb) / 4236 var(--opacity-subdued-text)); 4237 4238 4239 " 4240 > 4241 <ul 4242 class="menu-drawer__menu has-submenu" 4243 role="list" 4244 > 4245 4246 4247 4248 <li 4249 style="--menu-drawer-animation-index: 1;" 4250 class="menu-drawer__list-item--flat" 4251 > 4252 4253<a 4254 id="HeaderDrawer-menu" 4255 href="/pages/menu-selector" 4256 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 4257 4258 >
4259 <span class="menu-drawer__menu-item-text wrap-text">MENU</span> 4260 </a> 4261 4262 </li> 4263 <li 4264 style="--menu-drawer-animation-index: 2;" 4265 class="menu-drawer__list-item--flat" 4266 > 4267 4268<a 4269 id="HeaderDrawer-how-it-works" 4270 href="/pages/how-it-works" 4271 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 4272 4273 > 4274 <span class="menu-drawer__menu-item-text wrap-text">How It Works</span> 4275 </a> 4276 4277 </li> 4278 <li 4279 style="--menu-drawer-animation-index: 3;" 4280 class="menu-drawer__list-item--flat" 4281 > 4282 4283<a 4284 id="HeaderDrawer-plans" 4285 href="/pages/plans" 4286 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 4287 4288 > 4289 <span class="menu-drawer__menu-item-text wrap-text">Plans</span> 4290 </a> 4291 4292 </li> 4293 <li 4294 style="--menu-drawer-animation-index: 4;" 4295 class="menu-drawer__list-item--flat" 4296 > 4297 4298<a 4299 id="HeaderDrawer-juniors" 4300 href="/pages/juniors" 4301 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 4302 4303 > 4304 <span class="menu-drawer__menu-item-text wrap-text">Juniors</span> 4305 </a> 4306 4307 </li> 4308 <li 4309 style="--menu-drawer-animation-index: 5;" 4310 class="menu-drawer__list-item--flat" 4311 > 4312 4313<a 4314 id="HeaderDrawer-faq" 4315 href="/pages/help-and-faq" 4316 class="menu-drawer__menu-item menu-drawer__menu-item--mainlist menu-drawer__animated-element focus-inset" 4317 4318 > 4319 <span class="menu-drawer__menu-item-text wrap-text">FAQ</span> 4320 </a> 4321 4322 </li> 4323 </ul> 4324 </nav> 4325 <div 4326 class="menu-drawer__utility-links menu-drawer__animated-element" 4327 style="--menu-drawer-animation-index: 5;" 4328 > 4329 4330 </div> 4331 4332 4333 </div> 4334 <div 4335 class="menu-drawer__backdrop" 4336 on:click="header-drawer/close" 4337 ></div> 4338 </details> 4339</header-drawer> 4340 4341 4342 4343 </div> 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361<a 4362 4363 href="https://fresherdinners.com.sg/pages/home-dinner-plan" 4364 class="size-style spacing-style header-logo" 4365 style=" 4366 --size-style-width: ;--size-style-height: ; 4367 --padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px; 4368 --font-family: var(--font-body--family); 4369 --font-style: var(--font-body--style); 4370 --font-weight: 600; 4371 " 4372 4373> 4374 4375 4376 <span 4377 class="header-logo__image-container header-logo__image-container--original" 4378 data-testid="header-logo" 4379 > 4380 FRESHER DINNERS 4381 4382 </span> 4383 4384 4385</a> 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 </div><div 4401 class="header__column header__column--right" 4402 data-testid="header-top-right" 4403 > 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 <header-menu 4416 ref="headerMenu" 4417 class="header-menu" 4418 4419 data-hydration-key="header-menu" 4420 > 4421 <div class="header-menu__inner"> 4422 <nav 4423 class="menu-list" 4424 style="--menu-top-level-font-family: var(--font-body--family); 4425--menu-top-level-font-size-desktop: 0.875rem; --menu-top-level-font-style: var(--font-body--style); --menu-top-level-font-weight: var(--font-body--weight); --menu-top-level-font-case:none; 4426 4427 --menu-top-level-font-size: var(--menu-font-sm--size); --menu-top-level-font-line-height: 4428 var(--menu-font-sm--line-height); 4429 4430--menu-top-level-font-color: var(--color-foreground); --menu-top-level-font-color-rgb: var(--color-foreground-rgb); 4431" 4432 > 4433 4434 <overflow-list 4435 4436 ref="overflowMenu" 4437 4438 4439 class="overflow-menu color-scheme-matches-parent" 4440 4441 4442 minimum-items="2" 4443 4444 4445 data-testid="header-menu-overflow-list" 4446 4447 4448 data-skip-node-update 4449 4450> 4451 <template shadowrootmode="open"> 4452 <link href="//fresherdinners.com.sg/cdn/shop/t/2/assets/overflow-list.css?v=78235234226353326431775201778" rel="stylesheet" type="text/css" media="all" /> 4453 4454 <ul part="list"> 4455 <slot></slot> 4456 <slot 4457 name="more" 4458 part="more" 4459 hidden 4460 4461 > 4462 <li 4463 part="more" 4464 > 4465 <button 4466 class="button" 4467 type="button" 4468 tabindex="0" 4469 > 4470 More 4471 </button> 4472 </li> 4473 </slot> 4474 <li 4475 part="placeholder" 4476 hidden 4477 ></li> 4478 </ul> 4479 4480 <div part="overflow"> 4481 <ul part="overflow-list"> 4482 <slot name="overflow"></slot> 4483 </ul> 4484 </div> 4485 </template> 4486 4487 4488 4489 <li 4490 role="presentation" 4491 class="menu-list__list-item" 4492 on:focus="/activate" 4493 on:blur="/deactivate"
4494 on:pointerenter="/activate" 4495 on:pointerleave="/deactivate" 4496 > 4497 <a 4498 href="/pages/menu-selector" 4499 data-skip-node-update="true" 4500 class="menu-list__link"ref="menuitem" 4501 > 4502 <span class="menu-list__link-title 1">MENU</span> 4503 </a></li> 4504 4505 <li 4506 role="presentation" 4507 class="menu-list__list-item" 4508 on:focus="/activate" 4509 on:blur="/deactivate" 4510 on:pointerenter="/activate" 4511 on:pointerleave="/deactivate" 4512 > 4513 <a 4514 href="/pages/how-it-works" 4515 data-skip-node-update="true" 4516 class="menu-list__link"ref="menuitem" 4517 > 4518 <span class="menu-list__link-title 1">How It Works</span> 4519 </a></li> 4520 4521 <li 4522 role="presentation" 4523 class="menu-list__list-item" 4524 on:focus="/activate" 4525 on:blur="/deactivate" 4526 on:pointerenter="/activate" 4527 on:pointerleave="/deactivate" 4528 > 4529 <a 4530 href="/pages/plans" 4531 data-skip-node-update="true" 4532 class="menu-list__link"ref="menuitem" 4533 > 4534 <span class="menu-list__link-title 1">Plans</span> 4535 </a></li> 4536 4537 <li 4538 role="presentation" 4539 class="menu-list__list-item" 4540 on:focus="/activate" 4541 on:blur="/deactivate" 4542 on:pointerenter="/activate" 4543 on:pointerleave="/deactivate" 4544 > 4545 <a 4546 href="/pages/juniors" 4547 data-skip-node-update="true" 4548 class="menu-list__link"ref="menuitem" 4549 > 4550 <span class="menu-list__link-title 1">Juniors</span> 4551 </a></li> 4552 4553 <li 4554 role="presentation" 4555 class="menu-list__list-item" 4556 on:focus="/activate" 4557 on:blur="/deactivate" 4558 on:pointerenter="/activate" 4559 on:pointerleave="/deactivate" 4560 > 4561 <a 4562 href="/pages/help-and-faq" 4563 data-skip-node-update="true" 4564 class="menu-list__link"ref="menuitem" 4565 > 4566 <span class="menu-list__link-title 1">FAQ</span> 4567 </a></li> 4568 4569 4570 <!-- Static Profile menu item ends here --> 4571 4572 <li 4573 role="presentation" 4574 class="menu-list__list-item menu-list__list-item--profile" 4575 on:focus="/activate" 4576 on:blur="/deactivate" 4577 on:pointerenter="/activate" 4578 on:pointerleave="/deactivate" 4579 > 4580 <a 4581 href="/pages/profile" 4582 data-skip-node-update="true" 4583 class="menu-list__link" 4584 ref="menuitem" 4585 > 4586 <span class="menu-list__link-title"> 4587 <svg 4588 width="22" 4589 height="22" 4590 viewBox="0 0 24 24" 4591 fill="none" 4592 xmlns="http://www.w3.org/2000/svg" 4593 aria-hidden="true" 4594 focusable="false" 4595> 4596 <circle 4597 cx="12" 4598 cy="8" 4599 r="4" 4600 stroke="currentColor" 4601 stroke-width="1.8" 4602 /> 4603 <path 4604 d="M4.5 20C4.5 16.4 7.5 13.5 12 13.5C16.5 13.5 19.5 16.4 19.5 20" 4605 stroke="currentColor" 4606 stroke-width="1.8" 4607 stroke-linecap="round" 4608 /> 4609</svg> 4610 </span> 4611 </a> 4612 </li> 4613 4614 <!-- Static Profile menu item ends here --> 4615 4616 <li 4617 class="menu-list__list-item" 4618 role="presentation" 4619 slot="more" 4620 on:focus="/activate" 4621 on:blur="/deactivate" 4622 on:pointerenter="/activate" 4623 on:pointerleave="/deactivate" 4624 > 4625 <button role="menuitem" class="menu-list__link button-unstyled"> 4626 <span class="menu-list__link-title">More</span> 4627 </button> 4628 4629 </li> 4630 4631</overflow-list> 4632 4633 </nav> 4634 </div> 4635 4636
4636<script 4637 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/header-menu.js?v=181417698387236267271775201778" 4638 type="module" 4639 fetchpriority="low" 4640 ></script>
4640 4641 </header-menu> 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671
4671<script 4672 type="module" 4673 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/cart-icon.js?v=157241182139685326961775201778" 4674 fetchpriority="low" 4675></script>
4675 4676 4677 4678 4679<header-actions> 4680 4681 <div 4682 role="presentation" 4683 class="menu-list__list-item menu-list__list-item--profile mobileacount" 4684 on:focus="/activate" 4685 on:blur="/deactivate" 4686 on:pointerenter="/activate" 4687 on:pointerleave="/deactivate" 4688 > 4689 <a 4690 href="/pages/profile" 4691 data-skip-node-update="true" 4692 class="menu-list__link" 4693 ref="menuitem" 4694 > 4695 <span class="menu-list__link-title"> 4696 <svg 4697 width="22" 4698 height="22" 4699 viewBox="0 0 24 24" 4700 fill="none" 4701 xmlns="http://www.w3.org/2000/svg" 4702 aria-hidden="true" 4703 focusable="false" 4704> 4705 <circle 4706 cx="12" 4707 cy="8" 4708 r="4" 4709 stroke="currentColor" 4710 stroke-width="1.8" 4711 /> 4712 <path 4713 d="M4.5 20C4.5 16.4 7.5 13.5 12 13.5C16.5 13.5 19.5 16.4 19.5 20" 4714 stroke="currentColor" 4715 stroke-width="1.8" 4716 stroke-linecap="round" 4717 /> 4718</svg> 4719 </span> 4720 </a> 4721 </div> 4722 4723 4724
4724<script 4725 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/cart-drawer.js?v=60516533948368149871775201778" 4726 type="module" 4727 fetchpriority="low" 4728 ></script>
4728 4729 4730 4731 4732 <cart-drawer-component 4733 class="cart-drawer" 4734 4735 4736 > 4737 <template id="empty-cart-template"> 4738 4739 <div class="cart-drawer__header"> 4740 <button 4741 ref="closeButton" 4742 on:click="cart-drawer-component/close" 4743 class="button close-button cart-drawer__close-button button-unstyled" 4744 aria-label="Close dialog" 4745 > 4746 <span class="svg-wrapper"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4747 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4748 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4749</svg> 4750</span> 4751 </button> 4752 </div> 4753 4754 <div 4755 class="cart-drawer__content" 4756 aria-label="Cart" 4757 > 4758 <h2 4759 class="cart-drawer__heading h4 cart-drawer__heading--empty" 4760 id="cart-drawer-heading-empty" 4761 > 4762 Your cart is empty 4763 </h2> 4764 4765 <div class="cart-drawer__items"> 4766 4767 4768 4769
4770<script 4771 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/component-cart-items.js?v=16199507049899445991775201778" 4772 type="module" 4773 fetchpriority="low" 4774></script>
vendor: 1 bytes, line 4774
4774
4775<script 4776 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/component-cart-quantity-selector.js?v=105130809908858639751775201778" 4777 type="module" 4778 fetchpriority="low" 4779></script>
vendor: 1 bytes, line 4779
4779
4780<script 4781 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/volume-pricing-info.js?v=94479640769665442661775201778" 4782 type="module" 4783 fetchpriority="low" 4784></script>
4784 4785 4786<div 4787 4788 class="cart-items__wrapper" 4789 4790> 4791 4792<a 4793 class="button cart-items__empty-button" 4794 href="/collections/all" 4795 > 4796 <span class="button-text"> 4797 Continue shopping 4798 </span> 4799 </a></div> 4800 4801 4802 4803 </div> 4804 </div> 4805 4806 </template> 4807 <button 4808 class="button header-actions__action button-unstyled" 4809 on:click="/open" 4810 aria-haspopup="dialog" 4811 aria-label="Cart" 4812 aria-describedby="cart-bubble-text" 4813 data-testid="cart-drawer-trigger" 4814 > 4815 4816 <cart-icon 4817 class=" 4818 header-actions__cart-icon 4819 4820 " 4821 data-testid="cart-icon" 4822 > 4823 <span 4824 class="svg-wrapper" 4825 aria-hidden="true" 4826 > 4827 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="M3.392 6.875h13.216v8.016c0 .567-.224 1.112-.624 1.513-.4.402-.941.627-1.506.627H5.522a2.13 2.13 0 0 1-1.506-.627 2.15 2.15 0 0 1-.624-1.513zM8.818 2.969h2.333c.618 0 1.211.247 1.649.686a2.35 2.35 0 0 1 .683 1.658v1.562H6.486V5.313c0-.622.246-1.218.683-1.658a2.33 2.33 0 0 1 1.65-.686"/></svg> 4828 4829 </span> 4830 4831 <div 4832 ref="cartBubble" 4833 class="cart-bubble visually-hidden" 4834 4835 4836 data-maintain-ratio 4837 4838> 4839 <span class="cart-bubble__background"></span> 4840 <span 4841 ref="cartBubbleText" 4842 id="cart-bubble-text" 4843 class="cart-bubble__text" 4844 4845 role="status" 4846 4847 > 4848 <span class="visually-hidden">Total items in cart: 0 4849 </span> 4850 <span 4851 class="cart-bubble__text-count hidden" 4852 ref="cartBubbleCount" 4853 aria-hidden="true" 4854 data-testid="cart-bubble" 4855 > 48560</span> 4857 </span> 4858</div> 4859 4860 </cart-icon> 4861 4862 </button> 4863 4864 <dialog 4865 ref="dialog" 4866 class="cart-drawer__dialog dialog-modal dialog-drawer color-scheme-1 cart-drawer--empty" 4867 aria-labelledby="cart-drawer-heading-empty" 4868 scroll-lock 4869 cart-summary-sticky="true" 4870 > 4871 <div 4872 class="cart-drawer__inner" 4873 data-hydration-key="cart-drawer-inner" 4874 > 4875 <cart-items-component 4876 class="cart-items-component" 4877 data-drawer 4878 data-section-id="sections--21415153402069__header_section" 4879 > 4880 <div class="cart-drawer__header"> 4881 <button 4882 ref="closeButton" 4883 on:click="cart-drawer-component/close" 4884 class="button close-button cart-drawer__close-button button-unstyled" 4885 aria-label="Close dialog" 4886 > 4887 <span class="svg-wrapper"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 4888 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4889 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 4890</svg> 4891</span> 4892 </button> 4893 </div> 4894 4895 <div 4896 class="cart-drawer__content" 4897 aria-label="Cart" 4898 > 4899 <h2 4900 class="cart-drawer__heading h4 cart-drawer__heading--empty" 4901 id="cart-drawer-heading-empty" 4902 > 4903 Your cart is empty 4904 </h2> 4905 4906 <div class="cart-drawer__items"> 4907 4908 4909 4910
4911<script 4912 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/component-cart-items.js?v=16199507049899445991775201778" 4913 type="module" 4914 fetchpriority="low" 4915></script>
vendor: 1 bytes, line 4915
4915
4916<script 4917 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/component-cart-quantity-selector.js?v=105130809908858639751775201778" 4918 type="module" 4919 fetchpriority="low" 4920></script>
vendor: 1 bytes, line 4920
4920
4921<script 4922 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/volume-pricing-info.js?v=94479640769665442661775201778" 4923 type="module" 4924 fetchpriority="low" 4925></script>
4925 4926 4927<div 4928 4929 class="cart-items__wrapper" 4930 4931> 4932 4933<a 4934 class="button cart-items__empty-button" 4935 href="/collections/all" 4936 > 4937 <span class="button-text"> 4938 Continue shopping 4939 </span> 4940 </a></div> 4941 4942 4943 4944 </div> 4945 </div> 4946 4947</cart-items-component> 4948 </div> 4949 </dialog> 4950 </cart-drawer-component> 4951 4952<a 4953 href="/pages/plans" 4954 class="custom-btn" 4955> 4956 See Plans & Pricing 4957</a> 4958 4959</header-actions> 4960 4961 4962 <style> 4963.custom-btn { 4964 font-family: Kiona-bold, 'Josefin Sans', sans-serif; 4965 font-size: 14px; 4966 letter-spacing: 0.1em; 4967 color: #ffffff; 4968 background: #cc5a30; 4969 padding: 0.6rem 1.6rem; 4970 text-decoration: none; 4971 transition: background 0.2s ease; 4972 display: inline-block; 4973 font-weight: 700; 4974 width: max-content; 4975 text-align: center; 4976} 4977.custom-btn:hover { 4978 background: #b94e27; 4979} 4980.header cart-drawer-component.cart-drawer { 4981 display: none; 4982} 4983</style> 4984 4985 4986 4987 4988 </div> 4989 </div> 4990 </div> 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002</header-component> 5003
5004<script 5005 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/header.js?v=36718054510661947891775201778" 5006 type="module" 5007></script>
5007 5008
5009<script> 5010 window.addEventListener('scroll', function () { 5011 const header = document.querySelector('.header__row--top'); 5012 5013 if (!header) return; 5014 5015 if (window.scrollY > 0) { 5016 header.classList.add('is-active'); 5017 } else { 5018 header.classList.remove('is-active'); 5019 } 5020}); 5021</script>
5021 5022 5023 5024 5025 5026 5027
5027<script type="module"> 5028 import { hydrate } from '@theme/section-hydration'; 5029 const url = new URL(window.location.href); 5030 url.searchParams.delete('page'); 5031 hydrate('sections--21415153402069__header_section', url); 5032 </script>
5032 5033 5034 5035</header><div id="shopify-section-sections--21415153402069__17760573989f7d0ab2" class="shopify-section shopify-section-group-header-group section-wrapper"> 5036 5037 5038 5039<div class="section-background color-scheme-1"></div> 5040<div 5041 class="section section--page-width color-scheme-1" 5042 data-testid="ui-test-section" 5043 5044 5045 5046 style=" 5047 5048 5049 5050 " 5051> 5052 <div class="custom-section-background"> 5053 5054 5055 5056 5057 </div> 5058 5059 <div 5060 class="border-style custom-section-content" 5061 style="--border-width: 1px; --border-style: none; --border-color: 5062rgb(var(--color-border-rgb) / 1.0); --border-radius: 50630px; 5064" 5065 > 5066 5067 5068 <div 5069 class=" 5070 5071 spacing-style 5072 layout-panel-flex 5073 layout-panel-flex--column 5074 section-content-wrapper 5075 mobile-column 5076 " 5077 style=" 5078 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 5079 5080--gap: 12px; 5081 5082--horizontal-alignment: flex-start; --vertical-alignment: center; 5083--vertical-alignment-mobile: center; 5084 5085 --padding-block-start: 0px;--padding-block-end: 0px; 5086 " 5087 data-testid="section-content" 5088 > 5089 5090 5091 5092 </div> 5093 </div> 5094</div> 5095 5096 5097 5098 5099 5100</div><div id="shopify-section-sections--21415153402069__177605752264a532fd" class="shopify-section shopify-section-group-header-group section-wrapper"> 5101 5102 5103 5104<div class="section-background color-scheme-1"></div> 5105<div 5106 class="section section--page-width color-scheme-1" 5107 data-testid="ui-test-section" 5108 5109 5110 5111 style=" 5112 5113 5114 5115 " 5116> 5117 <div class="custom-section-background"> 5118 5119 5120 5121 5122 </div> 5123 5124 <div 5125 class="border-style custom-section-content" 5126 style="--border-width: 1px; --border-style: none; --border-color: 5127rgb(var(--color-border-rgb) / 1.0); --border-radius: 51280px; 5129" 5130 > 5131 5132 5133 <div 5134 class=" 5135 5136 spacing-style 5137 layout-panel-flex 5138 layout-panel-flex--column 5139 section-content-wrapper 5140 mobile-column 5141 " 5142 style=" 5143 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 5144 5145--gap: 12px; 5146 5147--horizontal-alignment: flex-start; --vertical-alignment: center; 5148--vertical-alignment-mobile: center; 5149 5150 --padding-block-start: 0px;--padding-block-end: 0px; 5151 " 5152 data-testid="section-content" 5153 > 5154 5155 5156 5157 </div> 5158 </div> 5159</div> 5160 5161 5162 5163 5164 5165</div><div id="shopify-section-sections--21415153402069__17760578677fe58d4e" class="shopify-section shopify-section-group-header-group section-wrapper"> 5166 5167 5168 5169<div class="section-background color-scheme-1"></div> 5170<div 5171 class="section section--page-width color-scheme-1" 5172 data-testid="ui-test-section" 5173 5174 5175 5176 style=" 5177 5178 5179 5180 " 5181> 5182 <div class="custom-section-background"> 5183 5184 5185 5186 5187 </div> 5188 5189 <div 5190 class="border-style custom-section-content" 5191 style="--border-width: 1px; --border-style: none; --border-color: 5192rgb(var(--color-border-rgb) / 1.0); --border-radius: 51930px; 5194" 5195 > 5196 5197 5198 <div 5199 class=" 5200 5201 spacing-style 5202 layout-panel-flex 5203 layout-panel-flex--column 5204 section-content-wrapper 5205 mobile-column 5206 " 5207 style=" 5208 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 5209 5210--gap: 12px; 5211 5212--horizontal-alignment: flex-start; --vertical-alignment: center; 5213--vertical-alignment-mobile: center; 5214 5215 --padding-block-start: 0px;--padding-block-end: 0px; 5216 " 5217 data-testid="section-content" 5218 > 5219 5220 5221 5222 </div> 5223 </div> 5224</div> 5225 5226 5227 5228 5229 5230</div><div id="shopify-section-sections--21415153402069__17760595209405dc20" class="shopify-section shopify-section-group-header-group section-wrapper"> 5231 5232 5233 5234<div class="section-background color-scheme-1"></div> 5235<div 5236 class="section section--page-width color-scheme-1" 5237 data-testid="ui-test-section" 5238 5239 5240 5241 style=" 5242 5243 5244 5245 " 5246> 5247 <div class="custom-section-background"> 5248 5249 5250 5251 5252 </div> 5253 5254 <div 5255 class="border-style custom-section-content" 5256 style="--border-width: 1px; --border-style: none; --border-color: 5257rgb(var(--color-border-rgb) / 1.0); --border-radius: 52580px; 5259" 5260 > 5261 5262 5263 <div 5264 class=" 5265 5266 spacing-style 5267 layout-panel-flex 5268 layout-panel-flex--column 5269 section-content-wrapper 5270 mobile-column 5271 " 5272 style=" 5273 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 5274 5275--gap: 12px; 5276 5277--horizontal-alignment: flex-start; --vertical-alignment: center; 5278--vertical-alignment-mobile: center; 5279 5280 --padding-block-start: 0px;--padding-block-end: 0px; 5281 " 5282 data-testid="section-content" 5283 > 5284 5285 5286 5287 </div> 5288 </div> 5289</div> 5290 5291 5292 5293 5294 5295</div><div id="shopify-section-sections--21415153402069__17760616087c9efc29" class="shopify-section shopify-section-group-header-group section-wrapper"> 5296 5297 5298 5299<div class="section-background color-scheme-1"></div> 5300<div 5301 class="section section--page-width color-scheme-1" 5302 data-testid="ui-test-section" 5303 5304 5305 5306 style=" 5307 5308 5309 5310 " 5311> 5312 <div class="custom-section-background"> 5313 5314 5315 5316 5317 </div> 5318 5319 <div 5320 class="border-style custom-section-content" 5321 style="--border-width: 1px; --border-style: none; --border-color: 5322rgb(var(--color-border-rgb) / 1.0); --border-radius: 53230px; 5324" 5325 > 5326 5327 5328 <div 5329 class=" 5330 5331 spacing-style 5332 layout-panel-flex 5333 layout-panel-flex--column 5334 section-content-wrapper 5335 mobile-column 5336 " 5337 style=" 5338 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 5339 5340--gap: 12px; 5341 5342--horizontal-alignment: flex-start; --vertical-alignment: center; 5343--vertical-alignment-mobile: center; 5344 5345 --padding-block-start: 0px;--padding-block-end: 0px; 5346 " 5347 data-testid="section-content" 5348 > 5349 5350 5351 5352 </div> 5353 </div> 5354</div> 5355 5356 5357 5358 5359 5360</div><div id="shopify-section-sections--21415153402069__1776063829d038887f" class="shopify-section shopify-section-group-header-group section-wrapper"> 5361 5362 5363 5364<div class="section-background color-scheme-1"></div> 5365<div 5366 class="section section--page-width color-scheme-1" 5367 data-testid="ui-test-section" 5368 5369 5370 5371 style=" 5372 5373 5374 5375 " 5376> 5377 <div class="custom-section-background"> 5378 5379 5380 5381 5382 </div> 5383 5384 <div 5385 class="border-style custom-section-content" 5386 style="--border-width: 1px; --border-style: none; --border-color: 5387rgb(var(--color-border-rgb) / 1.0); --border-radius: 53880px; 5389" 5390 > 5391 5392 5393 <div 5394 class=" 5395 5396 spacing-style 5397 layout-panel-flex 5398 layout-panel-flex--column 5399 section-content-wrapper 5400 mobile-column 5401 " 5402 style=" 5403 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 5404 5405--gap: 12px; 5406 5407--horizontal-alignment: flex-start; --vertical-alignment: center; 5408--vertical-alignment-mobile: center; 5409 5410 --padding-block-start: 0px;--padding-block-end: 0px; 5411 " 5412 data-testid="section-content" 5413 > 5414 5415 5416 5417 </div> 5418 </div> 5419</div> 5420 5421 5422 5423 5424 5425</div><div id="shopify-section-sections--21415153402069__1776159488bfa156b1" class="shopify-section shopify-section-group-header-group section-wrapper"> 5426 5427 5428 5429<div class="section-background color-scheme-1"></div> 5430<div 5431 class="section section--page-width color-scheme-1" 5432 data-testid="ui-test-section" 5433 5434 5435 5436 style=" 5437 5438 5439 5440 " 5441> 5442 <div class="custom-section-background"> 5443 5444 5445 5446 5447 </div> 5448 5449 <div 5450 class="border-style custom-section-content" 5451 style="--border-width: 1px; --border-style: none; --border-color: 5452rgb(var(--color-border-rgb) / 1.0); --border-radius: 54530px; 5454" 5455 > 5456 5457 5458 <div 5459 class=" 5460 5461 spacing-style 5462 layout-panel-flex 5463 layout-panel-flex--column 5464 section-content-wrapper 5465 mobile-column 5466 " 5467 style=" 5468 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 5469 5470--gap: 12px; 5471 5472--horizontal-alignment: flex-start; --vertical-alignment: center; 5473--vertical-alignment-mobile: center; 5474 5475 --padding-block-start: 0px;--padding-block-end: 0px; 5476 " 5477 data-testid="section-content" 5478 > 5479 5480 5481 5482 </div> 5483 </div> 5484</div> 5485 5486 5487 5488 5489 5490</div><div id="shopify-section-sections--21415153402069__1782990040dca571e4" class="shopify-section shopify-section-group-header-group section-wrapper"> 5491 5492 5493 5494<div class="section-background color-scheme-1"></div> 5495<div 5496 class="section section--page-width color-scheme-1" 5497 data-testid="ui-test-section" 5498 5499 5500 5501 style=" 5502 5503 5504 5505 " 5506> 5507 <div class="custom-section-background"> 5508 5509 5510 5511 5512 </div> 5513 5514 <div 5515 class="border-style custom-section-content" 5516 style="--border-width: 1px; --border-style: none; --border-color: 5517rgb(var(--color-border-rgb) / 1.0); --border-radius: 55180px; 5519" 5520 > 5521 5522 5523 <div 5524 class=" 5525 5526 spacing-style 5527 layout-panel-flex 5528 layout-panel-flex--column 5529 section-content-wrapper 5530 mobile-column 5531 " 5532 style=" 5533 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 5534 5535--gap: 12px; 5536 5537--horizontal-alignment: flex-start; --vertical-alignment: center; 5538--vertical-alignment-mobile: center; 5539 5540 --padding-block-start: 0px;--padding-block-end: 0px; 5541 " 5542 data-testid="section-content" 5543 > 5544 5545 <div id="shopify-block-AdDlwb0VMejFJaDZMV__credit_system_low_credit_banner_Vqqzzf" class="shopify-block shopify-app-block"><!-- BEGIN app snippet: low-credit-banner --><link href="//cdn.shopify.com/extensions/01a0c3d1-9ffb-7fc0-a40e-7ef0b76a0dd3/credit-system-1119/assets/collection-extension.css" rel="stylesheet" type="text/css" media="all" />
5546<script src="https://cdn.shopify.com/extensions/01a0c3d1-9ffb-7fc0-a40e-7ef0b76a0dd3/credit-system-1119/assets/low-credit-banner.js" defer></script>
5546 5547 5548 5549<!-- END app snippet --> 5550 5551</div> 5552 5553 </div> 5554 </div> 5555</div> 5556 5557 5558 5559 5560 5561</div> 5562<!-- END sections: header-group --> 5563 </div> 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573
5573<script> 5574 // Inline header height and menu style calculations to prevent layout shift 5575 // Note: Updates in calculateHeaderGroupHeight(), updateTransparentHeaderOffset() and setHeaderMenuStyle() utilities.js should be kept in sync with this function 5576 (function setHeaderHeighCustomProperties() { 5577 /* 5578 * Header calculation functions for maintaining CSS variables 5579 * Mimic calculateHeaderGroupHeight() in utilities.js 5580 */ 5581 const header = document.querySelector('header-component'); 5582 const headerGroup = document.querySelector('#header-group'); 5583 const hasHeaderSection = headerGroup?.querySelector('.header-section'); 5584 5585 if (!header || !headerGroup) return; 5586 5587 const headerHeight = header.offsetHeight; 5588 5589 // Calculate the total height of the header group 5590 let headerGroupHeight = 0; 5591 const children = headerGroup.children; 5592 for (let i = 0; i < children.length; i++) { 5593 const element = children[i]; 5594 if (element === header || !(element instanceof HTMLElement)) continue; 5595 headerGroupHeight += element.offsetHeight; 5596 } 5597 5598 // Check for transparent header special case 5599 if (header.hasAttribute('transparent') && header.parentElement?.nextElementSibling) { 5600 headerGroupHeight += headerHeight; 5601 } 5602 5603 // Set CSS variables 5604 document.body.style.setProperty('--header-height', `${headerHeight}px`); 5605 document.body.style.setProperty('--header-group-height', `${headerGroupHeight}px`); 5606 5607 /** 5608 * Updates CSS custom properties for transparent header offset calculation 5609 * Mimic updateTransparentHeaderOffset() in utilities.js 5610 */ 5611 5612 if (!hasHeaderSection || !header?.hasAttribute('transparent')) { 5613 document.body.style.setProperty('--transparent-header-offset-boolean', '0'); 5614 return; 5615 } 5616 5617 const hasImmediateSection = hasHeaderSection.nextElementSibling?.classList.contains('shopify-section'); 5618 5619 const shouldApplyOffset = !hasImmediateSection ? '1' : '0'; 5620 document.body.style.setProperty('--transparent-header-offset-boolean', shouldApplyOffset); 5621 })(); 5622 5623 (function setHeaderMenuStyle() { 5624 const headerComponent = document.querySelector('#header-component'); 5625 if (headerComponent) { 5626 const isTouchDevice = 'ontouchstart' in window && navigator.maxTouchPoints > 0; 5627 const overflowList = headerComponent?.querySelector('overflow-list'); 5628 const hasReachedMinimum = overflowList && overflowList.hasAttribute('minimum-reached'); 5629 headerComponent.dataset.menuStyle = isTouchDevice || hasReachedMinimum ? 'drawer' : 'menu'; 5630 } 5631 })(); 5632 </script>
5632 5633 5634 <main 5635 id="MainContent" 5636 class="content-for-layout" 5637 role="main" 5638 data-page-transition-enabled="false" 5639 data-product-transition="false" 5640 data-template="index" 5641 > 5642 <section id="shopify-section-template--21415158382805__fd_app_section_mYAtPN" class="shopify-section"><style> 5643 #fd-sec-template--21415158382805__fd_app_section_mYAtPN { 5644 --fd-splash-bg: #faf6f0; 5645 --fd-splash-text: #2b2418; 5646 --fd-btn-bg: #c4623a; 5647 --fd-btn-text: #ffffff; 5648 --fd-accent: #aeaeae; 5649 --fd-charcoal: #2B2418; 5650 --fd-muted: #8c7b6b; 5651 --fd-white: #faf6f0; 5652 --fd-border: #E0D8CE; 5653 } 5654 .fds-wrap { 5655 background-image: url('https://cdn.shopify.com/s/files/1/0793/5131/6693/files/food-hero-welcome-iNjTnbbpdDDXdA3rhHMo3P.webp?v=1779280207'); 5656 background-position: center; 5657 background-size: cover; 5658 width: 100%; 5659 height: 100vh; 5660 position:relative; 5661 } 5662 .fds-wrap::before { 5663 content: ""; 5664 width: 100%; 5665 height:100%; 5666 background: linear-gradient(rgba(0, 0, 0, 0.05) 0%, rgba(0, 0, 0, 0.3) 40%, rgba(0, 0, 0, 0.75) 75%, rgba(0, 0, 0, 0.88) 100%); 5667 position: absolute; 5668 left: 0; 5669 bottom: 0; 5670 z-index: 0; 5671 /* opacity: 0.8; */ 5672 } 5673 .fds-wrap { 5674 min-height: 100%; 5675 5676 display: flex; 5677 align-items: center; 5678 justify-content: center; 5679 /* padding: 20px; */ 5680 } 5681 .fds-phone { 5682 width: 100%; 5683 overflow: hidden; 5684 position: relative; 5685 display: flex; 5686 flex-direction: column; 5687 height:100%; 5688 } 5689 5690 5691 .fds-splash { 5692 flex: 1; 5693 display: flex; 5694 flex-direction: column; 5695 align-items: center; 5696 justify-content: end; 5697 padding: 70px 40px; 5698 gap: 20px; 5699 transition: opacity .4s ease, transform .4s ease; 5700 height: 100%; 5701 } 5702 .fds-splash.fds-hidden { 5703 opacity: 0; transform: scale(.96); pointer-events: none; 5704 position: absolute; inset: 0; 5705 } 5706 5707 .fds-logo { 5708 width: 80px; height: 80px; background: var(--fd-btn-bg); 5709 border-radius: 22px; 5710 display: flex; align-items: center; justify-content: center; 5711 box-shadow: 0 8px 24px rgba(0,0,0,.2); 5712 animation: fdsFloat 3s ease-in-out infinite; 5713 display:none; 5714 } 5715 @keyframes fdsFloat { 0%,100%{transform:translateY(0)} 50%{transform:translateY(-6px)} } 5716 .fds-logo img { width: 44px; height: 44px; object-fit: contain; } 5717 .fds-logo svg { width: 40px; height: 40px; } 5718 .fds-brand { 5719 font-family: kiona, sans-serif; 5720 text-transform: uppercase; 5721 font-size: 34px; 5722 color: rgb(255 255 255); 5723 text-align: center; 5724 line-height: 1.1; 5725 margin-bottom: 5px; 5726 letter-spacing: 0.094em; 5727 font-weight: 800; 5728 } 5729 .fds-tagline { 5730 font-family: Bitter, serif; 5731 text-align: center; 5732 font-size: 16px; 5733 margin: 0px; 5734 color: #d9d9d9; 5735 font-weight: 600; 5736 } 5737 .fds-btn-cta { 5738 background: var(--fd-btn-bg); 5739 color: var(--fd-btn-text); 5740 border-width: medium; 5741 border-style: none; 5742 border-color: currentcolor; 5743 border-image: initial; 5744 border-radius: 2px; 5745 padding: 16px 48px; 5746 font-family: kiona, sans-serif; 5747 text-transform: uppercase; 5748 font-size: 16px; 5749 letter-spacing: 0.094em; 5750 cursor: pointer; 5751 box-shadow: rgba(196, 98, 58, 0.35) 0px 4px 16px; 5752 opacity: 1; 5753 transform: none; 5754 font-weight: 600; 5755 } 5756 .fds-btn-cta:hover { filter: brightness(1.08); } 5757 .fds-btn-cta:active { transform: scale(.97); } 5758 5759 .fds-signin { 5760 color: #ffffff; 5761 font-family: Bitter, serif; 5762 font-size: 14px; 5763 margin: 0; 5764 } 5765 .fds-signin a { color: var(--fd-accent); font-weight: 600; text-decoration: underline; } 5766 .fds-signin a:hover { text-decoration: none; } 5767 5768 .fds-signin a:focus, .fds-signin a:active { 5769 color:#fff; 5770 } 5771 /* ââ SLIDER ââ */ 5772 .fds-slider { 5773 flex: 1; 5774 display: none; 5775 flex-direction: column; 5776 background: var(--fd-white); 5777 overflow: hidden; 5778 } 5779 .fds-slider.fds-on { display: flex; } 5780 5781 .fds-viewport { flex: 1; display: flex; overflow: hidden; position: relative; } 5782 .fds-track { 5783 display: flex; width: 100%; 5784 transition: transform .45s cubic-bezier(.65,0,.35,1); will-change: transform; 5785 } 5786 5787 .fds-slide { min-width: 100%; display: flex; flex-direction: column; } 5788 .fds-slide-img { 5789 width: 100%; 5790 5791 height: 45%; 5792 position: relative; 5793 overflow: hidden; 5794 flex-shrink: 0; 5795 } 5796 .fds-slide-img img { width: 100%; height: 100%; object-fit: cover; display: block; } 5797 .fds-slide-img::after { 5798 content: ''; 5799 position: absolute; 5800 bottom: 0px; 5801 left: 0px; 5802 right: 0px; 5803 height: 80px; 5804 background: linear-gradient(transparent, rgb(250, 246, 240)); 5805 } 5806 .fds-badge { 5807 position: absolute; 5808 top: 20px; 5809 right: 20px; 5810 background: rgba(255, 255, 255, 0.8); 5811 border-width: medium; 5812 border-style: none; 5813 border-color: currentcolor; 5814 border-image: initial; 5815 border-radius: 20px; 5816 padding: 6px 14px ; 5817 font-family: Bitter, serif; 5818 font-size: 13px; 5819 color: rgb(140, 123, 107); 5820 cursor: pointer; 5821 } 5822 .fds-skip-btn { 5823 position: absolute; 5824 top: 20px; 5825 right: 20px; 5826 z-index: 99; 5827 background: rgba(255,255,255,0.85); 5828 color: var(--fd-muted); 5829 font-family: Bitter, serif; 5830 font-size: 13px; 5831 padding: 6px 16px; 5832 border-radius: 20px; 5833 text-decoration: none; 5834 cursor: pointer; 5835 } 5836 .fds-skip-btn:hover { 5837 background: white; 5838 color: var(--fd-accent); 5839 } 5840 h4.input-heading { 5841 font-family: 'kiona'; 5842 font-size: 12px; 5843 font-weight: 600; 5844 letter-spacing: 0.094em; 5845 margin-bottom: 20px; 5846} 5847 .input-wapper input { 5848 width: 100%; 5849 background: rgb(255, 255, 255); 5850 border: 1.5px solid rgb(232, 228, 220); 5851 border-radius: 2px; 5852 padding: 0.875rem 1rem; 5853 font-family: Bitter, serif; 5854 font-size: 0.9375rem; 5855 color: rgb(0, 0, 0); 5856 outline: none; 5857 box-sizing: border-box; 5858 transition: border-color 160ms; 5859 } 5860 .fds-content { 5861 padding: 24px 28px 32px; 5862 display: flex; 5863 flex-direction: column; 5864 gap: 10px; 5865 } 5866 .input-wapper { 5867 padding: 24px 28px 32px; 5868 } 5869 .fds-step { 5870 font-size: 12px; 5871 font-weight: 700; 5872 letter-spacing: .14em; 5873 text-transform: uppercase; 5874 color: var(--fd-accent); 5875 } 5876 .fds-title { 5877 width: 240px; 5878 font-family: kiona, sans-serif; 5879 text-transform: uppercase; 5880 font-size: 22px; 5881 color: rgb(44, 36, 22); 5882 line-height: 1.3; 5883 margin-bottom: 10px; 5884 white-space: pre-line; 5885 letter-spacing: 0.094em; 5886 } 5887 .fds-desc { 5888 font-size: 15px; 5889 color: var(--fd-muted); 5890 line-height: 1.65;
5891 flex: 1; 5892 margin: 0; 5893 } 5894 5895 .fds-dots { 5896 display: flex; 5897 gap: 6px; 5898 justify-content: center; 5899 padding-bottom: 4px; 5900 } 5901 .fds-dot { 5902 width: 7px; 5903 height: 7px; 5904 border-radius: 50%; 5905 background: var(--dot-color); 5906 transition: width .3s, background .3s, border-radius .3s; 5907 } 5908 .fds-dot.fds-dot-on { 5909 width: 24px; 5910 border-radius: 4px; 5911 background: var(--dot-active); 5912 } 5913 .fds-dots-sec { 5914 display: flex; 5915 align-items: center; 5916 justify-content: space-between; 5917 padding: 0px 28px 20px; 5918 display: none; 5919 } 5920 .fds-nav { 5921 display: flex; 5922 gap: 12px; 5923 /* padding: 14px 32px 36px ; */ 5924 width: 50%; 5925 /* margin-left: auto ; */ 5926 justify-content: end; 5927 } 5928 .fds-btn-prev { 5929 padding: 8px ; 5930 font-size: 14px; 5931 font-weight: 600; 5932 color: var(--fd-charcoal); 5933 transition: border-color .2s, color .2s; 5934 width: 48px; 5935 height: 48px; 5936 border-radius: 2px; 5937 border: 2px solid rgb(232, 221, 208); 5938 background: white; 5939 display: flex;
5940 align-items: center; 5941 justify-content: center; 5942 cursor: pointer; 5943 } 5944 .fds-btn-prev:hover { 5945 border-color: var(--fd-accent); 5946 color: var(--fd-accent); 5947 } 5948 .fds-btn-next { 5949 padding: 8px ; 5950 background: var(--next-color); 5951 border: none; 5952 font-size: 14px; 5953 font-weight: 700; 5954 letter-spacing: .08em; 5955 text-transform: uppercase; 5956 color: var(--fd-btn-text); 5957 transition: filter .2s, transform .15s; 5958 width: 48px; 5959 height: 48px; 5960 border-radius: 2px; 5961 display: flex; 5962 align-items: center; 5963 justify-content: center; 5964 cursor: pointer; 5965 box-shadow: rgba(196, 98, 58, 0.333) 0px 4px 12px; 5966 } 5967 .fds-btn-next:hover { 5968 filter: brightness(1.08); 5969 } 5970 .fds-btn-next:active { 5971 transform: scale(.97); 5972 } 5973 .fds-btn-next.fds-finish { 5974 background: #3A7D44; 5975 box-shadow: 0 5px 18px rgba(58,125,68,.3); 5976 } 5977 .header-box { 5978 display: flex; 5979 flex-direction: column; 5980 align-items: center; 5981 } 5982 span.line { 5983 width: 100%; 5984 height: 1px; 5985 background: #fff; 5986 display: inline-block; 5987 max-width: 30%; 5988 } 5989 span.line.bottom { 5990 margin-top: 5px; 5991 } 5992 .fds-brand { 5993 margin: 15px 0; 5994 } 5995 .custom-onboarding-btn { 5996 width: 100%; 5997 background: #cc5a30; 5998 color: #fff; 5999 border: none; 6000 /* border-radius: 6px; */ 6001 padding: 16px; 6002 font-size: 11px; 6003 letter-spacing: 0.14em; 6004 text-transform: uppercase; 6005 cursor: pointer; 6006 transition: all 0.25s ease; 6007 font-family: sans-serif; 6008 font-weight: 600; 6009 margin-top: 17px; 6010 } 6011 .custom-onboarding-btn a { 6012 text-align: center; 6013 color: #fff; 6014 } 6015 .custom-onboarding-btn:hover { 6016 background: #b44c27; 6017 transform: translateY(-2px); 6018 } 6019 6020 @media (min-width: 768px) { 6021 #fd-sec-template--21415158382805__fd_app_section_mYAtPN { 6022 display: none; 6023 } 6024 } 6025 @media (max-width:768px){ 6026 .fds-btn-cta { 6027 width: fit-content; 6028 } 6029 } 6030</style> 6031 6032 6033 6034<link rel="preconnect" href="https://fonts.googleapis.com"> 6035<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 6036<link 6037 href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700;900&family=DM+Sans:wght@400;500;600&display=swap" 6038 rel="stylesheet" 6039> 6040<div id="fd-sec-template--21415158382805__fd_app_section_mYAtPN"> 6041 <div class="fds-wrap"> 6042 <div class="fds-phone"> 6043 <div class="fds-splash" id="fds-splash-template--21415158382805__fd_app_section_mYAtPN"> 6044 <div class="fds-logo"><img src="//fresherdinners.com.sg/cdn/shop/files/fy_100x100.png?v=1776066103" alt="<p>FRESHER <br/>DINNERS</p>"></div> 6045 <div class="header-box"> 6046 <span class="line top"> </span> 6047 <h1 class="fds-brand"><p>FRESHER <br/>DINNERS</p></h1> 6048 <span class="line bottom"> </span> 6049 </div> 6050 <p class="fds-tagline">Dinners Made Delicious</p> 6051 6052 <button class="fds-btn-cta" id="fds-start-template--21415158382805__fd_app_section_mYAtPN">GET STARTED</button> 6053 6054 <input type="hidden" id="fds-logged-in-template--21415158382805__fd_app_section_mYAtPN" value="no"> 6055 6056 <p class="fds-signin"><a href="/pages/profile">Sign in to your account</a></p> 6057 </div> 6058 6059 <div class="fds-slider" id="fds-slider-template--21415158382805__fd_app_section_mYAtPN"> 6060 6061 <div class="fds-viewport"> 6062 <div class="fds-track" id="fds-track-template--21415158382805__fd_app_section_mYAtPN"><div 6063 class="fds-slide" 6064 data-dot="#e0d8ce" 6065 data-dot-active="#c4614a" 6066 data-next="#c4614a" 6067 6068 > 6069 <div class="fds-slide-img"><span class="fds-badge"> 6070 6071 <a href="/account">Skip</a> 6072 </span><img 6073 src="//fresherdinners.com.sg/cdn/shop/files/app_onboard_1-bMcyvVqttmRGzcnGUjMoEd.webp?v=1776757010" 6074 alt="Welcome to Fresher Dinners" 6075 loading="eager" 6076 ></div> 6077 6078 <div class="fds-content"> 6079 <h2 class="fds-title">Welcome to Fresher Dinners</h2> 6080 <p class="fds-desc">Delicious, family style dinners, delivered to your door daily. Let's get you set up in under a minute.</p> 6081 </div> 6082 6083 <div class="input-wapper"> 6084 <h4 class="input-heading">What should we call you?</h4> 6085 <input type="text" placeholder="Your First Name" name="Name" id="first_name"> 6086 <button class="custom-onboarding-btn"> 6087<a href="/customer_authentication/login?return_to=%2Fpages%2Fprofile" 6088 class="fds-btn-next1" 6089 id="customer-login-btn" 6090 >
6091 <span class="login-btn-text"> 6092 Hello â Next 6093 </span> 6094 6095 <span class="login-btn-loader" aria-hidden="true"></span> 6096 </a> 6097 </button> 6098 </div> 6099 6100 </div></div> 6101 </div> 6102 <div class="fds-dots-sec"> 6103 <div class="fds-dots" id="fds-dots-template--21415158382805__fd_app_section_mYAtPN"></div> 6104 <div class="fds-nav"> 6105 <button class="fds-btn-prev" id="fds-prev-template--21415158382805__fd_app_section_mYAtPN"> 6106 6107 <svg 6108 xmlns="http://www.w3.org/2000/svg" 6109 width="32" 6110 height="32" 6111 viewBox="0 0 24 24" 6112 fill="none" 6113 stroke="#000" 6114 stroke-width="2" 6115 stroke-linecap="round" 6116 stroke-linejoin="arcs" 6117 > 6118 <path d="M15 18l-6-6 6-6"></path> 6119 </svg> 6120 </button> 6121 6122 <a href="/pages/profile" class="fds-btn-next"> 6123 6124 6125 <svg 6126 xmlns="http://www.w3.org/2000/svg" 6127 width="32" 6128 height="32"
6129 viewBox="0 0 24 24" 6130 fill="none" 6131 stroke="#fff" 6132 stroke-width="2" 6133 stroke-linecap="round" 6134 stroke-linejoin="arcs" 6135 > 6136 <path d="M9 18l6-6-6-6"></path> 6137 </svg> 6138 </a> 6139 </div> 6140 </div> 6141 </div> 6142 </div> 6143 </div> 6144</div> 6145 6146<style> 6147 .custom-onboarding-btn { 6148 position: relative; 6149 display: inline-flex; 6150 align-items: center; 6151 justify-content: center; 6152 min-width: 140px; 6153 min-height: 45px; 6154 text-decoration: none; 6155} 6156 6157.login-btn-loader { 6158 display: none; 6159 width: 18px; 6160 height: 18px; 6161 border: 2px solid currentColor; 6162 border-right-color: transparent; 6163 border-radius: 50%; 6164 animation: login-btn-spin 0.7s linear infinite; 6165} 6166 6167.custom-onboarding-btn.is-loading { 6168 pointer-events: none; 6169 cursor: wait; 6170 opacity: 0.8; 6171} 6172 6173.custom-onboarding-btn.is-loading .login-btn-text { 6174 display: none; 6175} 6176 6177.custom-onboarding-btn.is-loading .login-btn-loader { 6178 display: block; 6179} 6180 6181@keyframes login-btn-spin { 6182 to { 6183 transform: rotate(360deg); 6184 } 6185} 6186</style>
6187<script> 6188 document.addEventListener('DOMContentLoaded', function () { 6189 var loginButton = document.getElementById('customer-login-btn'); 6190 6191 if (!loginButton) return; 6192 6193 loginButton.addEventListener('click', function (event) { 6194 if (loginButton.classList.contains('is-loading')) { 6195 event.preventDefault(); 6196 return; 6197 } 6198 6199 loginButton.classList.add('is-loading'); 6200 loginButton.setAttribute('aria-disabled', 'true'); 6201 }); 6202 window.addEventListener('pageshow', function () { 6203 loginButton.classList.remove('is-loading'); 6204 loginButton.removeAttribute('aria-disabled'); 6205 }); 6206 }); 6207</script>
vendor: 2 bytes, line 6207
6207
6208<script> 6209 (function(){ 6210 var ID = 'template--21415158382805__fd_app_section_mYAtPN'; 6211 6212 6213 var params = new URLSearchParams(window.location.search); 6214 var utmSource = params.get('utm_source'); 6215 var utmMedium = params.get('utm_medium'); 6216 6217 if (utmSource === 'google' && utmMedium === 'cpc') { 6218 window.location.replace('/pages/home-dinner-plan'); 6219 return; 6220 } 6221 6222 6223 6224 6225 6226 6227 var isLoggedIn = document.getElementById('fds-logged-in-' + ID); 6228 6229if (isLoggedIn && isLoggedIn.value === 'yes') { 6230 // Logged in 6231 window.location.href = '/pages/home-dinner-plan'; 6232} else { 6233 // Logged out 6234 window.location.href = ' /pages/home-dinner-plan'; 6235} 6236 6237 var TOTAL = 1; 6238 var FINISH = '/pages/home-dinner-plan'; 6239 var FLABEL = ''; 6240 var NLABEL = ''; 6241 var cur = 0; 6242 6243 var splash = document.getElementById('fds-splash-' + ID); 6244 var slider = document.getElementById('fds-slider-' + ID); 6245 var track = document.getElementById('fds-track-' + ID); 6246 var btnPrev = document.getElementById('fds-prev-' + ID); 6247 var btnNext = document.getElementById('fds-next-' + ID); 6248 6249 function buildDots(){ 6250 var c = document.getElementById('fds-dots-' + ID); 6251 if(!c || c.dataset.built) return; 6252 c.dataset.built = '1'; 6253 for(var i = 0; i < TOTAL; i++){ 6254 var d = document.createElement('span'); 6255 d.className = 'fds-dot' + (i === 0 ? ' fds-dot-on' : ''); 6256 c.appendChild(d); 6257 } 6258 } 6259 6260 function updateDots(){ 6261 document.querySelectorAll('#fds-dots-' + ID + ' .fds-dot').forEach(function(d, idx){ 6262 d.classList.toggle('fds-dot-on', idx === cur); 6263 }); 6264 } 6265 6266 function applyColors() { 6267 var activeSlide = document.querySelectorAll('#fd-sec-' + ID + ' .fds-slide')[cur]; 6268 if(!activeSlide) return; 6269 var dot = activeSlide.getAttribute('data-dot'); 6270 var dotActive = activeSlide.getAttribute('data-dot-active'); 6271 var next = activeSlide.getAttribute('data-next'); 6272 var sec = document.getElementById('fd-sec-' + ID); 6273 if(dot) sec.style.setProperty('--dot-color', dot); 6274 if(dotActive) sec.style.setProperty('--dot-active', dotActive); 6275 if(next) sec.style.setProperty('--next-color', next); 6276 } 6277 6278 function goTo(n){ 6279 cur = Math.max(0, Math.min(n, TOTAL - 1)); 6280 track.style.transform = 'translateX(-' + (cur * 100) + '%)'; 6281 btnPrev.style.visibility = cur === 0 ? 'hidden' : 'visible'; 6282 updateDots(); 6283 applyColors(); 6284 } 6285 6286 document.getElementById('fds-start-' + ID).addEventListener('click', function(){ 6287 var loggedIn = document.getElementById('fds-logged-in-' + ID); 6288 if(loggedIn && loggedIn.value === 'yes'){ 6289 window.location.href = '/pages/home-dinner-plan'; 6290 } else { 6291 splash.classList.add('fds-hidden'); 6292 slider.classList.add('fds-on'); 6293 buildDots(); 6294 goTo(0); 6295 } 6296 }); 6297 6298 btnNext.addEventListener('click', function(){ 6299 if(cur === TOTAL - 1){ 6300 window.location.href = '/account/register'; 6301 } else { 6302 goTo(cur + 1); 6303 buildDots(); 6304 } 6305 }); 6306 6307 btnPrev.addEventListener('click', function(){ 6308 goTo(cur - 1); 6309 }); 6310 6311 var tx = 0; 6312 track.addEventListener('touchstart', function(e){ 6313 tx = e.touches[0].clientX; 6314 }, { passive: true }); 6315 6316 track.addEventListener('touchend', function(e){ 6317 var dx = e.changedTouches[0].clientX - tx; 6318 if(Math.abs(dx) > 50){ 6319 goTo(cur + (dx < 0 ? 1 : -1)); 6320 } 6321 }, { passive: true }); 6322 6323 })(); 6324</script>
6324 6325 6326 6327 6328</section> 6329 </main> 6330 6331 <!-- BEGIN sections: footer-group --> 6332<section id="shopify-section-sections--21415153238229__mobile_footer_menu_wbXgn3" class="shopify-section shopify-section-group-footer-group mobile-footer-menu"> 6333<style> 6334 6335 .mobile-footer-menu { 6336 display: none !important; 6337 visibility: visible !important; 6338 opacity: 1 !important; 6339} 6340.mobile-bottom-menu { 6341 position: fixed; 6342 left: 50%; 6343 bottom: 0; 6344 transform: translateX(-50%); 6345 width: 100%; 6346 max-width:100%; 6347 height: 60px; 6348 background: #fff; 6349 border-top: 1px solid #eee; 6350 display: flex !important; 6351 visibility: visible !important; 6352 opacity: 1 !important; 6353 align-items: center; 6354 justify-content: space-around; 6355 z-index: 999999 !important; 6356 border-radius: 2px 2px 0 0; 6357 box-shadow: 0 -4px 18px rgba(0,0,0,0.08); 6358} 6359 6360.mobile-bottom-menu__item { 6361 text-decoration: none; 6362 color: #8b6f58; 6363 display: flex; 6364 flex-direction: column; 6365 align-items: center; 6366 justify-content: center; 6367 gap: 4px; 6368 width: 100%; 6369 min-width: 55px; 6370} 6371 6372.mobile-bottom-menu__icon { 6373 display: flex; 6374 align-items: center; 6375 justify-content: center; 6376} 6377 6378.mobile-bottom-menu__icon svg, 6379.mobile-bottom-menu__icon img { 6380 width: 22px; 6381 height: 22px; 6382 display: block; 6383} 6384 6385.mobile-bottom-menu__icon svg { 6386 stroke: currentColor; 6387} 6388 6389.mobile-bottom-menu__label { 6390 font-size: 11px; 6391 font-weight: 600; 6392 line-height: 1; 6393} 6394 6395.mobile-bottom-menu__item:hover { 6396 color: #c4623a; 6397} 6398 6399.mobile-bottom-menu__fallback { 6400 font-size: 18px; 6401 color: currentColor; 6402} 6403a.mobile-bottom-menu__item.active { 6404 /* background: #c4623a; */ 6405 color: #c4623a; 6406 height: 100%; 6407 width: 100%; 6408} 6409 @media (min-width:768px) { 6410 .mobile-bottom-menu { 6411 display:none !important; 6412 } 6413 } 6414</style> 6415 6416 </section><div id="shopify-section-sections--21415153238229__section_dNLTUt" class="shopify-section shopify-section-group-footer-group section-wrapper"> 6417 6418 6419 6420<div class="section-background color-scheme-3a22a853-b27c-4989-9b28-b2fe84f28659"></div> 6421<div 6422 class="section email-wrapper section--page-width color-scheme-3a22a853-b27c-4989-9b28-b2fe84f28659" 6423 data-testid="ui-test-section" 6424 6425 6426 6427 style=" 6428 6429 6430 6431 " 6432> 6433 <div class="custom-section-background"> 6434 6435 6436 6437 6438 </div> 6439 6440 <div 6441 class="border-style custom-section-content" 6442 style="--border-width: 1px; --border-style: none; --border-color: 6443rgb(var(--color-border-rgb) / 1.0); --border-radius: 64440px; 6445" 6446 > 6447 6448 6449 <div 6450 class=" 6451 6452 spacing-style 6453 layout-panel-flex 6454 layout-panel-flex--column 6455 section-content-wrapper 6456 mobile-column 6457 " 6458 style=" 6459 --flex-direction: column; --flex-wrap: nowrap; --flex-wrap-mobile: wrap; 6460 6461--gap: 16px; 6462 6463--horizontal-alignment: center; --vertical-alignment: center; 6464--vertical-alignment-mobile: center; 6465 6466 --padding-block-start: max(20px, calc(var(--spacing-scale) * 40px));--padding-block-end: 0px; 6467 " 6468 data-testid="section-content" 6469 > 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 <div class=" spacing-style text-block text-block--AUkhkaGZQS2xocmk5Z__text_7CUCra h2 text-block--align-center " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground); --width: 100%; --max-width: var(--max-width--body-normal); --text-align: center; "> 6481 <h2>Subscribe to our emails</h2> 6482 </div> 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 <div class=" spacing-style text-block text-block--AM0RvV2svcGFoVEovU__text_Hww38A custom text-block--align-center custom-typography custom-font-size custom-color " style=" --padding-block-start: 0px; --padding-block-end:0px; --padding-inline-start:0px; --padding-inline-end:0px; --color: var(--color-foreground);--font-size: 1.125rem; --font-weight: var(--font-body--weight);--font-family: var(--font-body--family); --text-transform: none; --text-wrap: pretty; --line-height: var(--line-height--body-normal); --letter-spacing: var(--letter-spacing--body-normal); --width: 100%; --max-width: var(--max-width--body-normal); --text-align: center; "> 6499 <p>Be the first to know about new collections and special offers. </p> 6500 </div> 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510<div 6511 class="email-signup-block size-style spacing-style" 6512 style="--size-style-width:50%;--size-style-height: ;--padding-block-start: 0px;--padding-block-end: 0px;--padding-inline-start: 0px;--padding-inline-end: 0px;" 6513 6514> 6515 6516 6517<form method="post" action="/contact#contact_form" id="contact_form" accept-charset="UTF-8" class="email-signup__form spacing-style"><input type="hidden" name="form_type" value="customer" /><input type="hidden" name="utf8" value="â" /> 6518 <input 6519 name="contact[id]" 6520 type="hidden" 6521 value="EmailSignup-AV2ZoZmpvV29rTTk2Z__email_signup_WB8963" 6522 > 6523 6524 <div 6525 class="email-signup__input-group " 6526 style="--border-width: 1px; --border-radius: 0px;" 6527 > 6528 <label 6529 for="EmailInput-AV2ZoZmpvV29rTTk2Z__email_signup_WB8963" 6530 class="visually-hidden" 6531 > 6532 Email 6533 </label> 6534 <input 6535 id="EmailInput-AV2ZoZmpvV29rTTk2Z__email_signup_WB8963" 6536 class="email-signup__input email-signup__input--all paragraph " 6537 type="email" 6538 name="contact[email]" 6539 autocorrect="off" 6540 autocapitalize="off" 6541 autocomplete="email" 6542 placeholder="Email address" 6543 required 6544 6545 > 6546 <button 6547 class="email-signup__button email-signup__button--text paragraph button button--AV2ZoZmpvV29rTTk2Z__email_signup_WB8963 " 6548 6549 > 6550 6551 Get Menus & Offers 6552 6553 </button> 6554 </div></form> 6555</div> 6556 6557 6558 6559 6560 6561 6562 </div> 6563 </div> 6564</div> 6565 6566 6567 6568 6569 6570</div><div id="shopify-section-sections--21415153238229__custom_landing_footer_EnKBrP" class="shopify-section shopify-section-group-footer-group"><footer class="landing-footer"> 6571 <div class="landing-footer__inner"> 6572 6573 <div class="landing-footer__logo"> 6574 FRESHER DINNERS 6575 <br> 6576 <div class="company-address">Mandai Foodlink, 5 Mandai<br> 6577 Link #06-04,Singapore,<br> Singapore, 728654 </div> 6578 </div> 6579 6580 6581 6582 <div class="landing-footer__links"> 6583 6584 <a href="/pages/menu-selector"> 6585 Menu 6586 </a> 6587 6588 <a href="/pages/how-it-works"> 6589 How It Works 6590 </a> 6591 6592 <a href="/pages/plans"> 6593 Plans 6594 </a> 6595 6596 <a href="/pages/juniors"> 6597 Juniors 6598 </a> 6599 6600 <a href="/pages/help-and-faq"> 6601 FAQ 6602 </a> 6603 6604 <a href=""> 6605 Get Started 6606 </a> 6607 6608 </div> 6609 6610 <div class="landing-footer__social-icons"> 6611 6612 <a 6613 href="https://www.instagram.com/fresher.singapore/" 6614 class="landing-footer__social-link" 6615 target="_blank" 6616 rel="noopener noreferrer" 6617 aria-label="Instagram" 6618 > 6619 <svg 6620 width="24" 6621 height="24"
6622 viewBox="0 0 24 24" 6623 fill="none" 6624 xmlns="http://www.w3.org/2000/svg" 6625 aria-hidden="true" 6626 > 6627 <rect 6628 x="3" 6629 y="3" 6630 width="18" 6631 height="18" 6632 rx="5" 6633 stroke="currentColor" 6634 stroke-width="2" 6635 /> 6636 <circle 6637 cx="12" 6638 cy="12" 6639 r="4" 6640 stroke="currentColor" 6641 stroke-width="2" 6642 /> 6643 <circle 6644 cx="17.5" 6645 cy="6.5" 6646 r="1" 6647 fill="currentColor" 6648 /> 6649 </svg> 6650 </a> 6651 6652 6653 6654 <a 6655 href="https://www.facebook.com/fresher.singapore/" 6656 class="landing-footer__social-link" 6657 target="_blank" 6658 rel="noopener noreferrer" 6659 aria-label="Facebook" 6660 > 6661 <svg 6662 width="24" 6663 height="24" 6664 viewBox="0 0 24 24" 6665 fill="currentColor" 6666 xmlns="http://www.w3.org/2000/svg" 6667 aria-hidden="true" 6668 > 6669 <path d="M13.5 21V13.2H16.2L16.6 10.2H13.5V8.3C13.5 7.4 13.8 6.8 15.1 6.8H16.7V4.1C16.4 4.1 15.4 4 14.2 4C11.7 4 10 5.5 10 8.4V10.2H7.2V13.2H10V21H13.5Z"/> 6670 </svg> 6671 </a> 6672 6673 6674 <a 6675 href="https://wa.me/6588365052?text=Hi%20Fresher%20Dinners%2C%20I%E2%80%99m%20interested%20in%20your%20dinner%20plans." 6676 class="landing-footer__social-link" 6677 target="_blank" 6678 rel="noopener noreferrer" 6679 aria-label="WhatsApp" 6680 > 6681 <svg 6682 width="24" 6683 height="24" 6684 viewBox="0 0 24 24" 6685 fill="currentColor" 6686 xmlns="http://www.w3.org/2000/svg" 6687 aria-hidden="true" 6688 > 6689 <path d="M20.52 3.48A11.86 11.86 0 0 0 12.03 0C5.4 0 0 5.4 0 12.03c0 2.12.55 4.19 1.6 6.02L0 24l6.11-1.58A12.03 12.03 0 0 0 12.03 24C18.66 24 24 18.6 24 11.97c0-3.2-1.25-6.2-3.48-8.49ZM12.03 21.84c-1.82 0-3.6-.49-5.17-1.42l-.37-.22-3.63.94.97-3.54-.24-.37a9.8 9.8 0 1 1 8.44 4.61Zm5.39-7.34c-.3-.15-1.77-.87-2.04-.97-.27-.1-.47-.15-.67.15-.2.3-.77.97-.94 1.17-.17.2-.35.22-.65.07-.3-.15-1.28-.47-2.44-1.5-.9-.8-1.5-1.8-1.67-2.1-.17-.3-.02-.46.13-.61.13-.13.3-.35.45-.52.15-.17.2-.3.3-.5.1-.2.05-.37-.03-.52-.08-.15-.67-1.62-.92-2.22-.24-.58-.49-.5-.67-.5h-.57c-.2 0-.52.08-.8.37-.27.3-1.05 1.02-1.05 2.49s1.08 2.89 1.23 3.09c.15.2 2.13 3.25 5.17 4.56.72.31 1.29.5 1.73.64.73.23 1.39.2 1.91.12.58-.09 1.77-.72 2.02-1.42.25-.69.25-1.29.17-1.42-.08-.13-.28-.2-.58-.35Z"/> 6690 </svg> 6691 </a> 6692 6693</div> 6694 6695 </div> 6696</footer> 6697 6698<style> 6699.company-address { 6700 font-size: .82rem; 6701 color: rgba(255, 255, 255, .75); 6702 text-decoration: none; 6703 transition: opacity .2s ease; 6704 text-transform: capitalize; 6705 margin-top: 10px; 6706} 6707 6708.landing-footer { 6709 background: #cc5a30; 6710 padding: 3rem clamp(1.5rem, 8vw, 8rem); 6711 6712} 6713 6714.landing-footer__inner { 6715 display: flex; 6716 justify-content: space-between; 6717 align-items: center; 6718 flex-wrap: wrap; 6719 gap: 1.5rem; 6720} 6721 6722.landing-footer__logo { 6723 font-family: "Josefin Sans", sans-serif; 6724 font-size: 1rem; 6725 letter-spacing: .12em; 6726 color: rgba(255,255,255,.85); 6727 text-transform: uppercase; 6728} 6729 6730.landing-footer__links { 6731 display: flex; 6732 gap: 2rem; 6733 flex-wrap: wrap; 6734} 6735 6736.landing-footer__links a { 6737 font-size: .82rem; 6738 color: rgba(255,255,255,.75); 6739 text-decoration: none; 6740 transition: opacity .2s ease; 6741} 6742 6743.landing-footer__links a:hover { 6744 opacity: .8; 6745} 6746 6747</style> 6748 6749</div> 6750<!-- END sections: footer-group --> 6751 6752
6752<script 6753 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/dialog.js?v=150888536568694194021775201778" 6754 type="module" 6755></script>
6755 6756
6757<script 6758 src="//fresherdinners.com.sg/cdn/shop/t/2/assets/predictive-search.js?v=149240552485540508541775201778" 6759 type="module" 6760 fetchpriority="low" 6761></script>
6761 6762 6763<dialog-component 6764 id="search-modal" 6765 class="search-modal" 6766 6767> 6768 <dialog 6769 ref="dialog" 6770 on:click="/closeDialogOnClickOutside" 6771 on:keydown="/closeDialogOnEscapePress" 6772 class="search-modal__content dialog-modal" 6773 scroll-lock 6774 aria-labelledby="search-modal-heading" 6775 > 6776 <h2 6777 id="search-modal-heading" 6778 class="visually-hidden" 6779 > 6780 Search 6781 </h2> 6782 <predictive-search-component 6783 class="predictive-search color-scheme-1" 6784 style="--product-corner-radius: 0px; --card-corner-radius: 4px;" 6785 data-section-id="predictive-search" 6786 data-testid="search-component--modal" 6787 role="search" 6788 aria-label="Search" 6789 > 6790 <form 6791 action="/search" 6792 method="get" 6793 role="search" 6794 class="predictive-search-form" 6795 ref="form" 6796 on:keydown="/onSearchKeyDown" 6797 > 6798 <div 6799 class="predictive-search-form__header" 6800 > 6801 <div class="predictive-search-form__header-inner"> 6802 <label 6803 for="cmdk-input" 6804 class="visually-hidden" 6805 >Search</label> 6806 <input 6807 class="search-input" 6808 id="cmdk-input" 6809 type="search" 6810 name="q" 6811 role="combobox" 6812 aria-expanded="false" 6813 aria-owns="predictive-search-results" 6814 aria-controls="predictive-search-results" 6815 aria-haspopup="listbox" 6816 aria-autocomplete="list" 6817 autocomplete="off" 6818 placeholder="Search" 6819 ref="searchInput" 6820 on:input="/search" 6821 on:keydown="/onSearchKeyDown" 6822 > 6823 <input 6824 name="options[prefix]" 6825 type="hidden" 6826 value="last" 6827 > 6828 <span class="svg-wrapper predictive-search__icon"> 6829 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none"><circle cx="9" cy="9" r="4.75" stroke="currentColor" stroke-width="var(--icon-stroke-width)"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="var(--icon-stroke-width)" d="m12.5 12.5 3.25 3.25"/></svg> 6830 6831 </span> 6832 <button 6833 type="button" 6834 class="button-unstyled predictive-search__reset-button" 6835 ref="resetButton" 6836 hidden 6837 on:click="/resetSearch" 6838 > 6839 Clear 6840 </button> 6841 </div> 6842 <button 6843 type="button" 6844 class="button predictive-search__close-modal-button" 6845 aria-label="Close dialog" 6846 on:click="dialog-component/closeDialog" 6847 ref="closeModalButton" 6848 > 6849 <span class="svg-wrapper"> 6850 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 6851 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 6852 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 6853</svg> 6854 6855 </span> 6856 </button> 6857 </div> 6858 6859 <div class="predictive-search-form__content-wrapper"> 6860 <div 6861 class="predictive-search-form__content" 6862 tabindex="-1" 6863 ref="predictiveSearchResults" 6864 on:click="/handleModalClick" 6865 > 6866 6867 6868<div 6869 id="predictive-search-results" 6870 class="predictive-search-dropdown" 6871 role="listbox" 6872 aria-expanded="true" 6873 style="--color-shadow: rgb(var(--color-foreground-rgb) / 0.1);" 6874> 6875 6876 <div class="predictive-search-results__inner"> 6877 6878 6879 6880 6881 6882 <div 6883 id="predictive-search-products" 6884 class="predictive-search-results__products" 6885 6886 data-testid="products-list-default--modal" 6887 6888> 6889 6890 <h4 class="predictive-search-results__title"> 6891 Products 6892 </h4> 6893 <ul 6894 class="predictive-search-results__list predictive-search-results__wrapper-products list-unstyled" 6895 role="listbox"
6896 aria-label="Products" 6897 > 6898 6899 6900 <li 6901 class="predictive-search-results__card predictive-search-results__card--product" 6902 ref="resultsItems[]" 6903 > 6904 6905<div 6906 class="resource-card" 6907 href="/products/5-hour-slow-cooked-thick-congee" 6908 data-resource-type="product" 6909> 6910 <a 6911 class="resource-card__link" 6912 href="/products/5-hour-slow-cooked-thick-congee" 6913 > 6914 <span class="visually-hidden"> 6915 5 Hour Slow Cooked Thick Congee 6916 </span> 6917 </a> 6918 <div 6919 class="resource-card__media" 6920 style="--resource-card-aspect-ratio: 4 / 5;" 6921 6922 > 6923 6924 6925<img src="//fresherdinners.com.sg/cdn/shop/files/5.steamfishset.png?v=1784713341&width=500" alt="" srcset="//fresherdinners.com.sg/cdn/shop/files/5.steamfishset.png?v=1784713341&width=240 240w, //fresherdinners.com.sg/cdn/shop/files/5.steamfishset.png?v=1784713341&width=352 352w" width="500" height="625" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="false" style="object-position: 50.0% 50.0%;"> 6926 6927 <img src="//fresherdinners.com.sg/cdn/shop/files/superiorsteamfish.png?v=1784713351&width=500" alt="5 Hour Slow Cooked Thick Congee" srcset="//fresherdinners.com.sg/cdn/shop/files/superiorsteamfish.png?v=1784713351&width=240 240w, //fresherdinners.com.sg/cdn/shop/files/superiorsteamfish.png?v=1784713351&width=352 352w" width="500" height="625" loading="lazy" class="resource-card__image resource-card__image--secondary" sizes="auto" transitionToProduct="false" data-media-id="41875919241429" style="object-position: 50.0% 50.0%;"> 6928</div> 6929 6930 <div class="resource-card__content"> 6931 <p class="resource-card__title paragraph">5 Hour Slow Cooked Thick Congee</p> 6932 6933 6934 <div ref="priceContainer"> 6935 6936 6937 6938 6939 6940 <span class="price">$16.00</span> 6941 6942 6943 6944 6945</div> 6946 6947 </div> 6948</div> 6949 6950 </li> 6951 6952 <li 6953 class="predictive-search-results__card predictive-search-results__card--product" 6954 ref="resultsItems[]" 6955 > 6956 6957<div 6958 class="resource-card" 6959 href="/products/junior-dinner-2d" 6960 data-resource-type="product" 6961> 6962 <a 6963 class="resource-card__link" 6964 href="/products/junior-dinner-2d" 6965 > 6966 <span class="visually-hidden"> 6967 ABC chicken soup 6968 </span> 6969 </a> 6970 <div 6971 class="resource-card__media" 6972 style="--resource-card-aspect-ratio: 4 / 5;" 6973 6974 > 6975 6976 6977<img src="//fresherdinners.com.sg/cdn/shop/files/2-Tuesday-ABC_chicken_soup.png?v=1784250401&width=500" alt="" srcset="//fresherdinners.com.sg/cdn/shop/files/2-Tuesday-ABC_chicken_soup.png?v=1784250401&width=240 240w, //fresherdinners.com.sg/cdn/shop/files/2-Tuesday-ABC_chicken_soup.png?v=1784250401&width=352 352w" width="500" height="400" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="false" style="object-position: 50.0% 50.0%;"> 6978</div> 6979 6980 <div class="resource-card__content"> 6981 <p class="resource-card__title paragraph">ABC chicken soup</p> 6982 6983 6984 <div ref="priceContainer"> 6985 6986 6987 6988 6989 6990 <span class="price">$7.90</span> 6991 6992 6993 6994 6995</div> 6996 6997 </div> 6998</div> 6999 7000 </li> 7001 7002 <li 7003 class="predictive-search-results__card predictive-search-results__card--product" 7004 ref="resultsItems[]" 7005 > 7006 7007<div 7008 class="resource-card" 7009 href="/products/thursday" 7010 data-resource-type="product" 7011> 7012 <a 7013 class="resource-card__link" 7014 href="/products/thursday" 7015 > 7016 <span class="visually-hidden"> 7017 Almond Pesto Pasta with Blistered Cherry Tomatoes 7018 </span> 7019 </a> 7020 <div 7021 class="resource-card__media" 7022 style="--resource-card-aspect-ratio: 4 / 5;" 7023 7024 > 7025 7026 7027<img src="//fresherdinners.com.sg/cdn/shop/files/WhatsAppImage2026-03-13at17.04.56_1_66806044-c413-4d25-a7c3-29ae2137cf94.jpg?v=1773427677&width=500" alt="" srcset="//fresherdinners.com.sg/cdn/shop/files/WhatsAppImage2026-03-13at17.04.56_1_66806044-c413-4d25-a7c3-29ae2137cf94.jpg?v=1773427677&width=240 240w, //fresherdinners.com.sg/cdn/shop/files/WhatsAppImage2026-03-13at17.04.56_1_66806044-c413-4d25-a7c3-29ae2137cf94.jpg?v=1773427677&width=352 352w" width="500" height="892" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="false" style="object-position: 50.0% 50.0%;"> 7028 7029 <img src="//fresherdinners.com.sg/cdn/shop/files/WhatsAppImage2026-03-13at17.04.56_51ba8e1a-1837-4dd2-bf04-d7246e46068d.jpg?v=1773427676&
7029width=500" alt="Almond Pesto Pasta with Blistered Cherry Tomatoes" srcset="//fresherdinners.com.sg/cdn/shop/files/WhatsAppImage2026-03-13at17.04.56_51ba8e1a-1837-4dd2-bf04-d7246e46068d.jpg?v=1773427676&width=240 240w, //fresherdinners.com.sg/cdn/shop/files/WhatsAppImage2026-03-13at17.04.56_51ba8e1a-1837-4dd2-bf04-d7246e46068d.jpg?v=1773427676&width=352 352w" width="500" height="892" loading="lazy" class="resource-card__image resource-card__image--secondary" sizes="auto" transitionToProduct="false" data-media-id="40311252123861" style="object-position: 50.0% 50.0%;"> 7030</div> 7031 7032 <div class="resource-card__content"> 7033 <p class="resource-card__title paragraph">Almond Pesto Pasta with Blistered Cherry Tomatoes</p> 7034 7035 7036 <div ref="priceContainer"> 7037 7038 7039 7040 7041 7042 <span class="price">$16.00</span> 7043 7044 7045 7046 7047</div> 7048 7049 </div> 7050</div> 7051 7052 </li> 7053 7054 <li 7055 class="predictive-search-results__card predictive-search-results__card--product" 7056 ref="resultsItems[]" 7057 > 7058 7059<div 7060 class="resource-card" 7061 href="/products/angel-hair-xin-chow-fried-bee-hoon" 7062 data-resource-type="product" 7063> 7064 <a 7065 class="resource-card__link" 7066 href="/products/angel-hair-xin-chow-fried-bee-hoon" 7067 > 7068 <span class="visually-hidden"> 7069 Angel hair xin chow fried bee hoon 7070 </span> 7071 </a> 7072 <div 7073 class="resource-card__media" 7074 style="--resource-card-aspect-ratio: 4 / 5;" 7075 7076 > 7077 7078 7079<img src="//fresherdinners.com.sg/cdn/shop/files/EDITED2-Tuesday-Angelhairxinchowfriedbeehoon.png?v=1785308369&width=500" alt="" srcset="//fresherdinners.com.sg/cdn/shop/files/EDITED2-Tuesday-Angelhairxinchowfriedbeehoon.png?v=1785308369&width=240 240w, //fresherdinners.com.sg/cdn/shop/files/EDITED2-Tuesday-Angelhairxinchowfriedbeehoon.png?v=1785308369&width=352 352w" width="500" height="500" loading="lazy" class="resource-card__image" sizes="auto" transitionToProduct="false" style="object-position: 50.0% 50.0%;"> 7080</div> 7081 7082 <div class="resource-card__content"> 7083 <p class="resource-card__title paragraph">Angel hair xin chow fried bee hoon</p> 7084 7085 7086 <div ref="priceContainer"> 7087 7088 7089 7090 7091 7092 <span class="price">$7.90</span> 7093 7094 7095 7096 7097</div> 7098 7099 </div> 7100</div> 7101 7102 </li> 7103 7104 </ul> 7105 7106</div> 7107 7108 7109 7110 7111 7112 </div> 7113 7114</div> 7115 7116 </div> 7117 7118 <div class="predictive-search-form__footer"> 7119 <button 7120 class="button predictive-search__search-button" 7121 ref="viewAllButton" 7122 > 7123 View all 7124 </button> 7125 </div> 7126 </div> 7127 </form> 7128 </predictive-search-component> 7129 </dialog> 7130</dialog-component> 7131 7132 7133 7134 7135 7136 <quick-add-dialog id="quick-add-dialog"> 7137 <dialog 7138 class="quick-add-modal dialog-modal color-scheme-1" 7139 ref="dialog" 7140 scroll-lock 7141 > 7142 <button 7143 ref="closeButton" 7144 on:click="/closeDialog" 7145 class="button button-unstyled close-button quick-add-modal__close" 7146 aria-label="Close dialog" 7147 ><svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"> 7148 <path d="M12 2L2 12" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 7149 <path d="M12 12L2 2" stroke="currentColor" stroke-width="var(--icon-stroke-width)" stroke-linecap="round" stroke-linejoin="round"/> 7150</svg> 7151</button> 7152 7153 <div 7154 id="quick-add-modal-content" 7155 class="quick-add-modal__content" 7156 ></div> 7157 </dialog> 7158</quick-add-dialog> 7159 7160 7161 7162 7163
7163<script> 7164 setTimeout(function () { 7165 $('.fd-plan-card').eq(2).trigger('click'); 7166 $('.fd-dinner-card').eq(1).trigger('click'); 7167 }, 1000); 7168 </script>
7168 7169 7170 7171 7172 7173 7174 7175
7175<script> 7176 function changeLoginButtonColor() { 7177 var btn = document.querySelector('button[aria-label="Continue"]'); 7178 7179 if (btn) { 7180 btn.style.setProperty("background-color", "#CD5B31", "important"); 7181 btn.style.setProperty("border-color", "#CD5B31", "important"); 7182 btn.style.setProperty("color", "#ffffff", "important"); 7183 } 7184 } 7185 7186 document.addEventListener("DOMContentLoaded", changeLoginButtonColor); 7187 window.addEventListener("load", changeLoginButtonColor); 7188 setTimeout(changeLoginButtonColor, 500); 7189 setTimeout(changeLoginButtonColor, 1500); 7190 setTimeout(changeLoginButtonColor, 3000); 7191</script>
7191 7192 7193 7194
7195<script> 7196window.addEventListener('load', function () { 7197 fetch('/cart/clear.js', { 7198 method: 'POST', 7199 credentials: 'include', 7200 cache: 'no-store' 7201 }); 7202}); 7203 7204</script>
7204 7205 7206 7207
7207<script> 7208 if (window.innerWidth <= 767) { 7209 window.location.replace('/pages/home-dinner-plan'); 7210 } 7211 </script>
7211 7212 7213 7214 7215 7216 <style> 7217 .desktop-app-popup { 7218 display: none; 7219 position: fixed; 7220 inset: 0; 7221 background: rgba(0, 0, 0, 0.55); 7222 z-index: 999999; 7223 align-items: center; 7224 justify-content: center; 7225 padding: 20px; 7226 } 7227 7228 .desktop-app-popup-box { 7229 position: relative; 7230 background: #fffaf6; 7231 max-width: 440px; 7232 width: 100%; 7233 padding: 34px 30px 28px; 7234 border-radius: 2px; 7235 text-align: center; 7236 box-shadow: 0 18px 60px rgba(0, 0, 0, 0.28); 7237 font-family: inherit; 7238 } 7239 7240 .desktop-app-popup-close-icon { 7241 position: absolute; 7242 top: 14px; 7243 right: 16px; 7244 background: transparent; 7245 border: 0; 7246 font-size: 24px; 7247 line-height: 1; 7248 cursor: pointer; 7249 color: #7a3b23; 7250 } 7251 7252 .desktop-app-popup-icon { 7253 width: 58px; 7254 height: 58px; 7255 margin: 0 auto 16px; 7256 border-radius: 50%; 7257 background: #c95f34; 7258 color: #fff; 7259 display: flex; 7260 align-items: center; 7261 justify-content: center; 7262 font-size: 26px; 7263 } 7264 7265 .desktop-app-popup-box h3 { 7266 margin: 0 0 12px; 7267 font-family: kiona, sans-serif; 7268 font-size: 26px; 7269 line-height: 1.15; 7270 font-weight: 600; 7271 color: #2b2b2b; 7272 font-weight: revert-rule; 7273 text-transform: uppercase; 7274 letter-spacing: .094em; 7275 } 7276 7277 .desktop-app-popup-box p { 7278 margin: 0 auto 24px; 7279 font-size: 14px; 7280 line-height: 1.5; 7281 color: #555; 7282 max-width: 340px; 7283 } 7284 7285 .desktop-app-popup-actions { 7286 display: flex; 7287 gap: 12px; 7288 justify-content: center; 7289 align-items: center; 7290 flex-wrap: wrap; 7291 } 7292 7293 .desktop-app-popup-primary, .desktop-app-popup-secondary { 7294 min-width: 160px; 7295 padding: 13px 18px; 7296 border-radius: 2px; 7297 font-size: 14px; 7298 font-weight: 500; 7299 text-decoration: none; 7300 cursor: pointer; 7301 border: 1px solid #c95f34; 7302 line-height: 1.4 !important; 7303 } 7304 7305 .desktop-app-popup-primary { 7306 background: #c95f34; 7307 color: #fff; 7308 } 7309 7310 .desktop-app-popup-secondary { 7311 background: #fff; 7312 color: #c95f34; 7313 } 7314 7315 @media (min-width: 768px) { 7316 .desktop-app-popup.is-active { 7317 display: flex; 7318 } 7319 } 7320 7321 @media (max-width: 767px) { 7322 .desktop-app-popup { 7323 display: none !important; 7324 } 7325 } 7326 </style> 7327 7328 7329 7330
7330<script> 7331 function closeDesktopPopup() { 7332 var popup = document.getElementById('desktopAppPopup'); 7333 if (popup) { 7334 popup.classList.remove('is-active'); 7335 } 7336 } 7337 7338 document.addEventListener('DOMContentLoaded', function () { 7339 var popup = document.getElementById('desktopAppPopup'); 7340 7341 if (popup && window.innerWidth >= 768) { 7342 setTimeout(function () { 7343 popup.classList.add('is-active'); 7344 }, 500); 7345 } 7346 }); 7347 </script>
7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357<style data-shopify> 7358 .floating-whatsapp { 7359 position: fixed; 7360 right: 20px; 7361 bottom: 20px; 7362 width: 55px; 7363 height: 55px; 7364 border-radius: 50%; 7365 z-index: 9999; 7366 display: flex; 7367 align-items: center; 7368 justify-content: center; 7369 box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); 7370 text-decoration: none; 7371 transition: all 0.3s ease; 7372} 7373 7374.floating-whatsapp:hover { 7375 transform: translateY(-4px) scale(1.08); 7376 box-shadow: 0 12px 28px rgba(0, 0, 0, 0.3); 7377} 7378 7379.floating-whatsapp__image, 7380.floating-whatsapp__svg { 7381 width: 55px; 7382 height: 55px; 7383 display: block; 7384} 7385 7386.floating-whatsapp__image { 7387 object-fit: contain; 7388} 7389 7390 7391@media screen and (max-width: 749px) { 7392 .floating-whatsapp { 7393 width: 50px; 7394 height: 50px; 7395 right: 16px; 7396 bottom: 16px; 7397 } 7398body.page-menu-selector .floating-whatsapp { 7399 bottom: 70px; 7400} 7401body.page-custom-checkout .floating-whatsapp { 7402 bottom: 100px; 7403} 7404 .floating-whatsapp__image, 7405 .floating-whatsapp__svg { 7406 width: 50px; 7407 height: 50px; 7408 } 7409} 7410 7411/* ========================= 7412 WHATSAPP PROMPT 7413========================= */ 7414 7415.whatsapp-prompt { 7416 position: fixed; 7417 right: 85px; 7418 bottom: 30px; 7419 width: 280px; 7420 max-width: calc(100vw - 110px); 7421 padding: 22px 20px 22px 20px; 7422 background: #FFFFFF; 7423 color: #222222; 7424 font-size: 15px; 7425 line-height: 1.4; 7426 border-radius: 10px; 7427 box-shadow: 0 8px 25px rgba(0,0,0,0.18); 7428 z-index: 999999; 7429 opacity: 0; 7430 visibility: hidden; 7431 transform: translateY(12px) scale(.96); 7432 transition: 7433 opacity .3s ease, 7434 visibility .3s ease, 7435 transform .3s ease; 7436 min-height: 50px; 7437} 7438 7439.whatsapp-prompt::after { 7440 content: ""; 7441 position: absolute; 7442 right: -9px; 7443 bottom: 18px; 7444 width: 0; 7445 height: 0; 7446 border-top: 9px solid transparent; 7447 border-bottom: 9px solid transparent; 7448 border-left: 10px solid #FFFFFF; 7449} 7450 7451.whatsapp-prompt.is-visible { 7452 opacity: 1; 7453 visibility: visible; 7454 transform: translateY(0) scale(1); 7455} 7456 7457.whatsapp-prompt__content { 7458 white-space: normal; 7459} 7460 7461.whatsapp-prompt__close { 7462 position: absolute; 7463 top: 5px; 7464 right: 5px; 7465 width: 22px; 7466 height: 22px; 7467 padding: 0; 7468 border: 0; 7469 background: transparent; 7470 color: #222222; 7471 font-size: 18px; 7472 line-height: 1; 7473 cursor: pointer; 7474 opacity: .6; 7475} 7476 7477.whatsapp-prompt__close:hover { 7478 opacity: 1; 7479} 7480 7481 7482/* ========================= 7483 MOBILE 7484========================= */ 7485 7486@media screen and (max-width: 749px) { 7487 7488 .whatsapp-prompt { 7489 right: 20px; 7490 bottom: 78px; 7491 width: 280px; 7492 max-width: calc(100vw - 95px); 7493 font-size: 14px; 7494 padding: 20px 14px 14px 18px; 7495 } 7496 7497.whatsapp-prompt::after { 7498 right: 20px; 7499 bottom: -11px; 7500 transform: rotate( 750190deg); 7502} 7503} 7504</style> 7505 7506 7507 7508 7509 7510 <div class="whatsapp-wedget-wraaper"> 7511 7512 <div 7513 class="whatsapp-prompt" 7514 id="whatsapp-prompt" 7515 > 7516 <div class="whatsapp-prompt__content"> 7517 <p><strong>Hi there! </strong><br/>Need help with prices or have a question?<br/>Chat with us on WhatsApp!</p> 7518 </div> 7519 7520 7521 <button 7522 type="button" 7523 class="whatsapp-prompt__close" 7524 aria-label="Close" 7525 > 7526 × 7527 </button> 7528 7529 </div> 7530 7531 7532 7533<a 7534 href="https://wa.me/6588365052?text=Hi%20Fresher%20Dinners%2C%20I%E2%80%99m%20interested%20in%20your%20dinner%20plans." 7535 class="floating-whatsapp" 7536 target="_blank" 7537 rel="noopener noreferrer" 7538> 7539 7540 7541 7542 <img src="//fresherdinners.com.sg/cdn/shop/files/whatsapp-logo-icon.png?v=1785993326&width=80" alt="" srcset="//fresherdinners.com.sg/cdn/shop/files/whatsapp-logo-icon.png?v=1785993326&width=80 80w" width="80" height="80" loading="lazy" class="floating-whatsapp__image"> 7543 7544 7545 7546</a> 7547 7548 7549</div> 7550
7551<script> 7552document.addEventListener('DOMContentLoaded', function () { 7553 const prompt = document.getElementById('whatsapp-prompt'); 7554 if (!prompt) return; 7555 7556 let closed = false, timer; 7557 7558 window.addEventListener('scroll', function () { 7559 if (closed) return; 7560 7561 prompt.classList.add('is-visible'); 7562 clearTimeout(timer); 7563 7564 7565 }, 7566 { passive: true }); 7567 7568 prompt.querySelector('.whatsapp-prompt__close')?.addEventListener('click', function () { 7569 closed = true; 7570 prompt.classList.remove('is-visible'); 7571 clearTimeout(timer); 7572 }); 7573}); 7574</script>
7574 7575 7576 7577 7578 7579
7579<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
7579 7580</body> 7581</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.