From 4eae8538c82438f3335a0a0f3aea794ba71e36b6 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 8 Jun 2025 18:36:00 +0000 Subject: [PATCH] Backup database and code changes - 2025-06-08 18:36:00 --- .claude/settings.local.json | 6 +- .htaccess | 105 ++++++- about.php | 2 +- assets/css/main.min.css | 1 + assets/images/certificate-icon.webp | Bin 0 -> 2450 bytes assets/images/chart-icon.webp | Bin 0 -> 2536 bytes assets/images/client-gambling-commission.webp | Bin 0 -> 6322 bytes assets/images/client-gdp.webp | Bin 0 -> 1932 bytes assets/images/client-homesupply.webp | Bin 0 -> 3498 bytes assets/images/client-incite.webp | Bin 0 -> 1514 bytes assets/images/client-pragma.webp | Bin 0 -> 4652 bytes assets/images/client-replay.webp | Bin 0 -> 964 bytes assets/images/favicon-original.webp | Bin 0 -> 434 bytes assets/images/rocket-icon.webp | Bin 0 -> 2718 bytes assets/images/ukds-main-logo.webp | Bin 0 -> 4028 bytes assets/js/main.js | 71 +++++ assets/js/main.min.js | 1 + .../python-scrapy-enterprise-guide.php | 73 +++++ ..._171630.sql => db_backup_250608_183559.sql | 2 +- faq-enhanced.php | 2 +- index.php | 149 ++++++++-- offline.html | 154 ++++++++++ quote.php | 38 ++- services/data-cleaning.php | 69 ++++- sitemap-blog.xml | 271 ++++++++++++++++++ sitemap-index.xml | 22 ++ sitemap-services.xml | 99 +++++++ sw.js | 9 +- 28 files changed, 1030 insertions(+), 44 deletions(-) create mode 100644 assets/css/main.min.css create mode 100644 assets/images/certificate-icon.webp create mode 100644 assets/images/chart-icon.webp create mode 100644 assets/images/client-gambling-commission.webp create mode 100644 assets/images/client-gdp.webp create mode 100644 assets/images/client-homesupply.webp create mode 100644 assets/images/client-incite.webp create mode 100644 assets/images/client-pragma.webp create mode 100644 assets/images/client-replay.webp create mode 100644 assets/images/favicon-original.webp create mode 100644 assets/images/rocket-icon.webp create mode 100644 assets/images/ukds-main-logo.webp create mode 100644 assets/js/main.min.js rename db_backup_250608_171630.sql => db_backup_250608_183559.sql (99%) create mode 100644 offline.html create mode 100644 sitemap-blog.xml create mode 100644 sitemap-index.xml create mode 100644 sitemap-services.xml diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 742a15e..48dbd2f 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -26,7 +26,11 @@ "Bash(then echo \"✓ $file - EXISTS\")", "Bash(else echo \"✗ $file - MISSING\")", "Bash(fi)", - "Bash(done)" + "Bash(done)", + "Bash(sudo apt-get:*)", + "Bash(sudo apt-get install:*)", + "Bash(npm install:*)", + "Bash(terser:*)" ], "deny": [] } diff --git a/.htaccess b/.htaccess index bed900b..42f4e33 100644 --- a/.htaccess +++ b/.htaccess @@ -26,14 +26,109 @@ Header always set Referrer-Policy "strict-origin-when-cross-origin" -# Basic compression (if mod_deflate is available) +# Enhanced Gzip compression - AddOutputFilterByType DEFLATE text/plain - AddOutputFilterByType DEFLATE text/html - AddOutputFilterByType DEFLATE text/css - AddOutputFilterByType DEFLATE application/javascript + # Enable compression for all text-based files + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript + AddOutputFilterByType DEFLATE application/javascript application/x-javascript + AddOutputFilterByType DEFLATE application/xml application/xhtml+xml application/rss+xml + AddOutputFilterByType DEFLATE application/json application/ld+json + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE font/ttf font/otf font/eot font/woff font/woff2 + + # Remove browser bugs for older browsers + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + Header append Vary User-Agent +# Enable Brotli compression if available + + AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript + AddOutputFilterByType BROTLI_COMPRESS application/javascript application/x-javascript + AddOutputFilterByType BROTLI_COMPRESS application/xml application/xhtml+xml application/rss+xml + AddOutputFilterByType BROTLI_COMPRESS application/json application/ld+json + AddOutputFilterByType BROTLI_COMPRESS image/svg+xml + AddOutputFilterByType BROTLI_COMPRESS font/ttf font/otf font/woff font/woff2 + + +# Browser Caching Headers + + ExpiresActive On + + # Images - 1 year + ExpiresByType image/jpeg "access plus 1 year" + ExpiresByType image/jpg "access plus 1 year" + ExpiresByType image/gif "access plus 1 year" + ExpiresByType image/png "access plus 1 year" + ExpiresByType image/webp "access plus 1 year" + ExpiresByType image/svg+xml "access plus 1 year" + ExpiresByType image/x-icon "access plus 1 year" + ExpiresByType image/ico "access plus 1 year" + + # Fonts - 1 year + ExpiresByType font/ttf "access plus 1 year" + ExpiresByType font/otf "access plus 1 year" + ExpiresByType font/woff "access plus 1 year" + ExpiresByType font/woff2 "access plus 1 year" + ExpiresByType application/font-woff "access plus 1 year" + ExpiresByType application/font-woff2 "access plus 1 year" + + # CSS and JavaScript - 1 month + ExpiresByType text/css "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType text/javascript "access plus 1 month" + ExpiresByType application/x-javascript "access plus 1 month" + + # HTML and PHP - 1 hour + ExpiresByType text/html "access plus 1 hour" + ExpiresByType application/xhtml+xml "access plus 1 hour" + + # Data - no cache + ExpiresByType application/json "access plus 0 seconds" + ExpiresByType application/xml "access plus 0 seconds" + ExpiresByType text/xml "access plus 0 seconds" + + # Default - 1 week + ExpiresDefault "access plus 1 week" + + +# Cache-Control Headers + + # Static assets - 1 year + + Header set Cache-Control "max-age=31536000, public, immutable" + + + # CSS and JS - 1 month + + Header set Cache-Control "max-age=2592000, public" + + + # HTML/PHP - 1 hour + + Header set Cache-Control "max-age=3600, public, must-revalidate" + + + # Keep-alive + Header set Connection keep-alive + + +# HTTP/2 Server Push + + # Push critical resources + + Header add Link "; rel=preload; as=style" + Header add Link "; rel=preload; as=image" + Header add Link "; rel=preload; as=script" + + + +# ETags +FileETag None +Header unset ETag + # Disable directory browsing Options -Indexes diff --git a/about.php b/about.php index cceb413..23a0721 100644 --- a/about.php +++ b/about.php @@ -199,7 +199,7 @@ $canonical_url = "https://ukdataservices.co.uk/about.php";
-

About UK Data Services

+

About UK Data Services - Expert Web Scraping & Business Intelligence

Your trusted partner for professional data solutions since 2018

