diff --git a/app/about-us/page.tsx b/app/about-us/page.tsx index f440b4c..29d41c6 100644 --- a/app/about-us/page.tsx +++ b/app/about-us/page.tsx @@ -280,8 +280,9 @@ export default function AboutPage() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: idx * 0.1 }} + className="h-full" > -
Leadership
-@@ -464,7 +465,7 @@ export default function AboutPage() {
Why Procedure
-@@ -521,7 +522,7 @@ export default function AboutPage() {
Trust & Compliance
-Our Principles
-How We Operationalize Safety
-Frameworks & Standards
-Industry-Specific Safety
-diff --git a/app/ai-upskill/page.tsx b/app/ai-upskill/page.tsx index ee5b663..daa77e9 100644 --- a/app/ai-upskill/page.tsx +++ b/app/ai-upskill/page.tsx @@ -70,7 +70,7 @@ const faqs = [ { question: "When does the next cohort start?", answer: - "Watch for announcements in Slack. Our target launch is Q2 2025 (July). We'll share exact dates and registration details as they're finalized.", + "Watch for announcements in Slack. Our target launch is Q2 2026 (July). We'll share exact dates and registration details as they're finalized.", }, { question: "Do I need to know how to code?", @@ -860,7 +860,7 @@ export default function AIUpskillPage() { href="/contact-us" className="inline-flex items-center justify-center gap-2 px-8 py-4 bg-cta text-cta-text font-semibold rounded-xl hover:brightness-110 transition-all" > - Contact Us + Bring AI Upskill to Your Team
How We Work
-What Makes Us Different
-@@ -947,7 +924,7 @@ export default function ApproachPage() {
Our Principles
-What You Can Expect
-
diff --git a/app/blogs/[slug]/page.tsx b/app/blogs/[slug]/page.tsx
index 08b7d80..4b09adc 100644
--- a/app/blogs/[slug]/page.tsx
+++ b/app/blogs/[slug]/page.tsx
@@ -775,7 +775,7 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
)}
{/* CTA Section */}
-
Why Join Procedure
-@@ -275,7 +275,7 @@ export default function CareersPage() {
Our Engineering Culture
-@@ -346,7 +346,7 @@ export default function CareersPage() {
Current Openings
-diff --git a/app/contact-us/page.tsx b/app/contact-us/page.tsx index f7af1ab..cd2cdf7 100644 --- a/app/contact-us/page.tsx +++ b/app/contact-us/page.tsx @@ -565,7 +565,7 @@ export default function ContactPage() { transition={{ duration: 0.6 }} className="text-center mb-12" > -
@@ -646,7 +646,7 @@ export default function ContactPage() { transition={{ duration: 0.6 }} className="text-center mb-12" > -
diff --git a/app/culture/page.tsx b/app/culture/page.tsx index c214f52..661fd94 100644 --- a/app/culture/page.tsx +++ b/app/culture/page.tsx @@ -464,18 +464,15 @@ export default function CulturePage() {
How It Started
-- Today, we're still experimenting, breaking, fixing, and - shipping together, because that's how real products and real - teams grow. Our team is a mixed bag. Of the smart and the hard - workers. Of the organised and slightly chaotic. Of the early - risers and the burners of the midnight oil. We appreciate - diversity and truly like having differing perspectives in the - room. + +
+ We're still experimenting, breaking, fixing, and shipping + together—because that's how real products and real + teams grow. A diverse mix of perspectives, personalities, and + working styles, united by a shared love for the craft.
@@ -520,7 +517,7 @@ export default function CulturePage() { {/* Beliefs Grid */} -Flagship Meetup
-@@ -532,7 +532,7 @@ export default function EventsPage() {
Event Archive
-@@ -828,7 +828,7 @@ export default function EventsPage() {
Our Philosophy
-@@ -926,7 +926,7 @@ export default function EventsPage() {
@@ -1000,7 +1000,7 @@ export default function EventsPage() {
Join Us
-diff --git a/app/services/[slug]/AISecurityPageClient.tsx b/app/services/[slug]/AISecurityPageClient.tsx index dfb92c4..76a994d 100644 --- a/app/services/[slug]/AISecurityPageClient.tsx +++ b/app/services/[slug]/AISecurityPageClient.tsx @@ -3,7 +3,7 @@ import { motion } from "framer-motion"; import { PageHero } from "@/components/ui"; import { CalInline } from "@/components/CalInline"; -import { RelatedExpertise } from "@/components/expertise"; +import { RelatedExpertise, FAQSection } from "@/components/expertise"; interface RelatedPage { slug: string; @@ -140,7 +140,7 @@ export default function AISecurityPageClient({ data, relatedPages }: Props) { headlineAccent={data.hero.headlineAccent} description={data.hero.description} primaryCTA={{ text: "Book Security Assessment", href: "#book-call" }} - secondaryCTA={{ text: "See How We Work", href: "#services" }} + secondaryCTA={{ text: "See How We Work", href: "#process" }} /> {/* Risks Section */} @@ -150,7 +150,7 @@ export default function AISecurityPageClient({ data, relatedPages }: Props) { initial={{ opacity: 0, y: 20 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} - className="mb-12" + className="text-center mb-12" >
The Risks @@ -193,7 +193,7 @@ export default function AISecurityPageClient({ data, relatedPages }: Props) { initial={{ opacity: 0, y: 20 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} - className="mb-12" + className="text-center mb-12" >
What We Do
@@ -240,13 +240,13 @@ export default function AISecurityPageClient({ data, relatedPages }: Props) {
{/* Process Section */}
-
How We Work
@@ -283,7 +283,7 @@ export default function AISecurityPageClient({ data, relatedPages }: Props) {
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
- className="mb-12"
+ className="text-center mb-12"
>
Is This For You?
@@ -344,39 +344,7 @@ export default function AISecurityPageClient({ data, relatedPages }: Props) {
{/* FAQ Section */}
-
- Questions
- {faq.answer}
diff --git a/app/services/[slug]/ServicePageClient.tsx b/app/services/[slug]/ServicePageClient.tsx
index ac34089..2451eea 100644
--- a/app/services/[slug]/ServicePageClient.tsx
+++ b/app/services/[slug]/ServicePageClient.tsx
@@ -101,7 +101,7 @@ export default function ServicePageClient({ service }: Props) {
viewport={{ once: true }}
className="text-center mb-16"
>
-
Why Choose Procedure
The Comparison
@@ -451,7 +451,7 @@ export default function WhyUsPage() {
Our Process
- Frequently Asked Questions
-
- {faq.question}
-
+
Let's Find the Gaps{" "}
Before Attackers Do
diff --git a/app/services/[slug]/ExpertisePageClient.tsx b/app/services/[slug]/ExpertisePageClient.tsx
index 05084eb..8a43d91 100644
--- a/app/services/[slug]/ExpertisePageClient.tsx
+++ b/app/services/[slug]/ExpertisePageClient.tsx
@@ -204,7 +204,6 @@ export default function ExpertisePageClient({
badge={pageData.hero.badge}
headline={pageData.hero.headline}
headlineAccent={pageData.hero.headlineAccent}
- tagline={pageData.hero.tagline}
description={pageData.hero.description}
primaryCTA={
expertise.slug === "frontend-development"
@@ -378,7 +377,7 @@ export default function ExpertisePageClient({
viewport={{ once: true }}
transition={{ duration: 0.6 }}
>
-
+
Discuss Your .NET Project
+
{benefitsTitle}
+
{processTitle}
@@ -202,7 +202,7 @@ export default function ServicePageClient({ service }: Props) {
viewport={{ once: true }}
className="text-center mb-12"
>
-
+
{additionalItemsTitle}
@@ -235,7 +235,7 @@ export default function ServicePageClient({ service }: Props) {
viewport={{ once: true }}
className="text-center mb-12"
>
-
+
Compliance & Security
@@ -267,7 +267,7 @@ export default function ServicePageClient({ service }: Props) {
viewport={{ once: true }}
className="text-center mb-12"
>
-
+
{idealForTitle}
diff --git a/app/why-us/page.tsx b/app/why-us/page.tsx
index 0217f74..3174a74 100644
--- a/app/why-us/page.tsx
+++ b/app/why-us/page.tsx
@@ -230,7 +230,7 @@ export default function WhyUsPage() {
+
Five reasons teams choose{" "}
Procedure for AI
@@ -278,7 +278,7 @@ export default function WhyUsPage() {
+
This is not your typical consultancy
+
From first call to{" "}
production AI
diff --git a/app/work/[slug]/CaseStudyDetailClient.tsx b/app/work/[slug]/CaseStudyDetailClient.tsx
index 4738ab0..2beee20 100644
--- a/app/work/[slug]/CaseStudyDetailClient.tsx
+++ b/app/work/[slug]/CaseStudyDetailClient.tsx
@@ -463,7 +463,7 @@ export function CaseStudyDetailClient({
viewport={{ once: true }}
transition={{ duration: 0.6 }}
>
-
+
Ready to Build Your
Success Story?
diff --git a/components/FooterReveal.tsx b/components/FooterReveal.tsx
index 5c395c6..7f607e8 100644
--- a/components/FooterReveal.tsx
+++ b/components/FooterReveal.tsx
@@ -13,7 +13,7 @@ export function FooterReveal() {
textColor="var(--color-text-muted)"
dotColor="var(--color-text-muted)"
variant="outlined"
- className="w-[120%] max-w-none h-auto opacity-70"
+ className="w-full max-w-none h-auto opacity-70"
/>
- Our team has deployed AI systems serving billions of requests. - Let's talk about your engineering challenges and how we can - help. + {cta.description}
{/* Dual CTAs */} @@ -46,10 +126,10 @@ export function BlogCTA() { - View Our Work + {cta.secondaryLabel}- {featuredSolution.description} -
- - - {/* Side cards */} -- {solution.description} -
-- {solution.description} -
-+ {solution.description} +
+ + ))}Whether you're building your first LLM application or scaling diff --git a/components/sections/EngagementModels.tsx b/components/sections/EngagementModels.tsx index a710012..d6e2e88 100644 --- a/components/sections/EngagementModels.tsx +++ b/components/sections/EngagementModels.tsx @@ -111,8 +111,8 @@ export function EngagementModels() {
Engagement Models
-Three proven engagement frameworks designed for different business diff --git a/components/sections/FAQ.tsx b/components/sections/FAQ.tsx index 03ce225..cdb546d 100644 --- a/components/sections/FAQ.tsx +++ b/components/sections/FAQ.tsx @@ -67,7 +67,7 @@ export function FAQ() { FAQ
A proven engagement process built for enterprise velocity. Your team diff --git a/components/sections/Services.tsx b/components/sections/Services.tsx index c64d452..d5318d3 100644 --- a/components/sections/Services.tsx +++ b/components/sections/Services.tsx @@ -177,7 +177,7 @@ export function Services() { What You Get
Our Team
-diff --git a/components/sections/Testimonials.tsx b/components/sections/Testimonials.tsx index eb6f51f..fe04a06 100644 --- a/components/sections/Testimonials.tsx +++ b/components/sections/Testimonials.tsx @@ -29,7 +29,7 @@ export function Testimonials() { Testimonials
Why teams choose us
-Procedure delivers senior AI engineers who write production code, not diff --git a/content/industries/education.mdx b/content/industries/education.mdx index ee3dd45..e36eb1a 100644 --- a/content/industries/education.mdx +++ b/content/industries/education.mdx @@ -43,15 +43,7 @@ solutions: - title: "Accessibility-First Design" description: "Build educational AI that works for all learners. Screen reader compatibility, caption generation, and inclusive design patterns." icon: "users" -compliance: - - name: "FERPA" - description: "Compliant" - - name: "COPPA" - description: "Compliant" - - name: "WCAG 2.1 AA" - description: "Accessible" - - name: "SOC 2" - description: "Certified" +compliance: [] useCases: - adaptive-learning - content-generation diff --git a/content/industries/financial-services.mdx b/content/industries/financial-services.mdx index bc2a93c..4da2b83 100644 --- a/content/industries/financial-services.mdx +++ b/content/industries/financial-services.mdx @@ -43,15 +43,7 @@ solutions: - title: "Compliance & RegTech" description: "Automated compliance monitoring, transaction surveillance, and regulatory reporting. AI that helps you stay compliant, not create new risks." icon: "clipboard" -compliance: - - name: "SOC 2 Type II" - description: "Certified" - - name: "PCI-DSS" - description: "Compliant" - - name: "FINRA/SEC" - description: "Ready" - - name: "GDPR" - description: "Compliant" +compliance: [] useCases: - fraud-detection - algorithmic-trading diff --git a/content/industries/healthcare.mdx b/content/industries/healthcare.mdx index 165bc8c..677a29f 100644 --- a/content/industries/healthcare.mdx +++ b/content/industries/healthcare.mdx @@ -43,15 +43,7 @@ solutions: - title: "Population Health Analytics" description: "Predictive models for risk stratification, care gaps, and population health management. Data-driven insights for better outcomes." icon: "chart" -compliance: - - name: "HIPAA" - description: "Compliant" - - name: "HITRUST" - description: "Certified" - - name: "HL7 FHIR" - description: "Compatible" - - name: "FDA" - description: "Pathway Ready" +compliance: [] useCases: - clinical-documentation - diagnostic-support @@ -89,6 +81,5 @@ seo: ## Results We've Delivered - **30-50% reduction** in documentation time -- **100% HIPAA compliant** across all deployments - **15-25% improvement** in clinical workflow efficiency - **85%+ clinician satisfaction** with AI-assisted tools diff --git a/content/industries/saas.mdx b/content/industries/saas.mdx index 7c775d2..64f03c2 100644 --- a/content/industries/saas.mdx +++ b/content/industries/saas.mdx @@ -43,15 +43,7 @@ solutions: - title: "API & Platform AI" description: "Build AI capabilities into your platform that customers and partners can leverage. AI as a product differentiator." icon: "code" -compliance: - - name: "SOC 2" - description: "Certified" - - name: "GDPR" - description: "Compliant" - - name: "API Security" - description: "Best Practices" - - name: "Data Privacy" - description: "By Design" +compliance: [] useCases: - ai-copilot - intelligent-search diff --git a/content/services/scale-ups.mdx b/content/services/scale-ups.mdx index 0237773..0310f12 100644 --- a/content/services/scale-ups.mdx +++ b/content/services/scale-ups.mdx @@ -9,7 +9,7 @@ primaryCTA: text: "Scale Your Team Now" href: "/contact-us" secondaryCTA: - text: "View Scale-Up Case Studies" + text: "See Case Studies" href: "/work" benefits: - title: "Add Senior Capacity in Days" diff --git a/content/services/startups.mdx b/content/services/startups.mdx index 14943c6..f1b19cc 100644 --- a/content/services/startups.mdx +++ b/content/services/startups.mdx @@ -8,7 +8,7 @@ primaryCTA: text: "Talk to Us This Week" href: "/contact-us" secondaryCTA: - text: "See Startup Case Studies" + text: "See Case Studies" href: "/work" benefits: - title: "Weeks to Market, Not Months" diff --git a/lib/content.ts b/lib/content.ts index 7bb33fd..47250bd 100644 --- a/lib/content.ts +++ b/lib/content.ts @@ -1011,8 +1011,9 @@ function parseMetricsFromContent( if (match) { const [, boldPart, context] = match; // Try to split bold part into value and label + // Matches: optional $, digits/symbols, optional letter suffix (e.g. "ms", "M", "x"), optional trailing +/% const valueLabelMatch = boldPart.match( - /^([\d\.\-<>%\+]+\s*[\w]*)\s+(.+)$/, + /^(\$?[\d.\-<>%+]+[A-Za-z]*[+%]?)\s+(.+)$/, ); if (valueLabelMatch) { return { diff --git a/lib/notion-blog.ts b/lib/notion-blog.ts index 31af5c9..450ad67 100644 --- a/lib/notion-blog.ts +++ b/lib/notion-blog.ts @@ -275,15 +275,6 @@ function generateSlug(title: string): string { } // ============================================================================= -// Read Time Calculation -// ============================================================================= - -function calculateReadTime(content: string): number { - const wordsPerMinute = 200; - const words = content.trim().split(/\s+/).length; - return Math.ceil(words / wordsPerMinute); -} - // ============================================================================= // Transform Notion Page to BlogPost // ============================================================================= @@ -812,18 +803,18 @@ export const getNotionBlogPostBySlug = cache( // Cache any images in the content to public folder await cacheContentImages(notionContent, slug, "blog"); - // Generate content string for read time calculation + // Generate content string const contentText = notionContent .filter((block) => block.text) .map((block) => block.text) .join(" "); - const readTime = calculateReadTime(contentText) || detail.readTime; - + // Use the same readTime from Notion property as the listing cards + // to ensure consistency between blog cards and blog post pages. + // The Notion "Read Time" property (or default 5) is set in processNotionPage(). return { ...detail, content: contentText, - readTime, notionContent, }; }