# -*- coding: utf-8 -*-
from pathlib import Path
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER
from reportlab.lib.utils import ImageReader

ROOT = Path('/Users/bot1/Volumes/root_for_ai/AI工作区/良渚_商业手册_品牌合作PDF_20260602_1526')
OUT = ROOT / 'deliverables/良渚文化品牌合作手册_A4_20260602.pdf'
ASSETS = ROOT / 'assets'
OUT.parent.mkdir(parents=True, exist_ok=True)

pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
FONT = 'STSong-Light'
W, H = A4

# Palette inspired by Liangzhu jade, bone white, cong yellow and restrained cinnabar.
JADE_DARK = colors.HexColor('#143B34')
JADE = colors.HexColor('#2C6658')
JADE_MID = colors.HexColor('#6EA18D')
JADE_LIGHT = colors.HexColor('#EAF3EB')
BONE = colors.HexColor('#FFFDF3')
BONE_2 = colors.HexColor('#F6F4E8')
GOLD = colors.HexColor('#C79B3C')
GOLD_LIGHT = colors.HexColor('#EACB79')
INK = colors.HexColor('#183B34')
MUTED = colors.HexColor('#65766D')
RED = colors.HexColor('#A75242')

styles = {
    'kicker': ParagraphStyle('kicker', fontName=FONT, fontSize=8.7, leading=11, textColor=GOLD, alignment=TA_LEFT, wordWrap='CJK'),
    'title': ParagraphStyle('title', fontName=FONT, fontSize=34, leading=39, textColor=INK, wordWrap='CJK'),
    'title_dark': ParagraphStyle('title_dark', fontName=FONT, fontSize=34, leading=39, textColor=BONE, wordWrap='CJK'),
    'h2': ParagraphStyle('h2', fontName=FONT, fontSize=22, leading=27, textColor=INK, wordWrap='CJK'),
    'h2_dark': ParagraphStyle('h2_dark', fontName=FONT, fontSize=22, leading=27, textColor=BONE, wordWrap='CJK'),
    'h3': ParagraphStyle('h3', fontName=FONT, fontSize=13.8, leading=18, textColor=INK, wordWrap='CJK'),
    'h3_dark': ParagraphStyle('h3_dark', fontName=FONT, fontSize=13.8, leading=18, textColor=BONE, wordWrap='CJK'),
    'lead': ParagraphStyle('lead', fontName=FONT, fontSize=14.2, leading=19, textColor=INK, wordWrap='CJK'),
    'lead_dark': ParagraphStyle('lead_dark', fontName=FONT, fontSize=14.2, leading=19, textColor=colors.HexColor('#FFF2C8'), wordWrap='CJK'),
    'body': ParagraphStyle('body', fontName=FONT, fontSize=9.8, leading=14.2, textColor=colors.HexColor('#41584F'), wordWrap='CJK'),
    'body_dark': ParagraphStyle('body_dark', fontName=FONT, fontSize=9.8, leading=14.2, textColor=colors.HexColor('#E8EFE6'), wordWrap='CJK'),
    'small': ParagraphStyle('small', fontName=FONT, fontSize=8.2, leading=11.5, textColor=MUTED, wordWrap='CJK'),
    'small_dark': ParagraphStyle('small_dark', fontName=FONT, fontSize=8.2, leading=11.5, textColor=colors.HexColor('#D8DFD7'), wordWrap='CJK'),
}

def P(text, style='body'):
    return Paragraph(text.replace('\n','<br/>'), styles[style])

def draw_para(c, text, x, y_top, w, h, style='body'):
    p = P(text, style)
    pw, ph = p.wrap(w, h)
    p.drawOn(c, x, y_top - ph)
    return ph

