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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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.