From 3e9fba530336674ceef1ee3dbadad92485e1c6d6 Mon Sep 17 00:00:00 2001
From: Andras Schmelczer
Date: Sun, 15 Mar 2026 21:54:48 +0000
Subject: [PATCH] Udpates
---
.../src/components/account/AccountPage.tsx | 19 +--
frontend/src/components/home/HomePage.tsx | 12 +-
frontend/src/components/home/ScrollStory.tsx | 4 +-
frontend/src/components/learn/LearnPage.tsx | 47 +++---
frontend/src/components/map/AiFilterInput.tsx | 2 +-
frontend/src/components/map/AreaPane.tsx | 2 +-
.../src/components/map/FeatureBrowser.tsx | 42 ++---
frontend/src/components/map/Filters.tsx | 147 ++++++++----------
.../components/map/JourneyInstructions.tsx | 32 ++++
.../src/components/map/PropertiesPane.tsx | 9 +-
frontend/src/components/ui/AuthModal.tsx | 7 +
frontend/src/components/ui/Header.tsx | 9 +-
frontend/src/components/ui/MobileMenu.tsx | 2 +-
frontend/src/components/ui/UpgradeModal.tsx | 7 +-
frontend/src/components/ui/UserMenu.tsx | 2 +-
frontend/src/hooks/useTutorial.ts | 24 +--
server-rs/src/pocketbase.rs | 2 +-
17 files changed, 195 insertions(+), 174 deletions(-)
diff --git a/frontend/src/components/account/AccountPage.tsx b/frontend/src/components/account/AccountPage.tsx
index 63b0f8d..20a77f8 100644
--- a/frontend/src/components/account/AccountPage.tsx
+++ b/frontend/src/components/account/AccountPage.tsx
@@ -71,13 +71,7 @@ function DeleteDialog({
);
}
-function NotesInput({
- value,
- onSave,
-}: {
- value: string;
- onSave: (notes: string) => void;
-}) {
+function NotesInput({ value, onSave }: { value: string; onSave: (notes: string) => void }) {
const [text, setText] = useState(value);
const textareaRef = useRef(null);
const timerRef = useRef | null>(null);
@@ -207,7 +201,7 @@ function SavedSearchesTab({
No saved searches yet
- Save your dashboard filters and view to quickly return to them later.
+ Save your filters and map view so you can pick up exactly where you left off.
);
@@ -333,7 +327,7 @@ function SavedPropertiesTab({
No saved properties yet
- Click the bookmark icon on any property in the dashboard to save it here.
+ Bookmark properties as you explore and build your shortlist without losing track.
);
@@ -367,10 +361,7 @@ function SavedPropertiesTab({
- onUpdateNotes(prop.id, notes)}
- />
+ onUpdateNotes(prop.id, notes)} />
@@ -823,7 +814,7 @@ export default function AccountPage({
- {user.subscription === 'licensed' ? 'Licensed' : 'Free'}
+ {user.subscription === 'licensed' ? 'Full Access' : 'Inner London'}
diff --git a/frontend/src/components/home/HomePage.tsx b/frontend/src/components/home/HomePage.tsx
index 53abc75..c321e75 100644
--- a/frontend/src/components/home/HomePage.tsx
+++ b/frontend/src/components/home/HomePage.tsx
@@ -181,13 +181,13 @@ export default function HomePage({
- Listings show what's available, not what's possible — fragments
- without context. Traditional tools force you to begin with a location, separating area
- insight from property detail. You search, cross-reference, and repeat per location.
+ On Rightmove, you pick an area first, then hope it's good. You end up
+ cross-referencing crime stats, school reports, and broadband checkers across a dozen
+ tabs, one postcode at a time.
- We take a different approach. Start with what matters to you, and the right places
- reveal themselves. No context lost. No property missed.
+ We flip that. Tell us what you need (budget, commute, schools, safety) and we show
+ you every area in England that qualifies. No guesswork. No wasted viewings.
@@ -302,7 +302,7 @@ export default function HomePage({
Make your biggest investment your smartest move.
- This deserves proper tools behind it — don't leave it to luck.
+ This deserves proper tools behind it, don't leave it to luck.
{
diff --git a/frontend/src/components/home/ScrollStory.tsx b/frontend/src/components/home/ScrollStory.tsx
index 56e5471..9d95880 100644
--- a/frontend/src/components/home/ScrollStory.tsx
+++ b/frontend/src/components/home/ScrollStory.tsx
@@ -141,8 +141,8 @@ const STEPS: { heading: string | null; body: React.ReactNode }[] = [
That's just 4 filters. We've built{' '}
- 56 — covering commute
- times, crime, broadband, noise, schools, amenities, and more.
+ 56 , covering commute times,
+ crime, broadband, noise, schools, amenities, and more.
>
),
diff --git a/frontend/src/components/learn/LearnPage.tsx b/frontend/src/components/learn/LearnPage.tsx
index 585c222..336a56d 100644
--- a/frontend/src/components/learn/LearnPage.tsx
+++ b/frontend/src/components/learn/LearnPage.tsx
@@ -142,19 +142,19 @@ const FAQ_SECTIONS: FAQSection[] = [
title: 'Finding Your Area',
items: [
{
- question: "I don't even know which areas to look at \u2014 can this help with that?",
+ question: "I don't even know which areas to look at. Can this help?",
answer:
- "That's exactly what it's for. Set your filters (budget, commute time, low crime, good schools \u2014 whatever matters) and the map lights up to show you where ticks every box. No more Googling \"best areas to live near Manchester\" at 1am.",
+ 'That\'s exactly what it\'s for. Set your filters (budget, commute time, low crime, good schools, whatever matters) and the map lights up to show you where ticks every box. No more Googling "best areas to live near Manchester" at 1am.',
},
{
- question: "I'm moving somewhere I've never been \u2014 how do I even start?",
+ question: "I'm moving somewhere I've never been. How do I even start?",
answer:
- "Set your filters for what matters and the map instantly highlights the areas that qualify. You go from \"I don't know a single street\" to a shortlist in minutes \u2014 it's like having a local's knowledge of every neighbourhood in England.",
+ "Set your filters for what matters and the map instantly highlights the areas that qualify. You go from \"I don't know a single street\" to a shortlist in minutes. It's like having a local's knowledge of every neighbourhood in England.",
},
{
question: 'How do I find areas that tick all my boxes at once?',
answer:
- 'Stack multiple filters \u2014 say, crime below average, good schools, and commute under 40 minutes \u2014 then colour the map by price to spot the affordable sweet spots. The map updates live as you drag sliders, so you can watch neighbourhoods light up or drop off in real time.',
+ 'Stack multiple filters (crime below average, good schools, commute under 40 minutes) then colour the map by price to spot the affordable sweet spots. The map updates live as you drag sliders, so you can watch neighbourhoods light up or drop off in real time.',
},
],
},
@@ -164,7 +164,7 @@ const FAQ_SECTIONS: FAQSection[] = [
{
question: 'Can I see how long my commute would actually be from different areas?',
answer:
- "Set your workplace as a destination and we'll colour every postcode by journey time \u2014 by car, bike, or public transport. Filter to your max commute and the rest disappears, so you're only looking at areas that actually work.",
+ "Set your workplace as a destination and we'll colour every postcode by journey time, whether that's by car, bike, or public transport. Filter to your max commute and the rest disappears.",
},
{
question: 'How is that better than checking Google Maps?',
@@ -179,12 +179,12 @@ const FAQ_SECTIONS: FAQSection[] = [
{
question: 'How do I find areas where I get the most space for my money?',
answer:
- "Filter by price per sqm \u2014 you'll instantly see which postcodes give you the most square footage per pound. Pair it with the energy rating filter to avoid cheap-but-freezing money pits.",
+ "Filter by price per sqm and you'll instantly see which postcodes give you the most square footage per pound. Pair it with the energy rating filter to avoid cheap-but-freezing money pits.",
},
{
question: "How do I make sure a cheap area isn't cheap for a reason?",
answer:
- "Layer deprivation scores, crime stats, school ratings, and broadband speeds alongside price. If a postcode is affordable AND scores well on the stuff that matters, that's your hidden gem \u2014 not just a cheap postcode with a catch.",
+ "Layer deprivation scores, crime stats, school ratings, and broadband speeds alongside price. If a postcode is affordable AND scores well on the stuff that matters, that's your hidden gem, not just a cheap postcode with a catch.",
},
],
},
@@ -194,12 +194,13 @@ const FAQ_SECTIONS: FAQSection[] = [
{
question: 'How can I check if an area is safe before I move there?',
answer:
- "We overlay real police-recorded crime data \u2014 broken down by type \u2014 onto every neighbourhood in England. Filter by violent crime, burglary, or antisocial behaviour and instantly see which postcodes have the lowest numbers, so you're not relying on gut feeling.",
+ "We overlay real police-recorded crime data, broken down by type, onto every neighbourhood in England. Filter by violent crime, burglary, or antisocial behaviour and instantly see which postcodes have the lowest numbers.",
},
{
- question: 'I keep finding flats that look great online, then the area turns out to be grim.',
+ question:
+ 'I keep finding flats that look great online, then the area turns out to be grim.',
answer:
- "That's why we built this. Stack crime rates, noise levels, deprivation scores, nearby pubs and parks, and broadband speeds all on one map \u2014 so you know what a neighbourhood is actually like before you waste a Saturday viewing.",
+ "That's why we built this. Stack crime rates, noise levels, deprivation scores, nearby pubs and parks, and broadband speeds all on one map so you know what a neighbourhood is actually like before you waste a Saturday viewing.",
},
],
},
@@ -209,7 +210,7 @@ const FAQ_SECTIONS: FAQSection[] = [
{
question: 'Can I find areas with good schools AND low crime in one search?',
answer:
- 'Yes \u2014 stack filters for Ofsted ratings, crime rates, parks, and whatever else matters to your family, then watch the map highlight only the areas that tick every box. No more cross-referencing five different websites with a spreadsheet.',
+ 'Absolutely. Stack filters for Ofsted ratings, crime rates, parks, and whatever else matters to your family, then watch the map highlight only the areas that tick every box. No more cross-referencing five different websites with a spreadsheet.',
},
{
question: 'How do I know if a neighbourhood has parks and playgrounds nearby?',
@@ -222,9 +223,9 @@ const FAQ_SECTIONS: FAQSection[] = [
title: 'Environment & Quality of Life',
items: [
{
- question: 'Can I find energy-efficient homes that aren\'t on a noisy road?',
+ question: "Can I find energy-efficient homes that aren't on a noisy road?",
answer:
- 'Filter by EPC rating (A\u2013C), then layer on road noise data to rule out anything above your threshold. Colour-code by either feature to spot quiet, efficient streets at a glance.',
+ 'Filter by EPC rating (A to C), then layer on road noise data to rule out anything above your threshold. Colour-code by either feature to spot quiet, efficient streets at a glance.',
},
{
question: 'Does it show flood or subsidence risk?',
@@ -242,9 +243,9 @@ const FAQ_SECTIONS: FAQSection[] = [
title: 'Why Perfect Postcode',
items: [
{
- question: 'I already use Rightmove \u2014 what does this add?',
+ question: 'I already use Rightmove. What does this add?',
answer:
- "Rightmove shows you houses. We show you areas. You'll see 56 layers of data \u2014 crime rates, school ratings, broadband speeds, noise levels, deprivation scores \u2014 all on one map, so you can judge a neighbourhood before you even look at listings.",
+ "Rightmove shows you houses. We show you areas. You'll see 56 layers of data (crime rates, school ratings, broadband speeds, noise levels, deprivation scores) all on one map, so you can judge a neighbourhood before you even look at listings.",
},
{
question: "Can't I just research all this myself for free?",
@@ -254,7 +255,7 @@ const FAQ_SECTIONS: FAQSection[] = [
{
question: 'Where does the data actually come from?',
answer:
- "Every dataset comes from official UK government sources \u2014 Land Registry, the EPC register, ONS, Ofsted, Ofcom, data.police.uk, and Defra. We don't scrape estate agents or make anything up \u2014 you can verify any record against the original source.",
+ "Every dataset comes from official UK government sources: Land Registry, the EPC register, ONS, Ofsted, Ofcom, data.police.uk, and Defra. We don't scrape estate agents or make anything up. You can verify any record against the original source.",
},
],
},
@@ -264,7 +265,7 @@ const FAQ_SECTIONS: FAQSection[] = [
{
question: 'Is it really worth paying for a property search tool?',
answer:
- "You're making a decision worth \u00a3200k\u2013\u00a3500k or more. Even spotting one red flag \u2014 a noisy road, poor broadband, rising crime \u2014 that changes your mind could save you years of regret. This costs less than a single viewing trip in petrol.",
+ "You're making a decision worth \u00a3200k to \u00a3500k or more. Even spotting one red flag (a noisy road, poor broadband, rising crime) that changes your mind could save you years of regret. This costs less than a single viewing trip in petrol.",
},
{
question: "Is this another subscription that'll drain my account?",
@@ -274,12 +275,12 @@ const FAQ_SECTIONS: FAQSection[] = [
{
question: 'What can I access on the free tier?',
answer:
- 'Free users can explore all features within inner London (roughly zones 1\u20132). To access data for the rest of England, you need lifetime access.',
+ 'Free users can explore all features within inner London (roughly zones 1 to 2). To access data for the rest of England, you need lifetime access.',
},
{
question: 'Can I get a refund?',
answer:
- 'Yes \u2014 we offer a 30-day money-back guarantee. If you\u2019re not satisfied, email support@perfect-postcode.co.uk within 30 days for a full refund.',
+ 'Absolutely. We offer a 30-day money-back guarantee. If you\u2019re not satisfied, email support@perfect-postcode.co.uk within 30 days for a full refund.',
},
],
},
@@ -289,12 +290,12 @@ const FAQ_SECTIONS: FAQSection[] = [
{
question: 'How do I use the AI filter instead of adding filters one by one?',
answer:
- 'Type what you want in plain English \u2014 something like "quiet area near good schools with fast broadband under \u00a3400k" \u2014 and it\'ll set up all the relevant filters in one go. Tweak any of them manually afterwards.',
+ 'Type what you want in plain English, something like "quiet area near good schools with fast broadband under \u00a3400k", and it\'ll set up all the relevant filters in one go. Tweak any of them manually afterwards.',
},
{
question: 'Can I save a search and come back to it later?',
answer:
- 'Hit the save button and everything is captured \u2014 your filters, zoom level, and which data layer you\u2019re colouring by. Pick up exactly where you left off or share the link with your partner.',
+ 'Hit the save button and everything is captured: your filters, zoom level, and which data layer you\u2019re colouring by. Pick up exactly where you left off or share the link with your partner.',
},
{
question: "Can I export the data I'm looking at?",
@@ -484,7 +485,7 @@ export default function LearnPage() {
) : tab === 'faq' ? (
- Whether you're buying, renting, or just exploring — here's how Perfect
+ Whether you're buying, renting, or just exploring, here's how Perfect
Postcode helps you find the right area.
diff --git a/frontend/src/components/map/AiFilterInput.tsx b/frontend/src/components/map/AiFilterInput.tsx
index 550fb54..88cef01 100644
--- a/frontend/src/components/map/AiFilterInput.tsx
+++ b/frontend/src/components/map/AiFilterInput.tsx
@@ -127,7 +127,7 @@ export default memo(function AiFilterInput({
AI Search
- — describe what you're looking for
+ describe what you're looking for
diff --git a/frontend/src/hooks/useTutorial.ts b/frontend/src/hooks/useTutorial.ts
index 5fc4bf6..6234c00 100644
--- a/frontend/src/hooks/useTutorial.ts
+++ b/frontend/src/hooks/useTutorial.ts
@@ -7,48 +7,48 @@ const STORAGE_KEY = 'tutorial_completed';
const STEPS: Step[] = [
{
target: '[data-tutorial="filters"]',
- title: 'Filter Properties',
+ title: 'Tell the map what matters',
content:
- 'Use filters to narrow down to areas which contain matching properties. Filter by crime rate, number of schools around, or filter to an area with detached houses. Pin a filter with the eye icon to colour the map by that feature.',
+ 'Set your budget, commute limit, school quality, crime threshold \u2014 whatever matters to you. Only areas that qualify stay lit. Use the eye icon to colour by any feature.',
placement: 'right',
disableBeacon: true,
},
{
target: '[data-tutorial="ai-filters"]',
- title: 'AI-Powered Filters',
+ title: 'Or just describe it',
content:
- 'Describe your ideal area in plain English — like "quiet neighbourhood with good schools" — and AI will set up the right filters for you automatically.',
+ 'Type what you want in plain English \u2014 like "quiet area near good schools under \u00A3400k" \u2014 and we\u2019ll set up the filters for you.',
placement: 'right',
disableBeacon: true,
},
{
target: '[data-tutorial="map"]',
- title: 'Explore the Map',
+ title: 'Explore what\u2019s out there',
content:
- 'Pan and zoom to explore property data across England. Click any area (hexagon or postcode boundary) to see detailed stats of historical or currently sold properties matching your filters.',
+ 'Pan and zoom across England. Click any coloured area to see crime, schools, prices, broadband, noise \u2014 everything about that neighbourhood.',
placement: 'bottom',
disableBeacon: true,
},
{
target: '[data-tutorial="search"]',
- title: 'Search Locations',
- content: 'Search for a place name or postcode to jump directly to that area on the map.',
+ title: 'Jump to a location',
+ content: 'Search for any place or postcode to fly straight there.',
placement: 'bottom',
disableBeacon: true,
},
{
target: '[data-tutorial="right-pane"]',
- title: 'Area Stats & Properties',
+ title: 'Dig into the details',
content:
- 'After clicking a hexagon, view aggregated area statistics or browse individual properties in this pane.',
+ 'See area statistics, histograms, and individual property records \u2014 prices, floor area, energy ratings, and more.',
placement: 'left',
disableBeacon: true,
},
{
target: '[data-tutorial="poi-button"]',
- title: 'Points of Interest',
+ title: 'What\u2019s nearby?',
content:
- 'Toggle points of interest like schools, shops, and transport stops to see what amenities are nearby.',
+ 'Toggle schools, shops, stations, parks, and restaurants on the map to see what\u2019s within reach.',
placement: 'left',
disableBeacon: true,
styles: {
diff --git a/server-rs/src/pocketbase.rs b/server-rs/src/pocketbase.rs
index 00de860..21e4270 100644
--- a/server-rs/src/pocketbase.rs
+++ b/server-rs/src/pocketbase.rs
@@ -815,7 +815,7 @@ async fn poll_pocketbase_counts(state: &AppState) {
("type", "referral"),
),
(
- Some(r#"used_by_id!=""#),
+ Some(r##"used_by_id!=""##),
"invites_total",
("type", "redeemed"),
),