const freeze = (value) => Object.freeze(value); function recipe(id, family, pageGoal, visualEvidence, cameraLanguage, relation, composition, safeZone) { return freeze({ id, family, page_goal: pageGoal, visual_evidence: visualEvidence, camera_language: cameraLanguage, relation, composition, safe_zone: safeZone }); } export const REFERENCE_FIRST_PAGE_TEMPLATES = freeze({ white_complete: recipe( "white_complete", "white_background", "建立商品基准识别", "完整商品外形、准确颜色、Logo与包装原有识别元素清晰可见", "接近平视的正面或轻微三分之四观察,全景,透视克制", "商品自然稳定地落在支撑面,无遮挡、无人物、无道具", "纯白背景,商品居中,主体约占画面合理范围,四周保留均衡呼吸空间", "不规划营销文字;只保留商品自身原有文字" ), selling_form: recipe( "selling_form", "selling_point", "证明完整形态、轮廓或结构优势", "用一张画面同时看清商品整体和最具识别力的可见结构", "三分之四全景或中近景,结构方向清晰,避免与白底正面机位重复", "商品保持自然承载,辅助道具只解释结构或功能关系", "主体偏一侧,另一侧形成低细节信息区;前中后景服务结构层次", "在不遮挡轮廓、Logo和关键结构的一侧预留中等标题区" ), selling_material: recipe( "selling_material", "selling_point", "证明材质、工艺、表面或关键局部", "整体识别锚点与一个真实可见局部同时出现,局部纹理不改变原材质", "微距或近景,侧向柔光呈现纹理和光泽;保留足够整体轮廓用于身份识别", "商品不变形,不用特效伪造纹理;布光变化不能表现为另一种材质", "局部细节为主视觉中心,整体商品作为次级锚点,背景低干扰", "在纹理主视觉相反方向预留短标题和一句证据短句区域" ), selling_operation: recipe( "selling_operation", "selling_point", "证明关键操作、接口或功能关系", "可见操作区域、接口、开合或使用触点与完整商品关系明确", "中近景,观察轴正对操作关系,避免为了戏剧性遮挡关键部位", "允许局部手部示范,但手不能覆盖关键结构和品牌识别", "动作路径清晰,一页只说明一个操作结论", "在动作路径之外预留结构化信息区" ), selling_brand: recipe( "selling_brand", "selling_point", "强化包装视觉与品牌识别", "商品自身真实 Logo、品牌标识、配色和包装原字保持可读且一致", "正面或轻微侧向中近景,光线均匀,避免反光破坏原字", "不新增假包装、赠品或包装清单", "品牌识别区域清晰,商品仍是唯一主角", "远离包装原字预留后置短标题区域" ), scene_core_environment: recipe( "scene_core_environment", "usage_scene", "展示商品最自然的核心使用空间", "商品、承载面和环境关系符合参考设定所表达的使用方式", "环境中景或中近景,空间层次完整,机位与卖点页明显不同", "商品稳定处于自然位置,道具数量受控且与使用直接相关", "建立明确前中后景,商品位于视觉焦点,环境不抢主体", "在低细节墙面、天空、地面或侧边空间预留中等信息区" ), scene_human_interaction: recipe( "scene_human_interaction", "usage_scene", "展示人物与商品的真实使用关系", "人物动作、接触部位、商品姿态和使用结果在单帧内可理解", "动作中景或局部身体近景,快门感自然,避免摆拍僵硬", "人物只服务商品使用,手部或身体不能不合理穿透、覆盖或扭曲商品", "动作线与商品形成视觉关系,人物脸部不是画面唯一中心", "避开人脸、手部和商品互动区域预留短标题区" ), scene_lifestyle: recipe( "scene_lifestyle", "usage_scene", "建立与商品匹配的日常生活方式", "环境材质、道具和光线支持商品调性,但不引入无关叙事", "较宽环境镜头,允许浅景深,商品仍清晰可识别", "商品处于正在被使用或随时可使用的自然状态", "氛围层次丰富但只有一个商品视觉中心", "利用自然负空间预留低到中等密度文案区" ), scene_mobile_outdoor: recipe( "scene_mobile_outdoor", "usage_scene", "解释商品在移动或户外状态中的使用", "携带、穿戴、手持或环境承载关系完整可信", "动态三分之四或跟随视角,地平线水平,商品不因动势而变形", "人物动作符合重力、人体和商品使用逻辑", "环境动势与商品方向协调,商品颜色和材质不受滤镜改变", "在运动方向前方或背景低细节区预留短文案" ), scene_installed: recipe( "scene_installed", "usage_scene", "展示安装、摆放或环境融合关系", "商品与墙面、桌面、地面、设备或空间的连接方式清楚", "平视或轻俯视中景,空间基准线稳定", "安装/摆放遵循参考设定,不虚构无法支持的内部结构", "商品与环境边界清晰,参照物用于解释位置和尺度", "在连接关系之外预留结构化说明区" ), decision_scale_fit: recipe( "decision_scale_fit", "purchase_decision", "帮助判断尺度、体积、穿戴或空间适配", "通过真实人物、手部、常见参照物或空间比例表达相对尺度,不生成具体数字", "接近平视的中景或全景,透视克制,参照关系可比较", "参照物不能遮挡商品关键轮廓,人物姿态自然", "商品和参照物形成明确比例组,避免装饰性杂物", "预留适合后置尺度说明的规则信息区" ), decision_usage_threshold: recipe( "decision_usage_threshold", "purchase_decision", "回答操作门槛或典型使用障碍", "一个清晰的使用前后关系、操作触点或空间门槛视觉结论", "正对关系的中近景,不使用复杂多格拼图", "动作、商品和环境形成单一因果关系,不虚构性能结果", "主次层级清晰,避免一页同时解释多个问题", "预留标题加两行以内说明区域" ), decision_context_match: recipe( "decision_context_match", "purchase_decision", "帮助判断商品与目标环境或使用方式是否匹配", "同时呈现完整商品和一个关键环境关系,避免无依据兼容性声明", "稳定三分之四中景,环境基准清晰", "商品自然处于目标环境,关系来自创意简报的可支持线索", "商品与目标空间形成清楚边界和视觉对比", "在环境负空间预留结构化判断信息区" ), decision_value_summary: recipe( "decision_value_summary", "purchase_decision", "以完整商品和核心价值完成详情页收束", "完整商品、核心识别元素和前页视觉语言在一张单图中形成统一结论", "稳定完整视角,避免复制白底图;通过场景光线或构图完成收束", "不虚构附件、赠品、包装清单或参数", "主体层级明确、画面完整、结尾感强,保留一个清晰信息区", "预留适合后置主标题与简短行动提示的区域" ), }); export const DEFAULT_PAGE_TEMPLATE_IDS = freeze([ "white_complete", "selling_form", "selling_material", "scene_core_environment", "scene_human_interaction", "decision_scale_fit", "decision_value_summary", ]); export function pageTemplate(id) { const value = REFERENCE_FIRST_PAGE_TEMPLATES[String(id || "")]; if (!value) throw new Error(`REFERENCE_FIRST_PAGE_TEMPLATE_UNKNOWN:${String(id)}`); return value; } export function templatesForFamily(family) { return Object.values(REFERENCE_FIRST_PAGE_TEMPLATES).filter((value) => value.family === family); } export function pageTemplatePrompt(template) { if (!template?.id) throw new Error("REFERENCE_FIRST_PAGE_TEMPLATE_REQUIRED"); return [ `页面定位:${template.family};页面配方:${template.id}。`, `页面任务:${template.page_goal}。`, `必须形成的视觉证据:${template.visual_evidence}。`, `摄影语言:${template.camera_language}。`, `商品、人物与环境关系:${template.relation}。`, `构图要求:${template.composition}。`, `后置文字预留:${template.safe_zone}。该区域只是生成构图目标,不是已经验证的叠字安全区。`, ].join("\n"); }