Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ export default function DotnetModernizationPageClient() {

{/* Problem Signals Section */}
<ProblemSignals
title="Is Your Legacy .NET Holding You Back?"
title="Is Your Legacy .NET Framework Holding You Back?"
intro={problemIntro}
signals={problemSignals}
/>
Expand All @@ -192,7 +192,7 @@ export default function DotnetModernizationPageClient() {

{/* Approach / Process Timeline */}
<ProcessTimeline
title="Our .NET Modernization Approach"
title="How .NET Modernization Works at Procedure"
subtitle="A proven process that minimizes risk and maximizes velocity"
steps={approachSteps}
/>
Expand Down
12 changes: 6 additions & 6 deletions app/technologies/dotnet/modernization/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ import type { Metadata } from "next";

export const metadata: Metadata = {
title:
".NET Modernization Services | Migrate .NET Framework to .NET 8 | Procedure",
".NET Modernization Services | Migrate .NET Framework to .NET 8/10 | Procedure.tech",
description:
"Migrate legacy .NET Framework applications to .NET 8 with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.",
"Migrate legacy .NET Framework applications to modern .NET with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.",
alternates: {
canonical: "/technologies/dotnet/modernization",
},
openGraph: {
title:
".NET Modernization Services | Migrate .NET Framework to .NET 8 | Procedure",
".NET Modernization Services | Migrate .NET Framework to .NET 8/10 | Procedure.tech",
description:
"Migrate legacy .NET Framework applications to .NET 8 with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.",
"Migrate legacy .NET Framework applications to modern .NET with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.",
type: "website",
url: "/technologies/dotnet/modernization",
images: [
Expand All @@ -27,9 +27,9 @@ export const metadata: Metadata = {
twitter: {
card: "summary_large_image",
title:
".NET Modernization Services | Migrate .NET Framework to .NET 8 | Procedure",
".NET Modernization Services | Migrate .NET Framework to .NET 8/10 | Procedure.tech",
description:
"Migrate legacy .NET Framework applications to .NET 8 with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.",
"Migrate legacy .NET Framework applications to modern .NET with zero downtime. Expert .NET modernization using Strangler Fig pattern. Free migration assessment included.",
images: [
{
url: "/assets/technologies/dotnet-migration.png",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
SkillsTable,
UseCaseStories,
EngagementModels,
ComparisonTable,
RelatedDotnetServices,
} from "@/components/technologies";
import {
Expand All @@ -29,6 +30,8 @@ import {
whyProcedure,
engagementModelsTitle,
engagementModels,
comparisonTitle,
comparisonRows,
faqs,
ctaData,
relatedServices,
Expand Down Expand Up @@ -219,6 +222,9 @@ export default function DotnetStaffAugPageClient() {
models={engagementModels}
/>

{/* Comparison Table */}
<ComparisonTable title={comparisonTitle} rows={comparisonRows} />

{/* CTA Section with Cal.com Embed */}
<section
id="book-call"
Expand Down
6 changes: 3 additions & 3 deletions app/technologies/dotnet/staff-augmentation/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ import type { Metadata } from "next";

export const metadata: Metadata = {
title:
".NET Staff Augmentation | Hire Senior .NET Developers | Procedure",
".NET Staff Augmentation | Hire Senior .NET Developers | Procedure.tech",
description:
"Extend your team with senior .NET developers in 5 days. Pre-vetted ASP.NET Core, C#, and Azure experts who integrate with your workflows. No recruitment overhead.",
alternates: {
canonical: "/technologies/dotnet/staff-augmentation",
},
openGraph: {
title:
".NET Staff Augmentation | Hire Senior .NET Developers | Procedure",
".NET Staff Augmentation | Hire Senior .NET Developers | Procedure.tech",
description:
"Extend your team with senior .NET developers in 5 days. Pre-vetted ASP.NET Core, C#, and Azure experts who integrate with your workflows. No recruitment overhead.",
type: "website",
Expand All @@ -27,7 +27,7 @@ export const metadata: Metadata = {
twitter: {
card: "summary_large_image",
title:
".NET Staff Augmentation | Hire Senior .NET Developers | Procedure",
".NET Staff Augmentation | Hire Senior .NET Developers | Procedure.tech",
description:
"Extend your team with senior .NET developers in 5 days. Pre-vetted ASP.NET Core, C#, and Azure experts who integrate with your workflows. No recruitment overhead.",
images: [
Expand Down
3 changes: 2 additions & 1 deletion components/expertise/FAQSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { useState } from "react";
import { m, AnimatePresence } from "framer-motion";
import { cn } from "@/lib/utils";
import { renderLinkedText } from "@/lib/render-linked-text";

interface FAQ {
question: string;
Expand Down Expand Up @@ -99,7 +100,7 @@ export function FAQSection({
<div className="px-6 pb-5">
<div className="h-px bg-border mb-4" />
<p className="text-text-secondary leading-relaxed">
{faq.answer}
{renderLinkedText(faq.answer)}
</p>
</div>
</m.div>
Expand Down
84 changes: 84 additions & 0 deletions components/technologies/ComparisonTable.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"use client";

import { m } from "framer-motion";
import { cn } from "@/lib/utils";

interface ComparisonRow {
factor: string;
fullTimeHire: string;
staffAug: string;
}

interface ComparisonTableProps {
title?: string;
rows: ComparisonRow[];
}

export function ComparisonTable({
title = "Staff Augmentation vs Full-Time Hiring",
rows,
}: ComparisonTableProps) {
return (
<section className="py-16 sm:py-24 bg-base">
<div className="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<m.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5 }}
className="text-center mb-12 sm:mb-16"
>
<h2 className="text-3xl sm:text-4xl font-semibold tracking-tight text-text-primary">
{title}
</h2>
</m.div>

<m.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.1 }}
className="overflow-x-auto rounded-2xl border border-border"
>
<table className="w-full text-left">
<thead>
<tr className="bg-surface-elevated/80">
<th className="px-6 py-4 text-sm font-semibold text-text-primary border-b border-border">
Factor
</th>
<th className="px-6 py-4 text-sm font-semibold text-text-primary border-b border-border">
Full-Time .NET Hire
</th>
<th className="px-6 py-4 text-sm font-semibold text-accent-light border-b border-border">
Staff Aug with Procedure
</th>
</tr>
</thead>
<tbody>
{rows.map((row, index) => (
<tr
key={index}
className={cn(
"transition-colors",
index % 2 === 0 ? "bg-surface/50" : "bg-surface-elevated/30",
index < rows.length - 1 && "border-b border-border/50"
)}
>
<td className="px-6 py-4 text-sm font-medium text-text-primary">
{row.factor}
</td>
<td className="px-6 py-4 text-sm text-text-secondary">
{row.fullTimeHire}
</td>
<td className="px-6 py-4 text-sm text-text-secondary font-medium">
{row.staffAug}
</td>
</tr>
))}
</tbody>
</table>
</m.div>
</div>
</section>
);
}
8 changes: 8 additions & 0 deletions components/technologies/EngagementModels.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ interface EngagementModel {
description: string;
teamSize?: string;
bestFor?: string;
typicalDuration?: string;
}

interface EngagementModelsProps {
Expand Down Expand Up @@ -108,6 +109,13 @@ export function EngagementModels({
<p className="text-text-secondary text-sm leading-relaxed">
{model.description}
</p>

{/* Typical Duration */}
{model.typicalDuration && (
<p className="mt-4 text-xs font-medium text-accent-light">
{model.typicalDuration}
</p>
)}
</div>
</m.div>
))}
Expand Down
5 changes: 3 additions & 2 deletions components/technologies/MigrationPathsTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { m } from "framer-motion";
import { cn } from "@/lib/utils";
import { renderLinkedText } from "@/lib/render-linked-text";

interface MigrationPath {
from: string;
Expand Down Expand Up @@ -119,7 +120,7 @@ export function MigrationPathsTable({
{path.from}
</td>
<td className="px-6 py-4 text-sm text-text-primary font-medium">
{path.to}
{renderLinkedText(path.to)}
</td>
<td className="px-6 py-4">
<ComplexityBadge complexity={path.complexity} />
Expand Down Expand Up @@ -183,7 +184,7 @@ export function MigrationPathsTable({
To
</span>
<p className="text-sm font-medium text-text-primary">
{path.to}
{renderLinkedText(path.to)}
</p>
</div>
</div>
Expand Down
3 changes: 2 additions & 1 deletion components/technologies/ProblemSignals.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { m } from "framer-motion";
import { ReactNode } from "react";
import { cn } from "@/lib/utils";
import { Icons } from "@/lib/expertise-data";
import { renderLinkedText } from "@/lib/render-linked-text";

interface Signal {
title: string;
Expand Down Expand Up @@ -105,7 +106,7 @@ export function ProblemSignals({
{signal.title}
</h3>
<p className="text-text-secondary text-sm leading-relaxed">
{signal.description}
{renderLinkedText(signal.description)}
</p>
</div>
</m.div>
Expand Down
7 changes: 4 additions & 3 deletions components/technologies/ServiceFeatures.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { m } from "framer-motion";
import { ReactNode } from "react";
import { cn } from "@/lib/utils";
import { Icons } from "@/lib/expertise-data";
import { renderLinkedText } from "@/lib/render-linked-text";

interface ServiceFeature {
title: string;
Expand Down Expand Up @@ -79,7 +80,7 @@ function EditorialCard({

{/* Description */}
<p className="text-text-secondary text-sm leading-relaxed">
{feature.description}
{renderLinkedText(feature.description)}
</p>

{/* Optional items in 2-column grid */}
Expand All @@ -103,7 +104,7 @@ function EditorialCard({
d="M8.25 4.5l7.5 7.5-7.5 7.5"
/>
</svg>
{item}
{renderLinkedText(item)}
</li>
))}
</ul>
Expand Down Expand Up @@ -150,7 +151,7 @@ function CompactCard({ feature }: { feature: ServiceFeature }) {

{/* Description */}
<p className="text-text-secondary text-sm leading-relaxed">
{feature.description}
{renderLinkedText(feature.description)}
</p>
</div>
</m.div>
Expand Down
3 changes: 2 additions & 1 deletion components/technologies/TechnicalCapabilities.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { m } from "framer-motion";
import { cn } from "@/lib/utils";
import { renderLinkedText } from "@/lib/render-linked-text";

interface CapabilityGroup {
title: string;
Expand Down Expand Up @@ -98,7 +99,7 @@ export function TechnicalCapabilities({
d="M8.25 4.5l7.5 7.5-7.5 7.5"
/>
</svg>
{item}
{renderLinkedText(item)}
</li>
))}
</ul>
Expand Down
3 changes: 2 additions & 1 deletion components/technologies/UseCaseStories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { m } from "framer-motion";
import { ReactNode } from "react";
import { cn } from "@/lib/utils";
import { Icons } from "@/lib/expertise-data";
import { renderLinkedText } from "@/lib/render-linked-text";

interface UseCase {
title: string;
Expand Down Expand Up @@ -116,7 +117,7 @@ export function UseCaseStories({

{/* Description */}
<p className="text-text-secondary text-sm leading-relaxed flex-grow">
{useCase.description}
{renderLinkedText(useCase.description)}
</p>

{/* Outcome bar */}
Expand Down
1 change: 1 addition & 0 deletions components/technologies/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ export { ServiceFeatures } from "./ServiceFeatures";
export { SkillsTable } from "./SkillsTable";
export { UseCaseStories } from "./UseCaseStories";
export { EngagementModels } from "./EngagementModels";
export { ComparisonTable } from "./ComparisonTable";
Loading
Loading