// ============================================================
// Noble Design Asia — Bottom: Testimonials, MidCTA, Contact+Footer
// ============================================================
const TESTIMONIALS = [
{ q: "Flawless execution from start to finish. The team managed everything with such professionalism.", n: "Sarah L.", c: "Jakarta" },
{ q: "Jerome understood exactly what we needed. The result is timeless and perfectly suits our lifestyle.", n: "Michael T.", c: "Bali" },
{ q: "No stress, no surprises. Just a beautifully finished space delivered exactly as promised.", n: "Diana W.", c: "Jakarta" },
];
// ------------- TESTIMONIALS (Flat & Clean) -------------
function Testimonials() {
const [idx, setIdx] = React.useState(0);
React.useEffect(() => {
const t = setInterval(() => setIdx(i => (i + 1) % TESTIMONIALS.length), 7000);
return () => clearInterval(t);
}, []);
const go = (i) => setIdx((i + TESTIMONIALS.length) % TESTIMONIALS.length);
return (
07 — Client Voices
{String(idx + 1).padStart(2, '0')} / {String(TESTIMONIALS.length).padStart(2, '0')}
{/* Quote Container (Flat design, border tipis, shadow-none) */}
{TESTIMONIALS.map((t, i) => (
"{t.q}"
{t.n.split(' ').map(w => w[0]).slice(0, 2).join('')}
))}
{/* Separator / Controls */}
);
}
// ------------- MID-CTA -------------
function MidCTA() {
return (
);
}
// ------------- CONTACT + MINIMAL FOOTER -------------
function ContactAndFooter() {
const [form, setForm] = React.useState({ fn: "", ln: "", email: "", phone: "", msg: "", ok1: false, ok2: false });
const [sent, setSent] = React.useState(false);
const submit = (e) => {
e.preventDefault();
if (!form.fn || !form.ln || !form.email || !form.ok1) return;
setSent(true);
setTimeout(() => setSent(false), 4200);
};
const socials = [
{ Icon: IconWhatsApp, label: "WhatsApp" },
{ Icon: IconInstagram, label: "Instagram" },
{ Icon: IconFacebook, label: "Facebook" },
{ Icon: IconYoutube, label: "YouTube" },
{ Icon: IconLinkedin, label: "LinkedIn" },
];
return (
);
}
// ------------- FIELD & WHATSAPP BAR -------------
function Field({ label, required, type = "text", as, rows = 3, value, onChange, placeholder }) {
const common = { value, onChange: e => onChange(e.target.value), placeholder, required, "aria-required": required || undefined, className: "w-full bg-transparent border border-paper/15 px-4 py-3 text-[14px] text-paper placeholder:text-paper/30 focus:border-gold focus:outline-none transition-colors shadow-none rounded-none" };
return (
);
}
const WA_NUMBER = "6285117728578";
const WA_DISPLAY = "+62 851-1772-8578";
const waLink = (msg) => `https://wa.me/${WA_NUMBER}?text=${encodeURIComponent(msg || "Hi Noble Asia, I'd like to discuss an interior design project.")}`;
function WhatsAppBar({ eyebrow = "Quick chat", title, message, variant = "dark" }) {
const v = {
dark: { wrap: "bg-purple text-paper border border-purple shadow-none", sub: "text-paper/60", btn: "bg-gold hover:bg-paper text-purple rounded-none", eye: "text-gold" },
light: { wrap: "bg-paper text-purple border border-purple/10 shadow-none", sub: "text-purple/55", btn: "bg-green hover:bg-purple text-paper rounded-none", eye: "text-green" },
gold: { wrap: "bg-gold-100 text-purple border border-gold/30 shadow-none", sub: "text-purple/55", btn: "bg-purple hover:bg-green text-paper rounded-none", eye: "text-green" },
}[variant];
return (
{eyebrow}
{title}
Reply within minutes · Mon–Sat · {WA_DISPLAY}
Chat on WhatsApp
);
}
Object.assign(window, { Testimonials, MidCTA, ContactAndFooter, Field, WhatsAppBar, WA_NUMBER, WA_DISPLAY, waLink });