import { LEVEL_THEMES, PIGMENTS, contrast, themeWithColors } from './design-tokens.js'; const makePigments=(colors,labels)=>colors.map((color,i)=>({name:labels?.[i]||PIGMENTS[i].name,color,arrow:contrast('#FFFFFF',color)>=4.5?'#FFFFFF':'#172D39'})); const names=['轻松','进阶','烧脑','挑战','每周挑战']; const themes=(backgrounds,titles,materials,palettes,descriptions)=>backgrounds.map((background,i)=>({ ...LEVEL_THEMES[i],name:titles[i],background,ink:contrast('#12202A',background)>=4.5?'#12202A':'#FFFFFF', description:descriptions?.[i]||`${names[i]}主题 · ${titles[i]}。`,materials:Array.isArray(materials)?materials[i]:materials, palette:palettes?.[i]||LEVEL_THEMES[i].palette, })); export const ART_DIRECTIONS=Object.freeze([ {id:'calm',code:'01',name:'柔和原色',en:'QUIET TRAILS',tag:'现有方案',style:'classic',accent:'#6652B8',paper:'#F7F6F2', description:'低饱和环境与平面六角棋子,让注意力留在轨道和方向。', principles:['哑光色块,克制装饰','蓝灰细轨道,保持视觉留白','金色奖励,柔和浮现'], themes:LEVEL_THEMES,pigments:PIGMENTS}, {id:'vivid',code:'02',name:'高彩游乐场',en:'CHROMA CLUB',tag:'高饱和',style:'vivid',accent:'#4A24E8',paper:'#FFFCF0', description:'鲜明撞色、粗线条与贴纸式棋子。像一张能玩的彩色海报,明快、有力量。', principles:['高纯度主色,深色轮廓统一画面','轨道像印刷线,棋子像立起的贴纸','方圆按钮与错位硬阴影'], themes:themes( ['#B8F34A','#FF771B','#3E42EE','#FF3588','#1B104D'], ['青柠派对','爆橙热浪','钴蓝电场','荧粉冲刺','黑光嘉年华'], [ {board:'#FFFBE7',boardGrid:'#AB9C82',track:'#30264C',trackHalo:'#FFFBE7'}, {board:'#FFEF45',boardGrid:'#B78335',track:'#462654',trackHalo:'#FFEF45'}, {board:'#C9F849',boardGrid:'#789344',track:'#252269',trackHalo:'#C9F849'}, {board:'#FFF4CE',boardGrid:'#C491A1',track:'#502369',trackHalo:'#FFF4CE'}, {board:'#35225D',boardGrid:'#837B9F',track:'#D9FF55',trackHalo:'#35225D'}, ], [[0,4,2,1,3,5,6],[7,3,10,8,2,0,11],[2,9,1,10,6,5,8],[0,6,10,2,7,4,9],[10,2,6,1,9,11,5]], ['保留青柠大色块,深色轮廓与蓝、青、黄色贴纸。','爆橙背景与亮黄棋盘,钴蓝、红紫和电青正面撞色。','纯钴蓝包围荧光青柠棋盘,用暖橙与亮粉制造冷暖冲撞。','荧光粉舞台,明黄与蓝绿棋子形成强烈互补。','深紫黑底配荧光绿轨道,电青、柠黄与荧粉像黑光贴纸。']), pigments:makePigments(['#2455E8','#E52879','#FFE13E','#7136D8','#007C70','#FF622C','#BBE929','#074DFF','#EB174E','#FF9500','#08E8E1','#A92BFF'],['电蓝','热粉','柠檬黄','电紫','深青','火橙','荧光绿','钴蓝','警示红','亮橘','电光青','激光紫'])}, {id:'toy',code:'03',name:'积木轨道屋',en:'LITTLE PLAYWORKS',tag:'玩具质感',style:'toy',accent:'#245EAF',paper:'#FFFAEE', description:'圆润积木、原色塑胶与压下去有回弹的按钮。棋子像可以拿在手里的小零件。', principles:['同色深浅叠层,形成柔软厚度','红黄蓝绿积木配木色底板','圆角控件、凸起边缘与轻微高光'], themes:themes( ['#F4C548','#56AFE0','#EA743E','#439A73','#244584'], ['积木黄盒','蓝色装配台','橘红工坊','绿毯小城','太空玩具柜'], [ {board:'#FFF7DE',boardGrid:'#B5A184',track:'#765238',trackHalo:'#FFF7DE'}, {board:'#F5DFB6',boardGrid:'#B09C7C',track:'#386A8D',trackHalo:'#F5DFB6'}, {board:'#FFEFCB',boardGrid:'#BBA27B',track:'#695037',trackHalo:'#FFEFCB'}, {board:'#F2D6A6',boardGrid:'#AC987A',track:'#476556',trackHalo:'#F2D6A6'}, {board:'#D4E4E6',boardGrid:'#8DA4B2',track:'#35516F',trackHalo:'#D4E4E6'}, ], [[0,2,3,5,4,8,10],[1,0,4,3,9,6,11],[2,3,1,7,10,5,8],[0,1,2,4,6,9,11],[1,4,0,6,10,3,8]], ['经典红黄蓝积木,放在暖黄玩具盒里;用奶油底板隔开主色。','亮蓝工作台配原木色插板,红黄橙零件像一套拼装工具。','橘红桌面与木糖底板,绿蓝零件形成互补。','绿色游戏垫与木色道路,红黄积木像散落的小房子。','太空蓝收藏柜配浅灰塑胶板,黄橙零件像小飞船。']), pigments:makePigments(['#DF4033','#F2C52E','#2478C5','#32945C','#EF862D','#7652B2','#EFE4C4','#227B87','#B63845','#745B40','#73BFDC','#A7BA56'],['积木红','积木黄','积木蓝','积木绿','零件橙','拼装紫','奶油白','工具青','砖红','木棕','玻璃蓝','草绿'])}, {id:'animals',code:'04',name:'动物弯弯镇',en:'PAW PARADE',tag:'卡通动物',style:'animals',accent:'#396D51',paper:'#FFFCF1', description:'猫咪、小熊、兔子与青蛙沿轨道出游。用表情与耳朵增加性格,方向箭头独立保留。', principles:['圆脸、短耳与小表情,外形保持在六角范围内','箭头留在脸部下方,不靠动物朝向猜方向','草地、木棕与奶油毛色,搭配森林小径'], themes:themes( ['#A9CD69','#E7B947','#72BEB2','#C67B47','#183F36'], ['青草野餐','橡果秋游','溪边捉迷藏','红土探险','萤火森林'], [ {board:'#FFF2D2',boardGrid:'#A9AC80',track:'#527345',trackHalo:'#FFF2D2'}, {board:'#FFEDB5',boardGrid:'#B6A076',track:'#79572E',trackHalo:'#FFEDB5'}, {board:'#ECF1D8',boardGrid:'#9CA987',track:'#3B7262',trackHalo:'#ECF1D8'}, {board:'#F6DCB2',boardGrid:'#B19169',track:'#684835',trackHalo:'#F6DCB2'}, {board:'#355C43',boardGrid:'#879969',track:'#E6E9AE',trackHalo:'#355C43'}, ], [[0,1,2,3,6,7,10],[1,4,8,5,2,6,11],[7,3,6,10,0,4,9],[8,5,4,2,7,10,1],[6,10,2,4,11,0,9]], ['草地绿、奶油白与动物毛色,不使用糖果蓝紫。','秋叶黄配橡果棕、麦芽金和浅奶油,像一次林间秋游。','溪水青配苔绿与暖棕,保留自然界的冷暖关系。','红土与沙色小径,棕熊、奶油兔和绿蛙像野外探险队。','深森林绿配萤火浅黄,浅毛色角色从夜色中浮现。']), pigments:makePigments(['#D9934F','#A4683B','#E1C58B','#6C9D40','#F1B869','#73503F','#F1DCC1','#448A67','#B78157','#BD784F','#F4E5CF','#87B76B'],['姜黄猫','栗棕熊','麦芽兔','苔绿蛙','奶橘猫','可可熊','奶油兔','溪绿蛙','榛果猫','赤陶熊','雪白兔','嫩叶蛙'])}, {id:'paper',code:'05',name:'轻线纸境',en:'PAPER ROUTES',tag:'实验页衍生',style:'paper',accent:'#294D60',paper:'#F7F9F8', description:'提取自玩法变种实验页:暖白纸面、轻盈细轨道、白边纯色六角与细线箭头。把颜色留给棋子,让弯路轻轻浮现。', principles:['浅蓝灰细线与微小格缝,延续实验页的轻盈感','正六角纯色棋子、细白边、圆头线条箭头','无投影与渐变;陶橙和雾蓝是核心配色'], source:{label:'玩法变种实验页',href:'labs/variants/index.html'}, themes:themes( ['#EAF0F3','#F3EEE5','#E8EFEB','#E7EBEE','#253B4A'], ['雾蓝信纸','暖砂手札','鼠尾草页','石墨练习','夜航图纸'], [ {board:'#FAFBF7',boardGrid:'#D3DFE3',track:'#B2C4CE',trackHalo:'#FAFBF7'}, {board:'#FFFCF5',boardGrid:'#E3DCD0',track:'#C4B8A4',trackHalo:'#FFFCF5'}, {board:'#FAFCF8',boardGrid:'#D3DFD7',track:'#ADBCB2',trackHalo:'#FAFCF8'}, {board:'#F8FAFB',boardGrid:'#D1DBE1',track:'#A5B6C1',trackHalo:'#F8FAFB'}, {board:'#304A59',boardGrid:'#435E6C',track:'#849FAE',trackHalo:'#304A59'}, ], [[0,1,2,3,4,5,7],[0,1,3,6,8,9,4],[1,2,3,5,9,10,0],[0,1,4,6,7,10,11],[0,2,3,4,5,8,10]], ['保留实验页的雾蓝背景、暖白格面与陶橙/雾蓝棋子,扩展色同样保持哑光。','像暖砂色纸上的铅笔路线,陶橙、赭金与木棕带来温度。','浅鼠尾草纸底,灰绿轨道与蓝、苔绿棋子形成安静的冷暖关系。','灰白图纸与石墨蓝细线,用陶红、雾紫和钢蓝组织复杂路线。','深蓝灰图纸上保留细线与白箭头,暖色棋子像夜航中的小标记。']), pigments:makePigments(['#D66C4D','#477FC0','#668877','#B58943','#8B7297','#45868C','#B76260','#607B90','#B28168','#46765F','#6B8AAB','#9C7284'],['陶橙','雾蓝','鼠尾草','赭金','雾紫','湖青','陶红','钢蓝','暖木','松绿','烟蓝','藕灰']).map(p=>({...p,arrow:'#FFFFFF'}))}, ]); export function artDirection(id){return ART_DIRECTIONS.find(d=>d.id===id)||ART_DIRECTIONS[0];} export function directionTheme(direction,themeId,count=7){ const source=direction.themes.find(t=>t.id===themeId)||direction.themes[0]; return {...themeWithColors(source,count),artStyle:direction.style,pigments:direction.pigments}; } export function appearanceTile(tile,theme){ const color=theme?.pigments?.[tile.color]; return {...tile,artStyle:theme?.artStyle,fill:color?.color,arrow:color?.arrow}; }