// Shared sketchy primitives — kept tiny and explicit so each tab composes from same vocab.
const Box = ({children, style, className='', as='div', ...rest}) => {
const Tag = as;
return {children};
};
const Pill = ({children, className='', style}) => (
{children}
);
const Btn = ({children, className='', style, onClick}) => (
);
// Hand-drawn line of fake text
const FakeLine = ({w='100%', kind='', style}) => (
;
const Note = ({children, style}) =>
{children}
;
const LabelTag = ({children, rot=-1.2, style}) => (
{children}
);
// SVG hand-drawn arrow (curved or straight)
const Arrow = ({d='M0,0 C40,20 80,-10 120,0', w=130, h=30, color='#d96b2c', label, style}) => (
);
// Simple device chrome: browser/mobile
const Browser = ({title='h2learn.app/...', children, style, className=''}) => (
);
const Phone = ({children, style, className=''}) => (
);
// Frame container = labelled wireframe panel
const Frame = ({title, tag, children, style}) => (
{title}
{tag && {tag}}
{children}
);
// Mini node for graph sketches
const Node = ({x, y, r=14, kind='person', label, glow=false, on=false}) => {
const colors = {
person: '#1c5fbf',
project: '#d96b2c',
org: '#2a8a5c',
domain: '#b14fa6',
method: '#7a6cf0',
challenge: '#c33a3a',
bottleneck: '#5b5b5b',
uncertainty: '#c9a227',
me: '#1a1a1a',
};
const c = colors[kind] || '#1a1a1a';
return (
{glow && }
{kind === 'me' && }
{label && {label}}
);
};
const Edge = ({x1,y1,x2,y2, kind='sim', strength=2, dashed=false, glow=false}) => {
const colors = {
sim: '#1c5fbf',
comp: '#d96b2c',
dup: '#c33a3a',
bridge: '#2a8a5c',
method: '#7a6cf0',
weak: '#bdbab0',
};
const c = colors[kind] || '#1a1a1a';
return (
{glow && }
);
};
// horizontal section title
const SectionLead = ({eyebrow, title, sub, children}) => (
{eyebrow &&
{eyebrow}
}
{title}
{sub &&
{sub}
}
{children}
);
Object.assign(window, { Box, Pill, Btn, FakeLine, FakePara, Squiggle, Note, LabelTag, Arrow, Browser, Phone, Frame, Node, Edge, SectionLead });