feat(knowledge): 知识库 wiki/知识图谱重构,新增发布广场选择弹窗

- 知识库页拆分出 wiki 组件(侧边栏/目录树/Markdown 阅读器等)
- 知识图谱页拆分出 knowledge-graph 组件并增强交互
- 新增发布广场选择弹窗 publish-square-picker-dialog
- config.yaml 新增 MiniMax-M2.5 / Ling-flash-2.0 / DeepSeek-V4-Pro 模型

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
吉鑫升andClaude Opus 4.8 committed 2026-06-11 14:52:25 +08:00
1 parent f0aec4cd7f
commit e684de30bd
30 files changed
+4827 -682

No files matched your search

@@ -0,0 +1,779 @@
/* Knowledge-graph workbench — dark, professional analysis-tool styling. */
.kg-page {
--kg-bg: #0b1020;
--kg-panel: rgba(15, 23, 42, 0.78);
--kg-panel-solid: #0f172a;
--kg-border: rgba(148, 163, 184, 0.18);
--kg-text-main: #e5e7eb;
--kg-text-secondary: #94a3b8;
--kg-text-muted: #64748b;
--kg-primary: #38bdf8;
--kg-primary-soft: rgba(56, 189, 248, 0.16);
height: 100%;
min-height: 0;
background:
radial-gradient(circle at 20% 10%, rgba(56, 189, 248, 0.1), transparent 32%),
radial-gradient(circle at 80% 20%, rgba(167, 139, 250, 0.1), transparent 28%),
#0b1020;
color: var(--kg-text-main);
display: flex;
flex-direction: column;
overflow: hidden;
}
/* ------------------------------------------------------------------ header */
.kg-header {
height: 56px;
border-bottom: 1px solid var(--kg-border);
background: rgba(15, 23, 42, 0.86);
backdrop-filter: blur(14px);
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 0 18px;
flex-shrink: 0;
}
.kg-header-left {
display: flex;
align-items: center;
gap: 14px;
min-width: 0;
}
.kg-back {
height: 32px;
padding: 0 10px;
border-radius: 8px;
border: none;
background: transparent;
color: var(--kg-text-main);
font-size: 13px;
display: inline-flex;
align-items: center;
gap: 6px;
cursor: pointer;
flex-shrink: 0;
}
.kg-back:hover {
background: rgba(148, 163, 184, 0.12);
}
.kg-title-block {
display: flex;
align-items: baseline;
gap: 10px;
min-width: 0;
}
.kg-title {
font-size: 18px;
font-weight: 800;
color: #ffffff;
white-space: nowrap;
}
.kg-subtitle {
font-size: 12px;
color: var(--kg-text-secondary);
white-space: nowrap;
}
.kg-stat-pills {
display: flex;
align-items: center;
gap: 8px;
}
.kg-stat-pill {
height: 28px;
padding: 0 10px;
border-radius: 999px;
background: rgba(56, 189, 248, 0.12);
border: 1px solid rgba(56, 189, 248, 0.28);
color: #bae6fd;
font-size: 12px;
display: inline-flex;
align-items: center;
gap: 4px;
white-space: nowrap;
}
.kg-stat-pill.kg-stat-pill-violet {
background: rgba(167, 139, 250, 0.12);
border-color: rgba(167, 139, 250, 0.28);
color: #ddd6fe;
}
.kg-header-actions {
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
}
.kg-icon-button {
height: 34px;
min-width: 34px;
padding: 0 8px;
border-radius: 9px;
border: 1px solid var(--kg-border);
background: rgba(15, 23, 42, 0.65);
color: #cbd5e1;
font-size: 12px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
cursor: pointer;
transition:
background 0.15s ease,
color 0.15s ease,
border-color 0.15s ease;
}
.kg-icon-button:hover {
color: #ffffff;
background: rgba(56, 189, 248, 0.14);
border-color: rgba(56, 189, 248, 0.35);
}
.kg-icon-button:disabled {
opacity: 0.5;
cursor: default;
}
.kg-icon-button.kg-icon-button-active {
color: #ffffff;
background: rgba(56, 189, 248, 0.18);
border-color: rgba(56, 189, 248, 0.45);
}
.kg-header-divider {
width: 1px;
height: 20px;
background: var(--kg-border);
margin: 0 2px;
}
/* -------------------------------------------------------------------- body */
.kg-body {
flex: 1;
min-height: 0;
display: grid;
grid-template-columns: 280px minmax(0, 1fr) 320px;
gap: 12px;
padding: 12px;
}
.kg-body.kg-hide-left {
grid-template-columns: minmax(0, 1fr) 320px;
}
.kg-body.kg-hide-right {
grid-template-columns: 280px minmax(0, 1fr);
}
.kg-body.kg-hide-left.kg-hide-right {
grid-template-columns: minmax(0, 1fr);
}
.kg-panel {
background: var(--kg-panel);
border: 1px solid var(--kg-border);
border-radius: 16px;
backdrop-filter: blur(14px);
overflow: hidden;
min-height: 0;
display: flex;
flex-direction: column;
}
.kg-panel-header {
height: 46px;
padding: 0 16px;
border-bottom: 1px solid rgba(148, 163, 184, 0.14);
display: flex;
align-items: center;
justify-content: space-between;
flex-shrink: 0;
}
.kg-panel-title {
font-size: 14px;
font-weight: 700;
color: var(--kg-text-main);
}
.kg-panel-content {
padding: 14px;
overflow-y: auto;
min-height: 0;
flex: 1;
scrollbar-width: thin;
scrollbar-color: rgba(148, 163, 184, 0.3) transparent;
}
/* ----------------------------------------------------------------- sidebar */
.kg-search-wrap {
position: relative;
}
.kg-search-wrap > svg {
position: absolute;
left: 11px;
top: 50%;
transform: translateY(-50%);
color: var(--kg-text-muted);
pointer-events: none;
}
.kg-search {
height: 36px;
width: 100%;
border-radius: 10px;
border: 1px solid rgba(148, 163, 184, 0.2);
background: rgba(2, 6, 23, 0.45);
color: var(--kg-text-main);
padding: 0 12px 0 32px;
font-size: 13px;
outline: none;
}
.kg-search::placeholder {
color: var(--kg-text-muted);
}
.kg-search:focus {
border-color: rgba(56, 189, 248, 0.55);
box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.1);
}
.kg-search-hint {
margin-top: 6px;
font-size: 12px;
color: var(--kg-text-muted);
}
.kg-search-hint.kg-search-hint-warn {
color: #fbbf24;
}
.kg-filter-section {
margin-top: 18px;
}
.kg-filter-title {
font-size: 12px;
font-weight: 700;
color: var(--kg-text-secondary);
margin-bottom: 8px;
letter-spacing: 0.02em;
}
.kg-check-row {
min-height: 30px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
color: #cbd5e1;
font-size: 13px;
cursor: pointer;
border-radius: 8px;
padding: 0 6px;
user-select: none;
}
.kg-check-row:hover {
background: rgba(148, 163, 184, 0.08);
}
.kg-check-row-main {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
.kg-check-row input[type="checkbox"] {
accent-color: #38bdf8;
width: 14px;
height: 14px;
flex-shrink: 0;
}
.kg-check-row .kg-legend-dot {
flex-shrink: 0;
}
.kg-check-label {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.kg-count {
color: var(--kg-text-muted);
font-size: 12px;
flex-shrink: 0;
}
.kg-stats-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.kg-stat-card {
border-radius: 10px;
border: 1px solid rgba(148, 163, 184, 0.12);
background: rgba(2, 6, 23, 0.35);
padding: 8px 10px;
}
.kg-stat-card-value {
font-size: 16px;
font-weight: 800;
color: #ffffff;
}
.kg-stat-card-label {
font-size: 11px;
color: var(--kg-text-muted);
margin-top: 2px;
}
.kg-rank-item {
display: flex;
gap: 8px;
padding: 8px 6px;
border-bottom: 1px solid rgba(148, 163, 184, 0.08);
cursor: pointer;
border-radius: 8px;
}
.kg-rank-item:hover {
background: rgba(56, 189, 248, 0.08);
}
.kg-rank-index {
width: 20px;
color: var(--kg-primary);
font-weight: 700;
font-size: 12px;
flex-shrink: 0;
}
.kg-rank-title {
flex: 1;
color: #cbd5e1;
font-size: 12px;
line-height: 1.5;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.kg-rank-degree {
color: var(--kg-text-muted);
font-size: 11px;
flex-shrink: 0;
}
.kg-text-button {
border: none;
background: transparent;
color: var(--kg-primary);
font-size: 12px;
cursor: pointer;
padding: 0;
}
.kg-text-button:hover {
text-decoration: underline;
}
/* ------------------------------------------------------------------ canvas */
.kg-canvas-wrap {
position: relative;
background:
linear-gradient(rgba(148, 163, 184, 0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(148, 163, 184, 0.04) 1px, transparent 1px),
radial-gradient(circle at 50% 40%, rgba(56, 189, 248, 0.08), transparent 42%),
rgba(2, 6, 23, 0.5);
background-size:
28px 28px,
28px 28px,
auto,
auto;
border: 1px solid var(--kg-border);
border-radius: 18px;
overflow: hidden;
min-width: 0;
min-height: 0;
}
.kg-canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
display: block;
touch-action: none;
}
.kg-canvas-toolbar {
position: absolute;
top: 14px;
left: 14px;
z-index: 10;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
}
.kg-floating-pill {
height: 32px;
padding: 0 6px;
border-radius: 999px;
background: rgba(15, 23, 42, 0.82);
border: 1px solid var(--kg-border);
color: #cbd5e1;
font-size: 12px;
display: inline-flex;
align-items: center;
gap: 2px;
backdrop-filter: blur(12px);
}
.kg-pill-label {
padding: 0 6px;
color: var(--kg-text-muted);
}
.kg-pill-button {
height: 24px;
padding: 0 10px;
border-radius: 999px;
border: none;
background: transparent;
color: #cbd5e1;
font-size: 12px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 4px;
}
.kg-pill-button:hover {
color: #ffffff;
}
.kg-pill-button.kg-pill-button-active {
background: rgba(56, 189, 248, 0.18);
color: #ffffff;
}
.kg-minimap {
position: absolute;
right: 14px;
bottom: 14px;
width: 180px;
height: 120px;
border-radius: 12px;
background: rgba(15, 23, 42, 0.78);
border: 1px solid var(--kg-border);
overflow: hidden;
z-index: 10;
pointer-events: none;
}
.kg-canvas-status {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
text-align: center;
color: var(--kg-text-secondary);
padding: 32px;
z-index: 5;
}
.kg-canvas-status-title {
font-size: 16px;
font-weight: 700;
color: var(--kg-text-main);
}
.kg-canvas-status-desc {
font-size: 13px;
line-height: 1.8;
max-width: 360px;
color: var(--kg-text-muted);
}
/* ----------------------------------------------------------------- tooltip */
.kg-tooltip {
position: fixed;
z-index: 999;
max-width: 320px;
padding: 12px;
border-radius: 12px;
background: rgba(15, 23, 42, 0.94);
border: 1px solid rgba(56, 189, 248, 0.25);
box-shadow: 0 18px 40px rgba(0, 0, 0, 0.35);
color: var(--kg-text-main);
pointer-events: none;
backdrop-filter: blur(14px);
}
.kg-tooltip-title {
font-size: 13px;
font-weight: 700;
margin-bottom: 6px;
line-height: 1.5;
}
.kg-tooltip-desc {
font-size: 12px;
color: var(--kg-text-secondary);
line-height: 1.6;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 6px;
}
.kg-tooltip-hint {
margin-top: 8px;
font-size: 11px;
color: var(--kg-text-muted);
}
/* ------------------------------------------------------------------ detail */
.kg-detail-empty {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
color: var(--kg-text-muted);
padding: 32px;
gap: 10px;
font-size: 13px;
line-height: 1.8;
}
.kg-detail-empty-title {
color: var(--kg-text-secondary);
font-size: 14px;
font-weight: 600;
}
.kg-detail-title {
font-size: 17px;
line-height: 1.5;
font-weight: 800;
color: #ffffff;
margin-bottom: 10px;
word-break: break-word;
}
.kg-detail-type {
display: inline-flex;
height: 24px;
padding: 0 9px;
border-radius: 999px;
font-size: 12px;
align-items: center;
gap: 6px;
margin-right: 6px;
margin-bottom: 12px;
}
.kg-detail-summary {
color: #cbd5e1;
font-size: 13px;
line-height: 1.8;
margin-bottom: 16px;
word-break: break-word;
}
.kg-detail-meta {
display: grid;
grid-template-columns: 72px 1fr;
row-gap: 8px;
column-gap: 8px;
font-size: 12px;
margin-bottom: 16px;
}
.kg-detail-meta-label {
color: var(--kg-text-muted);
}
.kg-detail-meta-value {
color: #cbd5e1;
word-break: break-word;
}
.kg-tag-list {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 16px;
}
.kg-tag {
height: 24px;
padding: 0 8px;
border-radius: 999px;
background: rgba(148, 163, 184, 0.12);
color: #cbd5e1;
font-size: 12px;
display: inline-flex;
align-items: center;
}
.kg-detail-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 18px;
}
.kg-detail-section-title {
font-size: 12px;
font-weight: 700;
color: var(--kg-text-secondary);
margin: 0 0 8px;
}
.kg-neighbor-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.kg-neighbor-item {
padding: 8px 10px;
border-radius: 10px;
background: rgba(2, 6, 23, 0.35);
border: 1px solid rgba(148, 163, 184, 0.1);
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
}
.kg-neighbor-item:hover {
background: rgba(56, 189, 248, 0.1);
border-color: rgba(56, 189, 248, 0.24);
}
.kg-neighbor-title {
flex: 1;
min-width: 0;
font-size: 12px;
color: #cbd5e1;
line-height: 1.5;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.kg-neighbor-relation {
font-size: 11px;
flex-shrink: 0;
}
/* ------------------------------------------------------------------ footer */
.kg-footer {
min-height: 42px;
margin: 0 12px 12px;
border-radius: 14px;
background: var(--kg-panel);
border: 1px solid var(--kg-border);
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 4px 14px;
color: var(--kg-text-secondary);
font-size: 12px;
flex-shrink: 0;
flex-wrap: wrap;
}
.kg-legend {
display: flex;
align-items: center;
gap: 14px;
flex-wrap: wrap;
}
.kg-legend-item {
display: flex;
align-items: center;
gap: 6px;
white-space: nowrap;
}
.kg-legend-dot {
width: 9px;
height: 9px;
border-radius: 999px;
}
.kg-legend-line {
width: 20px;
height: 0;
border-top-width: 2px;
border-top-style: solid;
border-radius: 999px;
}
.kg-footer-status {
display: flex;
align-items: center;
gap: 14px;
flex-wrap: wrap;
white-space: nowrap;
}
.kg-footer-selected {
max-width: 240px;
overflow: hidden;
text-overflow: ellipsis;
color: #bae6fd;
}
/* -------------------------------------------------------------- responsive */
@media (max-width: 1100px) {
.kg-header .kg-button-text {
display: none;
}
.kg-subtitle {
display: none;
}
}