def bg(c, mode='light'):
    if mode == 'dark':
        c.setFillColor(JADE_DARK); c.rect(0,0,W,H,stroke=0,fill=1)
        c.setFillColor(colors.Color(0.18,0.42,0.36,1)); c.circle(W*0.78,H*0.82,60*mm,stroke=0,fill=1)
        c.setFillColor(colors.Color(0.82,0.64,0.28,1)); c.circle(W*1.03,H*0.08,72*mm,stroke=0,fill=1)
        c.setFillColor(colors.Color(0.85,1,0.92,0.10)); c.circle(W*0.1,H*0.12,52*mm,stroke=0,fill=1)
    elif mode == 'split':
        c.setFillColor(BONE); c.rect(0,0,W*0.58,H,stroke=0,fill=1)
        c.setFillColor(JADE_LIGHT); c.rect(W*0.58,0,W*0.42,H,stroke=0,fill=1)
        c.setFillColor(colors.Color(0.78,0.86,0.80,0.45)); c.circle(W*0.94,H*0.78,58*mm,stroke=0,fill=1)
    else:
        c.setFillColor(BONE); c.rect(0,0,W,H,stroke=0,fill=1)
        c.setFillColor(JADE_LIGHT); c.circle(W*0.08,H*0.08,65*mm,stroke=0,fill=1)
        c.setFillColor(colors.Color(0.88,0.77,0.48,0.20)); c.circle(W*0.94,H*0.90,58*mm,stroke=0,fill=1)

def footer(c, page, dark=False):
    c.setStrokeColor(colors.Color(1,1,1,0.22) if dark else colors.Color(0.1,0.23,0.2,0.16))
    c.setLineWidth(0.35)
    c.line(17*mm, 15*mm, W-17*mm, 15*mm)
    c.setFont(FONT, 7.5)
    c.setFillColor(colors.Color(1,1,1,0.45) if dark else colors.Color(0.1,0.23,0.2,0.42))
    c.drawRightString(W-17*mm, 9.5*mm, f'{page:02d}')

def label(c, text, x, y_top, dark=False):
    return draw_para(c, text, x, y_top, 170*mm, 8*mm, 'kicker')

def title(c, text, x, y_top, dark=False, small=False):
    sty = 'title_dark' if dark else 'title'
    if small:
        sty = 'h2_dark' if dark else 'h2'
    return draw_para(c, text, x, y_top, 166*mm, 45*mm, sty)

def card(c, x, y_top, w, h, title_txt, body_txt, kicker=None, dark=False):
    y = y_top - h
    if dark:
        c.setFillColor(colors.Color(1,1,1,0.085)); c.setStrokeColor(colors.Color(1,1,1,0.18))
    else:
        c.setFillColor(colors.Color(1,1,1,0.78)); c.setStrokeColor(colors.Color(0.13,0.33,0.28,0.12))
    c.roundRect(x, y, w, h, 6*mm, stroke=1, fill=1)
    pad = 4.4*mm
    cur = y_top - pad
    if kicker:
        draw_para(c, kicker, x+pad, cur, w-2*pad, 8*mm, 'kicker')
        cur -= 8*mm
    draw_para(c, title_txt, x+pad, cur, w-2*pad, 18*mm, 'lead_dark' if dark else 'lead')
    cur -= 18*mm
    draw_para(c, body_txt, x+pad, cur, w-2*pad, h-30*mm, 'body_dark' if dark else 'body')

def note(c, x, y_top, w, h, text, dark=False):
    y = y_top - h
    c.setFillColor(colors.Color(0.79,0.61,0.23,0.16) if not dark else colors.Color(1,0.9,0.5,0.12))
    c.setStrokeColor(GOLD)
    c.roundRect(x, y, w, h, 4*mm, stroke=0, fill=1)
    c.setFillColor(GOLD); c.rect(x, y, 2.1*mm, h, stroke=0, fill=1)
    draw_para(c, text, x+5*mm, y_top-3.8*mm, w-8*mm, h-7*mm, 'body_dark' if dark else 'body')

def tags(c, x, y, items, dark=False):
    c.setFont(FONT, 8.4)
    xx = x
    yy = y
    for it in items:
        tw = c.stringWidth(it, FONT, 8.4) + 8*mm
        if xx + tw > W - 18*mm:
            xx = x; yy -= 8*mm
        c.setFillColor(colors.Color(0.91,0.76,0.35,0.16) if not dark else colors.Color(0.91,0.76,0.35,0.18))
        c.roundRect(xx, yy, tw, 5.7*mm, 2.85*mm, stroke=0, fill=1)
        c.setFillColor(GOLD_LIGHT if dark else colors.HexColor('#7A5B1D'))
        c.drawCentredString(xx+tw/2, yy+1.65*mm, it)
        xx += tw + 2.3*mm

