@growthub/primitives
Version:
Stateless utility functions and primitives for the Growthub Marketing OS
1 lines • 6.24 kB
Source Map (JSON)
{"version":3,"sources":["../src/brand.ts"],"sourcesContent":["/**\n * Brand utilities for the Growthub Marketing OS\n */\n\n/**\n * Extract colors from a hex color string\n */\nexport function parseHexColor(hex: string): { r: number; g: number; b: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n}\n\n/**\n * Convert RGB to HSL\n */\nexport function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n\n return { h: h * 360, s: s * 100, l: l * 100 };\n}\n\n/**\n * Generate a color palette from a base color\n */\nexport function generateColorPalette(baseColor: string, count = 5): string[] {\n const rgb = parseHexColor(baseColor);\n if (!rgb) return [baseColor];\n\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n const palette: string[] = [];\n\n for (let i = 0; i < count; i++) {\n const lightness = Math.max(10, Math.min(90, hsl.l + (i - Math.floor(count / 2)) * 20));\n const newHsl = { ...hsl, l: lightness };\n palette.push(hslToHex(newHsl.h, newHsl.s, newHsl.l));\n }\n\n return palette;\n}\n\n/**\n * Convert HSL to hex\n */\nfunction hslToHex(h: number, s: number, l: number): string {\n h /= 360;\n s /= 100;\n l /= 100;\n\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1/6) return p + (q - p) * 6 * t;\n if (t < 1/2) return q;\n if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n const r = Math.round(hue2rgb(p, q, h + 1/3) * 255);\n const g = Math.round(hue2rgb(p, q, h) * 255);\n const b = Math.round(hue2rgb(p, q, h - 1/3) * 255);\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n/**\n * Brand voice tone analyzer\n */\nexport function analyzeBrandVoice(text: string): {\n tone: 'professional' | 'casual' | 'friendly' | 'authoritative' | 'playful' | 'luxurious';\n confidence: number;\n} {\n const patterns = {\n professional: /\\b(solution|expertise|quality|professional|business|enterprise)\\b/gi,\n casual: /\\b(hey|cool|awesome|great|nice|fun)\\b/gi,\n friendly: /\\b(welcome|hello|thanks|please|happy|enjoy)\\b/gi,\n authoritative: /\\b(proven|leader|best|expert|trusted|reliable)\\b/gi,\n playful: /\\b(amazing|fantastic|exciting|fun|creative|innovative)\\b/gi,\n luxurious: /\\b(premium|exclusive|elegant|sophisticated|luxury|finest)\\b/gi,\n };\n\n let maxScore = 0;\n let dominantTone: keyof typeof patterns = 'professional';\n\n Object.entries(patterns).forEach(([tone, pattern]) => {\n const matches = text.match(pattern);\n const score = matches ? matches.length : 0;\n \n if (score > maxScore) {\n maxScore = score;\n dominantTone = tone as keyof typeof patterns;\n }\n });\n\n const totalWords = text.split(/\\s+/).length;\n const confidence = Math.min(1, maxScore / Math.max(1, totalWords * 0.1));\n\n return {\n tone: dominantTone,\n confidence\n };\n} "],"mappings":"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","names":["p","q"]}