Project 05 / 06 · website
LocalVision Studio
A prototype website offering websites and AI videos to local businesses, built around an interactive “business upgrade simulator”. A prototype, not client work.
Overview
Screenshots
Evidence tier: Existing evidence


See proof
Claim
LocalVision Studio: a prototype website offering websites and AI videos to local businesses, built around an interactive “business upgrade simulator”. A prototype, not client work.
Stated by Danilo
Evidence
- Screenshots of the LocalVision Studio prototype (desktop and mobile) · manual · checked 29 September 2026Taken on 29/09/2026 from the project running locally, because it is not online.
- Screen recording of the LocalVision business upgrade simulator (13 s, no sound) · manual · checked 29 September 2026Recorded on 29/09/2026 with Playwright from the project running locally: picking a business, a problem, a goal and a transformation in the simulator.
- LocalVision source: the simulator state (src/components/Simulator.tsx, lines 36–58) · manual · checked 29 September 2026Copied verbatim from the real source file on 29/09/2026 (line endings normalised).
- LocalVision source: the choice buttons (src/components/Simulator.tsx, lines 226–264) · manual · checked 29 September 2026Copied verbatim from the real source file on 29/09/2026 (line endings normalised).
Result
Real screenshots of the page, taken from the running project on 29/09/2026. That Danilo built it is his statement.
On this page
- 02 Simulator: a screen recording of the business upgrade simulator
- 03 Code: excerpts of the simulator source
Not on this page
- Measured: this prototype runs only on a local development server, and scores taken there would not be representative.
Simulator
Four choices (business, problem, goal, transformation); the preview on the right follows each one.
Screen recording
Evidence tier: Existing evidence
Code
One state object holds the four choices; the choice buttons are one small reusable component.
export function Simulator() {
const { copy } = useLang()
const [state, setState] = useState<SimState>({
business: null,
goal: null,
problem: null,
level: null,
})
const [active, setActive] = useState(0)
const set = (patch: Partial<SimState>) => setState((s) => ({ ...s, ...patch }))
// Picks made in the hero diagnosis column pre-fill the simulator.
useEffect(() => {
const onPick = (e: Event) => {
const { kind, id } = (e as CustomEvent<{ kind: string; id: string }>).detail
if (kind === 'business' || kind === 'goal' || kind === 'problem') {
setState((s) => ({ ...s, [kind]: id }))
}
}
window.addEventListener('lv-pick', onPick)
return () => window.removeEventListener('lv-pick', onPick)
}, [])
Evidence tier: Existing evidence
function Pills<T extends string>({
options,
selected,
onSelect,
accent,
}: {
options: Option<T>[]
selected: T | null
onSelect: (v: T) => void
accent: 'ember' | 'neon'
}) {
const { lang } = useLang()
return (
<div className="flex flex-wrap gap-2.5">
{options.map((opt) => {
const on = selected === opt.id
const ring =
accent === 'neon'
? 'border-neon/70 bg-neon/10 text-cream glow-neon'
: 'border-ember/70 bg-ember/10 text-cream glow-ember'
return (
<motion.button
key={opt.id}
type="button"
whileTap={{ scale: 0.94 }}
onClick={() => onSelect(opt.id)}
className={`glass flex items-center gap-2 rounded-full px-4 py-2.5 text-sm font-medium transition-all ${
on ? ring : 'text-cream-dim hover:text-cream'
}`}
>
{on && <Check className="h-3.5 w-3.5" />}
{opt[lang]}
</motion.button>
)
})}
</div>
)
}
Evidence tier: Existing evidence