def draw_table(c, data, x, y_top, col_widths, row_h=None, fontsize=8.5):
    # Convert strings to Paragraphs.
    pdata = [[P(str(cell), 'body') for cell in row] for row in data]
    t = Table(pdata, colWidths=col_widths, repeatRows=1)
    t.setStyle(TableStyle([
        ('FONTNAME',(0,0),(-1,-1),FONT),
        ('FONTSIZE',(0,0),(-1,-1),fontsize),
        ('BACKGROUND',(0,0),(-1,0),colors.Color(0.79,0.61,0.23,0.16)),
        ('TEXTCOLOR',(0,0),(-1,0),colors.HexColor('#76571A')),
        ('GRID',(0,0),(-1,-1),0.25,colors.Color(0.13,0.33,0.28,0.13)),
        ('VALIGN',(0,0),(-1,-1),'TOP'),
        ('LEFTPADDING',(0,0),(-1,-1),5),('RIGHTPADDING',(0,0),(-1,-1),5),
        ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),
        ('BACKGROUND',(0,1),(-1,-1),colors.Color(1,1,1,0.72)),
    ]))
    tw, th = t.wrap(sum(col_widths), H)
    t.drawOn(c, x, y_top - th)
    return th

def image(c, filename, x, y_top, w, h, caption=None):
    p = ASSETS / filename
    y = y_top - h
    c.setFillColor(colors.HexColor('#DDEBE2'))
    c.roundRect(x,y,w,h,5*mm,stroke=0,fill=1)
    if p.exists():
        img = ImageReader(str(p))
        iw, ih = img.getSize()
        # cover crop by drawing full image scaled to fill and clipped is hard; approximate contain-fill with center crop unavailable.
        scale = max(w/iw, h/ih)
        dw, dh = iw*scale, ih*scale
        c.saveState()
        path = c.beginPath(); path.roundRect(x,y,w,h,5*mm)
        c.clipPath(path, stroke=0, fill=0)
        c.drawImage(img, x+(w-dw)/2, y+(h-dh)/2, width=dw, height=dh)
        c.restoreState()
    if caption:
        c.setFillColor(colors.Color(0,0,0,0.35)); c.rect(x,y,w,8*mm,stroke=0,fill=1)
        c.setFont(FONT,7); c.setFillColor(colors.white); c.drawString(x+3*mm,y+2.5*mm,caption)

def cover(c):
    bg(c,'dark')
    label(c,'LIANGZHU CULTURE · BRAND COLLABORATION MANUAL',17*mm,H-23*mm,True)
    title(c,'良渚文化\n品牌合作手册',17*mm,H-54*mm,True)
    c.setStrokeColor(GOLD_LIGHT); c.setLineWidth(1.2); c.line(17*mm,H-91*mm,80*mm,H-91*mm)
    draw_para(c,'把五千年文明源头、世界遗产场域、玉礼美学与当代消费场景连接起来，为品牌提供可被产品化、内容化、空间化与渠道化的文化合作资产。',17*mm,H-101*mm,150*mm,34*mm,'body_dark')
    tags(c,17*mm,H-135*mm,['世界遗产','实证中华五千多年文明史','玉礼文明','良渚色彩与纹样','品牌授权 / 联合开发 / 跨界联名'],True)
    c.setFont(FONT,92); c.setFillColor(colors.Color(1,1,1,0.07)); c.drawRightString(W-8*mm,H-38*mm,'良渚')
    c.setFont(FONT,8.4); c.setFillColor(colors.Color(1,1,1,0.62))
    c.drawString(17*mm,20*mm,'A4 PDF · 品牌沟通版｜具体授权、权益、费用及露出以双方正式合同与官方审核确认为准')
    footer(c,1,True)

c = canvas.Canvas(str(OUT), pagesize=A4)

# 01 cover
cover(c); c.showPage()

