feat:参照研听的基础工程
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_markdown_plus/flutter_markdown_plus.dart';
|
||||
import 'package:shadcn_ui/shadcn_ui.dart';
|
||||
|
||||
/// Keep markdown horizontal rules subtle so backend `---` separators read as
|
||||
/// a light divider instead of a heavy line.
|
||||
MarkdownStyleSheet withMarkdownHairlineRule(
|
||||
MarkdownStyleSheet base,
|
||||
Color ruleColor,
|
||||
) {
|
||||
return base.copyWith(
|
||||
horizontalRuleDecoration: BoxDecoration(
|
||||
border: Border(
|
||||
top: BorderSide(color: ruleColor.withValues(alpha: 0.85), width: 0.5),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
MarkdownStyleSheet appMarkdownStyle(BuildContext context) {
|
||||
final cs = ShadTheme.of(context).colorScheme;
|
||||
return withMarkdownHairlineRule(
|
||||
MarkdownStyleSheet(
|
||||
// 正文:CJK 适宜行高 1.75,块间统一节奏
|
||||
p: TextStyle(fontSize: 14.5, height: 1.75, color: cs.foreground),
|
||||
pPadding: EdgeInsets.zero,
|
||||
blockSpacing: 14,
|
||||
// 标题层级 + 上方留白形成分节(中文排版重段落分隔)
|
||||
h1: TextStyle(
|
||||
fontSize: 20,
|
||||
height: 1.35,
|
||||
fontWeight: FontWeight.w700,
|
||||
color: cs.foreground,
|
||||
),
|
||||
h1Padding: const EdgeInsets.only(top: 6, bottom: 2),
|
||||
h2: TextStyle(
|
||||
fontSize: 17,
|
||||
height: 1.4,
|
||||
fontWeight: FontWeight.w700,
|
||||
color: cs.foreground,
|
||||
),
|
||||
h2Padding: const EdgeInsets.only(top: 16, bottom: 2),
|
||||
h3: TextStyle(
|
||||
fontSize: 15,
|
||||
height: 1.45,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: cs.foreground,
|
||||
),
|
||||
h3Padding: const EdgeInsets.only(top: 10),
|
||||
// 列表:缩进 + 项目符号对齐正文
|
||||
listIndent: 22,
|
||||
listBullet: TextStyle(fontSize: 14.5, height: 1.75, color: cs.foreground),
|
||||
listBulletPadding: const EdgeInsets.only(right: 6),
|
||||
// 强调:加粗醒目;中文不用斜体(合成斜体难看),em 走常规体
|
||||
strong: TextStyle(fontWeight: FontWeight.w700, color: cs.foreground),
|
||||
em: TextStyle(fontStyle: FontStyle.normal, color: cs.foreground),
|
||||
// 链接:accentForeground + 下划线(浅色深绿提升对比,深色仍 lime)
|
||||
a: TextStyle(
|
||||
color: cs.accentForeground,
|
||||
decoration: TextDecoration.underline,
|
||||
decorationColor: cs.accentForeground,
|
||||
),
|
||||
// 表格:表头加粗、单元格留白、宽表横向滚动(IntrinsicColumnWidth 触发)、
|
||||
// 外角小圆角(嵌在 11.2 圆角卡片内,用更小一档的 8)
|
||||
tableHead: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 13,
|
||||
color: cs.foreground,
|
||||
),
|
||||
// 表格数据用等宽数字(规范 3.1:tabular-nums),多行数值纵向对齐
|
||||
tableBody: TextStyle(
|
||||
fontSize: 13,
|
||||
height: 1.5,
|
||||
color: cs.foreground,
|
||||
fontFeatures: const [FontFeature.tabularFigures()],
|
||||
),
|
||||
tableHeadAlign: TextAlign.left,
|
||||
tableColumnWidth: const IntrinsicColumnWidth(),
|
||||
tableCellsPadding: const EdgeInsets.symmetric(
|
||||
horizontal: 12,
|
||||
vertical: 8,
|
||||
),
|
||||
tablePadding: const EdgeInsets.only(bottom: 4),
|
||||
tableBorder: TableBorder.all(
|
||||
color: cs.border,
|
||||
width: 1,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
// 引用块:中文不用斜体;浅底 + 主色左条 + 内距 + 右侧小圆角
|
||||
blockquoteDecoration: BoxDecoration(
|
||||
color: cs.muted,
|
||||
border: Border(left: BorderSide(color: cs.primary, width: 3)),
|
||||
borderRadius: const BorderRadius.only(
|
||||
topRight: Radius.circular(6),
|
||||
bottomRight: Radius.circular(6),
|
||||
),
|
||||
),
|
||||
blockquotePadding: const EdgeInsets.fromLTRB(14, 10, 12, 10),
|
||||
blockquote: TextStyle(
|
||||
fontSize: 13.5,
|
||||
height: 1.7,
|
||||
color: cs.mutedForeground,
|
||||
),
|
||||
// 行内 code(如 `机构名`):用正文字体(DM Sans),不用等宽 Menlo——
|
||||
// 机构名/英文术语用等宽会显得突兀(demo 已改为正文字体)。仅保留浅底标记。
|
||||
code: TextStyle(
|
||||
fontSize: 13.5,
|
||||
height: 1.75,
|
||||
color: cs.foreground,
|
||||
backgroundColor: cs.muted,
|
||||
fontFamilyFallback: const ['PingFang SC', 'Noto Sans CJK SC'],
|
||||
),
|
||||
codeblockDecoration: BoxDecoration(
|
||||
color: cs.muted,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
),
|
||||
cs.border,
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user