Bygga
Type the product name from the box. Bygga shows every assembly step in 3D, with the parts, screws and tools for each one, and reads it out loud.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗The public face of WashUp, the car-wash booking platform: the story for car owners, the
partner pitch for car-wash owners, and the trust story behind the admin console.
Arabic (RTL) at /, English at /en.
npm install
npm run dev # http://localhost:3400
npm run typecheck
npm run lint
npm run build && npm start
No environment variables are needed. Links that are still placeholders (store listings,
contact inboxes, production domain) live in src/lib/site.ts — change them there only.
Same toolchain as the Qhub site it is modelled on: Next.js 16 (App Router, Turbopack),
React 19, TypeScript, Tailwind CSS 4, next-intl 4 (Arabic default, localePrefix: "as-needed"),
lucide-react. No animation library: motion is CSS keyframes/transitions plus one shared
scroll loop.
Fonts: Thmanyah Sans (self-hosted, 400/700/900) for Arabic and body text; Unbounded 800
(via next/font, served from our origin) for the wordmark and English headings.
src/
app/[locale]/ layout (html dir/lang, fonts, Navbar, Footer, <Effects/>), home, /partners
i18n/ next-intl routing / request / navigation
messages/{ar,en}.json every visible string
modules/home/ HomeView + sections (Hero, Problem, Steps, Features, Journey*, Services,
PartnersBand, Trust, Numbers, Download, HomeFaq), copy.ts
modules/partners/ PartnersView + PortalTour + TourMocks
shared/brand/ Logo (W ribbon mark + wordmark, SVG)
shared/mock/ Phone frame, app screens, tracking screen, partner dashboard, car, bubbles
shared/ui/ Reveal, WordsReveal, ScrollTintText, Parallax, SpotlightCard, ScrollTilt,
Counter, LazyMount, Button, Section, StoreBadges, Effects
shared/sections/ StepsPath, Faq, FinalCta
lib/ scroll loop + helpers, typography (kashida), site links
data-* attributes. A single client island, shared/ui/Effects.tsx, drives all of them:
one IntersectionObserver flips data-shown (CSS runs the transition), one scroll loop moves
[data-parallax] elements that are near the viewport, one delegated pointer listener feeds
the card glow. Nothing per element hydrates. Without JS everything is simply visible
(the hidden state only applies under html.js).useScrollFrame from
lib/scroll.ts: one shared requestAnimationFrame, gated by an IntersectionObserver so
far-away scenes cost nothing, writing styles straight to the DOM (no React state per frame).content-visibility: auto (.cv-auto).LazyMount); the desktop tracking
scene is code-split and loaded only on wide screens (JourneyDesktop).filter: blur(), and there is no backdrop-filter on
animated layers: both are very expensive to rasterise on phones.prefers-reduced-motion stops every animation and shows final states.messages/ar.json and messages/en.json.ms/me/ps/pe/start/end) so RTL and LTR both work; horizontal motion
uses --dir-x or mirrors the scene (the wash bay is drawn LTR and flipped in Arabic)..num / dir="ltr".<span className="hidden lg:block">),
never on the button itself — its own inline-flex would beat hidden.shared/brand/Logo.tsx with the designer's master SVG.lib/site.ts).