# 02 Quick View
bg(c,'light'); label(c,'00 · QUICK VIEW',17*mm,H-23*mm); title(c,'品牌方 30 秒看懂：为什么良渚值得合作',17*mm,H-38*mm,small=True)
card(c,17*mm,H-66*mm,84*mm,46*mm,'文化高度足够高','良渚古城遗址成功列入《世界遗产名录》，为中华五千多年文明史提供独特见证，具备品牌向上叙事所需的权威文化底座。','价值 01')
card(c,109*mm,H-66*mm,84*mm,46*mm,'视觉资产足够清晰','玉琮、玉璧、玉钺、神徽、精细阴刻工艺、治水与稻作文明、良渚色彩与纹样基因，可稳定转译为包装、产品、空间与传播视觉。','价值 02')
card(c,17*mm,H-118*mm,84*mm,46*mm,'商业验证已经存在','资料显示，良渚文创已覆盖日用家居、贵金属等 11 大品类，在线产品约 800 余款，并有红点设计奖、“中国礼物”金奖等荣誉。','价值 03')
card(c,109*mm,H-118*mm,84*mm,46*mm,'合作形式足够灵活','从单项 IP 授权、联合开发、跨界联名，到论坛、活动、空间、渠道的组合表达，可按品牌目标设计不同深度的合作方案。','价值 04')
note(c,17*mm,H-183*mm,176*mm,31*mm,'<b>品牌沟通重点：</b>不是简单贴标或国潮装饰，而是把“文明源头、玉礼审美、世界遗产场域”转化为品牌可讲、消费者可感知、渠道可售卖的文化资产。')
footer(c,2); c.showPage()

# 03 Foundation
bg(c,'split'); label(c,'01 · CULTURAL FOUNDATION',17*mm,H-23*mm); title(c,'认识良渚：五千多年文明史的实证坐标',17*mm,H-38*mm,small=True)
card(c,17*mm,H-70*mm,108*mm,48*mm,'良渚文化，是品牌进入东方文明叙事的高位入口。','良渚文化是新石器时代晚期中国长江下游环太湖流域的重要考古学文化，距今约 5300—4300 年。作为良渚文化的权力与信仰中心，良渚古城遗址于 2019 年列入《世界遗产名录》，被誉为“实证中华五千年文明史的圣地”。')
card(c,17*mm,H-124*mm,52*mm,49*mm,'良渚博物院','集收藏、研究、展示和宣传良渚文化功能于一体，展出玉器、石器、陶器、漆木器等珍贵文物 600 多件（组）。','空间 01')
card(c,73*mm,H-124*mm,52*mm,49*mm,'良渚古城遗址公园','体验“中华五千多年文明”的重要场所，呈现城址、宫殿、王陵、水利等遗产格局。','空间 02')
card(c,17*mm,H-179*mm,52*mm,49*mm,'瑶山遗址公园','由祭坛与高等级墓地构成，承载礼制、信仰与等级秩序的文化解释空间。','空间 03')
card(c,73*mm,H-179*mm,52*mm,49*mm,'老虎岭遗址公园','展示良渚古城外围水利系统剖面，是讲述治水文明与工程智慧的关键现场。','空间 04')
# side block
c.setFillColor(JADE_DARK); c.roundRect(135*mm,H-226*mm,58*mm,156*mm,7*mm,stroke=0,fill=1)
draw_para(c,'三重品牌高度',141*mm,H-84*mm,45*mm,10*mm,'kicker')
draw_para(c,'世界遗产\n文明圣地\n国家平台',141*mm,H-102*mm,43*mm,60*mm,'h2_dark')
draw_para(c,'品牌合作不只获得视觉素材，更获得一套可用于产品叙事、礼赠叙事、文化传播与高端场域表达的价值系统。',141*mm,H-166*mm,43*mm,45*mm,'body_dark')
footer(c,3); c.showPage()

# 04 Commercial
bg(c,'light'); label(c,'02 · COMMERCIAL POWER',17*mm,H-23*mm); title(c,'不止“文化好看”，更具备商业转化能力',17*mm,H-38*mm,small=True)
for i,(x,txt,body) in enumerate([(17,'11 大品类','覆盖日用家居、贵金属等多元消费场景。'),(61,'约 800+ 款','在线销售产品持续迭代，具备货品化经验。'),(105,'4 亿+','基础文档提到 2025 年总销售额已突破 4 亿元。'),(149,'多项荣誉','红点设计奖、“中国礼物”金奖等国际/国家级认可。')]):
    card(c,x*mm,H-69*mm,40*mm,45*mm,txt,body)
