import { hexToRgba } from '@toss/utils'; import { mapValues } from 'es-toolkit'; import { alphas } from './alphas'; /** * 브랜드 램프 SSOT. * * 정본 = Figma `lp-pri-brand-v2` 컬렉션(도메인=mode) → color-variables.json의 `brandByDomain` * (2026-07-29 전수 대조 — original/accent/alpha 전 스텝 일치, 무변경). 각 도메인은 * 16단계 `lp-pri-brand-original-100..1600` 램프를 가지며, * `lp-pri-brand-alpha-*`는 도메인 seed 색과 `alphas` 스텝으로 **생성**한다(구 `variation` 폐기). * * 시맨틱은 `var(--lp-pri-brand-*)`를 참조하고, `primitiveRoot.ts`가 도메인별 * `:root[data-service-domain="X"]` 블록으로 이 값을 덮어써 4개 브랜드가 cascade로 전파된다. */ export const SERVICE_DOMAINS = ['search', 'scholar', 'write', 'finance'] as const; export type ServiceDomain = (typeof SERVICE_DOMAINS)[number]; const BRAND_ORIGINAL_KEYS = [ 'lp-pri-brand-original-100', 'lp-pri-brand-original-200', 'lp-pri-brand-original-300', 'lp-pri-brand-original-400', 'lp-pri-brand-original-500', 'lp-pri-brand-original-600', 'lp-pri-brand-original-700', 'lp-pri-brand-original-800', 'lp-pri-brand-original-900', 'lp-pri-brand-original-1000', 'lp-pri-brand-original-1100', 'lp-pri-brand-original-1200', 'lp-pri-brand-original-1300', 'lp-pri-brand-original-1400', 'lp-pri-brand-original-1500', 'lp-pri-brand-original-1600', ] as const; export type BrandOriginalKey = (typeof BRAND_ORIGINAL_KEYS)[number]; export type BrandAlphaKey = `lp-pri-brand-alpha-${(typeof alphas)[number]}`; /** 브랜드 액센트 램프 스텝(5단계). 값은 `brandRampByDomain`의 각 도메인 블록에 함께 둔다. */ const BRAND_ACCENT_KEYS = [ 'lp-pri-brand-accent-100', 'lp-pri-brand-accent-300', 'lp-pri-brand-accent-600', 'lp-pri-brand-accent-900', 'lp-pri-brand-accent-1300', ] as const; export type BrandAccentKey = (typeof BRAND_ACCENT_KEYS)[number]; export type BrandRamp = Record; export const brandRampByDomain: Record = { search: { 'lp-pri-brand-original-100': '#e5f4e6', 'lp-pri-brand-original-200': '#c4e8c8', 'lp-pri-brand-original-300': '#a7dcaf', 'lp-pri-brand-original-400': '#88d092', 'lp-pri-brand-original-500': '#69c578', 'lp-pri-brand-original-600': '#55b766', 'lp-pri-brand-original-700': '#42a957', 'lp-pri-brand-original-800': '#349749', 'lp-pri-brand-original-900': '#2c783c', 'lp-pri-brand-original-1000': '#256a33', 'lp-pri-brand-original-1100': '#1d5829', 'lp-pri-brand-original-1200': '#164620', 'lp-pri-brand-original-1300': '#113718', 'lp-pri-brand-original-1400': '#0b2310', 'lp-pri-brand-original-1500': '#061409', 'lp-pri-brand-original-1600': '#020803', 'lp-pri-brand-accent-100': '#ffeccd', 'lp-pri-brand-accent-300': '#eec47d', 'lp-pri-brand-accent-600': '#b88f49', 'lp-pri-brand-accent-900': '#855f0e', 'lp-pri-brand-accent-1300': '#3b2700', }, scholar: { 'lp-pri-brand-original-100': '#f0f3e2', 'lp-pri-brand-original-200': '#e0e7ba', 'lp-pri-brand-original-300': '#d0db8e', 'lp-pri-brand-original-400': '#c6d269', 'lp-pri-brand-original-500': '#bbca44', 'lp-pri-brand-original-600': '#a8b52d', 'lp-pri-brand-original-700': '#8e9822', 'lp-pri-brand-original-800': '#767d1b', 'lp-pri-brand-original-900': '#616715', 'lp-pri-brand-original-1000': '#5c6314', 'lp-pri-brand-original-1100': '#4f5512', 'lp-pri-brand-original-1200': '#41470f', 'lp-pri-brand-original-1300': '#32370b', 'lp-pri-brand-original-1400': '#242708', 'lp-pri-brand-original-1500': '#151704', 'lp-pri-brand-original-1600': '#090901', 'lp-pri-brand-accent-100': '#ffe8e8', 'lp-pri-brand-accent-300': '#e5c1c1', 'lp-pri-brand-accent-600': '#af8d8e', 'lp-pri-brand-accent-900': '#7c5d5e', 'lp-pri-brand-accent-1300': '#3d2324', }, write: { 'lp-pri-brand-original-100': '#e4f2f8', 'lp-pri-brand-original-200': '#c0e3f6', 'lp-pri-brand-original-300': '#93d8f9', 'lp-pri-brand-original-400': '#6dccf7', 'lp-pri-brand-original-500': '#47bef4', 'lp-pri-brand-original-600': '#29b0e9', 'lp-pri-brand-original-700': '#0fa0db', 'lp-pri-brand-original-800': '#0a8bbb', 'lp-pri-brand-original-900': '#08759c', 'lp-pri-brand-original-1000': '#086890', 'lp-pri-brand-original-1100': '#0d5573', 'lp-pri-brand-original-1200': '#0e435b', 'lp-pri-brand-original-1300': '#0d3243', 'lp-pri-brand-original-1400': '#0a242e', 'lp-pri-brand-original-1500': '#05141c', 'lp-pri-brand-original-1600': '#02070c', 'lp-pri-brand-accent-100': '#f9f3a6', 'lp-pri-brand-accent-300': '#d5cf83', 'lp-pri-brand-accent-600': '#a09a4f', 'lp-pri-brand-accent-900': '#70691a', 'lp-pri-brand-accent-1300': '#302c00', }, finance: { 'lp-pri-brand-original-100': '#e7effb', 'lp-pri-brand-original-200': '#ccdcfc', 'lp-pri-brand-original-300': '#b2ccfb', 'lp-pri-brand-original-400': '#94b8f9', 'lp-pri-brand-original-500': '#76a4f8', 'lp-pri-brand-original-600': '#588ff6', 'lp-pri-brand-original-700': '#437cea', 'lp-pri-brand-original-800': '#356dd4', 'lp-pri-brand-original-900': '#2c5dbc', 'lp-pri-brand-original-1000': '#2b5098', 'lp-pri-brand-original-1100': '#25437b', 'lp-pri-brand-original-1200': '#1f3561', 'lp-pri-brand-original-1300': '#182a48', 'lp-pri-brand-original-1400': '#111c33', 'lp-pri-brand-original-1500': '#0a111e', 'lp-pri-brand-original-1600': '#04060c', 'lp-pri-brand-accent-100': '#d4f6fa', 'lp-pri-brand-accent-300': '#b1d2d6', 'lp-pri-brand-accent-600': '#7e9da1', 'lp-pri-brand-accent-900': '#4f6c70', 'lp-pri-brand-accent-1300': '#133034', }, }; /** * 도메인별 brand-alpha seed 색(rgba 베이스). brand-alpha는 seed × `alphas` 스텝으로 생성한다. */ const BRAND_ALPHA_SEED_BY_DOMAIN: Record = { search: '#30773f', scholar: '#666d0f', write: '#127092', finance: '#4465a4', }; /** * 서비스 도메인별 brand primitive override 블록의 원본. * original 램프 + (seed에서 생성한) brand-alpha 를 함께 흘려보낸다. */ export const domainPrimitiveOverrides = mapValues(brandRampByDomain, (ramp, domain) => { const overrides: Record = { ...ramp }; const seed = BRAND_ALPHA_SEED_BY_DOMAIN[domain as ServiceDomain]; alphas.forEach((alpha) => { overrides[`lp-pri-brand-alpha-${alpha}`] = hexToRgba(seed.slice(1), alpha / 100); }); return overrides; }) as Record>;