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.
WashUp بيوصلك بأقرب مغاسل العربيات حواليك. شوف الخدمات والأسعار والتقييمات، احجز الميعاد اللي يناسبك، وتابع عربيتك لحد ما تخلص.
Translation pending
LifestyleTypeScript · CSSGitHub @ebrahim-mamdohOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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).