feat: per-block font size/color controls — title_size, text_size, text_color, accent_color, button_color
- blueprints.py: validate + render 5 new style properties as CSS vars - editor.js: slider controls for title/text size, color pickers for text/accent/button colors with reset buttons - blocks.css: CSS variable consumption rules (--sf-title-size, etc.) Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
+9
-2
@@ -148,12 +148,15 @@ def validate_blocks(blocks):
|
||||
if not isinstance(style,dict):raise ValueError('样式必须为对象')
|
||||
normalized['style']={}
|
||||
for key,val in style.items():
|
||||
if key in ('background','text_color'):
|
||||
if key in ('background','text_color','accent_color','button_color'):
|
||||
if not isinstance(val,str) or not re.fullmatch(r'#[0-9a-fA-F]{6}',val):raise ValueError('颜色必须为六位十六进制')
|
||||
normalized['style'][key]=val
|
||||
elif key in ('padding','tablet_padding','mobile_padding'):
|
||||
if type(val) is not int or not 0<=val<=120:raise ValueError('区块间距必须是0-120整数')
|
||||
normalized['style'][key]=val
|
||||
elif key in ('title_size','text_size'):
|
||||
if type(val) is not int or not 10<=val<=80:raise ValueError('字号必须是10-80整数')
|
||||
normalized['style'][key]=val
|
||||
elif key in ('hide_mobile','hide_tablet'):
|
||||
if type(val) is not bool:raise ValueError('设备显隐必须是布尔值')
|
||||
normalized['style'][key]=val
|
||||
@@ -267,12 +270,16 @@ def render_blocks(blocks, site, page, entries):
|
||||
typ=block['type']; resolve=lambda key,default='':resolve_text(block.get(key,default),site,page)
|
||||
title=escape(resolve('title')); subtitle=escape(resolve('subtitle'));desc=escape(resolve('description'))
|
||||
raw_style=block.get('style') or {}; s=[]
|
||||
for key,var in [('background','--sf-bg'),('text_color','--sf-fg')]:
|
||||
for key,var in [('background','--sf-bg'),('text_color','--sf-fg'),('accent_color','--sf-accent-c'),('button_color','--sf-btn-c')]:
|
||||
val=str(raw_style.get(key,'')).strip()
|
||||
if re.fullmatch(r'#[a-fA-F0-9]{6}',val):s.append(f'{var}:{val}')
|
||||
if 'padding' in raw_style:
|
||||
try:pad=max(0,min(120,int(raw_style['padding'])));s.append(f'--sf-pad:{pad}px')
|
||||
except (ValueError,TypeError):pass
|
||||
for key,var,lo,hi in [('title_size','--sf-title-size',10,80),('text_size','--sf-text-size',10,24)]:
|
||||
if key in raw_style:
|
||||
try:size=max(lo,min(hi,int(raw_style[key])));s.append(f'{var}:{size}px')
|
||||
except (ValueError,TypeError):pass
|
||||
style=' style="'+escape(';'.join(s),quote=True)+'"' if s else ''
|
||||
start=f'<section class="sf-section sf-{typ}" data-block="{escape(block["id"])}"{style}><div class="sf-container">'
|
||||
end='</div></section>'
|
||||
|
||||
Reference in New Issue
Block a user