PageSourceSearch

https://dharmikvibes.com/home

html dharmikvibes.com collected 2026-09-24 19:19:20 UTC 26,896 bytes, 595 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3
4<head>
5  <meta name="google-site-verification" content="GaNFJ6b4R7hcCLPSa0CWcbfEdKvayUwodyGNV3osEtY">
6  <!--
7    If you are serving your web app in a path other than the root, change the
8    href value below to reflect the base path you are serving from.
9
10    The path provided below has to start and end with a slash "/" in order for
11    it to work correctly.
12
13    For more details:
14    * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
15
16    This is a placeholder for base href that will be replaced by the value of
17    the `--base-href` argument provided to `flutter build`.
18  -->
19  <base href="/">
20
21  <meta charset="UTF-8">
22  <meta name="viewport" content="width=device-width, initial-scale=1.0">
23  <title>DharmikVibes | NRI, Spiritual Yatra, VIP Darshan & Puja, Flights, Retreat, Events</title>
24  <meta name="description"
25    content="Sacred spiritual yatra & pilgrimage packages with VIP darshan, puja, flights included. Spiritual retreats, events, and vibrant devotee communities for NRI & all seekers.">
26  <meta name="keywords"
27    content="spiritual yatra, NRI pilgrimage, VIP darshan, sacred puja, flight packages, spiritual retreat, devotee events">
28  <meta name="robots" content="index, follow, max-image-preview:large">
29  <link rel="canonical" href="https://dharmikvibes.com/">
30  <link rel="manifest" href="manifest.json">
31
32  <!-- Open Graph (social sharing + AI/link previews) -->
33  <meta property="og:title"
34    content="DharmikVibes | NRI, Spiritual Yatra, VIP Darshan & Puja, Flights, Retreat, Events">
35  <meta property="og:description"
36    content="Complete spiritual journey. VIP darshan, sacred puja, pilgrimage flights, retreats & events for NRI and devotees worldwide.">
37  <meta property="og:type" content="website">
38  <meta property="og:url" content="https://dharmikvibes.com/">
39  <meta property="og:site_name" content="DharmikVibes">
40  <meta property="og:locale" content="en_IN">
41  <meta property="og:image" content="https://dharmikvibes.com/og-dharmikvibes.png">
42  <meta property="og:image:width" content="1200">
43  <meta property="og:image:height" content="630">
44  <meta property="og:image:type" content="image/png">
45  <meta property="og:image:alt" content="DharmikVibes — Sacred Journeys, Divine Blessings">
46
47  <!-- Twitter card -->
48  <meta name="twitter:card" content="summary_large_image">
49  <meta name="twitter:site" content="@DharmikVibes12">
50  <meta name="twitter:title"
51    content="DharmikVibes | NRI, Spiritual Yatra, VIP Darshan & Puja, Flights, Retreat, Events">
52  <meta name="twitter:description"
53    content="Complete spiritual journey. VIP darshan, sacred puja, pilgrimage flights, retreats & events for NRI and devotees worldwide.">
54  <meta name="twitter:image" content="https://dharmikvibes.com/og-dharmikvibes.png">
55
56  <!-- Structured data for Google + AI understanding -->
57  
57<script type="application/ld+json">
58  {
59    "@context": "https://schema.org",
60    "@type": "Organization",
61    "name": "DharmikVibes",
62    "url": "https://dharmikvibes.com/",
63    "logo": "https://dharmikvibes.com/og-dharmikvibes.png",
64    "description": "Spiritual yatra & pilgrimage packages with VIP darshan, puja, flights, retreats and events for NRI and devotees worldwide.",
65    "sameAs": [
66      "https://www.facebook.com/dharmikvibes12",
67      "https://www.instagram.com/dharmikvibes12/",
68      "https://www.youtube.com/@DharmikVibes12"
69    ],
70    "contactPoint": {
71      "@type": "ContactPoint",
72      "telephone": "+91-9220352244",
73      "contactType": "customer service",
74      "email": "[email protected]",
75      "areaServed": "IN",
76      "availableLanguage": ["en", "hi"]
77    }
78  }
79  </script>
79
80
81  <!-- iOS meta tags & icons -->
82  <meta name="apple-mobile-web-app-capable" content="yes">
83  <meta name="apple-mobile-web-app-status-bar-style" content="black">
84  <meta name="apple-mobile-web-app-title" content="DharmikVibes">
85  <link rel="apple-touch-icon" href="/icons/Icon-512.png">
86
87  <!-- Favicon -->
88  <link rel="icon" href="/favicon.ico" sizes="any" />
89  <link rel="icon" type="image/png" sizes="48x48" href="/favicondharmikvibes.png" />
90  <link rel="icon" type="image/png" sizes="192x192" href="/icons/Icon-192.png" />
91
92  <!-- Google Maps (async — used by in-app map widgets) -->
93  
93<script async defer
94    src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAzjwO_KjdeLFVnRLIRl6XGkNkbqtZyrkQ"></script>
94
95</head>
96
97<body>
98  <noscript>
99    <div style="max-width:720px;margin:2rem auto;padding:0 1.5rem;font-family:system-ui,sans-serif;line-height:1.6;color:#1a1a1a;">
100      <h1>DharmikVibes</h1>
101      <p>Sacred spiritual yatra and pilgrimage packages with VIP darshan, puja, flights, retreats, and events for NRI and devotees worldwide.</p>
102      <p><strong>Explore:</strong></p>
103      <ul>
104        <li><a href="/home">Home</a></li>
105        <li><a href="/yatras">Yatras</a></li>
106        <li><a href="/pujas">Pujas</a></li>
107        <li><a href="/chadhava">Chadhava</a></li>
108        <li><a href="/flight">Flights</a></li>
109        <li><a href="/event">Events</a></li>
110        <li><a href="/contact-us">Contact Us</a></li>
111        <li><a href="/terms-conditions">Terms &amp; Conditions</a></li>
112        <li><a href="/terms-and-conditions">Terms &amp; Conditions (legacy link)</a></li>
113        <li><a href="/privacy-policy">Privacy Policy</a></li>
114        <li><a href="/partnership">Partnership</a></li>
115      </ul>
116      <p>Contact: <a href="mailto:[email protected]">[email protected]</a> · +91 9220352244</p>
117    </div>
118  </noscript>
119  <!--
120    F1 deploy cache-bust: @BUILD_ID@ is replaced after `flutter build web`
121    by `dart run tool/stamp_web_build.dart`. Use ?build= (not ?v=) — Flutter's
122    service worker strips ?v= and would keep serving a stale bootstrap.
123  -->
124  
124<script>
125    (function () {
126      // F3: inject bootstrap once — a second tag would re-init the engine / CanvasKit.
127      if (globalThis.__dvBootstrapScriptInjected) return;
128      globalThis.__dvBootstrapScriptInjected = true;
129
130      var buildId = '@BUILD_ID@';
131      // Unstamped template (flutter run / forgot post-build) starts with '@'
132      if (buildId.charAt(0) === '@') {
133        buildId = String(Date.now());
134      }
135      var s = document.createElement('script');
136      s.src = 'flutter_bootstrap.js?build=' + encodeURIComponent(buildId);
137      s.async = true;
138      document.body.appendChild(s);
139    })();
140  </script>
140
141  <!-- F6: defer — checkout is only used on user action, so it must not block first paint -->
142  
142<script src="https://checkout.razorpay.com/v1/checkout.js" defer></script>
142
143  
143<script>
144    // F1: when a newer service worker is ready, offer reload (guard against loops)
145    (function () {
146      if (!('serviceWorker' in navigator)) return;
147
148      var reloaded = false;
149      // true only if a worker already controlled this page — skip reload on first install
150      var hadControllerOnLoad = Boolean(navigator.serviceWorker.controller);
151      function reloadOnce() {
152        if (reloaded) return;
153        reloaded = true;
154        window.location.reload();
155      }
156
157      function showUpdateBanner(onReload) {
158        if (document.getElementById('dv-sw-update-banner')) return;
159        var bar = document.createElement('div');
160        bar.id = 'dv-sw-update-banner';
161        bar.setAttribute('role', 'status');
162        bar.style.cssText = [
163          'position:fixed', 'z-index:2147483647', 'left:0', 'right:0', 'bottom:0',
164          'display:flex', 'align-items:center', 'justify-content:center', 'gap:12px',
165          'flex-wrap:wrap', 'padding:12px 16px',
166          'background:#1B1208', 'color:#F7F0E6',
167          'font:500 14px/1.4 Georgia,"Times New Roman",serif',
168          'box-shadow:0 -4px 24px rgba(0,0,0,.25)'
169        ].join(';');
170        var msg = document.createElement('span');
171        msg.textContent = 'A newer version of DharmikVibes is ready.';
172        var btn = document.createElement('button');
173        btn.type = 'button';
174        btn.textContent = 'Refresh';
175        btn.style.cssText = [
176          'cursor:pointer', 'border:0', 'border-radius:4px',
177          'padding:8px 14px', 'background:#C45C26', 'color:#fff',
178          'font:600 13px/1.2 system-ui,sans-serif'
179        ].join(';');
180        btn.addEventListener('click', onReload);
181        bar.appendChild(msg);
182        bar.appendChild(btn);
183        document.body.appendChild(bar);
184      }
185
186      navigator.serviceWorker.ready.then(function (reg) {
187        reg.addEventListener('updatefound', function () {
188          var fresh = reg.installing;
189          if (!fresh) return;
190          fresh.addEventListener('statechange', function () {
191            if (fresh.state === 'installed' && navigator.serviceWorker.controller) {
192              showUpdateBanner(reloadOnce);
193            }
194          });
195        });
196        // Proactively check for updates on load and when tab becomes visible
197        try { reg.update(); } catch (e) { }
198      });
199
200      document.addEventListener('visibilitychange', function () {
201        if (document.visibilityState !== 'visible') return;
202        navigator.serviceWorker.getRegistration().then(function (reg) {
203          if (reg) try { reg.update(); } catch (e) { }
204        });
205      });
206
207      navigator.serviceWorker.addEventListener('controllerchange', function () {
208        if (!hadControllerOnLoad) return;
209        reloadOnce();
210      });
211    })();
212  </script>
212
213  
213<script>
214    // SEO: per-route canonical + homepage title guard (history hooks, no polling)
215    (function () {
216      var origin = 'https://dharmikvibes.com';
217      var homeTitle = 'DharmikVibes | NRI, Spiritual Yatra, VIP Darshan & Puja, Flights, Retreat, Events';
218
219      function normalizePath(pathname) {
220        var p = (pathname || '/').replace(/\/+$/, '');
221        return p === '' ? '/' : p;
222      }
223
224      function isHomePath(path) {
225        return path === '/' || path === '/home';
226      }
227
228      function updateCanonical() {
229        var path = normalizePath(window.location.pathname);
230        var href = path === '/' ? origin + '/' : origin + path;
231        var link = document.querySelector('link[rel="canonical"]');
232        if (!link) {
233          link = document.createElement('link');
234          link.rel = 'canonical';
235          document.head.appendChild(link);
236        }
237        link.href = href;
238        var ogUrl = document.querySelector('meta[property="og:url"]');
239        if (ogUrl) ogUrl.setAttribute('content', href);
240      }
241
242      function forceHomeTitle() {
243        if (isHomePath(normalizePath(window.location.pathname)) && document.title !== homeTitle) {
244          document.title = homeTitle;
245        }
246      }
247
248      function onRouteChange() {
249        updateCanonical();
250        forceHomeTitle();
251      }
252
253      updateCanonical();
254      forceHomeTitle();
255
256      window.addEventListener('popstate', onRouteChange);
257
258      var _pushState = history.pushState;
259      var _replaceState = history.replaceState;
260      history.pushState = function () {
261        var ret = _pushState.apply(this, arguments);
262        onRouteChange();
263        return ret;
264      };
265      history.replaceState = function () {
266        var ret = _replaceState.apply(this, arguments);
267        onRouteChange();
268        return ret;
269      };
270
271      try {
272        var t = document.querySelector('title');
273        if (t) new MutationObserver(forceHomeTitle).observe(t, { childList: true, characterData: true, subtree: true });
274      } catch (e) { }
275    })();
276  </script>
276
277
278  <!-- LinkedIn Insight Tag (partner 9648404) -->
279  
279<script type="text/javascript">
280  _linkedin_partner_id = "9648404";
281  window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
282  window._linkedin_data_partner_ids.push(_linkedin_partner_id);
283  </script>
283
284  
284<script type="text/javascript">
285  (function(l) {
286  if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
287  window.lintrk.q=[]}
288  var s = document.getElementsByTagName("script")[0];
289  var b = document.createElement("script");
290  b.type = "text/javascript";b.async = true;
291  b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
292  s.parentNode.insertBefore(b, s);})(window.lintrk);
293  </script>
293
294  <noscript>
295  <img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=9648404&fmt=gif" />
296  </noscript>
297<!-- WATI-WIDGET-START -->
298  
298<script>
299    var watiUrl = 'https://wati-integration-prod-service.clare.ai/v2/watiWidget.js?27241';
300    var watiScript = document.createElement('script');
301    watiScript.type = 'text/javascript';
302    watiScript.async = true;
303    watiScript.src = watiUrl;
304    var watiOptions = {
305      "enabled": true,
306      "chatButtonSetting": {
307        "backgroundColor": "#e68600",
308        "ctaText": "",
309        "borderRadius": "25",
310        "marginLeft": "0",
311        "marginRight": "20",
312        "marginBottom": "20",
313        "ctaIconWATI": false,
314        "position": "right"
315      },
316      "brandSetting": {
317        "brandName": "DharmikVibes",
318        "brandSubTitle": "",
319        "brandImg": "https://dharmikvibes.com/wati-brand.jpg",
320        "welcomeText": "Hello Devotee!\nHow can we help you?",
321        "messageText": "Hello, %0AI am looking for help {{page_link}}",
322        "backgroundColor": "#e68600",
323        "ctaText": "Connect With Us",
324        "borderRadius": "25",
325        "autoShow": false,
326        "phoneNumber": "919220352244"
327      }
328    };
329    watiScript.onload = function () {
330      CreateWhatsappChatWidget(watiOptions);
331    };
332    var watiFirst = document.getElementsByTagName('script')[0];
333    watiFirst.parentNode.insertBefore(watiScript, watiFirst);
334  </script>
334
335<!-- WATI-WIDGET-END -->
336
337<!-- GA4-START -->
vendor: 66 bytes, lines 337-338
337
338  <script async src="https://www.googletagmanager.com/gtag/js?id=
338G-RXP2EVYJYB
vendor: 14 bytes, lines 338-339
338"></script>
339  
339<script>
340    window.dataLayer = window.dataLayer || [];
341    function gtag() { dataLayer.push(arguments); }
342    gtag('js', new Date());
343    // send_page_view stays FALSE, but not for the reason originally recorded.
344    //
345    // The old note claimed "the Flutter app's built-in Firebase Analytics SDK
346    // already reports to this same stream". That was verified false on
347    // 2026-07-28: window.firebase is undefined on the web build and no
348    // app-measurement script loads — only fbevents.js and gtag/js. GA4 was
349    // therefore recording ZERO page_views for this site, which is precisely why
350    // every GA4-imported conversion in Google Ads 458-245-2992 read "No recent
351    // conversions".
352    //
353    // It remains false here because dv-tracking.html now sends page_view
354    // explicitly, on load AND on every SPA route change, with the correct
355    // per-route title and location. Letting gtag also auto-send would duplicate
356    // the initial hit and would still miss every in-app navigation.
357    gtag('config', 'G-RXP2EVYJYB', { send_page_view: false });
358    // WhatsApp (WATI widget) click tracking
359    document.addEventListener('click', function (e) {
360      var t = e.target;
361      if (!t || !t.closest) return;
362      var el = t.closest('[class*="wa-widget"], [class*="wa-chat"], [id*="wati"], [id*="whatsapp-chat"]');
363      if (el) {
364        gtag('event', 'whatsapp_click', {
365          event_category: 'engagement',
366          page_path: window.location.pathname
367        });
368      }
369    }, true);
370  </script>
370
371<!-- GA4-END -->
372
373<!-- META-PIXEL-START
374     2026-07-28 — Meta Pixel for dharmikvibes.com.
375
376     Until now this site carried GA4 and nothing else: no Meta pixel and no
377     Google Ads conversion tag, so every rupee spent driving traffic here was
378     unattributable and unoptimisable on both platforms.
379
380     Pixel 3604943802982913 ("DharmikVibes") is the PageView-only pixel on
381     business 1044471472623812. Pixel 1159103103060127 is deliberately NOT used
382     here — that one carries the Shopify funnel (ViewContent/AddToCart/
383     InitiateCheckout) for dharmikvibes.store, and mixing the two would corrupt
384     both attribution models.
385
386     Scope: base pixel + a single PageView on load. This is a Flutter SPA, so
387     in-app route changes do NOT fire further PageViews — deeper events
388     (ViewContent / InitiateCheckout / Purchase off the Razorpay success
389     handler) need Dart-side JS interop and a rebuild, tracked separately.
390
391     Injected by /opt/dv-brand-icons/restore.sh (dv-favicon-guard, every 10 min)
392     because a dev deploy does `rm -rf /var/www/flutter_web_2/*` and would
393     otherwise wipe this. Marker-guarded: never double-injects. -->
394<script>
vendor: 483 bytes, lines 394-403
394
395  !function (f, b, e, v, n, t, s) {
396    if (f.fbq) return; n = f.fbq = function () {
397      n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments)
398    };
399    if (!f._fbq) f._fbq = n; n.push = n; n.loaded = !0; n.version = '2.0';
400    n.queue = []; t = b.createElement(e); t.async = !0; t.src = v;
401    s = b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t, s)
402  }(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
403  fbq('init', '
4033604943802982913
vendor: 32 bytes, lines 403-404
403');
404  fbq('track', 'PageView');
405</script>
405
406<noscript><img height="1" width="1" style="display:none" alt=""
407  src="https://www.facebook.com/tr?id=3604943802982913&ev=PageView&noscript=1" /></noscript>
408<!-- META-PIXEL-END -->
409
410<!-- DV-TRACKING-START
411     Generated by /opt/dv-brand-icons/build_tracking.py from ssr/manifest.json —
412     do not hand-edit; regenerate instead.
413
414     Injected AFTER the GA4 and Meta Pixel snippets so gtag/fbq already exist.
415     Fixes three measured problems (2026-07-28):
416       * GA4 had send_page_view:false citing a Firebase SDK that is NOT on the
417         web build (window.firebase undefined) — so GA4 recorded no page_views
418         at all, and every GA4-imported Google Ads conversion read "No recent
419         conversions".
420       * Meta Pixel fired one PageView per visit; SPA route changes fired none.
421       * Flutter overwrites document.title with "DharmikVibes Web" after boot,
422         so post-boot events carried the wrong title.
423     No Purchase/AddToCart here — those need Razorpay hooks and real prices from
424     Dart, and inventing them would corrupt attribution. -->
425<script>
426  (function () {
427    var ROUTES = {"/about-us":{"t":"About DharmikVibes","c":"about-us","x":1},"/cancellation-refund-policy":{"t":"Cancellation & Refund Policy | DharmikVibes","c":"cancellation-refund-policy","x":1},"/careers":{"t":"Careers at DharmikVibes","c":"careers","x":1},"/chadhavaPage":{"t":"Chadhava & Temple Offerings Online | DharmikVibes","c":"chadhava","x":0},"/contact-us":{"t":"Contact DharmikVibes","c":"contact-us","x":1},"/cookie-policy":{"t":"Cookie Policy | DharmikVibes","c":"cookie-policy","x":1},"/dharmik-special/genz":{"t":"Spiritual Journeys for Young Seekers | DharmikVibes","c":"segment","x":0},"/dharmik-special/nri":{"t":"Pilgrimage for NRI Devotees | DharmikVibes","c":"segment","x":0},"/dharmik-special/senior":{"t":"Pilgrimage for Senior Devotees | DharmikVibes","c":"segment","x":0},"/dharmik-special/women":{"t":"Pilgrimage for Women Devotees | DharmikVibes","c":"segment","x":0},"/divine-elite":{"t":"Divine Elite — Premium Spiritual Concierge | DharmikVibes","c":"concierge","x":0},"/event":{"t":"Spiritual Events & Gatherings | DharmikVibes","c":"event","x":0},"/flight":{"t":"Pilgrimage Flights & Air Travel | DharmikVibes","c":"flight","x":0},"/healing":{"t":"Traditional Healing & Wellbeing | DharmikVibes","c":"wellness","x":0},"/investors":{"t":"Investors | DharmikVibes","c":"investors","x":1},"/live-darshan":{"t":"Live Darshan from Sacred Temples | DharmikVibes","c":"darshan","x":0},"/media":{"t":"Media & Press | DharmikVibes","c":"media","x":1},"/meditation":{"t":"Guided Meditation Programs | DharmikVibes","c":"wellness","x":0},"/meet-greet":{"t":"Meet & Greet Services for Devotees | DharmikVibes","c":"concierge","x":0},"/our-teams":{"t":"Our Team | DharmikVibes","c":"our-teams","x":1},"/partnership":{"t":"Partner with DharmikVibes","c":"partnership","x":0},"/payment-security":{"t":"Payment Security | DharmikVibes","c":"payment-security","x":1},"/privacy-policy":{"t":"Privacy Policy | DharmikVibes","c":"privacy-policy","x":1},"/pujas":{"t":"Online Puja Booking & Sacred Rituals | DharmikVibes","c":"puja","x":0},"/retreats":{"t":"Spiritual Retreats & Sadhana Programs | DharmikVibes","c":"retreat","x":0},"/staysHomePage":{"t":"Pilgrimage Stays & Accommodation | DharmikVibes","c":"stay","x":0},"/support-centre":{"t":"Support Centre | DharmikVibes","c":"support-centre","x":1},"/terms-conditions":{"t":"Terms & Conditions | DharmikVibes","c":"terms-conditions","x":1},"/yatras":{"t":"Spiritual Yatras & Pilgrimage Journeys | DharmikVibes","c":"yatra","x":0},"/yatras/temple-discovery":{"t":"Temple Discovery — Explore Sacred Sites | DharmikVibes","c":"yatra","x":0},"/yoga":{"t":"Yoga Programs & Practice | DharmikVibes","c":"wellness","x":0},"/":{"t":"DharmikVibes","c":"home","x":1},"/home":{"t":"DharmikVibes","c":"home","x":1}};
428    var ORIGIN = 'https://dharmikvibes.com';
429
430    function norm(p) {
431      p = (p || '/').replace(/\/+$/, '');
432      return p === '' ? '/' : p;
433    }
434    function metaFor(path) {
435      return ROUTES[path] || { t: document.title || 'DharmikVibes', c: 'other', x: 1 };
436    }
437
438    // Flutter replaces document.title with "DharmikVibes Web" once it boots.
439    // Restore the real per-route title: it is what the devotee sees in the tab,
440    // and what GA4 reports as page_title on every later event. Extends the
441    // homepage-only guard that already ships in index.html.
442    function fixTitle(m) {
443      if (m && m.t && document.title !== m.t) {
444        try { document.title = m.t; } catch (e) { }
445      }
446    }
447
448    function track(path, initial) {
449      var m = metaFor(path);
450      fixTitle(m);
451      var url = ORIGIN + (path === '/' ? '/' : path);
452
453      if (typeof gtag === 'function') {
454        gtag('event', 'page_view', {
455          page_location: url,
456          page_path: path,
457          page_title: m.t
458        });
459        if (!m.x) {
460          // Custom rather than GA4's `view_item`: that expects an items[] array
461          // with a price, which this site cannot supply yet (no catalog API).
462          gtag('event', 'service_view', {
463            service_category: m.c,
464            service_name: m.t,
465            page_path: path
466          });
467        }
468      }
469
470      if (typeof fbq === 'function') {
471        // The base pixel already fired one PageView on load — don't duplicate it.
472        if (!initial) fbq('track', 'PageView');
473        if (!m.x) {
474          fbq('track', 'ViewContent', {
475            content_name: m.t,
476            content_category: m.c,
477            content_type: 'product'
478          });
479        }
480      }
481    }
482
483    var last = norm(location.pathname);
484    track(last, true);
485
486    // Flutter routes without firing popstate reliably, so poll — the same
487    // approach the canonical guard in index.html already uses. 400ms matches it.
488    setInterval(function () {
489      var p = norm(location.pathname);
490      if (p !== last) { last = p; track(p, false); }
491      else { fixTitle(metaFor(p)); }
492    }, 400);
493
494    // Lead signals. These are the real conversion actions on this site — there
495    // is no checkout to measure yet — so they are what Google Ads should
496    // optimise toward once campaigns resume. Mark generate_lead as a conversion
497    // in GA4 for it to reach Ads through the existing import.
498    document.addEventListener('click', function (e) {
499      var t = e.target;
500      if (!t || !t.closest) return;
501
502      var wa = t.closest('[class*="wa-widget"], [class*="wa-chat"], [id*="wati"], [id*="whatsapp-chat"]');
503      var tel = t.closest('a[href^="tel:"]');
504      var mail = t.closest('a[href^="mailto:"]');
505      if (!wa && !tel && !mail) return;
506
507      var method = wa ? 'whatsapp' : (tel ? 'phone' : 'email');
508      var path = norm(location.pathname);
509      if (typeof gtag === 'function') {
510        gtag('event', 'generate_lead', {
511          lead_method: method,
512          service_category: metaFor(path).c,
513          page_path: path
514        });
515      }
516      if (typeof fbq === 'function') {
517        fbq('track', 'Contact', {
518          content_category: metaFor(path).c,
519          contact_method: method
520        });
521      }
522    }, true);
523  })();
524</script>
524
525<!-- DV-TRACKING-END -->
526
527<!-- DV-SPLASH-START -->
528  <div id="dv-splash" aria-hidden="true">
529    <div class="dv-splash-inner">
530      <img src="/wati-brand.jpg" alt="" width="88" height="88" class="dv-splash-logo">
531      <div class="dv-splash-name">Dharmik<span>Vibes</span></div>
532      <div class="dv-splash-tag">Sacred journeys, divine blessings</div>
533      <div class="dv-splash-bar"><i></i></div>
534    </div>
535  </div>
536  <style>
537    #dv-splash {
538      position: fixed; inset: 0; z-index: 2147483000;
539      display: flex; align-items: center; justify-content: center;
540      background: linear-gradient(180deg, #fffdf9 0%, #fdf3e3 100%);
541      opacity: 1; transition: opacity .45s ease;
542    }
543    .dv-splash-inner { text-align: center; font-family: system-ui, -apple-system, "Segoe UI", sans-serif; }
544    .dv-splash-logo {
545      border-radius: 22px; box-shadow: 0 6px 24px rgba(230, 134, 0, .22);
546      animation: dvPulse 1.8s ease-in-out infinite;
547    }
548    .dv-splash-name {
549      margin-top: 16px; font-size: 26px; font-weight: 700; color: #b35f00; letter-spacing: .2px;
550    }
551    .dv-splash-name span { color: #2b2b2b; }
552    .dv-splash-tag { margin-top: 4px; font-size: 13px; color: #8a7a63; }
553    .dv-splash-bar {
554      margin: 22px auto 0; width: 140px; height: 3px; border-radius: 3px;
555      background: rgba(230, 134, 0, .18); overflow: hidden; position: relative;
556    }
557    .dv-splash-bar i {
558      position: absolute; left: -40%; top: 0; height: 100%; width: 40%;
559      border-radius: 3px; background: #e68600;
560      animation: dvSlide 1.15s cubic-bezier(.4, 0, .6, 1) infinite;
561    }
562    @keyframes dvPulse { 0%,100% { transform: scale(1); } 50% { transform: scale(1.045); } }
563    @keyframes dvSlide { 0% { left: -40%; } 100% { left: 100%; } }
564    @media (prefers-reduced-motion: reduce) {
565      .dv-splash-logo, .dv-splash-bar i { animation: none; }
566    }
567  </style>
568  
568<script>
569    (function () {
570      var hidden = false;
571      function dvHideSplash() {
572        if (hidden) return;
573        hidden = true;
574        var s = document.getElementById('dv-splash');
575        if (!s) return;
576        s.style.opacity = '0';
577        setTimeout(function () { if (s.parentNode) s.parentNode.removeChild(s); }, 500);
578      }
579      window.addEventListener('flutter-first-frame', dvHideSplash);
580      // Fallbacks: flutter-view appearing in DOM, or hard 12s cap
581      var mo = new MutationObserver(function () {
582        if (document.querySelector('flutter-view, flt-glass-pane')) {
583          setTimeout(dvHideSplash, 300);
584          mo.disconnect();
585        }
586      });
587      mo.observe(document.body, { childList: true, subtree: true });
588      setTimeout(dvHideSplash, 12000);
589    })();
590  </script>
590
591<!-- DV-SPLASH-END -->
592
593</body>
594
595</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.