card(c,17*mm,H-128*mm,84*mm,58*mm,'授权主体与运营能力','杭州良渚玉文化创意产业有限公司系国有全资企业，获良渚博物院独家授权，持有官方文化资源合法版权使用权及转授权资质。合作可围绕合规授权、设计审核、产品开发、渠道销售与传播配合形成完整闭环。','官方资源基础')
card(c,109*mm,H-128*mm,84*mm,58*mm,'“良渚+”品牌矩阵','良渚文创已从文物资源活态传承，延展到当代生活产品、文化礼赠、渠道销售与联名传播。品牌合作可以在既有生态上做加法，而不是从零教育市场。','品牌生态基础')
draw_table(c,[['品牌最关心的问题','良渚能提供的答案','可转化为'],['为什么合作有高度？','世界遗产、中华五千多年文明实证、国家级文化叙事。','品牌背书 / 年度文化项目 / 高端礼赠理由'],['为什么消费者看得懂？','玉器、纹样、色彩、神徽、水利与稻作等符号清晰。','产品故事 / 包装视觉 / 内容传播资产'],['为什么可以落地？','已具备多品类开发、授权、联名与销售经验。','产品开发 / 活动共创 / 渠道销售 / 电商专题']],17*mm,H-205*mm,[43*mm,78*mm,55*mm])
footer(c,4); c.showPage()

# 05 Asset system
bg(c,'dark'); label(c,'03 · ASSET SYSTEM',17*mm,H-23*mm,True); title(c,'可转译的良渚 IP 资产：从文化符号到品牌表达',17*mm,H-38*mm,True,small=True)
xs=[17,75,133]; ys=[75,133]
items=[('玉礼文明','玉琮、玉璧、玉钺等礼器系统，适合高端礼盒、珠宝、美妆、酒水、茶器与尊享会员礼遇。','A'),('神徽与精细阴刻','具备强识别度的图像语言，适合压纹、烫金、浮雕、刺绣、金属铭牌与包装细节。','B'),('治水与稻作','可连接自然、农业、水源、生态、健康与可持续叙事，适合饮品、食品、户外与 ESG 传播。','C'),('良渚色彩资源库','基础文档提到 1100 余组色彩数据、396 种良渚特有颜色、8 个核心色与原创色名，可支持品牌视觉系统。','D'),('纹样基因库','近百组纹样数据，含器型图、展开图、线稿、色板、单体纹样与高清图片，降低品牌开发门槛。','E'),('遗址与博物馆场域','良渚博物院、良渚古城遗址公园、瑶山、老虎岭等空间可成为内容拍摄、文化体验与高端接待的叙事来源。','F')]
for idx,(t,b,k) in enumerate(items):
    row=idx//3; col=idx%3
    card(c,xs[col]*mm,H-ys[row]*mm,52*mm,50*mm,t,b,k,True)
draw_para(c,'“把文化符号变成产品卖点，把遗产现场变成品牌内容，把玉礼美学变成消费者愿意带走的当代表达。”',21*mm,H-202*mm,160*mm,42*mm,'h2_dark')
footer(c,5,True); c.showPage()

# 06 modes
bg(c,'light'); label(c,'04 · COOPERATION MODES',17*mm,H-23*mm); title(c,'三类基础合作方式 + 可叠加场景权益',17*mm,H-38*mm,small=True)
card(c,17*mm,H-75*mm,54*mm,72*mm,'单项 IP 授权','合作方依托良渚 IP 进行设计、生产与市场化运作，适合已有成熟研发、供应链与渠道能力的品牌。\n\n• 授权素材范围清晰\n• 品牌自主开发效率高\n• 适合快速推出系列产品','模式 01')
card(c,78*mm,H-75*mm,54*mm,72*mm,'联合开发','双方围绕资源、设计、产品、渠道共同投入，风险共担、成果共享，适合需要文化深度和产品共创的重点项目。\n\n• 共同定义主题与货品\n• 更适合年度级合作\n• 可沉淀长期产品线','模式 02')
card(c,139*mm,H-75*mm,54*mm,72*mm,'跨界联名','通过联名产品、品牌活动与联合传播实现客群互通、声量叠加，适合品牌营销节点、会员礼赠或新品发布。\n\n• 双方品牌共同发声\n• 适合内容传播\n• 可结合线下快闪/渠道专题','模式 03')
note(c,17*mm,H-162*mm,176*mm,29*mm,'<b>可叠加方向：</b>官方活动 VIP 受邀、自有空间使用、官方渠道传播、核心美学基因库开放、论坛/展览/市集/快闪联动等，均应根据合作层级、排期、审批与合同确认。')
draw_table(c,[['合作深度','适合品牌状态','建议产出','品牌获得'],['轻量授权','有明确 SKU / 包装改版需求','单品或小系列包装、限定款、礼赠款','文化背书、上市速度、视觉辨识度'],['重点联名','新品发布 / 年度营销节点','联名产品线、礼盒、传播大片、渠道专题','声量、内容资产、销售转化'],['深度共创','想做长期文化资产或高端线','年度文化项目、场域活动、会员体验、空间展陈','品牌高度、长期资产、圈层影响']],17*mm,H-210*mm,[31*mm,47*mm,53*mm,45*mm])
footer(c,6); c.showPage()

