Skip to content

自定义高亮样式

本文档主要提供自定义高亮样式导入的配置文档。

如果尝试让LLM生成好看的高亮主题,可以使用下面提示词,复制给LLM即可:

markdown
请根据下面文档,为我生成美观、好看的高亮主题
https://open.pendown.cn/open/highlight_theme.html

给 LLM 的生成规则

  • 只输出 JSON 对象本身,不要输出解释文字、代码围栏或尾随逗号。
  • 字段名必须使用本文档中的 camelCase 名称。
  • 所有数值使用 JSON number,不要写成字符串。
  • int 字段必须写整数,例如 4007000;不要写 400.0
  • double 字段必须写小数,例如 0.01.0-1.018.0;不要写 01-118
  • 重要:虽然 JSON 统称 number,但 Dart jsonDecode 会把 0 解析为 int,把 0.0 解析为 doubledouble 字段写成整数可能报 type 'int' is not a subtype of type 'double'
  • 颜色优先使用 #RRGGBB;需要透明度时使用 #AARRGGBB
  • 生成渐变时确保 colors 至少有 2 个颜色;如果提供 stops,长度应与 colors 一致。
  • 需要背景效果时优先设置 backgroundColorpaddingborderRadius,否则背景可能紧贴文本。
  • fontFamily 建议省略或设为 0,除非明确知道目标用户本地字体 ID。
  • 不确定字段是否需要时直接省略,让应用使用默认值。

使用入口

  • 在自定义高亮样式面板中点击 分享,会复制当前样式的 JSON。
  • 点击 导入,粘贴一段完整 JSON,确认后会解析并应用。
  • 导入内容必须是一个 JSON 对象,不能包含 Markdown 代码围栏或注释。
  • 未填写的字段会使用源码默认值;不需要的效果可以直接省略对应字段。
  • 如果导入时报 type 'int' is not a subtype of type 'double',逐项检查本文档标为 double 的字段是否都写成了小数。

数值类型规则

请严格按下表书写数值。int 字段只能写整数,double 字段只能写带小数点的数字。

类型必须写法禁止写法字段
int4007000400.0700.00.0fontWeightfontFamily
double0.01.0-1.018.001-118fontSizeletterSpacingwordSpacingheightborderRadius
double0.08.008borderRadiusCustom.tlborderRadiusCustom.trborderRadiusCustom.blborderRadiusCustom.br
double4.02.042padding.toppadding.rightpadding.bottompadding.left
double0.00.51.001gradient.stops[]
double-1.00.01.0-101gradient.begin.xgradient.begin.ygradient.end.xgradient.end.ygradient.center.xgradient.center.y
double0.80.06.28318530717958606gradient.radiusgradient.startAnglegradient.endAngle
double1.06.04.0164border.widthborder.dashWidthborder.dashGap
double2.03.023underline.thicknessunderline.offset
double0.04.0-2.004-2shadows[].offsetXshadows[].offsetYshadows[].blurRadiusbackgroundShadows[].offsetXbackgroundShadows[].offsetYbackgroundShadows[].blurRadiusbackgroundShadows[].spreadRadius

字段速查清单

  • 必须写 int 的字段只有:fontWeightfontFamily
  • 必须写 double 的顶层字段:fontSizeletterSpacingwordSpacingheightborderRadius
  • 必须写 double 的顶层对象子字段:borderRadiusCustom.tlborderRadiusCustom.trborderRadiusCustom.blborderRadiusCustom.brpadding.toppadding.rightpadding.bottompadding.left
  • 必须写 double 的渐变字段:stops 数组内所有值、begin.xbegin.yend.xend.ycenter.xcenter.yradiusstartAngleendAngle
  • 必须写 double 的边框字段:widthdashWidthdashGap
  • 必须写 double 的下划线字段:thicknessoffset
  • 必须写 double 的阴影字段:offsetXoffsetYblurRadiusspreadRadius

顶层结构

