Skip to content

Commit 2118962

Browse files
author
root
committed
feat(tools): integrate court-evidence and proof-of-relationship into tools hierarchy
1 parent 6eb0a96 commit 2118962

9 files changed

Lines changed: 126 additions & 13 deletions

File tree

components/GlobalFooter.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ export default {
6060
// text: "Create a PDF from your WhatsApp chat",
6161
// },
6262
{
63-
name: "court-evidence",
63+
name: "tools/court-evidence",
6464
text: "pageNameCourt",
6565
},
6666
{
67-
name: "proof-of-relationship",
67+
name: "tools/proof-of-relationship",
6868
text: "pageNameRelationship",
6969
},
7070
{

components/landing/LandingHero.vue

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,33 @@
11
<template>
22
<header class="landing-hero">
33
<div
4+
ref="inner"
45
class="landing-hero__inner landing-reveal"
56
:class="{ 'is-visible': visible }"
67
>
8+
<nav
9+
v-if="breadcrumbs && breadcrumbs.length"
10+
class="landing-hero__breadcrumbs"
11+
aria-label="Breadcrumbs"
12+
>
13+
<template v-for="(crumb, i) in breadcrumbs" :key="i">
14+
<NuxtLink
15+
v-if="crumb.to"
16+
:to="crumb.to"
17+
class="landing-hero__breadcrumb-link"
18+
>
19+
{{ crumb.label }}
20+
</NuxtLink>
21+
<span v-else class="landing-hero__breadcrumb-current">{{
22+
crumb.label
23+
}}</span>
24+
<span
25+
v-if="i < breadcrumbs.length - 1"
26+
class="landing-hero__breadcrumb-sep"
27+
>/</span
28+
>
29+
</template>
30+
</nav>
731
<p v-if="eyebrow" class="landing-hero__eyebrow">{{ eyebrow }}</p>
832
<h1 class="landing-hero__title">{{ title }}</h1>
933
<p v-if="subtitle" class="landing-hero__subtitle">{{ subtitle }}</p>
@@ -22,6 +46,7 @@
2246
export default {
2347
name: "LandingHero",
2448
props: {
49+
breadcrumbs: { type: Array, default: () => [] },
2550
eyebrow: { type: String, default: "" },
2651
title: { type: String, required: true },
2752
subtitle: { type: String, default: "" },
@@ -72,6 +97,35 @@ export default {
7297
transform: none;
7398
}
7499
}
100+
.landing-hero__breadcrumbs {
101+
display: flex;
102+
align-items: center;
103+
justify-content: center;
104+
gap: 0.5rem;
105+
font-size: 0.85rem;
106+
color: rgba(245, 245, 247, 0.6);
107+
margin-bottom: 1.5rem;
108+
flex-wrap: wrap;
109+
}
110+
111+
.landing-hero__breadcrumb-link {
112+
color: rgba(245, 245, 247, 0.6);
113+
text-decoration: none;
114+
transition: color 0.2s ease;
115+
116+
&:hover {
117+
color: #ffffff;
118+
}
119+
}
120+
121+
.landing-hero__breadcrumb-current {
122+
color: #f5f5f7;
123+
font-weight: 500;
124+
}
125+
126+
.landing-hero__breadcrumb-sep {
127+
color: rgba(245, 245, 247, 0.35);
128+
}
75129
76130
.landing-hero__eyebrow {
77131
color: $c-blue-accent-light;

docs/landing-pages.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ Apple/Peak-Design-style landing pages for the highest-intent use cases of the
44
product. Each page targets a specific search intent, converts to the analyzer
55
(`/`), and is fully prerendered for all six locales.
66

7-
## Pages in this MR
7+
## Pages in the Tools Hierarchy
88

99
| Route | Intent | Hero visual |
1010
| --- | --- | --- |
11-
| `/court-evidence` | Legal evidence: harassment, divorce/custody, work disputes | CSS transcript mockup (`LandingDocMock`) |
12-
| `/proof-of-relationship` | Visa/immigration: proving a genuine relationship | CSS stats mockup (`LandingStatsMock`) |
11+
| `/tools/inactivity` | Inactivity & last message tracker | Client-side dropzone (`ToolDropzone`) |
12+
| `/tools/court-evidence` | Legal evidence: harassment, divorce/custody, work disputes | CSS transcript mockup (`LandingDocMock`) |
13+
| `/tools/proof-of-relationship` | Visa/immigration: proving a genuine relationship | CSS stats mockup (`LandingStatsMock`) |
1314

14-
Both pages are indexable (no `robots: noindex`), carry per-locale SEO meta and
15-
FAQPage JSON-LD, and cross-link to each other via a use-case card.
15+
All tools pages are indexable, carry per-locale SEO meta and JSON-LD, and are cross-linked via the `/tools` hub and breadcrumbs. Root URLs `/court-evidence` and `/proof-of-relationship` redirect via 301.
1616

1717
## Shared components (`components/landing/`)
1818

nuxt.config.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ const baseUrl = (process.env.BASE_URL || "https://www.whatsanalyze.com").replace
1010
const localizedPages = [
1111
"",
1212
"about",
13-
"court-evidence",
1413
"how-to-export-your-whatsapp-chat",
1514
"impressum",
16-
"proof-of-relationship",
1715
"pwa-results",
1816
"subscribe",
1917
"switch-from-whatsapp-to-signal",
2018
"tools",
19+
"tools/court-evidence",
2120
"tools/inactivity",
21+
"tools/proof-of-relationship",
2222
"whatsapp-to-pdf",
2323
"whatsapp-wrapped-year-review",
2424
];
@@ -41,8 +41,15 @@ export default defineNuxtConfig({
4141
output: {
4242
publicDir: resolve("./dist"),
4343
},
44+
routeRules: {
45+
"/court-evidence": {
46+
redirect: { to: "/tools/court-evidence", statusCode: 301 },
47+
},
48+
"/proof-of-relationship": {
49+
redirect: { to: "/tools/proof-of-relationship", statusCode: 301 },
50+
},
51+
},
4452
watch: [
45-
"assets/**",
4653
"components/**",
4754
"composables/**",
4855
"content/**",
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<template>
22
<div class="landing-page">
33
<LandingHero
4+
:breadcrumbs="breadcrumbs"
45
:eyebrow="t('courtEvidence.heroEyebrow')"
56
:title="t('courtEvidence.heroTitle')"
67
:subtitle="t('courtEvidence.heroSubtitle')"
@@ -139,7 +140,7 @@ export default {
139140
][i - 1],
140141
title: t(`courtEvidence.case${i}Title`),
141142
text: t(`courtEvidence.case${i}Text`),
142-
to: i === 3 ? localePath("proof-of-relationship") : undefined,
143+
to: i === 3 ? localePath("/tools/proof-of-relationship") : undefined,
143144
linkText: i === 3 ? t("courtEvidence.caseLinkText") : undefined,
144145
}))
145146
);
@@ -158,8 +159,15 @@ export default {
158159
}))
159160
);
160161
162+
const breadcrumbs = computed(() => [
163+
{ label: "WhatsAnalyze", to: localePath("/") },
164+
{ label: "Tools", to: localePath("/tools") },
165+
{ label: t("courtEvidence.heroEyebrow") || "Court Evidence" },
166+
]);
167+
161168
return {
162169
t,
170+
breadcrumbs,
163171
analyzerPath: computed(() => localePath("/")),
164172
exportGuidePath: computed(() =>
165173
localePath("how-to-export-your-whatsapp-chat")

pages/tools/inactivity.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<div class="landing-page">
33
<!-- Hero with ToolDropzone Visual Slot -->
44
<LandingHero
5+
:breadcrumbs="breadcrumbs"
56
eyebrow="Free WhatsApp Tool"
67
title="Who Texted Last? Inactivity & Gap Tracker"
78
subtitle="Discover who sent the last message, calculate elapsed silence duration, measure reply latencies, and pinpoint historical conversation gaps."
@@ -255,6 +256,11 @@ import {
255256
256257
const localePath = useLocalePath();
257258
259+
const breadcrumbs = computed(() => [
260+
{ label: "WhatsAnalyze", to: localePath("/") },
261+
{ label: "Tools", to: localePath("/tools") },
262+
{ label: "Inactivity Tracker" },
263+
]);
258264
// SEO Metadata & Generative Engine Optimization
259265
useSeoMeta({
260266
title: "Who Texted Last? WhatsApp Inactivity & Gap Tracker | WhatsAnalyze",

pages/tools/index.vue

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,20 @@ useHead({
111111
url: "https://www.whatsanalyze.com/tools/inactivity",
112112
applicationCategory: "UtilitiesApplication",
113113
},
114+
{
115+
"@type": "SoftwareApplication",
116+
position: 2,
117+
name: "WhatsApp Court & Legal Evidence PDF",
118+
url: "https://www.whatsanalyze.com/tools/court-evidence",
119+
applicationCategory: "UtilitiesApplication",
120+
},
121+
{
122+
"@type": "SoftwareApplication",
123+
position: 3,
124+
name: "WhatsApp Proof of Relationship for Visa",
125+
url: "https://www.whatsanalyze.com/tools/proof-of-relationship",
126+
applicationCategory: "UtilitiesApplication",
127+
},
114128
],
115129
},
116130
}),
@@ -127,9 +141,24 @@ const toolsList = computed(() => [
127141
to: localePath("/tools/inactivity"),
128142
linkText: "Open Tool",
129143
},
144+
{
145+
icon: "mdi-scale-balance",
146+
title: "Court & Legal Evidence PDF",
147+
text:
148+
"Format WhatsApp chats into court-admissible, tamper-evident PDF transcripts with exact timestamps and sender verification.",
149+
to: localePath("/tools/court-evidence"),
150+
linkText: "Open Tool",
151+
},
152+
{
153+
icon: "mdi-heart-outline",
154+
title: "Proof of Relationship for Visa",
155+
text:
156+
"Generate verified chat timelines, messaging frequency charts, and continuous communication records for immigration petitions.",
157+
to: localePath("/tools/proof-of-relationship"),
158+
linkText: "Open Tool",
159+
},
130160
{
131161
icon: "mdi-counter",
132-
title: "Message & Line Counter",
133162
text:
134163
"Count raw lines, message volume distribution per person, and speech shares in 1-on-1 and group chats.",
135164
linkText: "Coming Soon",
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<template>
22
<div class="landing-page">
33
<LandingHero
4+
:breadcrumbs="breadcrumbs"
45
:eyebrow="t('relationshipProof.heroEyebrow')"
56
:title="t('relationshipProof.heroTitle')"
67
:subtitle="t('relationshipProof.heroSubtitle')"
@@ -123,7 +124,7 @@ export default {
123124
][i - 1],
124125
title: t(`relationshipProof.case${i}Title`),
125126
text: t(`relationshipProof.case${i}Text`),
126-
to: i === 4 ? localePath("court-evidence") : undefined,
127+
to: i === 4 ? localePath("/tools/court-evidence") : undefined,
127128
linkText: i === 4 ? t("relationshipProof.caseLinkText") : undefined,
128129
}))
129130
);
@@ -134,9 +135,15 @@ export default {
134135
text: t(`relationshipProof.step${i}Text`),
135136
}))
136137
);
138+
const breadcrumbs = computed(() => [
139+
{ label: "WhatsAnalyze", to: localePath("/") },
140+
{ label: "Tools", to: localePath("/tools") },
141+
{ label: t("relationshipProof.heroEyebrow") || "Proof of Relationship" },
142+
]);
137143
138144
return {
139145
t,
146+
breadcrumbs,
140147
analyzerPath: computed(() => localePath("/")),
141148
exportGuidePath: computed(() =>
142149
localePath("how-to-export-your-whatsapp-chat")

scripts/verify-generated-site.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ const expectedFiles = [
1212
"pwa-results/index.html",
1313
"subscribe/index.html",
1414
"tools/index.html",
15+
"tools/court-evidence/index.html",
1516
"tools/inactivity/index.html",
17+
"tools/proof-of-relationship/index.html",
1618
"whatsapp-to-pdf/index.html",
1719
"whatsapp-wrapped-year-review/index.html",
1820
];

0 commit comments

Comments
 (0)