# Instructions

- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.

# Test info

- Name: public.spec.js >> Public website >> menu images with a stored source actually load (real dimensions)
- Location: tests\e2e\public.spec.js:39:3

# Error details

```
Error: expect(received).toBe(expected) // Object.is equality

Expected: 0
Received: 12
```

# Page snapshot

```yaml
- generic [active] [ref=e1]:
  - generic [ref=e3]:
    - banner [ref=e4]:
      - generic [ref=e5]:
        - link "Kathmandu Momo logo Kathmandu Momo" [ref=e6] [cursor=pointer]:
          - /url: /
          - img "Kathmandu Momo logo" [ref=e7]
          - generic [ref=e8]: Kathmandu Momo
        - navigation "Primary" [ref=e9]:
          - link "Home" [ref=e10] [cursor=pointer]:
            - /url: /
          - link "Menu" [ref=e11] [cursor=pointer]:
            - /url: /menu
          - link "About" [ref=e12] [cursor=pointer]:
            - /url: /about
          - link "Gallery" [ref=e13] [cursor=pointer]:
            - /url: /gallery
          - link "Contact" [ref=e14] [cursor=pointer]:
            - /url: /contact
        - generic [ref=e15]:
          - link "Call" [ref=e16] [cursor=pointer]:
            - /url: tel:+9779849216081
          - link "WhatsApp" [ref=e20] [cursor=pointer]:
            - /url: https://wa.me/9779849216081?text=Hello%20Kathmandu%20Momo!%20I'd%20like%20to%20place%20an%20order.
    - main [ref=e23]:
      - generic [ref=e24]:
        - heading "Our Menu" [level=1] [ref=e25]
        - paragraph [ref=e26]: 36 dishes across 7 categories — biryani, momo, sekuwa, coffee, snacks and fast food, served fresh at our counter in Surkhet.
      - generic [ref=e27]:
        - generic [ref=e29]:
          - searchbox "Search the menu" [ref=e31]
          - tablist "Menu categories" [ref=e32]:
            - tab "All" [selected] [ref=e33]
            - tab "Snacks" [ref=e34]
            - tab "Soups" [ref=e35]
            - tab "Mains" [ref=e36]
            - tab "Noodles & Rice" [ref=e37]
            - tab "Breads" [ref=e38]
            - tab "Beverages" [ref=e39]
            - tab "Desserts" [ref=e40]
        - generic [ref=e42]:
          - region [ref=e43]:
            - generic [ref=e44]:
              - heading "Snacks" [level=2] [ref=e45]
              - generic [ref=e46]: 8 items
            - generic [ref=e47]:
              - article [ref=e48]:
                - img "Chicken Momos (8pcs)" [ref=e50]
                - generic [ref=e51]:
                  - heading "Chicken Momos (8pcs)" [level=3] [ref=e52]
                  - paragraph [ref=e53]: Steamed chicken dumplings served with spicy sesame chutney
                  - generic [ref=e55]:
                    - generic [ref=e56]: Rs. 220
                    - button "Add Chicken Momos (8pcs)" [ref=e57]: Add
              - article [ref=e59]:
                - img "Chicken Tikka" [ref=e61]
                - generic [ref=e62]:
                  - heading "Chicken Tikka" [level=3] [ref=e63]
                  - paragraph [ref=e64]: Tender chicken pieces marinated in yoghurt and hot spices
                  - generic [ref=e66]:
                    - generic [ref=e67]: Rs. 320
                    - button "Add Chicken Tikka" [ref=e68]: Add
              - article [ref=e70]:
                - img "Chicken Wings" [ref=e72]
                - generic [ref=e73]:
                  - heading "Chicken Wings" [level=3] [ref=e74]
                  - paragraph [ref=e75]: Crispy fried chicken wings tossed in dry spices
                  - generic [ref=e77]:
                    - generic [ref=e78]: Rs. 250
                    - button "Add Chicken Wings" [ref=e79]: Add
              - article [ref=e81]:
                - img "French Fries" [ref=e83]
                - generic [ref=e84]:
                  - heading "French Fries" [level=3] [ref=e85]
                  - paragraph [ref=e86]: Classic golden potato fries served with ketchup
                  - generic [ref=e88]:
                    - generic [ref=e89]: Rs. 120
                    - button "Add French Fries" [ref=e90]: Add
              - article [ref=e92]:
                - img "Onion Rings" [ref=e94]
                - generic [ref=e95]:
                  - heading "Onion Rings" [level=3] [ref=e96]
                  - paragraph [ref=e97]: Deep fried battered onion rings, crisp and golden
                  - generic [ref=e99]:
                    - generic [ref=e100]: Rs. 140
                    - button "Add Onion Rings" [ref=e101]: Add
              - article [ref=e103]:
                - img "Paneer Tikka" [ref=e105]
                - generic [ref=e106]:
                  - heading "Paneer Tikka" [level=3] [ref=e107]
                  - paragraph [ref=e108]: Marinated cottage cheese cubes grilled to perfection
                  - generic [ref=e110]:
                    - generic [ref=e111]: Rs. 280
                    - button "Add Paneer Tikka" [ref=e112]: Add
              - article [ref=e114]:
                - img "Veg Momos (8pcs)" [ref=e116]
                - generic [ref=e117]:
                  - heading "Veg Momos (8pcs)" [level=3] [ref=e118]
                  - paragraph [ref=e119]: Nepali style steamed vegetable dumplings served with chutney
                  - generic [ref=e121]:
                    - generic [ref=e122]: Rs. 150
                    - button "Add Veg Momos (8pcs)" [ref=e123]: Add
              - article [ref=e125]:
                - img "Vegetable Samosa" [ref=e127]
                - generic [ref=e128]:
                  - heading "Vegetable Samosa" [level=3] [ref=e129]
                  - paragraph [ref=e130]: Crispy pastry filled with spiced potatoes and peas
                  - generic [ref=e132]:
                    - generic [ref=e133]: Rs. 120
                    - button "Add Vegetable Samosa" [ref=e134]: Add
          - region [ref=e136]:
            - generic [ref=e137]:
              - heading "Soups" [level=2] [ref=e138]
              - generic [ref=e139]: 3 items
            - generic [ref=e140]:
              - article [ref=e141]:
                - img "Hot & Sour Soup" [ref=e143]
                - generic [ref=e144]:
                  - heading "Hot & Sour Soup" [level=3] [ref=e145]
                  - paragraph [ref=e146]: Tangy and spicy thick vegetable soup
                  - generic [ref=e148]:
                    - generic [ref=e149]: Rs. 130
                    - button "Add Hot & Sour Soup" [ref=e150]: Add
              - article [ref=e152]:
                - img "Mushroom Soup" [ref=e154]
                - generic [ref=e155]:
                  - heading "Mushroom Soup" [level=3] [ref=e156]
                  - paragraph [ref=e157]: Freshly pureed button mushroom soup with cream
                  - generic [ref=e159]:
                    - generic [ref=e160]: Rs. 140
                    - button "Add Mushroom Soup" [ref=e161]: Add
              - article [ref=e163]:
                - img "Tomato Soup" [ref=e165]
                - generic [ref=e166]:
                  - heading "Tomato Soup" [level=3] [ref=e167]
                  - paragraph [ref=e168]: Creamy tomato soup flavored with garlic and herbs
                  - generic [ref=e170]:
                    - generic [ref=e171]: Rs. 110
                    - button "Add Tomato Soup" [ref=e172]: Add
          - region [ref=e174]:
            - generic [ref=e175]:
              - heading "Mains" [level=2] [ref=e176]
              - generic [ref=e177]: 6 items
            - generic [ref=e178]:
              - article [ref=e179]:
                - img "Butter Chicken" [ref=e181]
                - generic [ref=e182]:
                  - heading "Butter Chicken" [level=3] [ref=e183]
                  - paragraph [ref=e184]: Boneless tandoori chicken cooked in smooth tomato-butter gravy
                  - generic [ref=e186]:
                    - generic [ref=e187]: Rs. 450
                    - button "Add Butter Chicken" [ref=e188]: Add
              - article [ref=e190]:
                - img "Chicken Biryani" [ref=e192]
                - generic [ref=e193]:
                  - heading "Chicken Biryani" [level=3] [ref=e194]
                  - paragraph [ref=e195]: Fragrant basmati rice layered with spiced chicken and herbs
                  - generic [ref=e197]:
                    - generic [ref=e198]: Rs. 350
                    - button "Add Chicken Biryani" [ref=e199]: Add
              - article [ref=e201]:
                - img "Chicken Curry" [ref=e203]
                - generic [ref=e204]:
                  - heading "Chicken Curry" [level=3] [ref=e205]
                  - paragraph [ref=e206]: Traditional homestyle chicken curry cooked with ground spices
                  - generic [ref=e208]:
                    - generic [ref=e209]: Rs. 380
                    - button "Add Chicken Curry" [ref=e210]: Add
              - article [ref=e212]:
                - generic [ref=e213]: Dal Makhni
                - generic [ref=e219]:
                  - heading "Dal Makhni" [level=3] [ref=e220]
                  - paragraph [ref=e221]: Slow cooked black lentils and kidney beans with butter and cream
                  - generic [ref=e223]:
                    - generic [ref=e224]: Rs. 240
                    - button "Add Dal Makhni" [ref=e225]: Add
              - article [ref=e227]:
                - generic [ref=e228]: Paneer Butter Masala
                - generic [ref=e234]:
                  - heading "Paneer Butter Masala" [level=3] [ref=e235]
                  - paragraph [ref=e236]: Paneer cubes in a rich, creamy onion-tomato gravy
                  - generic [ref=e238]:
                    - generic [ref=e239]: Rs. 320
                    - button "Add Paneer Butter Masala" [ref=e240]: Add
              - article [ref=e242]:
                - generic [ref=e243]: Veg Thali
                - generic [ref=e249]:
                  - heading "Veg Thali" [level=3] [ref=e250]
                  - paragraph [ref=e251]: Traditional platter with rice, dal, veg curry, pickle, and papad
                  - generic [ref=e253]:
                    - generic [ref=e254]: Rs. 280
                    - button "Add Veg Thali" [ref=e255]: Add
          - region [ref=e257]:
            - generic [ref=e258]:
              - heading "Noodles & Rice" [level=2] [ref=e259]
              - generic [ref=e260]: 6 items
            - generic [ref=e261]:
              - article [ref=e262]:
                - generic [ref=e263]: Chicken Chowmein
                - generic [ref=e269]:
                  - heading "Chicken Chowmein" [level=3] [ref=e270]
                  - paragraph [ref=e271]: Wok-tossed noodles with shredded chicken and vegetables
                  - generic [ref=e273]:
                    - generic [ref=e274]: Rs. 210
                    - button "Add Chicken Chowmein" [ref=e275]: Add
              - article [ref=e277]:
                - generic [ref=e278]: Jeera Rice
                - generic [ref=e284]:
                  - heading "Jeera Rice" [level=3] [ref=e285]
                  - paragraph [ref=e286]: Fragrant rice tempered with cumin seeds and ghee
                  - generic [ref=e288]:
                    - generic [ref=e289]: Rs. 120
                    - button "Add Jeera Rice" [ref=e290]: Add
              - article [ref=e292]:
                - generic [ref=e293]: Steam Rice
                - generic [ref=e299]:
                  - heading "Steam Rice" [level=3] [ref=e300]
                  - paragraph [ref=e301]: Steamed premium basmati rice
                  - generic [ref=e303]:
                    - generic [ref=e304]: Rs. 100
                    - button "Add Steam Rice" [ref=e305]: Add
              - article [ref=e307]:
                - generic [ref=e308]: Thukpa
                - generic [ref=e314]:
                  - heading "Thukpa" [level=3] [ref=e315]
                  - paragraph [ref=e316]: Warm Sherpa style noodle soup with seasonal vegetables
                  - generic [ref=e318]:
                    - generic [ref=e319]: Rs. 180
                    - button "Add Thukpa" [ref=e320]: Add
              - article [ref=e322]:
                - generic [ref=e323]: Veg Chowmein
                - generic [ref=e329]:
                  - heading "Veg Chowmein" [level=3] [ref=e330]
                  - paragraph [ref=e331]: Stir-fried noodles with crisp vegetables and soy sauce
                  - generic [ref=e333]:
                    - generic [ref=e334]: Rs. 160
                    - button "Add Veg Chowmein" [ref=e335]: Add
              - article [ref=e337]:
                - generic [ref=e338]: Veg Fried Rice
                - generic [ref=e344]:
                  - heading "Veg Fried Rice" [level=3] [ref=e345]
                  - paragraph [ref=e346]: Wok-tossed rice with finely chopped vegetables and seasoning
                  - generic [ref=e348]:
                    - generic [ref=e349]: Rs. 180
                    - button "Add Veg Fried Rice" [ref=e350]: Add
          - region [ref=e352]:
            - generic [ref=e353]:
              - heading "Breads" [level=2] [ref=e354]
              - generic [ref=e355]: 3 items
            - generic [ref=e356]:
              - article [ref=e357]:
                - generic [ref=e358]: Butter Naan
                - generic [ref=e364]:
                  - heading "Butter Naan" [level=3] [ref=e365]
                  - paragraph [ref=e366]: Soft leavened clay oven bread topped with butter
                  - generic [ref=e368]:
                    - generic [ref=e369]: Rs. 60
                    - button "Add Butter Naan" [ref=e370]: Add
              - article [ref=e372]:
                - generic [ref=e373]: Garlic Naan
                - generic [ref=e379]:
                  - heading "Garlic Naan" [level=3] [ref=e380]
                  - paragraph [ref=e381]: Clay oven bread flavored with garlic and butter
                  - generic [ref=e383]:
                    - generic [ref=e384]: Rs. 80
                    - button "Add Garlic Naan" [ref=e385]: Add
              - article [ref=e387]:
                - generic [ref=e388]: Plain Roti
                - generic [ref=e394]:
                  - heading "Plain Roti" [level=3] [ref=e395]
                  - paragraph [ref=e396]: Traditional whole wheat flatbread baked in tandoor
                  - generic [ref=e398]:
                    - generic [ref=e399]: Rs. 30
                    - button "Add Plain Roti" [ref=e400]: Add
          - region [ref=e402]:
            - generic [ref=e403]:
              - heading "Beverages" [level=2] [ref=e404]
              - generic [ref=e405]: 6 items
            - generic [ref=e406]:
              - article [ref=e407]:
                - generic [ref=e408]: Coffee
                - generic [ref=e414]:
                  - heading "Coffee" [level=3] [ref=e415]
                  - paragraph [ref=e416]: Hot brewed milk coffee
                  - generic [ref=e418]:
                    - generic [ref=e419]: Rs. 80
                    - button "Add Coffee" [ref=e420]: Add
              - article [ref=e422]:
                - generic [ref=e423]: Coke
                - generic [ref=e429]:
                  - heading "Coke" [level=3] [ref=e430]
                  - paragraph [ref=e431]: Chilled bottle of Coca-Cola
                  - generic [ref=e433]:
                    - generic [ref=e434]: Rs. 60
                    - button "Add Coke" [ref=e435]: Add
              - article [ref=e437]:
                - generic [ref=e438]: Cold Coffee
                - generic [ref=e444]:
                  - heading "Cold Coffee" [level=3] [ref=e445]
                  - paragraph [ref=e446]: Chilled blended milk coffee served with ice cream
                  - generic [ref=e448]:
                    - generic [ref=e449]: Rs. 120
                    - button "Add Cold Coffee" [ref=e450]: Add
              - article [ref=e452]:
                - generic [ref=e453]: Fresh Lemonade
                - generic [ref=e459]:
                  - heading "Fresh Lemonade" [level=3] [ref=e460]
                  - paragraph [ref=e461]: Freshly squeezed lemon juice with sugar syrup and water
                  - generic [ref=e463]:
                    - generic [ref=e464]: Rs. 70
                    - button "Add Fresh Lemonade" [ref=e465]: Add
              - article [ref=e467]:
                - generic [ref=e468]: Masala Tea
                - generic [ref=e474]:
                  - heading "Masala Tea" [level=3] [ref=e475]
                  - paragraph [ref=e476]: Traditional spiced milk tea brewed with cardamom and ginger
                  - generic [ref=e478]:
                    - generic [ref=e479]: Rs. 50
                    - button "Add Masala Tea" [ref=e480]: Add
              - article [ref=e482]:
                - generic [ref=e483]: Sweet Lassi
                - generic [ref=e489]:
                  - heading "Sweet Lassi" [level=3] [ref=e490]
                  - paragraph [ref=e491]: Sweetened refreshing yoghurt drink
                  - generic [ref=e493]:
                    - generic [ref=e494]: Rs. 100
                    - button "Add Sweet Lassi" [ref=e495]: Add
          - region [ref=e497]:
            - generic [ref=e498]:
              - heading "Desserts" [level=2] [ref=e499]
              - generic [ref=e500]: 4 items
            - generic [ref=e501]:
              - article [ref=e502]:
                - generic [ref=e503]: Gulab Jamun
                - generic [ref=e509]:
                  - heading "Gulab Jamun" [level=3] [ref=e510]
                  - paragraph [ref=e511]: Soft fried dough balls soaked in sweet sugar syrup
                  - generic [ref=e513]:
                    - generic [ref=e514]: Rs. 90
                    - button "Add Gulab Jamun" [ref=e515]: Add
              - article [ref=e517]:
                - generic [ref=e518]: Ice Cream Scoop
                - generic [ref=e524]:
                  - heading "Ice Cream Scoop" [level=3] [ref=e525]
                  - paragraph [ref=e526]: Single scoop of vanilla, strawberry or chocolate ice cream
                  - generic [ref=e528]:
                    - generic [ref=e529]: Rs. 90
                    - button "Add Ice Cream Scoop" [ref=e530]: Add
              - article [ref=e532]:
                - generic [ref=e533]: Kheer
                - generic [ref=e539]:
                  - heading "Kheer" [level=3] [ref=e540]
                  - paragraph [ref=e541]: Traditional slow-cooked sweet rice pudding with cardamom and nuts
                  - generic [ref=e543]:
                    - generic [ref=e544]: Rs. 110
                    - button "Add Kheer" [ref=e545]: Add
              - article [ref=e547]:
                - generic [ref=e548]: Rasgulla
                - generic [ref=e554]:
                  - heading "Rasgulla" [level=3] [ref=e555]
                  - paragraph [ref=e556]: Spongy cottage cheese balls soaked in light sugar syrup
                  - generic [ref=e558]:
                    - generic [ref=e559]: Rs. 80
                    - button "Add Rasgulla" [ref=e560]: Add
    - contentinfo [ref=e562]:
      - generic [ref=e563]:
        - generic [ref=e564]:
          - generic [ref=e565]: Kathmandu Momo
          - paragraph [ref=e567]: Momo, Nepali kitchen & café in Birendranagar, Surkhet.
        - generic [ref=e568]:
          - heading "Explore" [level=3] [ref=e569]
          - link "Home" [ref=e570] [cursor=pointer]:
            - /url: /
          - link "Menu" [ref=e571] [cursor=pointer]:
            - /url: /menu
          - link "About" [ref=e572] [cursor=pointer]:
            - /url: /about
          - link "Gallery" [ref=e573] [cursor=pointer]:
            - /url: /gallery
          - link "Contact" [ref=e574] [cursor=pointer]:
            - /url: /contact
        - generic [ref=e575]:
          - heading "Contact" [level=3] [ref=e576]
          - link "+977 984-9216081" [ref=e577] [cursor=pointer]:
            - /url: tel:+9779849216081
          - link [ref=e580] [cursor=pointer]:
            - /url: "mailto:"
          - link "Birendranagar, Surkhet, Karnali Province, Nepal" [ref=e584] [cursor=pointer]:
            - /url: https://www.google.com/maps/search/?api=1&query=Kathmandu%20Momo%2C%20Birendranagar%2C%20Surkhet%2C%20Karnali%20Province%2C%20Nepal&center=28.5981066696641,81.61978015808363
        - generic [ref=e588]:
          - heading "Follow" [level=3] [ref=e589]
          - link "Facebook" [ref=e590] [cursor=pointer]:
            - /url: ""
          - link "TikTok" [ref=e591] [cursor=pointer]:
            - /url: ""
          - link "WhatsApp" [ref=e592] [cursor=pointer]:
            - /url: https://wa.me/9779849216081?text=Hello%20Kathmandu%20Momo!%20I'd%20like%20to%20place%20an%20order.
      - generic [ref=e593]: © 2026 Kathmandu Momo. All rights reserved.
  - button "Open Next.js Dev Tools" [ref=e600] [cursor=pointer]
  - alert [ref=e604]
```

