// 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 ( {/* three crowd dots inside */} ); } // 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 ( {live && ( )} ); } // 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 ( snap crew {live && ( )} ); } Object.assign(window, { MarkD1, MarkD2, MarkD3, MarkD4, MarkD5, MarkD6, MarkD7, MarkD8, MarkDHero, SnapCrewLogo, });