// 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
;
}
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 (
);
}
// 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 });