json
{
  "fontWeight": 700,
  "fontFamily": 0,
  "isItalic": false,
  "fontSize": 18.0,
  "letterSpacing": 1.2,
  "wordSpacing": 0.0,
  "height": 1.2,
  "textColor": { "solidColor": "#1f2937" },
  "backgroundColor": { "solidColor": "#fef3c7" },
  "border": {
    "style": "solid",
    "color": { "solidColor": "#f59e0b" },
    "width": 2.0
  },
  "underline": {
    "style": "none",
    "color": { "solidColor": "#f59e0b" },
    "thickness": 2.0,
    "offset": 2.0
  },
  "borderRadius": 8.0,
  "borderRadiusCustom": { "tl": 8.0, "tr": 8.0, "bl": 8.0, "br": 8.0 },
  "shadows": [
    { "color": "#66000000", "offsetX": 0.0, "offsetY": 1.0, "blurRadius": 2.0 }
  ],
  "backgroundShadows": [
    { "color": "#33000000", "offsetX": 0.0, "offsetY": 4.0, "blurRadius": 8.0, "spreadRadius": 0.0 }
  ],
  "padding": { "top": 4.0, "right": 2.0, "bottom": 4.0, "left": 2.0 }
}

顶层字段说明

字段类型默认值说明
fontWeightint400字重,必须写整数。建议使用 100900;UI 常用 400600700
fontFamilyint字体 ID,必须写整数。0 表示默认字体;其他值依赖本地已导入字体。
isItalicbooleanfalse是否斜体。
fontSizedouble字号,必须写小数,例如 18.0
letterSpacingdouble字间距,必须写小数,例如 1.20.0
wordSpacingdouble词间距,必须写小数,例如 0.0
heightdouble行高倍率,必须写小数,例如 1.2;对应 Flutter TextStyle.height
textColorColorConfig文字颜色。
backgroundColorColorConfig高亮背景颜色,支持纯色或渐变。
borderBorderConfig边框设置。
underlineUnderlineConfig下划线设置。
borderRadiusdouble0.0统一圆角半径,必须写小数,例如 8.0
borderRadiusCustomobject四角圆角,存在时优先于 borderRadius。键为 tltrblbr,值都必须写 double
shadowsShadowConfig[]文字阴影。当前自定义面板主要编辑背景阴影,但模型支持导入文字阴影。
backgroundShadowsShadowConfig[]背景阴影,可多层叠加。
paddingobject高亮背景相对文本的内边距,键为 toprightbottomleft,值都必须写 double

颜色配置 ColorConfig

颜色字段使用对象表示,可选纯色或渐变。建议同一个颜色对象只保留一种模式。当前绘制逻辑中,backgroundColorborder.colorunderline.color 支持渐变;textColor 建议使用纯色,因为文字样式只会读取 solidColor

纯色

json
{ "solidColor": "#fef3c7" }

颜色字符串支持 #RRGGBB#AARRGGBB。当只写 6 位 RGB 时,源码会按不透明颜色处理;8 位 ARGB 可用于半透明,例如 #66ff0000

线性渐变

json
{
  "gradient": {
    "type": "linear",
    "colors": ["#fef3c7", "#fde68a"],
    "stops": [0.0, 1.0],
    "begin": { "x": -1.0, "y": 0.0 },
    "end": { "x": 1.0, "y": 0.0 }
  }
}

径向渐变

json
{
  "gradient": {
    "type": "radial",
    "colors": ["#ffffff", "#a78bfa"],
    "stops": [0.0, 1.0],
    "center": { "x": 0.0, "y": 0.0 },
    "radius": 0.8
  }
}

扫描渐变

json
{
  "gradient": {
    "type": "sweep",
    "colors": ["#f472b6", "#60a5fa", "#f472b6"],
    "stops": [0.0, 0.5, 1.0],
    "center": { "x": 0.0, "y": 0.0 },
    "startAngle": 0.0,
    "endAngle": 6.283185307179586
  }
}

渐变字段说明

字段类型说明
typestring支持 linearradialsweep。未知类型会降级为线性渐变。
colorsstring[]必填,颜色列表。
stopsdouble[]可选,颜色停止点,值必须写小数,通常从 0.01.0,数量应与 colors 一致。
beginobject线性渐变起点,xy 都必须写 double,常用范围为 -1.01.0
endobject线性渐变终点,xy 都必须写 double,常用范围为 -1.01.0
centerobject径向或扫描渐变中心点,xy 都必须写 double
radiusdouble径向渐变半径,必须写小数,缺省为 0.5
startAngledouble扫描渐变起始角度,单位为弧度,必须写小数。
endAngledouble扫描渐变结束角度,单位为弧度,必须写小数。

边框配置 BorderConfig

