diff --git a/docs/project_context.md b/docs/project_context.md
index 5f5560b..45f76a2 100644
--- a/docs/project_context.md
+++ b/docs/project_context.md
@@ -808,3 +808,9 @@
- CellData「规则设置」弹窗中的映射规则增加“图形化 / JSON”切换。图形化模式可维护目标表、主键字段、主键表达式、来源目录、CSV 前缀和字段映射;字段映射支持“CSV 字段”和“固定值”两种模式。
- JSON 模式仍使用 Monaco 编辑器,支持格式化、校验、恢复默认;两种模式共用同一份 `CellData.mapping` JSON,切换时自动互转。
- 验证:`frontend` `npm run build` 通过;构建产物已清理。
+
+## 2026-06-25:固定图形化映射基础区与添加来源按钮
+
+- CellData「规则设置」弹窗不再整体滚动;高级匹配、目标表、主键字段和主键表达式固定显示,图形化模式下仅来源列表滚动。
+- “添加来源”按钮固定在来源列表下方,始终可见;弹窗底部保存按钮也保持可见。
+- 验证:`frontend` `npm run build` 通过;构建产物已清理。
diff --git a/frontend/src/components/SettingsPanel.vue b/frontend/src/components/SettingsPanel.vue
index 26b9d43..a798500 100644
--- a/frontend/src/components/SettingsPanel.vue
+++ b/frontend/src/components/SettingsPanel.vue
@@ -774,7 +774,9 @@
添加字段
- 添加来源
+
+ 添加来源
+
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index 29caa05..6525e4e 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -1640,16 +1640,24 @@ select {
}
.cell-data-settings-body {
- display: grid;
+ display: flex;
+ height: min(68vh, 680px);
+ min-height: 0;
+ flex-direction: column;
gap: 14px;
- max-height: 68vh;
- overflow-y: auto;
padding-right: 4px;
+ overflow: hidden;
}
.cell-data-settings-section {
display: grid;
+ flex: 0 0 auto;
gap: 8px;
+ min-height: 0;
+}
+
+.cell-data-settings-section:last-child {
+ flex: 1 1 auto;
}
.cell-data-section-title {
@@ -1668,12 +1676,16 @@ select {
}
.cell-data-mapping-form,
-.cell-data-source-list,
.cell-data-source-card {
display: grid;
gap: 10px;
}
+.cell-data-mapping-form {
+ min-height: 0;
+ grid-template-rows: auto minmax(0, 1fr) auto;
+}
+
.cell-data-mapping-key {
display: grid;
grid-template-columns: minmax(140px, 0.8fr) minmax(120px, 0.6fr) minmax(240px, 1.4fr);
@@ -1687,6 +1699,19 @@ select {
border-radius: var(--td-radius-default);
}
+.cell-data-source-list {
+ display: grid;
+ gap: 10px;
+ min-height: 0;
+ overflow-y: auto;
+ padding-right: 4px;
+}
+
+.cell-data-mapping-actions {
+ display: flex;
+ justify-content: flex-start;
+}
+
.cell-data-source-header,
.cell-data-source-meta,
.cell-data-field-row {