Files
ulthon_information/public/static/css/phone-image-templates.css
augushong e937970986 fix(phone-image): 右側畫布字號不生效+字號刷新丟失
1. applyFontScale()新增#paginated-preview的CSS變量設置
   --pi-font-scale/--pi-table-font-scale/--pi-code-font-scale
2. .page-content新增font-size:calc(14px*var(--pi-font-scale,1))
   之前.page-content無font-size設置,右側DOM分頁無法響應字號調整
3. 字號從後端savedConfig正確恢復(fontScale:1.2驗證通過)
2026-05-19 20:08:17 +08:00

1250 lines
28 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ============================================
Phone Image Template System
用于生成手机端分享图片的CSS框架
渲染宽度540px, html2canvas scale=2 输出1080px
注意: 仅使用html2canvas兼容的CSS属性
支持: flexbox, border-radius, box-shadow, background-color,
font, padding, margin, border, position(relative/absolute/fixed)
不支持: transform, filter, clip-path, backdrop-filter,
CSS grid, object-fit, position:sticky, CSS animations
============================================ */
/* --- CSS Custom Properties (小红书经典风格) --- */
:root {
/* 字号缩放 */
--pi-font-scale: 1;
/* 字号 */
--pi-font-size-base: calc(14px * var(--pi-font-scale, 1));
--pi-font-size-title: calc(26px * var(--pi-font-scale, 1));
--pi-font-size-subtitle: calc(16px * var(--pi-font-scale, 1));
--pi-font-size-small: calc(12px * var(--pi-font-scale, 1));
}
/*
* 字号缩放中间变量局部覆盖
* 当 --pi-font-scale 通过 inline style 设置在 #render-preview 或 #render-staging 上时,
* 需要在该元素上重新声明中间变量,使其用本地的 --pi-font-scale 重新计算。
* 否则中间变量继承 :root 的预计算值(:root 的 --pi-font-scale 始终为 1缩放不生效。
*/
#render-preview,
#render-staging {
--pi-font-size-base: calc(14px * var(--pi-font-scale, 1));
--pi-font-size-title: calc(26px * var(--pi-font-scale, 1));
--pi-font-size-subtitle: calc(16px * var(--pi-font-scale, 1));
--pi-font-size-small: calc(12px * var(--pi-font-scale, 1));
/* 行高 */
--pi-line-height: 1.8;
/* 间距 */
--pi-spacing: 20px;
--pi-spacing-sm: 10px;
--pi-spacing-lg: 30px;
--pi-spacing-xs: 5px;
/* 颜色 */
--pi-color-text: #333333;
--pi-color-text-light: #666666;
--pi-color-text-lighter: #999999;
--pi-color-bg: #ffffff;
--pi-color-accent: #1890ff;
--pi-color-border: #eeeeee;
/* 圆角 */
--pi-radius: 12px;
/* 字体 */
--pi-font-family: 'Source Han Sans', 'SourceHanSans-Normal', sans-serif;
--pi-table-font-scale: 1;
}
/* ============================================
Base Container
固定540px宽度的最外层容器
============================================ */
.phone-image-container {
width: 540px;
background: var(--pi-color-bg);
color: var(--pi-color-text);
font-family: var(--pi-font-family);
font-size: var(--pi-font-size-base);
line-height: var(--pi-line-height);
overflow: hidden;
position: relative;
}
/* ============================================
Page Container
每一页的容器, 尺寸由 size class 控制
============================================ */
.phone-image-page {
overflow: hidden;
box-sizing: border-box;
position: relative;
}
/* 水印 - 位于每页右下角的半透明文字 */
.page-watermark {
position: absolute;
bottom: 60px;
right: 20px;
font-size: calc(12px * var(--pi-font-scale, 1));
color: rgba(0, 0, 0, 0.3);
pointer-events: none;
white-space: nowrap;
}
/* ============================================
Size Variants
两种主流手机图片尺寸
============================================ */
/* 小红书尺寸 540x720 (输出1080x1440) */
.size-xiaohongshu .phone-image-page {
width: 540px;
height: 720px;
}
/* 抖音尺寸 540x960 (输出1080x1920) */
.size-douyin .phone-image-page {
width: 540px;
height: 960px;
}
/* ============================================
Page Type Variants
三种页面类型: 封面页/内容页/总结页
============================================ */
/* --- 封面页/首页 --- */
.page-cover {
--pi-font-scale: 1 !important;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: var(--pi-spacing-lg);
text-align: center;
}
.page-cover .cover-title {
font-size: calc(28px * var(--pi-font-scale, 1));
font-weight: normal;
letter-spacing: 2px;
line-height: 1.5;
margin-bottom: var(--pi-spacing);
color: var(--pi-color-text);
word-break: break-word;
}
.page-cover .cover-subtitle {
font-size: var(--pi-font-size-subtitle);
color: var(--pi-color-text-light);
margin-bottom: var(--pi-spacing);
}
.page-cover .cover-image {
width: 100%;
margin-bottom: var(--pi-spacing);
}
.page-cover .cover-meta {
font-size: var(--pi-font-size-small);
color: var(--pi-color-text-lighter);
margin-top: var(--pi-spacing-sm);
}
/* --- 封面页 - 无封面图装饰排版 --- */
.page-cover.no-cover-image {
justify-content: center;
padding: var(--pi-spacing-lg);
}
.page-cover.no-cover-image .cover-decor-line {
position: absolute;
left: 30px;
right: 30px;
height: 2px;
background: var(--pi-color-border);
}
.page-cover.no-cover-image .cover-decor-top {
top: 80px;
}
.page-cover.no-cover-image .cover-decor-bottom {
bottom: 80px;
}
.page-cover.no-cover-image .cover-no-img-content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: var(--pi-spacing) 0;
}
.page-cover.no-cover-image .cover-no-img-title {
font-size: calc(36px * var(--pi-font-scale, 1));
font-weight: bold;
line-height: 1.4;
color: var(--pi-color-text);
word-break: break-word;
margin-bottom: var(--pi-spacing);
padding: 0 20px;
}
.page-cover.no-cover-image .cover-decor-divider {
width: 60px;
height: 3px;
background: var(--pi-color-accent);
margin-bottom: var(--pi-spacing);
}
.page-cover.no-cover-image .cover-no-img-desc {
font-size: var(--pi-font-size-subtitle);
color: var(--pi-color-text-light);
line-height: 1.8;
margin-bottom: var(--pi-spacing);
padding: 0 30px;
word-break: break-word;
}
.page-cover.no-cover-image .cover-no-img-meta {
display: flex;
gap: 15px;
font-size: var(--pi-font-size-small);
color: var(--pi-color-text-lighter);
flex-wrap: wrap;
justify-content: center;
}
/* --- 内容页图片强制约束 --- */
.page-content img {
max-width: 100% !important;
height: auto !important;
display: block;
margin: 10px 0;
}
/* --- 内容页 --- */
.page-body {
display: flex;
flex-direction: column;
padding: var(--pi-spacing);
}
/* 内容页 - 页头区域 */
.page-header {
border-bottom: none;
padding-bottom: 0;
margin-bottom: 20px;
}
.page-header .page-title {
font-size: calc(20px * var(--pi-font-scale, 1));
font-weight: normal;
letter-spacing: 1px;
color: #666;
line-height: 1.4;
word-break: break-word;
}
.page-header .page-subtitle {
font-size: var(--pi-font-size-subtitle);
color: var(--pi-color-text-light);
margin-top: var(--pi-spacing-sm);
}
/* 内容页 - 作者声明 */
.author-credit {
font-size: 11px;
color: #999;
padding-bottom: 8px;
margin-bottom: 12px;
border-bottom: 1px solid #eee;
text-indent: 0;
}
/* 品牌头部 - 所有页面顶部统一品牌标识 */
.brand-header {
display: flex;
align-items: center;
padding: 6px 0;
margin-bottom: 4px;
flex-shrink: 0;
gap: 8px;
}
.brand-header .brand-logo {
height: 24px;
max-width: 120px;
width: auto;
flex-shrink: 0;
border-radius: 4px;
object-fit: contain;
}
.brand-header .brand-name {
font-size: 13px;
color: #666;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1;
letter-spacing: 0.5px;
}
/* 内容页 - 正文区域 */
.page-content {
flex: 1;
overflow: hidden;
word-break: break-word;
line-height: 2.0;
font-size: calc(14px * var(--pi-font-scale, 1));
}
.page-content p {
text-indent: 2em;
margin-bottom: 16px;
color: #333;
}
.page-content h2 {
font-weight: normal;
font-size: calc(18px * var(--pi-font-scale, 1));
letter-spacing: 1px;
margin-top: 24px;
margin-bottom: 12px;
color: #333;
}
.page-content h3 {
font-weight: normal;
font-size: calc(16px * var(--pi-font-scale, 1));
margin-top: 20px;
margin-bottom: 10px;
color: #555;
}
.page-content h4 {
font-size: calc(14px * var(--pi-font-scale, 1));
font-weight: bold;
margin-top: var(--pi-spacing-sm);
margin-bottom: 5px;
}
.page-content h5 {
font-size: calc(13px * var(--pi-font-scale, 1));
font-weight: bold;
margin-top: var(--pi-spacing-sm);
margin-bottom: 5px;
}
.page-content h6 {
font-size: calc(12px * var(--pi-font-scale, 1));
font-weight: bold;
margin-top: var(--pi-spacing-sm);
margin-bottom: 5px;
color: var(--pi-color-text-light);
}
.page-content blockquote {
border-left: 1px solid #ccc;
font-style: normal;
color: #888;
padding-left: 15px;
margin: var(--pi-spacing-sm) 0;
}
.page-content ul,
.page-content ol {
padding-left: var(--pi-spacing);
margin-bottom: var(--pi-spacing-sm);
}
.page-content li {
margin-bottom: 5px;
}
/* 内容页 - 页脚区域 */
.page-footer {
border-top: none;
padding-top: 0;
margin-top: var(--pi-spacing-sm);
font-size: calc(11px * var(--pi-font-scale, 1));
color: #bbb;
display: flex;
justify-content: space-between;
align-items: center;
}
/* --- 总结页/尾页 --- */
.page-summary {
--pi-font-scale: 1 !important;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: var(--pi-spacing-lg);
text-align: center;
}
.page-summary .summary-title {
font-weight: normal;
letter-spacing: 2px;
font-size: calc(22px * var(--pi-font-scale, 1));
margin-bottom: var(--pi-spacing);
color: var(--pi-color-text);
}
.page-summary .summary-text {
font-size: var(--pi-font-size-subtitle);
color: #aaa;
font-weight: normal;
margin-bottom: var(--pi-spacing);
line-height: 1.6;
}
.page-summary .summary-qr {
margin-bottom: var(--pi-spacing-sm);
}
.page-summary .summary-footer {
font-size: var(--pi-font-size-small);
color: #ccc;
}
/* ============================================
Font Variants
============================================ */
.font-source-han-sans {
--pi-font-family: 'Source Han Sans', 'SourceHanSans-Normal', sans-serif;
}
/* ============================================
Article Images
文章内图片样式
============================================ */
/* 行内图片, 有边距 */
.article-image {
max-width: 100%;
height: auto;
display: block;
margin: var(--pi-spacing) 0;
}
/* 全宽图片, 无边距 */
.article-image-full {
width: 100%;
height: auto;
display: block;
margin: 0;
}
/* ============================================
Page Number Indicator
页码指示器
============================================ */
.page-number-indicator {
position: absolute;
bottom: 10px;
right: 15px;
font-size: var(--pi-font-size-small);
color: var(--pi-color-text-lighter);
}
/* ============================================
Vertical Alignment (逐页对齐)
============================================ */
.page-body.valign-center .page-content {
display: flex;
flex-direction: column;
justify-content: center;
}
.page-body.valign-bottom .page-content {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
/* ============================================
Content Flow (中间栏内容流)
所有元素按实际尺寸纵向排列
============================================ */
.content-flow {
width: 540px;
padding: 20px;
box-sizing: border-box;
background: #fff;
min-height: 100%;
}
.content-flow-block {
position: relative;
margin-bottom: 0;
}
.content-flow-block img {
max-width: 100%;
height: auto;
display: block;
}
/* --- 分页插入区域 --- */
.break-inserter {
height: 20px;
border-top: 1px dashed #ddd;
display: flex;
align-items: center;
justify-content: center;
margin: 2px 0;
cursor: pointer;
}
.break-inserter:hover {
border-color: var(--pi-color-accent);
background: rgba(24, 144, 255, 0.05);
}
.break-inserter-btn {
opacity: 0;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--pi-color-accent);
color: #fff;
font-size: calc(14px * var(--pi-font-scale, 1));
line-height: 20px;
text-align: center;
border: none;
cursor: pointer;
padding: 0;
}
.break-inserter:hover .break-inserter-btn {
opacity: 1;
}
/* --- 已插入的分页标记 --- */
.page-break-marker {
height: 30px;
background: #fff3f3;
border: 1px dashed #ff4d4f;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
margin: 4px 0;
position: relative;
}
.page-break-marker .break-marker-label {
font-size: calc(12px * var(--pi-font-scale, 1));
color: #ff4d4f;
user-select: none;
}
.page-break-marker .remove-break-btn {
position: absolute;
right: 8px;
top: 50%;
margin-top: -10px;
width: 20px;
height: 20px;
border-radius: 50%;
background: #ff4d4f;
color: #fff;
font-size: calc(14px * var(--pi-font-scale, 1));
line-height: 20px;
text-align: center;
border: none;
cursor: pointer;
padding: 0;
opacity: 0;
}
.page-break-marker:hover .remove-break-btn {
opacity: 1;
}
/* ============================================
Preview Thumbnails (缩略图容器)
============================================ */
.preview-thumbnails {
display: flex;
flex-direction: row;
align-items: flex-start;
gap: 20px;
height: 100%;
padding: 0 10px;
}
.preview-thumb-item {
position: relative;
flex-shrink: 0;
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
}
.preview-thumb-item img,
.preview-thumb-item .preview-thumb-img {
display: block;
border: 1px solid #e0e0e0;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
.preview-thumb-page-num {
display: block;
text-align: center;
font-size: calc(12px * var(--pi-font-scale, 1));
color: #999;
margin-top: 6px;
}
.thumb-alignment-select {
display: block;
height: 22px;
font-size: 11px;
border: 1px solid #d9d9d9;
border-radius: 3px;
padding: 0 2px;
background: #fff;
cursor: pointer;
margin: 4px auto 0;
opacity: 0;
transition: opacity 0.2s;
}
.preview-thumb-item:hover .thumb-alignment-select {
opacity: 1;
}
/* ============================================
Content Flow Code Blocks (中间栏代码块样式)
仅用于编辑区中间栏, 不影响渲染页面
============================================ */
/* 表格美化样式html2canvas兼容 */
.page-content table { width: 100%; border-collapse: collapse; margin: 10px 0; font-size: calc(13px * var(--pi-table-font-scale, 1)); }
.page-content th { background-color: #f0f0f0; font-weight: bold; padding: 4px 10px; border: 1px solid #ddd; text-align: left; }
.page-content td { padding: 4px 10px; border: 1px solid #ddd; }
.page-content tr:nth-child(even) td { background-color: #f9f9f9; }
.content-flow pre {
background: #f5f5f5;
border: 1px solid #e0e0e0;
border-radius: 4px;
padding: 12px;
overflow-x: auto;
font-size: calc(13px * var(--pi-font-scale, 1));
line-height: 1.6;
margin: 10px 0;
}
.content-flow code {
font-family: 'Courier New', Consolas, monospace;
font-size: calc(13px * var(--pi-font-scale, 1));
}
.content-flow pre code {
background: none;
border: none;
padding: 0;
}
/* 中间栏表格样式 */
.content-flow-block table { width: 100%; border-collapse: collapse; margin: 10px 0; font-size: calc(13px * var(--pi-table-font-scale, 1)); }
.content-flow-block th { background-color: #f0f0f0; font-weight: bold; padding: 4px 10px; border: 1px solid #ddd; text-align: left; }
.content-flow-block td { padding: 4px 10px; border: 1px solid #ddd; }
.content-flow-block tr:nth-child(even) td { background-color: #f9f9f9; }
/* ============================================
Page Layout Shell (页面布局外壳)
两栏布局:左侧编辑器 + 右侧预览
这些样式替代 phone-image.html 中的 inline style
============================================ */
/* --- 顶部操作栏(限定 body > 直接子元素,避免与模板 .page-header 冲突) --- */
body > .page-header {
background: #fff;
padding: 10px 20px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
height: 52px;
box-sizing: border-box;
z-index: 100;
position: relative;
}
body > .page-header-left {
display: flex;
align-items: center;
gap: 10px;
}
body > .page-header-left h3 {
margin: 0;
font-size: 16px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 300px;
color: var(--pi-color-text);
}
body > .page-header-right {
display: flex;
align-items: center;
gap: 8px;
}
/* 操作栏按钮统一样式 */
body > .page-header-right .layui-btn {
font-size: 13px;
border-radius: 2px;
}
body > .page-header-right .layui-btn i {
font-size: 13px;
margin-right: 3px;
}
/* 按钮组去掉多余边框 */
body > .page-header-right .layui-btn-group {
margin: 0;
vertical-align: middle;
}
body > .page-header-right .layui-btn-group .layui-btn {
border-radius: 0;
margin: 0;
}
body > .page-header-right .layui-btn-group .layui-btn:first-child {
border-radius: 2px 0 0 2px;
}
body > .page-header-right .layui-btn-group .layui-btn:last-child {
border-radius: 0 2px 2px 0;
}
/* 返回按钮 */
body > .page-header-left .layui-btn-primary:hover {
color: var(--pi-color-accent);
border-color: var(--pi-color-accent);
}
/* 主操作按钮 hover */
body > .page-header-right .layui-btn-normal:hover {
opacity: 0.85;
}
body > .page-header-right .layui-btn:not(.layui-btn-primary):not(.layui-btn-normal):hover {
opacity: 0.9;
}
/* 更多下拉菜单可读性优化 */
.layui-dropdown-menu {
min-width: 130px;
font-size: 13px;
}
.layui-dropdown-menu li {
padding: 8px 16px;
cursor: pointer;
transition: background 0.15s;
}
.layui-dropdown-menu li:hover {
background: rgba(24, 144, 255, 0.06);
color: var(--pi-color-accent);
}
.more-dropdown-menu li:hover {
background: rgba(24, 144, 255, 0.06);
color: var(--pi-color-accent);
}
/* --- 主布局两栏 --- */
.main-layout {
display: flex;
height: calc(100vh - 52px);
}
/* ============================================
Editor Area (wangeditor 编辑区)
左侧编辑栏容器与工具栏
============================================ */
.content-flow-area {
width: 540px;
overflow-y: auto;
border-right: 1px solid #e8e8e8;
background: #fafafa;
flex-shrink: 0;
}
#editor-toolbar {
width: 540px;
border-bottom: 1px solid #e8e8e8;
background: #fff;
position: sticky;
top: 0;
z-index: 10;
box-sizing: border-box;
}
/* ============================================
Editor Content - Basic Readability
编辑器容器仅保留基础可读性样式
============================================ */
/* Editor container - basic readability only */
#editor-text-area {
font-family: var(--pi-font-family);
font-size: var(--pi-font-size-base);
line-height: var(--pi-line-height);
color: var(--pi-color-text);
width: 540px;
min-height: 300px;
padding: 10px;
background: #fff;
box-sizing: border-box;
}
/* Keep images constrained in editor */
#editor-text-area img {
max-width: 100%;
height: auto;
}
/* ============================================
Render Preview Area (渲染预览区排版样式)
中间预览列的完整排版样式
============================================ */
#render-preview {
font-family: var(--pi-font-family);
font-size: calc(14px * var(--pi-font-scale, 1));
line-height: var(--pi-line-height);
color: var(--pi-color-text);
}
/* 预览区标题字号 */
#render-preview h1 {
font-size: calc(22px * var(--pi-font-scale, 1));
font-weight: bold;
letter-spacing: 1px;
margin-top: 24px;
margin-bottom: 12px;
line-height: 1.4;
}
#render-preview h2 {
font-weight: normal;
font-size: calc(18px * var(--pi-font-scale, 1));
letter-spacing: 1px;
margin-top: 24px;
margin-bottom: 12px;
}
#render-preview h3 {
font-weight: normal;
font-size: calc(16px * var(--pi-font-scale, 1));
margin-top: 20px;
margin-bottom: 10px;
}
#render-preview h4 {
font-size: calc(14px * var(--pi-font-scale, 1));
font-weight: bold;
margin-top: 10px;
margin-bottom: 5px;
}
#render-preview h5 {
font-size: calc(13px * var(--pi-font-scale, 1));
font-weight: bold;
margin-top: 10px;
margin-bottom: 5px;
}
#render-preview h6 {
font-size: calc(12px * var(--pi-font-scale, 1));
font-weight: bold;
margin-top: 10px;
margin-bottom: 5px;
color: #999;
}
/* 预览区段落 */
#render-preview p {
text-indent: 2em;
margin-bottom: 16px;
color: #333;
}
/* 预览区图片 */
#render-preview img {
max-width: 100% !important;
height: auto !important;
display: block;
margin: 10px 0;
}
/* 预览区表格 */
#render-preview table {
width: 100%;
border-collapse: collapse;
margin: 10px 0;
font-size: calc(13px * var(--pi-font-scale, 1));
}
#render-preview th {
background-color: #f0f0f0;
font-weight: bold;
padding: 4px 10px;
border: 1px solid #ddd;
text-align: left;
}
#render-preview td {
padding: 4px 10px;
border: 1px solid #ddd;
}
#render-preview tr:nth-child(even) td {
background-color: #f9f9f9;
}
/* 预览区代码块 */
#render-preview pre {
background: #f5f5f5;
border: 1px solid #e0e0e0;
border-radius: 4px;
padding: 12px;
overflow-x: auto;
font-size: calc(13px * var(--pi-font-scale, 1));
line-height: 1.6;
margin: 10px 0;
}
#render-preview code {
font-family: 'Courier New', Consolas, monospace;
font-size: calc(13px * var(--pi-font-scale, 1));
}
#render-preview pre code {
background: none;
border: none;
padding: 0;
}
/* 预览区引用 */
#render-preview blockquote {
border-left: 1px solid #ccc;
font-style: normal;
color: #888;
padding-left: 15px;
margin: 10px 0;
}
/* 预览区列表 */
#render-preview ul {
list-style-type: disc;
padding-left: 20px;
margin-bottom: 10px;
}
#render-preview ol {
list-style-type: decimal;
padding-left: 20px;
margin-bottom: 10px;
}
#render-preview li {
margin-bottom: 5px;
display: list-item;
}
/* DOM分页预览列表 */
.dom-page-content ul {
list-style-type: disc;
padding-left: 20px;
margin-bottom: 10px;
}
.dom-page-content ol {
list-style-type: decimal;
padding-left: 20px;
margin-bottom: 10px;
}
.dom-page-content li {
margin-bottom: 5px;
display: list-item;
}
/* ============================================
Divider / 分割线样式 (wangeditor divider)
保留 wangeditor 默认分割线样式,不覆盖
分割线用于标记分页位置
============================================ */
/* ============================================
Settings Dialog (设置弹框表单样式)
============================================ */
.settings-form {
padding: 20px 20px 0;
}
.settings-form .layui-form-item {
margin-bottom: 15px;
}
.settings-form .layui-form-label {
width: 60px;
font-size: 13px;
color: var(--pi-color-text-light);
}
.settings-form .layui-input-block {
margin-left: 90px;
}
.settings-form .layui-input {
border-radius: 2px;
font-size: 13px;
}
.settings-form .layui-select {
border-radius: 2px;
}
.settings-form .layui-form-select dl {
font-size: 13px;
}
/* ============================================
Preview Area (右侧预览区域)
============================================ */
.paginated-preview-area {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
background: #f5f5f5;
}
.preview-thumb-zone {
flex: 1;
overflow-x: auto;
overflow-y: hidden;
padding: 20px;
min-height: 0;
}
#paginated-preview {
display: flex;
flex-direction: row;
align-items: flex-start;
gap: 20px;
padding: 0 10px;
}
/* 封面文案样式(替代内联font-size,支持字号缩放) */
.cover-text-inline {
font-size: calc(14px * var(--pi-font-scale, 1));
color: #1890ff;
margin-top: 8px;
}
.cover-text-inline.cover-text-no-img {
margin-top: 10px;
padding: 0 30px;
word-break: break-word;
}
/* 操作日志面板 */
.log-panel {
height: 200px;
flex-shrink: 0;
border-top: 1px solid #e8e8e8;
display: flex;
flex-direction: column;
background: #1e1e1e;
color: #d4d4d4;
font-family: Consolas, 'Courier New', monospace;
font-size: 12px;
}
.log-panel.collapsed {
height: auto;
}
.log-panel.collapsed .log-panel-body {
display: none;
}
.log-panel-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 10px;
background: #2d2d2d;
border-bottom: 1px solid #3e3e3e;
flex-shrink: 0;
}
.log-panel-body {
flex: 1;
overflow-y: auto;
padding: 4px 10px;
min-height: 0;
}
.log-panel-actions {
display: flex;
gap: 6px;
}
.log-entry {
padding: 2px 0;
line-height: 1.5;
border-bottom: 1px solid #2a2a2a;
}
.log-info { color: #4fc3f7; }
.log-warn { color: #ffb74d; }
.log-error { color: #ef5350; }
.log-success { color: #81c784; }
.log-time {
color: #888;
margin-right: 8px;
}
/* ============================================
DOM Page Container (DOM分页预览容器)
右侧分页预览区使用纯DOM渲染,不依赖截图
JS动态填充这些容器
============================================ */
/* --- DOM分页容器基础 --- */
.dom-page-container {
background: #ffffff;
overflow: hidden;
position: relative;
box-sizing: border-box;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
text-align: left;
}
/* 尺寸 - 复用size class模式 */
.size-xiaohongshu .dom-page-container {
width: 540px;
height: 720px;
}
.size-douyin .dom-page-container {
width: 540px;
height: 960px;
}
/* --- DOM分页品牌标识头 --- */
.dom-page-brand-header {
height: 36px;
display: flex;
align-items: center;
padding: 0 20px;
font-size: 13px;
border-bottom: 1px solid #f0f0f0;
flex-shrink: 0;
}
.dom-page-brand-header img {
height: 20px;
margin-right: 8px;
}
.dom-page-brand-header span {
color: #666;
}
/* --- DOM分页内容区域 --- */
.dom-page-content {
padding: 20px;
overflow: hidden;
box-sizing: border-box;
height: calc(100% - 36px - 30px);
font-size: calc(14px * var(--pi-font-scale, 1));
line-height: 1.8;
word-break: break-word;
text-align: left;
}
/* DOM分页内容区对齐支持 (复用valign模式) */
.dom-page-content.valign-center {
display: flex;
flex-direction: column;
justify-content: center;
text-align: left;
}
.dom-page-content.valign-bottom {
display: flex;
flex-direction: column;
justify-content: flex-end;
text-align: left;
}
/* --- DOM分页页码 --- */
.dom-page-footer {
position: absolute;
bottom: 0;
left: 0;
right: 0;
text-align: center;
padding: 6px 0;
font-size: 11px;
color: #999;
border-top: 1px solid #f5f5f5;
background: #fff;
}
/* --- 纯图片页 --- */
.dom-page-pure-image .dom-page-content {
display: flex;
align-items: center;
justify-content: center;
padding: 0;
}
.dom-page-pure-image .dom-page-content img {
max-width: 100%;
height: auto;
display: block;
}
/* ============================================
DOM分页内容区代码块样式
参照 #render-preview pre (L926-935)
============================================ */
.dom-page-content pre {
background: #f6f8fa;
border-radius: 6px;
padding: 12px 16px;
overflow-x: auto;
font-size: calc(13px * var(--pi-code-font-scale, 1));
line-height: 1.6;
margin: 10px 0;
}
.dom-page-content code {
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
font-size: calc(13px * var(--pi-code-font-scale, 1));
}
.dom-page-content pre code {
background: none;
padding: 0;
border-radius: 0;
}