diff --git a/assets/css/main.min.css b/assets/css/main.min.css new file mode 100644 index 0000000..8d546d5 --- /dev/null +++ b/assets/css/main.min.css @@ -0,0 +1 @@ +*{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}body{font-family:'Roboto Slab',Lato,sans-serif;line-height:1.6;color:#444;background-color:#fff}.container{max-width:1200px;margin:0 auto;padding:0 20px}.btn{display:inline-block;padding:14px 28px;border:none;border-radius:8px;text-decoration:none;font-weight:500;font-size:16px;text-align:center;cursor:pointer;transition:all .3s ease;box-shadow:0 2px 8px rgba(0,0,0,.1);font-family:inherit;line-height:1.4;white-space:nowrap;min-height:48px;display:inline-flex;align-items:center;justify-content:center}.btn-primary{background:#179e83;color:#fff!important;text-decoration:none!important}.btn-primary:hover{transform:translateY(-2px);background:#11725e;box-shadow:0 4px 16px rgba(23,158,131,.3);color:#fff!important;text-decoration:none!important}.btn-secondary{background:#fff;color:#144784!important;border:2px solid #144784;text-decoration:none!important}.btn-secondary:hover{background:#144784;color:#fff!important;transform:translateY(-2px);text-decoration:none!important}.btn-full{width:100%}.highlight{background:linear-gradient(135deg,#179e83,#1bbc9b);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.section-header{text-align:center;margin-bottom:60px}.section-header h2{font-size:2.5rem;font-weight:600;margin-bottom:16px;color:#1a1a1a}.section-header p{font-size:1.2rem;color:#666;max-width:600px;margin:0 auto}.navbar{position:fixed;top:0;width:100%;background:rgba(255,255,255,.95);backdrop-filter:blur(10px);border-bottom:1px solid rgba(0,0,0,.1);z-index:1000;transition:all .3s ease}.navbar.scrolled{background:rgba(255,255,255,.98);box-shadow:0 2px 20px rgba(0,0,0,.1)}.nav-container{max-width:1200px;margin:0 auto;padding:0 20px;display:flex;justify-content:space-between;align-items:center;height:70px}.nav-logo img{height:40px;width:auto}.nav-menu{display:flex;align-items:center;gap:30px}.nav-link{text-decoration:none;color:#1a1a1a;font-weight:500;transition:color .3s ease}.nav-link:hover{color:#144784}.nav-link.cta-button{background:#179e83;color:#fff;padding:10px 20px;border-radius:6px;transition:all .3s ease}.nav-link.cta-button:hover{transform:translateY(-2px);background:#11725e;box-shadow:0 4px 16px rgba(23,158,131,.3)}.nav-toggle{display:none;flex-direction:column;cursor:pointer}.bar{width:25px;height:3px;background:#1a1a1a;margin:3px 0;transition:.3s}.hero{padding:120px 0 80px;background:linear-gradient(135deg,#252d3b 0,#144784 100%);min-height:100vh;display:flex;align-items:center;color:#fff;position:relative;overflow:hidden}.hero::before{content:'';position:absolute;top:0;right:0;width:50%;height:100%;background:url('data:image/svg+xml,') no-repeat center;background-size:contain;animation:float 6s ease-in-out infinite}@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-20px)}}.hero-container{max-width:1200px;margin:0 auto;padding:0 20px;display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center}.hero-content{animation:fadeInUp 1s ease}.hero-title{font-size:3.5rem;font-weight:700;line-height:1.2;margin-bottom:24px;color:#fff}.hero-subtitle{font-size:1.3rem;color:#fff;margin-bottom:40px;line-height:1.6;opacity:.9}.hero-buttons{display:flex;gap:20px;margin-bottom:60px}.hero-stats{display:flex;gap:40px}.stat{text-align:center}.stat-number{display:block;font-size:2rem;font-weight:700;color:#fff}.stat-label{display:block;font-size:.9rem;color:#fff;font-weight:500}.hero-image{animation:fadeInRight 1s ease;position:relative;z-index:2}.hero-graphic{width:100%;height:auto;max-width:500px;animation:float 6s ease-in-out infinite}.hero-graphic svg{width:100%;height:auto;filter:drop-shadow(0 10px 30px rgba(0, 0, 0, .1))}.hero-graphic .bg-circle-1{animation:rotate 20s linear infinite;transform-origin:center}.hero-graphic .bg-circle-2{animation:rotate 15s linear infinite reverse;transform-origin:center}.hero-graphic .browser-main{animation:pulse 4s ease-in-out infinite}.hero-graphic .database{animation:pulse 6s ease-in-out infinite}.hero-graphic .dashboard{animation:pulse 5s ease-in-out infinite}.hero-graphic .chart-bar-1{animation:grow-bar 3s ease-in-out infinite}.hero-graphic .chart-bar-2{animation:grow-bar 3s ease-in-out infinite .5s}.hero-graphic .chart-bar-3{animation:grow-bar 3s ease-in-out infinite 1s}.hero-graphic .chart-bar-4{animation:grow-bar 3s ease-in-out infinite 1.5s}.hero-graphic .chart-bar-5{animation:grow-bar 3s ease-in-out infinite 2s}.hero-graphic .extraction-path{stroke-dasharray:200;stroke-dashoffset:200;animation:draw-line 4s ease-in-out infinite}@keyframes rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes grow-bar{0%,100%{transform:scaleY(1)}50%{transform:scaleY(1.3)}}@keyframes draw-line{0%{stroke-dashoffset:200}50%{stroke-dashoffset:0}100%{stroke-dashoffset:-200}}@keyframes data-pulse{0%,100%{opacity:.7;transform:scale(1)}50%{opacity:1;transform:scale(1.1)}}.hero-img{width:100%;height:auto;max-width:500px}.services{padding:100px 0;background:#fff}.services-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(350px,1fr));gap:30px}.service-card{background:#fff;padding:40px;border-radius:16px;box-shadow:0 4px 20px rgba(0,0,0,.08);transition:all .3s ease;border:1px solid #f0f0f0}.service-card:hover{transform:translateY(-8px);box-shadow:0 8px 40px rgba(0,0,0,.12)}.service-icon{width:60px;height:60px;margin-bottom:24px}.service-icon img{width:100%;height:100%}.service-card h3{font-size:1.5rem;font-weight:600;margin-bottom:16px;color:#1a1a1a}.service-card p{color:#666;margin-bottom:20px;line-height:1.6}.service-card ul{list-style:none}.service-card li{padding:8px 0;color:#555;position:relative;padding-left:20px}.service-card li:before{content:'✓';position:absolute;left:0;color:#179e83;font-weight:700}.process{padding:100px 0;background:#f8f9fa}.process-steps{max-width:800px;margin:0 auto}.step{display:flex;align-items:flex-start;margin-bottom:50px;animation:fadeInUp .6s ease}.step:last-child{margin-bottom:0}.step-number{background:#179e83;color:#fff;width:60px;height:60px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1.2rem;margin-right:30px;flex-shrink:0}.step-content h3{font-size:1.4rem;font-weight:600;margin-bottom:12px;color:#1a1a1a}.step-content p{color:#666;line-height:1.6}.why-us{padding:100px 0;background:#fff}.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:40px}.feature{text-align:center;padding:30px;animation:fadeInUp .6s ease}.feature-icon{width:80px;height:80px;margin:0 auto 24px}.feature-icon img{width:100%;height:100%}.feature h3{font-size:1.3rem;font-weight:600;margin-bottom:16px;color:#1a1a1a}.feature p{color:#666;line-height:1.6}.contact{padding:100px 0;background:#f8f9fa}.contact-content{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:start}.contact-info h2{font-size:2.5rem;font-weight:600;margin-bottom:20px;color:#1a1a1a}.contact-info p{font-size:1.2rem;color:#666;margin-bottom:40px;line-height:1.6}.contact-details{display:flex;flex-direction:column;gap:30px}.contact-item{display:flex;align-items:center;gap:20px}.contact-item img{width:40px;height:40px}.contact-item strong{display:block;font-weight:600;color:#1a1a1a;margin-bottom:4px}.contact-item p{margin:0;color:#666}.contact-item a{color:#179e83;text-decoration:none}.contact-item a:hover{text-decoration:underline}.contact-form{background:#fff;padding:40px;border-radius:16px;box-shadow:0 4px 20px rgba(0,0,0,.08)}.form-group{margin-bottom:24px}.form-group label{display:block;font-weight:500;margin-bottom:8px;color:#1a1a1a}.form-group input,.form-group select,.form-group textarea{width:100%;padding:14px 16px;border:2px solid #e1e5e9;border-radius:8px;font-size:16px;transition:border-color .3s ease;background:#fff}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{outline:0;border-color:#179e83;box-shadow:0 0 0 3px rgba(23,158,131,.1)}.form-group textarea{resize:vertical;min-height:120px}.footer{background:#151f25;color:#fff;padding:60px 0 30px}.footer-content{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:40px;margin-bottom:40px}.footer-section h3{font-size:1.2rem;font-weight:600;margin-bottom:20px;color:#fff}.footer-section ul{list-style:none}.footer-section li{margin-bottom:12px}.footer-section a{color:#ccc;text-decoration:none;transition:color .3s ease}.footer-section a:hover{color:#179e83}.footer-logo img{height:40px;margin-bottom:20px}.footer-section p{color:#ccc;line-height:1.6}.footer-bottom{border-top:1px solid #333;padding-top:30px;display:flex;justify-content:space-between;align-items:center}.social-links{display:flex;gap:20px}.social-links a{display:block;width:40px;height:40px}.social-links img{width:100%;height:100%;filter:invert(1);transition:filter .3s ease}.social-links a:hover img{filter:invert(.7) sepia(1) saturate(2) hue-rotate(240deg)}@keyframes fadeInUp{from{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeInRight{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:translateX(0)}}@keyframes fadeInLeft{from{opacity:0;transform:translateX(-30px)}to{opacity:1;transform:translateX(0)}}@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-20px)}}@keyframes pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.05)}}@keyframes slideInFromBottom{from{opacity:0;transform:translateY(50px)}to{opacity:1;transform:translateY(0)}}.animate-on-scroll{opacity:0;transform:translateY(30px);transition:all .8s ease-out}.animate-on-scroll.animated{opacity:1;transform:translateY(0)}.service-card{animation:slideInFromBottom .6s ease-out forwards;animation-delay:var(--animation-delay, 0s)}.feature{animation:fadeInUp .6s ease-out forwards;animation-delay:var(--animation-delay, 0s)}.step{animation:fadeInLeft .6s ease-out forwards;animation-delay:var(--animation-delay, 0s)}@media (max-width:768px){.featured-grid{grid-template-columns:1fr}.featured-article.main-feature{grid-row:span 1}.articles-grid{grid-template-columns:1fr}.newsletter-form .form-group{flex-direction:column}.article-title{font-size:2.2rem}.article-author{flex-direction:column;text-align:center;gap:15px}.blog-categories h2,.blog-featured h2,.blog-recent h2{font-size:2rem}}@media (max-width:768px){.nav-menu{position:fixed;left:-100%;top:70px;flex-direction:column;background-color:#fff;width:100%;text-align:center;transition:.3s;box-shadow:0 10px 27px rgba(0,0,0,.05);padding:40px 0;gap:20px}.nav-menu.active{left:0}.nav-toggle{display:flex}.nav-toggle.active .bar:nth-child(2){opacity:0}.nav-toggle.active .bar:first-child{transform:translateY(8px) rotate(45deg)}.nav-toggle.active .bar:nth-child(3){transform:translateY(-8px) rotate(-45deg)}.hero-container{grid-template-columns:1fr;gap:40px;text-align:center}.hero-title{font-size:2.5rem}.hero-buttons{flex-direction:column;align-items:center}.hero-stats{justify-content:center;gap:30px}.section-header h2{font-size:2rem}.services-grid{grid-template-columns:1fr}.features-grid{grid-template-columns:1fr}.contact-content{grid-template-columns:1fr;gap:40px}.footer-content{grid-template-columns:1fr;gap:30px;text-align:center}.footer-bottom{flex-direction:column;gap:20px;text-align:center}}@media (max-width:480px){.container{padding:0 15px}.hero{padding:100px 0 60px}.hero-title{font-size:2rem}.hero-subtitle{font-size:1.1rem}.btn{padding:12px 24px;font-size:14px}.contact-form,.service-card{padding:30px 20px}.step{flex-direction:column;text-align:center}.step-number{margin:0 0 20px 0}}img{max-width:100%;height:auto;loading:lazy}.logo{height:auto;max-height:50px;width:auto}.footer-logo img{height:40px;width:auto}.loading{opacity:.6;pointer-events:none}.blog-categories{padding:80px 0;background:#f8f9fa}.blog-categories h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.blog-featured{padding:80px 0;background:#fff}.blog-featured h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.featured-grid{display:grid;grid-template-columns:2fr 1fr 1fr;gap:30px}.featured-article{background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 4px 20px rgba(0,0,0,.08);border:1px solid #f0f0f0;transition:all .3s ease}.featured-article:hover{transform:translateY(-5px);box-shadow:0 8px 40px rgba(0,0,0,.12)}.featured-article.main-feature{grid-row:span 2}.featured-article .article-image{height:200px;overflow:hidden}.featured-article.main-feature .article-image{height:300px}.featured-article .article-image img{width:100%;height:100%;object-fit:cover;transition:transform .3s ease}.featured-article:hover .article-image img{transform:scale(1.05)}.featured-article .article-content{padding:30px}.article-meta{display:flex;align-items:center;gap:15px;margin-bottom:15px;font-size:14px}.article-meta .category{background:#179e83;color:#fff;padding:5px 12px;border-radius:15px;font-weight:500;text-decoration:none}.article-meta time{color:#666;font-weight:500}.article-meta .read-time{color:#666;font-weight:500}.featured-article h3{font-size:1.4rem;font-weight:600;margin-bottom:15px;line-height:1.3}.featured-article h3 a{color:#1a1a1a;text-decoration:none;transition:color .3s ease}.featured-article h3 a:hover{color:#179e83}.featured-article p{color:#666;line-height:1.6;margin-bottom:20px}.article-footer{display:flex;justify-content:space-between;align-items:center;border-top:1px solid #f0f0f0;padding-top:15px;margin-top:15px}.article-footer .read-more{color:#179e83;text-decoration:none;font-weight:500;transition:color .3s ease}.article-footer .read-more:hover{color:#144784;text-decoration:underline}.blog-recent{padding:80px 0;background:#f8f9fa}.blog-recent h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.articles-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(350px,1fr));gap:30px;margin-bottom:50px}.article-card{background:#fff;padding:30px;border-radius:12px;box-shadow:0 4px 20px rgba(0,0,0,.08);border:1px solid #f0f0f0;transition:all .3s ease}.article-card:hover{transform:translateY(-5px);box-shadow:0 8px 40px rgba(0,0,0,.12)}.article-card h3{font-size:1.3rem;font-weight:600;margin-bottom:15px;line-height:1.3}.article-card h3 a{color:#1a1a1a;text-decoration:none;transition:color .3s ease}.article-card h3 a:hover{color:#179e83}.article-card p{color:#666;line-height:1.6;margin-bottom:20px}.blog-pagination{display:flex;justify-content:center;align-items:center;gap:20px;margin-top:40px}.pagination-info{color:#666;font-weight:500}.blog-newsletter{padding:80px 0;background:linear-gradient(135deg,#144784 0,#179e83 100%);color:#fff;text-align:center}.newsletter-content h2{font-size:2.5rem;font-weight:600;margin-bottom:20px;color:#fff}.newsletter-content p{font-size:1.2rem;margin-bottom:40px;opacity:.95;max-width:600px;margin-left:auto;margin-right:auto}.newsletter-form .form-group{display:flex;max-width:500px;margin:0 auto 20px;gap:15px}.newsletter-form input{flex:1;padding:15px 20px;border:none;border-radius:50px;font-size:16px;background:rgba(255,255,255,.95);color:#333}.newsletter-form .btn{padding:15px 30px;border-radius:50px;white-space:nowrap}.newsletter-privacy{font-size:14px;opacity:.8;max-width:400px;margin:0 auto}.newsletter-privacy a{color:#fff;text-decoration:underline}.blog-article{padding:40px 0 80px;background:#fff;position:relative;clear:both;width:100%}.blog-article .container{max-width:1200px;margin:0 auto;padding:0 20px;position:relative}.article-header{max-width:800px;margin:0 auto 40px;text-align:center}.article-title{font-size:3rem;font-weight:700;margin-bottom:20px;color:#1a1a1a;line-height:1.2}.article-subtitle{font-size:1.3rem;color:#666;margin-bottom:30px;line-height:1.6}.article-author{display:flex;justify-content:space-between;align-items:center;margin-top:30px;text-align:left}.author-info strong{color:#1a1a1a;font-weight:600;display:block;margin-bottom:5px}.author-info p{color:#666;margin:0;font-size:14px}.article-share a{color:#179e83;text-decoration:none;font-weight:500;padding:8px 16px;border:1px solid #179e83;border-radius:6px;transition:all .3s ease}.article-share a:hover{background:#179e83;color:#fff}.article-image{max-width:1000px;margin:0 auto 40px;border-radius:16px;overflow:hidden;box-shadow:0 8px 40px rgba(0,0,0,.12)}.article-image img{width:100%;height:auto;display:block}.article-toc{max-width:800px;margin:0 auto 40px;background:#f8f9fa;padding:30px;border-radius:12px;border:1px solid #e1e5e9}.article-toc h2{font-size:1.3rem;font-weight:600;margin-bottom:20px;color:#1a1a1a}.article-toc ol{list-style:none;counter-reset:toc-counter}.article-toc li{counter-increment:toc-counter;margin-bottom:10px}.article-toc li::before{content:counter(toc-counter) ". ";color:#179e83;font-weight:600}.article-toc a{color:#144784;text-decoration:none;font-weight:500;transition:color .3s ease}.article-toc a:hover{color:#179e83;text-decoration:underline}.article-content{max-width:800px;margin:0 auto;line-height:1.7;background:#fff;position:relative;z-index:1}.article-content pre{background:#f8f9fa;border:1px solid #e9ecef;border-radius:8px;padding:0;margin:25px 0;overflow-x:auto;position:relative}.article-content pre code{display:block;background:0 0;border:none;border-radius:0;padding:20px;font-family:Monaco,Menlo,'Ubuntu Mono',Consolas,'Courier New',monospace;font-size:14px;line-height:1.6;color:#495057;white-space:pre;overflow-x:auto;margin:0}.article-content code{background:#f1f3f4;padding:2px 6px;border-radius:4px;font-family:Monaco,Menlo,'Ubuntu Mono',Consolas,'Courier New',monospace;font-size:.9em;color:#d63384}.article-content pre code{background:0 0;padding:20px;color:#495057}.article-content pre{position:relative;cursor:pointer}.article-content pre:hover::before{content:'📋 Copy';position:absolute;top:10px;right:10px;background:#179e83;color:#fff;padding:5px 10px;border-radius:4px;font-size:12px;cursor:pointer;z-index:10}.article-content pre[data-copied]:hover::before{content:'✅ Copied!';background:#10b981}.article-content pre:hover{border-color:#179e83;box-shadow:0 2px 8px rgba(23,158,131,.1)}.article-content h2{font-size:2rem;font-weight:600;margin:40px 0 20px;color:#1a1a1a;border-bottom:2px solid #179e83;padding-bottom:10px}.article-content h3{font-size:1.5rem;font-weight:600;margin:30px 0 15px;color:#144784}.article-content p{margin-bottom:20px;color:#444}.article-content ol,.article-content ul{margin-bottom:20px;padding-left:25px}.article-content li{margin-bottom:8px;color:#444}.article-content a{color:#179e83;text-decoration:underline;transition:color .3s ease}.article-content a:hover{color:#144784}.callout-box{background:#f8f9fa;border-left:4px solid #179e83;padding:20px;margin:30px 0;border-radius:0 8px 8px 0}.callout-box.legal-warning{background:#fff3cd;border-left-color:#f59e0b}.callout-box h3{margin-top:0;margin-bottom:15px;color:#1a1a1a}.comparison-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px;margin:30px 0;width:100%;clear:both}.comparison-item{background:#fff;padding:25px;border-radius:12px;border:1px solid #e1e5e9;box-shadow:0 2px 8px rgba(0,0,0,.05)}.comparison-item h4{margin-bottom:15px;color:#144784;font-size:1.2rem}.best-practice-box{background:linear-gradient(135deg,#e8f5f3 0,#f0f9ff 100%);border:1px solid #179e83;border-radius:12px;padding:25px;margin:30px 0}.best-practice-box h3{margin-top:0;color:#144784}img{height:auto;max-width:100%}img[loading=lazy]{opacity:0;transition:opacity .3s ease}img[loading=lazy].loaded{opacity:1}picture img{width:100%;height:auto}a:focus-visible,button:focus-visible,input:focus-visible,textarea:focus-visible{outline:2px solid #179e83;outline-offset:2px;box-shadow:0 0 0 4px rgba(23,158,131,.1)}.reading-progress{position:fixed;top:70px;left:0;width:0%;height:3px;background:linear-gradient(90deg,#179e83,#144784);z-index:999;transition:width .3s ease}.category-link{background:#179e83;color:#fff!important;padding:5px 12px;border-radius:15px;font-weight:500;text-decoration:none;transition:background .3s ease}.category-link:hover{background:#144784;color:#fff!important;text-decoration:none}.loading::after{content:'';position:absolute;top:50%;left:50%;width:20px;height:20px;margin:-10px 0 0 -10px;border:2px solid #f3f3f3;border-top:2px solid #179e83;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.notification{position:fixed;top:20px;right:20px;z-index:10000;max-width:400px;padding:16px 20px;border-radius:8px;color:#fff;font-family:'Roboto Slab',sans-serif;font-size:14px;box-shadow:0 4px 12px rgba(0,0,0,.15);transition:all .3s ease}.notification-success{background:#10b981}.notification-error{background:#ef4444}.notification-info{background:#3b82f6}.notification-content{display:flex;justify-content:space-between;align-items:center;gap:12px}.notification-close{background:0 0;border:none;color:#fff;font-size:18px;cursor:pointer;padding:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center}.scroll-top-btn{position:fixed;bottom:30px;right:30px;width:50px;height:50px;border:none;border-radius:50%;background:linear-gradient(135deg,#179e83 0,#144784 100%);color:#fff;font-size:20px;cursor:pointer;opacity:0;visibility:hidden;transition:all .3s ease;z-index:1000;box-shadow:0 4px 12px rgba(0,0,0,.15)}.scroll-top-btn:hover{transform:translateY(-3px);box-shadow:0 6px 20px rgba(0,0,0,.2)}.tooltip{position:absolute;background:#1a1a1a;color:#fff;padding:8px 12px;border-radius:6px;font-size:14px;white-space:nowrap;z-index:10000;pointer-events:none;transition:opacity .3s ease}.form-group.error input,.form-group.error select,.form-group.error textarea{border-color:#ef4444;box-shadow:0 0 0 3px rgba(239,68,68,.1)}.form-group.success input,.form-group.success select,.form-group.success textarea{border-color:#10b981;box-shadow:0 0 0 3px rgba(16,185,129,.1)}.form-error-message{color:#ef4444;font-size:12px;margin-top:4px;display:block}img.loading{background:#f0f0f0;opacity:.7}img.loaded{transition:opacity .3s ease;opacity:1}.btn{position:relative;overflow:hidden}.btn::before{content:'';position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);transition:left .5s}.btn:hover::before{left:100%}@media print{.footer,.navbar,.notification,.scroll-top-btn{display:none!important}.hero{background:#fff!important;color:#000!important}.page-hero,.service-hero{background:#fff!important;color:#000!important}body{font-size:12pt;line-height:1.4}h1,h2,h3,h4,h5,h6{color:#000!important;page-break-after:avoid}.container{max-width:none;margin:0;padding:0}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}a:focus,button:focus,input:focus,select:focus,textarea:focus{outline:2px solid #179e83;outline-offset:2px}@media (prefers-contrast:high){.btn-primary{background:#000;border:2px solid #000}.highlight{background:#000;-webkit-background-clip:text;-webkit-text-fill-color:transparent}}@media (prefers-reduced-motion:reduce){*,::after,::before{animation-duration:0s!important;animation-iteration-count:1!important;transition-duration:0s!important;scroll-behavior:auto!important}}@media (prefers-color-scheme:dark){:root{--bg-primary:#1a1a1a;--bg-secondary:#2d2d2d;--text-primary:#ffffff;--text-secondary:#cccccc}}.btn:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid #179e83;outline-offset:2px;box-shadow:0 0 0 4px rgba(23,158,131,.1)}.skip-to-content{position:absolute;top:-40px;left:6px;background:#179e83;color:#fff;padding:8px;border-radius:4px;text-decoration:none;z-index:100000;transition:top .3s}.skip-to-content:focus{top:6px}.visually-hidden{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.error-container{position:relative}.form-group{position:relative}.form-group label{transition:all .3s ease}.form-group input:focus+label,.form-group select:focus+label,.form-group textarea:focus+label{color:#179e83}.status-indicator{display:inline-block;width:12px;height:12px;border-radius:50%;margin-right:8px}.status-online{background:#10b981;box-shadow:0 0 0 2px rgba(16,185,129,.3);animation:pulse-green 2s infinite}.status-offline{background:#ef4444}.status-pending{background:#f59e0b;animation:pulse-yellow 2s infinite}@keyframes pulse-green{0%{box-shadow:0 0 0 0 rgba(16,185,129,.7)}70%{box-shadow:0 0 0 6px rgba(16,185,129,0)}100%{box-shadow:0 0 0 0 rgba(16,185,129,0)}}@keyframes pulse-yellow{0%{box-shadow:0 0 0 0 rgba(245,158,11,.7)}70%{box-shadow:0 0 0 6px rgba(245,158,11,0)}100%{box-shadow:0 0 0 0 rgba(245,158,11,0)}}.breadcrumb{background:#f8f9fa;padding:20px 0;border-bottom:1px solid #e1e5e9}.breadcrumb nav{max-width:1200px;margin:0 auto;padding:0 20px}.breadcrumb ol{display:flex;list-style:none;margin:0;padding:0;align-items:center;gap:8px}.breadcrumb li{display:flex;align-items:center}.breadcrumb li:not(:last-child)::after{content:'>';margin-left:8px;color:#666;font-weight:500}.breadcrumb a{color:#179e83;text-decoration:none;font-weight:500;transition:color .3s ease}.breadcrumb a:hover{color:#144784;text-decoration:underline}.breadcrumb li[aria-current=page] span{color:#666;font-weight:500}.page-hero{background:linear-gradient(135deg,#144784 0,#179e83 100%);color:#fff;padding:120px 0 80px;text-align:center;position:relative;overflow:hidden}.page-hero::before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:url('data:image/svg+xml,') no-repeat bottom;background-size:cover}.page-hero .hero-content{position:relative;z-index:2;max-width:800px;margin:0 auto}.page-hero h1{font-size:3rem;font-weight:700;margin-bottom:20px;color:#fff;line-height:1.2}.page-hero .hero-subtitle{font-size:1.25rem;margin-bottom:30px;opacity:.95;line-height:1.6}.page-hero .hero-stats{display:flex;justify-content:center;gap:40px;margin-top:40px}.page-hero .hero-search{max-width:500px;margin:30px auto 0;position:relative}.page-hero .hero-search input{width:100%;padding:15px 50px 15px 20px;border:none;border-radius:50px;font-size:16px;background:rgba(255,255,255,.95);color:#333}.page-hero .hero-search button{position:absolute;right:15px;top:50%;transform:translateY(-50%);background:0 0;border:none;font-size:18px;cursor:pointer;color:#666}.service-hero{background:linear-gradient(135deg,#144784 0,#179e83 100%);color:#fff;padding:120px 0 80px;text-align:center;position:relative}.service-hero .hero-content{max-width:900px;margin:0 auto}.service-hero h1{font-size:3rem;font-weight:700;margin-bottom:20px;line-height:1.2}.service-hero .hero-subtitle{font-size:1.25rem;margin-bottom:40px;opacity:.95;line-height:1.6}.service-hero .hero-stats{display:flex;justify-content:center;gap:40px;margin:40px 0}.service-hero .hero-cta{display:flex;justify-content:center;gap:20px;flex-wrap:wrap}.service-features{padding:80px 0;background:#f8f9fa}.service-features h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.service-features .features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(350px,1fr));gap:30px;max-width:1200px;margin:0 auto}.feature-card{background:#fff;padding:40px;border-radius:16px;box-shadow:0 4px 20px rgba(0,0,0,.08);transition:all .3s ease;border:1px solid #f0f0f0}.feature-card:hover{transform:translateY(-8px);box-shadow:0 8px 40px rgba(0,0,0,.12)}.feature-card .feature-icon{font-size:3rem;margin-bottom:20px;display:block}.feature-card h3{font-size:1.5rem;font-weight:600;margin-bottom:16px;color:#1a1a1a}.feature-card p{color:#666;margin-bottom:20px;line-height:1.6}.feature-card ul{list-style:none;padding:0}.feature-card li{padding:8px 0;color:#555;position:relative;padding-left:20px}.feature-card li:before{content:'✓';position:absolute;left:0;color:#179e83;font-weight:700}.industries{padding:80px 0;background:#fff}.industries h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.industries-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:30px;max-width:1200px;margin:0 auto}.industry-card{background:#f8f9fa;padding:30px;border-radius:12px;transition:all .3s ease;border:1px solid #e1e5e9}.industry-card:hover{transform:translateY(-5px);box-shadow:0 8px 25px rgba(0,0,0,.1);background:#fff}.industry-card h3{font-size:1.3rem;font-weight:600;margin-bottom:12px;color:#144784}.industry-card p{color:#666;line-height:1.6}.pricing{padding:80px 0;background:#f8f9fa}.pricing h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.pricing-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:30px;max-width:1000px;margin:0 auto}.pricing-card{background:#fff;padding:40px 30px;border-radius:16px;text-align:center;position:relative;border:2px solid #e1e5e9;transition:all .3s ease}.pricing-card.featured{border-color:#179e83;transform:scale(1.05);box-shadow:0 8px 40px rgba(23,158,131,.15)}.pricing-card.featured::before{content:'Most Popular';position:absolute;top:-12px;left:50%;transform:translateX(-50%);background:#179e83;color:#fff;padding:8px 20px;border-radius:20px;font-size:14px;font-weight:600}.pricing-card h3{font-size:1.5rem;font-weight:600;margin-bottom:20px;color:#1a1a1a}.pricing-card .price{font-size:3rem;font-weight:700;color:#179e83;margin-bottom:30px;line-height:1}.pricing-card .price span{font-size:1rem;color:#666;font-weight:400}.pricing-card ul{list-style:none;padding:0;margin-bottom:30px}.pricing-card li{padding:10px 0;color:#666;border-bottom:1px solid #f0f0f0}.pricing-card li:last-child{border-bottom:none}.pricing-card .pricing-note{font-size:14px;color:#999;margin-top:20px;font-style:italic}.pricing-cta{text-align:center;margin-top:50px}.faq{padding:80px 0;background:#fff}.faq h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.faq-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:30px;max-width:1200px;margin:0 auto}.faq-item{background:#f8f9fa;border-radius:12px;overflow:hidden;border:1px solid #e1e5e9}.faq-item h3{background:#144784;color:#fff;padding:20px;margin:0;font-size:1.2rem;font-weight:600}.faq-item p{padding:20px;margin:0;color:#666;line-height:1.6}.faq-categories{padding:60px 0;background:#fff}.categories-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:30px;max-width:1200px;margin:0 auto}.category-card{background:#f8f9fa;padding:30px;border-radius:12px;text-align:center;text-decoration:none;color:inherit;transition:all .3s ease;border:1px solid #e1e5e9}.category-card:hover{transform:translateY(-5px);background:#fff;box-shadow:0 8px 25px rgba(0,0,0,.1);color:inherit;text-decoration:none}.category-icon{font-size:3rem;margin-bottom:20px;display:block}.category-card h3{font-size:1.3rem;font-weight:600;margin-bottom:12px;color:#144784}.category-card p{color:#666;line-height:1.4;margin:0}.faq-content{padding:60px 0;background:#f8f9fa}.faq-section{max-width:1000px;margin:0 auto 60px}.faq-section h2{font-size:2rem;font-weight:600;margin-bottom:40px;color:#1a1a1a;border-bottom:3px solid #179e83;padding-bottom:10px}.faq-question{width:100%;background:#fff;border:none;padding:20px;text-align:left;cursor:pointer;display:flex;justify-content:space-between;align-items:center;font-size:1.1rem;font-weight:600;color:#1a1a1a;border-radius:8px;margin-bottom:2px;transition:all .3s ease;box-shadow:0 2px 4px rgba(0,0,0,.05)}.faq-question:hover{background:#f8f9fa;transform:translateX(5px)}.faq-question[aria-expanded=true]{background:#179e83;color:#fff}.faq-icon{font-size:1.5rem;font-weight:700;transition:transform .3s ease}.faq-question[aria-expanded=true] .faq-icon{transform:rotate(45deg)}.faq-answer{display:none;background:#fff;padding:20px;border-radius:0 0 8px 8px;border-top:1px solid #e1e5e9;margin-bottom:20px}.faq-answer p{margin-bottom:15px;color:#666;line-height:1.6}.faq-answer ul{margin-left:20px;margin-bottom:15px}.faq-answer li{margin-bottom:8px;color:#666;line-height:1.5}.faq-cta{padding:80px 0;background:linear-gradient(135deg,#144784 0,#179e83 100%);color:#fff;text-align:center}.faq-cta h2{font-size:2.5rem;font-weight:600;margin-bottom:20px;color:#fff}.faq-cta p{font-size:1.2rem;margin-bottom:40px;opacity:.95}.faq-cta .cta-buttons{display:flex;justify-content:center;gap:20px;margin-bottom:50px;flex-wrap:wrap}.contact-options{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:30px;max-width:800px;margin:0 auto}.contact-option{display:flex;align-items:center;justify-content:center;gap:15px;text-align:left}.contact-icon{font-size:2rem}.contact-option strong{display:block;margin-bottom:5px;color:#fff}.contact-option p{margin:0;opacity:.9}.contact-option a{color:#fff;text-decoration:none}.contact-option a:hover{text-decoration:underline}.cta{padding:80px 0;background:linear-gradient(135deg,#144784 0,#179e83 100%);color:#fff;text-align:center}.cta-content h2{font-size:2.5rem;font-weight:600;margin-bottom:20px;color:#fff}.cta-content p{font-size:1.2rem;margin-bottom:40px;opacity:.95;max-width:600px;margin-left:auto;margin-right:auto}.cta-buttons{display:flex;justify-content:center;gap:20px;flex-wrap:wrap}.case-study{background:#fff;border-radius:16px;padding:40px;margin-bottom:40px;box-shadow:0 4px 20px rgba(0,0,0,.08);border:1px solid #f0f0f0}.case-study.featured{border:2px solid #179e83;box-shadow:0 8px 40px rgba(23,158,131,.15)}.case-study-content{display:grid;grid-template-columns:2fr 1fr;gap:40px;align-items:start}.case-study-meta{display:flex;gap:15px;margin-bottom:20px}.case-study-meta span{background:#f0f0f0;color:#666;padding:5px 12px;border-radius:15px;font-size:14px;font-weight:500}.case-study h3{font-size:1.8rem;font-weight:600;margin-bottom:15px;color:#1a1a1a;line-height:1.3}.case-study-intro{font-size:1.1rem;color:#666;margin-bottom:30px;line-height:1.6}.challenge,.results,.solution{margin-bottom:30px}.challenge h4,.results h4,.solution h4{font-size:1.2rem;font-weight:600;margin-bottom:15px;color:#144784}.results-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:20px;margin:20px 0}.result-item{text-align:center;padding:20px;background:#f8f9fa;border-radius:12px}.result-number{font-size:2rem;font-weight:700;color:#179e83;display:block;margin-bottom:5px}.result-label{font-size:14px;color:#666;font-weight:500}.testimonial{background:#f8f9fa;padding:30px;border-radius:12px;margin-top:30px;border-left:4px solid #179e83}.testimonial p{font-style:italic;font-size:1.1rem;color:#444;margin-bottom:20px;line-height:1.6}.testimonial cite{display:block;font-style:normal}.testimonial cite strong{color:#1a1a1a;font-weight:600;display:block;margin-bottom:5px}.testimonial cite span{color:#666;font-size:14px}.case-study-visual{background:#f8f9fa;padding:30px;border-radius:12px;text-align:center}.chart-container h5{font-size:1.1rem;font-weight:600;margin-bottom:20px;color:#1a1a1a}.industries-overview{padding:80px 0;background:#fff}.industries-overview h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.industry-stat{text-align:center;padding:30px;background:#f8f9fa;border-radius:12px;transition:all .3s ease}.industry-stat:hover{transform:translateY(-5px);background:#fff;box-shadow:0 8px 25px rgba(0,0,0,.1)}.industry-icon{font-size:3rem;margin-bottom:20px;display:block}.industry-stat h3{font-size:1.3rem;font-weight:600;margin-bottom:15px;color:#144784}.industry-stat .stat-number{font-size:2.5rem;font-weight:700;color:#179e83;display:block;margin-bottom:5px}.industry-stat .stat-label{font-size:14px;color:#666;font-weight:500}.related-articles{padding:60px 0;background:#f8f9fa;border-top:1px solid #e1e5e9;margin-top:60px}.related-articles h2,.related-articles h3{font-size:2rem;font-weight:600;margin-bottom:40px;color:#1a1a1a;text-align:center}aside.related-articles{padding:40px 0;background:#f8f9fa;border-top:1px solid #e1e5e9;margin-top:40px}.related-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:30px;max-width:1000px;margin:0 auto}.related-card{background:#fff;padding:30px;border-radius:12px;box-shadow:0 4px 15px rgba(0,0,0,.08);border:1px solid #e1e5e9;transition:all .3s ease}.related-card:hover{transform:translateY(-5px);box-shadow:0 8px 30px rgba(0,0,0,.12)}.related-card h3,.related-card h4{font-size:1.3rem;font-weight:600;margin-bottom:15px;line-height:1.3}.related-card h3 a,.related-card h4 a{color:#1a1a1a;text-decoration:none;transition:color .3s ease}.related-card h3 a:hover,.related-card h4 a:hover{color:#179e83}.related-card .category{background:#179e83;color:#fff;padding:4px 12px;border-radius:20px;font-size:.8rem;font-weight:500;display:inline-block;margin-bottom:12px}.related-card span.category{display:inline-block;margin-bottom:12px}.related-card p{color:#666;line-height:1.6;margin-bottom:15px}.related-card .read-time{color:#179e83;font-size:14px;font-weight:500}.btn *{color:inherit;text-decoration:inherit}.btn:active,.btn:link,.btn:visited{color:inherit;text-decoration:none}.btn-primary,.btn-primary:active,.btn-primary:link,.btn-primary:visited{color:#fff!important;text-decoration:none!important}.btn-primary:focus,.btn-primary:hover{color:#fff!important;text-decoration:none!important}.expert-consultation-cta{background:linear-gradient(135deg,#f8f9fa 0,#e9ecef 100%);border:2px solid #179e83;border-radius:12px;padding:40px;text-align:center;margin:40px 0;clear:both;width:100%;box-sizing:border-box}.expert-consultation-cta h3{color:#144784;font-size:1.5rem;margin-bottom:15px;font-weight:600}.expert-consultation-cta p{color:#666;margin-bottom:25px;font-size:1.1rem;line-height:1.6}.expert-consultation-cta .btn{font-size:1.1rem;padding:15px 30px;min-width:200px;font-weight:600}.testimonials{padding:80px 0;background:#f8f9fa}.testimonials h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.testimonials-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(350px,1fr));gap:30px;max-width:1200px;margin:0 auto}.testimonial-card{background:#fff;padding:40px;border-radius:16px;box-shadow:0 4px 20px rgba(0,0,0,.08);border:1px solid #f0f0f0;position:relative}.testimonial-card::before{content:'"';position:absolute;top:-10px;left:30px;font-size:4rem;color:#179e83;font-family:serif;line-height:1}.testimonial-content p{font-style:italic;font-size:1.1rem;color:#444;margin-bottom:30px;line-height:1.6}.testimonial-author{display:flex;justify-content:space-between;align-items:center}.author-info strong{color:#1a1a1a;font-weight:600;display:block;margin-bottom:5px}.author-info span{color:#666;font-size:14px}.company-logo{width:60px;height:40px;display:flex;align-items:center;justify-content:center}.company-logo img{max-width:100%;max-height:100%;filter:grayscale(100%);opacity:.7}.social-proof{padding:80px 0;background:#fff}.social-proof h2{text-align:center;font-size:2.5rem;font-weight:600;margin-bottom:60px;color:#1a1a1a}.client-logos{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:30px;margin:40px 0 60px;padding:40px 0;border-top:1px solid #e1e5e9;border-bottom:1px solid #e1e5e9}.logo-item{display:flex;align-items:center;justify-content:center;padding:20px;background:#f8f9fa;border-radius:8px;min-height:80px;color:#999;font-weight:500;text-align:center;transition:all .3s ease}.logo-item:hover{background:#fff;box-shadow:0 4px 15px rgba(0,0,0,.1);transform:translateY(-2px)}@media (max-width:768px){.case-study-content{grid-template-columns:1fr;gap:30px}.results-grid{grid-template-columns:repeat(2,1fr);gap:15px}.pricing-grid{grid-template-columns:1fr}.pricing-card.featured{transform:none;margin:20px 0}.categories-grid{grid-template-columns:repeat(2,1fr);gap:20px}.contact-options{grid-template-columns:1fr;gap:20px}.contact-option{justify-content:flex-start}.faq-grid{grid-template-columns:1fr}.page-hero h1,.service-hero h1{font-size:2.2rem}.breadcrumb ol{flex-wrap:wrap}.client-logos{grid-template-columns:repeat(2,1fr);gap:20px}}@media (max-width:480px){.categories-grid{grid-template-columns:1fr}.results-grid{grid-template-columns:1fr}.case-study{padding:30px 20px}.page-hero .hero-stats,.service-hero .hero-stats{flex-direction:column;gap:20px}.hero-cta{flex-direction:column;align-items:center}.cta-buttons{flex-direction:column;align-items:center}.related-grid{grid-template-columns:1fr;gap:20px}.related-card{padding:25px 20px}.expert-consultation-cta{padding:30px 20px;margin:30px 0}.article-content pre{margin:20px -20px;border-radius:0;border-left:none;border-right:none}.article-content pre code{padding:15px 20px;font-size:13px}.article-content pre:hover::before{top:5px;right:5px;font-size:11px;padding:4px 8px}}.technology-showcase{padding:80px 0;background:linear-gradient(135deg,#f8fafc 0,#e2e8f0 100%);position:relative}.technology-showcase::before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:url('data:image/svg+xml,');opacity:.3;pointer-events:none}.technology-showcase .container{position:relative;z-index:1}.technology-showcase h2{text-align:center;margin-bottom:50px;color:#1a202c;font-size:2.5rem;font-weight:700;background:linear-gradient(135deg,#144784 0,#179e83 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.tech-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:30px;max-width:1000px;margin:0 auto}.tech-card{background:#fff;padding:40px 30px;border-radius:16px;text-align:center;box-shadow:0 4px 20px rgba(0,0,0,.08);transition:all .3s ease;border:1px solid #e2e8f0;position:relative;overflow:hidden}.tech-card::before{content:'';position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(135deg,#144784 0,#179e83 100%);transform:scaleX(0);transition:transform .3s ease}.tech-card:hover::before{transform:scaleX(1)}.tech-card:hover{transform:translateY(-8px);box-shadow:0 12px 40px rgba(0,0,0,.15);border-color:#cbd5e0}.tech-icon{font-size:3rem;margin-bottom:20px;display:block;line-height:1;filter:grayscale(.2);transition:all .3s ease}.tech-card:hover .tech-icon{transform:scale(1.1);filter:grayscale(0)}.tech-card h3{color:#1a202c;font-size:1.5rem;font-weight:600;margin:0 0 15px 0;transition:color .3s ease}.tech-card:hover h3{color:#144784}.tech-card p{color:#64748b;font-size:1rem;line-height:1.6;margin:0;font-weight:500}@media (max-width:768px){.technology-showcase{padding:60px 0}.technology-showcase h2{font-size:2rem;margin-bottom:40px}.tech-grid{grid-template-columns:1fr;gap:20px}.tech-card{padding:30px 20px}.tech-icon{font-size:2.5rem;margin-bottom:15px}.tech-card h3{font-size:1.3rem}}.capabilities-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:40px;margin:40px 0}.capability-card{background:#fff;padding:30px;border-radius:12px;box-shadow:0 4px 20px rgba(0,0,0,.08);border-left:4px solid #179e83;transition:all .3s ease;position:relative;overflow:hidden}.capability-card:hover{transform:translateY(-4px);box-shadow:0 8px 30px rgba(0,0,0,.12);border-left-color:#144784}.capability-card h3{color:#1a202c;font-size:1.3rem;font-weight:600;margin:0 0 15px 0;transition:color .3s ease}.capability-card:hover h3{color:#144784}.capability-card p{color:#64748b;line-height:1.6;margin:0 0 20px 0}.capability-card ul{list-style:none;padding:0;margin:0}.capability-card li{color:#4a5568;margin:8px 0;padding-left:20px;position:relative;font-size:.95rem}.capability-card li::before{content:'✓';position:absolute;left:0;color:#179e83;font-weight:700;font-size:1rem}.tech-tag{display:inline-block;background:linear-gradient(135deg,#144784 0,#179e83 100%);color:#fff;padding:6px 12px;border-radius:20px;font-size:.9rem;margin:4px 8px 4px 0;font-weight:500;transition:all .3s ease}.tech-tag:hover{transform:scale(1.05);box-shadow:0 2px 8px rgba(20,71,132,.3)}@media (max-width:768px){.capabilities-grid{grid-template-columns:1fr;gap:20px;margin:30px 0}.capability-card{padding:25px 20px}.capability-card h3{font-size:1.2rem}} \ No newline at end of file diff --git a/assets/images/certificate-icon.webp b/assets/images/certificate-icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..65df7932bd0c2e59a3cba8c6b407614179cea951 GIT binary patch literal 2450 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 literal 0 HcmV?d00001 diff --git a/assets/images/client-gambling-commission.webp b/assets/images/client-gambling-commission.webp new file mode 100644 index 0000000000000000000000000000000000000000..e5046737be46542c3cc015cbdba65a17e323a6fc GIT binary patch literal 6322 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 literal 0 HcmV?d00001 diff --git a/assets/images/client-gdp.webp b/assets/images/client-gdp.webp new file mode 100644 index 0000000000000000000000000000000000000000..211f2ac2da0f1607249d0d4813083ad58a8df2fc GIT binary patch literal 1932 zcmV;72XpvRNk&G52LJ$9MM6+kP&goX2LJ%DA^@EMDvJPD06tM7jzpuPAr%Prd^iOJ zvw%MC_g8a#uFyu_^#Qg6_5;)hn*aMxQhUQ6u^zx5s=l3G#lPPy6F*Dg-G9w5=2z7m z`F}6o-^UD`?wEiMuN_0Y0j)FQ{(rp-bTIX4ps=Ts=&IA|Iv+xQxnxE(m0{QKf*2Fj zD*pc2CZrzbACbNePS#IKPr`SP{5xN##Q@905`As4-2!<=hdJEIEWJa9gVI7I1jd%p z-3Y?)AZBcC`d{&Kyo#*TZ=haXN4Lf~;h$*Zj#7o7aR=bkHsxk*|YvHpaDV}Nc$K|5TbaRB6lA1aIm5m0zHlW>^D@Dg&V z0092~b}5@Iw+@%siM(NaU-J`iz1*p+^bb5bC*%7+wt+@g=xzIGCn40mSy8eS zo3DAqIJ)6@RP;4J9L3a0U(>N0+xj;Z6f55t7n~>sls$PyEuk$sGck_;7G8;%DAVCo z^s;2oer5--xOMI8i}xD&eJ0(88I~^JfyqGrqYvVRE5y)q$Sy_9Jcg65Zt)nhHZN)3 zSDu)=mCSH?`Xt$=RkGR&Rc2M$9kSvxqAX@%-ati&f%@DSW?Qg;ope-Z@`<9m9GBd_ z-B*(2n6N(3ydFmiypd_b++6~$kBpkG68W$9SL$5*@W`{tOztc6&o9@Y_5>EU2cL)8Qub%TC(*d;2a zwClco)1@vGdRk_Ej~DaAP)Zo>Uk?o38E)-MkV?|Pah0zhyyCUAgW=3=iD8^$c=quC zRS1CtBS6C+j$dTuALU=w_iEo;J&hq2*2pWCelw!tMnp}VtI+8T)wBHbuhwe-V zWT0AnGIEiDP%~I}+CE5mz9dmm0+;u(iTc<d%RN^v3jH-(6C7@8|fOjO6A8W?dHuL*j0 z^S&^Aa^9^8Bd0~UC>){|X*XXZ2)6Db8u@egz{B=Q+{eDAZ{1!bxVMk_Su9C^qx^<5 z-c?Q|WOKntHQeK}ee2)E=%wAp0R}V+fat6&Z|ZJI(*k3re#DZOV;o66ot90Qi)X)cj`d`6*;N(B5seGfpV+>6b|1D#_e{s--_*J70$olJjK}H z9r8WfB8GO^xvd*@1u*%`x3D1fsKh%{Le)wO029iM}k%5qex z_z97j*Vv>r24Ly?eO-S%?M4?aHEc~*o7|g#!Zu@&8iiei)}Y0WpfxXye?PB0#AMFk zLgufybLOfgqoK7|38oUdC|fzUXw3};+SIv>ZjrKa{=WqgwE@&@Gg5#zdRn=YkF|Rw zN`1hVAcgx`H&&wwK9==s<;Y4_m{2VXtn(UwBp%ySMx@puj?VOE?L|j#~wV~wWA&& zz{U75L@4#?)iO(5x)3h=0MhtV(qY_t1zGc#m2UmXqC5w%)fg_@& zf~tmF61#@qRU)`HFAqRWe2&{Gmz8=i+w-E{g`FKe+|-MT@~7dkLW?mV8PC(tA*c1| zX+8LZ+-&-m^P-ymN6P>nx4b`DTyQ&j%6V}J)`$85}BnNLi0?tXli-N^+^xO5>$Bf3`b<%q|+i?n4s?7ZS$W SGm!@*GTa9?MY^2;0001PJGg@Y literal 0 HcmV?d00001 diff --git a/assets/images/client-homesupply.webp b/assets/images/client-homesupply.webp new file mode 100644 index 0000000000000000000000000000000000000000..214ba130d06b1019a42de60766b08b4bb2541846 GIT binary patch literal 3498 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 literal 0 HcmV?d00001 diff --git a/assets/images/client-incite.webp b/assets/images/client-incite.webp new file mode 100644 index 0000000000000000000000000000000000000000..b9b4262a37701db3cc7afb1656de216f93c2a63e GIT binary patch literal 1514 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 P|LG#(B&U}?;D7f&nvg%S literal 0 HcmV?d00001 diff --git a/assets/images/client-replay.webp b/assets/images/client-replay.webp new file mode 100644 index 0000000000000000000000000000000000000000..b5c4b0a89ee5f920c09e27b1e8e20a57ae43efd3 GIT binary patch literal 964 zcmV;#13UauNk&Gz0{{S5MM6+kP&il$0000G0001E001Wd06|PpNVx(400E!{Nw#U* z>aA&AjEthxD;Zp)3|m}Gjqzk2bh@FX3)w}k@0XoKH+6zQHB=K!P?o~Cl*Lq%JP>s`qD&|nXArX6-r zjG*~A3(#9&dncX>(US(1-y--I%$zy%OJN^&laH@ozn%x^d;R+LNOGIvMe>D;HQxVq z&ephPCEDC0S2;m(Er3@A_3L<_>;vU-@{-~gK1dDZP9!e?XiuJVZZLrN?0trx?R})U z%`X7pIk_1?8S;X2eE_^Fgsf7I!fku6D}G~QWuPO;+nIpXnqPsh9M~!(mxlH>`Q2-; zy_N%L|JrM>JtQ|PUL~V;9!gk}rpSl4H(a8Is}}klXfN=`2Bo*I)R+Z;(G*)MCer*A zKxv8>Fk7+?jQ6@A_6yWEZbjAz;{^cetU3h)TKg68wE~k=7Yd9wVk!VjtullL17;}r zB%dlQBqW+-@(8G~n770 z2;x-~`#NA#nuXx?`Tz_~lJfmo6?pc-*Y)Z6-L%NyvE}t_P_xC#Z>?QkoGi922oE`RN@}- zxEO!>SbzA@fB#3=L@e&w@Zb<|gk#^8hl5hoyBXT{6TDOck}Z=Wn8_N>XU;n+7=*3@ zhy(~LFcz5Cm}Jq`FaWU|P~Rz mYdHYuz{CNNX0U%K85PnBM0001H#K3R> literal 0 HcmV?d00001 diff --git a/assets/images/favicon-original.webp b/assets/images/favicon-original.webp new file mode 100644 index 0000000000000000000000000000000000000000..51984b248f5a7d4512ac16b5d066f1119cbf7ee3 GIT binary patch literal 434 zcmV;j0Zsl=Nk&Gh0RRA3MM6+kP&go-0RR9n2mqY{Dj)zL06tM9k42-RAru4vI0Xc@ z08W{)-3QWXqq_n6tD*svh}~iM#;yLEN&o#KWgfcP0*~Qc`Mbmr6bu#Szm@@%fB^pT zk$LaBR$;pI!1U*aT+t{q`0ezPHVdnSG#WlU5tq#Kb|>O6T{W@I{yjh0+9lJ0mOlXh z>h(H)1M)xgDZ3EBae$GCkP;DMX?? z^a17jHy^xJe}~ik!97`dl#qWWJu&Q_zIq|g_`c>n*y95K`qTbvpb$Lq@>3!o`{o+TznT0bT8tLR znXArK^n`=?f=B)yF){Nk3?n`zVeX`QfSo#fg~3r310no!J*Fh}H$lIBR-xMSGsq5Q zM+vH%O@MZ{-{yb)&dhgvVO#eASE|X?_MhET|L5?J<^A)+)0A0re*dG?M~pkUKD|89 cWyvYP(Mk~OTdZ1GMUEA2PVae!vlV~<0PvyMN&o-= literal 0 HcmV?d00001 diff --git a/assets/images/rocket-icon.webp b/assets/images/rocket-icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..88611a8161e4cb45f74ab78e1acab019453ea769 GIT binary patch literal 2718 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 literal 0 HcmV?d00001 diff --git a/assets/js/main.js b/assets/js/main.js index 7c4a530..2ce3dca 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -736,4 +736,75 @@ document.addEventListener('DOMContentLoaded', function() { console.log(`Blog pagination initialized: ${totalPages} pages, ${allArticles.length} articles`); } + + // Viewport-based Image Loading Optimization + function initializeViewportImageLoading() { + // Intersection Observer for lazy loading optimization + const imageObserver = new IntersectionObserver((entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const img = entry.target; + + // Load high-quality version when in viewport + if (img.dataset.src) { + img.src = img.dataset.src; + img.removeAttribute('data-src'); + } + + // Load WebP for supported browsers + if (img.dataset.webp && supportsWebP()) { + img.src = img.dataset.webp; + } + + observer.unobserve(img); + } + }); + }, { + rootMargin: '50px 0px', + threshold: 0.01 + }); + + // Observe all images with data-src + document.querySelectorAll('img[data-src]').forEach(img => { + imageObserver.observe(img); + }); + + // WebP support detection + function supportsWebP() { + return new Promise(resolve => { + const webP = new Image(); + webP.onload = webP.onerror = () => resolve(webP.height === 2); + webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'; + }); + } + } + + // Touch Target Optimization for Mobile + function optimizeTouchTargets() { + const minTouchSize = 44; // 44px minimum touch target + + // Check and optimize button sizes + document.querySelectorAll('button, .btn, a[role="button"]').forEach(element => { + const rect = element.getBoundingClientRect(); + if (rect.width < minTouchSize || rect.height < minTouchSize) { + element.style.minWidth = minTouchSize + 'px'; + element.style.minHeight = minTouchSize + 'px'; + element.style.display = 'inline-flex'; + element.style.alignItems = 'center'; + element.style.justifyContent = 'center'; + } + }); + + // Add touch-friendly spacing + document.querySelectorAll('.nav-menu a, .social-links a').forEach(element => { + element.style.padding = '12px 16px'; + element.style.margin = '4px'; + }); + } + + // Initialize optimizations + initializeViewportImageLoading(); + if ('ontouchstart' in window) { + optimizeTouchTargets(); + } }); \ No newline at end of file diff --git a/assets/js/main.min.js b/assets/js/main.min.js new file mode 100644 index 0000000..5bd2193 --- /dev/null +++ b/assets/js/main.min.js @@ -0,0 +1 @@ +document.addEventListener("DOMContentLoaded",(function(){const e=document.getElementById("rotating-text"),t=document.getElementById("hero-subtitle");if(e&&t){const E=[{title:"Voted UK's No.1 Web Scraping Service",subtitle:"We are experts in web scraping, data analysis and competitor price monitoring."},{title:"UK-based Team",subtitle:"Our team is based in the UK for a clearer, faster response."},{title:"Professional Price Monitoring",subtitle:"Let us monitor your competitor's pricing and product ranges."},{title:"Bespoke Software Solutions",subtitle:"Let our experts build your ideal scraping solution."}];let S=0;function n(){e.style.opacity="0",t.style.opacity="0",setTimeout((()=>{e.textContent=E[S].title,t.textContent=E[S].subtitle,e.style.opacity="1",t.style.opacity="1",S=(S+1)%E.length}),500)}e.style.transition="opacity 0.5s ease-in-out",t.style.transition="opacity 0.5s ease-in-out",setTimeout((()=>{n(),setInterval(n,4e3)}),2e3),console.log("Hero text rotation initialized")}else console.log("Rotating text elements not found");const o=document.getElementById("nav-toggle"),s=document.getElementById("nav-menu");if(o&&s){o.addEventListener("click",(function(){s.classList.toggle("active"),o.classList.toggle("active")}));document.querySelectorAll(".nav-link").forEach((e=>{e.addEventListener("click",(()=>{s.classList.remove("active"),o.classList.remove("active")}))}))}const i=document.getElementById("navbar");function a(){window.scrollY>50?i.classList.add("scrolled"):i.classList.remove("scrolled")}window.addEventListener("scroll",a);document.querySelectorAll('a[href^="#"]').forEach((e=>{e.addEventListener("click",(function(e){e.preventDefault();const t=this.getAttribute("href"),n=document.querySelector(t);if(n){const e=80,t=n.getBoundingClientRect().top+window.pageYOffset-e;window.scrollTo({top:t,behavior:"smooth"})}}))}));const r=document.querySelectorAll(".animate-on-scroll, .service-card, .feature, .step"),c=new IntersectionObserver((function(e){e.forEach((e=>{e.isIntersecting&&(e.target.classList.add("animated"),e.target.style.opacity="1",e.target.style.transform="translateY(0)",c.unobserve(e.target))}))}),{threshold:.1,rootMargin:"0px 0px -50px 0px"});r.forEach(((e,t)=>{e.style.opacity="0",e.style.transform="translateY(30px)",e.style.transition=`opacity 0.8s ease-out ${.1*t}s, transform 0.8s ease-out ${.1*t}s`,c.observe(e)}));document.querySelectorAll(".service-card").forEach((e=>{e.addEventListener("mouseenter",(function(){this.style.transform="translateY(-10px) scale(1.02)",this.style.boxShadow="0 20px 40px rgba(0, 0, 0, 0.15)"})),e.addEventListener("mouseleave",(function(){this.style.transform="translateY(0) scale(1)",this.style.boxShadow="0 4px 20px rgba(0, 0, 0, 0.08)"}))}));document.querySelectorAll(".btn-primary").forEach((e=>{e.addEventListener("mouseenter",(function(){this.style.animation="pulse 0.5s ease-in-out"})),e.addEventListener("mouseleave",(function(){this.style.animation="none"}))})),console.log("Enhanced animations initialized");const l=document.querySelector(".contact-form form");function d(e,t="info"){const n=document.querySelector(".notification");n&&n.remove();const o=document.createElement("div");o.className=`notification notification-${t}`,o.innerHTML=`\n
\n ${e}\n \n
\n `,o.style.cssText=`\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 10000;\n background: ${"success"===t?"#10b981":"error"===t?"#ef4444":"#3b82f6"};\n color: white;\n padding: 16px 20px;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n max-width: 400px;\n font-family: 'Inter', sans-serif;\n font-size: 14px;\n opacity: 0;\n transform: translateX(100%);\n transition: all 0.3s ease;\n `,o.querySelector(".notification-content").style.cssText="\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n ",o.querySelector(".notification-close").style.cssText="\n background: none;\n border: none;\n color: white;\n font-size: 18px;\n cursor: pointer;\n padding: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n ",document.body.appendChild(o),setTimeout((()=>{o.style.opacity="1",o.style.transform="translateX(0)"}),100),o.querySelector(".notification-close").addEventListener("click",(()=>{u(o)})),setTimeout((()=>{document.body.contains(o)&&u(o)}),5e3)}function u(e){e.style.opacity="0",e.style.transform="translateX(100%)",setTimeout((()=>{document.body.contains(e)&&e.remove()}),300)}l&&l.addEventListener("submit",(function(e){e.preventDefault();const t=new FormData(this),n=t.get("name"),o=t.get("email"),s=t.get("message");let i=!0;const a=[];if((!n||n.trim().length<2)&&(a.push("Please enter a valid name"),i=!1),o&&function(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}(o)||(a.push("Please enter a valid email address"),i=!1),(!s||s.trim().length<10)&&(a.push("Please provide more details about your project (minimum 10 characters)"),i=!1),i){const e=this.querySelector('button[type="submit"]'),n=e.textContent;e.textContent="Sending...",e.disabled=!0,fetch("contact-handler.php",{method:"POST",body:t}).then((e=>e.json())).then((e=>{e.success?(d("Message sent successfully! We'll get back to you soon.","success"),this.reset()):d("There was an error sending your message. Please try again.","error")})).catch((e=>{console.error("Error:",e),d("There was an error sending your message. Please try again.","error")})).finally((()=>{e.textContent=n,e.disabled=!1}))}else d(a.join("
"),"error")}));const p=document.querySelectorAll(".stat-number");function m(){p.forEach((e=>{const t=e.textContent.trim();if(console.log("Animating stat:",t),!t.includes("£2.5M+"))if(t.includes("99.8%"))!function(e,t,n,o=""){let s=t;const i=(n-t)/60,a=setInterval((()=>{s+=i,s>=n&&(s=n,clearInterval(a)),e.textContent=s.toFixed(1)+o}),50)}(e,0,99.8,"%");else if(t.includes("ISO 27001"))return}))}const g=document.querySelector(".hero-stats");if(g){const L=new IntersectionObserver((function(e){e.forEach((e=>{e.isIntersecting&&(console.log("Stats section is visible, starting animation"),setTimeout((()=>{m()}),500),L.unobserve(e.target))}))}),{threshold:.3});L.observe(g)}else console.log("Stats section not found");const y=document.querySelectorAll('img[loading="lazy"]');function f(){const e=document.createElement("canvas");return e.width=1,e.height=1,-1!==e.toDataURL("image/webp").indexOf("webp")}if("IntersectionObserver"in window){const A=new IntersectionObserver((function(e){e.forEach((e=>{if(e.isIntersecting){const t=e.target;t.dataset.src&&(t.src=t.dataset.src),t.dataset.webp&&f()&&(t.src=t.dataset.webp),t.classList.add("loaded"),t.style.opacity="1",A.unobserve(t)}}))}),{rootMargin:"50px 0px",threshold:.1});y.forEach((e=>{"lazy"===e.loading&&(e.style.opacity="0",e.style.transition="opacity 0.3s ease"),A.observe(e)}))}const h=document.createElement("button");function b(){window.scrollY>500?(h.style.opacity="1",h.style.visibility="visible"):(h.style.opacity="0",h.style.visibility="hidden")}let v;h.innerHTML="↑",h.className="scroll-top-btn",h.style.cssText="\n position: fixed;\n bottom: 30px;\n right: 30px;\n width: 50px;\n height: 50px;\n border: none;\n border-radius: 50%;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n font-size: 20px;\n cursor: pointer;\n opacity: 0;\n visibility: hidden;\n transition: all 0.3s ease;\n z-index: 1000;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n ",document.body.appendChild(h),h.addEventListener("click",(()=>{window.scrollTo({top:0,behavior:"smooth"})})),window.addEventListener("scroll",b);const x=[a,b];function w(e,t="image",n=null){const o=document.createElement("link");o.rel="preload",o.href=e,o.as=t,n&&(o.type=n),document.head.appendChild(o)}window.removeEventListener("scroll",a),window.removeEventListener("scroll",b),window.addEventListener("scroll",(function(){v||(v=setTimeout((()=>{x.forEach((e=>e())),v=null}),16))})),["assets/images/ukds-main-logo.png","assets/images/hero-data-analytics.svg"].forEach((e=>{f()?w(e.replace(/\.(jpg|jpeg|png)$/i,".webp"),"image","image/webp"):w(e,"image")}));document.querySelectorAll("[data-tooltip]").forEach((e=>{e.addEventListener("mouseenter",(function(){const e=this.getAttribute("data-tooltip"),t=document.createElement("div");t.className="tooltip",t.textContent=e,t.style.cssText="\n position: absolute;\n background: #1a1a1a;\n color: white;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 14px;\n white-space: nowrap;\n z-index: 10000;\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n ",document.body.appendChild(t);const n=this.getBoundingClientRect();t.style.left=n.left+n.width/2-t.offsetWidth/2+"px",t.style.top=n.top-t.offsetHeight-10+"px",setTimeout((()=>{t.style.opacity="1"}),100),this.addEventListener("mouseleave",(function(){t.style.opacity="0",setTimeout((()=>{document.body.contains(t)&&t.remove()}),300)}),{once:!0})}))})),"serviceWorker"in navigator&&window.addEventListener("load",(()=>{navigator.serviceWorker.register("/sw.js").then((e=>{console.log("SW registered: ",e)})).catch((e=>{console.log("SW registration failed: ",e)}))})),"performance"in window&&window.addEventListener("load",(function(){setTimeout((()=>{const e=performance.getEntriesByType("navigation")[0];e&&console.log("Page Load Performance:",{"DNS Lookup":Math.round(e.domainLookupEnd-e.domainLookupStart),"TCP Connection":Math.round(e.connectEnd-e.connectStart),"Request/Response":Math.round(e.responseEnd-e.requestStart),"DOM Processing":Math.round(e.domComplete-e.domLoading),"Total Load Time":Math.round(e.loadEventEnd-e.navigationStart)})}),0)})),console.log("UK Data Services website initialized successfully"),console.log("Performance optimizations: Lazy loading, WebP support, and preloading enabled"),function(){const e=document.querySelector(".blog-pagination"),t=document.querySelector(".articles-grid");if(!e||!t)return;const n=e.querySelector("button:first-child"),o=e.querySelector("button:last-child"),s=e.querySelector(".pagination-info");if(!n||!o||!s)return;const i=new URLSearchParams(window.location.search);let a=parseInt(i.get("page"))||1;const r=Array.from(t.querySelectorAll(".article-card")),c=Math.ceil(r.length/6);if(c<=1)return void(e.style.display="none");function l(e){r.forEach((e=>{e.style.display="none"}));const i=6*(e-1),a=i+6;for(let e=i;e=c;const l=new URL(window.location);e>1?l.searchParams.set("page",e):l.searchParams.delete("page"),window.history.replaceState({},"",l),t.scrollIntoView({behavior:"smooth",block:"start"})}n.addEventListener("click",(function(e){e.preventDefault(),a>1&&(a--,l(a))})),o.addEventListener("click",(function(e){e.preventDefault(),a{e.forEach((e=>{if(e.isIntersecting){const n=e.target;n.dataset.src&&(n.src=n.dataset.src,n.removeAttribute("data-src")),n.dataset.webp&&new Promise((e=>{const t=new Image;t.onload=t.onerror=()=>e(2===t.height),t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA"}))&&(n.src=n.dataset.webp),t.unobserve(n)}}))}),{rootMargin:"50px 0px",threshold:.01});document.querySelectorAll("img[data-src]").forEach((t=>{e.observe(t)}))}(),"ontouchstart"in window&&(document.querySelectorAll('button, .btn, a[role="button"]').forEach((e=>{const t=e.getBoundingClientRect();(t.width<44||t.height<44)&&(e.style.minWidth="44px",e.style.minHeight="44px",e.style.display="inline-flex",e.style.alignItems="center",e.style.justifyContent="center")})),document.querySelectorAll(".nav-menu a, .social-links a").forEach((e=>{e.style.padding="12px 16px",e.style.margin="4px"})))})); \ No newline at end of file diff --git a/blog/articles/python-scrapy-enterprise-guide.php b/blog/articles/python-scrapy-enterprise-guide.php index fe3a464..993833c 100644 --- a/blog/articles/python-scrapy-enterprise-guide.php +++ b/blog/articles/python-scrapy-enterprise-guide.php @@ -94,6 +94,79 @@ $read_time = 12; "dateModified": "" } + + + diff --git a/db_backup_250608_171630.sql b/db_backup_250608_183559.sql similarity index 99% rename from db_backup_250608_171630.sql rename to db_backup_250608_183559.sql index 5521897..96ecca9 100644 --- a/db_backup_250608_171630.sql +++ b/db_backup_250608_183559.sql @@ -697,4 +697,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-06-08 17:16:31 +-- Dump completed on 2025-06-08 18:35:59 diff --git a/faq-enhanced.php b/faq-enhanced.php index 3f32a6d..05b78dd 100644 --- a/faq-enhanced.php +++ b/faq-enhanced.php @@ -101,7 +101,7 @@ $keywords = "UK data services FAQ, web scraping questions, data cleaning help, b
-

Frequently Asked Questions

+

Web Scraping & Data Services FAQ - UK Data Services

Get instant answers to common questions about our data services, processes, pricing, and more. Can't find what you're looking for? Contact our experts.