# 07 matrix
bg(c,'light'); label(c,'05 · CATEGORY FIT',17*mm,H-23*mm); title(c,'哪些品牌最适合：按品类快速找到结合点',17*mm,H-38*mm,small=True)
draw_table(c,[['品类','核心连接点','建议表达形式','消费者理由'],['珠宝 / 贵金属','玉礼文明、器型与纹饰、收藏价值。','首饰系列、金章、吊坠、礼盒、会员收藏款。','把文化身份与高端材质相互放大。'],['美妆 / 香氛','玉的莹润、良渚色系、东方礼序与仪式感。','限定包装、节气礼盒、香氛空间、文化大片。','给产品高级感、礼赠感与东方审美理由。'],['酒水 / 茶饮 / 食品','稻作、水利、祭祀礼仪、宴饮与款待场景。','礼盒、指定用水/茶饮、论坛接待、内容短片。','把日常消费提升为文化款待。'],['服饰 / 运动','纹样、色彩、可穿戴文明印记。','鞋服系列、运动装备、丝巾、刺绣配件。','让文化符号进入日常穿搭与功能场景。'],['家居 / 生活方式','器型、纹样、礼器秩序、自然材料。','香器、茶器、餐具、文具、桌面礼品。','把博物馆审美带回家。'],['汽车 / 高端服务','世界遗产场域、高规格接待、文化路线。','品牌贵宾日、文化试驾、论坛服务、客户礼赠。','提升客户体验与品牌文化层级。'],['数字科技 / 影像','纹样数据库、遗址空间、文明数字化。','互动展、数字藏品、AR 导览、品牌纪录片。','用科技讲清楚古老文明的新表达。']],17*mm,H-64*mm,[28*mm,56*mm,54*mm,38*mm],fontsize=8.0)
note(c,17*mm,H-240*mm,176*mm,28*mm,'<b>判断标准：</b>优先选择能把良渚文化转化为“真实产品卖点 / 真实消费场景 / 真实传播内容”的品牌，而非仅有短期曝光需求的贴标合作。')
footer(c,7); c.showPage()

# 08 modules
bg(c,'split'); label(c,'06 · PRODUCT & CONTENT MODULES',17*mm,H-23*mm); title(c,'品牌可以怎么落地：五个可组合模块',17*mm,H-38*mm,small=True)
mods=[('1','联名产品 / 限定系列','围绕品牌核心 SKU 做外观、材质、纹样、器型或故事升级，例如跑鞋、珠宝、酒具、美妆礼盒、茶器、香氛、文具等。'),('2','高端礼盒 / 伴手礼','以玉礼文明、世界遗产与良渚色系构建礼赠理由，适合企业客户、会员、论坛嘉宾与节庆节点。'),('3','内容传播 / 品牌故事','通过短片、海报、直播、专家对谈、城市文化路线等方式，让消费者理解合作不是“换皮”，而是文化价值共创。'),('4','线下空间 / 快闪展陈','在品牌门店、商场、论坛/展览周边或良渚场域中打造轻展览、体验区、打卡装置与文化零售区。'),('5','渠道销售 / 电商专题','联动良渚文创自有渠道、品牌旗舰店、天猫/淘宝/京东及线下文创区，形成上市节奏与转化路径。')]
y=75
for n,t,b in mods:
    card(c,17*mm,H-y*mm,96*mm,33*mm,t,b,n)
    y += 38