json
{
  "style": "dashed",
  "color": { "solidColor": "#f59e0b" },
  "width": 2.0,
  "dashWidth": 6.0,
  "dashGap": 4.0
}
字段类型默认值说明
stylestringsolid支持 nonesoliddasheddotted
colorColorConfig黑色边框颜色,支持纯色或渐变。
widthdouble1.0边框宽度,必须写小数。绘制器内部会按 width * 0.5 设置画笔粗细。
dashWidthdouble样式相关虚线或点线单段长度,必须写小数。dashed 缺省 4.0dotted 缺省 2.0
dashGapdouble4.0虚线或点线间隔,必须写小数。

下划线配置 UnderlineConfig

json
{
  "style": "wavy",
  "color": { "solidColor": "#ec4899" },
  "thickness": 2.0,
  "offset": 3.0
}
字段类型默认值说明
stylestringnone支持 nonesoliddasheddottedwavydouble
colorColorConfig黑色下划线颜色,支持纯色或渐变。
thicknessdouble1.0下划线粗细,必须写小数。
offsetdouble0.0下划线相对文字底部的纵向偏移,正数向下,必须写小数。

阴影配置 ShadowConfig

shadowsbackgroundShadows 都使用同类对象数组:

json
[
  { "color": "#33000000", "offsetX": 0.0, "offsetY": 4.0, "blurRadius": 8.0, "spreadRadius": 0.0 }
]
字段类型默认值说明
colorstring#000000阴影颜色,建议使用 #AARRGGBB 控制透明度。
offsetXdouble0.0水平偏移,正数向右,必须写小数。
offsetYdouble0.0垂直偏移,正数向下,必须写小数。
blurRadiusdouble0.0模糊半径,必须写小数。
spreadRadiusdouble0.0扩散半径,必须写小数;仅背景阴影实际使用。文字阴影会忽略该字段。

可直接导入的示例

示例 1:暖黄色马克笔

json
{
  "fontWeight": 700,
  "fontSize": 18.0,
  "letterSpacing": 1.2,
  "textColor": { "solidColor": "#856404" },
  "backgroundColor": { "solidColor": "#fff3cd" },
  "border": {
    "style": "dashed",
    "color": { "solidColor": "#ffeaa7" },
    "width": 1.0,
    "dashWidth": 6.0,
    "dashGap": 4.0
  },
  "borderRadius": 8.0,
  "padding": { "top": 4.0, "right": 2.0, "bottom": 4.0, "left": 2.0 }
}

示例 2:蓝紫渐变胶囊

json
{
  "fontWeight": 700,
  "fontSize": 18.0,
  "textColor": { "solidColor": "#ffffff" },
  "backgroundColor": {
    "gradient": {
      "type": "linear",
      "colors": ["#6366f1", "#a855f7", "#ec4899"],
      "stops": [0.0, 0.55, 1.0],
      "begin": { "x": -1.0, "y": 0.0 },
      "end": { "x": 1.0, "y": 0.0 }
    }
  },
  "borderRadius": 18.0,
  "padding": { "top": 5.0, "right": 8.0, "bottom": 5.0, "left": 8.0 },
  "backgroundShadows": [
    { "color": "#446366f1", "offsetX": 0.0, "offsetY": 4.0, "blurRadius": 10.0, "spreadRadius": 0.0 }
  ]
}

示例 3:只加彩色波浪线

json
{
  "fontWeight": 600,
  "textColor": { "solidColor": "#111827" },
  "underline": {
    "style": "wavy",
    "color": {
      "gradient": {
        "type": "linear",
        "colors": ["#22c55e", "#06b6d4"],
        "begin": { "x": -1.0, "y": 0.0 },
        "end": { "x": 1.0, "y": 0.0 }
      }
    },
    "thickness": 2.0,
    "offset": 3.0
  }
}

示例 4:玻璃拟态浅色标签

json
{
  "fontWeight": 600,
  "fontSize": 17.0,
  "textColor": { "solidColor": "#0f172a" },
  "backgroundColor": {
    "gradient": {
      "type": "linear",
      "colors": ["#ccffffff", "#88dbeafe"],
      "stops": [0.0, 1.0],
      "begin": { "x": -1.0, "y": -1.0 },
      "end": { "x": 1.0, "y": 1.0 }
    }
  },
  "border": {
    "style": "solid",
    "color": { "solidColor": "#99ffffff" },
    "width": 1.0
  },
  "borderRadius": 12.0,
  "padding": { "top": 5.0, "right": 6.0, "bottom": 5.0, "left": 6.0 },
  "backgroundShadows": [
    { "color": "#220f172a", "offsetX": 0.0, "offsetY": 6.0, "blurRadius": 14.0, "spreadRadius": -2.0 }
  ]
}