# Test source

```ts
  1   | import { test, expect } from '@playwright/test';
  2   | 
  3   | test.describe('Public website', () => {
  4   |   test('home renders identity, CTAs and contact', async ({ page }) => {
  5   |     const errors = [];
  6   |     page.on('console', (m) => m.type() === 'error' && errors.push(m.text()));
  7   | 
  8   |     await page.goto('/');
  9   |     await expect(page).toHaveTitle(/Kathmandu Momo/i);
  10  |     await expect(page.getByText('Kathmandu Momo').first()).toBeVisible();
  11  | 
  12  |     await expect(page.getByRole('link', { name: /menu/i }).first()).toBeVisible();
  13  | 
  14  |     const wa = page.getByRole('link', { name: /WhatsApp/i }).first();
  15  |     await expect(wa).toHaveAttribute('href', /wa\.me\/9779849216081/);
  16  | 
  17  |     const call = page.locator('a[href^="tel:+9779849216081"]:visible').first();
  18  |     await expect(call).toBeVisible();
  19  | 
  20  |     expect(errors.filter((e) => !/Failed to load resource|404/.test(e)), `console errors: ${errors.join('\n')}`).toEqual([]);
  21  |   });
  22  | 
  23  |   test('menu page shows imported items with prices, search and categories', async ({ page }) => {
  24  |     await page.goto('/menu');
  25  |     await expect(page).toHaveTitle(/Menu \| Kathmandu Momo/i);
  26  |     await expect(page.getByText('Americano').first()).toBeVisible();
  27  |     await expect(page.getByText(/Rs\.?\s?120/).first()).toBeVisible();
  28  |     await expect(page.locator('input[type="search"]')).toBeVisible();
  29  |     await expect(page.locator('[role="tab"]').first()).toBeVisible();
  30  |   });
  31  | 
  32  |   test('menu search filters items', async ({ page }) => {
  33  |     await page.goto('/menu');
  34  |     await page.fill('input[type="search"]', 'sekuwa');
  35  |     await expect(page.getByRole('heading', { name: /Chicken Sekuwa/i })).toBeVisible();
  36  |     await expect(page.getByText('Americano')).toHaveCount(0);
  37  |   });
  38  | 
  39  |   test('menu images with a stored source actually load (real dimensions)', async ({ page }) => {
  40  |     await page.goto('/menu');
  41  |     // Trigger native lazy-loading across the whole page.
  42  |     await page.evaluate(async () => {
  43  |       for (let y = 0; y < document.body.scrollHeight; y += 500) {
  44  |         window.scrollTo(0, y);
  45  |         await new Promise((r) => setTimeout(r, 60));
  46  |       }
  47  |       window.scrollTo(0, 0);
  48  |     });
  49  |     await page.waitForTimeout(2000);
  50  |     const stats = await page.evaluate(() => {
  51  |       const imgs = [...document.querySelectorAll('main img')];
  52  |       return {
  53  |         total: imgs.length,
  54  |         loaded: imgs.filter((i) => i.complete && i.naturalWidth > 0).length,
  55  |         broken: imgs.filter((i) => i.complete && i.naturalWidth === 0).length,
  56  |       };
  57  |     });
  58  |     expect(stats.total).toBeGreaterThan(0);
  59  |     expect(stats.loaded).toBeGreaterThan(0);
> 60  |     expect(stats.broken).toBe(0);
      |                          ^ Error: expect(received).toBe(expected) // Object.is equality
  61  |   });
  62  | 
  63  |   test('menu images are unique (no photo used twice)', async ({ page }) => {
  64  |     await page.goto('/menu');
  65  |     await page.evaluate(async () => {
  66  |       for (let y = 0; y < document.body.scrollHeight; y += 500) { window.scrollTo(0, y); await new Promise((r) => setTimeout(r, 50)); }
  67  |     });
  68  |     await page.waitForTimeout(1500);
  69  |     const srcs = await page.evaluate(() => [...document.querySelectorAll('main article img')].map((i) => i.getAttribute('src')));
  70  |     const dupes = srcs.filter((s, i) => srcs.indexOf(s) !== i);
  71  |     expect(dupes, `duplicate images: ${[...new Set(dupes)].join(', ')}`).toEqual([]);
  72  |   });
  73  | 
  74  |   test('ordering: add to cart offers WhatsApp + a place-order form', async ({ page }) => {
  75  |     await page.goto('/menu');
  76  |     await page.getByRole('button', { name: /^Add / }).first().click();
  77  |     await page.getByRole('button', { name: /View cart/i }).click();
  78  |     // WhatsApp is generated only after the canonical order has been saved.
  79  |     await expect(page.getByRole('button', { name: /Send via WhatsApp/i })).toBeVisible();
  80  |     // Form fields present
  81  |     await expect(page.getByPlaceholder('Your name *')).toBeVisible();
  82  |     await expect(page.getByPlaceholder('Phone number *')).toBeVisible();
  83  |     await expect(page.getByRole('button', { name: /Place Order/i })).toBeVisible();
  84  |   });
  85  | 
  86  |   test('ordering: placing an order succeeds', async ({ page }) => {
  87  |     await page.goto('/menu');
  88  |     await page.getByRole('button', { name: /^Add / }).first().click();
  89  |     await page.getByRole('button', { name: /View cart/i }).click();
  90  |     await page.getByPlaceholder('Your name *').fill('Playwright Tester');
  91  |     await page.getByPlaceholder('Phone number *').fill('9800000001');
  92  |     await page.getByRole('button', { name: /Place Order/i }).click();
  93  |     await expect(page.getByText(/Order received/i)).toBeVisible({ timeout: 15_000 });
  94  |   });
  95  | 
  96  |   test('no legacy Dim Sum / Sundar branding on active public pages', async ({ page }) => {
  97  |     for (const path of ['/', '/menu', '/about', '/gallery', '/contact']) {
  98  |       await page.goto(path);
  99  |       const body = await page.evaluate(() => document.body.innerText);
  100 |       expect(body, `legacy branding on ${path}`).not.toMatch(/dim\s*sum\s*puri|sundar|bagaicha/i);
  101 |     }
  102 |   });
  103 | 
  104 |   test('no horizontal overflow on mobile home', async ({ page }) => {
  105 |     await page.setViewportSize({ width: 375, height: 812 });
  106 |     await page.goto('/');
  107 |     const overflow = await page.evaluate(
  108 |       () => document.documentElement.scrollWidth > document.documentElement.clientWidth + 1
  109 |     );
  110 |     expect(overflow).toBe(false);
  111 |   });
  112 | 
  113 |   test('staff routes require login when signed out (full-service mode)', async ({ page }) => {
  114 |     for (const route of ['/waiter', '/kitchen', '/cashier']) {
  115 |       await page.goto(route);
  116 |       await expect(page).toHaveURL(/\/login/);
  117 |     }
  118 |   });
  119 | 
  120 |   test('about, gallery and contact pages load', async ({ page }) => {
  121 |     for (const [path, re] of [
  122 |       ['/about', /About \| Kathmandu Momo/i],
  123 |       ['/gallery', /Gallery \| Kathmandu Momo/i],
  124 |       ['/contact', /Contact & location|Contact &amp; location/i],
  125 |     ]) {
  126 |       await page.goto(path);
  127 |       await expect(page.locator('h1').first()).toBeVisible();
  128 |     }
  129 |   });
  130 | });
  131 | 
```