Danilo Alessandro Vinciprova

Danilo Alessandro Vinciprova

AI-Assisted Web Developer · React · Next.js · Claude Code

I learned to think of building as parts that must fit together.

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.

PrototypeNext.js, Tailwind CSS, Framer Motion

Overview

Screenshots

Evidence tier: Existing evidence

LocalVision Studio: screenshot of the home page, desktop (1440 px).
LocalVision Studio: screenshot of the home page, mobile (375 px).
Desktop 1440 × 900 and mobile 375 × 812, captured 29 September 2026 from project running locally (not online).
See proof
  1. 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

  2. Evidence

  3. 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

  1. 02 Simulator: a screen recording of the business upgrade simulator
  2. 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

Screen recording of the LocalVision business upgrade simulator (13 s, no sound). Recorded on 29/09/2026 with Playwright from the project running locally: picking a business, a problem, a goal and a transformation in the simulator.

Code

One state object holds the four choices; the choice buttons are one small reusable component.

src/components/Simulator.tsx lines 36–58

Raw text of src/components/Simulator.tsx, lines 36–58
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

LocalVision source: the simulator state · copied 29 September 2026 · sha256 9cb5d9fbbdf9…

src/components/Simulator.tsx lines 226–264

Raw text of src/components/Simulator.tsx, lines 226–264
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

LocalVision source: the choice buttons · copied 29 September 2026 · sha256 68591b03c56d…