c.setFillColor(BONE); c.roundRect(124*mm,H-224*mm,69*mm,154*mm,7*mm,stroke=0,fill=1)
draw_para(c,'合作转译逻辑',130*mm,H-84*mm,50*mm,9*mm,'kicker')
draw_para(c,'文化符号 → 产品语言 → 消费理由',130*mm,H-100*mm,51*mm,36*mm,'h2')
for yy,txt in [(141,'<b>玉琮 / 玉璧</b><br/>转化为瓶身、吊坠、盒型、扣件、纹样边框与开启仪式。'),(168,'<b>良渚色系</b><br/>转化为包装色彩、视觉主 KV、门店陈列与电商页面调性。'),(195,'<b>治水稻作</b><br/>转化为生态、滋养、自然、可持续和地方风土表达。')]:
    note(c,130*mm,H-yy*mm,51*mm,23*mm,txt)
footer(c,8); c.showPage()

# 09 cases
bg(c,'light'); label(c,'07 · REFERENCE CASES',17*mm,H-23*mm); title(c,'已有合作案例证明：良渚能进入多元生活方式',17*mm,H-38*mm,small=True)
card(c,17*mm,H-76*mm,84*mm,50*mm,'良渚文化 × 周大福珠宝','将传统黄金工艺与文物形态、纹饰结合，打造兼具文化收藏价值与实用佩戴价值的良渚文化系列饰品。','案例 01')
card(c,109*mm,H-76*mm,84*mm,50*mm,'良渚玉器精灵 / 萌兽系列','通过形态萌化与材质转化，把文物从“文化标识”转译为可触摸、可陪伴、可收藏的当代文创符号。','案例 02')
card(c,17*mm,H-132*mm,84*mm,50*mm,'良渚文化 × 特步','提取核心视觉基因，融入缓震旗舰跑鞋与跑服设计，让装备成为可穿戴的文明印记。','案例 03')
card(c,109*mm,H-132*mm,84*mm,50*mm,'酒水 / 食品 / 生活方式跨界','基础文档提到良渚文化已与塔牌黄酒、小糊涂仙、慕江南等品牌开展跨界合作，说明其可进入宴饮、礼赠与地方生活方式场景。','案例 04')
card(c,17*mm,H-204*mm,84*mm,55*mm,'案例带来的品牌启发','• 文化符号要和产品功能或消费场景绑定。\n• 高级感来自器型、材料、色彩和故事统一，不是纹样堆砌。\n• 渠道销售与传播内容要一起设计，避免只有发布会好看。')
card(c,109*mm,H-204*mm,84*mm,55*mm,'合作表达边界','• 官方称谓、标识、文物图像、场地、论坛权益均需按流程审核。\n• 涉及“指定”“官方”“独家”等表述必须以书面确认为准。\n• 历史文化含义应保持审慎准确，避免过度演绎。')
footer(c,9); c.showPage()

# 10 forum scenes
bg(c,'light'); label(c,'08 · FORUM & EVENT SCENES',17*mm,H-23*mm); title(c,'可叠加的高规格场景：论坛、展览、空间与渠道',17*mm,H-38*mm,small=True)
image(c,'_crop_onsite_top_stage_clear.jpg',17*mm,H-72*mm,95*mm,52*mm,'良渚论坛现场参考｜公开报道图片整理')
image(c,'_crop_onsite_main_small_clear.jpg',17*mm,H-130*mm,45*mm,40*mm,'论坛开幕场景')
image(c,'_crop_onsite_heritage_clear.jpg',67*mm,H-130*mm,45*mm,40*mm,'遗产内容展示')
card(c,121*mm,H-130*mm,72*mm,110*mm,'良渚论坛不是单纯赞助位，而是文化高度场。','对于适配品牌，论坛及相关活动可转化为高端服务支持、文化礼赠、产品体验、品牌内容共创、国际传播语境与线下零售/展示联动。主论坛应保持克制，品牌可重点考虑分会场、配套活动、嘉宾接待、礼赠体系、市集/展陈和外部快闪等更自然的合作场景。','品牌理解方式')
card(c,17*mm,H-206*mm,54*mm,46*mm,'服务支持','指定用水、茶饮、香氛、接驳、酒店服务等，以品质保障进入高规格文化交流场。','方向 A')
card(c,78*mm,H-206*mm,54*mm,46*mm,'礼赠接待','高端伴手礼、嘉宾礼盒、会员礼遇，把良渚文明转化为可赠予的东方礼。','方向 B')
card(c,139*mm,H-206*mm,54*mm,46*mm,'展示销售','文创市集、品牌快闪、联名产品陈列、电商专题与线下文创区联动。','方向 C')
draw_para(c,'注：论坛、场地、媒体、嘉宾、称谓及露出权益均应以当届主办方书面确认为准。',17*mm,H-250*mm,176*mm,11*mm,'small')
footer(c,10); c.showPage()

