@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/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
- renderShell()
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', { class: `base-card${archived ? ' is-archived' : ''}` },
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', { class: `mount-list-row${selected ? ' is-selected' : ''}`, role: 'listitem' },
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', { class: 'note-tree-group', 'data-expanded': String(expanded) },
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', onClick: () => { void selectNoteNode(node) },
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>