yh-codemirror 1.0.6 → 1.0.8
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/.workbuddy/memory/2026-09-28.md +19 -0
- package/CHANGELOG.md +44 -0
- package/CodeMirror.vue +1175 -283
- package/README.md +102 -0
- package/ai-history.js +39 -0
- package/index.ts +3 -0
- package/package.json +34 -26
- package/util.ts +43 -17
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# 2026-09-28
|
|
2
|
+
|
|
3
|
+
## yh-codemirror 1.0.7 接入 AI 提示代码编辑
|
|
4
|
+
|
|
5
|
+
- 设计取舍:该包必须保持零业务依赖(deps 仅 codemirror 系列 + js-beautify,peer 仅 vue/element-plus),
|
|
6
|
+
因此**不直接依赖 yh-ai**(会拖入 axios/yh-client/yh-pub),改为宿主通过 `aiRequest` 回调注入 AI 能力。
|
|
7
|
+
传入 `aiRequest` 即启用,未传时行为与旧版完全一致(向后兼容)。
|
|
8
|
+
- 实现要点:
|
|
9
|
+
- 作用范围:有选区→选区;无选区→按 `aiScope`(默认 document)整篇或光标插入。
|
|
10
|
+
- 写回用 `view.dispatch({changes:{from,to,insert}})`,保留撤销栈;流式时区间 to 随写入长度前移。
|
|
11
|
+
- 流式:宿主调 `onChunk(chunk)` 增量返回,组件累积后整体覆盖区间;非流式则取返回值字符串。
|
|
12
|
+
- `AbortController` + signal 支持中断(停止按钮 / Esc / 卸载)。
|
|
13
|
+
- 自动剥离模型输出的 ```lang 围栏。
|
|
14
|
+
- 快捷键用 `keymap.of`(注意:`keymap` 不从 `codemirror` 导出,必须从 `@codemirror/view` 导入)。
|
|
15
|
+
- 新增事件 `ai-apply` / `ai-error`,expose `openAi/closeAi/stopAi/getView`。
|
|
16
|
+
- 新增 README.md(接入示例:非流式 + SSE 流式)、CHANGELOG.md;version 1.0.6 → 1.0.7。
|
|
17
|
+
- 验证:临时 .smoke 工程用 vite 4 + @vitejs/plugin-vue 构建通过(1663 modules)。
|
|
18
|
+
注意:root node_modules 的 vue 是 3.2.47,与 element-plus 内部 @vueuse 不兼容(hasInjectionContext 缺失),
|
|
19
|
+
**冒烟构建要把 vue alias 指向 web-new/node_modules/vue(3.5.13)**。
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
## 1.0.7
|
|
4
|
+
|
|
5
|
+
- 2026-10-08 15:06 feature: 新增 `aiWindowId` 入参与 `ai-activate` 事件
|
|
6
|
+
- AI 面板打开时把 `aiWindowId` 通过 `ai-activate` 抛给宿主,宿主可趁用户还没打字时预取上下文
|
|
7
|
+
- 组件本身不认识任何业务接口(保持零依赖),窗口配置怎么取、怎么缓存完全由宿主决定
|
|
8
|
+
- `aiWindowId` 为空时不触发事件
|
|
9
|
+
- 2026-09-30 18:54 feature: 新增 `aiPanelSize` 尺寸档位(`'normal' | 'large'`)
|
|
10
|
+
- 放大场景(window-form 的「放大」抽屉)传 `large`:面板内边距 6/8 → 10/12、字号 12 → 14px、
|
|
11
|
+
输入框 2 行 → 4 行、历史面板 max-height 62% → 72%(代码区 170px → 300px)
|
|
12
|
+
- 抽屉里的编辑区撑满整个抽屉,AI 面板还是 12px / 2 行会显得很局促
|
|
13
|
+
- 2026-09-30 18:45 feature: 新增「历史问答」查看入口(AI 输入框右上角「历史」)
|
|
14
|
+
- 每次 AI 成功写入后记录 `{时间, 问题, 作用范围, 回答}`,列表可展开查看完整问答、一键复制回答、清空
|
|
15
|
+
- 历史存在新增的 `ai-history.js` **模块级单例**(上限 50 条,最新在前);
|
|
16
|
+
不放组件内是因为配置面板里的编辑器会随切换配置项反复卸载重建,组件 ref 一卸载历史就没了
|
|
17
|
+
- 2026-09-30 18:26 fix: 选中区被当前行整块盖住(真正的根因是**绘制层级**,不是配色)
|
|
18
|
+
- CM6 的选区画在 `.cm-selectionLayer` 上:`drawSelection` 内部 `above:false` → z-index 取 `-1-pos`(负数),
|
|
19
|
+
它和 `.cm-content` 同在 `.cm-scroller`(`position:relative; z-index:0`)这个层叠上下文里
|
|
20
|
+
- 按 CSS 绘制顺序「负 z-index 后代 → in-flow 块 → 行内内容」,`.cm-line` 作为普通 in-flow 块
|
|
21
|
+
**画在选区层之上**;只要给 `.cm-line` 设不透明背景,选区就被完全遮住
|
|
22
|
+
- baseTheme 自带的 `&light .cm-activeLine:#cceeff44` / `&dark:#99eeff33` 是半透明的才不会遮,
|
|
23
|
+
solarizedDark 的 `.cm-activeLine:#173541` 和它的 `selection:#173541` 一样是不透明的同色 —— 这才是最初「看不出来」的根源
|
|
24
|
+
- 解法:当前行高亮挪到 `.cm-line.cm-activeLine::before`(`z-index:-100`),
|
|
25
|
+
同时把 `.cm-activeLine` 自身清成 `transparent`;绘制顺序变成「当前行底(-100) → 选区(-2) → 文字」
|
|
26
|
+
- 2026-09-28 10:04 feature: 新增 AI 提示代码编辑能力(回调注入 `aiRequest`,不引入任何 AI 服务依赖)
|
|
27
|
+
- 支持选区 / 整篇 / 光标插入三种作用范围(`aiScope`)
|
|
28
|
+
- 支持流式回写(`onChunk` 实时写入编辑器)
|
|
29
|
+
- 支持中断(`AbortSignal` + 停止按钮 / Esc)
|
|
30
|
+
- 新增 `ai-apply`、`ai-error` 事件与 `openAi / closeAi / stopAi / getView` 暴露方法
|
|
31
|
+
- 新增快捷键 `Mod-i` 唤起 AI 输入框(`aiHotkey` 可配)
|
|
32
|
+
- 回写走 dispatch,保留撤销栈;自动剥离 ```lang 代码围栏
|
|
33
|
+
- 2026-09-28 10:04 docs: 新增 README.md 说明 AI 接入方式(非流式 / SSE 流式示例)
|
|
34
|
+
- 2026-09-30 18:08 fix: 拖选/双击选词仍然和当前行同色(上一版权重不够)
|
|
35
|
+
- CM 6.39 的 baseTheme 用 `&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground`
|
|
36
|
+
(5 个类 + 子代选择器)给了默认色 `#d7d4f0` / `#233`,权重高于组件规则,堆类名盖不住
|
|
37
|
+
- 选区色改带 `!important`(不跟它的 DOM 结构绑死),当前行仍用选择器权重覆盖
|
|
38
|
+
- 补回浅色 `.cm-selectionMatch`(双击选词后其它同名 occurrence),改用暖色 `#ffe9c2` 与蓝色选区区分
|
|
39
|
+
- solarizedDark 的 `selection` 与 `activeLine` 都是 `#173541`,浅色主题又是 `#b3d8ff` / `#e8f4ff` 同一蓝色系
|
|
40
|
+
- 改为「当前行 = 中性色,选中 = 蓝色」,并区分聚焦/失焦两档选中色
|
|
41
|
+
- 配色统一挪到组件 `<style>`(带 `.cm-editor` / `.cm-editor.cm-focused` 前缀,权重高于外部主题),
|
|
42
|
+
`lightTheme` 里不再重复维护
|
|
43
|
+
- 2026-09-30 17:54 feature: 编辑器未聚焦时隐藏右下角功能按钮栏(`.editor-operation-btn.is-hidden`)
|
|
44
|
+
- 按钮栏加 `@mousedown.prevent`,避免点按钮瞬间编辑器失焦导致按钮隐藏、click 落空
|