Resume Prompt
Continue porting the offplan.online sales-presentation surface from HTML to React. Path 2 scaffold is live at
os/design-system/sales-app/(Next 16 + Tailwind v4 + shadcn/ui + Storybook 10 + Pannellum). Foundation is shipped + 2 of 7 modules ported (top-bar,info-panel) with stories. Next: portbuyer-profile(the slide-in drawer with persona form + prefs chips + saved-units list + send-summary + agent-login), thenexterior-360(Pannellum dynamic-import in a'use client'component, seedocs/next16-tailwind4-notes.md), thenhotspot/poi-detail/project-tour, then compose screen 02 atapp/exterior/page.tsx. First action: start dev servers (./node_modules/.bin/next devto bypass pnpm install pre-check,pnpm storybook) and copy Riviera imagery from Dropbox perdesign-system/sales-app/README.mdsetup section. The HTML reference isos/design-system/sales/02-exterior.html— port its visual design intofeatures/exterior-360/Exterior360.tsx. Task list (#5-13) tracks remaining work.
Summary
Massive arc: started as "implement the design system bundle" → audited 4 live Volume Vision sales sites (tapestry/pipis/cote/lagoon) to ground the redesign → captured Nadezhda's 2026-05-08 client-feedback transcript (real Dubai developer) which shifted the IA from "building-with-dots" to "360° project hero + floorplate-first selection + buyer profile" → built four iterations of the Exterior screen as HTML mockups (v1 → v4 with Pannellum + real Riviera 360° aerial + buyer profile slide-in panel) → strategic conversation about modular architecture → Roman approved Path 2 (production React stack) → scaffolded Next.js 16 + Tailwind v4 + shadcn/ui + Storybook 10 + Pannellum → ported top-bar + info-panel modules with stories. Both Storybook (:6006) and Next.js (:3000) running clean. 5 feature modules + screen-02 compose + Code Connect to Figma still ahead.
Changes
Inputs gathered (read-only)
~/VOLUME VISION Dropbox/.../Offplan Online Design System-handoff.zip— extracted to/tmp/oo-ds-handoff/— bundle's brandbook is byte-identical to localdocs/brandbook/v2.html(same SHAd1ba831b...).~/VOLUME VISION Dropbox/.../UI_UX Design _ Offplan (Roman's Copy)— 32 PNG references (Roman clarified these are NOT Sergei's; existing-design reference, NOT visual target).~/VOLUME VISION Dropbox/.../438 Riviera Residences/Client Preview/6 Final/— real production CGI (panorama + 24 WEB renders) — needs Dropbox Smart Sync materialisation before copy.
UX audit of live product (4 sites + 1 dead)
docs/audit/SUMMARY.md— cross-site synthesis (NEW). Module matrix: Tapestry no Welcome/Location/Amenities; Pipis has Location not Amenities; Cote has Amenities not Location. Top finding: zero CTA / handoff anywhere — funnel terminates blind everywhere. URL pattern/<projectId>/<route>on Next.js.?modal=unitDetailsdeep-link silently fails on Pipis + Cote.docs/audit/{tapestry,pipis,cote,lagoon}/report.md+ ~50 screenshots (gitignored — too heavy).- Kleo subdomain not provisioned (NXDOMAIN) — agent confirmed via 3 resolvers + sibling-subdomain sanity check.
Client research
docs/research/client-feedback-nadezhda-2026-05-08.md(NEW) — synthesised 60-minute transcript with Roman + Ilya + Nadezhda (prospective Abu Dhabi developer). Strategic critique: "Люди как бы выбирают квартиру не на бейтажном плане" — buyers pick by apartment type, not floor position. Two real journeys (by-type, by-budget) both converge on layout-first selection. Currency/units toggle, custom anonymisable statuses, CRM integration scenarios all locked.
Plan ratified
plans/sales-presentation-redesign.md(NEW) — front-end UX only (Roman's scope decision Q5 = A). Out of scope: admin panel, broker auth, Microsoft SSO, CRM backend (CRM events delivered as written POST contract). Working dir:os/design-system/sales/(Path 1 HTML) → migrated mid-session toos/design-system/sales-app/(Path 2 React).
Path 1 — HTML mockups (4 iterations of screen 02)
os/design-system/sales/02-exterior.html(NEW, 1100+ lines) — final v4: Pannellum 360° aerial + 8 hotspots (4 inward labelled / 4 outward hover-only) + bottom-left info panel + right-rail compass+CTAs + single profile button → slide-in panel with persona + 4 chip-group preferences + saved-units list + send-summary + agent-login footer. All interactions wired in vanilla JS; CRM events stubbed viaconsole.log('crm:event', …).os/design-system/sales/colors_and_type.css+_shell.css+_components.css— copied from bundle as canonical tokens.os/design-system/sales/screenshots/— v1 → v4 progression (gitignored).
Path 2 — Next.js scaffold (canonical going forward)
os/design-system/sales-app/(NEW, ~150 source files) — Next.js 16.2.6 + React 19.2.4 + Tailwind 4.2.4 + Turbopack default + TypeScript strict + pnpm 11.src/app/globals.css— canonical token system in one@theme inlineblock + per-project[data-project="riviera|cote|velvet"]overrides + shadcn token aliases (--color-primary→var(--color-proj-accent)etc.) + Tailwind v4@utility h1/h2/.../mono.src/app/layout.tsx— Inter + JetBrains Mono vianext/font/googleexposing--font-inter/--font-jetbrains-monoCSS vars.data-project="riviera"set on<html>.src/app/page.tsx— index page listing screens + module demos. Renders Helvetica display 56px weight 200 over Skeleton White — token system verified rendering correctly.src/components/ui/{button,input,label,sheet,dialog,separator,badge,tooltip,toggle-group,toggle}.tsx— shadcn primitives via@base-ui/react(Radix successor in shadcn 4.x).src/lib/utils.ts—cn()helper.src/types/index.ts—BuyerProfile,Poi,UnitStatus,ProjectSlugtypes.src/features/top-bar/TopBar.tsx+TopBar.stories.tsx(4 stories: dark/light × buyer empty/set) — controlled props for currency/units/buyer/onProfileClick. InternalPrefTogglesub-component (promote later if reused).src/features/info-panel/InfoPanel.tsx+InfoPanel.stories.tsx(Riviera + Côte) — Skeleton White card, eyebrow + Helvetica 200 H1 + lede + 3-stat grid.src/features/{buyer-profile,exterior-360,hotspot,poi-detail,project-tour}/README.md— stub READMEs only; implementation pending..storybook/preview.ts— importsglobals.css, defines aprojectglobal with toolbar dropdown (Riviera default, Côte, Velvet, House) that flipsdata-projecton<html>live across all stories.package.json—pnpm.onlyBuiltDependencies: [sharp, unrs-resolver, esbuild, msw](pnpm 11 quirk; without this, install rejects withERR_PNPM_IGNORED_BUILDS).docs/next16-tailwind4-notes.md(NEW) — sub-agent-captured cheatsheet on Next 16 breaking changes (asyncparams,middleware → proxy.ts, removednext lint, etc.) and Tailwind v4 (@theme inline,@utility, variable-to-utility mapping). Read before writing new code in this app.README.md— first-time setup including Dropbox imagery copy commands.
Memory captured
~/.claude/projects/-Users-romantarasov-code-offplan-online/memory/project_redesign_context.md— three design states (live / Sergei's WIP / new offplan.online direction)~/.claude/projects/-Users-romantarasov-code-offplan-online/memory/project_new_direction.md— IA shift after Nadezhda~/.claude/projects/-Users-romantarasov-code-offplan-online/memory/feedback_design_inputs.md— design from bundle + transcripts ONLY; Sergei's atelier mockups not canonical~/.claude/projects/-Users-romantarasov-code-offplan-online/memory/reference_audit_artifacts.md~/.claude/projects/-Users-romantarasov-code-offplan-online/memory/reference_sales_app_setup.md— Path 2 setup state, dev-server commands, pnpm quirks~/.claude/projects/-Users-romantarasov-code-offplan-online/memory/MEMORY.md— index updated
Gitignore
os/.gitignore— added rules fordesign-system/sales-app/public/imagery/,design-system/sales/assets/imagery/,docs/audit/**/*.png, etc. ~317 MB of binaries kept out of git; sourced from Dropbox per setup.
Decisions
Path 2 over Path 1 — production React stack. Roman explicitly chose Path 2 ("Next.js + TS + Tailwind + shadcn/ui + Storybook + Code Connect — best SaaS approach"). Path 1 (HTML mockups) was completed through v4 of screen 02 with full interactions including profile slide-in panel. Path 2 is the canonical going-forward track. HTML files at os/design-system/sales/ kept as visual reference for the port — do not extend them.
Modular architecture at FEATURE level (Roman's framing) plus PRIMITIVES level. Roman's instinct: "buyer profile = one module, exterior 360° = another module, hotspots maybe their own module so they work standalone, top bar = its own module, project tour = its own module". Confirmed correct — that's exactly how senior frontend teams cut. Two-tier structure: features/<name>/ for behaviour-owning modules (top-bar, buyer-profile, exterior-360, hotspot, info-panel, poi-detail, project-tour); components/ui/ for shadcn primitives (Button, Sheet, Dialog, Input, etc.). Composition: screens/<route>/page.tsx is a thin file dropping in features.
Top-right is a SINGLE profile button, not dual chips. First implementation had two chips (agent + buyer); Roman rejected: "no, this needs to be only a single button like a profile". Correct shape: one Profile pill (icon → initials when set) opens a slide-in panel containing persona form (firstname/lastname/phone/email) + preferences (multi-select chips for beds/baths/parking/aspect + price range) + saved units list + primary "Send summary email" button + secondary "Agent login" link at the bottom. Agent identity is implicit / accessed from inside the panel.
Single canonical brandbook. Bundle's reference/brandbook-v2.html is byte-identical to local docs/brandbook/v2.html (SHA d1ba831b...). The "Hybrid Calatrava" handoff is NOT a new direction — it's the same brandbook the team's been using, packaged with colors_and_type.css tokens. No migration needed; both surfaces canonical.
Sergei's os/docs/mockups/sales-app-atelier.html (6587 lines) is NOT canonical. Roman: "a lot of this is Sergei doing, I'm not 100% happy with it. Go off the designs currently that I input in this latest conversation, then we will design our own version of the front end app." Drift evidence: uses Cormorant Garamond display vs bundle's Helvetica Neue; gold + glass-panel direction vs bundle's austere Skeleton White. Treat as historical reference only; do not extend or synthesise from it.
CRM scope = front-end UX only (option A). Roman locked: "design the buyer-facing surface — 360° hero, floorplate-first selection, buyer profile capture, persistent profile chip, save-to-profile flow, offer generation screen. CRM signals are stubbed (a clean POST contract with payload examples, ready for backend wiring later). No broker auth, no Microsoft SSO, no admin-side." Per-screen stubs use console.log('crm:event', { type, ... }) until the contract spec lands.
Path 1 v4 vs Path 2 — what survived. All visual decisions from HTML v4 ported to Path 2 token system. JS state-management replaced by React useState/controlled props. Pannellum integration pattern: 'use client' + dynamic import() inside useEffect (per Next 16 docs cheatsheet). Hotspot positions, scrim opacity, atmospheric scrim gradient, info-panel layout — all preserved.
Riviera Residences as the reference project (not Côte). Project 438. Roman provided real production CGI: 17.8 MB 360° aerial + 12 WEB renders (lobby, pool, beach, promenade, paddle court, podium lounge, yoga, sky-villa terrace, ocean-villa terrace, family pavilion). Two cascading towers, marina edge, 240 residences, fifteen sky villas, Q4 2028 handover. Project accent muted teal-blue #4A7387.
Next Steps
- Restart dev servers + copy Riviera imagery from Dropbox per
design-system/sales-app/README.mdsetup section. The imagery is gitignored so a fresh clone needs the copy. - Port
buyer-profile— biggest module. Useos/design-system/sales/02-exterior.htmllines covering.profile-panelas the visual reference. Build with shadcnSheetprimitive (slide-in drawer, accessibility for free). Stories: empty / persona-only / persona+prefs / with 1 saved unit / with 5 / send-enabled / send-disabled / agent-empty / agent-set. - Port
exterior-360—'use client'component with dynamic import of Pannellum insideuseEffect(seedocs/next16-tailwind4-notes.mdfor the exact pattern). Receives panorama URL + hotspot list as props. Stories: loaded / loading / paused. - Port
hotspot— ring marker + tooltip; consumed byexterior-360via Pannellum'scssClassmechanism. Variants: in (always-labelled) / soft (inward, hover-only) / out (square ornament, hover-only). - Port
poi-detail— slide-in card from hotspot click; image + eyebrow + name + copy + CTA. Build with shadcnSheetagain (right side). Stories: inward (Enter 360°) / outward (View on map). - Port
project-tour—useProjectTour()hook + a<TourTrigger>button. Hook orchestrates auto-pan + auto-open-POI. Stories: idle / running / interrupted. - Compose screen 02 at
app/exterior/page.tsx— drop in TopBar + Exterior360 + InfoPanel + BuyerProfile + ProjectTour + PoiDetail. Verify visual parity withos/design-system/sales/screenshots/02-exterior-v4-default.png. - Wire Code Connect to Figma — per-module
.figma.tsfiles mapping our React components to Figma component IDs. This requires Sergei to first create the matching Figma frames; for now scaffold the boilerplate.
Open Questions
- Where in the repo do screens live? Currently planned
app/exterior/page.tsx(route/exterior) butapp/page.tsxis the index. Real product would have project-scoped routes likeapp/[project]/exterior/page.tsx. Defer until multi-project routing is needed. - Storybook test setup. Vitest + Playwright integration was scaffolded by Storybook init but not exercised. Worth running
pnpm testonce we have real component tests. - shadcn Button uses
rounded-lg = 14pxwhich sits between our--radius-md (14px)and--radius-lg (20px). Currently both shadcn--radius-lgand our--radius-mdresolve to 14px via the shadcn alias. Acceptable for now; revisit if buttons feel wrong-sized. - Code Connect requires Figma component IDs that Sergei would create. We can scaffold mappings with placeholder IDs and fill them in once Sergei's Figma file has matching components.
- Path 1 lifetime — the HTML mockups at
os/design-system/sales/are kept "for reference" but every iteration in Path 2 will diverge them further. At what point do we delete? Roman to decide; suggest after Path 2 reaches feature-parity with Path 1 v4.
Context for next session
- Two dev servers to start:
./node_modules/.bin/next dev(bypasses pnpm install pre-check) at:3000andpnpm storybookat:6006. Thenext devform is the safe one —pnpm devtriggers pnpm 11's pre-install check which fails on theERR_PNPM_IGNORED_BUILDSwarning. - Next.js 16 ≠ training data. Heed
os/design-system/sales-app/AGENTS.mdwarning. Readdocs/next16-tailwind4-notes.mdbefore writing new code. Most important:params/searchParamsare now Promises (mustawait);middleware.ts→proxy.ts; client-only libs need dynamic-import-inside-useEffect. - Tailwind v4
@theme inlinevs plain@theme— we useinlineso token references likevar(--color-proj-accent)stay asvar()references in generated utilities (lets[data-project=…]overrides work at runtime). - Pannellum integration pattern (verified working in Path 1):
pannellum.viewer('panorama', { type: 'equirectangular', panorama: 'assets/imagery/riviera/360-aerial.jpg', autoLoad: true, autoRotate: 0, hfov: 88, pitch: -6, yaw: -42, hotSpots: [...] }). TheautoRotate: 0is the locked-camera pattern;pitch: -6, yaw: -42frames the towers. Checkos/design-system/sales/02-exterior.htmlfor full integration. - Real Riviera CGI dimensions: 360° aerial is 2:1 equirectangular (panellum-ready). All 12 WEB renders are 4K-ish JPEGs. Total ~88 MB; gitignored.
- shadcn 4.x uses
@base-ui/reactnot Radix. Different API than older shadcn versions — read base-ui docs if hooking up complex behaviours. - Per-project switcher in Storybook toolbar flips Riviera / Côte / Velvet / House on the fly. Useful for verifying chrome reads against each project's accent.
- Task list in TaskCreate has 13 items tracking porting (#1-4 done, #5+9 done = top-bar + info-panel, #6-8 + #10-13 pending). Reuse on next session via TaskList.
- Sergei's CONV-track is independent. His commits (
1ff4c92,72984d9,0d708e5,0719942,100cd2e) onsales-app-atelier.htmlcontinued in parallel and are not relevant to Path 2. Don't attempt to merge. - MEMORY.md was modified externally twice during the session by linter — respected per system reminder.
- Untracked at handoff time:
design-system/sales-app/(Path 2 scaffold, ~150 source files),design-system/sales/(Path 1 HTML mockups),docs/audit/,docs/research/client-feedback-nadezhda-2026-05-08.md,plans/sales-presentation-redesign.md,docs/sessions/CONV-28.md(this file). Will commit in Step 5.5.