1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <title>Vietnamese Restaurant in West Loop Chicago: Banh Mi & Pho | Saigon Sisters</title> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> 6 <meta charset="UTF-8"> 7 8 <meta name="description" content="Family-run Vietnamese restaurant on W Lake St in Chicago's West Loop since 2009. Banh mi, pho, bao, spring rolls and catering for dine-in, takeout and delivery." /> 9 <meta property="og:title" content="Saigon Sisters: Vietnamese Food in Chicago's West Loop" /> 10 <meta property="og:description" content="Banh mi, pho, bao and spring rolls from sisters Mary and Theresa, cooking Vietnamese family recipes in Chicago since 2009. Dine in, take out or book catering." /> 11 <meta property="og:image" content="https://res.cloudinary.com/targetable/image/upload/v1787255781/Customers/50070/Saigon%20Sisters/PICS/logo.svg" /> 12 <meta property="og:type" content="website" /> 13 <meta property="og:url" content="https://www.saigonsisters.com/" /> 14 15 <link rel="icon" type="image/png" href="https://res.cloudinary.com/targetable/image/upload/v1787255780/Customers/50070/Saigon%20Sisters/PICS/favicon.png"> 16 <link rel="canonical" href="https://www.saigonsisters.com/" /> 17 18 19 20 21 22 <link rel="stylesheet" href="/assets/site-fa6bd954239289997bc418875168ed5ab9c9013b19cc0c43e02d72d7ae77e155.css" data-turbo-track="reload" /> 23 <link rel="stylesheet" href="/assets/icons-8a8adf1b209dcf6019c445e5477d00b79192f6726b65fd7cf29cf43036ec3917.css" data-turbo-track="reload" /> 24 25
25<script type="importmap" data-turbo-track="reload">{ 26 "imports": { 27 "application": "/assets/application-4a1c1d27c11faa4dbac51fff4126422169b85739cdee3e8b89ea183bc17a2c23.js", 28 "@hotwired/turbo-rails": "/assets/turbo.min-f3765a09513ca1417099ce92257ef54b9d4cf3a7addc7dcbb1d6d848d307ee8a.js", 29 "@hotwired/stimulus": "/assets/stimulus.min-dd364f16ec9504dfb72672295637a1c8838773b01c0b441bd41008124c407894.js", 30 "@hotwired/stimulus-loading": "/assets/stimulus-loading-3576ce92b149ad5d6959438c6f291e2426c86df3b874c525b30faad51b0d96b3.js", 31 "site": "/assets/site-4b047adea2bfbedbd09cb582dd17c2c15e218d15c9dc17cfa26985c983bcea78.js", 32 "local-time": "/assets/local-time-821d43d4efe5c285055b57aea1a1f04a89a1019f689de214873d5af45a3ab3d7.js", 33 "jquery": "/assets/jquery-9292661fe0d8c5ef2ef35f5ca64d541d70c87e9f6d7f2716d646591a295b7f36.js", 34 "jquery-mask-plugin": "/assets/jquery-mask-plugin-12f491759485d6e50f909cf5fb641f245011016ab91b9043c057666fe07a99c0.js", 35 "alpinejs": "/assets/alpinejs-1330ff78f6252d676b60ac1291d71df4f04e542899717f8ee4d03a79dec27045.js", 36 "swiper": "/assets/swiper-2faaef3c8e00dc01e477390250b8d1e3950bde9bcacdc205a4a0265787e5c077.js", 37 "libraries/vidbg": "/assets/libraries/vidbg-ca103f7572673d0e7e3cc8a6a59b200f7ab3da61da78a43e532949d800635fa5.js", 38 "controllers/application": "/assets/controllers/application-368d98631bccbf2349e0d4f8269afb3fe9625118341966de054759d96ea86c7e.js", 39 "controllers/hello_controller": "/assets/controllers/hello_controller-549135e8e7c683a538c3d6d517339ba470fcfb79d62f738a0a089ba41851a554.js", 40 "controllers": "/assets/controllers/index-2db729dddcc5b979110e98de4b6720f83f91a123172e87281d5a58410fc43806.js", 41 "controllers/prompt_engineering_controller": "/assets/controllers/prompt_engineering_controller-c5abfd07f3f7b741f778d3070d18fd216b100840ef6cfdce4adb7c953a59d715.js" 42 } 43}</script>
43 44<link rel="modulepreload" href="/assets/site-4b047adea2bfbedbd09cb582dd17c2c15e218d15c9dc17cfa26985c983bcea78.js"> 45<link rel="modulepreload" href="/assets/jquery-9292661fe0d8c5ef2ef35f5ca64d541d70c87e9f6d7f2716d646591a295b7f36.js"> 46<link rel="modulepreload" href="/assets/jquery-mask-plugin-12f491759485d6e50f909cf5fb641f245011016ab91b9043c057666fe07a99c0.js"> 47<link rel="modulepreload" href="/assets/alpinejs-1330ff78f6252d676b60ac1291d71df4f04e542899717f8ee4d03a79dec27045.js"> 48<link rel="modulepreload" href="/assets/swiper-2faaef3c8e00dc01e477390250b8d1e3950bde9bcacdc205a4a0265787e5c077.js">
49<script type="module">import "site"</script>
49 50 51 <link rel="preconnect" href="https://fonts.googleapis.com"> 52 <link rel="preconnect" href="https://cdnjs.cloudflare.com"> 53 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 54 55 56 <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,700,0..1,0&icon_names=17mp,add_card,ads_click,app_promo,attach_money,award_star,bakery_dining,bookmark_star,breakfast_dining,brightness_alert,cake,cake_add,cleaning_bucket,coffee,credit_card,date_range,directions_bus,drag_click,emoji_food_beverage,explosion,fastfood,featured_seasonal_and_gifts,fiber_new,file_map,file_map_stack,fireplace,food_bank,fork_spoon,glass_cup,home_pin,kid_star,local_bar,local_dining,local_fire_department,local_pizza,location_on,lunch_dining,mail,mark_email_unread,motorcycle,online_prediction,open_in_phone,phone_enabled,pin_drop,potted_plant,priority,quick_reorder,ramen_dining,restaurant,rice_bowl,sell,sentiment_excited,set_meal,settings_cell,shopping_bag,skillet_cooktop,smartphone,soup_kitchen,sports_football,star,star_rate,stockpot,trophy,volunteer_activism,wifi_calling_bar_1,wine_bar&display=block" 57 rel="preload" as="style"> 58 <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,700,0..1,0&icon_names=17mp,add_card,ads_click,app_promo,attach_money,award_star,bakery_dining,bookmark_star,breakfast_dining,brightness_alert,cake,cake_add,cleaning_bucket,coffee,credit_card,date_range,directions_bus,drag_click,emoji_food_beverage,explosion,fastfood,featured_seasonal_and_gifts,fiber_new,file_map,file_map_stack,fireplace,food_bank,fork_spoon,glass_cup,home_pin,kid_star,local_bar,local_dining,local_fire_department,local_pizza,location_on,lunch_dining,mail,mark_email_unread,motorcycle,online_prediction,open_in_phone,phone_enabled,pin_drop,potted_plant,priority,quick_reorder,ramen_dining,restaurant,rice_bowl,sell,sentiment_excited,set_meal,settings_cell,shopping_bag,skillet_cooktop,smartphone,soup_kitchen,sports_football,star,star_rate,stockpot,trophy,volunteer_activism,wifi_calling_bar_1,wine_bar&display=block" 59 rel="stylesheet"> 60 61 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/fontawesome.min.css" 62 rel="preload" as="style"> 63 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/fontawesome.min.css" 64 rel="stylesheet"> 65 66 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/brands.min.css" 67 rel="preload" as="style"> 68 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/brands.min.css" 69 rel="stylesheet">
vendor: 75 bytes, lines 69-71
69 70 71 <script src="https://www.google.com/recaptcha/enterprise.js?render=
716LcsffgqAAAAANLXQa19TOl4LbE2V7eS6PfaYhiT
vendor: 21 bytes, lines 71-73
71" defer></script> 72 73
73<script> 74 if (!window.origin.includes('http://localhost')) { 75 window.heap=window.heap||[],heap.load=function(e,t){window.heap.appid=e,window.heap.config=t=t||{};var r=document.createElement("script");r.type="text/javascript",r.async=!0,r.src="https://cdn.heapanalytics.com/js/heap-"+e+".js";var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(r,a);for(var n=function(e){return function(){heap.push([e].concat(Array.prototype.slice.call(arguments,0)))}},p=["addEventProperties","addUserProperties","clearEventProperties","identify","resetIdentity","removeEventProperty","setEventProperties","track","unsetEventProperty"],o=0;o<p.length;o++)heap[p[o]]=n(p[o])}; 76 heap.load((window.origin.includes('chowly.dev') ? '3177339425' : '3745098455')); 77 } 78 </script>
78 79 80 <link href="https://fonts.googleapis.com/css2?family=Roboto Slab:wght@400;700&family=Roboto Slab:wght@400;700&display=swap" 81 rel="preload" as="style"> 82 <link href="https://fonts.googleapis.com/css2?family=Roboto Slab:wght@400;700&family=Roboto Slab:wght@400;700&display=swap" 83 rel="stylesheet"> 84 85 <style> 86 87 :root { 88 /* Light theme colors */ 89 --bg-primary: white; 90 --bg-secondary: #F2F2F2; 91 --bg-form: white; 92 --text-primary: #212121; 93 --text-secondary: #666; 94 --text-muted: #666666; 95 --border-primary: #6b953e; 96 --border-secondary: #D7D7D7; 97 --stroke-primary: #6b953e; 98 --stroke-secondary: currentColor; 99 --active-bg-opacity: 8%; 100 --active-text: #6b953e; 101 --hover-bg-opacity: 8%; 102 --hover-text: #6b953e; 103 --link-text: #666; 104 --link-hover: black; 105 --social-bg: #666; 106 --social-text: white; 107 --placeholder-text: #D7D7D7; 108 --focus-border: #777777; 109 --button-bg: transparent; 110 --button-text: #6b953e; 111 --button-border: #6b953e; 112 --button-hover-bg: transparent; 113 --button-hover-border: #6b953e; 114 --brand-primary: #6b953e; 115 --brand-secondary: #6b953e; 116 --brand-overlay: rgba(107,149,62,0.08); 117 --brand-overlay-heavy: rgba(107,149,62,0.80); 118 --dim-overlay: rgba(0,0,0,0.4); 119 } 120 121 body { 122 background: linear-gradient(180deg, rgba(107, 149, 62, 0.08) 0px, rgba(107, 149, 62, 0.00) 520px); 123 } 124 125 .grecaptcha-badge { visibility: hidden; } 126 </style> 127 128 <!-- ===== Saigon Sisters â elevated brand system (head_scripts) ===== --> 129<!-- 0) SEO head (additive â layout owns canonical/og-core/Restaurant JSON-LD) --> 130<meta name="twitter:card" content="summary_large_image"> 131<meta name="twitter:title" content="Vietnamese Restaurant in West Loop Chicago: Banh Mi & Pho"> 132<meta name="twitter:description" content="Family-run Vietnamese restaurant on W Lake St in Chicago's West Loop since 2009. Banh mi, pho, bao, spring rolls and catering for dine-in, takeout and delivery.">
133<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","name":"saigon-sisters","sameAs":["https://www.instagram.com/saigonsisters","https://www.facebook.com/225838153600","https://maps.google.com/?cid=16374601163417073777"]}]}</script>
133 134<link rel="preconnect" href="https://fonts.googleapis.com"> 135<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 136<link rel="preconnect" href="https://res.cloudinary.com"> 137<link href="https://fonts.googleapis.com/css2?family=Jost:wght@500;600;700&family=Montserrat:wght@400;500;600&display=swap" rel="stylesheet"> 138 139<style> 140/* ---------- 1. TOKEN REMAP (recolors the whole token-driven theme) ---------- */ 141:root{ 142 --display-font-stack:'Jost',Montserrat,system-ui,sans-serif; 143 --body-font-stack:'Montserrat',system-ui,-apple-system,sans-serif; 144 --bg-primary:#FFFFFF; 145 --bg-secondary:#F3F7EE; 146 --bg-form:#F3F7EE; 147 --text-primary:#311541; 148 --text-secondary:#5E4F63; 149 --text-muted:#5E4F63; 150 --brand-primary:#4D7A24; 151 --brand-overlay:rgba(77,122,36,0.07); 152 --brand-overlay-heavy:rgba(77,122,36,0.82); 153 --dim-overlay:rgba(28,12,36,0.42); 154 --review-star-color:#9e6b16; 155 --button-bg:#311541; --button-text:#FFFFFF; --button-border:#311541; 156 --button-hover-bg:#5A2D6E; --button-hover-border:#5A2D6E; 157 --button-hover-text:#FFFFFF; 158 --link-text:#311541; --link-hover:#311541; 159 --border-primary:#4D7A24; --border-secondary:rgba(49,21,65,0.14); 160 --stroke-primary:#4D7A24; 161 --active-text:#311541; --hover-text:#311541; 162 --social-bg:#4D7A24; --social-text:#FFFFFF; 163 --placeholder-text:#5e4f63; 164 --focus-border:#4D7A24; 165} 166/* overflow-x:clip, never `hidden` â `hidden` makes html/body a scroll container and kills the 167 sticky nav; `clip` stops the sideways scroll without one. Blanket guard so a full-bleed band or 168 a decorative element that overhangs the viewport can't give the page a real horizontal scroll. */ 169html,body{ background-color:var(--bg-primary)!important; color:var(--text-primary); overflow-x:clip; } 170 171/* ---------- 2. TYPOGRAPHY ---------- */ 172html body{ font-family:'Montserrat',system-ui,-apple-system,sans-serif; font-weight:400; } 173html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{ 174 font-family:'Jost',Montserrat,system-ui,sans-serif!important; font-weight:600; letter-spacing:-0.01em; line-height:1.06; } 175html body h1{ font-weight:700; } 176/* eyebrows / small caps labels read warmer in the display face */ 177html body .uppercase,html body [class*="eyebrow"]{ letter-spacing:0.06em; } 178/* PROTECT glyph fonts â without these, icons render as literal text */ 179.material-symbols-outlined,.material-icons{ font-family:'Material Symbols Outlined','Material Icons'!important; } 180.fa,.fas,.far,.fal,.fab,[class^="fa-"],[class*=" fa-"]{ font-family:"Font Awesome 6 Free","Font Awesome 6 Brands"!important; } 181 182/* ---------- 3. PILL CTAs (rounded buttons) ---------- */ 183/* button-ness gate (#338): only pill-ify order links that already read as buttons 184 (carry a `bg-` theme class). Bare text-only order links like top_10_picks' 12px 185 "Add Item" (`text-[...]` only, no `bg-`) must NOT get the pill/lift/hover. */ 186html body a[class*="rounded"], html body button[class*="rounded"], 187html body a[href="/stores"][class*="bg-"], html body a[href*="/stores"]:not(section a){ 188 border-radius:999px!important; 189} 190/* primary CTAs: solid brand pills with a soft lift */ 191html body a[href="/stores"][class*="bg-"]{ 192 box-shadow:0 6px 0 0 rgba(49,21,65,0.16); transition:transform .15s ease, box-shadow .15s ease, background-color .15s ease; 193} 194html body a[href="/stores"][class*="bg-"]:hover{ transform:translateY(-2px); box-shadow:0 8px 0 0 rgba(49,21,65,0.22); } 195 196/* ---------- 4. BAND RHYTHM (base bg with alternating color blocks) ---------- */ 197/* image_left + image_right are FLEX rows â color only, never display:block */ 198#section-ONg7ndz-Mxo{ background-color:#EEF4E6!important; } 199#section-Ej3jxE4g{ background-color:#4D7A24!important; } 200#section-Ej3jxE4g, #section-Ej3jxE4g *{ color:#FFFFFF!important; } 201#section-986bFUi0{ background-color:#EEF4E6!important; } 202 203/* ---------- 4c. FULL-BLEED BANDS â color fills edge-to-edge + NO seams between sections ---------- */ 204@media(min-width:1280px){ #section-lJfwt4mDElw, #section-ONg7ndz-Mxo, #section-MnhqgiEX4wo, #section-Ej3jxE4g, #section-XGH-ZS4x, #section-986bFUi0, #section-wwehgrDj, #section-BaRHvt74, #section-y4bXQdGUH94, #section-FjzSonYwoGo, #section-sybu7lb2Ock, #section-u-ZwNrjt0WY, #section-V8ShQ5PR, #section-mBRLYquT, #section-_LdfZMObePA, #section-tkbbCTBJ, #section-NWjfUO3N, #section-owbCpW54, #section-f7TN9yUCwdw, #section-hhWazBR2, #section-s894dOsW, #section-CmRX1naS, #section-5j0fEFjq, #section-iT8CbAGH, #
204section-b5eea6TD, #section-ftFycDVW, #section-Rz9fntLF{ 205 width:100vw!important; max-width:100vw!important; 206 margin-left:calc(50% - 50vw)!important; margin-right:calc(50% - 50vw)!important; } } 207#section-lJfwt4mDElw, #section-ONg7ndz-Mxo, #section-MnhqgiEX4wo, #section-Ej3jxE4g, #section-XGH-ZS4x, #section-986bFUi0, #section-wwehgrDj, #section-BaRHvt74, #section-y4bXQdGUH94, #section-FjzSonYwoGo, #section-sybu7lb2Ock, #section-u-ZwNrjt0WY, #section-V8ShQ5PR, #section-mBRLYquT, #section-_LdfZMObePA, #section-tkbbCTBJ, #section-NWjfUO3N, #section-owbCpW54, #section-f7TN9yUCwdw, #section-hhWazBR2, #section-s894dOsW, #section-CmRX1naS, #section-5j0fEFjq, #section-iT8CbAGH, #section-b5eea6TD, #section-ftFycDVW, #section-Rz9fntLF{ 208 padding-left:max(24px, calc(50vw - 640px))!important; 209 padding-right:max(24px, calc(50vw - 640px))!important; } 210@media(max-width:1279px){ #section-lJfwt4mDElw, #section-ONg7ndz-Mxo, #section-MnhqgiEX4wo, #section-Ej3jxE4g, #section-XGH-ZS4x, #section-986bFUi0, #section-wwehgrDj, #section-BaRHvt74, #section-y4bXQdGUH94, #section-FjzSonYwoGo, #section-sybu7lb2Ock, #section-u-ZwNrjt0WY, #section-V8ShQ5PR, #section-mBRLYquT, #section-_LdfZMObePA, #section-tkbbCTBJ, #section-NWjfUO3N, #section-owbCpW54, #section-f7TN9yUCwdw, #section-hhWazBR2, #section-s894dOsW, #section-CmRX1naS, #section-5j0fEFjq, #section-iT8CbAGH, #section-b5eea6TD, #section-ftFycDVW, #section-Rz9fntLF{ grid-column:1 / -1!important; } } 211#section-FYU2eG76, #section-lJfwt4mDElw, #section-ONg7ndz-Mxo, #section-MnhqgiEX4wo, #section-Ej3jxE4g, #section-XGH-ZS4x, #section-986bFUi0, #section-wwehgrDj, #section-BaRHvt74, #section-y4bXQdGUH94, #section-FjzSonYwoGo, #section-sybu7lb2Ock, #section-u-ZwNrjt0WY, #section-V8ShQ5PR, #section-mBRLYquT, #section-_LdfZMObePA, #section-tkbbCTBJ, #section-NWjfUO3N, #section-owbCpW54, #section-f7TN9yUCwdw, #section-hhWazBR2, #section-s894dOsW, #section-CmRX1naS, #section-5j0fEFjq, #section-iT8CbAGH, #section-b5eea6TD, #section-ftFycDVW, #section-Rz9fntLF{ margin-top:0!important; margin-bottom:0!important; } 212#section-ONg7ndz-Mxo, #section-MnhqgiEX4wo, #section-Ej3jxE4g, #section-BaRHvt74, #section-y4bXQdGUH94, #section-FjzSonYwoGo, #section-sybu7lb2Ock, #section-u-ZwNrjt0WY, #section-V8ShQ5PR, #section-_LdfZMObePA, #section-tkbbCTBJ, #section-NWjfUO3N, #section-owbCpW54, #section-hhWazBR2, #section-s894dOsW, #section-CmRX1naS, #section-iT8CbAGH, #section-b5eea6TD, #section-ftFycDVW, #section-Rz9fntLF{ padding-top:clamp(32px,4vw,64px)!important; padding-bottom:clamp(32px,4vw,64px)!important; } 213@media(min-width:1280px){ #section-ONg7ndz-Mxo figure, #section-MnhqgiEX4wo figure, #section-Ej3jxE4g figure, #section-BaRHvt74 figure, #section-y4bXQdGUH94 figure, #section-FjzSonYwoGo figure, #section-sybu7lb2Ock figure, #section-u-ZwNrjt0WY figure, #section-V8ShQ5PR figure, #section-_LdfZMObePA figure, #section-tkbbCTBJ figure, #section-NWjfUO3N figure, #section-owbCpW54 figure, #section-hhWazBR2 figure, #section-s894dOsW figure, #section-CmRX1naS figure, #section-iT8CbAGH figure, #section-b5eea6TD figure, #section-ftFycDVW figure, #section-Rz9fntLF figure{ max-width:520px!important; } } 214@media(min-width:1280px){ #section-cwIG3a0886d6{ 215 padding-left:max(24px, calc(50vw - 640px))!important; 216 padding-right:max(24px, calc(50vw - 640px))!important; } } 217 218/* ---------- 4a. SITE-SCOPED FIXES (nav logo + notification are singletons the page-save drops) ---------- */ 219@media(max-width:767px){ #section-dDb0AMpP a[href="/"][aria-label]{ max-height:58px!important; } #section-dDb0AMpP a[href="/"][aria-label] img{ max-height:58px!important; width:auto!important; } } 220#section-FYU2eG76{ background-color:var(--brand-primary)!important; } 221#section-FYU2eG76, #section-FYU2eG76 *{ color:#FFFFFF!important; } 222/* platform FAQ keyword links inherit the theme accent â sub-AA on light brands (#398) */ 223#section-wwehgrDj a, #section-wwehgrDj a *{ color:#311541!important; text-decoration-color:#311541!important; } 224/* native IG-carousel CTA light-brand guard (#271) â id-independent, always-on */ 225#section-cwIG3a0886d6 a[data-maglev-id$=".cta_button_text"], #section-cwIG3a0886d6 a[data-maglev-id$=".cta_button_text"] span, section[class*="instagram_carousel"] a[data-maglev-id$=".cta_button_text"], section[class*="instagram_carousel"] a[data-maglev-id$=".cta_button_text"] span{ color:#FFFFFF!important; } 226/* hardcoded text-white pill idiom on brand fills â contrast-gated AA repaint (resting + hover) */ 227html:root body :is(a,button)[class*="text-[var(--button-text)]"], 228html:root body :is(a,button)[class*="text-[var(--button-text)]"] *, 229html:root body :is(#section-ONg7ndz-Mxo,#section-Ej3jxE4g,#section-986bFUi0,#section-lJfwt4mDElw,#section-MnhqgiEX4wo,#section-XGH-ZS4x,#section-wwehgrDj,#section-BaRHvt74,#section-y4bXQdGUH94,#section-FjzSonYwoGo,#section-sybu7lb2Ock,#section-u-ZwNrjt0WY,#section-V8ShQ5PR,#section-mBRLYquT,#section-_LdfZMObePA,#section-tkbbCTBJ,#section-NWjfUO3N,#section-owbCpW54,#section-f7TN9yUCwdw,#section-hhWazBR2,#section-s894dOsW,#section-CmRX1naS,#section-5j0fEFjq,#section-iT8CbAGH,#section-b5eea6TD,#section-ftFycDVW,#section-Rz9fntLF,#section-FYU2eG76,#section-cwIG3a0886d6,#section-dDb0AMpP,#section-M4aDtxB6egU,#section-DlCqLZcy,#section-KB7tNzVofEA,#section-cwSigffb51dfe) :is(a,button)[class*="text-[var(--button-text)]"], 230html:root body :is(#section-ONg7ndz-Mxo,#section-Ej3jxE4g,#section-986bFUi0,#section-lJfwt4mDElw,#section-MnhqgiEX4wo,#section-XGH-ZS4x,#section-wwehgrDj,#section-BaRHvt74,#section-y4bXQdGUH94,#section-FjzSonYwoGo,#section-sybu7lb2Ock,#section-u-ZwNrjt0WY,#section-V8ShQ5PR,#section-mBRLYquT,#section-_LdfZMObePA,#section-tkbbCTBJ,#section-NWjfUO3N,#section-owbCpW54,#section-f7TN9yUCwdw,#section-hhWazBR2,#section-s894dOsW,#section-CmRX1naS,#section-5j0fEFjq,#section-iT8CbAGH,#section-b5eea6TD,#section-ftFycDVW,#section-Rz9fntLF,#section-FYU2eG76,#section-cwIG3a0886d6,#section-dDb0AMpP,#section-M4aDtxB6egU,#section-DlCqLZcy,#section-KB7tNzVofEA,#section-cwSigffb51dfe) :is(a,button)[class*="text-[var(--button-text)]"] *{ color:var(--button-text)!important; } 231/* form controls: the theme paints Submit with an INLINE background that ignores --button-bg (#722) */ 232input[type="submit"], button[type="submit"]{ background-color:#311541!important; color:#FFFFFF!important; border-color:#311541!important; } 233 234/* ---------- 4b. HERO refinement (hierarchy, legibility, secondary CTA) ---------- */ 235#section-M4aDtxB6egU{ position:relative; } 236#section-M4aDtxB6egU::before{ content:""; position:absolute; inset:0; z-index:0; pointer-events:none; background:linear-gradient(90deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 55%, rgba(28,12,36,0.6) 72%, rgba(28,12,36,0.0) 90%); } 237#section-M4aDtxB6egU > *{ position:relative; z-index:1; } 238#section-M4aDtxB6egU div[class*="bg-black"]{ background:linear-gradient(90deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 55%, rgba(28,12,36,0.6) 72%, rgba(28,12,36,0.0) 90%)!important; } 239@media(max-width:767px){ 240 #section-M4aDtxB6egU::before{ background:linear-gradient(180deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 88%, rgba(28,12,36,0.432) 100%); } 241 #section-M4aDtxB6egU div[class*="bg-black"]{ background:linear-gradient(180deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 88%, rgba(28,12,36,0.432) 100%)!important; } } 242#section-M4aDtxB6egU h1, #section-M4aDtxB6egU p{ text-shadow:0 2px 16px rgba(0,0,0,.58), 0 1px 4px rgba(0,0,0,.55); } 243#section-M4aDtxB6egU a[href="/menu"]:where([class*="bg-"]){ background:#FFFFFF!important; color:#4D7A24!important; border:0!important; border-radius:999px!important; box-shadow:0 6px 0 0 rgba(0,0,0,.16); } 244#section-M4aDtxB6egU a[href="/menu"]:where([class*="bg-"]):hover{ transform:translateY(-2px); } 245#section-M4aDtxB6egU a[data-maglev-id$=".button"], #section-M4aDtxB6egU a[data-maglev-id$=".button"] span{ color:#FFFFFF!important; } 246#section-M4aDtxB6egU a[data-maglev-id$=".button"]{ box-shadow:0 0 0 1.5px rgba(255,255,255,.90), 0 6px 0 0 rgba(0,0,0,.16); } 247#section-M4aDtxB6egU a[data-maglev-id$=".button_2"]{ background:rgba(14,12,10,.82)!important; color:#FFFFFF!important; border:0!important; box-shadow:0 0 0 1.5px rgba(255,255,255,.90), 0 6px 0 0 rgba(0,0,0,.16); } 248#section-M4aDtxB6egU a[data-maglev-id$=".button_2"] span{ color:#FFFFFF!important; } 249html:root body #section-M4aDtxB6egU a[data-maglev-id$=".button_2"][class]{ color:#FFFFFF!important; } 250html:root body #section-M4aDtxB6egU a[data-maglev-id$=".button_2"] :is(span,*){ color:#FFFFFF!important; } 251#section-M4aDtxB6egU a[data-maglev-id$=".button_2"]:hover{ transform:translateY(-2px); } 252#section-DlCqLZcy{ position:relative; } 253#section-DlCqLZcy::before{ content:""; position:absolute; inset:0; z-index:0; pointer-events:none; background:linear-gradient(90deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 55%, rgba(28,12,36,0.6) 72%, rgba(28,12,36,0.0) 90%); } 254#section-DlCqLZcy > *{ position:relative; z-index:1; } 255#section-DlCqLZcy div[class*="bg-black"]{ background:linear-gradient(90deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 55%, rgba(28,12,36,0.6) 72%, rgba(28,12,36,0.0) 90%)!important; } 256@media(max-width:767px){ 257 #section-DlCqLZcy::before{ background:linear-gradient(180deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 88%, rgba(28,12,36,0.432) 100%); } 258 #section-DlCqLZcy div[class*="bg-black"]{ background:linear-gradient(180deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 88%, rgba(28,12,36,0.432) 100%)!important; } } 259#section-DlCqLZcy h1, #section-DlCqLZcy p{ text-shadow:0 2px 16px rgba(0,0,0,.58), 0 1px 4px rgba(0,0,0,.55); } 260#section-DlCqLZcy a[href="/menu"]:where([class*="bg-"]){ background:#FFFFFF!important; color:#4D7A24!important; border:0!important; border-radius:999px!important; box-shadow:0 6px 0 0 rgba(0,0,0,.16); } 261#section-DlCqLZcy a[href="/menu"]:where([class*="bg-"]):hover{ transform:translateY(-2px); } 262#section-DlCqLZcy a[data-maglev-id$=".button"], #section-DlCqLZcy a[data-maglev-id$=".button"] span{ color:#FFFFFF!important; } 263#section-DlCqLZcy a[data-maglev-id$=".button"]{ box-shadow:0 0 0 1.5px rgba(255,255,255,.90), 0 6px 0 0 rgba(0,0,0,.16); } 264#section-DlCqLZcy a[data-maglev-id$=".button_2"]{ background:rgba(14,12,10,.82)!important; color:#FFFFFF!important; border:0!important; box-shadow:0 0 0 1.5px rgba(255,255,255,.90), 0 6px 0 0 rgba(0,0,0,.16); } 265#section-DlCqLZcy a[data-maglev-id$=".button_2"] span{ color:#FFFFFF!important; } 266html:root body #section-DlCqLZcy a[data-maglev-id$=".button_2"][class]{ color:#FFFFFF!important; } 267html:root body #section-DlCqLZcy a[data-maglev-id$=".button_2"] :is(span,*){ color:#FFFFFF!important; } 268#section-DlCqLZcy a[data-maglev-id$=".button_2"]:hover{ transform:translateY(-2px); } 269#section-KB7tNzVofEA{ position:relative; } 270#section-KB7tNzVofEA::before{ content:""; position:absolute; inset:0; z-index:0; pointer-events:none; background:linear-gradient(90deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 55%, rgba(28,12,36,0.6) 72%, rgba(28,12,36,0.0) 90%); } 271#section-KB7tNzVofEA > *{ position:relative; z-index:1; } 272#section-KB7tNzVofEA div[class*="bg-black"]{ background:linear-gradient(90deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 55%, rgba(28,12,36,0.6) 72%, rgba(28,12,36,0.0) 90%)!important; } 273@media(max-width:767px){ 274 #section-KB7tNzVofEA::before{ background:linear-gradient(180deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 88%, rgba(28,12,36,0.432) 100%); } 275 #section-KB7tNzVofEA div[class*="bg-black"]{ background:linear-gradient(180deg, rgba(28,12,36,0.6) 0%, rgba(28,12,36,0.6) 88%, rgba(28,12,36,0.432) 100%)!important; } } 276#section-KB7tNzVofEA h1, #section-KB7tNzVofEA p{ text-shadow:0 2px 16px rgba(0,0,0,.58), 0 1px 4px rgba(0,0,0,.55); } 277#section-KB7tNzVofEA a[href="/menu"]:where([class*="bg-"]){ background:#FFFFFF!important; color:#4D7A24!important; border:0!important; border-radius:999px!important; box-shadow:0 6px 0 0 rgba(0,0,0,.16); } 278#section-KB7tNzVofEA a[href="/menu"]:where([class*="bg-"]):hover{ transform:translateY(-2px); } 279#section-KB7tNzVofEA a[data-maglev-id$=".button"], #section-KB7tNzVofEA a[data-maglev-id$=".button"] span{ color:#FFFFFF!important; } 280#section-KB7tNzVofEA a[data-maglev-id$=".button"]{ box-shadow:0 0 0 1.5px rgba(255,255,255,.90), 0 6px 0 0 rgba(0,0,0,.16); } 281#section-KB7tNzVofEA a[data-maglev-id$=".button_2"]{ background:rgba(14,12,10,.82)!important; color:#FFFFFF!important; border:0!important; box-shadow:0 0 0 1.5px rgba(255,255,255,.90), 0 6px 0 0 rgba(0,0,0,.16); } 282#section-KB7tNzVofEA a[data-maglev-id$=".button_2"] span{ color:#FFFFFF!important; } 283html:root body #section-KB7tNzVofEA a[data-maglev-id$=".button_2"][class]{ color:#FFFFFF!important; } 284html:root body #section-KB7tNzVofEA a[data-maglev-id$=".button_2"] :is(span,*){ color:#FFFFFF!important; } 285#section-KB7tNzVofEA a[data-maglev-id$=".button_2"]:hover{ transform:translateY(-2px); } 286 287/* ---------- 4d. CTA HOVER LABEL (#620) ---------- */ 288/* the theme ships `hover:bg-` with no `hover:text-` pair â without this the label keeps its resting 289 colour while the fill swaps under it. NOT last: §6 (components + the brand's extra_css) is 290 substituted after this, so the guard cannot rely on source order and carries the specificity to 291 win outright instead (see `_cta_hover_css`). That is deliberate â an author who wants a different 292 hover label writes an equally-specific rule in `extra_css` and still wins on order. */ 293html:root body :is(a,button)[class*="hover:bg-[var(--button-hover-bg)]"]:hover, 294html:root body :is(a,button)[class*="hover:bg-[var(--button-hover-bg)]"]:hover *, 295html:root body :is(#section-ONg7ndz-Mxo,#section-Ej3jxE4g,#section-986bFUi0,#section-lJfwt4mDElw,#section-MnhqgiEX4wo,#section-XGH-ZS4x,#section-wwehgrDj,#section-BaRHvt74,#section-y4bXQdGUH94,#section-FjzSonYwoGo,#section-sybu7lb2Ock,#section-u-ZwNrjt0WY,#section-V8ShQ5PR,#section-mBRLYquT,#section-_LdfZMObePA,#section-tkbbCTBJ,#section-NWjfUO3N,#section-owbCpW54,#section-f7TN9yUCwdw,#section-hhWazBR2,#section-s894dOsW,#section-CmRX1naS,#section-5j0fEFjq,#section-iT8CbAGH,#section-b5eea6TD,#section-ftFycDVW,#section-Rz9fntLF,#section-FYU2eG76,#section-cwIG3a0886d6,#section-dDb0AMpP,#section-M4aDtxB6egU,#section-DlCqLZcy,#section-KB7tNzVofEA,#section-cwSigffb51dfe) :is(a,button)[class*="hover:bg-[var(--button-hover-bg)]"]:hover, 296html:root body :is(#section-ONg7ndz-Mxo,#section-Ej3jxE4g,#section-986bFUi0,#section-lJfwt4mDElw,#section-MnhqgiEX4wo,#section-XGH-ZS4x,#section-wwehgrDj,#section-BaRHvt74,#section-y4bXQdGUH94,#section-FjzSonYwoGo,#section-sybu7lb2Ock,#section-u-ZwNrjt0WY,#section-V8ShQ5PR,#section-mBRLYquT,#section-_LdfZMObePA,#section-tkbbCTBJ,#section-NWjfUO3N,#section-owbCpW54,#section-f7TN9yUCwdw,#section-hhWazBR2,#section-s894dOsW,#section-CmRX1naS,#section-5j0fEFjq,#section-iT8CbAGH,#section-b5eea6TD,#section-ftFycDVW,#section-Rz9fntLF,#section-FYU2eG76,#section-cwIG3a0886d6,#section-dDb0AMpP,#section-M4aDtxB6egU,#section-DlCqLZcy,#section-KB7tNzVofEA,#section-cwSigffb51dfe) :is(a,button)[class*="hover:bg-[var(--button-hover-bg)]"]:hover *{ color:var(--button-hover-text)!important; } 297 298/* ---------- 5. SCROLL-REVEAL (gated for reduced-motion; JS adds .cw-reveal) ---------- */ 299@media (prefers-reduced-motion:no-preference){ 300 /* transition lives on the .cw-in (revealed) state, NOT the base: setting the hidden state must be 301 INSTANT. If the base carried the transition, tagging a section .cw-reveal would fade it 1â0, and
302 a near-fold section (revealed a couple frames later) reverses to 1 before ever reaching 0 â so it 303 never visibly animates. Instant-hide + transition-on-reveal makes the first content section rise 304 in like the rest. */ 305 .cw-reveal{ opacity:0; transform:translateY(26px); } 306 .cw-reveal.cw-in{ opacity:1; transform:none; transition:opacity .7s ease, transform .7s cubic-bezier(.2,.7,.2,1); } 307} 308 309/* ---------- 6. SIGNATURE COMPONENTS (full-bleed bands, mascots â per chosen surprise) ---------- */ 310/* signature marquee band â cwSigffb51dfe */ 311/* full-bleed: the theme caps custom_html at 760/1440 inside a flex parent â force 100vw here. 312 display:block is SAFE on a custom_html section (it is NOT a native flex row). */ 313#section-cwSigffb51dfe{ width:100vw!important; max-width:100vw!important; margin-left:calc(50% - 50vw)!important; margin-right:calc(50% - 50vw)!important; display:block!important; } 314/* overflow:VISIBLE, deliberately (#752). The band used to carry `overflow:hidden`, which was 315 redundant â the scrolling ticker is clipped by `.cw-sig__marquee` below, the element that 316 actually holds the overflowing track â but it silently ate any ambient hosted on this element. 317 `house_edge` draws its seam as an `::after` at `top:calc(100% - 1px)`, i.e. wholly BELOW the 318 host box, so the clip erased it: measured 0.0px of bottom-edge variation across 40 x-samples at 319 both 1440 and 390, with every `getComputedStyle(el,'::after')` property still reading correct 320 (content/background/height/mask/opacity/z-index). That combination â correct computed style, 321 zero pixels â is what makes this class of bug expensive, so keep the clip on the row that needs 322 it and leave the band itself unclipped. */ 323.cw-sig{ background:#311541; color:#ffffff; overflow:visible; position:relative; width:100vw; margin-left:calc(50% - 50vw); margin-right:calc(50% - 50vw); } 324/* THE clip for the ticker: the track is `display:inline-block` and animates translateX(-50%), so 325 it runs past both edges of this row and must be cut here (never on the band â see above). */ 326.cw-sig__marquee{ border-top:2px solid rgba(255,255,255,0.25); border-bottom:2px solid rgba(255,255,255,0.25); padding:11px 0; overflow:hidden; white-space:nowrap; } 327/* #894 â the belt holds exactly TWO identical tracks, so translating IT by -50% advances 328 exactly one track and the loop is seamless. The animation used to sit on .cw-sig__track, 329 where -50% resolved against ONE track's width (half a period) and the ticker lurched 330 sideways once per cycle. Each track repeats the word list 4x so the belt covers wide 331 viewports â two tracks of one repetition left up to 56% of the band empty at 1920. */ 332.cw-sig__belt{ display:inline-block; will-change:transform; } 333.cw-sig__track{ display:inline-block; font-family:'Jost',Montserrat,system-ui,sans-serif; font-weight:600; font-size:clamp(18px,2.4vw,30px); letter-spacing:.05em; color:#FFFFFF; text-transform:uppercase; } 334.cw-sig__inner{ max-width:1200px; margin:0 auto; padding:clamp(40px,6vw,84px) 24px; display:flex; align-items:center; gap:clamp(24px,5vw,72px); } 335/* the mascot sits on a soft radial GLOW by default (bird_bg), never a hard opaque circle â a 336 solid disc reads as a broken white blob behind a transparent-PNG mascot (#454). No drop shadow 337 for the same reason. Override bird_bg with a solid hex for a deliberate solid-medallion look. 338 bird_ring_css is EMPTY unless the brand DECLARES a `mascot_disc` (artwork that bakes in its own 339 colored disc, e.g. a logo emblem) AND that disc would dissolve into this band (#405) â then it 340 adds a thin ring + soft shadow so the emblem reads as a medallion. A normal transparent-PNG 341 mascot declares no disc and is never rimmed, which is what keeps #454 fixed. */ 342.cw-sig__bird{ width:clamp(150px,20vw,260px); height:auto; border-radius:50%; flex:0 0 auto; background:radial-gradient(circle at 50% 45%,rgba(255,255,255,.16),rgba(255,255,255,0) 68%); } 343.cw-sig__copy{ flex:1 1 auto; } 344.cw-sig__eyebrow{ font-family:'Jost',Montserrat,system-ui,sans-serif; font-weight:600; text-transform:uppercase; letter-spacing:.14em; font-size:14px; color:#FFFFFF; margin:0 0 10px; } 345.cw-sig__head{ font-family:'Jost',Montserrat,system-ui,sans-serif!important; font-weight:700; color:#ffffff!important; font-size:clamp(38px,5.4vw,72px); line-height:.98; margin:0 0 16px; } 346.cw-sig__sub{ font-size:clamp(16px,1.5vw,20px); line-height:1.5; max-width:36ch; color:#FFFFFF; margin:0 0 24px; } 347.cw-sig__cta{ display:inline-block; text-decoration:none; background:#ffffff; color:#311541!important; font-family:'Jost',Montserrat,system-ui,sans-serif; font-weight:600; font-size:17px; padding:14px 30px; border-radius:999px; box-shadow:0 6px 0 0 rgba(0,0,0,.18); transition:transform .15s ease, box-shadow .15s ease; } 348.cw-sig__cta:hover{ transform:translateY(-2px); box-shadow:0 9px 0 0 rgba(0,0,0,.22); } 349@media (max-width:760px){ .cw-sig__inner{ flex-direction:column; text-align:center; } .cw-sig__sub{ margin-left:auto; margin-right:auto; } } 350/* motion â marquee scroll + a gentle stamp bob â gated for reduced-motion, NEVER outside the gate */ 351@media (prefers-reduced-motion:no-preference){ 352 @keyframes cw-sig-scroll{ from{transform:translateX(0)} to{transform:translateX(-50%)} } 353 @keyframes cw-sig-bob{ 0%,100%{transform:translateY(0) rotate(-1deg)} 50%{transform:translateY(-7px) rotate(1deg)} } 354 .cw-sig__belt{ animation:cw-sig-scroll 104s linear infinite; } 355 .cw-sig__bird{ animation:cw-sig-bob 5.6s cubic-bezier(.45,0,.55,1) infinite; transform-origin:50% 62%; } 356} 357 358#section-cwSigffb51dfe{ margin-top:0!important; margin-bottom:0!important; padding-top:0!important; padding-bottom:0!important; } 359 360/* botanical veil â faint herb-sprig linework over #section-Ej3jxE4g */ 361#section-Ej3jxE4g{ position:relative; } 362#section-Ej3jxE4g::after{ 363 content:""; position:absolute; inset:0; z-index:0; pointer-events:none; 364 opacity:0.08; background:#DCEBC8; 365 -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 220 220'%3E%3Cg fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M52 196 C58 146 70 96 96 50'/%3E%3Cpath d='M62 156 l-22 8 M70 126 l-20 4 M80 98 l-18 0 M88 72 l-16 -4 M62 156 l18 14 M70 126 l16 12 M80 98 l14 10 M88 72 l12 8'/%3E%3Cpath d='M170 30 C164 78 150 120 126 160' transform='rotate(6 148 95)'/%3E%3Cpath d='M160 70 l20 -8 M152 100 l18 -4 M142 128 l16 0 M134 152 l14 4 M160 70 l-16 -12 M152 100 l-16 -10 M142 128 l-14 -8'/%3E%3C/g%3E%3C/svg%3E") 0 0 / 240px 240px repeat; 366 mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 220 220'%3E%3Cg fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M52 196 C58 146 70 96 96 50'/%3E%3Cpath d='M62 156 l-22 8 M70 126 l-20 4 M80 98 l-18 0 M88 72 l-16 -4 M62 156 l18 14 M70 126 l16 12 M80 98 l14 10 M88 72 l12 8'/%3E%3Cpath d='M170 30 C164 78 150 120 126 160' transform='rotate(6 148 95)'/%3E%3Cpath d='M160 70 l20 -8 M152 100 l18 -4 M142 128 l16 0 M134 152 l14 4 M160 70 l-16 -12 M152 100 l-16 -10 M142 128 l-14 -8'/%3E%3C/g%3E%3C/svg%3E") 0 0 / 240px 240px repeat; 367} 368#section-Ej3jxE4g > *{ position:relative; z-index:1; } 369 370 371/* animated corner mascot (peek) */ 372/* a mascot that peeks in from the corner on scroll, with an order nudge. 373 NOTE: uses its OWN .cw-peek--in shown-state class so the scroll-reveal's .cw-in never toggles it. */ 374.cw-peek{ position:fixed; left:20px; bottom:20px; width:74px; height:74px; border-radius:50%; z-index:55; 375 background-image:url('https://res.cloudinary.com/targetable/image/upload/f_auto,q_auto,c_fill,ar_1:1,g_
375center,r_max,w_520/Customers/saigon-sisters/site/mascot-0b064062'); background-size:cover; background-position:center; border:2px solid #4D7A24; 376 box-shadow:0 6px 18px rgba(36,31,27,.22); filter:drop-shadow(0 1px 2px rgba(36,31,27,.12)); 377 transform:translateY(150%) rotate(8deg); transition:transform .5s cubic-bezier(.22,1,.36,1); cursor:pointer; } 378.cw-peek.cw-peek--in{ transform:translateY(0) rotate(0); } 379.cw-peek__tip{ position:absolute; left:88px; bottom:20px; white-space:nowrap; background:#4D7A24; color:#FFFFFF; 380 font-family:'Jost',Montserrat,system-ui,sans-serif; font-weight:600; font-size:13px; padding:6px 12px; border-radius:999px; 381 box-shadow:0 4px 12px rgba(0,0,0,.18); opacity:0; transform:translateX(-6px); transition:opacity .25s, transform .25s; pointer-events:none; } 382.cw-peek:hover .cw-peek__tip{ opacity:1; transform:translateX(0); } 383@media (prefers-reduced-motion:no-preference){ 384 @keyframes cw-peek-idle{ 0%,100%{transform:translateY(0)} 50%{transform:translateY(-3px)} } /* imperceptible idle */ 385 @keyframes cw-peek-hop{ 0%,100%{transform:translateY(0) rotate(0)} 45%{transform:translateY(-13px) rotate(-6deg)} } 386 .cw-peek.cw-peek--in{ animation:cw-peek-idle 4.3s cubic-bezier(.45,0,.55,1) .8s infinite; } /* desynced period */ 387 .cw-peek.cw-peek--in:hover{ animation:cw-peek-hop .5s ease; } /* flutter/hop reserved for hover only */ 388} 389@media (prefers-reduced-motion:reduce){ .cw-peek{ transition:none; transform:translateY(0) rotate(0); } } 390/* #455 â #539: the fixed 74px corner FAB is pinned at left:20px (`_CORNER["bottom-left"]` in 391 compose.py â a FIXED inset for every brand), so its right edge sits at ~x=98px on EVERY 392 viewport. A prior fix (#455/PR#448) shrunk it to 52px/10px below 600px, which only clears 393 phones â single-column content on tablet/small-laptop widths (roughly 601â1360px, confirmed 394 by an @design collision sweep on Alinea) still starts well inside that 98px band, so the 395 badge kept overlapping body copy AND stealing taps from real CTAs (e.g. a footer link) up to 396 ~1360px. There is no shrink threshold that clears both a 390px phone and a 1024px tablet at a 397 fixed left:20px inset, so below the desktop gutter the badge is not a corner FAB at all: it 398 becomes a full-width sticky bottom bar (Liv's Juice Bar's #chowly-floating-footer is the 399 reference). A bar can't collide with a single-column body â it OWNS the bottom edge, and 400 `body{padding-bottom}` below reserves that strip so no content (footer included) ever hides 401 under it. #539 replaced the previous "hide it entirely below 1399px" trade-off, which made 402 this SPINE order-nudge invisible to most mobile/tablet traffic. Same 1399px cutoff as that 403 fix (NOT Liv's own 768px, which leaves the 601â1360px band with no persistent CTA at all). 404 The bar is always-on, not scroll-gated: it's a utility, not a reveal. */ 405@media (max-width:1399px){ 406 /* ONE source of truth for the bar's height â the body reservation below reads the same var. */ 407 :root{ --cw-peek-bar-h:60px; 408 /* Both bottom corners are reserved on an elevated site (#421). Measured at 768px on live 409 sites: the Maglev a11y button (UserWay) is 44x44 docked 21px from the right edge â the 410 SAME geometry on two unrelated elevated customers, so it is platform-level, not per-brand; 411 a SpotHopper-style chat bubble on another site is 56x56 at 7px. Worst case the corner is 412 occupied out to 65px, so the bar pads BOTH ends by 76px and centres its content between 413 them â the label and mascot chip can never sit under a corner widget. Verified by injecting 414 this bar into those live pages: the widget still hit-tests on top of the bar 415 (elementFromPoint at its centre), so it is neither hidden nor tap-blocked â it just docks 416 on the bar's right end. */ 417 --cw-peek-a11y-reserve:76px; } 418 .cw-peek{ box-sizing:border-box; overflow:hidden; left:0; right:0; bottom:0; width:auto; 419 height:calc(var(--cw-peek-bar-h) + env(safe-area-inset-bottom,0px)); 420 padding:0 var(--cw-peek-a11y-reserve) env(safe-area-inset-bottom,0px); 421 display:flex; align-items:center; justify-content:center; gap:10px; 422 border:0; border-radius:0; background-image:none; background-color:#4D7A24; 423 box-shadow:0 -4px 14px rgba(36,31,27,.18); filter:none; text-decoration:none; 424 /* always-on: neutralise the scroll-in gate (.cw-peek--in) and the idle bob without touching 425 body.js.tmpl â !important because both live on higher-specificity selectors above. */ 426 transform:none !important; animation:none !important; } 427 .cw-peek::before{ content:''; flex:0 0 auto; width:34px; height:34px; border-radius:50%; 428 background-image:url('https://res.cloudinary.com/targetable/image/upload/f_auto,q_auto,c_fill,ar_1:1,g_
428center,r_max,w_520/Customers/saigon-sisters/site/mascot-0b064062'); background-size:cover; background-position:center; 429 border:2px solid #FFFFFF; } /* the mascot survives as the bar's leading chip */ 430 .cw-peek__tip{ position:static; background:none; box-shadow:none; padding:0; border-radius:0; 431 font-size:16px; opacity:1; transform:none; transition:none; max-width:100%; 432 overflow:hidden; text-overflow:ellipsis; } /* the tooltip becomes the bar's label */ 433 /* Reserve the strip the bar covers. Verified 0px on live elevated sites, so nothing to preserve; 434 !important because `body` is theme-owned and our <style> can be outranked by source order. */ 435 body{ padding-bottom:calc(var(--cw-peek-bar-h) + env(safe-area-inset-bottom,0px)) !important; } 436} 437 438</style> 439 440 441
441<script src="https://cdn.userway.org/widget.js" data-account="2RTD1qUW2F" data-position="3"></script>
441 442 443 <link rel="stylesheet" href="/assets/vidbg-59cd2b661e27143a4d41f154396b1fabc6ac9c0893f4d4b1623cbf033efc0130.css" /> 444 445
445<script src="/assets/libraries/vidbg-ca103f7572673d0e7e3cc8a6a59b200f7ab3da61da78a43e532949d800635fa5.js"></script>
445 446
446<script src="/assets/banner-component-730ab5752d6195daf2963c20c32c885c4d07215b1fbd2a76a52cd94622d82ef7.js"></script>
446 447 448
448<script async> 449 window.chowlyApiHost = 'https://api.chowlyinc.com'; 450 window.siteHost = 'https://sites.chowly.app'; 451 </script>
451 452 453
453<script type="application/ld+json"> 454 {"@type":"Restaurant","name":"Saigon Sisters","address":{"@type":"PostalAddress","streetAddress":"567 W Lake St","addressLocality":"Chicago","addressRegion":"IL","postalCode":"60661","addressCountry":"US"},"telephone":"8339986885","geo":{"@type":"GeoCoordinates","latitude":41.88553719999999,"longitude":-87.6425287},"url":"https://www.saigonsisters.com#location-49193","servesCuisine":["Asian","Bao","Southeast Asian","Vietnamese","Vietnamese Street Food","Vietnamese Restaurant","Banh Mi"],"priceRange":"$$","openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":"https://schema.org/Tuesday","opens":"11:00:00","closes":"21:00:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":"https://schema.org/Wednesday","opens":"11:00:00","closes":"21:00:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":"https://schema.org/Thursday","opens":"11:00:00","closes":"21:00:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":"https://schema.org/Friday","opens":"11:00:00","closes":"22:00:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":"https://schema.org/Saturday","opens":"12:00:00","closes":"22:00:00"}],"hasMenu":"https://www.saigonsisters.com/menu","areaServed":["Chicago","Fulton Market","Near West Side","West Loop","West Side","Chicago Loop","West Loop Gate","River West"],"@context":"https://schema.org"} 455 </script>
455 456</head> 457<body data-organization-id="50070" > 458 <a href="#main-content" class="sr-only focus:not-sr-only">Skip to main content</a> 459 <main id="main-content" role="main" data-maglev-dropzone> 460 <section class="grid grid-cols-2 gap-0 justify-center"> 461 <div class="bg-[var(--brand-primary)] w-full h-[40px] flex justify-center items-center px-4 col-span-2" role="banner" id="section-FYU2eG76" data-maglev-section-id="FYU2eG76" data-maglev-section-type="site_notification_01"> 462 <section class="flex items-center space-x-2 max-w-[1440px] w-full justify-center"> 463 <div class="w-[30px] h-[30px] overflow-hidden"> 464 <i class="text-white mds-food_bank" data-maglev-id="FYU2eG76.icon" aria-hidden="true"></i> 465 </div> 466 <span data-maglev-id="FYU2eG76.title" class="text-white text-[14px] font-normal leading-[24px] text-center line-clamp-2 overflow-hidden"><p><strong>Fresh Vietnamese Banh Mi and Bao Buns Crafted for the Heart of Chicago</strong></p></span> 467 </section> 468</div><header class="sticky top-0 z-50 bg-[var(--bg-primary)] py-[16px] xl:py-[12px] shadow-md w-full col-span-2" id="section-dDb0AMpP" data-maglev-section-id="dDb0AMpP" data-maglev-section-type="standard_nav_01"> 469 <div class="flex justify-between items-center px-4 xl:px-8 mx-auto w-full xl:max-w-[1440px]"> 470 <div class="flex items-center"> 471 <div class="max-w-[280px] max-h-[100px] rounded-lg flex-shrink-0 mr-4 xl:mr-8"> 472 <a href="/" aria-label="Saigon Sisters home"> 473 <img src="https://image-cdn.chowlyinc.com/300%2Cfit/https%3A%2F%2Fres.cloudinary.com%2Ftargetable%2Fimage%2Fupload%2Fv1787255781%2FCustomers%2F50070%2FSaigon%2520Sisters%2FPICS%2Flogo.svg" alt="Saigon Sisters logo" class="max-w-[280px] max-h-[100px] w-auto h-auto object-contain rounded-lg"> 474 </a> 475 </div> 476 477 <nav role="navigation" aria-label="Main navigation" class="hidden xl:block"> 478 <ul class="flex"> 479 480 481 <li> 482 <a data-maglev-id="4M4sPNH69wI.link" class="flex bg-[var(--brand-primary)]/[var(--active-bg-opacity)] text-[var(--active-text)] items-center justify-center gap-2 py-2 px-3 text-sm font-semibold rounded-md mr-3" aria-current="page" href="/"><span data-maglev-id="4M4sPNH69wI.link.text">Home</span></a> 483 </li> 484 485 <li> 486 <a data-maglev-id="lBhHJRKvq6Y.link" class="flex text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] items-center justify-center gap-2 py-2 px-3 text-sm font-semibold rounded-md mr-3" aria-current="false" href="https://www.opentable.com/restref/client/?restref=62917&lang=en-US&corrid=cc94466e-a0ad-407e-91d2-3cc8acd3d527#"><span data-maglev-id="lBhHJRKvq6Y.link.text">Reservation</span></a> 487 </li> 488 489 <li> 490 <a data-maglev-id="BZU6yimwYKM.link" class="flex text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] items-center justify-center gap-2 py-2 px-3 text-sm font-semibold rounded-md mr-3" aria-current="false" href="/menu"><span data-maglev-id="BZU6yimwYKM.link.text">Menu</span></a> 491 </li> 492 493 <li> 494 <a data-maglev-id="cyJOqQu6pyg.link" class="flex text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] items-center justify-center gap-2 py-2 px-3 text-sm font-semibold rounded-md mr-3" aria-current="false" href="/cater"><span data-maglev-id="cyJOqQu6pyg.link.text">Catering</span></a> 495 </li> 496 497 <li class="relative"> 498 <button id="more-menu-button" class="flex text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] items-center justify-center gap-2 py-2 px-3 text-sm font-semibold rounded-md mr-3"> 499 More 500 <svg id="more-arrow" xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 transition-transform duration-300" fill="none" viewBox="0 0 24 24" stroke="currentColor"> 501 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" /> 502 </svg> 503 </button> 504 <div id="more-dropdown" class="hidden fixed left-0 right-0 w-full z-50 transition-all duration-300"> 505 <div class="mx-auto max-w-7xl bg-[var(--bg-secondary)] shadow-lg p-6 rounded-lg dropdown-top-shadow"> 506 <div class="grid grid-cols-3 gap-4"> 507 <div class="w-full mb-2"> 508 <a data-maglev-id="hjvlP5QhR38.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/parties"><span data-maglev-id="hjvlP5QhR38.link.text">Private Parties</span></a> 509 </div> 510 <div class="w-full mb-2"> 511 <a data-maglev-id="4otSuXGSiTA.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/about-us"><span data-maglev-id="4otSuXGSiTA.link.text">About Us</span></a> 512 </div> 513 <div class="w-full mb-2"> 514 <a data-maglev-id="ljqYNMAeYx8.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="https://www.toasttab.com/saigon-sisters-lake-street/giftcards?utm_source=undefined&utm_content=home&utm_medium=toast_sites&utm_term=nav&utm_campaign=giftcards"><span data-maglev-id="ljqYNMAeYx8.link.text">Gift Cards</span></a> 515 </div> 516 <div class="w-full mb-2"> 517 <a data-maglev-id="rYmuAjraS60.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="https://www.toasttab.com/saigon-sisters-lake-street/rewardsSignup"><span data-maglev-id="rYmuAjraS60.link.text">Loyalty</span></a> 518 </div> 519 <div class="w-full mb-2"> 520 <a data-maglev-id="slBjmHAHTOQ.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/jobs"><span data-maglev-id="slBjmHAHTOQ.link.text">Jobs</span></a> 521 </div> 522 <div class="w-full mb-2"> 523 <a data-maglev-id="Wg66fHTAEFY.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/events"><span data-maglev-id="Wg66fHTAEFY.link.text">Events</span></a> 524 </div> 525 <div class="w-full mb-2"> 526 <a data-maglev-id="z36nn2ga4_M.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/press"><span data-maglev-id="z36nn2ga4_M.link.text">Press</span></a> 527 </div> 528 <div class="w-full mb-2"> 529 <a data-maglev-id="yQB-1kVYRjc.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/saigon-french-market"><span data-maglev-id="yQB-1kVYRjc.link.text">Saigon Sisters (French Market)</span></a> 530 </div> 531 <div class="w-full mb-2"> 532 <a data-maglev-id="YRvsvPx_sn8.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/gallery"><span data-maglev-id="YRvsvPx_sn8.link.text">Gallery</span></a> 533 </div> 534 <div class="w-full mb-2"> 535 <a data-maglev-id="05KyxgiwC9Q.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/recipe"><span data-maglev-id="05KyxgiwC9Q.link.text">Recipe</span></a> 536 </div> 537 <div class="w-full mb-2"> 538 <a data-maglev-id="uoW6jdHayZk.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] inline-block py-2 px-4 text-sm font-medium rounded-md" aria-current="false" href="/contact-us"><span data-maglev-id="uoW6jdHayZk.link.text">Contact Us</span></a> 539 </div> 540 </div> 541 </div> 542 </div> 543 </li> 544 </ul> 545 </nav> 546 </div> 547 548 <!-- Right side: Mobile toggle + Desktop buttons --> 549 <div class="flex items-center gap-2"> 550 <!-- Mobile menu toggle --> 551 <div class="xl:hidden"> 552 <button id="menu-toggle" class="focus:outline-none" aria-expanded="false" aria-controls="mobile-menu" aria-label="Toggle menu"> 553 <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="var(--stroke-primary)"> 554 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> 555 </svg> 556 </button> 557 </div> 558 559 <!-- Desktop buttons (hidden on mobile) --> 560 <div class="hidden xl:flex items-center gap-2"> 561 <!-- Primary Order Now button --> 562 <a href="/stores" class="inline-flex items-center justify-center h-12 px-8 bg-[var(--brand-primary)] text-white text-base font-semibold rounded-md hover:brightness-90">Order Now</a> 563 564 <!-- Secondary button (optional, configurable) --> 565 </div> 566 </div> 567 </div> 568 569 <div id="mobile-menu" class="hidden fixed top-0 left-0 w-full h-full bg-[var(--bg-primary)] z-50 overflow-y-auto"> 570 <div class="flex justify-between items-center px-4 py-4 sticky top-0 bg-[var(--bg-primary)] z-10"> 571 <div class="max-w-[280px] max-h-[100px] rounded-lg flex-shrink-0 mr-4 xl:mr-8"> 572 <img src="https://image-cdn.chowlyinc.com/300%2Cfit/https%3A%2F%2Fres.cloudinary.com%2Ftargetable%2Fimage%2Fupload%2Fv1787255781%2FCustomers%2F50070%2FSaigon%2520Sisters%2FPICS%2Flogo.svg" alt="Saigon Sisters logo" class="max-w-[280px] max-h-[100px] w-auto h-auto object-contain rounded-lg"> 573 </div> 574 <button id="menu-close" class="focus:outline-none" aria-label="Close menu"> 575 <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="var(--stroke-primary)"> 576 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> 577 </svg> 578 </button> 579 </div> 580 581 <nav role="navigation" aria-label="Mobile navigation" class="pb-32"> 582 <ul class="flex flex-col items-start px-5 space-y-6 mt-8"> 583 584 <li> 585 <a data-maglev-id="4M4sPNH69wI.link" class="bg-[var(--brand-primary)]/[var(--active-bg-opacity)] text-[var(--active-text)] py-2 px-4 text-sm font-semibold pl-3" aria-current="page" href="/"><span data-maglev-id="4M4sPNH69wI.link.text">Home</span></a> 586 </li> 587 588 <li> 589 <a data-maglev-id="lBhHJRKvq6Y.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="https://www.opentable.com/restref/client/?restref=62917&lang=en-US&corrid=cc94466e-a0ad-407e-91d2-3cc8acd3d527#"><span data-maglev-id="lBhHJRKvq6Y.link.text">Reservation</span></a> 590 </li> 591 592 <li> 593 <a data-maglev-id="BZU6yimwYKM.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/menu"><span data-maglev-id="BZU6yimwYKM.link.text">Menu</span></a> 594 </li> 595 596 <li> 597 <a data-maglev-id="cyJOqQu6pyg.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/cater"><span data-maglev-id="cyJOqQu6pyg.link.text">Catering</span></a> 598 </li> 599 600 <li> 601 <a data-maglev-id="hjvlP5QhR38.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/parties"><span data-maglev-id="hjvlP5QhR38.link.text">Private Parties</span></a> 602 </li> 603 604 <li> 605 <a data-maglev-id="4otSuXGSiTA.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/about-us"><span data-maglev-id="4otSuXGSiTA.link.text">About Us</span></a> 606 </li> 607 608 <li> 609 <a data-maglev-id="ljqYNMAeYx8.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="https://www.toasttab.com/saigon-sisters-lake-street/giftcards?utm_source=undefined&utm_content=home&utm_medium=toast_sites&utm_term=nav&utm_campaign=giftcards"><span data-maglev-id="ljqYNMAeYx8.link.text">Gift Cards</span></a> 610 </li> 611 612 <li> 613 <a data-maglev-id="rYmuAjraS60.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="https://www.toasttab.com/saigon-sisters-lake-street/rewardsSignup"><span data-maglev-id="rYmuAjraS60.link.text">Loyalty</span></a> 614 </li> 615 616 <li> 617 <a data-maglev-id="slBjmHAHTOQ.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/jobs"><span data-maglev-id="slBjmHAHTOQ.link.text">Jobs</span></a> 618 </li> 619 620 <li> 621 <a data-maglev-id="Wg66fHTAEFY.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/events"><span data-maglev-id="Wg66fHTAEFY.link.text">Events</span></a> 622 </li> 623 624 <li> 625 <a data-maglev-id="z36nn2ga4_M.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/press"><span data-maglev-id="z36nn2ga4_M.link.text">Press</span></a> 626 </li> 627 628 <li> 629 <a data-maglev-id="yQB-1kVYRjc.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/saigon-french-market"><span data-maglev-id="yQB-1kVYRjc.link.text">Saigon Sisters (French Market)</span></a> 630 </li> 631 632 <li> 633 <a data-maglev-id="YRvsvPx_sn8.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/gallery"><span data-maglev-id="YRvsvPx_sn8.link.text">Gallery</span></a> 634 </li> 635 636 <li> 637 <a data-maglev-id="05KyxgiwC9Q.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" ari
637a-current="false" href="/recipe"><span data-maglev-id="05KyxgiwC9Q.link.text">Recipe</span></a> 638 </li> 639 640 <li> 641 <a data-maglev-id="uoW6jdHayZk.link" class="text-[var(--text-muted)] hover:bg-[var(--brand-primary)]/[var(--hover-bg-opacity)] py-2 px-4 text-sm font-semibold pl-3" aria-current="false" href="/contact-us"><span data-maglev-id="uoW6jdHayZk.link.text">Contact Us</span></a> 642 </li> 643 </ul> 644 </nav> 645 646 <div class="fixed bottom-0 left-0 w-full flex items-center justify-center gap-2 py-8 px-4 bg-[var(--bg-primary)] border-[var(--border-secondary)]"> 647 <!-- Primary Order Now button --> 648 <a href="/stores" class="inline-flex h-12 px-8 justify-center items-center gap-2 flex-shrink-0 rounded-[6px] bg-[var(--brand-primary)] text-white text-[15px] font-semibold leading-[150%] hover:brightness-90">Order Now</a> 649 650 <!-- Secondary button (optional, configurable) --> 651 </div> 652 </div> 653</header>
654<script> 655 const menuToggle = document.getElementById('menu-toggle'); 656 const menuClose = document.getElementById('menu-close'); 657 const mobileMenu = document.getElementById('mobile-menu'); 658 659 menuToggle.addEventListener('click', () => { 660 mobileMenu.classList.remove('hidden'); 661 mobileMenu.setAttribute('aria-hidden', 'false'); 662 menuToggle.setAttribute('aria-expanded', 'true'); 663 }); 664 665 menuClose.addEventListener('click', () => { 666 mobileMenu.classList.add('hidden'); 667 mobileMenu.setAttribute('aria-hidden', 'true'); 668 menuToggle.setAttribute('aria-expanded', 'false'); 669 }); 670 671 document.addEventListener('DOMContentLoaded', function() { 672 // More menu dropdown functionality 673 const moreButton = document.getElementById('more-menu-button'); 674 const moreDropdown = document.getElementById('more-dropdown'); 675 const moreArrow = document.getElementById('more-arrow'); 676 677 if (moreButton && moreDropdown && moreArrow) { 678 let isOpen = false; 679 let isHoveringButton = false; 680 let isHoveringDropdown = false; 681 let dropdownTimeout; 682 683 function showDropdown() { 684 clearTimeout(dropdownTimeout); 685 moreDropdown.classList.remove('hidden'); 686 moreDropdown.style.opacity = '1'; 687 moreArrow.classList.add('rotate-180'); 688 isOpen = true; 689 } 690 691 function hideDropdown() { 692 moreDropdown.style.opacity = '0'; 693 moreArrow.classList.remove('rotate-180'); 694 695 dropdownTimeout = setTimeout(() => { 696 moreDropdown.classList.add('hidden'); 697 isOpen = false; 698 }, 300); 699 } 700 701 function toggleDropdown() { 702 if (isOpen) { 703 hideDropdown(); 704 } else { 705 showDropdown(); 706 } 707 } 708 709 function updateDropdownVisibility() { 710 if (isHoveringButton || isHoveringDropdown) { 711 showDropdown(); 712 } else { 713 hideDropdown(); 714 } 715 } 716 717 moreButton.addEventListener('click', function(e) { 718 e.preventDefault(); 719 toggleDropdown(); 720 }); 721 722 moreButton.addEventListener('mouseenter', () => { 723 isHoveringButton = true; 724 updateDropdownVisibility(); 725 }); 726 727 moreButton.addEventListener('mouseleave', () => { 728 isHoveringButton = false; 729 toggleDropdown(); 730 }); 731 732 moreDropdown.addEventListener('mouseenter', () => { 733 isHoveringDropdown = true; 734 updateDropdownVisibility(); 735 }); 736 737 moreDropdown.addEventListener('mouseleave', () => { 738 isHoveringDropdown = false; 739 toggleDropdown(); 740 }); 741 742 document.addEventListener('click', function(e) { 743 if (isOpen && !moreButton.contains(e.target) && !moreDropdown.contains(e.target)) { 744 hideDropdown(); 745 } 746 }); 747 } 748 749 // Locations dropdown functionality (desktop main nav) 750 const locationsContainers = document.querySelectorAll('.locations-dropdown-container'); 751 locationsContainers.forEach(container => { 752 const button = container.querySelector('.locations-dropdown-button'); 753 const dropdown = container.querySelector('.locations-dropdown'); 754 const arrow = container.querySelector('.locations-arrow'); 755 756 if (button && dropdown && arrow) { 757 let isOpen = false; 758 let hoverTimeout; 759 760 function showLocationsDropdown() { 761 clearTimeout(hoverTimeout); 762 dropdown.classList.remove('hidden'); 763 arrow.classList.add('rotate-180'); 764 isOpen = true; 765 } 766 767 function hideLocationsDropdown() { 768 hoverTimeout = setTimeout(() => { 769 dropdown.classList.add('hidden'); 770 arrow.classList.remove('rotate-180'); 771 isOpen = false; 772 }, 150); 773 } 774 775 button.addEventListener('click', (e) => { 776 e.preventDefault(); 777 if (isOpen) { 778 hideLocationsDropdown(); 779 } else { 780 showLocationsDropdown(); 781 } 782 }); 783 784 container.addEventListener('mouseenter', showLocationsDropdown); 785 container.addEventListener('mouseleave', hideLocationsDropdown); 786 787 document.addEventListener('click', (e) => { 788 if (isOpen && !container.contains(e.target)) { 789 dropdown.classList.add('hidden'); 790 arrow.classList.remove('rotate-180'); 791 isOpen = false;
792 } 793 }); 794 } 795 }); 796 797 // Locations dropdown in "More" menu 798 const locationsMoreContainers = document.querySelectorAll('.locations-more-dropdown-container'); 799 locationsMoreContainers.forEach(container => { 800 const button = container.querySelector('.locations-more-button'); 801 const dropdown = container.querySelector('.locations-more-dropdown'); 802 const arrow = container.querySelector('.locations-more-arrow'); 803 804 if (button && dropdown && arrow) { 805 let isOpen = false; 806 807 button.addEventListener('click', (e) => { 808 e.preventDefault(); 809 e.stopPropagation(); 810 if (isOpen) { 811 dropdown.classList.add('hidden'); 812 arrow.classList.remove('rotate-180'); 813 isOpen = false; 814 } else { 815 dropdown.classList.remove('hidden'); 816 arrow.classList.add('rotate-180'); 817 isOpen = true; 818 } 819 }); 820 821 container.addEventListener('mouseenter', () => { 822 dropdown.classList.remove('hidden'); 823 arrow.classList.add('rotate-180'); 824 isOpen = true; 825 }); 826 827 container.addEventListener('mouseleave', () => { 828 dropdown.classList.add('hidden'); 829 arrow.classList.remove('rotate-180'); 830 isOpen = false; 831 }); 832 } 833 }); 834 835 // Mobile locations toggle 836 const mobileLocationsToggles = document.querySelectorAll('.mobile-locations-toggle'); 837 mobileLocationsToggles.forEach(toggle => { 838 const arrow = toggle.querySelector('.mobile-locations-arrow'); 839 const list = toggle.parentElement.querySelector('.mobile-locations-list'); 840 841 if (arrow && list) { 842 toggle.addEventListener('click', (e) => { 843 e.preventDefault(); 844 list.classList.toggle('hidden'); 845 arrow.classList.toggle('rotate-180'); 846 }); 847 } 848 }); 849 }); 850</script>
850 851 852<style> 853 .rotate-180 { 854 transform: rotate(180deg); 855 transition: transform 300ms; 856 } 857 858 #more-dropdown { 859 opacity: 0; 860 transition: opacity 300ms; 861 position: absolute; 862 top: 100%; 863 left: 50%; 864 right: 0; 865 width: 80vw; 866 margin-left: auto; 867 margin-right: auto; 868 z-index: 50; 869 transform: translateX(calc(-50% + 10vw)); 870 } 871 872 .dropdown-top-shadow { 873 box-shadow: 0 -4px 6px -1px rgba(0, 0, 0, 0.1), 0 -2px 4px -1px rgba(0, 0, 0, 0.06), 874 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); 875 } 876 877 .locations-dropdown { 878 box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); 879 } 880 881 .locations-more-dropdown { 882 box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); 883 } 884</style> 885 886 887<section class="w-full xl:px-0 col-span-2" role="banner" id="section-M4aDtxB6egU" data-maglev-section-id="M4aDtxB6egU" data-maglev-section-type="hero_cta_01"> 888 <div class="vidbg-be8ba2c83b533ecb4555d2bf w-full h-[680px] flex-shrink-0 relative mx-auto my-0 bg-cover bg-center" style="background-image: url(/maglev/assets/7378e328-cb9c-4f36-a1ea-d12df1432881-hero.avif);"> 889 890 891 <div class="absolute inset-0 bg-black/40 "></div> 892 893 <article class="absolute inset-0 flex flex-col justify-center mx-6 xl:mx-0 xl:pl-20 xl:py-16"> 894 <header class="max-w-[400px] md:max-w-[500px] xl:max-w-[650px]"> 895 <h1 data-maglev-id="M4aDtxB6egU.title" class="text-white font-semibold text-[14px] md:text-[24px] xl:text-[28px] leading-tight tracking-wide">Best Vietnamese restaurant in Chicago, IL</h1> 896 </header> 897 <div class="max-w-[400px] md:max-w-[500px] xl:max-w-[650px]"> 898 <p data-maglev-id="M4aDtxB6egU.description" class="text-white font-bold text-[20px] md:text-[48px] xl:text-[56px] leading-tight xl:leading-[64px]">Saigon Sisters</p> 899 </div> 900 <div class="mt-2"> 901 <a data-maglev-id="M4aDtxB6egU.button" class="block md:inline-block bg-[var(--brand-primary)] text-white py-3 px-8 text-sm xl:text-base font-semibold leading-[150%] hover:brightness-90 rounded-md md:self-start" aria-label="Order Now â Best Vietnamese restaurant in Chicago, IL" href="/store/24313"><span data-maglev-id="M4aDtxB6egU.button.text">Order Now</span></a> 902 <a data-maglev-id="M4aDtxB6egU.button_2" class="block mt-2 md:mt-0 md:inline-block bg-white text-[var(--button-text)] py-3 md:ml-1 px-8 text-sm xl:text-base font-semibold leading-[150%] hover:brightness-90 rounded-md md:self-start" aria-label="Reserve a Table â Best Vietnamese restaurant in Chicago, IL" href="https://www.opentable.com/restref/client/?restref=62917&lang=en-US&corrid=cc94466e-a0ad-407e-91d2-3cc8acd3d527#"><span data-maglev-id="M4aDtxB6egU.button_2.text">Reserve a Table</span></a> 903 </div> 904 </article> 905 906
906<script> 907 new vidbg('.vidbg-be8ba2c83b533ecb4555d2bf', { 908 mp4: "/maglev/assets/ebc5e1e8-7df9-4882-8856-9a700d502f3e-saigon-sisters_v2_edited-video-2_22mb.mp4" 909 }); 910 </script>
910 911 912 <style> 913 914 915 916 </style> 917 </div> 918</section><section class="w-full xl:max-w-[1440px] mx-auto h-auto flex-shrink-0 relative flex flex-col items-start justify-center px-10 xl:px-20 py-10 xl:py-20 col-span-2" id="section-cwSigffb51dfe" data-maglev-section-id="cwSigffb51dfe" data-maglev-section-type="custom_html_01"> 919 <section class="cw cw-sig cw-reveal"> 920 <div class="cw-sig__marquee" aria-hidden="true"> 921 <span class="cw-sig__belt"> 922 <span class="cw-sig__track">Banh Mi  â¢Â  Pho  â¢Â  Bao  â¢Â  Fresh Spring Rolls  â¢Â  Curries  â¢Â  Stir Fries  â¢Â  Nuoc Cham  â¢Â  West Loop  â¢Â  Banh Mi  â¢Â  Pho  â¢Â  Bao  â¢Â  Fresh Spring Rolls  â¢Â  Curries  â¢Â  Stir Fries  â¢Â  Nuoc Cham  â¢Â  West Loop  â¢Â  Banh Mi  â¢Â  Pho  â¢Â  Bao  â¢Â  Fresh Spring Rolls  â¢Â  Curries  â¢Â  Stir Fries  â¢Â  Nuoc Cham  â¢Â  West Loop  â¢Â  Banh Mi  â¢Â  Pho  â¢Â  Bao  â¢Â  Fresh Spring Rolls  â¢Â  Curries  â¢Â  Stir Fries  â¢Â  Nuoc Cham  â¢Â  West Loop  â¢Â  </span><span class="cw-sig__track">Banh Mi  â¢Â  Pho  â¢Â  Bao  â¢Â  Fresh Spring Rolls  â¢Â  Curries  â¢Â  Stir Fries  â¢Â  Nuoc Cham  â¢Â  West Loop  â¢Â  Banh Mi  â¢Â  Pho  â¢Â  Bao  â¢Â  Fresh Spring Rolls  â¢Â  Curries  â¢Â  Stir Fries  â¢Â  Nuoc Cham  â¢Â  West Loop  â¢Â  Banh Mi  â¢Â  Pho  â¢Â  Bao  â¢Â  Fresh Spring Rolls  â¢Â  Curries  â¢Â  Stir Fries  â¢Â  Nuoc Cham  â¢Â  West Loop  â¢Â  Banh Mi  â¢Â  Pho  â¢Â  Bao  â¢Â  Fresh Spring Rolls  â¢Â  Curries  â¢Â  Stir Fries  â¢Â  Nuoc Cham  â¢Â  West Loop  â¢Â  </span> 923 </span> 924 </div> 925 <div class="cw-sig__inner"> 926 <img class="cw-sig__bird" src="https://res.cloudinary.com/targetable/image/upload/f_auto,q_auto,c_fill,ar_1:1,g_center,r_max,w_520/Customers/saigon-sisters/site/mascot-0b064062" alt="Saigon Sisters leaf mark" loading="lazy" decoding="async"> 927 <div class="cw-sig__copy"> 928 <p class="cw-sig__eyebrow">567 W. Lake St · West Loop</p> 929 <h2 class="cw-sig__head">Family recipes, made with love 930.</h2> 931 <p class="cw-sig__sub">Banh mi on a crisp baguette, pho simmered low and slow, and plenty of fresh herbs.</p> 932 <a class="cw-sig__cta" href="/stores">Order Now</a> 933 </div> 934 </div> 935</section> 936 937</section> 938 939<section class="w-full xl:max-w-[1440px] mx-auto flex-shrink-0 relative mt-[60px] bg-[var(--brand-overlay)] py-10 xl:py-14 px-6 xl:px-20 col-span-2" aria-labelledby="top-picks-heading" id="section-lJfwt4mDElw" data-maglev-section-id="lJfwt4mDElw" data-maglev-section-type="top_10_picks_01"> 940 <div class="absolute top-[-12px] left-6 xl:left-20" aria-hidden="true"> 941 <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" fill="none"> 942 <path d="M19.9999 30L12.9999 33C11.8888 33.4722 10.8333 33.3819 9.83325 32.7292C8.83325 32.0764 8.33325 31.1528 8.33325 29.9583V8.33333C8.33325 7.41667 8.65964 6.63194 9.31242 5.97917C9.9652 5.32639 10.7499 5 11.6666 5H28.3333C29.2499 5 30.0346 5.32639 30.6874 5.97917C31.3402 6.63194 31.6666 7.41667 31.6666 8.33333V29.9583C31.6666 31.1528 31.1666 32.0764 30.1666 32.7292C29.1666 33.3819 28.111 33.4722 26.9999 33L19.9999 30Z" fill="var(--brand-primary)"/> 943 </svg> 944 </div> 945 <header class="flex flex-col xl:flex-row justify-between items-start xl:items-center"> 946 <div> 947 <h2 id="top-picks-heading" class="text-[var(--text-primary)] font-semibold text-[32px] xl:text-[48px] leading-none tracking-[-0.48px]"> 948 Authentic Vietnamese Banh Mi Done Right 949 </h2> 950 <p class="text-[var(--text-secondary)] text-[14px] xl:text-[16px] font-normal leading-[24px] mt-3"> 951 Fresh banh mi, bao buns, and dumplings await you. 952 </p> 953 </div> 954 <a href="/stores" class="mt-6 xl:mt-0 bg-[var(--brand-primary)] text-white py-3 px-8 text-base font-semibold leading-[150%] hover:brightness-90 rounded-md w-auto md:self-end whitespace-nowrap"> 955 Order Now 956 </a> 957 </header> 958 <section class="mt-8 flex gap-x-4 overflow-x-auto"> 959 960 961 <article class="w-[248px] flex-shrink-0 rounded-lg bg-[var(--bg-primary)] shadow-md overflow-hidden"> 962 963 <figure class="m-0"> 964 <img src="/maglev/assets/8dd9fc9d-1a52-44cb-bbc9-c15be4d11edc-beef-pho.jpg" alt="Beef Pho" class="w-full h-[207px] flex-shrink-0 object-cover"> 965 </figure> 966 <div class="p-4"> 967 <h3 class="text-[var(--text-primary)] font-semibold text-[16px] leading-[24px]"> 968 Beef Pho 969 </h3> 970 <p class="text-[var(--text-secondary)] mt-2 text-[14px] leading-[18px] font-normal line-clamp-2"> 971 Roast beef pho in beef broth with rice noodles and scallions, served with bean sprouts, jalapeños, lime, basil and culantro. Gluten-free. 972 </p> 973 <a href="/stores" class="text-[var(--brand-primary)] mt-4 text-[12px] font-semibold leading-[16
973px]"> 974 Add Item 975 </a> 976 </div> 977 </article> 978 979 980 <article class="w-[248px] flex-shrink-0 rounded-lg bg-[var(--bg-primary)] shadow-md overflow-hidden"> 981 982 <figure class="m-0"> 983 <img src="/maglev/assets/dfcaee47-3739-4f80-8d51-1e55b5a5818e-pad-thai.jpg" alt="Pad Thai" class="w-full h-[207px] flex-shrink-0 object-cover"> 984 </figure> 985 <div class="p-4"> 986 <h3 class="text-[var(--text-primary)] font-semibold text-[16px] leading-[24px]"> 987 Pad Thai 988 </h3> 989 <p class="text-[var(--text-secondary)] mt-2 text-[14px] leading-[18px] font-normal line-clamp-2"> 990 Rice noodles with tamarind, garlic, chive, pickled radish, bean sprouts, egg, fish sauce, chili flakes and tofu. Gluten-free. 991 </p> 992 <a href="/stores" class="text-[var(--brand-primary)] mt-4 text-[12px] font-semibold leading-[16px]"> 993 Add Item 994 </a> 995 </div> 996 </article> 997 998 999 <article class="w-[248px] flex-shrink-0 rounded-lg bg-[var(--bg-primary)] shadow-md overflow-hidden"> 1000 1001 <figure class="m-0"> 1002 <img src="/maglev/assets/a618a76e-3fa7-41ac-b811-67964c95e87e-6c5a29c7-0d54-46a4-844d-094bacb546db.avif" alt="BBQ Jackfruit Banh Mi (Vegan)" class="w-full h-[207px] flex-shrink-0 object-cover"> 1003 </figure> 1004 <div class="p-4"> 1005 <h3 class="text-[var(--text-primary)] font-semibold text-[16px] leading-[24px]"> 1006 BBQ Jackfruit Banh Mi (Vegan) 1007 </h3> 1008 <p class="text-[var(--text-secondary)] mt-2 text-[14px] leading-[18px] font-normal line-clamp-2"> 1009 Vegan BBQ sauce, shredded young jackfruit, pickled red cabbage, cucumbers, cilantro, jalapenos, pickled daikon and carrots 1010 </p> 1011 <a href="/stores" class="text-[var(--brand-primary)] mt-4 text-[12px] font-semibold leading-[16px]"> 1012 Add Item 1013 </a> 1014 </div> 1015 </article> 1016 </section> 1017</section><style> 1018 @media (min-width: 1280px) { 1019 section[aria-labelledby="top-picks-heading"] { 1020 width: 100%; 1021 max-width: 1440px; 1022 } 1023 section[aria-labelledby="top-picks-heading"] > section > article { 1024 width: calc((100% - 64px) / 5); 1025 } 1026 } 1027</style> 1028 1029<section class="flex flex-grow flex-col xl:flex-row items-center xl:justify-evenly gap-6 xl:gap-6 w-full xl:max-w-[1440px] mx-auto mt-10 xl:mt-20 px-4 xl:px-0 col-span-2 md:col-span-1 xl:col-span-2" id="section-ONg7ndz-Mxo" data-maglev-section-id="ONg7ndz-Mxo" data-maglev-section-type="image_left_01"> 1030 <figure class="w-full xl:w-[500px] min-w-0 hidden xl:block order-1"> 1031 <img src="/maglev/assets/88fc194b-69ee-4a4e-a2ea-33a3372ada01-7756.avif" alt="A Family Table in the West Loop" data-maglev-id="ONg7ndz-Mxo.image" class="rounded-lg w-full h-auto object-cover" /> 1032 </figure> 1033 <article class="w-full xl:w-[480px] min-w-0 text-left order-2"> 1034 <h2 data-maglev-id="ONg7ndz-Mxo.title" class="text-[var(--text-primary)] font-semibold text-[32px] xl:text-[48px] leading-none tracking-[-0.48px]" id="section-title-73fbe32130e2">A Family Table in the West Loop</h2> 1035 1036 <figure class=" xl:hidden w-full mt-4"> 1037 <img src="/maglev/assets/88fc194b-69ee-4a4e-a2ea-33a3372ada01-7756.avif" alt="A Family Table in the West Loop" data-maglev-id="ONg7ndz-Mxo.image" class="rounded-lg w-full h-auto object-cover" /> 1038 </figure> 1039 1040 <p data-maglev-id="ONg7ndz-Mxo.body" class="text-[var(--text-secondary)] text-[14px] xl:text-[16px] font-normal leading-[24px] mt-4">Saigon Sisters sits at 567 W. Lake Street in Chicago's West Loop, a neighborhood spot built by two sisters and the mother who taught them everything. Mary Nguyen Aregoni and Theresa Nguyen grew up surrounded by the flavors of Vietnam and France, and that upbringing shows in every corner of the dining room. Stop in for a full sit down meal or grab something quick to go, we're open for dine in, takeout, delivery and catering.</p> 1041 1042 <a data-maglev-id="ONg7ndz-Mxo.button" class="inline-flex h-[48px] px-8 py-4 justify-center items-center gap-2 flex-shrink-0 bg-[var(--button-bg)] text-[var(--button-text)] border border-[var(--button-border)] hover:bg-[var(--button-hover-bg)] hover:border-[var(--button-hover-border)] text-[15px] font-semibold leading-[150%] rounded-[6px] mt-7" aria-label="About Us â A Family Table in the West Loop" href="/about-us"><span data-maglev-id="ONg7ndz-Mxo.button.text">About Us</span></a> 1043 </article> 1044</section> 1045<section class="flex flex-grow flex-col xl:flex-row items-center xl:justify-evenly gap-6 xl:gap-6 w-full xl:max-w-[1440px] mx-auto mt-10 xl:mt-20 px-4 xl:px-0 col-span-2 md:col-span-1 xl:col-span-2" id="section-MnhqgiEX4wo" data-maglev-section-id="MnhqgiEX4wo" data-maglev-section-type="image_right_01"> 1046 <article class="w-full xl:w-[480px] min-w-0 text-left order-2 xl:order-1"> 1047 <h2 data-maglev-id="MnhqgiEX4wo.title" class="text-[var(--text-primary)] font-semibold text-[32px] xl:text-[48px] leading-none tracking-[-0.48px]" id="section-title-f42de8b3
1047c8ed">Vietnamese Cooking, Rooted in Family</h2> 1048 1049 <figure class=" xl:hidden w-full mt-4"> 1050 <img src="/maglev/assets/4fa4b6d1-8563-45be-a86c-79385eeacf45-branzino.avif" alt="Vietnamese Cooking, Rooted in Family" data-maglev-id="MnhqgiEX4wo.image" class="rounded-lg w-full h-auto object-cover" /> 1051 </figure> 1052 1053 <p data-maglev-id="MnhqgiEX4wo.body" class="text-[var(--text-secondary)] text-[14px] xl:text-[16px] font-normal leading-[24px] mt-4">Our menu carries the same recipes that once filled a small Pho station at the Chicago French Market, now grown into banh mis, baos, curries, pho and stir fries built on fresh herbs, pickled vegetables and broths simmered low and slow. You'll taste Vietnam in the lemongrass and nuoc cham, and a little bit of France in the crisp baguette that holds a classic banh mi together. It's the kind of food that tastes like it came from someone's kitchen, because it did.</p> 1054 1055 <a data-maglev-id="MnhqgiEX4wo.button" class="inline-flex h-[48px] px-8 py-4 justify-center items-center gap-2 flex-shrink-0 bg-[var(--button-bg)] text-[var(--button-text)] border border-[var(--button-border)] hover:bg-[var(--button-hover-bg)] hover:border-[var(--button-hover-border)] text-[15px] font-semibold leading-[150%] rounded-[6px] mt-7" aria-label="Order Now â Vietnamese Cooking, Rooted in Family" href="/stores"><span data-maglev-id="MnhqgiEX4wo.button.text">Order Now</span></a> 1056 </article> 1057 <figure class="w-full xl:w-[500px] min-w-0 hidden xl:block order-1 xl:order-2"> 1058 <img src="/maglev/assets/4fa4b6d1-8563-45be-a86c-79385eeacf45-branzino.avif" alt="Vietnamese Cooking, Rooted in Family" data-maglev-id="MnhqgiEX4wo.image" class="rounded-lg w-full h-auto object-cover" /> 1059 </figure> 1060</section> 1061<section class="flex flex-grow flex-col xl:flex-row items-center xl:justify-evenly gap-6 xl:gap-6 w-full xl:max-w-[1440px] mx-auto mt-10 xl:mt-20 px-4 xl:px-0 col-span-2 md:col-span-1 xl:col-span-2" id="section-Ej3jxE4g" data-maglev-section-id="Ej3jxE4g" data-maglev-section-type="image_left_01"> 1062 <figure class="w-full xl:w-[500px] min-w-0 hidden xl:block order-1"> 1063 <img src="/maglev/assets/684603af-6389-4c86-b22e-01e4a5d22f06-img_9964.avif" alt="Order Online" data-maglev-id="Ej3jxE4g.image" class="rounded-lg w-full h-auto object-cover" /> 1064 </figure> 1065 <article class="w-full xl:w-[480px] min-w-0 text-left order-2"> 1066 <h2 data-maglev-id="Ej3jxE4g.title" class="text-[var(--text-primary)] font-semibold text-[32px] xl:text-[48px] leading-none tracking-[-0.48px]" id="section-title-71adfc06223d">Order Online</h2> 1067 1068 <figure class=" xl:hidden w-full mt-4"> 1069 <img src="/maglev/assets/684603af-6389-4c86-b22e-01e4a5d22f06-img_9964.avif" alt="Order Online" data-maglev-id="Ej3jxE4g.image" class="rounded-lg w-full h-auto object-cover" /> 1070 </figure> 1071 1072 <p data-maglev-id="Ej3jxE4g.body" class="text-[var(--text-secondary)] text-[14px] xl:text-[16px] font-normal leading-[24px] mt-4">Craving banh mi or a bowl of pho but can't make it in tonight? Order online from 567 W. Lake Street or our French Market location at 131 N. Clinton Street and have it ready for pickup or delivered straight to your door. Sign up for our rewards program while you're at it and start earning points on every order, including 25 points just for joining.</p> 1073 1074 <a data-maglev-id="Ej3jxE4g.button" class="inline-flex h-[48px] px-8 py-4 justify-center items-center gap-2 flex-shrink-0 bg-[var(--button-bg)] text-[var(--button-text)] border border-[var(--button-border)] hover:bg-[var(--button-hover-bg)] hover:border-[var(--button-hover-border)] text-[15px] font-semibold leading-[150%] rounded-[6px] mt-7" aria-label="Order Now â Order Online" href="/stores"><span data-maglev-id="Ej3jxE4g.button.text">Order Now</span></a> 1075 </article> 1076</section> 1077 1078<section class="w-full xl:max-w-[1440px] mx-auto px-4 xl:px-0 py-10 col-span-2" aria-label="Instagram feed carousel" id="section-XGH-ZS4x" data-maglev-section-id="XGH-ZS4x" data-maglev-section-type="instagram_carousel_01"> 1079 <header class="text-left mb-8"> 1080 <h2 class="text-[var(--text-primary)] text-[32px] xl:text-[48px] font-semibold tracking-[-0.48px] mb-2"> 1081 Follow us on Instagram 1082 </h2> 1083 <p class="text-[var(--text-secondary)] text-[16px] font-normal"> 1084 @saigonsisters 1085 </p> 1086 </header> 1087 1088 <!-- Instagram Posts Carousel --> 1089 <div class="mb-8"> 1090 <div class="swiper swiper-bece704f-04e3-4d27-9b97-78f3c9d279cd" role="region" aria-label="Instagram posts"> 1091 <div class="swiper-wrapper"> 1092 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1093 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1094 role="button" 1095 tabindex="0" 1096 aria-label="View Instagram post 1" 1097 onclick="openInstagramModal('/remote_assets/f2428add-1793-443e-9042-c4b2c7dde9a5/desktop.avif', '/remote_assets/f2428add-1793-443e-9042-c4b2c7dde9a5/thumb.avif', 0)" 1098 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/f2428add-1793-443e-9042-c4b2c7dde9a5/desktop.avif', '/remote_assets/f2428add-1793-443e-9042-c4b2c7dde9a5/thumb.avif', 0); }"> 1099 <img src="/remote_assets/f2428add-1793-443e-9042-c4b2c7dde9a5/thumb.avif" 1100 alt="Instagram post 1" 1101 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1102 loading="lazy" 1103 onerror="this.parentElement.classList.add('instagram-error')"> 1104 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1105 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1106 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1107 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259
11070-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1108 </svg> 1109 </div> 1110 </div> 1111 <!-- Error state overlay --> 1112 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1113 <div class="text-center text-gray-500"> 1114 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1115 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1116 </svg> 1117 <p class="text-xs">Image unavailable</p> 1118 </div> 1119 </div> 1120 </div> 1121 </div> 1122 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1123 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1124 role="button" 1125 tabindex="0" 1126 aria-label="View Instagram post 2" 1127 onclick="openInstagramModal('/remote_assets/08ffd123-74ca-43c5-8a7e-b74ca3bdb955/desktop.avif', '/remote_assets/08ffd123-74ca-43c5-8a7e-b74ca3bdb955/thumb.avif', 1)" 1128 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/08ffd123-74ca-43c5-8a7e-b74ca3bdb955/desktop.avif', '/remote_assets/08ffd123-74ca-43c5-8a7e-b74ca3bdb955/thumb.avif', 1); }"> 1129 <img src="/remote_assets/08ffd123-74ca-43c5-8a7e-b74ca3bdb955/thumb.avif" 1130 alt="Instagram post 2" 1131 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1132 loading="lazy" 1133 onerror="this.parentElement.classList.add('instagram-error')"> 1134 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1135 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1136 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1137 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1138 </svg> 1139 </div> 1140 </div> 1141 <!-- Error state overlay --> 1142 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1143 <div class="text-center text-gray-500"> 1144 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1145 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1146 </svg> 1147 <p class="text-xs">Image unavailable</p> 1148 </div> 1149 </div> 1150 </div> 1151 </div> 1152 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1153 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1154 role="button" 1155 tabindex="0" 1156 aria-label="View Instagram post 3" 1157 onclick="openInstagramModal('/remote_assets/8f184122-8102-4110-87dd-aa0482db8bcc/desktop.avif', '/remote_assets/8f184122-8102-4110-87dd-aa0482db8bcc/thumb.avif', 2)" 1158 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/8f184122-8102-4110-87dd-aa0482db8bcc/desktop.avif', '/remote_assets/8f184122-8102-4110-87dd-aa0482db8bcc/thumb.avif', 2); }"> 1159 <img src="/remote_assets/8f184122-8102-4110-87dd-aa0482db8bcc/thumb.avif" 1160 alt="Instagram post 3" 1161 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1162 loading="lazy" 1163 onerror="this.parentElement.classList.add('instagram-error')"> 1164 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1165 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1166 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1167 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259
11670-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1168 </svg> 1169 </div> 1170 </div> 1171 <!-- Error state overlay --> 1172 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1173 <div class="text-center text-gray-500"> 1174 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1175 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1176 </svg> 1177 <p class="text-xs">Image unavailable</p> 1178 </div> 1179 </div> 1180 </div> 1181 </div> 1182 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1183 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1184 role="button" 1185 tabindex="0" 1186 aria-label="View Instagram post 4" 1187 onclick="openInstagramModal('/remote_assets/fdfd0574-fd9a-48d3-9197-8b9b03774d70/desktop.avif', '/remote_assets/fdfd0574-fd9a-48d3-9197-8b9b03774d70/thumb.avif', 3)" 1188 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/fdfd0574-fd9a-48d3-9197-8b9b03774d70/desktop.avif', '/remote_assets/fdfd0574-fd9a-48d3-9197-8b9b03774d70/thumb.avif', 3); }"> 1189 <img src="/remote_assets/fdfd0574-fd9a-48d3-9197-8b9b03774d70/thumb.avif" 1190 alt="Instagram post 4" 1191 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1192 loading="lazy" 1193 onerror="this.parentElement.classList.add('instagram-error')"> 1194 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1195 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1196 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1197 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1198 </svg> 1199 </div> 1200 </div> 1201 <!-- Error state overlay --> 1202 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1203 <div class="text-center text-gray-500"> 1204 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1205 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1206 </svg> 1207 <p class="text-xs">Image unavailable</p> 1208 </div> 1209 </div> 1210 </div> 1211 </div> 1212 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1213 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1214 role="button" 1215 tabindex="0" 1216 aria-label="View Instagram post 5" 1217 onclick="openInstagramModal('/remote_assets/4c1fcb71-b25b-46a1-9579-28f4f714eab8/desktop.avif', '/remote_assets/4c1fcb71-b25b-46a1-9579-28f4f714eab8/thumb.avif', 4)" 1218 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/4c1fcb71-b25b-46a1-9579-28f4f714eab8/desktop.avif', '/remote_assets/4c1fcb71-b25b-46a1-9579-28f4f714eab8/thumb.avif', 4); }"> 1219 <img src="/remote_assets/4c1fcb71-b25b-46a1-9579-28f4f714eab8/thumb.avif" 1220 alt="Instagram post 5" 1221 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1222 loading="lazy" 1223 onerror="this.parentElement.classList.add('instagram-error')"> 1224 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1225 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1226 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1227 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259
12270-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1228 </svg> 1229 </div> 1230 </div> 1231 <!-- Error state overlay --> 1232 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1233 <div class="text-center text-gray-500"> 1234 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1235 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1236 </svg> 1237 <p class="text-xs">Image unavailable</p> 1238 </div> 1239 </div> 1240 </div> 1241 </div> 1242 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1243 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1244 role="button" 1245 tabindex="0" 1246 aria-label="View Instagram post 6" 1247 onclick="openInstagramModal('/remote_assets/b06baf40-00fd-4d60-9473-f81f96bc80d0/desktop.avif', '/remote_assets/b06baf40-00fd-4d60-9473-f81f96bc80d0/thumb.avif', 5)" 1248 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/b06baf40-00fd-4d60-9473-f81f96bc80d0/desktop.avif', '/remote_assets/b06baf40-00fd-4d60-9473-f81f96bc80d0/thumb.avif', 5); }"> 1249 <img src="/remote_assets/b06baf40-00fd-4d60-9473-f81f96bc80d0/thumb.avif" 1250 alt="Instagram post 6" 1251 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1252 loading="lazy" 1253 onerror="this.parentElement.classList.add('instagram-error')"> 1254 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1255 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1256 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1257 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1258 </svg> 1259 </div> 1260 </div> 1261 <!-- Error state overlay --> 1262 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1263 <div class="text-center text-gray-500"> 1264 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1265 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1266 </svg> 1267 <p class="text-xs">Image unavailable</p> 1268 </div> 1269 </div> 1270 </div> 1271 </div> 1272 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1273 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1274 role="button" 1275 tabindex="0" 1276 aria-label="View Instagram post 7" 1277 onclick="openInstagramModal('/remote_assets/6e688ac7-89a9-49a0-949a-7b5a3a41b1d9/desktop.avif', '/remote_assets/6e688ac7-89a9-49a0-949a-7b5a3a41b1d9/thumb.avif', 6)" 1278 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/6e688ac7-89a9-49a0-949a-7b5a3a41b1d9/desktop.avif', '/remote_assets/6e688ac7-89a9-49a0-949a-7b5a3a41b1d9/thumb.avif', 6); }"> 1279 <img src="/remote_assets/6e688ac7-89a9-49a0-949a-7b5a3a41b1d9/thumb.avif" 1280 alt="Instagram post 7" 1281 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1282 loading="lazy" 1283 onerror="this.parentElement.classList.add('instagram-error')"> 1284 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1285 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1286 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1287 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259
12870-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1288 </svg> 1289 </div> 1290 </div> 1291 <!-- Error state overlay --> 1292 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1293 <div class="text-center text-gray-500"> 1294 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1295 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1296 </svg> 1297 <p class="text-xs">Image unavailable</p> 1298 </div> 1299 </div> 1300 </div> 1301 </div> 1302 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1303 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1304 role="button" 1305 tabindex="0" 1306 aria-label="View Instagram post 8" 1307 onclick="openInstagramModal('/remote_assets/b9cebb14-50c6-4eaa-bfea-fd4cf2376473/desktop.avif', '/remote_assets/b9cebb14-50c6-4eaa-bfea-fd4cf2376473/thumb.avif', 7)" 1308 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/b9cebb14-50c6-4eaa-bfea-fd4cf2376473/desktop.avif', '/remote_assets/b9cebb14-50c6-4eaa-bfea-fd4cf2376473/thumb.avif', 7); }"> 1309 <img src="/remote_assets/b9cebb14-50c6-4eaa-bfea-fd4cf2376473/thumb.avif" 1310 alt="Instagram post 8" 1311 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1312 loading="lazy" 1313 onerror="this.parentElement.classList.add('instagram-error')"> 1314 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1315 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1316 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1317 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1318 </svg> 1319 </div> 1320 </div> 1321 <!-- Error state overlay --> 1322 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1323 <div class="text-center text-gray-500"> 1324 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1325 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1326 </svg> 1327 <p class="text-xs">Image unavailable</p> 1328 </div> 1329 </div> 1330 </div> 1331 </div> 1332 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1333 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1334 role="button" 1335 tabindex="0" 1336 aria-label="View Instagram post 9" 1337 onclick="openInstagramModal('/remote_assets/1ee839c1-a960-4acd-9e99-c0227bc6c3d7/desktop.avif', '/remote_assets/1ee839c1-a960-4acd-9e99-c0227bc6c3d7/thumb.avif', 8)" 1338 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/1ee839c1-a960-4acd-9e99-c0227bc6c3d7/desktop.avif', '/remote_assets/1ee839c1-a960-4acd-9e99-c0227bc6c3d7/thumb.avif', 8); }"> 1339 <img src="/remote_assets/1ee839c1-a960-4acd-9e99-c0227bc6c3d7/thumb.avif" 1340 alt="Instagram post 9" 1341 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1342 loading="lazy" 1343 onerror="this.parentElement.classList.add('instagram-error')"> 1344 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1345 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1346 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1347 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259
13470-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1348 </svg> 1349 </div> 1350 </div> 1351 <!-- Error state overlay --> 1352 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1353 <div class="text-center text-gray-500"> 1354 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1355 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1356 </svg> 1357 <p class="text-xs">Image unavailable</p> 1358 </div> 1359 </div> 1360 </div> 1361 </div> 1362 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1363 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1364 role="button" 1365 tabindex="0" 1366 aria-label="View Instagram post 10" 1367 onclick="openInstagramModal('/remote_assets/1748e9bd-7769-4177-8714-c6363b127761/desktop.avif', '/remote_assets/1748e9bd-7769-4177-8714-c6363b127761/thumb.avif', 9)" 1368 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/1748e9bd-7769-4177-8714-c6363b127761/desktop.avif', '/remote_assets/1748e9bd-7769-4177-8714-c6363b127761/thumb.avif', 9); }"> 1369 <img src="/remote_assets/1748e9bd-7769-4177-8714-c6363b127761/thumb.avif" 1370 alt="Instagram post 10" 1371 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1372 loading="lazy" 1373 onerror="this.parentElement.classList.add('instagram-error')"> 1374 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1375 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1376 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1377 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1378 </svg> 1379 </div> 1380 </div> 1381 <!-- Error state overlay --> 1382 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1383 <div class="text-center text-gray-500"> 1384 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1385 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1386 </svg> 1387 <p class="text-xs">Image unavailable</p> 1388 </div> 1389 </div> 1390 </div> 1391 </div> 1392 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1393 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1394 role="button" 1395 tabindex="0" 1396 aria-label="View Instagram post 11" 1397 onclick="openInstagramModal('/remote_assets/a51eca06-51e2-4b8e-9826-9b942f952bf7/desktop.avif', '/remote_assets/a51eca06-51e2-4b8e-9826-9b942f952bf7/thumb.avif', 10)" 1398 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/a51eca06-51e2-4b8e-9826-9b942f952bf7/desktop.avif', '/remote_assets/a51eca06-51e2-4b8e-9826-9b942f952bf7/thumb.avif', 10); }"> 1399 <img src="/remote_assets/a51eca06-51e2-4b8e-9826-9b942f952bf7/thumb.avif" 1400 alt="Instagram post 11" 1401 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1402 loading="lazy" 1403 onerror="this.parentElement.classList.add('instagram-error')"> 1404 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1405 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1406 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1407 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259
14070-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1408 </svg> 1409 </div> 1410 </div> 1411 <!-- Error state overlay --> 1412 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1413 <div class="text-center text-gray-500"> 1414 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1415 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1416 </svg> 1417 <p class="text-xs">Image unavailable</p> 1418 </div> 1419 </div> 1420 </div> 1421 </div> 1422 <div class="swiper-slide" style="width: 280px; height: 280px;"> 1423 <div class="relative rounded-2xl overflow-hidden cursor-pointer instagram-post-slide group h-full shadow-lg" 1424 role="button" 1425 tabindex="0" 1426 aria-label="View Instagram post 12" 1427 onclick="openInstagramModal('/remote_assets/20cdc32e-e527-4b8e-b71d-9a5388d7cd96/desktop.avif', '/remote_assets/20cdc32e-e527-4b8e-b71d-9a5388d7cd96/thumb.avif', 11)" 1428 onkeydown="if(event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openInstagramModal('/remote_assets/20cdc32e-e527-4b8e-b71d-9a5388d7cd96/desktop.avif', '/remote_assets/20cdc32e-e527-4b8e-b71d-9a5388d7cd96/thumb.avif', 11); }"> 1429 <img src="/remote_assets/20cdc32e-e527-4b8e-b71d-9a5388d7cd96/thumb.avif" 1430 alt="Instagram post 12" 1431 class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-105" 1432 loading="lazy" 1433 onerror="this.parentElement.classList.add('instagram-error')"> 1434 <div class="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-all duration-300 flex items-center justify-center"> 1435 <div class="opacity-0 group-hover:opacity-100 transition-opacity duration-300 text-white"> 1436 <svg class="w-10 h-10" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 1437 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1438 </svg> 1439 </div> 1440 </div> 1441 <!-- Error state overlay --> 1442 <div class="instagram-error-overlay absolute inset-0 bg-gray-100 flex items-center justify-center hidden"> 1443 <div class="text-center text-gray-500"> 1444 <svg class="w-8 h-8 mx-auto mb-2" fill="currentColor" viewBox="0 0 24 24"> 1445 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/> 1446 </svg> 1447 <p class="text-xs">Image unavailable</p> 1448 </div> 1449 </div> 1450 </div> 1451 </div> 1452 </div> 1453 </div> 1454 </div> 1455 1456 <!-- Instagram Modal --> 1457 <div id="instagram-modal-bece704f-04e3-4d27-9b97-78f3c9d279cd" 1458 class="fixed inset-0 bg-black/95 z-50 hidden flex items-center justify-center" 1459 role="dialog" 1460 aria-modal="true" 1461 aria-labelledby="modal-title-bece704f-04e3-4d27-9b97-78f3c9d279cd"> 1462 <div class="relative w-full h-full flex items-center justify-center p-2 md:p-4 lg:p-2 xl:p-3 2xl:p-4"> 1463 <button class="absolute top-4 right-4 md:top-6 md:right-6 z-10 bg-black/60 text-white hover:bg-black/80 transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-white rounded-full p-3 md:p-4" 1464 onclick="closeInstagramModal('bece704f-04e3-4d27-9b97-78f3c9d279cd')" 1465 aria-label="Close modal"> 1466 <svg class="w-6 h-6 md:w-8 md:h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2"> 1467 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path> 1468 </svg> 1469 </button> 1470 1471 <!-- Loading spinner --> 1472 <div id="modal-loading-bece704f-04e3-4d27-9b97-78f3c9d279cd" 1473 class="absolute inset-0 flex items-center justify-center z-20"> 1474 <div class="flex flex-col items-center"> 1475 <!-- Instagram-style fancy loading animation --> 1476 <div class="relative"> 1477 <!-- Outer rotating ring --> 1478 <div class="w-16 h-16 border-4 border-gray-600 border-t-white rounded-full animate-spin"></div> 1479 <!-- Inner pulsing dot --> 1480 <div class="absolute inset-0 flex items-center justify-center"> 1481 <div class="w-3 h-3 bg-white rounded-full animate-pulse"></div> 1482 </div> 1483 <!-- Instagram camera icon --> 1484 <div class="absolute inset-0 flex items-center justify-center"> 1485 <svg class="w-8 h-8 text-white opacity-80" fill="currentColor" viewBox="0 0 24 24"> 1486 <path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.265-.057 1.645-.069 4.849-.069zm0-2.163c-3.259
14860-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.40s-.644-1.44-1.439-1.40z"/> 1487 </svg> 1488 </div> 1489 </div> 1490 <!-- Loading text with typing animation --> 1491 <div class="mt-4 text-white text-sm font-medium"> 1492 <span class="inline-block animate-bounce" style="animation-delay: 0ms;">L</span> 1493 <span class="inline-block animate-bounce" style="animation-delay: 100ms;">o</span> 1494 <span class="inline-block animate-bounce" style="animation-delay: 200ms;">a</span> 1495 <span class="inline-block animate-bounce" style="animation-delay: 300ms;">d</span> 1496 <span class="inline-block animate-bounce" style="animation-delay: 400ms;">i</span> 1497 <span class="inline-block animate-bounce" style="animation-delay: 500ms;">n</span> 1498 <span class="inline-block animate-bounce" style="animation-delay: 600ms;">g</span> 1499 <span class="inline-block animate-ping ml-1">...</span> 1500 </div> 1501 </div> 1502 </div> 1503 1504 <!-- Modal image with improved sizing --> 1505 <img id="modal-image-bece704f-04e3-4d27-9b97-78f3c9d279cd" 1506 src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2aWV3Qm94PSIwIDAgMSAxIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InRyYW5zcGFyZW50Ci8+PC9zdmc>" 1507 alt="Instagram post" 1508 class="max-w-[98vw] max-h-[95vh] md:max-w-[95vw] md:max-h-[95vh] lg:max-w-[99vw] lg:max-h-[99vh] xl:max-w-[98vw] xl:max-h-[98vh] 2xl:max-w-[9
15086vw] 2xl:max-h-[96vh] w-auto h-auto object-contain rounded-lg shadow-2xl opacity-0 transition-all duration-500 ease-out z-10" 1509 onload="handleModalImageLoad('bece704f-04e3-4d27-9b97-78f3c9d279cd')"> 1510 </div> 1511 </div> 1512 1513 <!-- CTA Button --> 1514 <div class="text-center"> 1515 <a href="https://instagram.com/saigonsisters" 1516 target="_blank" 1517 rel="noopener noreferrer" 1518 class="inline-block bg-[var(--brand-primary)] text-white py-4 px-10 text-[16px] font-semibold rounded-md hover:brightness-90 transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-[var(--brand-primary)] shadow-sm" 1519 aria-label="Visit our Instagram profile"> 1520 Follow Us On Instagram 1521 </a> 1522 </div> 1523 1524
1524<script type="module"> 1525 // Initialize Swiper for Instagram carousel 1526 var swiperInstagrambece704f04e34d279b9778f3c9d279cd = new Swiper(".swiper-bece704f-04e3-4d27-9b97-78f3c9d279cd", { 1527 slidesPerView: 'auto', 1528 spaceBetween: 20, 1529 centeredSlides: false, 1530 loop: true, 1531 autoplay: { 1532 delay: 5000, 1533 disableOnInteraction: false, 1534 pauseOnMouseEnter: true 1535 }, 1536 breakpoints: { 1537 640: { 1538 spaceBetween: 24 1539 }, 1540 1024: { 1541 spaceBetween: 28 1542 } 1543 }, 1544 a11y: { 1545 enabled: true, 1546 prevSlideMessage: 'Previous Instagram post', 1547 nextSlideMessage: 'Next Instagram post' 1548 }, 1549 on: { 1550 touchStart: function() { 1551 this.autoplay.stop(); 1552 }, 1553 touchEnd: function() { 1554 this.autoplay.start(); 1555 } 1556 } 1557 }); 1558 1559 // Modal functions with improved image loading 1560 function openInstagramModal(imageUrl, desktopImageUrl, index) { 1561 const modal = document.getElementById('instagram-modal-bece704f-04e3-4d27-9b97-78f3c9d279cd'); 1562 const modalImage = document.getElementById('modal-image-bece704f-04e3-4d27-9b97-78f3c9d279cd'); 1563 const modalLoading = document.getElementById('modal-loading-bece704f-04e3-4d27-9b97-78f3c9d279cd'); 1564 1565 // Show modal first 1566 modal.classList.remove('hidden'); 1567 document.body.style.overflow = 'hidden'; 1568 swiperInstagrambece704f04e34d279b9778f3c9d279cd.autoplay.stop(); 1569 modal.focus(); 1570 1571 // Reset image state and show loading 1572 modalImage.style.opacity = '0'; 1573 modalImage.style.transform = 'scale(0.95)'; 1574 modalLoading.style.display = 'flex'; 1575 1576 // Choose image URL based on screen size - use high-quality CDN image for desktop 1577 const isDesktop = window.innerWidth >= 1024; // lg breakpoint 1578 const selectedImageUrl = isDesktop ? desktopImageUrl : imageUrl; 1579 1580 // Preload the new image 1581 const newImage = new Image(); 1582 newImage.onload = function() { 1583 // Once the new image is loaded, update the modal image 1584 modalImage.src = selectedImageUrl; 1585 modalImage.alt = 'Instagram post ' + (index + 1); 1586 // The handleModalImageLoad function will handle showing the image 1587 }; 1588 newImage.onerror = function() { 1589 // If high-quality image fails on desktop, fallback to original 1590 if (isDesktop && selectedImageUrl === desktopImageUrl) { 1591 console.log('Instagram: High-quality image failed, falling back to original'); 1592 const fallbackImage = new Image(); 1593 fallbackImage.onload = function() { 1594 modalImage.src = imageUrl; 1595 modalImage.alt = 'Instagram post ' + (index + 1); 1596 // handleModalImageLoad will be called by the onload event 1597 }; 1598 fallbackImage.onerror = function() { 1599 // Both images failed - show error 1600 handleModalImageError('bece704f-04e3-4d27-9b97-78f3c9d279cd'); 1601 }; 1602 fallbackImage.src = imageUrl; 1603 } else { 1604 // Show error after reasonable timeout 1605 handleModalImageError('bece704f-04e3-4d27-9b97-78f3c9d279cd'); 1606 } 1607 }; 1608 1609 // Start loading the new image 1610 newImage.src = selectedImageUrl; 1611 } 1612 1613 function closeInstagramModal(uuid) { 1614 const modal = document.getElementById('instagram-modal-' + uuid); 1615 const modalImage = document.getElementById('modal-image-' + uuid); 1616 const modalLoading = document.getElementById('modal-loading-' + uuid); 1617 1618 modal.classList.add('hidden'); 1619 document.body.style.overflow = ''; 1620 swiperInstagrambece704f04e34d279b9778f3c9d279cd.autoplay.start(); 1621 1622 // Reset modal state 1623 modalImage.style.opacity = '0'; 1624 modalImage.style.transform = 'scale(0.95)'; 1625 modalLoading.style.display = 'none'; 1626 } 1627 1628 function handleModalImageLoad(uuid) { 1629 const modalImage = document.getElementById('modal-image-' + uuid); 1630 const modalLoading = document.getElementById('modal-loading-' + uuid); 1631 1632 modalLoading.style.display = 'none'; 1633 modalImage.style.opacity = '1'; 1634 modalImage.style.transform = 'scale(1)'; // Fancy scale entrance 1635 } 1636 1637 function handleModalImageError(uuid) { 1638 const modalLoading = document.getElementById('modal-loading-' + uuid); 1639 const modal = document.getElementById('instagram-modal-' + uuid); 1640
1641 modalLoading.innerHTML = '<div class="text-white text-center"><div class="w-8 h-8 mx-auto mb-2 text-red-400"><svg fill="currentColor" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg></div><p class="text-sm">Image failed to load</p><p class="text-xs mt-1 text-gray-400">Click X to close</p></div>'; 1642 } 1643 1644 // Close modal on escape key 1645 document.addEventListener('keydown', function(event) { 1646 if (event.key === 'Escape') { 1647 closeInstagramModal('bece704f-04e3-4d27-9b97-78f3c9d279cd'); 1648 } 1649 }); 1650 1651 // Close modal when clicking outside the image 1652 document.getElementById('instagram-modal-bece704f-04e3-4d27-9b97-78f3c9d279cd').addEventListener('click', function(event) { 1653 if (event.target === this) { 1654 closeInstagramModal('bece704f-04e3-4d27-9b97-78f3c9d279cd'); 1655 } 1656 }); 1657 </script>
1657 1658 1659 <style> 1660 .instagram-error .instagram-error-overlay { 1661 display: flex !important; 1662 } 1663 1664 /* Modal loading improvements */ 1665 #modal-loading-bece704f-04e3-4d27-9b97-78f3c9d279cd { 1666 display: none; 1667 backdrop-filter: blur(1px); 1668 } 1669 1670 /* Fancy loading animations */ 1671 @keyframes instagram-spin { 1672 0% { transform: rotate(0deg) scale(1); } 1673 25% { transform: rotate(90deg) scale(1.05); } 1674 50% { transform: rotate(180deg) scale(1); } 1675 75% { transform: rotate(270deg) scale(1.05); } 1676 100% { transform: rotate(360deg) scale(1); } 1677 } 1678 1679 @keyframes instagram-pulse { 1680 0%, 100% { transform: scale(1); opacity: 1; } 1681 50% { transform: scale(1.2); opacity: 0.8; } 1682 } 1683 1684 @keyframes loading-shimmer { 1685 0% { opacity: 0.5; } 1686 50% { opacity: 1; } 1687 100% { opacity: 0.5; } 1688 } 1689 1690 #modal-loading-bece704f-04e3-4d27-9b97-78f3c9d279cd .w-16 { 1691 animation: instagram-spin 2s ease-in-out infinite; 1692 } 1693 1694 #modal-loading-bece704f-04e3-4d27-9b97-78f3c9d279cd .w-3 { 1695 animation: instagram-pulse 1.5s ease-in-out infinite; 1696 } 1697 1698 #modal-loading-bece704f-04e3-4d27-9b97-78f3c9d279cd svg { 1699 animation: loading-shimmer 2s ease-in-out infinite; 1700 filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.3)); 1701 } 1702 1703 #modal-image-bece704f-04e3-4d27-9b97-78f3c9d279cd { 1704 image-rendering: -webkit-optimize-contrast; 1705 image-rendering: crisp-edges; 1706 } 1707 1708 /* High DPI display optimization */ 1709 @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { 1710 #modal-image-bece704f-04e3-4d27-9b97-78f3c9d279cd { 1711 image-rendering: auto; 1712 image-rendering: -webkit-optimize-contrast; 1713 } 1714 } 1715 1716 @media (prefers-reduced-motion: reduce) { 1717 .swiper-bece704f-04e3-4d27-9b97-78f3c9d279cd * { 1718 transition-duration: 0.01ms !important; 1719 animation-duration: 0.01ms !important; 1720 } 1721 1722 #modal-image-bece704f-04e3-4d27-9b97-78f3c9d279cd { 1723 transition: none !important; 1724 animation: none !important; 1725 } 1726 } 1727 </style> 1728</section> 1729<section class="w-full xl:max-w-[1440px] mx-auto flex-shrink-0 bg-[var(--bg-secondary)] my-20 p-6 xl:p-10 col-span-2" id="section-986bFUi0" data-maglev-section-id="986bFUi0" data-maglev-section-type="review_01"> 1730 <header class="text-center"> 1731 <h2 id="reviews-heading" class="text-[var(--text-primary)] text-[32px] xl:text-[48px] font-semibold tracking-[-0.48px]"> 1732 Customer Reviews 1733 </h2> 1734 <p class="text-[var(--text-secondary)] text-[14px] xl:text-[16px] font-normal leading-[24px] mt-3"> 1735 Check out our most recent reviews! 1736 </p> 1737 </header> 1738 <div class="mt-10 flex gap-x-4 overflow-x-auto" role="group" aria-labelledby="reviews-heading"> 1739 <article class="w-[248px] flex-shrink-0 rounded-lg bg-[var(--bg-primary)] shadow-md p-6 h-fit"> 1740 <div class="flex items-center mb-4"> 1741 <img src="https://image-cdn.chowlyinc.com/75x75%2Cfit/https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FALV-UjXUTV1GuOSe9TqOS8ta9Owq5IDJg8WHW8yEA1OngSv7_m2CpDsx%3Ds128-c0x00000000-cc-rp-mo-ba2" alt="Victor Loera" class="w-10 h-10 mr-4"> 1742 <div> 1743 <h3 class="text-[var(--text-primary)] font-semibold text-[16px] leading-[24px]">Victor Loera</h3> 1744 <div class="flex text-yellow-500 mt-1" style="--star-rating: 5;"> 1745 <span data-star="5"></span> 1746 </div> 1747 </div> 1748 </div> 1749 <p class="review-text text-[var(--text-secondary)] text-[14px] leading-[20px]"> 1750 <span class="truncated-part">First time visiting and Saigon Sisters went above and beyond anything I was expecting. Itâs a small spot with a lot of class. The service was really attentive and sweet. The food was absolutely delicious! We had shrimp spring rolls with a peanut dipping sauce, the chicken and pork Pad Thai and beef fried rice⦠really</span> 1751 <span class="ellipsis">...</span> 1752 <span id="review-extra-0" class="extra-part section-hidden"> good! Elevated compared to other places. For dessert, we tried the Dubai Chocolate and Banana Brown Butter Cake⦠really well balanced! They have mocktails that are really good and my regular old fashioned was very tasty. On top of everything, the space is cozy and really nice relaxed atmosphere. Couldnât recommend it more. I will go back soon. Places like these are a blessing. You would be blessed to visit.</span> 1753 <a href="#" class="toggle-read-more text-[var(--text-secondary)] text-[14px] leading-[20px]" role="button" aria-expanded="false" aria-controls="review-extra-0" aria-label="Read more of Victor Loera's review">Read More</a> 1754 </p> 1755 </article> 1756 <article class="w-[248px] flex-shrink-0 rounded-lg bg-[var(--bg-primary)] shadow-md p-6 h-fit"> 1757 <div class="flex items-center mb-4"> 1758 <img src="https://image-cdn.chowlyinc.com/75x75%2Cfit/https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FALV-UjWTbddzW7PPTs45Z8Ksbrlr_HcPoYbBF1T5XMOsi4VavtbUZKyQ%3Ds128-c0x00000000-cc-rp-mo-ba3" alt="Kayla Davis" class="w-10 h-10 mr-4"> 1759 <div> 1760 <h3 class="text-[var(--text-primary)] font-semibold text-[16px] leading-[24px]">Kayla Davis</h3> 1761 <div class="flex text-yellow-500 mt-1" style="--star-rating: 5;">
1762 <span data-star="5"></span> 1763 </div> 1764 </div> 1765 </div> 1766 <p class="review-text text-[var(--text-secondary)] text-[14px] leading-[20px]"> 1767 <span>Food and service were EXCELLENT! My party was absolutely in love with their banh bao, fried rice, and spicy noodles. The pork spring rolls were excellent as well! The owner is very kind and goes around talking to all the guests. I will be returning!</span> 1768 </p> 1769 </article> 1770 <article class="w-[248px] flex-shrink-0 rounded-lg bg-[var(--bg-primary)] shadow-md p-6 h-fit"> 1771 <div class="flex items-center mb-4"> 1772 <img src="https://image-cdn.chowlyinc.com/75x75%2Cfit/https%3A%2F%2Flh3.googleusercontent.com%2Fa%2FACg8ocI3M5cjk9IvhdBcE_lyhEtxstE_IPNqjhv_xrmgABAP8J8yQQ%3Ds128-c0x00000000-cc-rp-mo-ba3" alt="Brandi Flowers" class="w-10 h-10 mr-4"> 1773 <div> 1774 <h3 class="text-[var(--text-primary)] font-semibold text-[16px] leading-[24px]">Brandi Flowers</h3> 1775 <div class="flex text-yellow-500 mt-1" style="--star-rating: 5;"> 1776 <span data-star="5"></span> 1777 </div> 1778 </div> 1779 </div> 1780 <p class="review-text text-[var(--text-secondary)] text-[14px] leading-[20px]"> 1781 <span class="truncated-part">After researching the best Asian restaurants in the city, I decided to celebrate my mother-in-law's birthday at Saigon Sisters, and it exceeded every expectation. 1782 1783Dan greeted us warmly as soon as we arrived. I had called ahead because my Uber was running late, and he was incredibly accommodating, making us feel</span> 1784 <span class="ellipsis">...</span> 1785 <span id="review-extra-2" class="extra-part section-hidden"> welcomed from the moment we walked in. 1786 1787We started with the chicken steamed dumplings, pork and shrimp fresh spring rolls, and vegetable spring rolls. The spring rolls were unbelievably fresh and absolutely delicious. We also ordered the duck bao, which was filled with tender, moist duck, crisp cucumbers, and a perfectly balanced plum sauce. 1788 1789My daughter ordered the Bo Luc Lac, and it was bursting with flavor. The steak was incredibly tender and juicy, and the accompanying salad was one of the freshest we've ever had, topped with an amazingly flavorful dressing. 1790 1791My mother-in-law thoroughly enjoyed the stir-fried vegetables, which were cooked perfectly and packed with fresh flavor. 1792 1793To finish our meal, we shared the Dubai chocolate cake and the banana brown butter cake. Both desserts were outstanding and the perfect ending to a fantastic dining experience. 1794 1795A special thank you to Harley, our server, who provided impeccable service throughout the evening. She was attentive, friendly, and helped make my mother-in-law's birthday celebration truly memorable. 1796 1797From the warm hospitality to the exceptional food and outstanding service, Saigon Sister delivered a five-star experience. We can't wait to return!</span> 1798 <a href="#" class="toggle-read-more text-[var(--text-secondary)] text-[14px] leading-[20px]" role="button" aria-expanded="false" aria-controls="review-extra-2" aria-label="Read more of Brandi Flowers's review">Read More</a> 1799 </p> 1800 </article> 1801 <article class="w-[248px] flex-shrink-0 rounded-lg bg-[var(--bg-primary)] shadow-md p-6 h-fit"> 1802 <div class="flex items-center mb-4"> 1803 <img src="https://image-cdn.chowlyinc.com/75x75%2Cfit/https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FALV-UjWGkTxEfxVUmyQnX_UNgDr8YPZC-M4gCd9iqxRunyAZW7TA7MjV%3Ds128-c0x00000000-cc-rp-mo" alt="Regine Joy Ganut" class="w-10 h-10 mr-4"> 1804 <div> 1805 <h3 class="text-[var(--text-primary)] font-semibold text-[16px] leading-[24px]">Regine Joy Ganut</h3> 1806 <div class="flex text-yellow-500 mt-1" style="--star-rating: 5;"> 1807 <span data-star="5"></span> 1808 </div> 1809 </div> 1810 </div> 1811 <p class="review-text text-[var(--text-secondary)] text-[14px] leading-[20px]">
1812 <span class="truncated-part">The food was great! Me and my friends went for a dinner and we enjoyed every bite! It was fresh and made to perfection and I am not even exaggerating. The price was great for the quality youâll get. The service was immaculate! Their attention to detail was exceptional. We were lucky to meet the owner and he was very</span> 1813 <span class="ellipsis">...</span> 1814 <span id="review-extra-3" class="extra-part section-hidden"> warm and welcoming. Definitely coming back for more!</span> 1815 <a href="#" class="toggle-read-more text-[var(--text-secondary)] text-[14px] leading-[20px]" role="button" aria-expanded="false" aria-controls="review-extra-3" aria-label="Read more of Regine Joy Ganut's review">Read More</a> 1816 </p> 1817 </article> 1818 <article class="w-[248px] flex-shrink-0 rounded-lg bg-[var(--bg-primary)] shadow-md p-6 h-fit"> 1819 <div class="flex items-center mb-4"> 1820 <img src="https://image-cdn.chowlyinc.com/75x75%2Cfit/https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FALV-UjUs_JWD7oKJFfiaBSw51Hj3r5hxbsBvep3NRt7dEAjonmRTwowMow%3Ds128-c0x00000000-cc-rp-mo-ba5" alt="Dimitry Kopets" class="w-10 h-10 mr-4"> 1821 <div> 1822 <h3 class="text-[var(--text-primary)] font-semibold text-[16px] leading-[24px]">Dimitry Kopets</h3> 1823 <div class="flex text-yellow-500 mt-1" style="--star-rating: 5;"> 1824 <span data-star="5"></span> 1825 </div> 1826 </div> 1827 </div> 1828 <p class="review-text text-[var(--text-secondary)] text-[14px] leading-[20px]"> 1829 <span>âWas pleasantly surprised by Saigon Sisters! Went in not knowing what to expect, but the food blew me away. The octopus was full of flavor, and the dumplings and short rib pho were delicious. If you appreciate great Vietnamese food with some adventurous dishes on the menu, definitely give this place a try!</span> 1830 </p> 1831 </article> 1832 </div> 1833 1834
1834<script type="module"> 1835 $(document).ready(function(){ 1836 $('.toggle-read-more').on('click', function(e){ 1837 e.preventDefault(); 1838 const $link = $(this); 1839 const $reviewText = $link.closest('.review-text'); 1840 const $extraPart = $reviewText.find('.extra-part'); 1841 const $ellipsis = $reviewText.find('.ellipsis'); 1842 const reviewerName = $link.closest('article').find('h3').text() || 'this reviewer'; 1843 const isExpanded = $link.attr('aria-expanded') === 'true'; 1844 1845 if (isExpanded) { 1846 $extraPart.slideUp(300); 1847 $ellipsis.slideDown(300); 1848 $link.text('Read More'); 1849 $link.attr('aria-expanded', 'false'); 1850 $link.attr('aria-label', `Read more of ${reviewerName}'s review`); 1851 } else { 1852 $ellipsis.slideUp(300); 1853 $extraPart.slideDown(300); 1854 $link.text('Read Less'); 1855 $link.attr('aria-expanded', 'true'); 1856 $link.attr('aria-label', `Read less of ${reviewerName}'s review`); 1857 } 1858 }); 1859 }); 1860 </script>
1860 1861 1862 <style> 1863 .toggle-read-more { 1864 font-size: 14px; 1865 line-height: 20px; 1866 text-decoration-line: underline; 1867 text-decoration-style: solid; 1868 text-underline-offset: auto; 1869 text-underline-position: from-font; 1870 } 1871 .review-card { 1872 transition: height 0.3s ease; 1873 } 1874 .review-text { 1875 overflow: hidden; 1876 position: relative; 1877 } 1878 .section-hidden { 1879 display: none; 1880 } 1881 </style> 1882</section> 1883 1884<section class="w-full xl:max-w-[1150px] mx-auto px-4 xl:px-0 py-12 col-span-2" id="section-wwehgrDj" data-maglev-section-id="wwehgrDj" data-maglev-section-type="faq_block_01"> 1885 <!-- Section Title --> 1886 <h2 data-maglev-id="wwehgrDj.title" class="text-3xl xl:text-4xl font-bold text-[var(--text-primary)] text-center mb-8">Frequently Asked Questions</h2> 1887 1888 <!-- FAQ Items Container --> 1889 <div class="faq-container bg-[var(--background-primary)] "> 1890 <!-- Manual FAQ Blocks --> 1891 <details open class="faq-item border-b border-gray-200 dark:border-gray-700 last:border-b-0"> 1892 <summary class="faq-header py-4 flex justify-between items-center"> 1893 <h3 class="text-base font-medium text-[var(--text-primary)] pr-4">What dishes are you best known for?</h3> 1894 <svg class="faq-chevron w-4 h-4 text-[var(--text-secondary)] transform transition-transform duration-200 flex-shrink-0" 1895 fill="none" stroke="currentColor" viewBox="0 0 24 24"> 1896 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path> 1897 </svg> 1898 </summary> 1899 <div class="faq-answer pb-4"> 1900 <div class="text-sm text-[var(--text-secondary)] leading-relaxed pr-8"><p>Guests come back for our <a href="/menu/banh-mi-sandwiches">banh mi sandwiches</a> on crackly French baguettes and a steaming bowl of <a href="/menu/beef-pho">beef pho</a>. Soft steamed <a href="/menu/bao-buns">bao buns</a> and fresh <a href="/menu/pork-and-shrimp-fresh-spring-rolls">pork and shrimp spring rolls</a> round out the table, and spice lovers order the lemongrass-scented <a href="/menu/bun-bo-hue">bun bo hue</a>.</p></div> 1901 </div> 1902 </details> 1903 <details open class="faq-item border-b border-gray-200 dark:border-gray-700 last:border-b-0"> 1904 <summary class="faq-header py-4 flex justify-between items-center"> 1905 <h3 class="text-base font-medium text-[var(--text-primary)] pr-4">What type of cuisine do you serve?</h3> 1906 <svg class="faq-chevron w-4 h-4 text-[var(--text-secondary)] transform transition-transform duration-200 flex-shrink-0" 1907 fill="none" stroke="currentColor" viewBox="0 0 24 24"> 1908 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path> 1909 </svg> 1910 </summary> 1911 <div class="faq-answer pb-4"> 1912 <div class="text-sm text-[var(--text-secondary)] leading-relaxed pr-8"><p>We cook <a href="/menu/vietnamese">Vietnamese</a> food from our family's recipes, from the <a href="/menu/vietnamese-street-food">Vietnamese street food</a> Mama Suu served at the French Market to signature plates like bo luc lac. The menu also draws on <a href="/menu/southeast-asian">Southeast Asian</a> favorites such as laksa and green curry, alongside wider <a href="/menu/asian">Asian</a> noodle and rice dishes.</p></div> 1913 </div> 1914 </details> 1915 <details open class="faq-item border-b border-gray-200 dark:border-gray-700 last:border-b-0"> 1916 <summary class="faq-header py-4 flex justify-between items-center"> 1917 <h3 class="text-base font-medium text-[var(--text-primary)] pr-4">What services do you offer?</h3> 1918 <svg class="faq-chevron w-4 h-4 text-[var(--text-secondary)] transform transition-transform duration-200 flex-shrink-0" 1919 fill="none" stroke="currentColor" viewBox="0 0 24 24"> 1920 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path> 1921 </svg> 1922 </summary> 1923 <div class="faq-answer pb-4"> 1924 <div class="text-sm text-[var(--text-secondary)] leading-relaxed pr-8"><p>Join us for <a href="/menu/lunch">lunch</a>
1924 or dinner in the dining room, grab <a href="/menu/takeout">takeout</a>, or order <a href="/menu/delivery">delivery</a> across the West Loop. For offices and events we offer Vietnamese <a href="/menu/catering">catering</a>, and our room hosts <a href="/menu/private-parties">private parties</a> and group dinners.</p></div> 1925 </div> 1926 </details> 1927 <details open class="faq-item border-b border-gray-200 dark:border-gray-700 last:border-b-0"> 1928 <summary class="faq-header py-4 flex justify-between items-center"> 1929 <h3 class="text-base font-medium text-[var(--text-primary)] pr-4">What areas do you serve?</h3> 1930 <svg class="faq-chevron w-4 h-4 text-[var(--text-secondary)] transform transition-transform duration-200 flex-shrink-0" 1931 fill="none" stroke="currentColor" viewBox="0 0 24 24"> 1932 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path> 1933 </svg> 1934 </summary> 1935 <div class="faq-answer pb-4"> 1936 <div class="text-sm text-[var(--text-secondary)] leading-relaxed pr-8"><p>Our restaurant sits at 567 W Lake St in <a href="/location/chicago">Chicago</a>, in the heart of the <a href="/location/west-loop">West Loop</a>. We serve neighbors and office crowds from <a href="/location/fulton-market">Fulton Market</a>, the <a href="/location/near-west-side">Near West Side</a> and the <a href="/location/chicago-loop">Chicago Loop</a>, a short walk from Ogilvie and Union Station.</p></div> 1937 </div> 1938 </details> 1939 </div> 1940 1941 <!-- SEO Structured Data --> 1942
1942<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"What dishes are you best known for?","acceptedAnswer":{"@type":"Answer","text":"Guests come back for our banh mi sandwiches on crackly French baguettes and a steaming bowl of beef pho. Soft steamed bao buns and fresh pork and shrimp spring rolls round out the table, and spice lovers order the lemongrass-scented bun bo hue."}},{"@type":"Question","name":"What type of cuisine do you serve?","acceptedAnswer":{"@type":"Answer","text":"We cook Vietnamese food from our family's recipes, from the Vietnamese street food Mama Suu served at the French Market to signature plates like bo luc lac. The menu also draws on Southeast Asian favorites such as laksa and green curry, alongside wider Asian noodle and rice dishes."}},{"@type":"Question","name":"What services do you offer?","acceptedAnswer":{"@type":"Answer","text":"Join us for lunch or dinner in the dining room, grab takeout, or order delivery across the West Loop. For offices and events we offer Vietnamese catering, and our room hosts private parties and group dinners."}},{"@type":"Question","name":"What areas do you serve?","acceptedA
1942nswer":{"@type":"Answer","text":"Our restaurant sits at 567 W Lake St in Chicago, in the heart of the West Loop. We serve neighbors and office crowds from Fulton Market, the Near West Side and the Chicago Loop, a short walk from Ogilvie and Union Station."}}]}</script>
1942 1943 1944</section><section class="w-full xl:max-w-[1440px] mx-auto h-auto flex-shrink-0 relative flex flex-col items-start justify-center px-10 xl:px-20 py-10 xl:py-20 col-span-2" id="section-BaRHvt74" data-maglev-section-id="BaRHvt74" data-maglev-section-type="custom_html_01"> 1945 <div class="pf-embed-wrapper"> 1946 <div data-paperform-id="saigon-awards"></div> 1947</div> 1948 1949<style> 1950 .pf-embed-wrapper { 1951 width: 100%; 1952 max-width: full; 1953 margin: 0 auto; 1954 border-radius: 0.5rem; 1955 overflow: hidden; 1956 } 1957 1958 @media (max-width: 768px) { 1959 .pf-embed-wrapper { 1960 border-radius: 0; 1961 max-width: 100%; 1962 } 1963 } 1964</style> 1965
1966<script> 1967 (function() { 1968 if (document.querySelector('script[src*="paperform"]')) return; 1969 1970 var script = document.createElement('script'); 1971 script.src = 'https://paperform.co/__embed.min.js'; 1972 script.defer = true; 1973 document.body.appendChild(script); 1974 })(); 1975</script>
1975 1976</section><section class="w-full flex justify-center py-10 col-span-2" data-location_id="section-1d68fb44-0394-44a0-a709-6461fa196d6b" aria-label="Locations information" id="section-HtNlkwFf" data-maglev-section-id="HtNlkwFf" data-maglev-section-type="locations_01"> 1977 1978 1979 1980 <section class="w-full xl:max-w-[1440px] h-auto flex-shrink-0 bg-[var(--bg-secondary)] p-8"> 1981<header class="w-full flex flex-col items-center px-4 xl:px-0"> 1982 <h2 data-maglev-id="HtNlkwFf.title" class="text-[var(--text-primary)] text-center text-[32px] xl:text-[48px] font-semibold leading-[normal] tracking-[-0.48px]" id="locations-heading-1d68fb44-0394-44a0-a709-6461fa196d6b"><strong>Visit Saigon Sisters</strong></h2> 1983 <p data-maglev-id="HtNlkwFf.subtitle" class="text-[var(--text-secondary)] text-center text-[16px] font-normal leading-[24px] mt-2">Come experience authentic Vietnamese flavors in the heart of Chicago</p> 1984</header> 1985 1986<!-- Persistent navigation that appears in the layout but stays visible --> 1987 <div class="mt-10 w-full flex flex-col xl:flex-row items-start justify-center"> 1988 <div class="w-full xl:w-[657px] bg-[var(--bg-primary)] rounded-lg shadow-lg p-8 flex-shrink-0 min-h-[418px] flex flex-col justify-between"> 1989 <div> 1990 <!-- Dynamic title that updates --> 1991 <h3 class="text-[#212121] text-[24px] font-semibold leading-[30px] tracking-[-0.192px]" id="current-location-title-1d68fb44-0394-44a0-a709-6461fa196d6b"> 1992 Saigon Sisters - Chicago Lake St 1993 </h3> 1994 1995 <!-- Navigation below title --> 1996 <nav class="mt-4 flex flex-wrap md:flex-nowrap justify-start md:justify-start gap-1 sm:gap-2 md:overflow-x-auto" aria-label="Location navigation" id="location-nav-1d68fb44-0394-44a0-a709-6461fa196d6b"> 1997 1998 <div class="nav-item flex min-w-0 md:min-w-[120px] px-2 sm:px-3 py-2 justify-center items-center rounded-md w-auto md:flex-shrink-0" data-nav-index="0"> 1999 <a data-maglev-id="bcJ-F2tSCNA.name" href="#" data-switch_location="1d68fb44-0394-44a0-a709-6461fa196d6b-0" class="text-[14px] leading-[140%] md:whitespace-nowrap text-center" aria-current="false">Saigon Sisters - Chicago Lake St</a> 2000 </div> 2001 2002 <div class="nav-item flex min-w-0 md:min-w-[120px] px-2 sm:px-3 py-2 justify-center items-center rounded-md w-auto md:flex-shrink-0" data-nav-index="1"> 2003 <a data-maglev-id="__5IhZFzBb0.name" href="#" data-switch_location="1d68fb44-0394-44a0-a709-6461fa196d6b-1" class="text-[14px] leading-[140%] md:whitespace-nowrap text-center" aria-current="false">Saigon Sisters French Market</a> 2004 </div> 2005 </nav> 2006 2007 <!-- Dynamic content area --> 2008 <div id="dynamic-content-1d68fb44-0394-44a0-a709-6461fa196d6b"> 2009 <!-- Content will be loaded here --> 2010 </div> 2011 </div> 2012 </div> 2013 2014 <!-- Dynamic map area --> 2015 <figure class="w-full xl:w-[359px] h-[418px] mt-4 xl:mt-0 rounded-lg flex-shrink-0 overflow-hidden" id="dynamic-map-1d68fb44-0394-44a0-a709-6461fa196d6b"> 2016 <!-- Map will be loaded here --> 2017 </figure> 2018 </div> 2019 2020<!-- Hidden location data for JavaScript --> 2021 <div class="hidden" data-location-data="1d68fb44-0394-44a0-a709-6461fa196d6b-0" data-location-name="Saigon Sisters - Chicago Lake St"> 2022 <div class="location-content"> 2023 <address class="mt-6 flex items-center space-x-3 not-italic"> 2024 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true"> 2025 <path d="M9.99992 17.7712C9.80547 17.7712 9.61103 17.7364 9.41658 17.667C9.22214 17.5975 9.04853 17.4934 8.89575 17.3545C7.99297 16.5212 7.19436 15.7087 6.49992 14.917C5.80547 14.1253 5.22561 13.358 4.76034 12.6149C4.29506 11.8719 3.94089 11.1566 3.69784 10.4691C3.45478 9.78158 3.33325 9.12533 3.33325 8.50033C3.33325 6.41699 4.00339 4.75727 5.34367 3.52116C6.68395 2.28505 8.23603 1.66699 9.99992 1.66699C11.7638 1.66699 13.3159 2.28505 14.6562 3.52116C15.9964 4.75727 16.6666 6.41699 16.6666 8.50033C16.6666 9.12533 16.5451 9.78158 16.302 10.4691C16.0589 11.1566 15.7048 11.8719 15.2395 12.6149C14.7742 13.358 14.1944 14.1253 13.4999 14.917C12.8055 15.7087 12.0069 16.5212 11.1041 17.3545C10.9513 17.4934 10.7777 17.5975 10.5833 17.667C10.3888 17.7364 10.1944 17.7712 9.99992 17.7712ZM9.99992 10.0003C10.4583 10.0003 10.8506 9.83713 11.177 9.51074C11.5034 9.18435 11.6666 8.79199 11.6666 8.33366C11.6666 7.87533 11.5034 7.48296 11.177 7.15658C10.8506 6.83019 10.4583 6.66699 9.99992 6.66699C9.54158 6.66699 9.14922 6.83019 8.82283 7.15658C8.49645 7.48296 8.33325 7.87533 8.33325 8.33366C8.33325 8.79199 8.49645 9.18435 8.82283 9.51074C9.14922 9.83713 9.54158 10.0003 9.99992 10.0003Z" fill="#666666"></path> 2026 </svg> 2027 <a data-maglev-id="bcJ-F2tSCNA.address" href="https://www.google.com/maps/search/?api=1&
2027query=567%20W%20Lake%20St%2C%20Chicago%2C%20IL%2C%2060661%2C%20US" target="_blank" class="text-[var(--text-primary)] text-[14px] font-normal leading-[20px]">567 W Lake St, Chicago, IL, 60661, US</a> 2028 </address> 2029 2030 <div class="mt-6 flex items-center space-x-3"> 2031 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true"> 2032 <path d="M16.625 17.5C14.8889 17.5 13.1736 17.1215 11.4792 16.3646C9.78472 15.6076 8.24306 14.5347 6.85417 13.1458C5.46528 11.7569 4.39236 10.2153 3.63542 8.52083C2.87847 6.82639 2.5 5.11111 2.5 3.375C2.5 3.125 2.58333 2.91667 2.75 2.75C2.91667 2.58333 3.125 2.5 3.375 2.5H6.75C6.94444 2.5 7.11806 2.56597 7.27083 2.69792C7.42361 2.82986 7.51389 2.98611 7.54167 3.16667L8.08333 6.08333C8.11111 6.30556 8.10417 6.49306 8.0625 6.64583C8.02083 6.79861 7.94444 6.93056 7.83333 7.04167L5.8125 9.08333C6.09028 9.59722 6.42014 10.0938 6.80208 10.5729C7.18403 11.0521 7.60417 11.5139 8.0625 11.9583C8.49306 12.3889 8.94444 12.7882 9.41667 13.1562C9.88889 13.5243 10.3889 13.8611 10.9167 14.1667L12.875 12.2083C13 12.0833 13.1632 11.9896 13.3646 11.9271C13.566 11.8646 13.7639 11.8472 13.9583 11.875L16.8333 12.4583C17.0278 12.5139 17.1875 12.6146 17.3125 12.7604C17.4375 12.9062 17.5 13.0694 17.5 13.25V16.625C17.5 16.875 17.4167 17.0833 17.25 17.25C17.0833 17.4167 16.875 17.5 16.625 17.5Z" fill="#666666"></path> 2033 </svg> 2034 <a data-maglev-id="bcJ-F2tSCNA.phone" href="tel:3124960090" class="text-[var(--text-primary)] text-[14px] font-normal leading-[20px]">312-496-0090</a> 2035 </div> 2036 2037 <div class="mt-6 flex flex-col space-y-2 xl:flex-row xl:space-x-3 justify-between"> 2038 <div class="flex flex-wrap space-x-3"> 2039 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true"> 2040 <path d="M10.8334 9.66699V6.66699C10.8334 6.43088 10.7536 6.23296 10.5938 6.07324C10.4341 5.91352 10.2362 5.83366 10.0001 5.83366C9.76397 5.83366 9.56605 5.91352 9.40633 6.07324C9.24661 6.23296 9.16675 6.43088 9.16675 6.66699V9.97949C9.16675 10.0906 9.18758 10.1982 9.22925 10.3024C9.27091 10.4066 9.33341 10.5003 9.41675 10.5837L12.1667 13.3337C12.3195 13.4864 12.514 13.5628 12.7501 13.5628C12.9862 13.5628 13.1806 13.4864 13.3334 13.3337C13.4862 13.1809 13.5626 12.9864 13.5626 12.7503C13.5626 12.5142 13.4862 12.3198 13.3334 12.167L10.8334 9.66699ZM10.0001 18.3337C8.8473 18.3337 7.76397 18.1149 6.75008 17.6774C5.73619 17.2399 4.85425 16.6462 4.10425 15.8962C3.35425 15.1462 2.7605 14.2642 2.323 13.2503C1.8855 12.2364 1.66675 11.1531 1.66675 10.0003C1.66675 8.84755 1.8855 7.76421 2.323 6.75033C2.7605 5.73644 3.35425 4.85449 4.10425 4.10449C4.85425 3.35449 5.73619 2.76074 6.75008 2.32324C7.76397 1.88574 8.8473 1.66699 10.0001 1.66699C11.1529 1.66699 12.2362 1.88574 13.2501 2.32324C14.264 2.76074 15.1459 3.35449 15.8959 4.10449C16.6459 4.85449 17.2397 5.73644 17.6772 6.75033C18.1147 7.76421 18.3334 8.84755 18.3334 10.0003C18.3334 11.1531 18.1147 12.2364 17.6772 13.2503C17.2397 14.2642 16.6459 15.1462 15.8959 15.8962C15.1459 16.6462 14.264 17.2399 13.2501 17.6774C12.2362 18.1149 11.1529 18.3337 10.0001 18.3337Z" fill="#666666"></path> 2041 </svg> 2042 <div> 2043 <div data-maglev-id="bcJ-F2tSCNA.hours" class="mt-0 space-y-2 text-[var(--text-primary)]"><strong>Sunday:</strong> Closed<br><strong>Monday:</strong> Closed<br><strong>Tuesday:</strong> 11:00 AM - 9:00 PM<br><strong>Wednesday:</strong> 11:00 AM - 9:00 PM<br><strong>Thursday:</strong> 11:00 AM - 9:00 PM<br><strong>Friday:</strong> 11:00 AM - 10:00 PM<br><strong>Saturday: </strong>12:00 PM - 10:00 PM</div> 2044 </div> 2045 </div> 2046 <div class="flex flex-col justify-end items-center xl:items-end"> 2047 <a href="/stores" class="mt-6 md:mt-0 inline-flex h-[48px] w-full md:w-auto px-8 py-4 justify-center items-center gap-2 rounded-[6px] border border-[#6b953e] text-[#6b953e] hover:brightness-90 text-[15px] font-semibold leading-[150%]">Start an order</a> 2048 </div> 2049 </div> 2050 </div> 2051 2052 <div class="location-map"> 2053 <a href="https://www.google.com/maps/search/?api=1&
2053query=567%20W%20Lake%20St%2C%20Chicago%2C%20IL%2C%2060661%2C%20US" target="_blank" rel="noopener noreferrer" aria-label="Open Saigon Sisters - Chicago Lake St - 567 W Lake St, Chicago, IL, 60661, US in Google Maps" class="block w-full h-full"> 2054 <img src="/maps/567%20W%20Lake%20St%2C%20Chicago%2C%20IL%2C%2060661%2C%20US/359/418.png" alt="Map of Saigon Sisters - Chicago Lake St - 567 W Lake St, Chicago, IL, 60661, US" loading="lazy" width="359" height="418" class="w-full h-full object-cover"> 2055</a> 2056 2057 </div> 2058 </div> 2059 <div class="hidden" data-location-data="1d68fb44-0394-44a0-a709-6461fa196d6b-1" data-location-name="Saigon Sisters French Market"> 2060 <div class="location-content"> 2061 <address class="mt-6 flex items-center space-x-3 not-italic"> 2062 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true"> 2063 <path d="M9.99992 17.7712C9.80547 17.7712 9.61103 17.7364 9.41658 17.667C9.22214 17.5975 9.04853 17.4934 8.89575 17.3545C7.99297 16.5212 7.19436 15.7087 6.49992 14.917C5.80547 14.1253 5.22561 13.358 4.76034 12.6149C4.29506 11.8719 3.94089 11.1566 3.69784 10.4691C3.45478 9.78158 3.33325 9.12533 3.33325 8.50033C3.33325 6.41699 4.00339 4.75727 5.34367 3.52116C6.68395 2.28505 8.23603 1.66699 9.99992 1.66699C11.7638 1.66699 13.3159 2.28505 14.6562 3.52116C15.9964 4.75727 16.6666 6.41699 16.6666 8.50033C16.6666 9.12533 16.5451 9.78158 16.302 10.4691C16.0589 11.1566 15.7048 11.8719 15.2395 12.6149C14.7742 13.358 14.1944 14.1253 13.4999 14.917C12.8055 15.7087 12.0069 16.5212 11.1041 17.3545C10.9513 17.4934 10.7777 17.5975 10.5833 17.667C10.3888 17.7364 10.1944 17.7712 9.99992 17.7712ZM9.99992 10.0003C10.4583 10.0003 10.8506 9.83713 11.177 9.51074C11.5034 9.18435 11.6666 8.79199 11.6666 8.33366C11.6666 7.87533 11.5034 7.48296 11.177 7.15658C10.8506 6.83019 10.4583 6.66699 9.99992 6.66699C9.54158 6.66699 9.14922 6.83019 8.82283 7.15658C8.49645 7.48296 8.33325 7.87533 8.33325 8.33366C8.33325 8.79199 8.49645 9.18435 8.82283 9.51074C9.14922 9.83713 9.54158 10.0003 9.99992 10.0003Z" fill="#666666"></path> 2064 </svg> 2065 <a data-maglev-id="__5IhZFzBb0.address" href="https://www.google.com/maps/search/?api=1&query=131%20N.%20Clinton%20St%20Chicago%2C%20IL%2C%2060661%2C%20US" target="_blank" class="text-[var(--text-primary)] text-[14px] font-normal leading-[20px]">131 N. Clinton St Chicago, IL, 60661, US</a> 2066 </address> 2067 2068 <div class="mt-6 flex items-center space-x-3"> 2069 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true"> 2070 <path d="M16.625 17.5C14.8889 17.5 13.1736 17.1215 11.4792 16.3646C9.78472 15.6076 8.24306 14.5347 6.85417 13.1458C5.46528 11.7569 4.39236 10.2153 3.63542 8.52083C2.87847 6.82639 2.5 5.11111 2.5 3.375C2.5 3.125 2.58333 2.91667 2.75 2.75C2.91667 2.58333 3.125 2.5 3.375 2.5H6.75C6.94444 2.5 7.11806 2.56597 7.27083 2.69792C7.42361 2.82986 7.51389 2.98611 7.54167 3.16667L8.08333 6.08333C8.11111 6.30556 8.10417 6.49306 8.0625 6.64583C8.02083 6.79861 7.94444 6.93056 7.83333 7.04167L5.8125 9.08333C6.09028 9.59722 6.42014 10.0938 6.80208 10.5729C7.18403 11.0521 7.60417 11.5139 8.0625 11.9583C8.49306 12.3889 8.94444 12.7882 9.41667 13.1562C9.88889 13.5243 10.3889 13.8611 10.9167 14.1667L12.875 12.2083C13 12.0833 13.1632 11.9896 13.3646 11.9271C13.566 11.8646 13.7639 11.8472 13.9583 11.875L16.8333 12.4583C17.0278 12.5139 17.1875 12.6146 17.3125 12.7604C17.4375 12.9062 17.5 13.0694 17.5 13.25V16.625C17.5 16.875 17.4167 17.0833 17.25 17.25C17.0833 17.4167 16.875 17.5 16.625 17.5Z" fill="#666666"></path> 2071 </svg> 2072 <a data-maglev-id="__5IhZFzBb0.phone" href="tel:3124960094" class="text-[var(--text-primary)] text-[14px] font-normal leading-[20px]">(312) 496-0094</a> 2073 </div> 2074 2075 <div class="mt-6 flex flex-col space-y-2 xl:flex-row xl:space-x-3 justify-between"> 2076 <div class="flex flex-wrap space-x-3"> 2077 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true"> 2078 <path d="M10.8334 9.66699V6.66699C10.8334 6.43088 10.7536 6.23296 10.5938 6.07324C10.4341 5.91352 10.2362 5.83366 10.0001 5.83366C9.76397 5.83366 9.56605 5.91352 9.40633 6.07324C9.24661 6.23296 9.16675 6.43088 9.16675 6.66699V9.97949C9.16675 10.0906 9.18758 10.1982 9.22925 10.3024C9.27091 10.4066 9.33341 10.5003 9.41675 10.5837L12.1667 13.3337C12.3195 13.4864 12.514 13.5628 12.7501 13.5628C12.9862 13.5628 13.1806 13.4864 13.3334 13.3337C13.4862 13.1809 13.5626 12.9864 13.5626 12.7503C13.5626 12.5142 13.4862 12.3198 13.3334 12.167L10.8334 9.66699ZM10.0001 18.3337C8.8473 18.3337 7.76397 18.1149 6.75008 17.6774C5.73619 17.2399 4.85425 16.6462 4.10425 15.8962C3.35425 15.1462 2.7605 14.2642 2.323 13.2503C1.8855 12.2364 1.66675 11.1531 1.66675 10.0003C1.66675 8.84755 1.8855 7.76421 2.323 6.75033C2.7605 5.73644 3.35425 4.85449 4.10425 4.10449C4.85425 3.35449 5.73619 2.76074 6.75008 2.32324C7.76397 1.88574 8.8473 1.66699 10.0001 1.66699C11.1529 1.66699 12.2362 1.88574 13.2501 2.32324C14.264 2.76074 15.1459 3.35449 15.8959 4.10449C16.6459 4.85449 17.2397 5.73644 17.6772 6.75033C18.1147 7.76421 18.3334 8.84755 18.3334 10.0003C18.3334 11.1531 18.1147 12.2364 17.6772 13.2503C17.2397 14.2642 16.6459 15.1462 15.8959 15.8962C15.1459 16.6462 14.264 17.2399 13.2501 17.6774C12.2362 18.1149 11.1529 18.3337 10.0001 18.3337Z" fill="#666666"></path> 2079 </svg> 2080 <div> 2081 <div data-maglev-id="__5IhZFzBb0.hours" class="mt-0 space-y-2 text-[var(--text-primary)]"><strong>Monday: </strong>10am - 5pm<br><strong>Tuesday: </strong>10am - 5pm<br><strong>Wednesday: </strong>10am - 5pm<br><strong>Thursday: </strong>10am - 5pm<br><strong>Friday: </strong>10am - 5pm<br><strong>Saturday: </strong>10am - 4pm<br><strong>Sunday: </strong>Closed</div> 2082 </div> 2083 </div> 2084 <div class="flex flex-col justify-end items-center xl:items-end"> 2085 <a href="/saigon-french-market" class="mt-6 md:mt-0 inline-flex h-[48px] w-full md:w-auto px-8 py-4 justify-center items-center gap-2 rounded-[6px] border border-[#6b953e] text-[#6b953e] hover:brightness-90 text-[15px] font-semibold leading-[150%]">Start an order</a> 2086 </div> 2087 </div> 2088 </div> 2089 2090 <div class="location-map"> 2091 <a href="https://www.google.com/maps/search/?api=1&
2091query=131%20N.%20Clinton%20St%20Chicago%2C%20IL%2C%2060661%2C%20US" target="_blank" rel="noopener noreferrer" aria-label="Open Saigon Sisters French Market - 131 N. Clinton St Chicago, IL, 60661, US in Google Maps" class="block w-full h-full"> 2092 <img src="/maps/131%20N.%20Clinton%20St%20Chicago%2C%20IL%2C%2060661%2C%20US/359/418.png" alt="Map of Saigon Sisters French Market - 131 N. Clinton St Chicago, IL, 60661, US" loading="lazy" width="359" height="418" class="w-full h-full object-cover"> 2093</a> 2094 2095 </div> 2096 </div> 2097 2098<!-- Fallback for single location --> 2099</section> 2100
2101<script type="module"> 2102$(document).ready(function() { 2103 const firstLocationData = $('[data-location-data="1d68fb44-0394-44a0-a709-6461fa196d6b-0"]'); 2104 $('#dynamic-content-1d68fb44-0394-44a0-a709-6461fa196d6b').html(firstLocationData.find('.location-content').html()); 2105 $('#dynamic-map-1d68fb44-0394-44a0-a709-6461fa196d6b').html(firstLocationData.find('.location-map').html()); 2106 $('#location-nav-1d68fb44-0394-44a0-a709-6461fa196d6b .nav-item[data-nav-index="0"]').addClass('active'); 2107}); 2108 2109$(document).on('click', '#location-nav-1d68fb44-0394-44a0-a709-6461fa196d6b [data-switch_location]', function(e) { 2110 e.preventDefault(); 2111 2112 const locationData = $('[data-location-data="' + $(this).data('switch_location') + '"]'); 2113 $('#current-location-title-1d68fb44-0394-44a0-a709-6461fa196d6b').text(locationData.data('location-name')); 2114 $('#dynamic-content-1d68fb44-0394-44a0-a709-6461fa196d6b').html(locationData.find('.location-content').html()); 2115 $('#dynamic-map-1d68fb44-0394-44a0-a709-6461fa196d6b').html(locationData.find('.location-map').html()); 2116 2117 $('#location-nav-1d68fb44-0394-44a0-a709-6461fa196d6b .nav-item').removeClass('active'); 2118 $(this).parent('.nav-item').addClass('active'); 2119}); 2120</script>
2120 2121 2122<style> 2123/* Default navigation item styles */ 2124#location-nav-1d68fb44-0394-44a0-a709-6461fa196d6b .nav-item { 2125 background-color: var(--bg-primary); 2126} 2127 2128#location-nav-1d68fb44-0394-44a0-a709-6461fa196d6b .nav-item a { 2129 color: var(--text-primary); 2130} 2131 2132/* Active navigation item styles */ 2133#location-nav-1d68fb44-0394-44a0-a709-6461fa196d6b .nav-item.active { 2134 background-color: rgba(107, 149, 62, 0.08) !important; 2135} 2136 2137#location-nav-1d68fb44-0394-44a0-a709-6461fa196d6b .nav-item.active a { 2138 color: #6b953e !important; 2139 font-weight: 600 !important; 2140} 2141</style> 2142 2143</section><footer class="w-full mx-auto bg-[var(--bg-primary)] py-8 col-span-2" role="contentinfo" itemscope="itemscope" itemtype="https://schema.org/WPFooter" id="section-C803vDZW" data-maglev-section-id="C803vDZW" data-maglev-section-type="standard_footer_01"> 2144 <div class="w-full px-4 xl:px-0 xl:w-[1200px] mx-auto flex flex-col space-y-3 xl:space-y-6"> 2145 2146 <div class="w-full grid grid-cols-1 xl:grid-cols-3 gap-4 xl:gap-4 mb-2 xl:mb-4"> 2147 <nav class="col-span-1 flex flex-wrap justify-center xl:justify-start order-2 xl:order-1 xl:pl-0" aria-label="Footer navigation"> 2148 <a data-maglev-id="wNYEwpJSKgg.link" class="mx-3 xl:mx-0 xl:mr-6 mb-2 text-[var(--link-text)] hover:text-[var(--link-hover)] text-sm" href="/events"><span data-maglev-id="wNYEwpJSKgg.link.text">Events</span></a> 2149 <a data-maglev-id="9991Ty9mefY.link" class="mx-3 xl:mx-0 xl:mr-6 mb-2 text-[var(--link-text)] hover:text-[var(--link-hover)] text-sm" href="/parties"><span data-maglev-id="9991Ty9mefY.link.text">Parties</span></a> 2150 <a data-maglev-id="LBvD253_0Ic.link" class="mx-3 xl:mx-0 xl:mr-6 mb-2 text-[var(--link-text)] hover:text-[var(--link-hover)] text-sm" href="/press"><span data-maglev-id="LBvD253_0Ic.link.text">Press</span></a> 2151 <a data-maglev-id="bth_WuoX_Hg.link" class="mx-3 xl:mx-0 xl:mr-6 mb-2 text-[var(--link-text)] hover:text-[var(--link-hover)] text-sm" href="/contact-us"><span data-maglev-id="bth_WuoX_Hg.link.text">Contact Us</span></a> 2152 </nav> 2153 2154 <nav class="col-span-1 flex justify-center space-x-6 xl:space-x-8 order-1 xl:order-2" aria-label="Social media links"> 2155 <a data-maglev-id="fB5DvN0LLxU.link" target="_blank" class="w-[32px] h-[32px] bg-[var(--social-bg)] rounded-lg text-[var(--social-text)] text-center" aria-label="fa-brands fa-facebook-f" href="https://www.instagram.com/saigonsisters"> 2156 <i class="text-[24px] pt-[4px] fa-brands fa-facebook-f" data-maglev-id="fB5DvN0LLxU.icon"></i> 2157</a> <a data-maglev-id="6QlyiM7rKfk.link" target="_blank" class="w-[32px] h-[32px] bg-[var(--social-bg)] rounded-lg text-[var(--social-text)] text-center" aria-label="fa-brands fa-instagram" href="https://www.instagram.com/saigonsisters"> 2158 <i class="text-[24px] pt-[4px] fa-brands fa-instagram" data-maglev-id="6QlyiM7rKfk.icon"></i> 2159</a> </nav> 2160 2161 <div class="col-span-1 hidden xl:block order-3"></div> 2162 </div> 2163 2164 <div class="w-full flex flex-col xl:flex-row justify-between items-center text-[var(--text-secondary)] text-sm font-normal leading-[142.857%] space-y-3 xl:space-y-0 mt-2 xl:mt-6"> 2165 <nav class="flex flex-wrap justify-center xl:justify-start flex-grow space-x-4 xl:space-x-6 xl:pl-0" aria-label="Legal links"> 2166 <a href="https://koala-configurations.s3.amazonaws.com/public/assets/Chowly-Terms-and-Conditions-b3cca027-acb6-42db-9d1f-11080e29b1e1.pdf" target="_blank" rel="noopener" class="mb-2">Terms of Use</a> 2167 <a href="https://koala-configurations.s3.us-east-1.amazonaws.com/public/assets/Chowly-Privacy-Policy-202f4118-faeb-4593-8574-57dc447ae203.pdf" target="_blank" rel="noopener" class="mb-2">Privacy Policy</a> 2168 </nav> 2169 2170 <p class="relative text-center xl:flex-grow xl:left-[-200px]" itemscope itemtype="https://schema.org/Organization"> 2171 <span>Saigon Sisters</span>⢠<span itemprop="copyrightYear">2026</span> All Rights Reserved 2172 </p> 2173 <p class="text-center xl:text-right">Made by <a href="https://www.chowly.com" class="font-bold" rel="noopener">Chowly</a></p> 2174 </div> 2175 </div> 2176</footer> 2177 </section> 2178 </main> 2179 <!-- ===== Saigon Sisters â scroll reveal (body_scripts) ===== -->
2180<script> 2181(function(){ 2182 // Signal that this reveal script mounted, so a host's belt-and-suspenders "force-reveal if JS 2183 // didn't load" fallback can NO-OP when scroll-reveal is actually running (otherwise that fallback 2184 // reveals every section on a timer, defeating the on-scroll animation). Set before the 2185 // reduced-motion return so it's true whenever body_scripts executed at all. 2186 window.cwRevealMounted = true; 2187 if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; 2188 // tag content sections for reveal â skip notification, nav, hero, footer (by id/role, NOT ordinal) 2189 var SKIP = {'section-FYU2eG76':1,'section-dDb0AMpP':1,'section-M4aDtxB6egU':1,'section-C803vDZW':1}; 2190 function tag(){ 2191 document.querySelectorAll('[id^="section-"]').forEach(function(el){ 2192 if (!SKIP[el.id]) el.classList.add('cw-reveal'); 2193 }); 2194 } 2195 function reveal(){ 2196 var vh = window.innerHeight || document.documentElement.clientHeight; 2197 document.querySelectorAll('.cw-reveal').forEach(function(el){ 2198 if (el.classList.contains('cw-in')) return; 2199 // scroll-position check (NOT IntersectionObserver â survives fast-scroll / jump-links / restored scroll) 2200 if (el.getBoundingClientRect().top < vh * 0.88) el.classList.add('cw-in'); 2201 }); 2202 } 2203 function armReveal(){ 2204 window.addEventListener('scroll', reveal, {passive:true}); 2205 window.addEventListener('resize', reveal, {passive:true}); 2206 // Defer the first reveal one paint so the opacity:0 state renders before .cw-in is added â a 2207 // section at the fold then animates in instead of snapping visible. 2208 if (window.requestAnimationFrame) 2209 requestAnimationFrame(function(){ requestAnimationFrame(reveal); }); 2210 else reveal(); 2211 } 2212 // Tag sections hidden SYNCHRONOUSLY now, before first paint. This inline script sits at the end of 2213 // <body>, so every content section above it is already parsed â hiding them here means a near-fold 2214 // section can't flash visible-then-hidden (tagging at DOMContentLoaded can paint once first, then 2215 // hide â a blink). No-JS never runs this and reduced-motion returned above, so content is only ever 2216 // hidden with JS + motion on; .cw-in (added post-paint) animates it in. Re-tag at DCL is a 2217 // belt-and-suspenders no-op catch for any section parsed after this script. 2218 tag(); 2219 if (document.readyState === 'loading') 2220 document.addEventListener('DOMContentLoaded', function(){ tag(); armReveal(); }); 2221 else armReveal(); 2222})(); 2223</script>
vendor: 2 bytes, line 2223
2223
2224<script> 2225/* shared motion utility (#177) â the ONE IntersectionObserver helper every library element 2226 rides: cwOnView(selector, class[, once=true]). Reduced-motion contract: callers gate their 2227 ANIMATION in CSS via prefers-reduced-motion; the class-add itself always runs so the 2228 finished state is the no-motion state (content never hidden without JS or motion). */ 2229(function(){ 2230 window.cwOnView = window.cwOnView || function (sel, cls, once) { 2231 var els = document.querySelectorAll(sel); 2232 if (!els.length) return; 2233 if (!('IntersectionObserver' in window)) { 2234 els.forEach(function (el) { el.classList.add(cls); }); 2235 return; 2236 } 2237 var io = new IntersectionObserver(function (entries) { 2238 entries.forEach(function (e) { 2239 if (e.isIntersecting) { 2240 e.target.classList.add(cls); 2241 if (once !== false) io.unobserve(e.target); 2242 } 2243 }); 2244 }, {threshold: 0.15}); 2245 els.forEach(function (el) { io.observe(el); }); 2246 }; 2247})(); 2248</script>
vendor: 2 bytes, line 2248
2248
2249<script> 2250/* shared editor-preview re-mount utility (#536) â the ONE MutationObserver every DOM-injecting 2251 element rides: cwRemount(mountFn). The Maglev editor's live preview re-renders a section's DOM 2252 AFTER body scripts run, so any JS-injected children are wiped (the published static site never 2253 does this). cwRemount runs mountFn once now, then re-runs it whenever a burst of body mutations 2254 settles. Per-node idempotency stays the CALLER's job â its own mount function must no-op on a 2255 node it already mounted (e.g. a `host.dataset.cwXx` guard); a guard key shared across components 2256 would let two of them clobber each other's mounted-state tracking. One observer serves every 2257 caller, so the second DOM-injecting element costs nothing beyond its callback. */ 2258(function(){ 2259 if (window.cwRemount) return; 2260 var mounts = [], timer = null, watching = false; 2261 function remountAll() { 2262 timer = null; // cleared BEFORE the callbacks, so a throwing caller can't wedge the debounce 2263 mounts.forEac
2263h(function (fn) { 2264 // one caller must never starve its siblings: surface the error asynchronously (it still 2265 // reaches the console with its stack) and carry on down the list 2266 try { fn(); } catch (err) { setTimeout(function () { throw err; }, 0); } 2267 }); 2268 } 2269 window.cwRemount = function (mountFn) { 2270 mountFn(); // mount now â on the published static site this is the only pass needed 2271 mounts.push(mountFn); 2272 if (watching || !window.MutationObserver) return; 2273 watching = true; 2274 new MutationObserver(function () { 2275 if (timer) return; // debounce the burst â one re-mount pass per 120ms of churn 2276 timer = setTimeout(remountAll, 120); 2277 }).observe(document.body, {childList: true, subtree: true}); 2278 }; 2279})(); 2280</script>
2280 2281<!-- ===== corner mascot (peek) ===== -->
2282<script> 2283(function(){ 2284 function init(){ 2285 if (document.querySelector('.cw-peek')) return; 2286 var a = document.createElement('a'); 2287 a.className = 'cw-peek'; 2288 a.href = '/stores'; 2289 a.setAttribute('aria-label', 'Order Saigon Sisters online for pickup or delivery'); 2290 a.innerHTML = '<span class="cw-peek__tip">Order Online</span>'; 2291 document.body.appendChild(a); 2292 function onScroll(){ 2293 var vh = window.innerHeight || document.documentElement.clientHeight; 2294 if (window.scrollY > vh * 0.75) a.classList.add('cw-peek--in'); 2295 else a.classList.remove('cw-peek--in'); 2296 } 2297 window.addEventListener('scroll', onScroll, {passive:true}); 2298 onScroll(); 2299 } 2300 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); 2301 else init(); 2302})(); 2303</script>
2303 2304 2305 2306</body> 2307</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.