// components.jsx — chrome (logo, nav, footer, primitives) for Montroi
const { useState, useEffect, useRef, useMemo, useCallback } = React;
// ─────────────────────────────────────────────────────────────
// Logo — typographic wordmark, no SVG mark (per brief: vector requested but not yet supplied)
function Logo({ size = 22, onClick }) {
return (
{ if (onClick) { e.preventDefault(); onClick(); } }}
className="m-logo" style={{ fontSize: size, letterSpacing: ".34em" }}>
MONTROI
);
}
// ─────────────────────────────────────────────────────────────
// Tiny utility icons (hairline, no fill)
const Ic = {
arrow: (p) => (
),
arrowLong: (p) => (
),
bag: (p) => (
),
close: (p) => (
),
menu: (p) => (
),
search: (p) => (
),
globe: (p) => (
),
ig: (p) => (
),
fb: (p) => (
),
vimeo: (p) => (
),
whatsapp: (p) => (
),
};
// ─────────────────────────────────────────────────────────────
// Navbar
function Navbar({ route, navigate, cartCount, openCart, locale, setLocale }) {
const [scrolled, setScrolled] = useState(false);
const [mobileOpen, setMobileOpen] = useState(false);
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 20);
onScroll();
window.addEventListener("scroll", onScroll, { passive: true });
return () => window.removeEventListener("scroll", onScroll);
}, []);
const items = [
["/story", "Story"],
["/provenance", "Provenance"],
["/shop", "Shop"],
["/workshops", "Workshops"],
["/gifting", "Gifting"],
["/boutiques", "Boutiques"],
["/journal", "Journal"],
];
return (
{lede}
: null}