@lemoncat7/dsh-knowledge 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +45 -82
- package/lib/client.js.map +2 -2
- package/lib/theme-bridge.d.ts +2 -2
- package/lib/theme-bridge.d.ts.map +1 -1
- package/lib/theme-bridge.js +24 -57
- package/lib/theme-bridge.js.map +1 -1
- package/lib/web-workspace-effects.d.ts +13 -0
- package/lib/web-workspace-effects.d.ts.map +1 -0
- package/lib/web-workspace-effects.js +340 -0
- package/lib/web-workspace-effects.js.map +1 -0
- package/lib/web.d.ts.map +1 -1
- package/lib/web.js +1 -0
- package/lib/web.js.map +1 -1
- package/package.json +1 -1
- package/web/app.js +54 -5
- package/web/index.html +1 -0
- package/web/styles.css +445 -134
- package/web/workspace-effects.js +16 -0
package/web/app.js
CHANGED
|
@@ -242,6 +242,10 @@ function element(tag, attributes = {}, ...children) {
|
|
|
242
242
|
return node
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
+
function refreshWorkspaceEffects(root = document) {
|
|
246
|
+
window.DshKnowledgeEffects?.refresh(root)
|
|
247
|
+
}
|
|
248
|
+
|
|
245
249
|
function actionButton(label, onClick, variant = '', attributes = {}) {
|
|
246
250
|
return element('button', { type: 'button', class: `button ${variant}`.trim(), onClick, ...attributes }, label)
|
|
247
251
|
}
|
|
@@ -434,6 +438,7 @@ function renderLogin(message = '') {
|
|
|
434
438
|
element('p', {}, '管理对话中沉淀的长期知识与 AI 提取候选。'),
|
|
435
439
|
form,
|
|
436
440
|
)))
|
|
441
|
+
refreshWorkspaceEffects(app)
|
|
437
442
|
}
|
|
438
443
|
|
|
439
444
|
function signOut() {
|
|
@@ -1035,6 +1040,8 @@ function renderShell() {
|
|
|
1035
1040
|
if (event.target === shell) { state.menuOpen = false; renderShell() }
|
|
1036
1041
|
})
|
|
1037
1042
|
app.replaceChildren(shell)
|
|
1043
|
+
applySidebarVisibility(shell, state.documentView.sidebarHidden)
|
|
1044
|
+
refreshWorkspaceEffects(shell)
|
|
1038
1045
|
restoreScrollPosition(currentScrollState())
|
|
1039
1046
|
}
|
|
1040
1047
|
|
|
@@ -1100,7 +1107,33 @@ function setSidebarWidth(width, shell, handle) {
|
|
|
1100
1107
|
function setSidebarHidden(hidden) {
|
|
1101
1108
|
state.documentView.sidebarHidden = hidden
|
|
1102
1109
|
saveDocumentLayout()
|
|
1103
|
-
|
|
1110
|
+
const shell = app.querySelector('.app-shell')
|
|
1111
|
+
if (shell) applySidebarVisibility(shell, hidden)
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
function applySidebarVisibility(shell, hidden) {
|
|
1115
|
+
shell.dataset.sidebarHidden = String(hidden)
|
|
1116
|
+
const sidebar = shell.querySelector(':scope > .sidebar')
|
|
1117
|
+
const resizer = shell.querySelector(':scope > .app-sidebar-resizer')
|
|
1118
|
+
const toggle = shell.querySelector('.pane-toggle-button[data-pane="main"]')
|
|
1119
|
+
sidebar?.toggleAttribute('inert', hidden)
|
|
1120
|
+
resizer?.toggleAttribute('inert', hidden)
|
|
1121
|
+
if (sidebar) {
|
|
1122
|
+
if (hidden) sidebar.setAttribute('aria-hidden', 'true')
|
|
1123
|
+
else sidebar.removeAttribute('aria-hidden')
|
|
1124
|
+
}
|
|
1125
|
+
if (resizer) {
|
|
1126
|
+
resizer.tabIndex = hidden ? -1 : 0
|
|
1127
|
+
if (hidden) resizer.setAttribute('aria-hidden', 'true')
|
|
1128
|
+
else resizer.removeAttribute('aria-hidden')
|
|
1129
|
+
}
|
|
1130
|
+
if (toggle) {
|
|
1131
|
+
const visible = !hidden
|
|
1132
|
+
const action = `${visible ? '隐藏' : '显示'}主导航栏`
|
|
1133
|
+
toggle.setAttribute('aria-pressed', String(visible))
|
|
1134
|
+
toggle.setAttribute('aria-label', action)
|
|
1135
|
+
toggle.title = action
|
|
1136
|
+
}
|
|
1104
1137
|
}
|
|
1105
1138
|
|
|
1106
1139
|
function renderSidebar() {
|
|
@@ -1388,7 +1421,10 @@ function renderKnowledgeBaseCard(base) {
|
|
|
1388
1421
|
const archived = base.status === 'archived'
|
|
1389
1422
|
const visibleTags = base.defaultTags.slice(0, 4)
|
|
1390
1423
|
const hiddenTagCount = Math.max(0, base.defaultTags.length - visibleTags.length)
|
|
1391
|
-
return element('article', {
|
|
1424
|
+
return element('article', {
|
|
1425
|
+
class: `base-card${archived ? ' is-archived' : ''}`,
|
|
1426
|
+
'data-knowledge-motion-key': `knowledge-library:${base.id}`,
|
|
1427
|
+
},
|
|
1392
1428
|
element('div', { class: 'base-card-header' },
|
|
1393
1429
|
element('div', { class: 'base-card-identity' },
|
|
1394
1430
|
element('span', { class: 'base-symbol', 'aria-hidden': 'true' }, base.name.trim().slice(0, 1).toLocaleUpperCase() || 'K'),
|
|
@@ -1520,7 +1556,11 @@ function renderMountListRow(base, view, targetKind, targetId) {
|
|
|
1520
1556
|
},
|
|
1521
1557
|
})
|
|
1522
1558
|
const modelLabel = writebackRouteLabel(base)
|
|
1523
|
-
return element('article', {
|
|
1559
|
+
return element('article', {
|
|
1560
|
+
class: `mount-list-row${selected ? ' is-selected' : ''}`,
|
|
1561
|
+
role: 'listitem',
|
|
1562
|
+
'data-knowledge-motion-key': `knowledge-mount:${targetKind}:${base.id}`,
|
|
1563
|
+
},
|
|
1524
1564
|
element('label', { class: 'mount-select' }, checkbox, element('span', { class: 'visually-hidden' }, `选择 ${base.name}`)),
|
|
1525
1565
|
element('div', { class: 'mount-list-main' },
|
|
1526
1566
|
element('div', { class: 'mount-list-title' }, element('strong', {}, base.name), badge(view.statusLabel, view.statusVariant), badge(modelLabel)),
|
|
@@ -1591,9 +1631,12 @@ function renderDocumentWorkspace(workspace, options = {}) {
|
|
|
1591
1631
|
const expanded = view.expandedBases.has(base.id) || Boolean(query)
|
|
1592
1632
|
const page = documentPageState(workspace, base.id)
|
|
1593
1633
|
const documents = (query ? view.searchResults : workspaceDocuments).filter(document => document.knowledgeBaseId === base.id)
|
|
1594
|
-
return element('section', {
|
|
1634
|
+
return element('section', {
|
|
1635
|
+
class: 'note-tree-group', 'data-expanded': String(expanded),
|
|
1636
|
+
},
|
|
1595
1637
|
element('button', {
|
|
1596
1638
|
type: 'button', class: 'note-tree-base', 'aria-expanded': String(expanded),
|
|
1639
|
+
'data-knowledge-motion-key': `knowledge-base:${workspace.kind}:${base.id}`,
|
|
1597
1640
|
onClick: () => {
|
|
1598
1641
|
if (query) { view.knowledgeBaseId = base.id; return renderShell() }
|
|
1599
1642
|
void toggleDocumentBase(workspace, base.id)
|
|
@@ -1610,6 +1653,8 @@ function renderDocumentWorkspace(workspace, options = {}) {
|
|
|
1610
1653
|
actionButton('重试', () => { void loadDocumentPage(workspace, base.id, { reset: true }).then(renderShell) }, 'ghost small')) : null,
|
|
1611
1654
|
documents.map(document => element('button', {
|
|
1612
1655
|
type: 'button', class: 'note-tree-document', 'aria-current': document.id === view.documentId ? 'page' : undefined,
|
|
1656
|
+
'data-document-id': document.id,
|
|
1657
|
+
'data-knowledge-motion-key': `knowledge-document:${workspace.kind}:${document.id}`,
|
|
1613
1658
|
onClick: () => { view.knowledgeBaseId = base.id; void selectDocument(workspace, document.id) },
|
|
1614
1659
|
}, element('span', { class: 'tree-document-icon', 'aria-hidden': 'true' }), element('span', { class: 'tree-document-copy' },
|
|
1615
1660
|
element('strong', {}, document.title), element('small', {}, document.relPath)),
|
|
@@ -2035,6 +2080,7 @@ function renderNoteTreeBranch(parentId, depth = 0) {
|
|
|
2035
2080
|
const row = element('div', {
|
|
2036
2081
|
class: 'notes-tree-item', 'data-kind': node.kind, 'data-selected': String(selected),
|
|
2037
2082
|
'data-note-id': node.id,
|
|
2083
|
+
'data-knowledge-motion-key': `note:${node.id}`,
|
|
2038
2084
|
draggable: 'true',
|
|
2039
2085
|
onDragStart: event => {
|
|
2040
2086
|
event.dataTransfer.effectAllowed = 'move'
|
|
@@ -2074,7 +2120,8 @@ function renderNoteTreeBranch(parentId, depth = 0) {
|
|
|
2074
2120
|
function renderNoteSearchResults() {
|
|
2075
2121
|
if (!state.notes.searchResults.length) return element('div', { class: 'notes-tree-empty' }, '没有匹配的笔记文档。')
|
|
2076
2122
|
return element('div', { class: 'notes-search-results' }, state.notes.searchResults.map(node => element('button', {
|
|
2077
|
-
type: 'button', class: 'notes-search-row',
|
|
2123
|
+
type: 'button', class: 'notes-search-row', 'data-knowledge-motion-key': `note-search:${node.id}`,
|
|
2124
|
+
onClick: () => { void selectNoteNode(node) },
|
|
2078
2125
|
}, renderNoteIcon(node), element('span', {}, element('strong', {}, node.name), element('small', {}, noteKindLabel(node))))))
|
|
2079
2126
|
}
|
|
2080
2127
|
|
|
@@ -3774,6 +3821,7 @@ function openModal({ title, description = '', body, primaryLabel, primaryVariant
|
|
|
3774
3821
|
document.removeEventListener('keydown', onKeyDown)
|
|
3775
3822
|
closed = true
|
|
3776
3823
|
backdrop.remove()
|
|
3824
|
+
refreshWorkspaceEffects()
|
|
3777
3825
|
onClose?.()
|
|
3778
3826
|
if (previouslyFocused instanceof HTMLElement) previouslyFocused.focus()
|
|
3779
3827
|
}
|
|
@@ -3815,6 +3863,7 @@ function openModal({ title, description = '', body, primaryLabel, primaryVariant
|
|
|
3815
3863
|
body.addEventListener('change', () => { formDirty = true })
|
|
3816
3864
|
}
|
|
3817
3865
|
document.body.append(backdrop)
|
|
3866
|
+
refreshWorkspaceEffects(backdrop)
|
|
3818
3867
|
document.addEventListener('keydown', onKeyDown)
|
|
3819
3868
|
window.setTimeout(() => (dialog.querySelector('input, textarea, select, button') || dialog).focus(), 0)
|
|
3820
3869
|
return { close, dialog }
|
package/web/index.html
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
<link rel="stylesheet" href="__DSH_KNOWLEDGE_WEB_PATH__/styles.css?v=__DSH_KNOWLEDGE_ASSET_VERSION__">
|
|
14
14
|
<script src="__DSH_KNOWLEDGE_WEB_PATH__/markdown-preview.js?v=__DSH_KNOWLEDGE_ASSET_VERSION__"></script>
|
|
15
15
|
<script src="__DSH_KNOWLEDGE_WEB_PATH__/change-review.js?v=__DSH_KNOWLEDGE_ASSET_VERSION__"></script>
|
|
16
|
+
<script src="__DSH_KNOWLEDGE_WEB_PATH__/workspace-effects.js?v=__DSH_KNOWLEDGE_ASSET_VERSION__"></script>
|
|
16
17
|
<script type="module" src="__DSH_KNOWLEDGE_WEB_PATH__/app.js?v=__DSH_KNOWLEDGE_ASSET_VERSION__"></script>
|
|
17
18
|
</head>
|
|
18
19
|
<body>
|