diff --git a/apps/web/src/app/[locale]/(marketing)/page.tsx b/apps/web/src/app/[locale]/(marketing)/page.tsx index 9a29a76..4eb89c9 100644 --- a/apps/web/src/app/[locale]/(marketing)/page.tsx +++ b/apps/web/src/app/[locale]/(marketing)/page.tsx @@ -1,16 +1,20 @@ import { Banner } from "~/modules/marketing/home/banner"; import { Faq } from "~/modules/marketing/home/faq"; -import { Features } from "~/modules/marketing/home/features"; import { Hero } from "~/modules/marketing/home/hero"; import { HowItWorks } from "~/modules/marketing/home/how-it-works"; +import { ReportPreview } from "~/modules/marketing/home/report-preview"; +import { ReviewEvidence } from "~/modules/marketing/home/review-evidence"; +import { SocialProof } from "~/modules/marketing/home/social-proof"; import { Testimonials } from "~/modules/marketing/home/testimonials"; const HomePage = () => { return ( <> + - + + diff --git a/apps/web/src/modules/marketing/home/banner.tsx b/apps/web/src/modules/marketing/home/banner.tsx index 70bcfa9..5ad319e 100644 --- a/apps/web/src/modules/marketing/home/banner.tsx +++ b/apps/web/src/modules/marketing/home/banner.tsx @@ -5,6 +5,36 @@ import { buttonVariants } from "@turbostarter/ui-web/button"; import { CtaButton } from "~/modules/marketing/layout/cta-button"; import { Section } from "~/modules/marketing/layout/section"; +const ScoreGauge = () => ( + +); + export const Banner = async () => { const { t } = await getTranslation({ ns: "marketing" }); return ( @@ -12,9 +42,13 @@ export const Banner = async () => { id="banner" className="bg-primary text-primary-foreground !max-w-full gap-4 sm:gap-6 md:gap-8 lg:gap-10" > +

{t("cta.question")}

+

+ {t("banner.urgency")} +

); diff --git a/apps/web/src/modules/marketing/home/features.tsx b/apps/web/src/modules/marketing/home/features.tsx index fec3f90..042f2f2 100644 --- a/apps/web/src/modules/marketing/home/features.tsx +++ b/apps/web/src/modules/marketing/home/features.tsx @@ -1,12 +1,5 @@ import { getTranslation } from "@turbostarter/i18n/server"; import { cn } from "@turbostarter/ui"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@turbostarter/ui-web/card"; import { Icons } from "@turbostarter/ui-web/icons"; import { @@ -17,23 +10,67 @@ import { SectionTitle, } from "~/modules/marketing/layout/section"; +const GaugeAccent = () => ( + + + + +); + +const domainDotColors = [ + "#3b82f6", + "#22c55e", + "#f59e0b", + "#8b5cf6", + "#f43f5e", + "#6b7280", +]; + +const DomainsAccent = () => ( +
+ {domainDotColors.map((color) => ( +
+ ))} +
+); + +const BarsAccent = () => ( +
+
+
+
+
+); + +const CheckAccent = () => ( +
+ + + +
+); + const features = [ - { - key: "score", - icon: Icons.Target, - }, - { - key: "domains", - icon: Icons.BarChart3, - }, - { - key: "plan", - icon: Icons.Zap, - }, - { - key: "insights", - icon: Icons.TrendingUp, - }, + { key: "score", Accent: GaugeAccent }, + { key: "domains", Accent: DomainsAccent }, + { key: "plan", Accent: BarsAccent }, + { key: "insights", Accent: CheckAccent }, ] as const; export const Features = async () => { @@ -47,21 +84,23 @@ export const Features = async () => { {t("features.description")} -
+
{features.map((feature) => ( - - -
- -
- - {t(`features.feature.${feature.key}.title`)} - - - {t(`features.feature.${feature.key}.description`)} - -
-
+
+ + {t(`features.feature.${feature.key}.stat` as const)} + + + + {t(`features.feature.${feature.key}.title` as const)} + +
))}
diff --git a/apps/web/src/modules/marketing/home/hero.tsx b/apps/web/src/modules/marketing/home/hero.tsx index 68d7350..5eac570 100644 --- a/apps/web/src/modules/marketing/home/hero.tsx +++ b/apps/web/src/modules/marketing/home/hero.tsx @@ -1,5 +1,7 @@ import { getTranslation } from "@turbostarter/i18n/server"; import { buttonVariants } from "@turbostarter/ui-web/button"; +import { GridPattern } from "@turbostarter/ui-web/grid-pattern"; +import { Icons } from "@turbostarter/ui-web/icons"; import { pathsConfig } from "~/config/paths"; import { TurboLink } from "~/modules/common/turbo-link"; @@ -11,7 +13,12 @@ export const Hero = async () => { const { t } = await getTranslation(); return ( -
+
+
@@ -41,6 +48,20 @@ export const Hero = async () => { {t("contact.cta")}
+
+ + + {t("hero.stats.reviews")} + + + + {t("hero.stats.score")} + + + + {t("hero.stats.issues")} + +
); diff --git a/apps/web/src/modules/marketing/home/how-it-works.tsx b/apps/web/src/modules/marketing/home/how-it-works.tsx index a2a589c..6c46d9d 100644 --- a/apps/web/src/modules/marketing/home/how-it-works.tsx +++ b/apps/web/src/modules/marketing/home/how-it-works.tsx @@ -1,6 +1,6 @@ import { getTranslation } from "@turbostarter/i18n/server"; import { cn } from "@turbostarter/ui"; -import { Icons } from "@turbostarter/ui-web/icons"; +import { MapPin } from "lucide-react"; import { Section, @@ -10,22 +10,67 @@ import { SectionTitle, } from "~/modules/marketing/layout/section"; +const SearchBarMockup = () => ( +
+ + Search your business... +
+); + +const GaugeMockup = () => ( +
+ + + + +
+ {["#3b82f6", "#22c55e", "#f59e0b"].map((color) => ( +
+ ))} +
+
+); + +const ReportMockup = () => ( +
+ + Reputation Blueprint + +
+
+ 83 +
+
+
+
+
+
+
+
+); + +const stepMockups = [SearchBarMockup, GaugeMockup, ReportMockup] as const; + const steps = [ - { - key: "share", - icon: Icons.Link, - number: "1", - }, - { - key: "analyze", - icon: Icons.Search, - number: "2", - }, - { - key: "receive", - icon: Icons.FileText, - number: "3", - }, + { key: "share", number: 1 }, + { key: "analyze", number: 2 }, + { key: "receive", number: 3 }, ] as const; export const HowItWorks = async () => { @@ -39,36 +84,42 @@ export const HowItWorks = async () => { {t("howItWorks.description")} -
- {steps.map((step, index) => ( -
- {index < steps.length - 1 && ( -
- -
- )} - +
+ {steps.map((step, index) => { + const Mockup = stepMockups[index]!; + return (
- + {/* Numbered circle + connector */} +
+ {index < steps.length - 1 && ( +
+ )} +
+ {step.number} +
+
+ + {/* Visual mockup */} +
+ +
+ + {/* Text */} +

+ {t(`howItWorks.steps.${step.key}.title` as const)} +

+

+ {t(`howItWorks.steps.${step.key}.description` as const)} +

- - - Step {step.number} - - -

- {t(`howItWorks.steps.${step.key}.title` as const)} -

- -

- {t(`howItWorks.steps.${step.key}.description` as const)} -

-
- ))} + ); + })}
); diff --git a/apps/web/src/modules/marketing/home/report-preview.tsx b/apps/web/src/modules/marketing/home/report-preview.tsx new file mode 100644 index 0000000..aaa16e9 --- /dev/null +++ b/apps/web/src/modules/marketing/home/report-preview.tsx @@ -0,0 +1,418 @@ +"use client"; + +import { useState } from "react"; +import { useTranslation } from "@turbostarter/i18n"; +import { cn } from "@turbostarter/ui"; + +import { CtaButton } from "~/modules/marketing/layout/cta-button"; +import { + Section, + SectionBadge, + SectionDescription, + SectionHeader, + SectionTitle, +} from "~/modules/marketing/layout/section"; + +// --------------------------------------------------------------------------- +// Demo data (hardcoded for "Bistro El Sol") +// --------------------------------------------------------------------------- + +const SCORE = 83; +const SCORE_COLOR = "#22c55e"; + +const PILLARS = [ + { key: "ratingQuality", value: 88, color: "#4285F4" }, + { key: "sentimentDepth", value: 76, color: "#8b5cf6" }, + { key: "volume", value: 91, color: "#22c55e" }, + { key: "momentum", value: 72, color: "#f59e0b" }, + { key: "intensity", value: 85, color: "#3b82f6" }, +] as const; + +const DOMAINS = [ + { key: "operations", color: "#3b82f6", value: 78 }, + { key: "product", color: "#22c55e", value: 85 }, + { key: "journey", color: "#f59e0b", value: 62 }, + { key: "environment", color: "#8b5cf6", value: 71 }, + { key: "value", color: "#f43f5e", value: 68 }, + { key: "management", color: "#6b7280", value: 74 }, +] as const; + +const SEVERITY_COLORS: Record = { + Critical: "#ef4444", + High: "#f97316", + Medium: "#f59e0b", +}; + +const EFFORT_COLORS: Record = { + Low: "#22c55e", + Medium: "#f59e0b", + High: "#ef4444", +}; +const IMPACT_COLORS: Record = { + Low: "#6b7280", + Medium: "#f59e0b", + High: "#22c55e", +}; + +const DOMAIN_COLORS: Record = { + Operations: "#3b82f6", + Product: "#22c55e", + Environment: "#8b5cf6", +}; + +const TABS = ["score", "domains", "issues", "actions"] as const; +type Tab = (typeof TABS)[number]; + +// --------------------------------------------------------------------------- +// Score Tab +// --------------------------------------------------------------------------- + +function ScoreTab() { + const { t } = useTranslation("marketing"); + const radius = 80; + const stroke = 12; + const cx = 100; + const cy = 100; + const circumference = Math.PI * radius; + const offset = circumference - (SCORE / 100) * circumference; + + return ( +
+ {/* Left: Gauge + band */} +
+ + {t("reportPreview.demo.businessName")} + + +
+ + + + +
+ + {SCORE} + + + {t("reportPreview.demo.scoreLabel")} + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ + {/* Right: Pillar bars */} +
+ {PILLARS.map((p) => ( +
+ + {t(`reportPreview.demo.pillars.${p.key}` as const)} + +
+
+
+ + {p.value}% + +
+ ))} +
+
+ ); +} + +// --------------------------------------------------------------------------- +// Domains Tab +// --------------------------------------------------------------------------- + +function DomainsTab() { + const { t } = useTranslation("marketing"); + + return ( +
+ {DOMAINS.map((d) => ( +
+ + + {t(`reportPreview.demo.domains.${d.key}` as const)} + +
+
+
+ + {d.value}% + +
+ ))} +
+ ); +} + +// --------------------------------------------------------------------------- +// Issues Tab +// --------------------------------------------------------------------------- + +function IssuesTab() { + const { t } = useTranslation("marketing"); + + const issues = [ + { key: "issue1" as const, idx: 0 }, + { key: "issue2" as const, idx: 1 }, + { key: "issue3" as const, idx: 2 }, + ]; + + return ( +
+ {issues.map(({ key: issueKey, idx }) => { + const severity = t(`reportPreview.demo.issues.${issueKey}.severity` as const); + const severityColor = SEVERITY_COLORS[severity] ?? "#f59e0b"; + const domain = t(`reportPreview.demo.issues.${issueKey}.domain` as const); + const domainColor = DOMAIN_COLORS[domain] ?? "#6b7280"; + + return ( +
+
+ {idx + 1} +
+ +
+

+ {t(`reportPreview.demo.issues.${issueKey}.title` as const)} +

+ +
+ + + {domain} + + + {t(`reportPreview.demo.issues.${issueKey}.complaints` as const)} + + + {severity} + +
+ +
+

+ {t(`reportPreview.demo.issues.${issueKey}.quote` as const)} +

+
+
+
+ ); + })} +
+ ); +} + +// --------------------------------------------------------------------------- +// Actions Tab +// --------------------------------------------------------------------------- + +function ActionsTab() { + const { t } = useTranslation("marketing"); + + const actions = [ + { key: "action1" as const, idx: 0 }, + { key: "action2" as const, idx: 1 }, + { key: "action3" as const, idx: 2 }, + ]; + + return ( +
+ {actions.map(({ key: actionKey, idx }) => { + const effort = t(`reportPreview.demo.actions.${actionKey}.effort` as const); + const impact = t(`reportPreview.demo.actions.${actionKey}.impact` as const); + + return ( +
+
+ {idx + 1} +
+ +
+

+ {t(`reportPreview.demo.actions.${actionKey}.title` as const)} +

+ +
+ + {effort} effort + + + {impact} impact + +
+
+
+ ); + })} +
+ ); +} + +// --------------------------------------------------------------------------- +// Main component +// --------------------------------------------------------------------------- + +export const ReportPreview = () => { + const [activeTab, setActiveTab] = useState("score"); + const { t } = useTranslation("marketing"); + + return ( +
+ + {t("reportPreview.label")} + {t("reportPreview.title")} + + {t("reportPreview.description")} + + + +
+ {/* Ambient glow */} +
+
+
+
+ + {/* Card */} +
+ {/* Tab bar */} +
+ {TABS.map((tab) => ( + + ))} +
+ + {/* Tab content */} +
+ {activeTab === "score" && } + {activeTab === "domains" && } + {activeTab === "issues" && } + {activeTab === "actions" && } +
+
+
+ + {t("reportPreview.cta")} +
+ ); +}; diff --git a/apps/web/src/modules/marketing/home/review-evidence.tsx b/apps/web/src/modules/marketing/home/review-evidence.tsx new file mode 100644 index 0000000..eec13b6 --- /dev/null +++ b/apps/web/src/modules/marketing/home/review-evidence.tsx @@ -0,0 +1,206 @@ +"use client"; + +import { useTranslation } from "@turbostarter/i18n"; + +import { CtaButton } from "~/modules/marketing/layout/cta-button"; +import { + Section, + SectionBadge, + SectionDescription, + SectionHeader, + SectionTitle, +} from "~/modules/marketing/layout/section"; + +// --------------------------------------------------------------------------- +// Valence & domain color maps (from report engine) +// --------------------------------------------------------------------------- + +const VALENCE = { + "+": { bg: "#DCFCE7", text: "#166534", border: "#22c55e" }, + "-": { bg: "#FEE2E2", text: "#991B1B", border: "#ef4444" }, + "±": { bg: "#FEF3C7", text: "#92400E", border: "#f59e0b" }, + "0": { bg: "#F3F4F6", text: "#6B7280", border: "#9ca3af" }, +} as const; + +const DOMAIN_COLORS: Record = { + Operations: "#3b82f6", + Product: "#22c55e", + Journey: "#f59e0b", + Environment: "#8b5cf6", + Value: "#f43f5e", + Management: "#6b7280", +}; + +// --------------------------------------------------------------------------- +// Demo review data — hardcoded annotated reviews for "Bistro El Sol" +// --------------------------------------------------------------------------- + +type Valence = "+" | "-" | "±" | "0"; + +type Segment = + | { type: "text"; content: string } + | { type: "hl"; content: string; primitive: string; domain: string; valence: Valence }; + +interface DemoReview { + author: string; + rating: number; + date: string; + segments: Segment[]; +} + +const REVIEWS: DemoReview[] = [ + { + author: "Elena R.", + rating: 5, + date: "Jan 2025", + segments: [ + { type: "text", content: "The " }, + { type: "hl", content: "paella was absolutely incredible", primitive: "Food Quality", domain: "Product", valence: "+" }, + { type: "text", content: " — " }, + { type: "hl", content: "perfectly seasoned", primitive: "Taste", domain: "Product", valence: "+" }, + { type: "text", content: " and " }, + { type: "hl", content: "generous portions", primitive: "Portion Size", domain: "Value", valence: "+" }, + { type: "text", content: ". Our waiter " }, + { type: "hl", content: "Miguel was attentive", primitive: "Staff Attentiveness", domain: "Operations", valence: "+" }, + { type: "text", content: " and " }, + { type: "hl", content: "recommended the perfect wine pairing", primitive: "Recommendations", domain: "Operations", valence: "+" }, + { type: "text", content: ". Only downside was the " }, + { type: "hl", content: "25-minute wait for a table", primitive: "Wait Time", domain: "Journey", valence: "-" }, + { type: "text", content: " on a Friday night." }, + ], + }, + { + author: "James K.", + rating: 3, + date: "Dec 2024", + segments: [ + { type: "hl", content: "Food quality is usually great", primitive: "Consistency", domain: "Product", valence: "±" }, + { type: "text", content: " but tonight the " }, + { type: "hl", content: "steak was overcooked", primitive: "Food Quality", domain: "Product", valence: "-" }, + { type: "text", content: " and the " }, + { type: "hl", content: "fries were cold", primitive: "Temperature", domain: "Product", valence: "-" }, + { type: "text", content: ". The " }, + { type: "hl", content: "terrace ambiance is lovely", primitive: "Ambiance", domain: "Environment", valence: "+" }, + { type: "text", content: " though, and " }, + { type: "hl", content: "prices are fair for the area", primitive: "Pricing", domain: "Value", valence: "+" }, + { type: "text", content: ". Would come back but hope for " }, + { type: "hl", content: "more consistency", primitive: "Consistency", domain: "Management", valence: "-" }, + { type: "text", content: "." }, + ], + }, + { + author: "Patricia M.", + rating: 4, + date: "Nov 2024", + segments: [ + { type: "text", content: "We celebrated our anniversary here. The " }, + { type: "hl", content: "decoration is beautiful", primitive: "Decor", domain: "Environment", valence: "+" }, + { type: "text", content: " and the " }, + { type: "hl", content: "staff made us feel special", primitive: "Hospitality", domain: "Operations", valence: "+" }, + { type: "text", content: " with a complimentary dessert. " }, + { type: "hl", content: "Appetizers were outstanding", primitive: "Food Quality", domain: "Product", valence: "+" }, + { type: "text", content: " but the " }, + { type: "hl", content: "main course took 35 minutes", primitive: "Wait Time", domain: "Journey", valence: "-" }, + { type: "text", content: ". The " }, + { type: "hl", content: "bill was a bit steep", primitive: "Pricing", domain: "Value", valence: "-" }, + { type: "text", content: " for what we got. Still, a " }, + { type: "hl", content: "lovely evening overall", primitive: "Overall Experience", domain: "Management", valence: "+" }, + { type: "text", content: "." }, + ], + }, +]; + +// --------------------------------------------------------------------------- +// Component +// --------------------------------------------------------------------------- + +export const ReviewEvidence = () => { + const { t } = useTranslation("marketing"); + + return ( +
+ + {t("reviewEvidence.label")} + {t("reviewEvidence.title")} + + {t("reviewEvidence.description")} + + + +
+ {REVIEWS.map((review) => ( +
+ {/* Header — author · stars · date */} +
+ + {review.author} + + + {Array.from({ length: 5 }, (_, i) => ( + + ★ + + ))} + + + {review.date} + +
+ + {/* Highlighted review text */} +

+ {review.segments.map((seg, i) => + seg.type === "text" ? ( + + {seg.content} + + ) : ( + + {seg.content} + + ), + )} +

+ + {/* Classification tags */} +
+ {review.segments + .filter((s): s is Extract => s.type === "hl") + .map((seg, i) => ( + + {seg.primitive} + {seg.valence} + + ))} +
+
+ ))} +
+ + {t("reviewEvidence.cta")} +
+ ); +}; diff --git a/apps/web/src/modules/marketing/home/social-proof.tsx b/apps/web/src/modules/marketing/home/social-proof.tsx new file mode 100644 index 0000000..899ea28 --- /dev/null +++ b/apps/web/src/modules/marketing/home/social-proof.tsx @@ -0,0 +1,33 @@ +import { getTranslation } from "@turbostarter/i18n/server"; + +const stats = [ + { key: "reports" }, + { key: "rating" }, + { key: "dimensions" }, +] as const; + +export const SocialProof = async () => { + const { t } = await getTranslation({ ns: "marketing" }); + + return ( +
+
+ {stats.map((stat) => { + const text = t(`socialProof.${stat.key}` as const); + const match = text.match(/^([\d.+]+)\s+(.+)$/); + const number = match?.[1] ?? text; + const label = match?.[2] ?? ""; + + return ( +
+ + {number} + + {label} +
+ ); + })} +
+
+ ); +}; diff --git a/apps/web/src/modules/marketing/home/testimonials.tsx b/apps/web/src/modules/marketing/home/testimonials.tsx index 71c2174..85cfc6e 100644 --- a/apps/web/src/modules/marketing/home/testimonials.tsx +++ b/apps/web/src/modules/marketing/home/testimonials.tsx @@ -25,6 +25,7 @@ const reviews = [ body: "testimonials.reviews.maria.body", img: "https://avatar.vercel.sh/maria", position: "testimonials.reviews.maria.position", + improvement: "4.1 → 4.6", }, { name: "testimonials.reviews.carlos.name", @@ -52,7 +53,7 @@ const reviews = [ }, ] as const; -type Review = (typeof reviews)[number]; +type Review = (typeof reviews)[number] & { improvement?: string }; export const Testimonials = () => { const { t } = useTranslation("marketing"); @@ -109,7 +110,7 @@ export const Testimonials = () => { ); }; -const ReviewCard = ({ img, name, position, body }: Review) => { +const ReviewCard = ({ img, name, position, body, improvement }: Review) => { const { t } = useTranslation("marketing"); return (
{ {t(position)}

+ {improvement && ( + + + {improvement} + + )} +
+
+ {Array.from({ length: 5 }).map((_, i) => ( + + ))}
{t(body)}
diff --git a/packages/i18n/src/translations/en/marketing.json b/packages/i18n/src/translations/en/marketing.json index cc4659e..5075418 100644 --- a/packages/i18n/src/translations/en/marketing.json +++ b/packages/i18n/src/translations/en/marketing.json @@ -18,6 +18,9 @@ } } }, + "banner": { + "urgency": "See what your reviews really say" + }, "editToReload": "Edit {{file}} and save to reload.", "workInProgress": { "title": "We're working on it!", @@ -42,26 +45,115 @@ } } }, + "hero": { + "stats": { + "reviews": "596+ Reviews Analyzed", + "score": "83.3 Reputation Score", + "issues": "7 Critical Issues Found" + } + }, + "socialProof": { + "reports": "6 Domains Scored", + "rating": "37 Dimensions Analyzed", + "dimensions": "1 Actionable Blueprint" + }, + "reportPreview": { + "label": "See Your Report", + "title": "This is what you get", + "description": "A real preview of the Reputation Blueprint — the exact analysis your business receives.", + "tabs": { + "score": "Score", + "domains": "Domains", + "issues": "Issues", + "actions": "Actions" + }, + "cta": "Get yours for your business", + "demo": { + "businessName": "Bistro El Sol", + "scoreLabel": "Reputation Score", + "pillars": { + "ratingQuality": "Rating Quality", + "sentimentDepth": "Sentiment Depth", + "volume": "Review Volume", + "momentum": "Momentum", + "intensity": "Intensity" + }, + "domains": { + "operations": "Operations", + "product": "Product", + "journey": "Customer Journey", + "environment": "Environment", + "value": "Value", + "management": "Management" + }, + "issues": { + "issue1": { + "title": "Slow service during peak hours", + "domain": "Operations", + "complaints": "23 complaints", + "severity": "Critical", + "quote": "\"Waited 40 minutes for our food on a Saturday night — unacceptable.\"" + }, + "issue2": { + "title": "Inconsistent food temperature", + "domain": "Product", + "complaints": "15 complaints", + "severity": "High", + "quote": "\"The pasta arrived lukewarm. It's happened more than once.\"" + }, + "issue3": { + "title": "Limited parking availability", + "domain": "Environment", + "complaints": "11 complaints", + "severity": "Medium", + "quote": "\"Love the food but finding parking is a nightmare.\"" + } + }, + "actions": { + "action1": { + "title": "Add a runner during Friday–Sunday dinner service", + "effort": "Low", + "impact": "High" + }, + "action2": { + "title": "Implement kitchen ticket timing alerts", + "effort": "Medium", + "impact": "High" + }, + "action3": { + "title": "Partner with nearby lot for validated parking", + "effort": "Medium", + "impact": "Medium" + } + } + } + }, + "reviewEvidence": { + "label": "Deep Review Analysis", + "title": "We read what you can't", + "description": "Your reviews contain hidden patterns. Our AI highlights every positive, negative, and mixed mention — so you see exactly what customers are telling you between the lines.", + "cta": "See what's hiding in your reviews" + }, "features": { "label": "What You Get", "title": "Everything hidden in your reviews, revealed", "description": "Your Reputation Blueprint gives you the full picture — not just stars, but the story behind them.", "feature": { "score": { - "title": "Reputation Score 0–100", - "description": "One number that captures your overall reputation health, benchmarked against your industry." + "title": "Reputation Score", + "stat": "0–100" }, "domains": { - "title": "6 Domain Analysis", - "description": "Deep dive into Service, Product, Atmosphere, Value, Cleanliness, and Management — each scored independently." + "title": "Domains Analyzed", + "stat": "6" }, "plan": { - "title": "Prioritized Action Plan", - "description": "Know exactly what to fix first. We rank issues by impact so you spend time where it matters most." + "title": "Aspects Scored", + "stat": "37" }, "insights": { - "title": "Staff & Trend Insights", - "description": "See which team members customers mention by name, and track how your reputation changes over time." + "title": "Prioritized Actions", + "stat": "∞" } } }, diff --git a/packages/i18n/src/translations/es/marketing.json b/packages/i18n/src/translations/es/marketing.json index 519d7f4..af2e416 100644 --- a/packages/i18n/src/translations/es/marketing.json +++ b/packages/i18n/src/translations/es/marketing.json @@ -18,6 +18,9 @@ } } }, + "banner": { + "urgency": "Descubre lo que tus reseñas realmente dicen" + }, "editToReload": "Edita {{file}} y guarda para recargar.", "workInProgress": { "title": "¡Estamos trabajando en ello!", @@ -42,26 +45,115 @@ } } }, + "hero": { + "stats": { + "reviews": "596+ Reseñas Analizadas", + "score": "83.3 Puntuación de Reputación", + "issues": "7 Problemas Críticos" + } + }, + "socialProof": { + "reports": "6 Dominios Evaluados", + "rating": "37 Dimensiones Analizadas", + "dimensions": "1 Radiografía Accionable" + }, + "reportPreview": { + "label": "Ve Tu Informe", + "title": "Esto es lo que recibes", + "description": "Una vista real de la Radiografía de Reputación — el análisis exacto que recibe tu negocio.", + "tabs": { + "score": "Puntuación", + "domains": "Dominios", + "issues": "Problemas", + "actions": "Acciones" + }, + "cta": "Obtén el tuyo para tu negocio", + "demo": { + "businessName": "Bistro El Sol", + "scoreLabel": "Puntuación de Reputación", + "pillars": { + "ratingQuality": "Calidad de Calificación", + "sentimentDepth": "Profundidad de Sentimiento", + "volume": "Volumen de Reseñas", + "momentum": "Momentum", + "intensity": "Intensidad" + }, + "domains": { + "operations": "Operaciones", + "product": "Producto", + "journey": "Recorrido del Cliente", + "environment": "Ambiente", + "value": "Valor", + "management": "Gestión" + }, + "issues": { + "issue1": { + "title": "Servicio lento en horas pico", + "domain": "Operaciones", + "complaints": "23 quejas", + "severity": "Crítico", + "quote": "\"Esperamos 40 minutos por nuestra comida un sábado por la noche — inaceptable.\"" + }, + "issue2": { + "title": "Temperatura inconsistente de la comida", + "domain": "Producto", + "complaints": "15 quejas", + "severity": "Alto", + "quote": "\"La pasta llegó tibia. Ha pasado más de una vez.\"" + }, + "issue3": { + "title": "Estacionamiento limitado", + "domain": "Ambiente", + "complaints": "11 quejas", + "severity": "Medio", + "quote": "\"Me encanta la comida pero encontrar estacionamiento es una pesadilla.\"" + } + }, + "actions": { + "action1": { + "title": "Agregar un runner durante el servicio de viernes a domingo", + "effort": "Bajo", + "impact": "Alto" + }, + "action2": { + "title": "Implementar alertas de tiempo en tickets de cocina", + "effort": "Medio", + "impact": "Alto" + }, + "action3": { + "title": "Alianza con estacionamiento cercano para validación", + "effort": "Medio", + "impact": "Medio" + } + } + } + }, + "reviewEvidence": { + "label": "Análisis Profundo", + "title": "Leemos lo que tú no puedes", + "description": "Tus reseñas contienen patrones ocultos. Nuestra IA resalta cada mención positiva, negativa y mixta — para que veas exactamente lo que tus clientes te dicen entre líneas.", + "cta": "Descubre qué esconden tus reseñas" + }, "features": { "label": "Lo Que Recibes", "title": "Todo lo que esconden tus reseñas, al descubierto", "description": "Tu Radiografía de Reputación te da el panorama completo — no solo estrellas, sino la historia detrás de ellas.", "feature": { "score": { - "title": "Puntuación de Reputación 0–100", - "description": "Un solo número que refleja la salud de tu reputación, comparado con tu industria." + "title": "Puntuación de Reputación", + "stat": "0–100" }, "domains": { - "title": "Análisis en 6 Dominios", - "description": "Análisis profundo de Servicio, Producto, Ambiente, Valor, Limpieza y Gestión — cada uno evaluado de forma independiente." + "title": "Dominios Analizados", + "stat": "6" }, "plan": { - "title": "Plan de Acción Priorizado", - "description": "Sabe exactamente qué corregir primero. Clasificamos los problemas por impacto para que inviertas tu tiempo donde más importa." + "title": "Aspectos Evaluados", + "stat": "37" }, "insights": { - "title": "Tendencias y Datos del Equipo", - "description": "Descubre qué miembros de tu equipo mencionan los clientes por nombre y sigue cómo evoluciona tu reputación a lo largo del tiempo." + "title": "Acciones Priorizadas", + "stat": "∞" } } },