@ptengine/inline-editor 0.1.5 → 0.1.7
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/CHANGELOG.md +69 -0
- package/dist/InlineEditor.d.ts +15 -1
- package/dist/InlineEditor.js +226 -52
- package/dist/canvas-ui/tree/TreePanel.d.ts +2 -1
- package/dist/canvas-ui/tree/TreePanel.js +79 -39
- package/dist/chrome/EditorChrome.d.ts +2 -0
- package/dist/chrome/EditorChrome.js +1 -1
- package/dist/chrome/VersionMenu.d.ts +3 -1
- package/dist/chrome/VersionMenu.js +24 -12
- package/dist/chrome/topbarPrimitives.d.ts +5 -52
- package/dist/chrome/topbarPrimitives.js +13 -31
- package/dist/dialogs/ClickActionDialog.js +4 -5
- package/dist/dialogs/CodeField.d.ts +4 -0
- package/dist/dialogs/CodeField.js +10 -0
- package/dist/dialogs/HtmlEditDialog.js +3 -2
- package/dist/dialogs/ImageEditDialog.js +53 -15
- package/dist/dialogs/ImageSettingDialog.js +3 -3
- package/dist/dialogs/InsertElementDialog.js +10 -6
- package/dist/dialogs/MediaPreview.d.ts +5 -0
- package/dist/dialogs/MediaPreview.js +34 -0
- package/dist/dialogs/ReplaceVideoDialog.js +8 -4
- package/dist/index.d.ts +1 -0
- package/dist/kernel/ai/aiInlineApply.d.ts +4 -3
- package/dist/kernel/blocks/BlockOverlay.js +1 -1
- package/dist/kernel/blocks/resolveBlocks.d.ts +16 -0
- package/dist/kernel/blocks/resolveBlocks.js +39 -6
- package/dist/kernel/changelist/ChangeListPanel.js +11 -9
- package/dist/kernel/changelist/useChangeList.d.ts +5 -0
- package/dist/kernel/changelist/useChangeList.js +85 -10
- package/dist/kernel/selection/SelectionOverlay.js +1 -1
- package/dist/kernel/selection/SelectionToolbar.js +26 -8
- package/dist/kernel/selection/buildRootShelf.d.ts +56 -2
- package/dist/kernel/selection/buildRootShelf.js +189 -41
- package/dist/kernel/selection/elementAiContext.d.ts +11 -3
- package/dist/kernel/selection/resolveAnchors.d.ts +17 -0
- package/dist/kernel/selection/resolveAnchors.js +59 -11
- package/dist/locales.d.ts +201 -48
- package/dist/locales.js +13 -9
- package/dist/panels/EditorStatus.d.ts +5 -0
- package/dist/panels/EditorStatus.js +4 -0
- package/dist/panels/MovePositionControls.d.ts +6 -0
- package/dist/panels/MovePositionControls.js +35 -0
- package/dist/panels/ScreenshotCard.d.ts +7 -0
- package/dist/panels/ScreenshotCard.js +57 -0
- package/dist/panels/StylePanel.d.ts +9 -1
- package/dist/panels/StylePanel.js +108 -12
- package/dist/reviewLocales.d.ts +149 -0
- package/dist/reviewLocales.js +143 -0
- package/dist/tree/LayersPanel.js +4 -2
- package/dist/useInlineEditor.d.ts +1 -0
- package/dist/useInlineEditor.js +40 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,19 +1,82 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.7
|
|
4
|
+
|
|
5
|
+
依赖 `@ptengine/inline-core` ~0.2.1(新增 `historyShortcut` 流事件):**先发 inline-core 0.2.1,再发本版**。
|
|
6
|
+
|
|
7
|
+
**变更**
|
|
8
|
+
|
|
9
|
+
- 整页模式下(宿主接了 `onPageContextReady`)选中元素时,AI 作用域 = 选中元素 ∪ 它的子树货架 ∪ **整页货架**,
|
|
10
|
+
并按整页货架那些行的真实祖先链收敛落盘;MOVE 也认货架里任意一行作 target。用户点中的常不是他说的那一层 ——
|
|
11
|
+
vivaia 首屏点哪都选中幻灯片的空覆盖链接,「首屏下面加评价」要 after 整个 section、「换这张图」要改它的兄弟 img,
|
|
12
|
+
此前都不在子树里,只能请用户取消选择(真机 2026-10-21)。并进来的仍是宿主发出去的那份货架,货架外拼出来的
|
|
13
|
+
selector 照拒;宿主选中时也要发 `<page-shelf>`。没有整页模式的老宿主行为不变。
|
|
14
|
+
- 整页货架补上矮区块:页面模型的成员容器只要够宽就是候选、不看高度;块根父级(上下叠放的那一层)里不够高、但够宽、
|
|
15
|
+
有内容、不在 header / nav / footer 里的孩子补成块根,参与排序与叶子配额,也能写 `blockId`。此前低于 120px 的区块
|
|
16
|
+
(vivaia 手机首页 86px 的新闻区)等不到广度优先回填就被行数上限挤掉,标题进不了货架,改它的请求全部被拒。
|
|
17
|
+
装着 ≥2 个候选的外壳不再因「只认领了这一块」成块;分析路径的成员(`liftToBlockRoots`)同口径上提到矮块根。
|
|
18
|
+
- 插入位置与移动位置统一使用组件库的 outline 单选 ToggleGroup;移动工具栏的位置选择单独一行,取消与确认固定在下方一行靠右,统一控件高度。移动先选位置,再确认执行,支持取消,提交期间阻止重复操作。
|
|
19
|
+
|
|
20
|
+
**修复**
|
|
21
|
+
|
|
22
|
+
- I01:设备切换先等待已开始的写入完成,再保存当前 live 清单并交还版本宿主;新会话从这份快照回放,回放期间阻止编辑与保存。版本和设备会话切换仍重置操作历史。
|
|
23
|
+
- I02:宿主和画布的 Cmd/Ctrl+Z、Shift+Z / Ctrl+Y 接入已有操作历史;输入框和文字编辑期间保留原生撤销。
|
|
24
|
+
- I04:样式读取当前生效值并随编辑/撤销刷新,仅已有覆盖提供清除入口;图片/背景图、视频、alt 读取 live DOM,点击动作回填当前版本的配置。读取失败显示错误。
|
|
25
|
+
- I05:画布会话失败显示目标页加载提示、原因与返回入口,避免无反馈的空画布。
|
|
26
|
+
- I09:文字、插入、移动及撤销/重做后刷新图层标签和结构,复用图层组件以保留搜索和折叠状态;纯样式编辑不重拉图层。
|
|
27
|
+
- 复验既有 I03 浮层布局:全屏 z-index 1000 宿主、1024×480、拖拽及关闭重开,稳定后完整位于视口内。
|
|
28
|
+
|
|
29
|
+
## 0.1.6
|
|
30
|
+
|
|
31
|
+
**变更**
|
|
32
|
+
|
|
33
|
+
- 整页货架(没选中元素时交给 AI 的那份)的「区块」改为**只装着这一块的最外层容器**。此前「内层带 heading 就赢」,而 heading 是子树里
|
|
34
|
+
第一个标题,section / 轮播轨道 / 每张幻灯片拿到同一句 —— 首屏只剩轮播的几张幻灯片,「首屏下面插入」落进了轮播(真机 vivaia 首页)。
|
|
35
|
+
现在:父级横排里的几个大项(轮播的每一张、并列的列)不单独成块;装着 ≥2 个区块的是外壳、拆开;只装着 1 个的外层就是这一块;
|
|
36
|
+
占页高 ≥60% 的单链节点(main / 页面包装层)让给内层。区块很多时每块少给几行叶子,块根行一个不落。
|
|
37
|
+
- 分析路径的区块成员(`resolveBlocks` → `<page-block>` → 方案锚点)同口径上提到块根:热图成员是轮播第 1 张时,成员与方案锚点
|
|
38
|
+
改为整个首屏 section,首版不再照锚点把「首屏下方」的新模块插进轮播。整页树拉不到、或容器还装着别的区块时,成员原样不动。
|
|
39
|
+
- 编辑器交互与媒体流程统一:替换图片 / 视频、插入元素的对话框加上加载中与失败可见的媒体预览;元素截图改为结果卡片(放大预览、
|
|
40
|
+
下载、上传后复制链接,超出可视区或缩放时注明);操作反馈统一成一种状态条;代码输入框统一等宽字体;版本菜单与顶栏重排,
|
|
41
|
+
图层树搜索补上无结果与清除。
|
|
42
|
+
- 方案锚点可以带 MOVE 的目标:编辑器打开时,目标与锚点一样在活页面上重新解析(selector 唯一命中优先,失效按 `targetLabel` 找回),
|
|
43
|
+
找到的目标并进整页货架与祖先表 —— 目标不是块根时整页 MOVE 也不再因「不在货架上」被拒;找不到就按没解析到报、不授权。
|
|
44
|
+
|
|
45
|
+
**修复**
|
|
46
|
+
|
|
47
|
+
- 接通撤销和重做的操作历史;覆盖同一属性后可逐步还原,新增编辑会清空重做,切版本或会话会重置历史。回放保留 changeId,并同步插入元素的 AI 作用域。
|
|
48
|
+
- 样式面板支持标题栏拖拽与视口边界约束;连续尺寸变化不再累加偏移,顶层浮层与全屏宿主正确叠放,保留后续弹窗的遮盖关系。
|
|
49
|
+
- 修复改动清单的默认深色按钮及多行内容高度;全部撤销的确认文案与可恢复历史保持一致。
|
|
50
|
+
- 版本菜单统一左对齐,新增版本使用中性样式,重命名图标 hover 不再出现背景块。
|
|
51
|
+
- 点击动作类型改用 `@ptengine/design-components` 的 `RadioGroup / RadioGroupItem`,保留按类型切换字段和已填内容。
|
|
52
|
+
|
|
53
|
+
**新增**
|
|
54
|
+
|
|
55
|
+
- `InlineEditor` 的 `pageBlocks` prop(页面模型区块 `{ id, members }`):传了之后块根行带 `AiDescendant.blockId` —— 热图成员是轮播第 1 张时,
|
|
56
|
+
id 落在整个首屏 section 上。宿主据此打 `[B1 …]`,不再按 selector 逐字匹配成员。每个会话读一次,与 `anchors` 同一条纪律。
|
|
57
|
+
- 导出类型 `ShelfBlockHint`。
|
|
58
|
+
- `resolveBlocks` 的 `opts.viewportWidth`(块根判据的宽度门槛,缺省 375);`PageModelBlockMember.inRow`(成员在整页树上的横排位,
|
|
59
|
+
`<page-block>` 成员行据此打 `[横排 i/n]`,与整页货架同一份)。
|
|
60
|
+
- `InlinePlanAnchor` 的 `targetSelector` / `targetLabel`(只给 MOVE_ELEMENT);`ResolvedAnchor` 的 `targetResolved` / `targetVia` /
|
|
61
|
+
`resolvedTargetSelector`,宿主据此打印目标。
|
|
62
|
+
|
|
3
63
|
## 0.1.5
|
|
4
64
|
|
|
5
65
|
**变更**
|
|
66
|
+
|
|
6
67
|
- 截图之后把画布滚回截图前的位置。截图只能拍可视区(元素截图先滚过去、整页图一屏屏滚到底),此前 agent 拍完不滚回来 ——
|
|
7
68
|
进编辑器首版自动拍整页图 + 锚点近景后,页面停在最后一张近景那里。`captureSelectedElement`、`InlineEditorHandle.capturePage`、
|
|
8
69
|
`PagePreviewHandle.capturePage` 都会滚回;锚点近景几张连拍,只在最后滚回一次。
|
|
9
70
|
|
|
10
71
|
**新增**
|
|
72
|
+
|
|
11
73
|
- `useInlineEditor().commands.preserveScroll(run)`:跑完 `run` 把画布滚回开始前的位置(取几何帧的 `scrollY`)。
|
|
12
74
|
嵌套时只有最外层还原;几何帧还没到(不知道原位置)就不滚;滚回失败不抛。
|
|
13
75
|
|
|
14
76
|
## 0.1.4
|
|
15
77
|
|
|
16
78
|
**变更**
|
|
79
|
+
|
|
17
80
|
- AI 改动里的图片地址(`CHANGE_IMAGE`、`EDIT_HTML` 与 `INSERT_ELEMENT` 里的 `img[src]`)**不再按域名放行**,只要求 http(s) 绝对地址。
|
|
18
81
|
此前只认宿主注入的 origin 表 + 本会话读到过的地址,生图域名随部署环境变(测试区产图在 npstaticprod),漏配一个就整处改动被拒。
|
|
19
82
|
`javascript:` / `data:` / 相对地址 / 没有 `src` 仍以 `UNSAFE_IMAGE_SRC` 拒;`srcset` 照旧剥掉,`style` 里的 `url()` 照旧禁止。
|
|
@@ -22,6 +85,7 @@
|
|
|
22
85
|
## 0.1.3
|
|
23
86
|
|
|
24
87
|
**变更**
|
|
88
|
+
|
|
25
89
|
- 整页作用域(没选中元素)里 AI 的 `MOVE_ELEMENT`:`targetSelector` 除了被移动元素的祖先,现在也可以是**整页货架里的任意一行**
|
|
26
90
|
—— 「把 FAQ 整块挪到另一个区块后面」这类调换区块顺序的改动终于能落地(此前一律 `INVALID_MOVE_TARGET`)。
|
|
27
91
|
仍然拒绝:不在货架上的(编出来的)target、被移动元素自己、在被移动元素里面的行(防环,靠建货架时记的祖先链判)、
|
|
@@ -34,6 +98,7 @@
|
|
|
34
98
|
全部是新增:扩展不支持契约 v11 `feature:node-fields`(取树不回 `facts`)时,货架行与原来逐字一致。
|
|
35
99
|
|
|
36
100
|
**新增**
|
|
101
|
+
|
|
37
102
|
- AI 货架行标出父级横排:`AiDescendant.inRow`(`{ index, count }`),`formatShelfRow` 在引用文本之后、区块身份之前写
|
|
38
103
|
` [横排 i/n]`(与 frontend-base `<page-block>` 的行尾逐字一致)。父级是 flex 行(不换行;换行的要孩子同一行)或多列 grid
|
|
39
104
|
时才写 —— `after` 这一行会排到它旁边而不是下方。对整棵树判:父级常是货架跳过的包装层(PageFly `.pf-c`)。
|
|
@@ -48,6 +113,7 @@
|
|
|
48
113
|
全部是新增,不传新 props 的宿主行为不变。
|
|
49
114
|
|
|
50
115
|
**新增**
|
|
116
|
+
|
|
51
117
|
- `InlineEditor` 可选 props `onAiInsertedRemoved` / `onAiInsertedRestored`(`useInlineEditor` 的同名输入、
|
|
52
118
|
`useChangeList(sessionId, { onInsertedRemoved, onInsertedRestored })` 同步透传):撤销(单条 / 整批 / 换版本)
|
|
53
119
|
拿掉 AI 插入的元素时回报其 selector,并从包内的 AI 作用域剔除;回放(切版本 / 切设备)把它们放回画布时回报,
|
|
@@ -61,6 +127,7 @@
|
|
|
61
127
|
首个发布版。自 frontend-base(`cecb6de77`)迁入 `inline-editor`,其内部依赖的 `canvas-ui` 并入本包的内部目录(不单独发布)。
|
|
62
128
|
|
|
63
129
|
**产物**
|
|
130
|
+
|
|
64
131
|
- 仅 ESM,**逐模块输出**:每个源文件各出一个 `.js` 与 `.d.ts`,目录结构与源码一致,入口 `dist/index.js` / `dist/index.d.ts`;
|
|
65
132
|
相对导入均带 `.js` 扩展名(Node ESM 可解析);无 sourcemap。消费方打包器能像吃源码时一样按模块摇树、分 chunk
|
|
66
133
|
(单文件产物会被主应用对 `inlineEditorLocales` 等的静态引用整个拉进主 chunk)。
|
|
@@ -72,12 +139,14 @@
|
|
|
72
139
|
`lucide-react` / `@ptengine/inline-core`(dependencies)。
|
|
73
140
|
|
|
74
141
|
**配置入口(不兼容变更,相对迁入前的源码级用法)**
|
|
142
|
+
|
|
75
143
|
- 新增 `configureInlineEditor({ extensionId, disabledCapabilities })`,以及 `getInlineEditorConfig()` / `resetInlineEditorConfig()`。
|
|
76
144
|
预构建产物不再读 `import.meta.env`,扩展 id 与禁用能力改由宿主在应用启动时显式传入。
|
|
77
145
|
不配 `extensionId` = 内测模式(回退读 `<html data-ptengine-kit-id>`);配了 = 严格模式,只认这一个 id。
|
|
78
146
|
- 删除 `EXTENSION_ID` 常量导出;需要当前 id 请用 `getExtensionId()`。
|
|
79
147
|
|
|
80
148
|
**发布前校验**
|
|
149
|
+
|
|
81
150
|
- `pnpm build && pnpm test:build`:断言逐模块产物齐全、无测试文件、相对导入带扩展名且可解析、
|
|
82
151
|
canvas-ui 的 CSS import 与 CSS 文件在位且被 `sideEffects` 命中、外部依赖未内联、d.ts 不引 Node 类型;
|
|
83
152
|
在临时「装包方」目录里以 `--skipLibCheck false` 编译类型夹具(含 `DomTreeNode.href` 模块增强),
|
package/dist/InlineEditor.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { type ChromeVariant } from './chrome/EditorChrome.js';
|
|
|
3
3
|
import type { PageModelBlock } from './kernel/blocks/resolveBlocks.js';
|
|
4
4
|
import type { AdaptDomTreeOptions } from './tree/domTreeAdapter.js';
|
|
5
5
|
import { type AnchorShot, type ElementAiContext } from './kernel/selection/elementAiContext.js';
|
|
6
|
+
import { type ShelfBlockHint } from './kernel/selection/buildRootShelf.js';
|
|
6
7
|
import { type InlinePlanAnchor } from './kernel/selection/resolveAnchors.js';
|
|
7
8
|
import { type AiApplyOutcome, type AiScopeGrant, type AiWireChange } from './kernel/ai/aiInlineApply.js';
|
|
8
9
|
import { type LibraryComponent } from './assets/componentLibrary.js';
|
|
@@ -139,6 +140,17 @@ export interface InlineEditorProps {
|
|
|
139
140
|
* 不传 = 与今天完全一致。
|
|
140
141
|
*/
|
|
141
142
|
anchors?: InlinePlanAnchor[];
|
|
143
|
+
/**
|
|
144
|
+
* **页面模型的区块**(热图区块配置解析出来的 `{ id, members }`,宿主的 `PageModelBlock` 原样传)。
|
|
145
|
+
*
|
|
146
|
+
* 传了之后整页货架会按成员归属校正「哪一层算一块」,并在块根行(只装着这一个区块的最外层
|
|
147
|
+
* 容器)写 `blockId` —— 宿主据此打 `[B1 …]`。热图成员常是轮播的第 1 张:没有这一步,标签
|
|
148
|
+
* 打在那一张上,「首屏下面」就插进了轮播(真机 2026-10-20)。
|
|
149
|
+
*
|
|
150
|
+
* ⚠️ 与 `anchors` 同一条纪律:只在 `onPageContextReady` 那条路上生效,**每个会话读一次**,
|
|
151
|
+
* 用 ref 存最新值、不进采集 effect 的依赖。不传 = 不打 `blockId`,块根照结构判。
|
|
152
|
+
*/
|
|
153
|
+
pageBlocks?: ReadonlyArray<ShelfBlockHint>;
|
|
142
154
|
/**
|
|
143
155
|
* 编辑器可用了(画布就绪、命令能发了)——**每个会话交一次**把手。
|
|
144
156
|
*
|
|
@@ -222,6 +234,8 @@ export interface InlineEditorProps {
|
|
|
222
234
|
* 名字是 experience 级状态(保存时作为 `summary` 落库),改不改得成由宿主说了算。
|
|
223
235
|
*/
|
|
224
236
|
onRenameVersion?: (id: string, name: string) => void;
|
|
237
|
+
removableVersionIds?: string[];
|
|
238
|
+
onRemoveVersion?: (id: string) => void;
|
|
225
239
|
/**
|
|
226
240
|
* 真实页面预览。**不传则顶栏不渲染那个入口** —— 预览链接由后端按 experience + 版本
|
|
227
241
|
* 签发(同详情页的「真实页面预览」),包里没有 experience 的概念,也不知道
|
|
@@ -340,4 +354,4 @@ export interface AiApplyApi {
|
|
|
340
354
|
/** 当前版本 —— 宿主把 agent 给的版本**名**映射成 id 时要知道现在在哪一版。 */
|
|
341
355
|
readonly activeVersionId?: string;
|
|
342
356
|
}
|
|
343
|
-
export declare function InlineEditor({ url, device, onDeviceChange, title, versionLabel, chrome, onExit, onSave, libraryComponents, libraryLoading, onAddVersion, onRenameVersion, onPreview, onToggleAi, aiOpen, uploadImage, initialChanges, onHydrated, onAskAi, onPageContextReady, anchors, onEditorReady, onSessionReady, onAiContextChange, onAiApplyReady, onAiInsertedRemoved, onAiInsertedRestored, trackAiSelection, renderNodeIcon, versions, activeVersionId, versionChanges, onVersionChange, onVersionLeave, onVersionEnter, resolveChangeId, allowedLinkUrls, viewportWidthOverride, blockOverlay }: InlineEditorProps): import("react").JSX.Element;
|
|
357
|
+
export declare function InlineEditor({ url, device, onDeviceChange, title, versionLabel, chrome, onExit, onSave, libraryComponents, libraryLoading, onAddVersion, onRenameVersion, removableVersionIds, onRemoveVersion, onPreview, onToggleAi, aiOpen, uploadImage, initialChanges, onHydrated, onAskAi, onPageContextReady, anchors, pageBlocks, onEditorReady, onSessionReady, onAiContextChange, onAiApplyReady, onAiInsertedRemoved, onAiInsertedRestored, trackAiSelection, renderNodeIcon, versions, activeVersionId, versionChanges, onVersionChange, onVersionLeave, onVersionEnter, resolveChangeId, allowedLinkUrls, viewportWidthOverride, blockOverlay }: InlineEditorProps): import("react").JSX.Element;
|