// Mark D · Speech Frame — refinement set.
// 8 variants explore tail position, aperture treatment, and fill vs. outline.
// All built with primitives (rect + circle + rotated rect).
// Shared chrome: a chat-tail (rotated square) that sits BEHIND the frame.
// `pos` = which corner / side the tail anchors to.
function Tail({ pos = 'br', fg = '#15151A', size = 16 }) {
// Position the tail center; rotation 45° makes it a diamond/chat tail.
const cfg = {
br: { x: 70, y: 70 },
bl: { x: 30, y: 70 },
tr: { x: 74, y: 24 },
tl: { x: 26, y: 24 },
}[pos];
return (
);
}
// D1 · Baseline — filled frame, tail BR, paper aperture with coral center
function MarkD1({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB' }) {
return (
);
}
// D2 · Crowd inside — aperture contains a small cluster (3 dots).
// Strongest concept: literally shows "the crowd inside the snap".
function MarkD2({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB' }) {
return (
);
}
// D3 · Outline — frame as outlined squircle, coral aperture
function MarkD3({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB' }) {
return (
);
}
// D4 · Bottom-left tail — mirrored, reads as "outgoing" message
function MarkD4({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB' }) {
return (
);
}
// D5 · Coral dot only — most reductive, scales smallest
function MarkD5({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB' }) {
return (
);
}
// D6 · Stacked frames — combines D + Frame Stack (two filled rects, slight offset)
function MarkD6({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB' }) {
return (
);
}
// D7 · Top-right tail (notification-style)
function MarkD7({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB' }) {
return (
);
}
// D8 · Live-pulse — coral dot offset top-right (like a notification badge)
// Center is a paper aperture, accent dot is OUTSIDE: live indicator.
function MarkD8({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB' }) {
return (
);
}
// HERO — chosen for the system. D2 (Crowd Inside) with refined proportions.
// All system pieces below should call this.
function MarkDHero({ size = 140, fg = '#15151A', accent = '#FF6A52', paper = '#F6F2EB', live = false }) {
return (
);
}
// SnapCrew — wordmark logo, using the official PNG asset. `size` is the
// rendered height in px; width auto-scales by the image's aspect ratio.
// `fg` controls coloring: dark text (default) stays black; pass a light
// color like T.paper to invert the PNG so it shows white on dark
// backgrounds. `live` adds a glowing accent dot to the right.
function SnapCrewLogo({ size = 32, fg = '#15151A', accent = '#FF6A52', live = false }) {
// Cheap brightness check on the red channel of the hex color: anything
// brighter than mid-gray (e.g. T.paper #F6F2EB) triggers PNG inversion.
const r = parseInt((fg.replace('#', '') + '00').slice(0, 2), 16);
const isLight = r >= 128;
return (
{live && (
)}
);
}
Object.assign(window, {
MarkD1, MarkD2, MarkD3, MarkD4, MarkD5, MarkD6, MarkD7, MarkD8,
MarkDHero, SnapCrewLogo,
});