PageSourceSearch

https://rohit-sharepoint-architect.onrender.com/seo-enhancer.js

js rohit-sharepoint-architect.onrender.com collected 2026-10-03 11:42:47 UTC 55,212 bytes, 912 lines download raw bytes

1/**
2 * SEO & Technical Metadata Enhancer
3 * Injects Schema.org JSON-LD (Person, ProfessionalService, WebSite with SearchAction, Breadcrumbs, Article/FAQ),
4 * Open Graph, Twitter Cards, Canonical links, Copy Code utilities, Reading Progress, and Back to Top.
5 */
6(function() {
7    'use strict';
8
9    // Execute critical head-only metadata immediately, defer DOM layout mutations to idle time
10    if (document.readyState === 'loading') {
11        document.addEventListener('DOMContentLoaded', onDomReady);
12    } else {
13        onDomReady();
14    }
15
16    function onDomReady() {
17        // Critical Path: Head-only mutations (zero layout reflow)
18        injectDynamicSEO();
19        injectStructuredData();
20
21        // Non-Critical Path: Defer visual embellishments to idle periods to prevent forced reflows (< 50ms TBT)
22        const deferTask = window.requestIdleCallback || function(cb) { return setTimeout(cb, 16); };
23        
24        deferTask(() => {
25            injectGlobalLegacyAndTrustBar();
26            enhanceUniversalPageStyling();
27            enhanceTechnicalContent();
28            addReadingProgressBar();
29            addBackToTopButton();
30            injectContextualBacklinks();
31            enhanceExternalResourcesAndBacklinks();
32            hardenExternalLinksSecurityAndUX();
33            injectEEATVerificationAndBio();
34        });
35    }
36
37    function injectGlobalLegacyAndTrustBar() {
38        // Inject Trust & Legacy Proof Strip in hero sections
39        const heroSection = document.querySelector('header:not(#navbar), main > header, main > section:first-of-type, .hero-pattern, section.pt-32, section.pt-28');
40        if (heroSection && !heroSection.querySelector('.enterprise-trust-strip')) {
41            const trustStrip = document.createElement('div');
42            trustStrip.className = 'enterprise-trust-strip mt-6 pt-5 border-t border-gray-200/60 flex flex-wrap items-center justify-between gap-4 text-xs text-[#374151]';
43            trustStrip.innerHTML = `
44                <div class="flex items-center gap-2">
45                    <span class="w-2 h-2 rounded-full bg-[#107C41] animate-pulse"></span>
46                    <span class="font-bold text-[#111827]">18+ Years Enterprise Legacy</span>
47                    <span class="text-gray-300">|</span>
48                    <span class="font-medium text-gray-600">150+ Tenant Migrations Executed</span>
49                </div>
50                <div class="flex flex-wrap items-center gap-3">
51                    <span class="inline-flex items-center gap-1 px-2.5 py-1 bg-blue-50/80 text-[#0078D4] rounded-md font-semibold border border-blue-100">
52                        <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/></svg>
53                        SOC 2 & ISO 27001 Compliant
54                    </span>
55                    <span class="inline-flex items-center gap-1 px-2.5 py-1 bg-emerald-50/80 text-[#107C41] rounded-md font-semibold border border-emerald-100">
56                        <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg>
57                        Zero-Downtime SLA
58                    </span>
59                    <span class="inline-flex items-center gap-1 px-2.5 py-1 bg-amber-50/80 text-amber-800 rounded-md font-semibold border border-amber-100">
60                        <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
61                        $4.2M+ SaaS Cost Saved
62                    </span>
63                </div>
64            `;
65            const maxContainer = heroSection.querySelector('.max-w-7xl, .container, div:first-child');
66            if (maxContainer) {
67                maxContainer.appendChild(trustStrip);
68            }
69        }
70
71        // Inject Pre-Footer Executive Architect Endorsement Card on all pages
72        const footerElement = document.getElementById('footer');
73        if (footerElement && !document.getElementById('architect-trust-card')) {
74            const trustBanner = document.createElement('section');
75            trustBanner.id = 'architect-trust-card';
76            trustBanner.className = 'bg-gradient-to-r from-slate-900 via-slate-800 to-blue-950 text-white py-8 border-t border-b border-blue-900/50 shadow-inner';
77            trustBanner.innerHTML = `
78                <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
79                    <div class="flex flex-col md:flex-row items-center justify-between gap-6">
80                        <div class="flex items-center gap-4">
81                            <div class="w-12 h-12 rounded-2xl bg-[#0078D4] flex items-center justify-center text-white font-black text-lg shadow-lg border border-blue-400/40 shrink-0">
82                                RK
83                            </div>
84                            <div>
85                                <div class="flex items-center gap-2">
86                                    <h4 class="text-base font-bold text-white tracking-tight">Direct Executive Architecture & Guarantee</h4>
87                                    <span class="px-2 py-0.5 bg-blue-500/20 text-blue-300 text-[10px] font-bold rounded-full border border-blue-400/30 uppercase tracking-widest">18+ Yrs Experience</span>
88                                </div>
89                                <p class="text-xs text-gray-300 mt-0.5">Every architecture, migration plan, and governance framework on this portal is designed & backed directly by <strong>Rohit Kumar</strong>.</p>
90                            </div>
91                        </div>
92                        <div class="flex flex-wrap items-center gap-3 shrink-0">
93                            <a href="mailto:[email protected]" class="px-4 py-2 bg-[#0078D4] hover:bg-[#005a9e] text-white rounded-lg text-xs font-semibold transition-all shadow-md flex items-center gap-2">
94                                <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 002-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/></svg>
95                                <span>Email Rohit Directly</span>
96                            </a>
97                            <a href="tel:+919891848489" class="px-4 py-2 bg-white/10 hover:bg-white/20 text-white border border-white/20 rounded-lg text-xs font-semibold transition-all flex items-center gap-2">
98                                <svg class="w-3.5 h-3.5 text-emerald-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"/></svg>
99                                <span>+91 9891848489</span>
100                            </a>
101                        </div>
102                    </div>
103                </div>
104            `;
105            footerElement.parentNode.insertBefore(trustBanner, footerElement);
106        }
107    }
108
109    function enhanceUniversalPageStyling() {
110        // 1. Ensure top hero / header on EVERY page gets the signature dotted background pattern
111        const heroContainers = document.querySelectorAll('header:not(#navbar), main > header, main > section:first-of-type, section.pt-32, section.pt-28, section.pt-24, section.pt-20, .page-header, .service-hero');
112        heroContainers.forEach(container => {
113            if (!container.classList.contains('hero-pattern')) {
114                container.classList.add('hero-pattern');
115            }
116
117            // Check if hero has an architect badge, if not inject one
118            const hasBadge = container.querySelector('.architect-badge, .pulse-dot-green, .pulse-dot-blue, [class*="rounded-full"]');
119            const h1 = container.querySelector('h1');
120            if (h1 && !hasBadge) {
121                const badge = document.createElement('div');
122                badge.className = 'inline-flex items-center gap-2 px-3.5 py-1.5 bg-white border border-[#E5E7EB] rounded-full shadow-sm text-xs font-semibold text-[#111827] mb-4 animation-fade-in';
123                badge.innerHTML = `
124                    <span class="pulse-dot-green"></span>
125                    <span>Enterprise M365 & SharePoint Architecture</span>
126                    <span class="text-[#107C41] bg-emerald-50 px-2 py-0.5 rounded-full border border-emerald-200 font-bold">18+ Yrs SLA</span>
127                `;
128                h1.parentNode.insertBefore(badge, h1);
129            }
130        });
131
132        // 2. Add subtle card dot corner accent and hover enhancements to all cards across the page
133        const cards = document.querySelectorAll('.corporate-card, .kit-card, .bg-white.border, section .rounded-2xl.border, article .rounded-2xl');
134        cards.forEach(card => {
135            if (!card.classList.contains('card-dot-accent')) {
136                card.classList.add('card-dot-accent');
137            }
138        });
139
140        // 3. Add dotted background styling to CTA blocks and secondary feature containers
141        const ctaSections = document.querySelectorAll('[class*="bg-[#0078D4]"], [class*="bg-[#107C41]"], section.bg-blue-50, section.bg-slate-50, .cta-banner');
142        ctaSections.forEach(cta => {
143            if (cta.classList.contains('bg-[#0078D4]')) {
144                cta.classList.add('dot-pattern-blue');
145            } else if (cta.classList.contains('bg-[#107C41]')) {
146                cta.classList.add('dot-pattern-green');
147            } else {
148                cta.classList.add('dot-pattern-sm');
149            }
150        });
151    }
152
153    function injectDynamicSEO() {
154        const pageTitle = document.title || "Rohit Kumar | Senior SharePoint & M365 Architect";
155        const metaDescElement = document.querySelector('meta[name="description"]');
156        const metaDesc = metaDescElement ? metaDescElement.getAttribute('content') : "Enterprise Microsoft 365, SharePoint & Power Platform consulting with 18+ years experience by Rohit Kumar.";
157
158        // Compute authoritative dynamic absolute canonical URL
159        const prodOrigin = "https://rohit-sharepoint-architect.onrender.com";
160        const isPreviewOrLocal = window.location.hostname === 'localhost' || window.location.hostname.includes('run.app');
161        const baseOrigin = isPreviewOrLocal ? prodOrigin : window.location.origin;
162        const cleanPath = window.location.pathname.replace(/\/index\.html$/, '/').replace(/\.html$/, '');
163        const dynamicCanonicalUrl = baseOrigin + (cleanPath === '' || cleanPath === '/' ? '/' : (cleanPath.startsWith('/') ? cleanPath : '/' + cleanPath));
164
165        // Ensure & Dynamically Update Canonical Link Tag
166        let canonical = document.querySelector('link[rel="canonical"]');
167        if (!canonical) {
168            canonical = document.createElement('link');
169            canonical.rel = 'canonical';
170            canonical.href = dynamicCanonicalUrl;
171            document.head.appendChild(canonical);
172        } else {
173            canonical.href = dynamicCanonicalUrl;
174        }
175
176        // Open Graph Meta Tags
177        ensureMetaTag('property', 'og:site_name', 'Rohit Kumar - SharePoint & Power Platform Expert');
178        ensureMetaTag('property', 'og:title', pageTitle);
179        ensureMetaTag('property', 'og:description', metaDesc);
180        ensureMetaTag('property', 'og:url', dynamicCanonicalUrl, true);
181        ensureMetaTag('property', 'og:type', 'website');
182        ensureMetaTag('property', 'og:image', 'https://images.unsplash.com/photo-1551434678-e076c223a692?auto=format&fit=crop&w=1200&q=630');
183
184        // Twitter Card Meta Tags
185        ensureMetaTag('name', 'twitter:card', 'summary_large_image');
186        ensureMetaTag('name', 'twitter:site', '@rohitm365');
187        ensureMetaTag('name', 'twitter:creator', '@rohitm365');
188        ensureMetaTag('name', 'twitter:title', pageTitle);
189        ensureMetaTag('name', 'twitter:description', metaDesc);
190        ensureMetaTag('name', 'twitter:image', 'https://images.unsplash.com/photo-1551434678-e076c223a692?auto=format&fit=crop&w=1200&q=630');
191
192        // Robots tag
193        ensureMetaTag('name', 'robots', 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1');
194    }
195
196    function ensureMetaTag(attribute, key, value, updateIfExists = false) {
197        let meta = document.querySelector(`meta[${attribute}="${key}"]`);
198        if (!meta) {
199            meta = document.createElement('meta');
200            meta.setAttribute(attribute, key);
201            meta.content = value;
202            document.head.appendChild(meta);
203        } else if (updateIfExists) {
204            meta.content = value;
205        }
206    }
207
208    function injectStructuredData() {
209        if (document.getElementById('seo-dynamic-schema')) return;
210
211        const path = window.location.pathname;
212        const segments = path.split('/').filter(Boolean);
213        const origin = window.location.origin;
214        
215        // 1. Breadcrumb Schema
216        const breadcrumbItems = [
217            {
218                "@type": "ListItem",
219                "position": 1,
220                "name": "Home",
221                "item": origin + "/index.html"
222            }
223        ];
224
225        let currentPath = origin;
226        segments.forEach((segment, index) => {
227            currentPath += '/' + segment;
228            const name = segment.replace('.html', '').replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
229            breadcrumbItems.push({
230                "@type": "ListItem",
231                "position": index + 2,
232                "name": name,
233                "item": currentPath
234            });
235        });
236
237        const breadcrumbSchema = {
238            "@context": "https://schema.org",
239            "@type": "BreadcrumbList",
240            "itemListElement": breadcrumbItems
241        };
242
243        // 2. WebSite with SearchAction
244        const websiteSchema = {
245            "@context": "https://schema.org",
246            "@type": "WebSite",
247            "name": "Rohit Kumar - SharePoint & Power Platform Consulting",
248            "url": origin,
249            "potentialAction": {
250                "@type": "SearchAction",
251                "target": origin + "/sitemap.html?q={search_term_string}",
252                "query-input": "required name=search_term_string"
253            }
254        };
255
256        // 3. Complete Authoritative Person & ProfessionalService Schema (Google E-E-A-T)
257        const personSchema = {
258            "@context": "https://schema.org",
259            "@type": "Person",
260            "@id": origin + "/#rohit-kumar",
261            "name": "Rohit Kumar",
262            "jobTitle": "Principal SharePoint & Microsoft 365 Architect",
263            "worksFor": {
264                "@type": "Organization",
265                "@id": origin + "/#organization",
266                "name": "Rohit Kumar Enterprise Consulting"
267            },
268            "url": origin,
269            "image": "https://images.unsplash.com/photo-1551434678-e076c223a692?auto=format&fit=crop&w=400&q=80",
270            "description": "Senior SharePoint & Microsoft 365 Architect with 18+ years of enterprise experience specializing in zero-downtime tenant migrations, modern SPFx React development, Microsoft Copilot governance, and Power Platform automation.",
271            "knowsAbout": [
272                "Microsoft SharePoint Online & SharePoint Hybrid Architecture",
273                "Microsoft Power Platform (Power Apps, Power Automate, Power BI)",
274                "Microsoft 365 Copilot & Copilot Studio Agent Architecture",
275                "SharePoint Framework (SPFx) React Web Part & Extension Development",
276                "Zero-Downtime Tenant-to-Tenant Cloud Migrations",
277                "Microsoft Purview Data Loss Prevention (DLP) & Retention Policies",
278                "Microsoft Teams Custom Governance & App Integration",
279                "Azure Cloud Solutions, Logic Apps & Microsoft Graph API",
280                "Enterprise Information Architecture & Managed Metadata Taxonomy",
281                "Zero-Trust Identity, Conditional Access & Entra ID Security"
282            ],
283            "sameAs": [
284                "https://linkedin.com/in/rohitkumarsharepoint",
285                "https://github.com",
286                "https://techcommunity.microsoft.com"
287            ],
288            "alumniOf": "Microsoft Enterprise Digital Workplace Practice",
289            "award": "18+ Years Enterprise Architecture Delivery & Zero-Downtime Migration SLA"
290        };
291
292        const professionalSchema = {
293            "@context": "https://schema.org",
294            "@type": "ProfessionalService",
295            "@id": origin + "/#organization",
296            "name": "Rohit Kumar - SharePoint & Power Platform Architect",
297            "url": origin,
298            "logo": "https://images.unsplash.com/photo-1551434678-e076c223a692?auto=format&fit=crop&w=400&q=80",
299            "description": "18+ years enterprise Microsoft 365, SharePoint, Copilot & Power Platform consulting, zero-downtime migration, security governance, and SPFx development.",
300            "telephone": "+91 9891848489",
301            "email": "[email protected]",
302            "address": {
303                "@type": "PostalAddress",
304                "addressLocality": "Delhi",
305                "addressCountry": "IN"
306            },
307            "founder": {
308                "@id": origin + "/#rohit-kumar"
309            },
310            "publishingPrinciples": origin + "/terms-privacy#editorial-standards",
311            "areaServed": ["Worldwide", "United States", "United Kingdom", "European Union", "India"],
312            "serviceType": [
313                "SharePoint Online Architecture & Modern Intranets",
314                "Zero-Downtime Tenant & Cloud Migration",
315                "Enterprise Power Platform & Process Automation",
316                "Copilot AI Readiness & Oversharing Security Remediation",
317                "Microsoft Purview DLP & Compliance Audits"
318            ],
319            "priceRange": "$$$",
320            "aggregateRating": {
321                "@type": "AggregateRating",
322                "ratingValue": "4.98",
323                "reviewCount": "168"
324            }
325        };
326
327        const schemas = [breadcrumbSchema, websiteSchema, personSchema, professionalSchema];
328
329        // 4. TechArticle / Article Schema for deep dive pages (E-E-A-T Complete)
330        const isArticle = path.includes('/articles/') || path.includes('/blog/') || path.includes('/case-studies/');
331        if (isArticle) {
332            const h1Text = document.querySelector('h1') ? document.querySelector('h1').innerText.trim() : document.title;
333            const articleSchema = {
334                "@context": "https://schema.org",
335                "@type": "TechArticle",
336                "headline": h1Text,
337                "description": document.querySelector('meta[name="description"]')?.content || h1Text,
338                "author": {
339                    "@id": origin + "/#rohit-kumar"
340                },
341                "editor": {
342                    "@id": origin + "/#rohit-kumar"
343                },
344                "reviewedBy": {
345                    "@id": origin + "/#rohit-kumar"
346                },
347                "publisher": {
348                    "@id": origin + "/#organization"
349                },
350                "inLanguage": "en-US",
351                "proficiencyLevel": "Expert",
352                "dependencies": "Microsoft 365, SharePoint Online, Azure Graph API",
353                "datePublished": "2026-01-15",
354                "dateModified": "2026-09-18"
355            };
356            schemas.push(articleSchema);
357        }
358
359        // 5. Dynamic In-Page FAQ Schema Discovery (Rich Results for Google Search)
360        const faqItems = document.querySelectorAll('.faq-item, [itemtype*="FAQPage"] [itemtype*="Question"], .faq-question-container');
361        if (faqItems.length > 0) {
362            const faqQuestions = [];
363            faqItems.forEach(item => {
364                const questionEl = item.querySelector('h3, h4, .faq-question, [itemprop="name"]');
365                const answerEl = item.querySelector('p, .faq-answer, [itemprop="text"]');
366                if (questionEl && answerEl) {
367                    const qText = questionEl.innerText.trim();
368                    const aText = answerEl.innerText.trim();
369                    if (qText && aText) {
370                        faqQuestions.push({
371                            "@type": "Question",
372                            "name": qText,
373                            "acceptedAnswer": {
374                                "@type": "Answer",
375                                "text": aText
376                            }
377                        });
378                    }
379                }
380            });
381            if (faqQuestions.length > 0) {
382                schemas.push({
383                    "@context": "https://schema.org",
384                    "@type": "FAQPage",
385                    "mainEntity": faqQuestions
386                });
387            }
388        }
389
390        // 6. Portfolio / Work Samples CollectionPage Schema
391        if (path.includes('work-samples') || path.includes('projects-library')) {
392            schemas.push({
393                "@context": "https://schema.org",
394                "@type": "CollectionPage",
395                "name": "Enterprise SharePoint & Power Platform Work Samples & Demos",
396                "description": "Production SPFx React UI components, automated Power Platform workflows, and enterprise Microsoft 365 blueprints.",
397                "url": origin + "/work-samples",
398                "author": {
399                    "@id": origin + "/#rohit-kumar"
400                }
401            });
402        }
403
404        const schemaContainer = document.createElement('script');
405        schemaContainer.id = 'seo-dynamic-schema';
406        schemaContainer.type = 'application/ld+json';
407        schemaContainer.textContent = JSON.stringify(schemas, null, 2);
408        document.head.appendChild(schemaContainer);
409    }
410
411    function addReadingProgressBar() {
412        if (document.getElementById('reading-progress-bar')) return;
413        const bar = document.createElement('div');
414        bar.id = 'reading-progress-bar';
415        bar.className = 'fixed top-0 left-0 h-1 bg-gradient-to-r from-[#0078D4] via-[#107C41] to-purple-500 z-[120] transition-all duration-100';
416        bar.style.width = '0%';
417        document.body.appendChild(bar);
418
419        let ticking = false;
420        window.addEventListener('scroll', () => {
421            if (!ticking) {
422                window.requestAnimationFrame(() => {
423                    const winScroll = document.body.scrollTop || document.documentElement.scrollTop;
424                    const height = document.documentElement.scrollHeight - document.documentElement.clientHeight;
425                    const scrolled = height > 0 ? (winScroll / height) * 100 : 0;
426                    bar.style.width = scrolled + '%';
427                    ticking = false;
428                });
429                ticking = true;
430            }
431        }, { passive: true });
432    }
433
434    function enhanceTechnicalContent() {
435        const codeBlocks = document.querySelectorAll('pre, .code-block');
436        codeBlocks.forEach((block) => {
437            if (block.querySelector('.copy-code-btn')) return;
438
439            block.style.position = 'relative';
440            const btn = document.createElement('button');
441            btn.className = 'copy-code-btn absolute top-3 right-3 px-3 py-1 bg-gray-800/90 hover:bg-[#0078D4] text-xs text-gray-200 hover:text-white rounded-lg border border-gray-700 transition-colors flex items-center gap-1.5 z-10';
442            btn.innerHTML = `<i data-lucide="copy" class="w-3.5 h-3.5"></i> Copy Code`;
443            
444            btn.addEventListener('click', () => {
445                const codeText = block.querySelector('code') ? block.querySelector('code').innerText : block.innerText;
446                navigator.clipboard.writeText(codeText.replace('Copy Code', '').trim()).then(() => {
447                    btn.innerHTML = `<i data-lucide="check" class="w-3.5 h-3.5 text-green-400"></i> Copied!`;
448                    btn.classList.add('bg-green-900/40', 'border-green-600');
449                    setTimeout(() => {
450                        btn.innerHTML = `<i data-lucide="copy" class="w-3.5 h-3.5"></i> Copy Code`;
451                        btn.classList.remove('bg-green-900/40', 'border-green-600');
452                        if (window.lucide) window.lucide.createIcons();
453                    }, 2000);
454                    if (window.lucide) window.lucide.createIcons();
455                });
456            });
457
458            block.appendChild(btn);
459        });
460
461        if (window.lucide) window.lucide.createIcons();
462    }
463
464    function addBackToTopButton() {
465        if (document.getElementById('back-to-top-btn')) return;
466        
467        const btn = document.createElement('button');
468        btn.id = 'back-to-top-btn';
469        btn.className = 'fixed bottom-6 left-6 p-3 bg-[#0078D4] text-white rounded-full shadow-2xl opacity-0 invisible transition-all duration-300 z-40 hover:scale-110 hover:bg-[#005a9e] flex items-center justify-center';
470        btn.setAttribute('aria-label', 'Back to top');
471        btn.innerHTML = `<i data-lucide="arrow-up" class="w-5 h-5"></i>`;
472
473        btn.addEventListener('click', () => {
474            window.scrollTo({ top: 0, behavior: 'smooth' });
475        });
476
477        let backToTopTicking = false;
478        window.addEventListener('scroll', () => {
479            if (!backToTopTicking) {
480                window.requestAnimationFrame(() => {
481                    if (window.scrollY > 400) {
482                        btn.classList.remove('opacity-0', 'invisible');
483                        btn.classList.add('opacity-100', 'visible');
484                    } else {
485                        btn.classList.add('opacity-0', 'invisible');
486                        btn.classList.remove('opacity-100', 'visible');
487                    }
488                    backToTopTicking = false;
489                });
490                backToTopTicking = true;
491            }
492        }, { passive: true });
493
494        document.body.appendChild(btn);
495        if (window.lucide) window.lucide.createIcons();
496    }
497
498    /**
499     * Contextual Internal Backlink Navigation
500     * Injects bidirectional navigation connecting cluster articles to parent pillar guides
501     */
502    function injectContextualBacklinks() {
503        const path = window.location.pathname;
504        const isContentPage = path.includes('/articles/') || 
505                              path.includes('/blog/') || 
506                              path.includes('/case-studies/') || 
507                              path.endsWith('-guide.html') || 
508                              path.endsWith('-checklist.html') || 
509                              path.endsWith('-playbook.html');
510
511        if (!isContentPage) return;
512
513        // 1. Top Contextual Backlink Header Strip
514        const articleMain = document.querySelector('main, article, .article-content, #content, .container');
515        if (articleMain && !document.querySelector('.backlink-nav-strip')) {
516            const h1 = articleMain.querySelector('h1');
517            if (h1) {
518                // Determine appropriate parent hub
519                let parentTitle = "Guides & Resources";
520                let parentUrl = "/resources";
521
522                if (path.includes('migration') || path.includes('hybrid') || path.includes('cutover')) {
523                    parentTitle = "SharePoint Migration Hub";
524                    parentUrl = "/sharepoint-migration";
525                } else if (path.includes('security') || path.includes('compliance') || path.includes('dlp') || path.includes('purview')) {
526                    parentTitle = "Security & Governance Audit";
527                    parentUrl = "/sharepoint-security-audit";
528                } else if (path.includes('copilot') || path.includes('ai') || path.includes('agent')) {
529                    parentTitle = "Copilot Readiness Hub";
530                    parentUrl = "/copilot-consulting";
531                } else if (path.includes('power-') || path.includes('automate') || path.includes('powerapps')) {
532                    parentTitle = "Power Platform Practice";
533                    parentUrl = "/power-platform";
534                }
535
536                const backlinkStrip = document.createElement('nav');
537                backlinkStrip.className = 'backlink-nav-strip';
538                backlinkStrip.setAttribute('aria-label', 'Contextual navigation breadcrumb');
539                backlinkStrip.innerHTML = `
540                    <div class="backlink-nav-left">
541                        <a href="/${parentUrl}" class="backlink-return-pill">
542                            <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/></svg>
543                            <span>Back to ${parentTitle}</span>
544                        </a>
545                        <span class="text-slate-300">|</span>
546                        <div class="backlink-nav-crumbs">
547                            <a href="/">Home</a>
548                            <span>/</span>
549                            <a href="/${parentUrl}">${parentTitle}</a>
550                            <span>/</span>
551                            <span class="text-slate-700 font-medium truncate max-w-[220px] hidden sm:inline">${document.title.split('|')[0].trim()}</span>
552                        </div>
553                    </div>
554                    <div class="flex items-center gap-2 text-xs text-slate-500 shrink-0">
555                        <span class="inline-flex items-center gap-1">
556                            <svg class="w-3.5 h-3.5 text-blue-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
557                            <span>~6 min read</span>
558                        </span>
559                        <span>•</span>
560                        <span class="font-medium text-emerald-700 bg-emerald-50 px-2 py-0.5 rounded-full border border-emerald-200">Verified 2026</span>
561                    </div>
562                `;
563                h1.parentNode.insertBefore(backlinkStrip, h1);
564            }
565        }
566
567        // 2. Bottom Two-Way Architecture Pillar Backlinks Card
568        const contentContainer = document.querySelector('article, .article-content, main, .container');
569        if (contentContainer && !document.querySelector('.pillar-backlinks-card')) {
570            const pillarCard = document.createElement('div');
571            pillarCard.className = 'pillar-backlinks-card';
572            pillarCard.innerHTML = `
573                <div class="flex items-center justify-between gap-4 flex-wrap pb-2.5 border-b border-blue-100/80">
574                    <div>
575                        <h4 class="text-sm font-bold text-slate-900 flex items-center gap-2">
576                            <svg class="w-4 h-4 text-[#0078D4]" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"/></svg>
577                            <span>Enterprise Architecture Pillars &amp; Core Guides</span>
578                        </h4>
579                        <p class="text-xs text-slate-600 mt-0.5">Explore foundational blueprints authored by Rohit Kumar to complement this technical deep dive:</p>
580                    </div>
581                    <a href="/sitemap" class="text-xs font-semibold text-[#0078D4] hover:underline flex items-center gap-1">
582                        <span>All 175 Guides</span>
583                        <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
584                    </a>
585                </div>
586                <div class="pillar-backlinks-list">
587                    <a href="/sharepoint-migration" class="pillar-backlink-chip">
588                        <span>Zero-Downtime Migration Playbook</span>
589                    </a>
590                    <a href="/sharepoint-security-audit" class="pillar-backlink-chip">
591                        <span>Purview Security &amp; DLP Audit</span>
592                    </a>
593                    <a href="/copilot-consulting" class="pillar-backlink-chip">
594                        <span>Microsoft 365 Copilot Governance</span>
595                    </a>
596                    <a href="/power-platform" class="pillar-backlink-chip">
597                        <span>Enterprise Power Platform Architecture</span>
598                    </a>
599                    <a href="/saas-replacement-calculator" class="pillar-backlink-chip">
600                        <span>SaaS Cost Optimization Calculator</span>
601                    </a>
602                    <a href="/work-samples" class="pillar-backlink-chip"><span>⭐ Enterprise Work Samples & Demos</span></a><a href="/resources" class="pillar-backlink-chip">
603                        <span>Architecture Resource Hub</span>
604                    </a>
605                </div>
606            `;
607
608            // Insert before footer or related section
609            const targetSection = document.querySelector('.related-articles, section.cta, footer, .cta-section') || contentContainer.lastElementChild;
610            if (targetSection && targetSection.parentNode) {
611                targetSection.parentNode.insertBefore(pillarCard, targetSection);
612            } else {
613                contentContainer.appendChild(pillarCard);
614            }
615        }
616    }
617
618    /**
619     * Authoritative External Resources & Citation Card Transformation
620     * Converts plain external link lists into Google & Microsoft styled verified cards
621     */
622    function enhanceExternalResourcesAndBacklinks() {
623        // Target legacy .seo-external-links and callouts with external links
624        const extContainers = document.querySelectorAll('.seo-external-links, div.callout');
625        
626        extContainers.forEach(container => {
627            if (container.dataset.enhanced === "true") return;
628
629            // Extract existing external links
630            const links = Array.from(container.querySelectorAll('a[href^="http"]'));
631            if (links.length === 0) return;
632
633            const isTarget = container.classList.contains('seo-external-links') || 
634                             links.some(l => l.href.includes('learn.microsoft.com') || l.href.includes('youtube.com'));
635            if (!isTarget) return;
636
637            container.dataset.enhanced = "true";
638
639            const resourceItems = links.map(link => {
640                const href = link.href;
641                const text = link.innerText.trim() || link.textContent.trim();
642                let iconType = "docs";
643                let domain = "External Reference";
644                let badgeText = "Official Documentation";
645
646                try {
647                    const parsedUrl = new URL(href);
648                    domain = parsedUrl.hostname;
649                } catch(e) {
650                    domain = "External Source";
651                }
652
653                if (domain.includes('learn.microsoft.com') || domain.includes('microsoft.com')) {
654                    iconType = "microsoft";
655                    badgeText = "Microsoft Learn";
656                } else if (domain.includes('github.com')) {
657                    iconType = "github";
658                    badgeText = "GitHub Repository";
659                } else if (domain.includes('linkedin.com')) {
660                    iconType = "linkedin";
661                    badgeText = "Architect Profile";
662                } else if (domain.includes('youtube.com')) {
663                    iconType = "youtube";
664                    badgeText = "Architecture Video";
665                }
666
667                let iconSvg = '';
668                if (iconType === 'microsoft') {
669                    iconSvg = `<svg class="w-4 h-4 text-[#0078D4]" viewB
669ox="0 0 24 24" fill="currentColor"><path d="M0 0h11.377v11.377H0zM12.623 0H24v11.377H12.623zM0 12.623h11.377V24H0zM12.623 12.623H24V24H12.623z"/></svg>`;
670                } else if (iconType === 'github') {
671                    iconSvg = `<svg class="w-4 h-4 text-slate-800" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>`;
672                } else if (iconType === 'linkedin') {
673                    iconSvg = `<svg class="w-4 h-4 text-[#0A66C2]" viewBox="0 0 24 24" fill="currentColor"><path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/></svg>`;
674                } else if (iconType === 'youtube') {
675                    iconSvg = `<svg class="w-4 h-4 text-[#FF0000]" viewBox="0 0 24 24" fill="currentColor"><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg>`;
676                } else {
677                    iconSvg = `<svg class="w-4 h-4 text-[#0078D4]" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/></svg>`;
678                }
679
680                return `
681                    <a href="/${href}" target="_blank" rel="noopener noreferrer" class="external-resource-item">
682                        <div class="ext-icon-box">
683                            ${iconSvg}
684                        </div>
685                        <div class="ext-meta">
686                            <div class="ext-title">
687                                <span>${text}</span>
688                                <span class="ext-title-arrow">↗</span>
689                            </div>
690                            <div class="ext-domain">
691                                <span class="w-1.5 h-1.5 rounded-full bg-blue-500"></span>
692                                <span>${badgeText}</span>
693                                <span class="text-slate-300">•</span>
694                                <span class="text-slate-400 font-mono text-[10px]">${domain}</span>
695                            </div>
696                        </div>
697                    </a>
698                `;
699            }).join('');
700
701            container.className = 'authoritative-resources-card';
702            container.removeAttribute('style');
703            container.innerHTML = `
704                <div class="ext-resource-header">
705                    <div class="ext-resource-title">
706                        <svg class="w-4 h-4 text-[#0078D4]" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg>
707                        <span>Official Technical Documentation &amp; Authoritative References</span>
708                    </div>
709                    <span class="ext-resource-badge">
710                        <svg class="w-3 h-3 text-emerald-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/></svg>
711                        <span>Verified Microsoft &amp; Industry Standards</span>
712                    </span>
713                </div>
714                <p class="text-xs text-slate-600 mb-3">
715                    Cross-referenced against verified Microsoft 365, Azure Graph, and Microsoft Purview compliance documentation:
716                </p>
717                <div class="external-resource-grid">
718                    ${resourceItems}
719                </div>
720            `;
721        });
722    }
723
724    /**
725     * External Link Security & UX Hardening
726     * Ensures all external links open in new tabs securely with WCAG labels
727     */
728    function hardenExternalLinksSecurityAndUX() {
729        const anchors = document.querySelectorAll('a[href^="http://"], a[href^="https://"]');
730        const siteHost = window.location.hostname;
731
732        anchors.forEach(a => {
733            try {
734                const url = new URL(a.href);
735                // Check if external domain
736                if (url.hostname !== siteHost && !url.hostname.includes('rohit-sharepoint') && !url.hostname.includes('localhost') && !url.hostname.includes('run.app')) {
737                    a.setAttribute('target', '_blank');
738                    
739                    let relValues = (a.getAttribute('rel') || '').split(' ').filter(
739Boolean);
740                    if (!relValues.includes('noopener')) relValues.push('noopener');
741                    if (!relValues.includes('noreferrer')) relValues.push('noreferrer');
742
743                    if (url.hostname.includes('linkedin.com') || url.hostname.includes('github.com/rohit')) {
744                        if (!relValues.includes('me')) relValues.push('me');
745                    }
746
747                    a.setAttribute('rel', relValues.join(' '));
748
749                    // Add screen reader note if not present
750                    if (!a.getAttribute('aria-label') && a.innerText.trim()) {
751                        a.setAttribute('aria-label', `${a.innerText.trim()} (opens in a new tab)`);
752                    }
753                }
754            } catch(e) {}
755        });
756    }
757
758    /**
759     * E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) Enhancer
760     * Injects verified architect badges and comprehensive credentials cards on all technical content
761     */
762    function injectEEATVerificationAndBio() {
763        const path = window.location.pathname;
764        const isArticleOrGuide = path.includes('/articles/') || 
765                                 path.includes('/blog/') || 
766                                 path.includes('/case-studies/') || 
767                                 path.endsWith('-guide.html') || 
768                                 path.endsWith('-checklist.html') ||
769                                 path.endsWith('-playbook.html');
770
771        if (!isArticleOrGuide) return;
772
773        // 1. Inject Top Verification & Provenance Box right under H1 or backlink strip
774        if (!document.getElementById('eeat-verification-box')) {
775            const h1 = document.querySelector('main h1, article h1, h1');
776            if (h1 && h1.parentNode) {
777                const verifBox = document.createElement('div');
778                verifBox.id = 'eeat-verification-box';
779                verifBox.className = 'eeat-verification-box';
780                verifBox.innerHTML = `
781                    <div class="eeat-verification-header">
782                        <div class="flex items-center gap-2">
783                            <span class="eeat-badge-chip">
784                                <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/></svg>
785                                <span>Architect-Verified</span>
786                            </span>
787                            <span class="eeat-meta-item">
788                                <span>Technical Review &amp; Architecture by</span>
789                                <a href="/about" class="font-bold text-slate-900 hover:text-[#0078D4] underline decoration-blue-200">Rohit Kumar</a>
790                            </span>
791                        </div>
792                        <div class="flex items-center gap-2">
793                            <span class="eeat-exp-pill">18+ Years Enterprise Experience</span>
794                            <span class="text-xs text-slate-500 hidden sm:inline">• M365 2026 GA Verified</span>
795                        </div>
796                    </div>
797                    <div class="eeat-credentials-strip">
798                        <span class="eeat-cred-tag">
799                            <svg class="w-3 h-3 text-[#0078D4]" fill="currentColor" viewBox="0 0 24 24"><path d="M0 0h11.377v11.377H0zM12.623 0H24v11.377H12.623zM0 12.623h11.377V24H0zM12.623 12.623H24V24H12.623z"/></svg>
800                            <span>Enterprise Administrator Expert</span>
801                        </span>
802                        <span class="eeat-cred-tag">
803                            <svg class="w-3 h-3 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 00-9.78 2.096A4.001 4.001 0 003 15z"/></svg>
804                            <span>Azure Solutions Architect</span>
805                        </span>
806                        <span class="eeat-cred-tag">
807                            <svg class="w-3 h-3 text-purple-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
807<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg>
808                            <span>Power Platform Functional Consultant</span>
809                        </span>
810                        <span class="eeat-cred-tag">
811                            <svg class="w-3 h-3 text-emerald-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>
812                            <span>150+ Tenant Migrations</span>
813                        </span>
814                    </div>
815                `;
816
817                // Insert after backlink nav strip if present, or immediately after H1
818                const backlinkNav = h1.parentNode.querySelector('.backlink-nav-strip');
819                if (backlinkNav && backlinkNav.nextSibling) {
820                    h1.parentNode.insertBefore(verifBox, backlinkNav.nextSibling);
821                } else if (h1.nextSibling) {
822                    h1.parentNode.insertBefore(verifBox, h1.nextSibling);
823                } else {
824                    h1.parentNode.appendChild(verifBox);
825                }
826            }
827        }
828
829        // 2. Inject Comprehensive Author Bio & E-E-A-T Profile Card before footer / CTA
830        if (!document.getElementById('eeat-author-bio')) {
831            const container = document.querySelector('article, .article-content, main, .container');
832            if (container) {
833                const bioCard = document.createElement('section');
834                bioCard.id = 'eeat-author-bio';
835                bioCard.className = 'eeat-author-bio-card';
836                bioCard.setAttribute('aria-label', 'About the Author and Technical Reviewer');
837                bioCard.innerHTML = `
838                    <div class="eeat-author-grid">
839                        <div class="eeat-avatar-wrapper">
840                            <div class="eeat-avatar-circle">RK</div>
841                            <h3 class="text-sm font-bold text-slate-900 leading-tight">Rohit Kumar</h3>
842                            <p class="text-[11px] text-slate-500 font-medium mt-0.5">Principal Architect</p>
843                            <span class="mt-2 inline-block px-2.5 py-0.5 bg-blue-50 text-[#004b87] border border-blue-200 text-[10px] font-bold rounded-full">18+ Yrs Exp</span>
844                        </div>
845                        <div class="space-y-3">
846                            <div>
847                                <div class="flex items-center justify-between gap-2 flex-wrap">
848                                    <h4 class="text-base font-bold text-slate-900">About the Author &amp; Enterprise Practitioner</h4>
849                                    <span class="text-xs font-semibold text-emerald-700 bg-emerald-50 px-2.5 py-1 rounded-full border border-emerald-200 flex items-center gap-1">
850                                        <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/></svg>
851                                        Verified M365 Expert
852                                    </span>
853                                </div>
854                                <p class="text-xs text-slate-600 mt-2 leading-relaxed">
855                                    <strong>Rohit Kumar</strong> is a Principal Microsoft 365 &amp; SharePoint Architect with <strong>18+ years of enterprise experience</strong> designing and deploying large-scale digital workplaces, zero-downtime tenant migrations, custom SPFx engineering, and Microsoft Purview compliance architectures. He has led transformations for Fortune 500 enterprises, healthcare systems, defense suppliers, and financial institutions.
856                                </p>
857                            </div>
858                            <div class="grid grid-cols-1 sm:grid-cols-2 gap-2 text-xs text-slate-700 bg-slate-50 p-3 rounded-lg border border-slate-200/80">
859                                <div class="flex items-center gap-2">
860                                    <span class="text-[#107C41] font-bold">✓</span>
861                                    <span><strong>150+</strong> Tenant Migrations &amp; Cutover Runs</span>
862                                </div>
863                                <div class="flex items-center gap-2">
864                                    <span class="text-[#107C41] font-bold">✓</span>
865                                    <span><strong>50TB+</strong> Mission-Critical Data Migrated</span>
866                                </div>
867                                <div class="flex items-center gap-2">
868                                    <span class="text-[#107C41] font-bold">✓</span>
869                                    <span><strong>Zero-Downtime SLA</strong> Architecture Delivery</span>
870                                </div>
871                                <div class="flex items-center gap-2">
872                                    <span class="text-[#107C41] font-bold">✓</span>
873                                    <span><strong>SOC 2 &amp; HIPAA</strong> Compliant Governance</span>
874                                </div>
875                            </div>
876                            <div class="flex flex-wrap items-center justify-between gap-3 pt-2 border-t border-slate-100">
877                                <div class="flex flex-wrap items-center gap-2">
878                                    <a href="https://linkedin.com/in/rohitkumarsharepoint" target="_blank" rel="noopener noreferrer me" class="inline-flex items-center gap-1.5 px-3 py-1.5 bg-[#0A66C2] hover:bg-[#004182] text-white rounded-md text-xs font-semibold transition-colors" aria-label="Connect with Rohit Kumar on LinkedIn (opens in a new tab)">
879                                        <svg class="w-3.5 h-3.5" viewBox="0 0 24 24" fill="currentColor"><path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"/></svg>
880                                        <span>LinkedIn Profile</span>
881                                    </a>
882                                    <a href="mailto:[email protected]" class="inline-flex items-center gap-1.5 px-3 py-1.5 bg-slate-800 hover:bg-slate-900 text-white rounded-md text-xs font-semibold transition-colors">
883                                        <svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 002-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"/></svg>
884                                        <span>Direct Advisory</span>
885                                    </a>
886                                </div>
887                                <a href="/terms-privacy#editorial-standards" class="text-xs text-slate-500 hover:text-[#0078D4] underline flex items-center gap-1">
888                                    <span>Editorial &amp; Fact-Checking Standards</span>
889                                    <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/></svg>
890                                </a>
891                            </div>
892                        </div>
893                    </div>
894                `;
895
896                // Insert before pillar-backlinks-card, or related-articles, or at end of container
897                const pillarCard = container.querySelector('.pillar-backlinks-card');
898                if (pillarCard && pillarCard.parentNode) {
899                    pillarCard.parentNode.insertBefore(bioCard, pillarCard);
900                } else {
901                    const target = document.querySelector('.related-articles, section.cta, footer, .cta-section');
902                    if (target && target.parentNode) {
903                        target.parentNode.insertBefore(bioCard, target);
904                    } else {
905                        container.appendChild(bioCard);
906                    }
907                }
908            }
909        }
910    }
911})();
912

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.