// Kelappa — Logo v3: keep the circle-with-three-dots concept, // fix the pairing. Vary mark color, type, weight, layout. // ── Mark, refined ────────────────────────────────────────── // Cleaner geometry, configurable color triplet, no extra inner ring. function MarkDots({ size = 120, ring = '#3a2618', fill = '#f6efe2', dots = '#3a2618', ringWidth = 8, // in viewBox units (out of 120) dotR = 5, // dot layout: 'top' (top trio, like a face / actual coconut eyes) // 'tri' (equilateral triangle, more graphic) layout = 'top', // optional inner halo noRing = false, }) { const r = 60 - ringWidth / 2; const positions = layout === 'top' ? [[48, 46], [72, 46], [60, 62]] : [[60, 42], [46, 70], [74, 70]]; return ( {!noRing && } {noRing && } {positions.map(([x, y], i) => ( ))} ); } // ── Pairing card ────────────────────────────────────────── // Shows a single mark + wordmark pairing, with small-size variants below. function Pairing({ letter, // "A", "B", ... bg, fg, accent, mark, // props object wordFont, // CSS font-family wordWeight = 600, wordTracking = '-0.025em', wordItalic = false, wordTransform = 'lowercase', // 'lowercase' | 'uppercase' | 'none' wordSize = 72, gap, stacked = false, markScale = 1, // multiplier vs wordSize for mark size asPeriod = false, // mark sits AFTER the word as a period note, fontName, }) { const markSize = wordSize * 1.15 * markScale; const realGap = gap ?? (asPeriod ? wordSize * 0.08 : wordSize * 0.22); const wordStyle = { fontFamily: wordFont, fontWeight: wordWeight, fontStyle: wordItalic ? 'italic' : 'normal', fontSize: wordSize, letterSpacing: wordTracking, color: fg, textTransform: wordTransform, lineHeight: 0.9, display: 'inline-block', }; return (
{letter} {fontName}
{!asPeriod && } kelappa{asPeriod && }
kelappa
{note}
); } Object.assign(window, { MarkDots, Pairing });