# 11 process
bg(c,'light'); label(c,'09 · PROCESS',17*mm,H-23*mm); title(c,'品牌授权合作流程：从初步意向到上市传播',17*mm,H-38*mm,small=True)
steps=[('01','意向沟通','明确品牌目标、品类、预算、时间节点、渠道与合作深度。'),('02','资产匹配','从良渚色彩、纹样、文物、场域、论坛与渠道中筛选适配资源。'),('03','主题共创','形成 6—12 字中文主题、核心连接点、产品/礼盒/传播/空间模块。'),('04','方案审核','对标识、文物图像、文字表述、授权范围和传播口径进行审核确认。'),('05','打样生产','推进设计深化、样品、包装、物料、电商页面和活动执行方案。'),('06','上市传播','联动品牌渠道、良渚文创渠道、线下活动与内容传播完成发布。')]
for i,(n,t,b) in enumerate(steps):
    x=17*mm+i*29.3*mm
    card(c,x,H-95*mm,25.5*mm,58*mm,t,b,n)
card(c,17*mm,H-184*mm,84*mm,68*mm,'品牌方需要提前准备','• 品牌介绍与目标客群\n• 计划合作品类 / SKU / 价格带\n• 上市时间与销售渠道\n• 预算范围与授权期限预期\n• 是否需要线下活动、论坛或场地资源')
card(c,109*mm,H-184*mm,84*mm,68*mm,'良渚侧可提供支持方向','• 文化资产与授权素材筛选\n• IP 文案、视觉方向与合规口径建议\n• 产品/包装/礼盒/内容合作建议\n• 良渚文创自有渠道及空间资源协同可能\n• 官方审核流程与合同授权边界确认')
footer(c,11); c.showPage()

# 12 next
bg(c,'dark'); label(c,'10 · NEXT STEP',17*mm,H-23*mm,True); title(c,'下一步：把品牌需求转成可审核、可开发、可销售的合作方案',17*mm,H-38*mm,True,small=True)
card(c,17*mm,H-182*mm,72*mm,130*mm,'适合先做一页“品牌 × 良渚”的主题提案。','每个品牌先明确：合作标题、核心连接点、主要表达形式、授权素材范围、上市节点与渠道路径。确认方向后，再进入产品设计、礼盒、传播、空间或活动模块的深化。','合作入口',True)
tags(c,23*mm,H-166*mm,['产品','礼盒','传播','空间','活动','渠道'],True)
card(c,99*mm,H-110*mm,94*mm,58*mm,'品牌合作建议话术','良渚文化不是单一文物图案库，而是一套由世界遗产、玉礼文明、良渚色彩、纹样基因、遗址空间与文化活动共同组成的品牌资产。我们希望与品牌共同把这套资产转化为消费者真正愿意购买、赠予、分享和记住的产品与内容。','对外表达',True)
card(c,99*mm,H-190*mm,94*mm,72*mm,'合规提示','• 本手册为品牌合作沟通材料，非最终授权文件。\n• 授权品类、期限、地域、素材范围、费用与渠道以正式合同为准。\n• 官方名称、LOGO、文物图像、场地、论坛、媒体与“指定/独家”类权益，均需书面审核确认。\n• 文创设计、IP 联名合作意向可通过良渚文创官方联系渠道进一步对接。','最终确认',True)
c.setFont(FONT,8.5); c.setFillColor(colors.Color(1,1,1,0.62)); c.drawString(17*mm,20*mm,'良渚文化品牌合作手册｜A4 PDF 初稿｜制作：苏薇的助理｜2026-06-02')
footer(c,12,True); c.showPage()

c.save()
print(OUT)
print(OUT.exists(), OUT.stat().st_size)
