Latest Updated Pages
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
Deploy to Production / Build & Verify (push) Failing after 13s
Ping Search Engines / Notify Search Engines (push) Successful in 3s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 1s
E2E Test Suite / Smoke Tests (P0) (push) Failing after 9m36s
E2E Test Suite / Form Interaction Tests (push) Failing after 12m6s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 11m46s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 9m31s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 11m5s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 15m24s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 6s
E2E Test Suite / Mobile Device Tests (push) Failing after 3h12m28s
Uptime Monitor / Health & Response Time (push) Successful in 5s
Uptime Monitor / SSL Certificate (push) Successful in 3s
Uptime Monitor / Send Alerts (push) Has been skipped
Uptime Monitor / Record Uptime Success (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
Deploy to Production / Build & Verify (push) Failing after 13s
Ping Search Engines / Notify Search Engines (push) Successful in 3s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 1s
E2E Test Suite / Smoke Tests (P0) (push) Failing after 9m36s
E2E Test Suite / Form Interaction Tests (push) Failing after 12m6s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 11m46s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 9m31s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 11m5s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 15m24s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 6s
E2E Test Suite / Mobile Device Tests (push) Failing after 3h12m28s
Uptime Monitor / Health & Response Time (push) Successful in 5s
Uptime Monitor / SSL Certificate (push) Successful in 3s
Uptime Monitor / Send Alerts (push) Has been skipped
Uptime Monitor / Record Uptime Success (push) Successful in 2s
This commit is contained in:
+41
-41
@@ -318,12 +318,12 @@ const processSteps = [
|
||||
</section>
|
||||
|
||||
<!-- Services Cards Section -->
|
||||
<section class="py-16 lg:py-24 bg-white">
|
||||
<section class="py-16 lg:py-24 bg-white dark:bg-secondary-900">
|
||||
<div class="container-wrapper">
|
||||
<div class="text-center max-w-2xl mx-auto mb-12 lg:mb-16 reveal-on-scroll">
|
||||
<span class="text-primary-500 font-semibold text-sm uppercase tracking-wider">What We Offer</span>
|
||||
<h2 class="text-3xl sm:text-4xl font-bold text-secondary-900 mt-2 mb-4">Our Core Services</h2>
|
||||
<p class="text-secondary-600 text-lg">
|
||||
<span class="text-primary-500 dark:text-primary-400 font-semibold text-sm uppercase tracking-wider">What We Offer</span>
|
||||
<h2 class="text-3xl sm:text-4xl font-bold text-secondary-900 dark:text-secondary-100 mt-2 mb-4">Our Core Services</h2>
|
||||
<p class="text-secondary-600 dark:text-secondary-400 text-lg">
|
||||
Comprehensive technology solutions designed to accelerate your digital transformation journey.
|
||||
</p>
|
||||
</div>
|
||||
@@ -332,7 +332,7 @@ const processSteps = [
|
||||
{services.map((service, idx) => (
|
||||
<a
|
||||
href={`#${service.id}`}
|
||||
class={`service-card group relative bg-white rounded-2xl p-8 shadow-sm border border-secondary-100 hover:shadow-2xl hover:border-transparent hover:-translate-y-2 transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-primary-400 focus:ring-offset-2 reveal-on-scroll reveal-delay-${idx + 1}`}
|
||||
class={`service-card group relative bg-white dark:bg-secondary-800 rounded-2xl p-8 shadow-sm border border-secondary-100 dark:border-secondary-700 hover:shadow-2xl hover:border-transparent hover:-translate-y-2 transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-primary-400 focus:ring-offset-2 reveal-on-scroll reveal-delay-${idx + 1}`}
|
||||
aria-label={`Learn more about ${service.title}`}
|
||||
>
|
||||
<!-- Hover gradient overlay -->
|
||||
@@ -371,18 +371,18 @@ const processSteps = [
|
||||
<div class="text-right">
|
||||
{Object.entries(service.stats).slice(0, 1).map(([key, val]) => (
|
||||
<div>
|
||||
<p class="text-xl font-bold text-secondary-900 group-hover:text-white transition-colors duration-300">{val}</p>
|
||||
<p class="text-xs text-secondary-500 group-hover:text-white/70 transition-colors duration-300 capitalize">{key.replace(/([A-Z])/g, ' $1').trim()}</p>
|
||||
<p class="text-xl font-bold text-secondary-900 dark:text-secondary-100 group-hover:text-white transition-colors duration-300">{val}</p>
|
||||
<p class="text-xs text-secondary-500 dark:text-secondary-400 group-hover:text-white/70 transition-colors duration-300 capitalize">{key.replace(/([A-Z])/g, ' $1').trim()}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<h3 class="text-xl font-bold text-secondary-900 group-hover:text-white mb-2 transition-colors duration-300">
|
||||
<h3 class="text-xl font-bold text-secondary-900 dark:text-secondary-100 group-hover:text-white mb-2 transition-colors duration-300">
|
||||
{service.title}
|
||||
</h3>
|
||||
<p class="text-secondary-600 group-hover:text-white/80 mb-5 transition-colors duration-300 text-sm leading-relaxed">
|
||||
<p class="text-secondary-600 dark:text-secondary-400 group-hover:text-white/80 mb-5 transition-colors duration-300 text-sm leading-relaxed">
|
||||
{service.shortDescription}
|
||||
</p>
|
||||
|
||||
@@ -413,7 +413,7 @@ const processSteps = [
|
||||
{services.map((service, index) => (
|
||||
<section
|
||||
id={service.id}
|
||||
class={`py-16 lg:py-24 ${index % 2 === 0 ? 'bg-secondary-50' : 'bg-white'}`}
|
||||
class={`py-16 lg:py-24 ${index % 2 === 0 ? 'bg-secondary-50 dark:bg-secondary-800/50' : 'bg-white dark:bg-secondary-900'}`}
|
||||
>
|
||||
<div class="container-wrapper">
|
||||
<div class="grid lg:grid-cols-2 gap-12 lg:gap-16 items-center">
|
||||
@@ -443,10 +443,10 @@ const processSteps = [
|
||||
{service.title}
|
||||
</div>
|
||||
|
||||
<h2 class="text-3xl sm:text-4xl font-bold text-secondary-900 mb-4">
|
||||
<h2 class="text-3xl sm:text-4xl font-bold text-secondary-900 dark:text-secondary-100 mb-4">
|
||||
{service.title}
|
||||
</h2>
|
||||
<p class="text-secondary-600 text-lg leading-relaxed mb-6">
|
||||
<p class="text-secondary-600 dark:text-secondary-400 text-lg leading-relaxed mb-6">
|
||||
{service.fullDescription}
|
||||
</p>
|
||||
|
||||
@@ -455,7 +455,7 @@ const processSteps = [
|
||||
{Object.entries(service.stats).map(([key, val]) => (
|
||||
<div class={`flex flex-col px-4 py-3 ${service.bgLight} rounded-lg`}>
|
||||
<span class={`text-xl font-bold ${service.iconColor}`}>{val}</span>
|
||||
<span class="text-secondary-500 text-xs capitalize">{key.replace(/([A-Z])/g, ' $1').trim()}</span>
|
||||
<span class="text-secondary-500 dark:text-secondary-400 text-xs capitalize">{key.replace(/([A-Z])/g, ' $1').trim()}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
@@ -469,14 +469,14 @@ const processSteps = [
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
|
||||
</svg>
|
||||
</span>
|
||||
<span class="text-secondary-700">{feature}</span>
|
||||
<span class="text-secondary-700 dark:text-secondary-300">{feature}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
<!-- Tech stack -->
|
||||
<div class="mb-8">
|
||||
<p class="text-xs font-semibold text-secondary-400 uppercase tracking-wider mb-2">Technologies</p>
|
||||
<p class="text-xs font-semibold text-secondary-400 dark:text-secondary-500 uppercase tracking-wider mb-2">Technologies</p>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
{service.techStack.map((tech) => (
|
||||
<span class={`px-3 py-1 text-sm font-medium ${service.tagBg} rounded-md`}>{tech}</span>
|
||||
@@ -592,7 +592,7 @@ const processSteps = [
|
||||
</div>
|
||||
|
||||
<!-- Floating stats badge -->
|
||||
<div class="absolute -bottom-4 -right-4 sm:-bottom-6 sm:-right-6 bg-white rounded-xl shadow-xl p-4 sm:p-5 hidden sm:block border border-secondary-100">
|
||||
<div class="absolute -bottom-4 -right-4 sm:-bottom-6 sm:-right-6 bg-white dark:bg-secondary-800 rounded-xl shadow-xl p-4 sm:p-5 hidden sm:block border border-secondary-100 dark:border-secondary-700">
|
||||
<div class="flex items-center gap-3">
|
||||
<div class={`w-10 h-10 ${service.bgLight} ${service.iconColor} rounded-lg flex items-center justify-center flex-shrink-0`} aria-hidden="true">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
||||
@@ -600,8 +600,8 @@ const processSteps = [
|
||||
</svg>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-lg font-bold text-secondary-900">{Object.values(service.stats)[0]}</p>
|
||||
<p class="text-secondary-500 text-xs">{Object.keys(service.stats)[0].replace(/([A-Z])/g, ' $1').trim()}</p>
|
||||
<p class="text-lg font-bold text-secondary-900 dark:text-secondary-100">{Object.values(service.stats)[0]}</p>
|
||||
<p class="text-secondary-500 dark:text-secondary-400 text-xs">{Object.keys(service.stats)[0].replace(/([A-Z])/g, ' $1').trim()}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -612,19 +612,19 @@ const processSteps = [
|
||||
))}
|
||||
|
||||
<!-- Case Studies Section -->
|
||||
<section class="py-16 lg:py-24 bg-secondary-50">
|
||||
<section class="py-16 lg:py-24 bg-secondary-50 dark:bg-secondary-800/50">
|
||||
<div class="container-wrapper">
|
||||
<div class="text-center max-w-2xl mx-auto mb-12 lg:mb-16 reveal-on-scroll">
|
||||
<span class="text-accent-500 font-semibold text-sm uppercase tracking-wider">Real Results</span>
|
||||
<h2 class="text-3xl sm:text-4xl font-bold text-secondary-900 mt-2 mb-4">Client Success Stories</h2>
|
||||
<p class="text-secondary-600 text-lg">
|
||||
<span class="text-accent-500 dark:text-accent-400 font-semibold text-sm uppercase tracking-wider">Real Results</span>
|
||||
<h2 class="text-3xl sm:text-4xl font-bold text-secondary-900 dark:text-secondary-100 mt-2 mb-4">Client Success Stories</h2>
|
||||
<p class="text-secondary-600 dark:text-secondary-400 text-lg">
|
||||
Don't take our word for it — see the measurable impact we've delivered for our clients.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="grid sm:grid-cols-2 lg:grid-cols-3 gap-6 lg:gap-8">
|
||||
{caseStudies.map((study, idx) => (
|
||||
<div class={`case-study-card group relative bg-white rounded-2xl p-6 lg:p-8 border ${study.borderColor} hover:shadow-xl hover:-translate-y-1 transition-all duration-300 overflow-hidden reveal-on-scroll reveal-delay-${idx + 1}`}>
|
||||
<div class={`case-study-card group relative bg-white dark:bg-secondary-800 rounded-2xl p-6 lg:p-8 border ${study.borderColor} dark:border-secondary-700 hover:shadow-xl hover:-translate-y-1 transition-all duration-300 overflow-hidden reveal-on-scroll reveal-delay-${idx + 1}`}>
|
||||
<!-- Background gradient -->
|
||||
<div class={`absolute inset-0 bg-gradient-to-br ${study.gradient} opacity-50 group-hover:opacity-70 transition-opacity duration-300`} aria-hidden="true"></div>
|
||||
|
||||
@@ -652,15 +652,15 @@ const processSteps = [
|
||||
</div>
|
||||
|
||||
<!-- Big metric -->
|
||||
<p class="text-4xl font-bold text-secondary-900 mb-1">{study.metric}</p>
|
||||
<p class="text-sm font-medium text-secondary-500 mb-4">{study.metricLabel}</p>
|
||||
<p class="text-4xl font-bold text-secondary-900 dark:text-secondary-100 mb-1">{study.metric}</p>
|
||||
<p class="text-sm font-medium text-secondary-500 dark:text-secondary-400 mb-4">{study.metricLabel}</p>
|
||||
|
||||
<!-- Client & description -->
|
||||
<p class="font-semibold text-secondary-800 mb-2">{study.client}</p>
|
||||
<p class="text-secondary-600 text-sm leading-relaxed mb-4">{study.description}</p>
|
||||
<p class="font-semibold text-secondary-800 dark:text-secondary-200 mb-2">{study.client}</p>
|
||||
<p class="text-secondary-600 dark:text-secondary-400 text-sm leading-relaxed mb-4">{study.description}</p>
|
||||
|
||||
<!-- Result pill -->
|
||||
<div class="inline-flex items-center gap-1.5 px-3 py-1 bg-secondary-100 rounded-full text-xs text-secondary-600 font-medium">
|
||||
<div class="inline-flex items-center gap-1.5 px-3 py-1 bg-secondary-100 dark:bg-secondary-700 rounded-full text-xs text-secondary-600 dark:text-secondary-300 font-medium">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-3.5 h-3.5 text-emerald-500" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
|
||||
</svg>
|
||||
@@ -686,12 +686,12 @@ const processSteps = [
|
||||
</section>
|
||||
|
||||
<!-- Pricing Section -->
|
||||
<section class="py-16 lg:py-24 bg-white">
|
||||
<section class="py-16 lg:py-24 bg-white dark:bg-secondary-900">
|
||||
<div class="container-wrapper">
|
||||
<div class="text-center max-w-2xl mx-auto mb-12 lg:mb-16 reveal-on-scroll">
|
||||
<span class="text-primary-500 font-semibold text-sm uppercase tracking-wider">Transparent Pricing</span>
|
||||
<h2 class="text-3xl sm:text-4xl font-bold text-secondary-900 mt-2 mb-4">Investment Tiers</h2>
|
||||
<p class="text-secondary-600 text-lg">
|
||||
<span class="text-primary-500 dark:text-primary-400 font-semibold text-sm uppercase tracking-wider">Transparent Pricing</span>
|
||||
<h2 class="text-3xl sm:text-4xl font-bold text-secondary-900 dark:text-secondary-100 mt-2 mb-4">Investment Tiers</h2>
|
||||
<p class="text-secondary-600 dark:text-secondary-400 text-lg">
|
||||
Straightforward pricing to fit businesses at every stage. All plans include dedicated project management.
|
||||
</p>
|
||||
</div>
|
||||
@@ -702,7 +702,7 @@ const processSteps = [
|
||||
class={`relative flex flex-col rounded-2xl p-7 lg:p-8 reveal-on-scroll reveal-delay-${idx + 1} transition-all duration-300 ${
|
||||
tier.highlighted
|
||||
? 'bg-secondary-900 shadow-2xl ring-2 ring-primary-500 md:scale-105'
|
||||
: 'bg-white border border-secondary-200 hover:shadow-xl hover:-translate-y-1'
|
||||
: 'bg-white dark:bg-secondary-800 border border-secondary-200 dark:border-secondary-700 hover:shadow-xl hover:-translate-y-1'
|
||||
}`}
|
||||
>
|
||||
{tier.highlighted && (
|
||||
@@ -714,17 +714,17 @@ const processSteps = [
|
||||
)}
|
||||
|
||||
<div class="mb-6">
|
||||
<h3 class={`text-xl font-bold mb-1 ${tier.highlighted ? 'text-white' : 'text-secondary-900'}`}>
|
||||
<h3 class={`text-xl font-bold mb-1 ${tier.highlighted ? 'text-white' : 'text-secondary-900 dark:text-secondary-100'}`}>
|
||||
{tier.name}
|
||||
</h3>
|
||||
<p class={`text-sm mb-4 ${tier.highlighted ? 'text-secondary-400' : 'text-secondary-500'}`}>
|
||||
<p class={`text-sm mb-4 ${tier.highlighted ? 'text-secondary-400' : 'text-secondary-500 dark:text-secondary-400'}`}>
|
||||
{tier.description}
|
||||
</p>
|
||||
<div class="flex items-baseline gap-2">
|
||||
<span class={`text-4xl font-bold ${tier.highlighted ? 'text-white' : 'text-secondary-900'}`}>
|
||||
<span class={`text-4xl font-bold ${tier.highlighted ? 'text-white' : 'text-secondary-900 dark:text-secondary-100'}`}>
|
||||
{tier.price}
|
||||
</span>
|
||||
<span class={`text-sm ${tier.highlighted ? 'text-secondary-400' : 'text-secondary-500'}`}>
|
||||
<span class={`text-sm ${tier.highlighted ? 'text-secondary-400' : 'text-secondary-500 dark:text-secondary-400'}`}>
|
||||
{tier.period}
|
||||
</span>
|
||||
</div>
|
||||
@@ -744,7 +744,7 @@ const processSteps = [
|
||||
>
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
|
||||
</svg>
|
||||
<span class={`text-sm ${tier.highlighted ? 'text-secondary-300' : 'text-secondary-700'}`}>
|
||||
<span class={`text-sm ${tier.highlighted ? 'text-secondary-300' : 'text-secondary-700 dark:text-secondary-300'}`}>
|
||||
{feature}
|
||||
</span>
|
||||
</li>
|
||||
@@ -756,7 +756,7 @@ const processSteps = [
|
||||
class={`w-full inline-flex items-center justify-center px-6 py-3.5 rounded-lg font-semibold transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 ${
|
||||
tier.highlighted
|
||||
? 'bg-primary-500 text-white hover:bg-primary-400 focus:ring-primary-400 focus:ring-offset-secondary-900'
|
||||
: 'bg-secondary-900 text-white hover:bg-secondary-800 focus:ring-secondary-400'
|
||||
: 'bg-secondary-900 dark:bg-secondary-700 text-white hover:bg-secondary-800 dark:hover:bg-secondary-600 focus:ring-secondary-400'
|
||||
}`}
|
||||
>
|
||||
{tier.cta === 'Most Popular' ? 'Get Started' : tier.cta}
|
||||
@@ -768,9 +768,9 @@ const processSteps = [
|
||||
))}
|
||||
</div>
|
||||
|
||||
<p class="text-center text-secondary-500 text-sm mt-8">
|
||||
<p class="text-center text-secondary-500 dark:text-secondary-400 text-sm mt-8">
|
||||
All prices are estimates. Final scope and pricing determined after discovery call.
|
||||
<a href="/contact" class="text-primary-600 hover:text-primary-700 font-medium ml-1">Schedule a free consultation →</a>
|
||||
<a href="/contact" class="text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 font-medium ml-1">Schedule a free consultation →</a>
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user