// ui.jsx — atoms used across the Tengu Drone site kit. // All styling goes through CSS variables defined in colors_and_type.css. const T = { ink: "#3C3489", ink900: "#1F1A52", ink800: "#2A256B", ink100: "#D6D2EC", lacquer: "#9B2226", bamboo: "#C4A882", bamboo200: "#E2D4B7", washi: "#FFFFFF", washi100: "#F4F4F7", sumi: "#2D2D2D", mist: "#7B7591", rule: "rgba(45,45,45,.16)", ruleD: "rgba(245,245,240,.18)", }; function Eyebrow({ children, num, onDark, color }) { const c = color || (onDark ? T.bamboo : T.lacquer); return (
{num && {num}} {children}
); } function Hanko({ size = 38, char = "天" }) { return (
{char}
); } function Wordmark({ size = 18, onDark, stack, accent }) { const accentColor = accent || (onDark ? T.bamboo : T.lacquer); const color = onDark ? T.washi : T.ink; return ( TENGU DRONE ); } function Logo({ size = 32, invert }) { return Tengu Drone; } function Tagline({ onDark }) { return ( Precision is a ritual ); } function Button({ kind = "primary", children, onClick, small, ...rest }) { const base = { fontFamily: 'var(--ff-body)', fontSize: small ? 10 : 11, fontWeight: 700, letterSpacing: '0.32em', textTransform: 'uppercase', padding: small ? '9px 18px' : '13px 24px', border: 'none', borderRadius: 0, cursor: 'pointer', lineHeight: 1, transition: 'all 150ms cubic-bezier(.2,.7,.3,1)', }; const variants = { primary: { background: T.ink, color: T.washi }, ghost: { background: 'transparent', color: T.ink, border: `1px solid ${T.ink}` }, ghostDark: { background: 'transparent', color: T.washi, border: `1px solid ${T.bamboo}` }, seal: { background: T.lacquer, color: T.washi }, }; const [hover, setHover] = React.useState(false); const hoverStyles = { primary: { background: T.ink900 }, ghost: { background: T.ink, color: T.washi }, ghostDark: { background: T.bamboo, color: T.sumi }, seal: { background: "#6F1518" }, }; return ( ); } function CornerFrame({ children, color = T.bamboo, size = 18, inset = 10, ...rest }) { const corner = (pos) => ({ position: 'absolute', width: size, height: size, borderColor: color, borderStyle: 'solid', ...pos, }); return (
{children}
); } // Technical 80×80 grid overlay used on ink backgrounds function TechGrid({ size = 80, onDark = true, opacity = 0.04 }) { const color = onDark ? `rgba(245,245,240,${opacity})` : `rgba(45,45,45,${opacity * 1.4})`; return (
); } function BambooGlow({ opacity = 0.16 }) { return (
); } // Sumi-e mountain band for landscape applications function MountainBand({ height = 220 }) { return ( ); } Object.assign(window, { T, Eyebrow, Hanko, Wordmark, Logo, Tagline, Button, CornerFrame, TechGrid, BambooGlow, MountainBand });