// wire-shared.jsx — common low-fi primitives for all wireframe variants
// Sketchy paper aesthetic: monochrome ink, pink CTA accent only, gold for authority.
const ink = '#1a1a1a';
const dim = '#6b6b6b';
const fade = '#bdbdbd';
const paper = '#faf8f3';
const pink = '#e6196b';
const gold = '#b8923f';
// Wobble: slight rotation for hand-drawn feel
const wob = (n = 0) => ({ transform: `rotate(${n}deg)` });
// Section label (top-left of each section)
function SectionTag({ n, title, wall }) {
return (
S{n}
{title}
{wall && {wall}の壁 }
);
}
// Photo placeholder — diagonal stripes with cross + monospace caption
function Photo({ w = '100%', h = 200, label = 'photo', tilt = 0, ratio, dark }) {
const bg = dark ? '#222' : '#ece8df';
const stroke = dark ? '#444' : '#cfc9b8';
const fg = dark ? '#e8e3d4' : '#3a3a3a';
const style = {
width: w, height: ratio ? undefined : h,
aspectRatio: ratio, background: bg,
backgroundImage:
`repeating-linear-gradient(135deg, ${stroke} 0 1px, transparent 1px 14px)`,
border: `1.5px solid ${dark ? '#2a2a2a' : ink}`,
position: 'relative', display: 'flex',
alignItems: 'center', justifyContent: 'center',
...wob(tilt),
};
return (
{label}
);
}
// Text-line placeholder — for body copy mock
function Lines({ count = 3, width = '100%', last = '70%', gap = 9, c }) {
const col = c || dim;
return (
{Array.from({ length: count }).map((_, i) => (
))}
);
}
// Heading placeholder — real text in handwritten font (so wireframe reads)
function H({ children, size = 28, c, weight = 700, lh = 1.4, tilt, font }) {
return (
{children}
);
}
// Small caption (handwritten English / Roman)
function Cap({ children, c, size = 13 }) {
return (
{children}
);
}
// CTA button — pink, the only saturated color used in wireframes
function CTA({ label = '予約・問い合わせはLINEから', size = 'lg', tilt = 0, variant }) {
const big = size === 'lg';
const isGhost = variant === 'ghost';
return (
{label}
);
}
// Authority badge — gold thin frame
function Authority({ children, tilt = 0 }) {
return (
{children}
);
}
// Sticky annotation note — visible when annotations are on
function Note({ children, side = 'right', top, bottom, tilt = -1.5, w = 200 }) {
const pos = side === 'right'
? { right: -w - 16, top: top ?? 12 }
: { left: -w - 16, top: top ?? 12 };
return (
);
}
// Section wrapper — provides a tag, spacing, optional notes
function Section({ tag, children, pad = 56, bg, dashed, note }) {
return (
);
}
// Connector arrow (down)
function ArrowDown({ tilt = 0 }) {
return (
);
}
// Horizontal scribble divider
function Scribble({ w = 60, c }) {
return (
);
}
// Frame — phone frame for SP variant
function Frame({ children, kind = 'desktop' }) {
if (kind === 'mobile') {
return (
);
}
return (
{/* Browser chrome */}
{children}
);
}
// Cushion (S0) — now a SEPARATE PAGE (18+ Cushion.html).
// In the wireframe doc this renders as a reference card pointing to the separate file.
function Cushion({ tilt = -0.4 }) {
return (
);
}
Object.assign(window, {
// tokens
WF: { ink, dim, fade, paper, pink, gold },
// primitives
SectionTag, Photo, Lines, H, Cap, CTA, Authority, Note,
Section, ArrowDown, Scribble, Frame, Cushion,
});