{p.name}
{p.tag}{p.model}
{p.blurb}
/* MotorInc — main app */
const { useState, useEffect, useRef } = React;
const themeAsset = (path) => {
if (!path || /^(https?:|data:|blob:|#|tel:|mailto:)/.test(path)) return path;
const themeUrl = window.motorincTheme && window.motorincTheme.themeUrl;
if (!themeUrl) return path;
return `${themeUrl.replace(/\/$/, '')}/${path.replace(/^\/+/, '')}`;
};
const mediaUrl = (media, variant = 'url') => {
if (typeof media === 'string') return themeAsset(media);
const variantMap = {
card: media?.cardUrl,
wide: media?.wideUrl,
full: media?.fullUrl
};
return themeAsset(variantMap[variant] || media?.url || '');
};
const mediaAlt = (media, fallback = '') => typeof media === 'string' ? fallback : media?.alt || fallback;
const mediaKey = (media, fallback) => typeof media === 'string' ? media : media?.id || media?.url || fallback;
const mediaSrcSet = (media) => typeof media === 'string' ? undefined : media?.srcset || undefined;
const mediaSizes = (media, fallback) => typeof media === 'string' ? undefined : media?.sizes || fallback;
const mediaWidth = (media) => typeof media === 'string' || !media?.width ? undefined : media.width;
const mediaHeight = (media) => typeof media === 'string' || !media?.height ? undefined : media.height;
const normalizeLines = (value) => {
if (Array.isArray(value)) return value.filter(Boolean);
if (typeof value === 'string') return value.split(/
Harley-Davidson and American V-twin specialists. Engine rebuilds, custom builds, dyno tuning — done right, the first time, in Cluj-Napoca.
|\r?\n/).map((line) => line.trim()).filter(Boolean);
return [];
};
const hasContentProp = (key) => Object.prototype.hasOwnProperty.call(window.motorincContent || {}, key);
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "#851d2c",
"ink": "#262220",
"grain": true,
"marqueeSpeed": 38
}/*EDITMODE-END*/;
const DEFAULT_SERVICES = [
{
n: "01",
title: "Engine Rebuild",
desc: "Full top-end and bottom-end rebuilds for Evolution, Twin Cam and Milwaukee-Eight motors. Stripped, measured, balanced and reassembled to spec — then run-in and verified on the bench."
},
{
n: "02",
title: "Custom Builds & Mods",
desc: "Bobbers, choppers, baggers and one-off performance customs. Structural modifications, custom frames, tanks and exhausts — from first sketch to first ignition."
},
{
n: "03",
title: "Diagnostics & EFI Tuning",
desc: "Diag4Bike-certified computer diagnostics, EFI remapping and fuel-map calibration. We dial in throttle response, AFR and stage upgrades so the bike runs clean and pulls hard."
},
{
n: "04",
title: "Service & Maintenance",
desc: "Scheduled servicing to keep the bike healthy — oil and primary changes, valve checks, belt and clutch inspection. Done properly and documented for resale."
},
{
n: "05",
title: "Paint & Bodywork",
desc: "Custom paint, candy coats, flake, pinstriping and hand-laid lettering. Tank dent repair and frame straightening done in-house, colour-matched to the build."
},
{
n: "06",
title: "Parts & After-Sales",
desc: "OEM Harley-Davidson parts plus S&S, Vance & Hines, Öhlins and Performance Machine, imported direct from the US. Ongoing after-sales support to keep the build running."
}
];
const DEFAULT_PROJECTS = [
{ name: "Black Lung", model: "Softail Night Train", size: "lg",
blurb: "Matte black Softail, fully blacked-out. Twin Cam with S&S Stage I air cleaner, mini ape hangers, 40-spoke chrome front wheel, bobbed rear fender.", tag: "FEATURED",
photos: [
"assets/bikes/bike1/04.webp",
"assets/bikes/bike1/01.webp",
"assets/bikes/bike1/02.webp",
"assets/bikes/bike1/03.webp",
"assets/bikes/bike1/05.webp",
"assets/bikes/bike1/06.webp",
"assets/bikes/bike1/07.webp",
"assets/bikes/bike1/08.webp"
] },
{ name: "Vulcan", model: "Custom Chopper — S&S 124\"", size: "md",
blurb: "Long-rake custom chopper. Candy red with hand-laid silver ghost flames, fully chromed S&S V-twin, spike air cleaner, drag pipes, fat 240 rear on billet wheels.", tag: "CHOPPER",
photos: [
"assets/bikes/bike2/06.webp",
"assets/bikes/bike2/01.webp",
"assets/bikes/bike2/02.webp",
"assets/bikes/bike2/03.webp",
"assets/bikes/bike2/04.webp",
"assets/bikes/bike2/05.webp",
"assets/bikes/bike2/07.webp",
"assets/bikes/bike2/08.webp",
"assets/bikes/bike2/09.webp"
] },
{ name: "Apus", model: "Softail Custom", size: "sm",
blurb: "Candy tangerine Softail with ghost flame graphics. 21\" fat-spoke front, blacked Twin Cam, 2-into-1 shorty drag pipe, bobbed rear, solo seat.", tag: "CUSTOM",
photos: [
"assets/bikes/bike3/06.webp",
"assets/bikes/bike3/01.webp",
"assets/bikes/bike3/02.webp",
"assets/bikes/bike3/03.webp",
"assets/bikes/bike3/04.webp",
"assets/bikes/bike3/05.webp",
"assets/bikes/bike3/07.webp"
] },
{ name: "Cardinal", model: "Softail Custom — FXSTC", size: "wide",
blurb: "Old-school bobber on a Softail frame. Red and black scallop paint, ape hangers, diamond-stitched solo seat with red contrast, bobbed rear, dual-disc front.", tag: "BOBBER",
photos: [
"assets/bikes/bike4/03.webp",
"assets/bikes/bike4/01.webp",
"assets/bikes/bike4/02.webp",
"assets/bikes/bike4/04.webp",
"assets/bikes/bike4/05.webp"
] },
{ name: "Templierul", model: "Softail — Twin Cam 96", size: "wide",
blurb: "Murdered-out Softail built around the Iron Cross theme — custom cast wheels, RSD turbine air cleaner, LED headlight, blacked everything. The only colour is the gold-leaf Harley script on the tank.", tag: "BLACKED-OUT",
photos: [
"assets/bikes/bike5/02.webp",
"assets/bikes/bike5/01.webp",
"assets/bikes/bike5/03.webp",
"assets/bikes/bike5/04.webp",
"assets/bikes/bike5/05.webp",
"assets/bikes/bike5/06.webp"
] },
{ name: "Glonț", model: "Custom Chopper — S&S Super Stock 111\"", size: "md",
blurb: "Frame-up long-rake chopper built in-house. Candy apple red, S&S Super Stock 111ci, open BDL belt primary, polished billet wheels, stretched gas tank.", tag: "CHOPPER",
photos: [
"assets/bikes/bike6/03.webp",
"assets/bikes/bike6/01.webp",
"assets/bikes/bike6/02.webp",
"assets/bikes/bike6/04.webp",
"assets/bikes/bike6/05.webp",
"assets/bikes/bike6/06.webp",
"assets/bikes/bike6/07.webp"
] },
{ name: "Rubin", model: "2001 FXSTI — Stage 3", size: "sm",
blurb: "Frame-off rebuild of Johnny's '01 FXSTI — Stage 3. Stripped to the bones, everything new: Ultima fat-spoke rims on Avon Cobras, Cobra Bad Hombre exhaust, Arlen Ness mirrors, stretch fenders, Galfer rotors, custom candy paint, upholstery by Vanity Kustom.", tag: "REBUILT",
photos: [
"assets/bikes/bike7/02.webp",
"assets/bikes/bike7/01.webp",
"assets/bikes/bike7/03.webp"
] },
{ name: "Codru", model: "Sportster 1200 — Iron", size: "wide",
blurb: "Custom candy-green metallic paint over the tank and fender, hand-laid 24k gold leaf Harley script. Stitched bobbed seat, blacked-out hardware.", tag: "CUSTOM",
photos: [
"assets/bikes/bike8/01.webp",
"assets/bikes/bike8/02.webp",
"assets/bikes/bike8/03.webp",
"assets/bikes/bike8/04.webp",
"assets/bikes/bike8/05.webp"
] }
];
const DEFAULT_FOR_SALE = [
{
id: "fs-hornet",
name: "Hornet",
model: "Softail Slim — Twin Cam 103",
year: "2014",
status: "Available",
blurb: "One-off custom Softail finished in matte graphite with acid-green honeycomb graphics. Blacked-out 103ci Twin Cam, diamond-stitched seat and chrome mini-apes — sorted, serviced and ready to ride away.",
photos: [
"assets/forsale/hornet/01.jpg",
"assets/forsale/hornet/02.jpg"
],
video: "assets/forsale/hornet/reel.mp4",
specs: [
{ label: "The build", items: [
"Matte graphite + acid-green honeycomb livery",
"Hand-painted Harley script & shield",
"Diamond-stitched solo + pillion seat",
"Colour-matched bobbed fenders"
] },
{ label: "Parts & mods", items: [
"Chrome mini-ape bars on pullback risers",
"Billet chrome tank console + cap",
"Fat rear tyre on gloss-black spoked wheels",
"Blacked-out 103\" Twin Cam, LED tail"
] },
{ label: "Included", items: [
"Fresh full service",
"New tyres, front & rear",
"Documents & two keys"
] }
]
}
];
const DEFAULT_ABOUT = {
section: {
title: "About",
accent: "us.",
metaLines: ["Cluj-Napoca, since 2023", "One garage, no compromises"]
},
image: {
url: "assets/shop-floor.webp",
alt: "The Motor Inc. shop floor in Apahida — Harleys lined up, painted Motor Inc. Service & Repair Garage sign at the back",
captionIntro: "///",
captionLabel: "THE FLOOR",
captionPlace: "APAHIDA",
captionYear: "2026",
coordinates: "46.8292° N · 23.7438° E",
animate: true
},
lead: {
before: "We grew up on",
accent: "American iron.",
after: "Now we keep it running on Romanian roads."
},
copy: [
"Motor Inc. opened its doors in Cluj-Napoca in 2023, but our hands are older than that. Between us we've spent years in California shops, on the Sturgis salt, and bent over Twin Cams in barns from Cluj to Constanța. We work on Harleys and American V-twins — and only that — so every bike leaves running better than it came in, logbook in hand."
]
};
const DEFAULT_CONTACT = {
section: {
title: "Pull up to the",
accent: "shop.",
metaLines: ["Tue — Fri · 10—18", "Sat by appointment"]
},
address: {
label: "Address",
lines: ["Str. Libertății nr. 347", "(Intrarea Câmpenești)", "Apahida, Cluj, Romania"],
url: "https://www.google.com/maps/place/MOTOR+Inc/@46.8291979,23.7437639,17z/data=!4m6!3m5!1s0x47490fd97e8c8e93:0x7b3981e7a06daca7!8m2!3d46.8291979!4d23.7437639!16s%2Fg%2F11tsp3f8yn",
parkingNote: "Free parking on-site · Drop-off bay around back"
},
phone: {
label: "Phone",
display: "+40 747 428 621",
tel: "+40747428621"
},
whatsapp: {
label: "WhatsApp",
pill: "FASTEST",
url: "https://wa.me/40747428621",
title: "Open chat",
subtitle: "Send photos · quote within 24h"
},
socials: [
{ type: "facebook", label: "Facebook", url: "https://www.facebook.com/profile.php?id=100067445875017" },
{ type: "instagram", label: "Instagram", url: "https://www.instagram.com/motor.inc.garage/" },
{ type: "tiktok", label: "TikTok", url: "https://www.tiktok.com/@motor.inc.garage" }
],
map: {
embedUrl: "https://maps.google.com/maps?q=MOTOR%20Inc%2C%20Strada%20C%C3%A2mpene%C8%99ti%2C%20Apahida&z=16&output=embed"
}
};
const normalizeAbout = (about = {}) => ({
section: {
title: about.section?.title || DEFAULT_ABOUT.section.title,
accent: about.section?.accent || DEFAULT_ABOUT.section.accent,
metaLines: about.section?.meta_lines || about.section?.metaLines || DEFAULT_ABOUT.section.metaLines
},
image: {
...DEFAULT_ABOUT.image,
...(about.image || {}),
captionIntro: about.image?.caption_intro || about.image?.captionIntro || DEFAULT_ABOUT.image.captionIntro,
captionLabel: about.image?.caption_label || about.image?.captionLabel || DEFAULT_ABOUT.image.captionLabel,
captionPlace: about.image?.caption_place || about.image?.captionPlace || DEFAULT_ABOUT.image.captionPlace,
captionYear: about.image?.caption_year || about.image?.captionYear || DEFAULT_ABOUT.image.captionYear,
animate: typeof about.image?.animate === 'boolean' ? about.image.animate : DEFAULT_ABOUT.image.animate
},
lead: {
before: about.lead?.before || DEFAULT_ABOUT.lead.before,
accent: about.lead?.accent || DEFAULT_ABOUT.lead.accent,
after: about.lead?.after || DEFAULT_ABOUT.lead.after
},
copy: Array.isArray(about.copy) && about.copy.length ? about.copy : DEFAULT_ABOUT.copy
});
const normalizeContact = (contact = {}) => ({
section: {
title: contact.section?.title || DEFAULT_CONTACT.section.title,
accent: contact.section?.accent || DEFAULT_CONTACT.section.accent,
metaLines: contact.section?.meta_lines || contact.section?.metaLines || DEFAULT_CONTACT.section.metaLines
},
address: {
label: contact.address?.label || DEFAULT_CONTACT.address.label,
lines: contact.address?.lines || DEFAULT_CONTACT.address.lines,
url: contact.address?.url || DEFAULT_CONTACT.address.url,
parkingNote: contact.address?.parking_note || contact.address?.parkingNote || DEFAULT_CONTACT.address.parkingNote
},
phone: {
label: contact.phone?.label || DEFAULT_CONTACT.phone.label,
display: contact.phone?.display || DEFAULT_CONTACT.phone.display,
tel: contact.phone?.tel || DEFAULT_CONTACT.phone.tel
},
whatsapp: {
label: contact.whatsapp?.label || DEFAULT_CONTACT.whatsapp.label,
pill: contact.whatsapp?.pill || DEFAULT_CONTACT.whatsapp.pill,
url: contact.whatsapp?.url || DEFAULT_CONTACT.whatsapp.url,
title: contact.whatsapp?.title || DEFAULT_CONTACT.whatsapp.title,
subtitle: contact.whatsapp?.subtitle || DEFAULT_CONTACT.whatsapp.subtitle
},
socials: Array.isArray(contact.socials) && contact.socials.length ? contact.socials : DEFAULT_CONTACT.socials,
map: {
embedUrl: contact.map?.embed_url || contact.map?.embedUrl || DEFAULT_CONTACT.map.embedUrl
}
});
const CONTENT = window.motorincContent || {};
const HERO = hasContentProp('hero') && CONTENT.hero ? CONTENT.hero : {};
const SERVICES = hasContentProp('services') && Array.isArray(CONTENT.services) ? CONTENT.services : DEFAULT_SERVICES;
const PROJECTS = hasContentProp('projects') && Array.isArray(CONTENT.projects) ? CONTENT.projects : DEFAULT_PROJECTS;
const FOR_SALE = hasContentProp('forSale') && Array.isArray(CONTENT.forSale) ? CONTENT.forSale : DEFAULT_FOR_SALE;
const ABOUT = normalizeAbout(CONTENT.about);
const CONTACT = normalizeContact(CONTENT.contact);
const HAS_FOR_SALE = FOR_SALE.length > 0;
const TEAM = [
{ initials: "RM", name: "Radu Mihai", role: "Founder · Master Tech", years: "18", badge: "FOUNDER",
bio: "MMI Phoenix grad. 18 years on Harleys, 6 of them in California. Started Motor Inc. in '23 to bring it home." },
{ initials: "AC", name: "Andrei Cojocaru", role: "Lead Engine Builder", years: "12",
bio: "Twin Cam and M8 specialist. If it's apart, he can put it back together better than it came." },
{ initials: "ES", name: "Elena Stoica", role: "Paint & Bodywork", years: "9",
bio: "Trained in House of Kolor candy work. Hand-pinstriping, lettering, gold leaf. Steady hand, sharp eye." },
{ initials: "VP", name: "Vlad Petrescu", role: "Dyno & Tuning", years: "7",
bio: "PowerVision and Dynojet certified. Treats every map like it's his own bike. Often, it is." }
];
function Nav() {
const [scrolled, setScrolled] = useState(false);
const [active, setActive] = useState("");
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 30);
window.addEventListener('scroll', onScroll);
return () => window.removeEventListener('scroll', onScroll);
}, []);
useEffect(() => {
const ids = ["about", "services", ...(HAS_FOR_SALE ? ["forsale"] : []), "projects", "contact"];
const sections = ids
.map(id => document.getElementById(id))
.filter(Boolean);
if (!sections.length) return;
const pickActive = () => {
// Active = the section whose top is closest to (but at/above) the
// 30%-from-top probe line. Falls back to first section near the top
// of the page, and clears past the last section.
const probe = window.innerHeight * 0.3;
let current = "";
for (const s of sections) {
const top = s.getBoundingClientRect().top;
if (top - probe <= 0) current = s.id;
}
setActive(current);
};
pickActive();
window.addEventListener('scroll', pickActive, { passive: true });
window.addEventListener('resize', pickActive);
return () => {
window.removeEventListener('scroll', pickActive);
window.removeEventListener('resize', pickActive);
};
}, []);
const linkClass = (id) => active === id ? "is-active" : "";
return (
);
}
function Hero() {
const sparksRef = useRef(null);
const ironRef = useRef(null);
const titleRef = useRef(null);
const reelRef = useRef(null);
const videoRef = useRef(null);
const heroVideoUrl = mediaUrl(HERO.video);
const heroVideoType = (typeof HERO.video === 'string' ? 'video/mp4' : HERO.video?.mime) || 'video/mp4';
// Belt-and-braces mute: React's `muted` JSX attr is sometimes not reflected
// onto the DOM property in time for autoplay, so set it imperatively.
useEffect(() => {
const v = videoRef.current;
if (!v) return;
v.muted = true;
v.defaultMuted = true;
v.volume = 0;
const enforce = () => { v.muted = true; v.volume = 0; };
v.addEventListener('volumechange', enforce);
v.addEventListener('play', enforce);
return () => {
v.removeEventListener('volumechange', enforce);
v.removeEventListener('play', enforce);
};
}, []);
// Match shop-reel height to title height in desktop / wider configurations
useEffect(() => {
const titleEl = titleRef.current;
const reelEl = reelRef.current;
if (!titleEl || !reelEl) return;
const sync = () => {
if (window.matchMedia('(min-width: 981px)').matches) {
reelEl.style.height = titleEl.offsetHeight + 'px';
} else {
reelEl.style.height = '';
}
};
sync();
const ro = new ResizeObserver(sync);
ro.observe(titleEl);
window.addEventListener('resize', sync);
if (document.fonts && document.fonts.ready) document.fonts.ready.then(sync);
return () => { ro.disconnect(); window.removeEventListener('resize', sync); };
}, []);
useEffect(() => {
const cnv = sparksRef.current;
const ironEl = ironRef.current;
if (!cnv || !ironEl) return;
const ctx = cnv.getContext('2d');
let raf, dpr = Math.min(window.devicePixelRatio || 1, 2);
let w = 0, h = 0;
let edgePoints = []; // sampled letter-edge points, canvas-local coords
let wordLocal = { x: 0, y: 0, w: 0, h: 0 }; // word position inside canvas
const sparks = [];
const PAD = 60; // padding around the word for sparks to fly into
function sampleLetters() {
// Render "Iron." into an offscreen canvas at the same metrics, scan pixels
const cs = getComputedStyle(ironEl);
const fontSize = parseFloat(cs.fontSize);
const fontFamily = cs.fontFamily;
const fontWeight = cs.fontWeight;
const text = (ironEl.textContent || 'Iron.').trim();
const off = document.createElement('canvas');
const wordW = wordLocal.w;
const wordH = wordLocal.h;
off.width = Math.max(1, Math.ceil(wordW));
off.height = Math.max(1, Math.ceil(wordH));
const octx = off.getContext('2d');
octx.fillStyle = '#fff';
octx.textBaseline = 'alphabetic';
octx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;
// Bebas Neue baseline ~ 0.82 of em from top; just place near bottom
octx.fillText(text, 0, wordH * 0.86);
const data = octx.getImageData(0, 0, off.width, off.height).data;
const pts = [];
const step = 3;
for (let y = 0; y < off.height; y += step) {
for (let x = 0; x < off.width; x += step) {
const i = (y * off.width + x) * 4 + 3;
if (data[i] > 80) {
// edge if a neighbor is empty
const isEdge =
(x + step >= off.width) ||
(y + step >= off.height) ||
data[(y * off.width + (x + step)) * 4 + 3] < 80 ||
data[((y + step) * off.width + x) * 4 + 3] < 80 ||
(x - step >= 0 && data[(y * off.width + (x - step)) * 4 + 3] < 80) ||
(y - step >= 0 && data[((y - step) * off.width + x) * 4 + 3] < 80);
if (isEdge) pts.push({ x, y });
}
}
}
edgePoints = pts;
}
function place() {
const titleEl = ironEl.parentElement;
const tRect = titleEl.getBoundingClientRect();
const iRect = ironEl.getBoundingClientRect();
// measure actual rendered text width (not the full row block)
const inner = ironEl.querySelector('.inner') || ironEl;
const innerRect = inner.getBoundingClientRect();
const wordW = innerRect.width;
const wordH = innerRect.height;
const wordLeft = innerRect.left - tRect.left;
const wordTop = innerRect.top - tRect.top;
// canvas covers word + padding
const canvasLeft = wordLeft - PAD;
const canvasTop = wordTop - PAD;
w = wordW + PAD * 2;
h = wordH + PAD * 2;
cnv.style.left = canvasLeft + 'px';
cnv.style.top = canvasTop + 'px';
cnv.style.width = w + 'px';
cnv.style.height = h + 'px';
cnv.width = w * dpr; cnv.height = h * dpr;
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
wordLocal = { x: PAD, y: PAD, w: wordW, h: wordH };
sampleLetters();
}
// Wait for fonts so sampling matches what's rendered
if (document.fonts && document.fonts.ready) {
document.fonts.ready.then(place);
} else {
place();
}
place();
const ro = new ResizeObserver(place);
ro.observe(ironEl.parentElement);
window.addEventListener('resize', place);
function spawn(n) {
if (!edgePoints.length) return;
for (let i = 0; i < n; i++) {
const p = edgePoints[(Math.random() * edgePoints.length) | 0];
// canvas-local position of the edge sample
const ox = wordLocal.x + p.x;
const oy = wordLocal.y + p.y;
// upward-biased fan with sideways spread (looks like grinder shower)
const angle = -Math.PI / 2 + (Math.random() - 0.5) * Math.PI * 0.9;
const speed = 1.4 + Math.random() * 4.5;
sparks.push({
x: ox, y: oy,
vx: Math.cos(angle) * speed,
vy: Math.sin(angle) * speed,
life: 0,
maxLife: 45 + Math.random() * 70,
size: 0.7 + Math.random() * 1.4,
hue: 18 + Math.random() * 30,
});
}
}
let active = true;
let last = 0;
function tick(t) {
ctx.clearRect(0, 0, w, h);
if (active && t - last > 40 + Math.random() * 80) {
spawn(2 + Math.floor(Math.random() * 5));
last = t;
}
ctx.globalCompositeOperation = 'lighter';
for (let i = sparks.length - 1; i >= 0; i--) {
const s = sparks[i];
s.life++;
s.x += s.vx; s.y += s.vy;
s.vy += 0.07;
s.vx *= 0.99; s.vy *= 0.99;
const lt = s.life / s.maxLife;
if (lt >= 1) { sparks.splice(i, 1); continue; }
const a = (1 - lt) * 0.95;
// glow
ctx.beginPath();
ctx.arc(s.x, s.y, s.size * 3.2, 0, Math.PI * 2);
ctx.fillStyle = `hsla(${s.hue}, 100%, ${60 - lt * 30}%, ${a * 0.16})`;
ctx.fill();
// streak
ctx.beginPath();
ctx.moveTo(s.x, s.y);
ctx.lineTo(s.x - s.vx * 1.6, s.y - s.vy * 1.6);
ctx.strokeStyle = `hsla(${s.hue}, 100%, ${65 - lt * 30}%, ${a})`;
ctx.lineWidth = s.size;
ctx.lineCap = 'round';
ctx.stroke();
// hot core
ctx.beginPath();
ctx.arc(s.x, s.y, s.size, 0, Math.PI * 2);
ctx.fillStyle = `hsla(50, 100%, ${85 - lt * 30}%, ${a})`;
ctx.fill();
}
ctx.globalCompositeOperation = 'source-over';
raf = requestAnimationFrame(tick);
}
raf = requestAnimationFrame(tick);
const io = new IntersectionObserver(([e]) => { active = e.isIntersecting; });
io.observe(cnv);
return () => {
cancelAnimationFrame(raf);
ro.disconnect();
io.disconnect();
window.removeEventListener('resize', place);
};
}, []);
return (
American
Iron.
Romanian
Hands.
{s.desc}
{p.model}
{p.blurb}
{b.model} · {b.year}
{b.blurb}
{paragraph}
)}{m.bio}
{CONTACT.address.parkingNote}
Last updated / Ultima actualizare: 3 June 2026
This website is operated by MOTOR INC GARAGE SRL, CUI 46322110, Trade Register no. J2022003625129, EUID ROONRC.J2022003625129, registered on 17 June 2022, with its registered office at Str. Libertatii 347, Sat Apahida, Jud. Cluj, 407035, Romania.
We process only the data needed to run this website, answer service requests, and maintain business communication. This may include server logs such as IP address, browser/device information and visit time, plus any details you choose to send by phone, WhatsApp, email or social media.
We use this information to respond to inquiries, prepare service or sales follow-up, protect the website, and comply with legal, accounting or administrative obligations. We keep inquiry messages only for as long as reasonably needed for customer service and business records, unless a longer legal retention period applies.
The site may load content or services from third parties, including Hostinger for hosting, Google Maps, Google Fonts or script CDNs, WhatsApp/Meta, Facebook, Instagram and TikTok. If you interact with those services, their own privacy terms also apply.
We do not intentionally use analytics or marketing cookies on this website at this stage. Essential technical cookies or server logs may still be used by WordPress, the hosting provider or security tools to keep the site working.
Under GDPR, you may request access, correction, deletion, restriction, portability or objection regarding your personal data. You may also lodge a complaint with ANSPDCP. For privacy requests, contact us using the phone or WhatsApp details shown on this site.
Acest website este operat de MOTOR INC GARAGE SRL, CUI 46322110, nr. Registrul Comertului J2022003625129, EUID ROONRC.J2022003625129, infiintata la 17 iunie 2022, cu sediul in Str. Libertatii 347, Sat Apahida, Jud. Cluj, 407035, Romania.
Prelucram doar datele necesare pentru functionarea website-ului, pentru a raspunde solicitarilor de service si pentru comunicarea comerciala. Aceste date pot include jurnale tehnice precum adresa IP, informatii despre browser/dispozitiv si momentul vizitei, precum si detaliile pe care ni le trimiteti prin telefon, WhatsApp, email sau retele sociale.
Folosim aceste informatii pentru a raspunde solicitarilor, pentru follow-up legat de service sau vanzari, pentru securitatea website-ului si pentru indeplinirea obligatiilor legale, contabile sau administrative. Pastram mesajele de solicitare doar cat este rezonabil necesar pentru relatia cu clientii si evidentele comerciale, cu exceptia cazurilor in care legea cere o perioada mai lunga.
Website-ul poate incarca servicii sau continut de la terti, inclusiv Hostinger pentru gazduire, Google Maps, Google Fonts sau CDN-uri de scripturi, WhatsApp/Meta, Facebook, Instagram si TikTok. Daca interactionati cu aceste servicii, se aplica si politicile lor de confidentialitate.
In acest moment nu folosim in mod intentionat cookies de analiza sau marketing. Cookies tehnice esentiale sau jurnale de server pot fi folosite totusi de WordPress, furnizorul de gazduire sau instrumentele de securitate pentru functionarea website-ului.
Conform GDPR, puteti solicita accesul, corectarea, stergerea, restrictionarea, portabilitatea sau opozitia privind datele personale. De asemenea, puteti depune o plangere la ANSPDCP. Pentru solicitari privind confidentialitatea, contactati-ne folosind telefonul sau WhatsApp-ul afisat pe acest website.