@ptengine/inline-editor 0.0.0-stage → 0.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/CHANGELOG.md +28 -0
- package/README.md +286 -2
- package/dist/InlineEditor.d.ts +342 -0
- package/dist/InlineEditor.js +867 -0
- package/dist/PagePreview.d.ts +83 -0
- package/dist/PagePreview.js +111 -0
- package/dist/assets/AssetsPanel.d.ts +19 -0
- package/dist/assets/AssetsPanel.js +23 -0
- package/dist/assets/componentLibrary.d.ts +23 -0
- package/dist/assets/componentLibrary.js +12 -0
- package/dist/canvas-ui/index.d.ts +17 -0
- package/dist/canvas-ui/index.js +7 -0
- package/dist/canvas-ui/scope.d.ts +13 -0
- package/dist/canvas-ui/scope.js +1 -0
- package/dist/canvas-ui/selection/classNames.d.ts +30 -0
- package/dist/canvas-ui/selection/classNames.js +15 -0
- package/dist/canvas-ui/selection/tokens.css +204 -0
- package/dist/canvas-ui/tree/TreePanel.d.ts +47 -0
- package/dist/canvas-ui/tree/TreePanel.js +132 -0
- package/dist/canvas-ui/tree/classNames.d.ts +21 -0
- package/dist/canvas-ui/tree/classNames.js +8 -0
- package/dist/canvas-ui/tree/order.d.ts +38 -0
- package/dist/canvas-ui/tree/order.js +38 -0
- package/dist/canvas-ui/tree/tree.css +131 -0
- package/dist/chrome/EditorChrome.d.ts +83 -0
- package/dist/chrome/EditorChrome.js +10 -0
- package/dist/chrome/VersionMenu.d.ts +26 -0
- package/dist/chrome/VersionMenu.js +86 -0
- package/dist/chrome/topbarPrimitives.d.ts +69 -0
- package/dist/chrome/topbarPrimitives.js +39 -0
- package/dist/chrome/useDismissOnOutside.d.ts +23 -0
- package/dist/chrome/useDismissOnOutside.js +27 -0
- package/dist/dialogs/ClickActionDialog.d.ts +24 -0
- package/dist/dialogs/ClickActionDialog.js +35 -0
- package/dist/dialogs/HtmlEditDialog.d.ts +23 -0
- package/dist/dialogs/HtmlEditDialog.js +23 -0
- package/dist/dialogs/ImageEditDialog.d.ts +30 -0
- package/dist/dialogs/ImageEditDialog.js +57 -0
- package/dist/dialogs/ImageSettingDialog.d.ts +16 -0
- package/dist/dialogs/ImageSettingDialog.js +17 -0
- package/dist/dialogs/InsertElementDialog.d.ts +23 -0
- package/dist/dialogs/InsertElementDialog.js +28 -0
- package/dist/dialogs/ReplaceVideoDialog.d.ts +18 -0
- package/dist/dialogs/ReplaceVideoDialog.js +16 -0
- package/dist/dialogs/actionTypes.d.ts +53 -0
- package/dist/dialogs/actionTypes.js +74 -0
- package/dist/dialogs/htmlValidation.d.ts +24 -0
- package/dist/dialogs/htmlValidation.js +37 -0
- package/dist/dialogs/imageEdit.d.ts +49 -0
- package/dist/dialogs/imageEdit.js +30 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.js +53 -0
- package/dist/kernel/CanvasContextBar.d.ts +23 -0
- package/dist/kernel/CanvasContextBar.js +12 -0
- package/dist/kernel/CanvasFrame.d.ts +56 -0
- package/dist/kernel/CanvasFrame.js +53 -0
- package/dist/kernel/ai/aiInlineApply.d.ts +326 -0
- package/dist/kernel/ai/aiInlineApply.js +461 -0
- package/dist/kernel/ai/imageSource.d.ts +24 -0
- package/dist/kernel/ai/imageSource.js +19 -0
- package/dist/kernel/ai/insertHtmlGate.d.ts +71 -0
- package/dist/kernel/ai/insertHtmlGate.js +123 -0
- package/dist/kernel/ai/postApplyCheck.d.ts +56 -0
- package/dist/kernel/ai/postApplyCheck.js +74 -0
- package/dist/kernel/ai/replaceHtmlGate.d.ts +71 -0
- package/dist/kernel/ai/replaceHtmlGate.js +147 -0
- package/dist/kernel/blocks/BlockOverlay.d.ts +16 -0
- package/dist/kernel/blocks/BlockOverlay.js +66 -0
- package/dist/kernel/blocks/annotateAndTile.d.ts +106 -0
- package/dist/kernel/blocks/annotateAndTile.js +122 -0
- package/dist/kernel/blocks/resolveBlocks.d.ts +153 -0
- package/dist/kernel/blocks/resolveBlocks.js +233 -0
- package/dist/kernel/canvasCapabilities.d.ts +31 -0
- package/dist/kernel/canvasCapabilities.js +39 -0
- package/dist/kernel/canvasCommands.d.ts +126 -0
- package/dist/kernel/canvasCommands.js +146 -0
- package/dist/kernel/canvasErrors.d.ts +1 -0
- package/dist/kernel/canvasErrors.js +14 -0
- package/dist/kernel/captureGeometry.d.ts +35 -0
- package/dist/kernel/captureGeometry.js +25 -0
- package/dist/kernel/captureOrchestration.d.ts +48 -0
- package/dist/kernel/captureOrchestration.js +43 -0
- package/dist/kernel/captureSlices.d.ts +36 -0
- package/dist/kernel/captureSlices.js +20 -0
- package/dist/kernel/changelist/ChangeListPanel.d.ts +13 -0
- package/dist/kernel/changelist/ChangeListPanel.js +47 -0
- package/dist/kernel/changelist/ChangeListPopover.d.ts +20 -0
- package/dist/kernel/changelist/ChangeListPopover.js +10 -0
- package/dist/kernel/changelist/builders.d.ts +89 -0
- package/dist/kernel/changelist/builders.js +81 -0
- package/dist/kernel/changelist/changeSummary.d.ts +19 -0
- package/dist/kernel/changelist/changeSummary.js +85 -0
- package/dist/kernel/changelist/clipboard.d.ts +16 -0
- package/dist/kernel/changelist/clipboard.js +4 -0
- package/dist/kernel/changelist/exportForSave.d.ts +30 -0
- package/dist/kernel/changelist/exportForSave.js +11 -0
- package/dist/kernel/changelist/mergeForSave.d.ts +79 -0
- package/dist/kernel/changelist/mergeForSave.js +40 -0
- package/dist/kernel/changelist/moveObserverSafety.d.ts +70 -0
- package/dist/kernel/changelist/moveObserverSafety.js +39 -0
- package/dist/kernel/changelist/overrides.d.ts +22 -0
- package/dist/kernel/changelist/overrides.js +63 -0
- package/dist/kernel/changelist/useChangeList.d.ts +185 -0
- package/dist/kernel/changelist/useChangeList.js +259 -0
- package/dist/kernel/config.d.ts +29 -0
- package/dist/kernel/config.js +10 -0
- package/dist/kernel/dataUrlToBlob.d.ts +8 -0
- package/dist/kernel/dataUrlToBlob.js +17 -0
- package/dist/kernel/linkHref.d.ts +25 -0
- package/dist/kernel/linkHref.js +16 -0
- package/dist/kernel/mobileFit.d.ts +46 -0
- package/dist/kernel/mobileFit.js +44 -0
- package/dist/kernel/moveState.d.ts +35 -0
- package/dist/kernel/moveState.js +14 -0
- package/dist/kernel/selection/SelectionOverlay.d.ts +10 -0
- package/dist/kernel/selection/SelectionOverlay.js +25 -0
- package/dist/kernel/selection/SelectionToolbar.d.ts +30 -0
- package/dist/kernel/selection/SelectionToolbar.js +82 -0
- package/dist/kernel/selection/SelectorPathBar.d.ts +27 -0
- package/dist/kernel/selection/SelectorPathBar.js +55 -0
- package/dist/kernel/selection/buildDescendantShelf.d.ts +40 -0
- package/dist/kernel/selection/buildDescendantShelf.js +50 -0
- package/dist/kernel/selection/buildRootShelf.d.ts +26 -0
- package/dist/kernel/selection/buildRootShelf.js +149 -0
- package/dist/kernel/selection/elementAiContext.d.ts +313 -0
- package/dist/kernel/selection/elementAiContext.js +122 -0
- package/dist/kernel/selection/elementGeometryForAi.d.ts +9 -0
- package/dist/kernel/selection/elementGeometryForAi.js +15 -0
- package/dist/kernel/selection/geometry.d.ts +55 -0
- package/dist/kernel/selection/geometry.js +18 -0
- package/dist/kernel/selection/resolveAnchors.d.ts +116 -0
- package/dist/kernel/selection/resolveAnchors.js +173 -0
- package/dist/kernel/selection/shelfRow.d.ts +33 -0
- package/dist/kernel/selection/shelfRow.js +19 -0
- package/dist/kernel/selection/tagLabels.d.ts +9 -0
- package/dist/kernel/selection/tagLabels.js +46 -0
- package/dist/kernel/selection/toolbarButtons.d.ts +60 -0
- package/dist/kernel/selection/toolbarButtons.js +105 -0
- package/dist/kernel/selection/useAiSelectionContext.d.ts +26 -0
- package/dist/kernel/selection/useAiSelectionContext.js +26 -0
- package/dist/kernel/selection/useCanvasGeometry.d.ts +32 -0
- package/dist/kernel/selection/useCanvasGeometry.js +47 -0
- package/dist/kernel/selection/useSelectionRestore.d.ts +18 -0
- package/dist/kernel/selection/useSelectionRestore.js +25 -0
- package/dist/kernel/shrinkImageForUpload.d.ts +45 -0
- package/dist/kernel/shrinkImageForUpload.js +61 -0
- package/dist/kernel/useCanvasBridge.d.ts +36 -0
- package/dist/kernel/useCanvasBridge.js +41 -0
- package/dist/kernel/useCanvasGate.d.ts +22 -0
- package/dist/kernel/useCanvasGate.js +35 -0
- package/dist/kernel/useCanvasSession.d.ts +44 -0
- package/dist/kernel/useCanvasSession.js +182 -0
- package/dist/kernel/useCanvasStream.d.ts +39 -0
- package/dist/kernel/useCanvasStream.js +45 -0
- package/dist/kernel/useMobileFit.d.ts +40 -0
- package/dist/kernel/useMobileFit.js +139 -0
- package/dist/locales.d.ts +1094 -0
- package/dist/locales.js +545 -0
- package/dist/panels/StylePanel.d.ts +24 -0
- package/dist/panels/StylePanel.js +40 -0
- package/dist/panels/styleFields.d.ts +39 -0
- package/dist/panels/styleFields.js +91 -0
- package/dist/tree/LayersPanel.d.ts +30 -0
- package/dist/tree/LayersPanel.js +15 -0
- package/dist/tree/domTreeAdapter.d.ts +63 -0
- package/dist/tree/domTreeAdapter.js +90 -0
- package/dist/useInlineEditor.d.ts +158 -0
- package/dist/useInlineEditor.js +343 -0
- package/package.json +58 -3
package/dist/locales.js
ADDED
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
export const zhCN = {
|
|
2
|
+
inlineCanvas: {
|
|
3
|
+
action: {
|
|
4
|
+
title: '点击动作',
|
|
5
|
+
enable: '启用点击动作',
|
|
6
|
+
type: '动作类型',
|
|
7
|
+
link: '打开链接',
|
|
8
|
+
line: 'LINE',
|
|
9
|
+
tel: '拨打电话',
|
|
10
|
+
openPopup: '打开弹窗',
|
|
11
|
+
copiedText: '复制文本',
|
|
12
|
+
downloadFile: '下载文件',
|
|
13
|
+
runCode: '执行代码',
|
|
14
|
+
linkUrl: '链接地址',
|
|
15
|
+
lineUrl: 'LINE 地址',
|
|
16
|
+
openNewTab: '新标签页打开',
|
|
17
|
+
phone: '电话号码',
|
|
18
|
+
popupId: '弹窗 ID',
|
|
19
|
+
copyText: '要复制的文本',
|
|
20
|
+
fileUrl: '文件地址',
|
|
21
|
+
code: '代码'
|
|
22
|
+
},
|
|
23
|
+
video: {
|
|
24
|
+
title: '替换视频',
|
|
25
|
+
url: '视频地址',
|
|
26
|
+
hint: '支持 <video> 与 YouTube 内嵌 iframe'
|
|
27
|
+
},
|
|
28
|
+
insert: {
|
|
29
|
+
title: '插入元素',
|
|
30
|
+
html: 'HTML',
|
|
31
|
+
position: '插入位置'
|
|
32
|
+
},
|
|
33
|
+
image: {
|
|
34
|
+
replaceTitle: '替换图片',
|
|
35
|
+
settingTitle: '图片设置',
|
|
36
|
+
url: '图片地址',
|
|
37
|
+
upload: '上传图片',
|
|
38
|
+
uploading: '上传中…',
|
|
39
|
+
alt: '替代文本(alt)',
|
|
40
|
+
insertPosition: '插入位置'
|
|
41
|
+
},
|
|
42
|
+
move: {
|
|
43
|
+
title: '移动元素',
|
|
44
|
+
pickTarget: '在画布里点选目标元素',
|
|
45
|
+
cancel: '取消移动',
|
|
46
|
+
position: '相对目标的位置',
|
|
47
|
+
top: '移入开头',
|
|
48
|
+
bottom: '移入末尾',
|
|
49
|
+
before: '移到前面',
|
|
50
|
+
after: '移到后面'
|
|
51
|
+
},
|
|
52
|
+
clipboard: {
|
|
53
|
+
copied: '已复制',
|
|
54
|
+
nothingToPaste: '剪贴板为空',
|
|
55
|
+
pastePosition: '粘贴位置',
|
|
56
|
+
insert: '内部开头',
|
|
57
|
+
append: '内部末尾',
|
|
58
|
+
before: '之前',
|
|
59
|
+
after: '之后'
|
|
60
|
+
},
|
|
61
|
+
chrome: {
|
|
62
|
+
exit: '退出',
|
|
63
|
+
close: '关闭',
|
|
64
|
+
save: '保存',
|
|
65
|
+
preview: '预览',
|
|
66
|
+
changeList: '改动清单',
|
|
67
|
+
ai: 'AI 助手',
|
|
68
|
+
variant: '版本 {{name}}',
|
|
69
|
+
addVersion: '新增版本',
|
|
70
|
+
renameVersion: '重命名',
|
|
71
|
+
renameEmpty: '名字不能为空',
|
|
72
|
+
renameDuplicate: '已有同名版本',
|
|
73
|
+
renameSeparator: '名字里不能有「|」',
|
|
74
|
+
renameTooLong: '名字最多 40 个字',
|
|
75
|
+
version: '版本',
|
|
76
|
+
undo: '撤销',
|
|
77
|
+
redo: '重做',
|
|
78
|
+
pc: 'PC',
|
|
79
|
+
mobile: '移动'
|
|
80
|
+
},
|
|
81
|
+
version: {
|
|
82
|
+
switching: '正在切换版本,请稍候'
|
|
83
|
+
},
|
|
84
|
+
preview: {
|
|
85
|
+
loading: '正在加载页面…',
|
|
86
|
+
ready: '页面已就绪',
|
|
87
|
+
failed: '页面加载失败',
|
|
88
|
+
failedHint: '请确认已安装并启用 Ptengine 插件,且该页面允许被嵌入',
|
|
89
|
+
blockCount: '{{count}} 个区块'
|
|
90
|
+
},
|
|
91
|
+
html: {
|
|
92
|
+
title: '编辑 HTML',
|
|
93
|
+
tip: '编辑的是整个元素(outerHTML)。保存后 SDK 会用它整体替换原元素。',
|
|
94
|
+
scriptStripped: '其中 {{count}} 段 script/noscript 会被移除',
|
|
95
|
+
errorEmpty: '内容不能为空',
|
|
96
|
+
errorNoElement: '需要一个完整的元素标签,纯文本请用「编辑文字」',
|
|
97
|
+
errorMultipleRoots: '只能有一个根元素,多个根元素会让后续选择器错位'
|
|
98
|
+
},
|
|
99
|
+
text: {
|
|
100
|
+
title: '编辑文字',
|
|
101
|
+
tip: '只替换元素内部内容,元素本身与它的样式保持不变。可保留 <br>、<strong> 等内联标记。'
|
|
102
|
+
},
|
|
103
|
+
style: {
|
|
104
|
+
footnote: '每次改动都会记入改动清单,可单条撤销',
|
|
105
|
+
size: '尺寸',
|
|
106
|
+
width: '宽',
|
|
107
|
+
height: '高',
|
|
108
|
+
typography: '文字',
|
|
109
|
+
fontFamily: '字体',
|
|
110
|
+
fontSize: '字号',
|
|
111
|
+
fontWeight: '字重',
|
|
112
|
+
lineHeight: '行高',
|
|
113
|
+
textAlign: '对齐',
|
|
114
|
+
color: '颜色',
|
|
115
|
+
background: '背景',
|
|
116
|
+
backgroundColor: '背景色',
|
|
117
|
+
spacing: '间距',
|
|
118
|
+
padding: '内边距',
|
|
119
|
+
margin: '外边距',
|
|
120
|
+
border: '边框',
|
|
121
|
+
borderAll: '边框',
|
|
122
|
+
borderRadius: '圆角'
|
|
123
|
+
},
|
|
124
|
+
toolbar: {
|
|
125
|
+
screenshot: '截图',
|
|
126
|
+
replaceVideo: '替换视频',
|
|
127
|
+
insert: '插入元素',
|
|
128
|
+
replaceImage: '替换图片',
|
|
129
|
+
imageSetting: '图片设置',
|
|
130
|
+
clickAction: '点击动作',
|
|
131
|
+
move: '移动',
|
|
132
|
+
copy: '复制',
|
|
133
|
+
paste: '粘贴',
|
|
134
|
+
editText: '编辑文字',
|
|
135
|
+
editStyle: '编辑样式',
|
|
136
|
+
editHtml: '编辑 HTML',
|
|
137
|
+
delete: '删除',
|
|
138
|
+
askAi: '问 AI'
|
|
139
|
+
},
|
|
140
|
+
selectorPath: {
|
|
141
|
+
label: '元素路径'
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
taginfo: {
|
|
145
|
+
A: '链接',
|
|
146
|
+
B: '粗体',
|
|
147
|
+
BODY: '正文',
|
|
148
|
+
BUTTON: '按钮',
|
|
149
|
+
CAPTION: '图片说明',
|
|
150
|
+
DIV: '容器',
|
|
151
|
+
FORM: '表单',
|
|
152
|
+
H1: '标题 1',
|
|
153
|
+
H2: '标题 2',
|
|
154
|
+
H3: '标题 3',
|
|
155
|
+
I: '斜体',
|
|
156
|
+
IFRAME: '内嵌框架',
|
|
157
|
+
IMG: '图片',
|
|
158
|
+
INPUT: '输入',
|
|
159
|
+
LABEL: '标签',
|
|
160
|
+
LI: '列表项',
|
|
161
|
+
NAV: '导航',
|
|
162
|
+
OL: '有序列表',
|
|
163
|
+
OPTION: '选项',
|
|
164
|
+
P: '段落',
|
|
165
|
+
PRE: '预定义格式',
|
|
166
|
+
SELECT: '选择',
|
|
167
|
+
SPAN: '内嵌容器',
|
|
168
|
+
TABLE: '表格',
|
|
169
|
+
TBODY: '表格主体',
|
|
170
|
+
TD: '表格单元格',
|
|
171
|
+
TEXTAREA: '文本区域',
|
|
172
|
+
TFOOT: '表格尾',
|
|
173
|
+
TH: '表格标题',
|
|
174
|
+
THEAD: '表格头',
|
|
175
|
+
TR: '表格行',
|
|
176
|
+
U: '下划线',
|
|
177
|
+
UL: '无序列表',
|
|
178
|
+
VIDEO: '视频'
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
export const enUS = {
|
|
182
|
+
inlineCanvas: {
|
|
183
|
+
action: {
|
|
184
|
+
title: 'Click action',
|
|
185
|
+
enable: 'Enable click action',
|
|
186
|
+
type: 'Action type',
|
|
187
|
+
link: 'Open link',
|
|
188
|
+
line: 'LINE',
|
|
189
|
+
tel: 'Call',
|
|
190
|
+
openPopup: 'Open popup',
|
|
191
|
+
copiedText: 'Copy text',
|
|
192
|
+
downloadFile: 'Download file',
|
|
193
|
+
runCode: 'Run code',
|
|
194
|
+
linkUrl: 'Link URL',
|
|
195
|
+
lineUrl: 'LINE URL',
|
|
196
|
+
openNewTab: 'Open in new tab',
|
|
197
|
+
phone: 'Phone number',
|
|
198
|
+
popupId: 'Popup ID',
|
|
199
|
+
copyText: 'Text to copy',
|
|
200
|
+
fileUrl: 'File URL',
|
|
201
|
+
code: 'Code'
|
|
202
|
+
},
|
|
203
|
+
video: {
|
|
204
|
+
title: 'Replace video',
|
|
205
|
+
url: 'Video URL',
|
|
206
|
+
hint: 'Supports <video> and embedded YouTube iframes'
|
|
207
|
+
},
|
|
208
|
+
insert: {
|
|
209
|
+
title: 'Insert element',
|
|
210
|
+
html: 'HTML',
|
|
211
|
+
position: 'Insert position'
|
|
212
|
+
},
|
|
213
|
+
image: {
|
|
214
|
+
replaceTitle: 'Replace image',
|
|
215
|
+
settingTitle: 'Image settings',
|
|
216
|
+
url: 'Image URL',
|
|
217
|
+
upload: 'Upload image',
|
|
218
|
+
uploading: 'Uploading…',
|
|
219
|
+
alt: 'Alternative text (alt)',
|
|
220
|
+
insertPosition: 'Insert position'
|
|
221
|
+
},
|
|
222
|
+
move: {
|
|
223
|
+
title: 'Move element',
|
|
224
|
+
pickTarget: 'Pick a target element on the canvas',
|
|
225
|
+
cancel: 'Cancel move',
|
|
226
|
+
position: 'Position relative to target',
|
|
227
|
+
top: 'Inside, first',
|
|
228
|
+
bottom: 'Inside, last',
|
|
229
|
+
before: 'Before',
|
|
230
|
+
after: 'After'
|
|
231
|
+
},
|
|
232
|
+
clipboard: {
|
|
233
|
+
copied: 'Copied',
|
|
234
|
+
nothingToPaste: 'Clipboard is empty',
|
|
235
|
+
pastePosition: 'Paste position',
|
|
236
|
+
insert: 'Inside, first',
|
|
237
|
+
append: 'Inside, last',
|
|
238
|
+
before: 'Before',
|
|
239
|
+
after: 'After'
|
|
240
|
+
},
|
|
241
|
+
chrome: {
|
|
242
|
+
exit: 'Exit',
|
|
243
|
+
close: 'Close',
|
|
244
|
+
save: 'Save',
|
|
245
|
+
preview: 'Preview',
|
|
246
|
+
changeList: 'Changes',
|
|
247
|
+
ai: 'AI assistant',
|
|
248
|
+
variant: 'Variant {{name}}',
|
|
249
|
+
addVersion: 'Add version',
|
|
250
|
+
renameVersion: 'Rename',
|
|
251
|
+
renameEmpty: 'Name cannot be empty',
|
|
252
|
+
renameDuplicate: 'Another version already has this name',
|
|
253
|
+
renameSeparator: 'Name cannot contain "|"',
|
|
254
|
+
renameTooLong: 'Name is limited to 40 characters',
|
|
255
|
+
version: 'Version',
|
|
256
|
+
undo: 'Undo',
|
|
257
|
+
redo: 'Redo',
|
|
258
|
+
pc: 'Desktop',
|
|
259
|
+
mobile: 'Mobile'
|
|
260
|
+
},
|
|
261
|
+
version: {
|
|
262
|
+
switching: 'Switching version, please wait'
|
|
263
|
+
},
|
|
264
|
+
preview: {
|
|
265
|
+
loading: 'Loading page…',
|
|
266
|
+
ready: 'Page ready',
|
|
267
|
+
failed: 'Failed to load the page',
|
|
268
|
+
failedHint: 'Make sure the Ptengine extension is installed and enabled, and that this page allows embedding',
|
|
269
|
+
blockCount: '{{count}} blocks'
|
|
270
|
+
},
|
|
271
|
+
html: {
|
|
272
|
+
title: 'Edit HTML',
|
|
273
|
+
tip: 'You are editing the whole element (outerHTML). The SDK replaces the original element with it.',
|
|
274
|
+
scriptStripped: '{{count}} script/noscript block(s) will be removed',
|
|
275
|
+
errorEmpty: 'Content cannot be empty',
|
|
276
|
+
errorNoElement: 'A complete element tag is required; use Edit text for plain text',
|
|
277
|
+
errorMultipleRoots: 'Only one root element is allowed — multiple roots break later selectors'
|
|
278
|
+
},
|
|
279
|
+
text: {
|
|
280
|
+
title: 'Edit text',
|
|
281
|
+
tip: 'Replaces only the inner content. The element and its styles stay unchanged. Inline tags like <br> and <strong> are kept.'
|
|
282
|
+
},
|
|
283
|
+
style: {
|
|
284
|
+
footnote: 'Every change is recorded in the change list and can be reverted individually',
|
|
285
|
+
size: 'Size',
|
|
286
|
+
width: 'Width',
|
|
287
|
+
height: 'Height',
|
|
288
|
+
typography: 'Typography',
|
|
289
|
+
fontFamily: 'Font family',
|
|
290
|
+
fontSize: 'Font size',
|
|
291
|
+
fontWeight: 'Font weight',
|
|
292
|
+
lineHeight: 'Line height',
|
|
293
|
+
textAlign: 'Align',
|
|
294
|
+
color: 'Color',
|
|
295
|
+
background: 'Background',
|
|
296
|
+
backgroundColor: 'Background color',
|
|
297
|
+
spacing: 'Spacing',
|
|
298
|
+
padding: 'Padding',
|
|
299
|
+
margin: 'Margin',
|
|
300
|
+
border: 'Border',
|
|
301
|
+
borderAll: 'Border',
|
|
302
|
+
borderRadius: 'Corner radius'
|
|
303
|
+
},
|
|
304
|
+
toolbar: {
|
|
305
|
+
screenshot: 'Screenshot',
|
|
306
|
+
replaceVideo: 'Replace video',
|
|
307
|
+
insert: 'Insert element',
|
|
308
|
+
replaceImage: 'Replace image',
|
|
309
|
+
imageSetting: 'Image settings',
|
|
310
|
+
clickAction: 'Click action',
|
|
311
|
+
move: 'Move',
|
|
312
|
+
copy: 'Copy',
|
|
313
|
+
paste: 'Paste',
|
|
314
|
+
editText: 'Edit text',
|
|
315
|
+
editStyle: 'Edit style',
|
|
316
|
+
editHtml: 'Edit HTML',
|
|
317
|
+
delete: 'Delete',
|
|
318
|
+
askAi: 'Ask AI'
|
|
319
|
+
},
|
|
320
|
+
selectorPath: {
|
|
321
|
+
label: 'Element path'
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
taginfo: {
|
|
325
|
+
A: 'Link',
|
|
326
|
+
B: 'Bold',
|
|
327
|
+
BODY: 'Body',
|
|
328
|
+
BUTTON: 'Button',
|
|
329
|
+
CAPTION: 'Caption',
|
|
330
|
+
DIV: 'Container',
|
|
331
|
+
FORM: 'Form',
|
|
332
|
+
H1: 'Heading 1',
|
|
333
|
+
H2: 'Heading 2',
|
|
334
|
+
H3: 'Heading 3',
|
|
335
|
+
I: 'Italic',
|
|
336
|
+
IFRAME: 'Inline frame',
|
|
337
|
+
IMG: 'Image',
|
|
338
|
+
INPUT: 'Input',
|
|
339
|
+
LABEL: 'Label',
|
|
340
|
+
LI: 'List item',
|
|
341
|
+
NAV: 'Navigation',
|
|
342
|
+
OL: 'Ordered list',
|
|
343
|
+
OPTION: 'Option',
|
|
344
|
+
P: 'Paragraph',
|
|
345
|
+
PRE: 'Preformatted',
|
|
346
|
+
SELECT: 'Select',
|
|
347
|
+
SPAN: 'Inline container',
|
|
348
|
+
TABLE: 'Table',
|
|
349
|
+
TBODY: 'Table body',
|
|
350
|
+
TD: 'Table cell',
|
|
351
|
+
TEXTAREA: 'Textarea',
|
|
352
|
+
TFOOT: 'Table footer',
|
|
353
|
+
TH: 'Table header cell',
|
|
354
|
+
THEAD: 'Table header',
|
|
355
|
+
TR: 'Table row',
|
|
356
|
+
U: 'Underline',
|
|
357
|
+
UL: 'Unordered list',
|
|
358
|
+
VIDEO: 'Video'
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
export const jaJP = {
|
|
362
|
+
inlineCanvas: {
|
|
363
|
+
action: {
|
|
364
|
+
title: 'クリックアクション',
|
|
365
|
+
enable: 'クリックアクションを有効化',
|
|
366
|
+
type: 'アクション種別',
|
|
367
|
+
link: 'リンクを開く',
|
|
368
|
+
line: 'LINE',
|
|
369
|
+
tel: '電話をかける',
|
|
370
|
+
openPopup: 'ポップアップを開く',
|
|
371
|
+
copiedText: 'テキストをコピー',
|
|
372
|
+
downloadFile: 'ファイルをダウンロード',
|
|
373
|
+
runCode: 'コードを実行',
|
|
374
|
+
linkUrl: 'リンク URL',
|
|
375
|
+
lineUrl: 'LINE URL',
|
|
376
|
+
openNewTab: '新しいタブで開く',
|
|
377
|
+
phone: '電話番号',
|
|
378
|
+
popupId: 'ポップアップ ID',
|
|
379
|
+
copyText: 'コピーするテキスト',
|
|
380
|
+
fileUrl: 'ファイル URL',
|
|
381
|
+
code: 'コード'
|
|
382
|
+
},
|
|
383
|
+
video: {
|
|
384
|
+
title: '動画を差し替え',
|
|
385
|
+
url: '動画 URL',
|
|
386
|
+
hint: '<video> と YouTube 埋め込み iframe に対応'
|
|
387
|
+
},
|
|
388
|
+
insert: {
|
|
389
|
+
title: '要素を挿入',
|
|
390
|
+
html: 'HTML',
|
|
391
|
+
position: '挿入位置'
|
|
392
|
+
},
|
|
393
|
+
image: {
|
|
394
|
+
replaceTitle: '画像を差し替え',
|
|
395
|
+
settingTitle: '画像設定',
|
|
396
|
+
url: '画像 URL',
|
|
397
|
+
upload: '画像をアップロード',
|
|
398
|
+
uploading: 'アップロード中…',
|
|
399
|
+
alt: '代替テキスト(alt)',
|
|
400
|
+
insertPosition: '挿入位置'
|
|
401
|
+
},
|
|
402
|
+
move: {
|
|
403
|
+
title: '要素を移動',
|
|
404
|
+
pickTarget: 'キャンバスで対象要素を選択',
|
|
405
|
+
cancel: '移動をキャンセル',
|
|
406
|
+
position: '対象に対する位置',
|
|
407
|
+
top: '内側の先頭',
|
|
408
|
+
bottom: '内側の末尾',
|
|
409
|
+
before: '前',
|
|
410
|
+
after: '後'
|
|
411
|
+
},
|
|
412
|
+
clipboard: {
|
|
413
|
+
copied: 'コピーしました',
|
|
414
|
+
nothingToPaste: 'クリップボードが空です',
|
|
415
|
+
pastePosition: '貼り付け位置',
|
|
416
|
+
insert: '内側の先頭',
|
|
417
|
+
append: '内側の末尾',
|
|
418
|
+
before: '前',
|
|
419
|
+
after: '後'
|
|
420
|
+
},
|
|
421
|
+
chrome: {
|
|
422
|
+
exit: '終了',
|
|
423
|
+
close: '閉じる',
|
|
424
|
+
save: '保存',
|
|
425
|
+
preview: 'プレビュー',
|
|
426
|
+
changeList: '変更リスト',
|
|
427
|
+
ai: 'AI アシスタント',
|
|
428
|
+
variant: 'バリアント {{name}}',
|
|
429
|
+
addVersion: 'バージョンを追加',
|
|
430
|
+
renameVersion: '名前を変更',
|
|
431
|
+
renameEmpty: '名前を入力してください',
|
|
432
|
+
renameDuplicate: '同じ名前のバージョンがあります',
|
|
433
|
+
renameSeparator: '名前に「|」は使えません',
|
|
434
|
+
renameTooLong: '名前は 40 文字までです',
|
|
435
|
+
version: 'バージョン',
|
|
436
|
+
undo: '元に戻す',
|
|
437
|
+
redo: 'やり直す',
|
|
438
|
+
pc: 'PC',
|
|
439
|
+
mobile: 'モバイル'
|
|
440
|
+
},
|
|
441
|
+
version: {
|
|
442
|
+
switching: 'バージョンを切り替えています。しばらくお待ちください'
|
|
443
|
+
},
|
|
444
|
+
preview: {
|
|
445
|
+
loading: 'ページを読み込んでいます…',
|
|
446
|
+
ready: 'ページの準備ができました',
|
|
447
|
+
failed: 'ページの読み込みに失敗しました',
|
|
448
|
+
failedHint: 'Ptengine 拡張機能が有効か、このページが埋め込みを許可しているかをご確認ください',
|
|
449
|
+
blockCount: '{{count}} ブロック'
|
|
450
|
+
},
|
|
451
|
+
html: {
|
|
452
|
+
title: 'HTML を編集',
|
|
453
|
+
tip: '要素全体(outerHTML)を編集します。保存後、SDK が元の要素をこれで置き換えます。',
|
|
454
|
+
scriptStripped: 'うち {{count}} 個の script/noscript は削除されます',
|
|
455
|
+
errorEmpty: '内容を入力してください',
|
|
456
|
+
errorNoElement: '完全な要素タグが必要です。プレーンテキストは「テキストを編集」をご利用ください',
|
|
457
|
+
errorMultipleRoots: 'ルート要素は 1 つだけです。複数あると後続のセレクターがずれます'
|
|
458
|
+
},
|
|
459
|
+
text: {
|
|
460
|
+
title: 'テキストを編集',
|
|
461
|
+
tip: '要素の中身だけを置き換えます。要素自体とスタイルは変わりません。<br> や <strong> などのインラインタグは保持されます。'
|
|
462
|
+
},
|
|
463
|
+
style: {
|
|
464
|
+
footnote: '変更はすべて変更リストに記録され、個別に取り消せます',
|
|
465
|
+
size: 'サイズ',
|
|
466
|
+
width: '幅',
|
|
467
|
+
height: '高さ',
|
|
468
|
+
typography: 'テキスト',
|
|
469
|
+
fontFamily: 'フォント',
|
|
470
|
+
fontSize: '文字サイズ',
|
|
471
|
+
fontWeight: '太さ',
|
|
472
|
+
lineHeight: '行の高さ',
|
|
473
|
+
textAlign: '揃え',
|
|
474
|
+
color: '文字色',
|
|
475
|
+
background: '背景',
|
|
476
|
+
backgroundColor: '背景色',
|
|
477
|
+
spacing: '余白',
|
|
478
|
+
padding: '内側の余白',
|
|
479
|
+
margin: '外側の余白',
|
|
480
|
+
border: '枠線',
|
|
481
|
+
borderAll: '枠線',
|
|
482
|
+
borderRadius: '角丸'
|
|
483
|
+
},
|
|
484
|
+
toolbar: {
|
|
485
|
+
screenshot: 'スクリーンショット',
|
|
486
|
+
replaceVideo: '動画を差し替え',
|
|
487
|
+
insert: '要素を挿入',
|
|
488
|
+
replaceImage: '画像を差し替え',
|
|
489
|
+
imageSetting: '画像設定',
|
|
490
|
+
clickAction: 'クリックアクション',
|
|
491
|
+
move: '移動',
|
|
492
|
+
copy: 'コピー',
|
|
493
|
+
paste: '貼り付け',
|
|
494
|
+
editText: 'テキストを編集',
|
|
495
|
+
editStyle: 'スタイルを編集',
|
|
496
|
+
editHtml: 'HTML を編集',
|
|
497
|
+
delete: '削除',
|
|
498
|
+
askAi: 'AI に聞く'
|
|
499
|
+
},
|
|
500
|
+
selectorPath: {
|
|
501
|
+
label: '要素パス'
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
taginfo: {
|
|
505
|
+
A: 'リンク',
|
|
506
|
+
B: '太字',
|
|
507
|
+
BODY: '本文',
|
|
508
|
+
BUTTON: 'ボタン',
|
|
509
|
+
CAPTION: 'キャプション',
|
|
510
|
+
DIV: 'コンテナ',
|
|
511
|
+
FORM: 'フォーム',
|
|
512
|
+
H1: '見出し 1',
|
|
513
|
+
H2: '見出し 2',
|
|
514
|
+
H3: '見出し 3',
|
|
515
|
+
I: '斜体',
|
|
516
|
+
IFRAME: 'インラインフレーム',
|
|
517
|
+
IMG: '画像',
|
|
518
|
+
INPUT: '入力',
|
|
519
|
+
LABEL: 'ラベル',
|
|
520
|
+
LI: 'リスト項目',
|
|
521
|
+
NAV: 'ナビゲーション',
|
|
522
|
+
OL: '順序付きリスト',
|
|
523
|
+
OPTION: '選択肢',
|
|
524
|
+
P: '段落',
|
|
525
|
+
PRE: '整形済みテキスト',
|
|
526
|
+
SELECT: 'セレクト',
|
|
527
|
+
SPAN: 'インラインコンテナ',
|
|
528
|
+
TABLE: 'テーブル',
|
|
529
|
+
TBODY: 'テーブル本体',
|
|
530
|
+
TD: 'テーブルセル',
|
|
531
|
+
TEXTAREA: 'テキストエリア',
|
|
532
|
+
TFOOT: 'テーブルフッター',
|
|
533
|
+
TH: 'テーブル見出しセル',
|
|
534
|
+
THEAD: 'テーブルヘッダー',
|
|
535
|
+
TR: 'テーブル行',
|
|
536
|
+
U: '下線',
|
|
537
|
+
UL: '順序なしリスト',
|
|
538
|
+
VIDEO: '動画'
|
|
539
|
+
}
|
|
540
|
+
};
|
|
541
|
+
export const inlineEditorLocales = {
|
|
542
|
+
'zh-CN': zhCN,
|
|
543
|
+
'en-US': enUS,
|
|
544
|
+
'ja-JP': jaJP
|
|
545
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ElementCapabilities } from '@ptengine/inline-core/protocol';
|
|
2
|
+
/**
|
|
3
|
+
* 样式面板 —— 替掉画布调试页里那三个 `window.prompt` 之一。
|
|
4
|
+
*
|
|
5
|
+
* 分区与字段来自 `styleFields.ts`(与现役 engage-editor 的
|
|
6
|
+
* `components/context-menu/sections/` 一一对应),本组件只负责渲染与提交。
|
|
7
|
+
*
|
|
8
|
+
* **做成浮层而不是常驻右栏**:现役是双层顶栏 + 固定右栏,横向空间被吃掉很多,
|
|
9
|
+
* 而客户页按 1440 设计、画布本身要尽量宽。浮层只在选中时出现。
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ **提交时机是 blur / 回车,不是每次按键**:每次按键提交会让一次「把 18 改成 180」
|
|
12
|
+
* 的输入产生 `1`→`18`→`180` 三条 change(虽然会被覆盖去重合成一条,但中间两次都
|
|
13
|
+
* 真的打到了客户页 DOM 上,还各发了一次跨三跳的命令)。
|
|
14
|
+
*/
|
|
15
|
+
export interface StylePanelProps {
|
|
16
|
+
tag: string;
|
|
17
|
+
capabilities: ElementCapabilities | null;
|
|
18
|
+
/** 元素当前的 author 层声明,用作输入框初值。 */
|
|
19
|
+
declaredStyles?: Record<string, string>;
|
|
20
|
+
/** 提交一条样式改动。由宿主接到 `changeList.addStyle`。 */
|
|
21
|
+
onApply: (property: string, value: string) => void | Promise<unknown>;
|
|
22
|
+
onClose: () => void;
|
|
23
|
+
}
|
|
24
|
+
export declare function StylePanel({ tag, capabilities, declaredStyles, onApply, onClose }: StylePanelProps): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import { X } from 'lucide-react';
|
|
5
|
+
import { Button, Input, Label, NativeSelect, Separator } from '@ptengine/design-components';
|
|
6
|
+
import { composeStyleValue, visibleSections } from './styleFields.js';
|
|
7
|
+
export function StylePanel({ tag, capabilities, declaredStyles = {}, onApply, onClose }) {
|
|
8
|
+
const { t } = useTranslation();
|
|
9
|
+
const sections = visibleSections(capabilities);
|
|
10
|
+
if (sections.length === 0)
|
|
11
|
+
return null;
|
|
12
|
+
return (_jsxs("div", { "data-testid": "inline-style-panel", className: "flex w-80 flex-col overflow-hidden rounded-lg border border-[#DFE1E6]\n bg-white shadow-lg", children: [_jsxs("header", { className: "flex h-11 shrink-0 items-center justify-between border-b\n border-[#EBECF0] bg-[#F4F5F7] px-3.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("code", { className: "text-xs text-[#6B778C]", children: ["<", tag, ">"] }), _jsx("span", { className: "text-[13px] font-semibold text-[#091E42]", children: t(`taginfo.${tag.toUpperCase()}`, tag) })] }), _jsx(Button, { variant: "ghost", size: "icon", "aria-label": t('common.close', '关闭'), "data-testid": "inline-style-panel-close", onClick: onClose, children: _jsx(X, { className: "size-4" }) })] }), _jsx("div", { className: "flex max-h-[520px] flex-col overflow-y-auto", children: sections.map((section, index) => (_jsxs("section", { "data-testid": `style-section-${section.id}`, className: "flex flex-col gap-3 px-3.5 py-3.5", children: [index > 0 && _jsx(Separator, { className: "-mt-3.5 mb-0.5" }), _jsx("p", { className: "text-xs font-semibold text-[#091E42]", children: t(section.labelKey) }), _jsx("div", { className: "grid grid-cols-2 gap-2.5", children: section.fields.map(field => (_jsx(StyleFieldInput, { field: field, initial: declaredStyles[field.property] ?? '', onApply: onApply }, field.property))) })] }, section.id))) }), _jsx("footer", { className: "shrink-0 bg-[#F7F8F9] px-3.5 py-3 text-xs leading-5 text-[#6B778C]", children: t('inlineCanvas.style.footnote', '每次改动都会记入改动清单,可单条撤销') })] }));
|
|
13
|
+
}
|
|
14
|
+
function StyleFieldInput({ field, initial, onApply }) {
|
|
15
|
+
const { t } = useTranslation();
|
|
16
|
+
const [value, setValue] = useState(initial);
|
|
17
|
+
const [committed, setCommitted] = useState(initial);
|
|
18
|
+
const commit = () => {
|
|
19
|
+
const composed = composeStyleValue(field, value);
|
|
20
|
+
if (!composed || composed === committed)
|
|
21
|
+
return;
|
|
22
|
+
setCommitted(composed);
|
|
23
|
+
void onApply(field.property, composed);
|
|
24
|
+
};
|
|
25
|
+
const label = t(field.labelKey);
|
|
26
|
+
const id = `style-${field.property}`;
|
|
27
|
+
return (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: id, className: "text-xs font-normal text-[#6B778C]", children: label }), field.kind === 'select' ? (_jsxs(NativeSelect, { id: id, "data-testid": id, value: value, onChange: e => {
|
|
28
|
+
const next = e.target.value;
|
|
29
|
+
setValue(next);
|
|
30
|
+
if (next && next !== committed) {
|
|
31
|
+
setCommitted(next);
|
|
32
|
+
void onApply(field.property, next);
|
|
33
|
+
}
|
|
34
|
+
}, children: [_jsx("option", { value: "", children: "--" }), field.options?.map(o => (_jsx("option", { value: o, children: o }, o)))] })) : (_jsx(Input, { id: id, "data-testid": id, value: value, type: field.kind === 'color' ? 'text' : 'text', placeholder: field.unit ? field.unit : undefined, onChange: e => setValue(e.target.value), onBlur: commit, onKeyDown: e => {
|
|
35
|
+
if (e.key === 'Enter') {
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
commit();
|
|
38
|
+
}
|
|
39
|
+
} }))] }));
|
|
40
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ElementCapabilities } from '@ptengine/inline-core/protocol';
|
|
2
|
+
/**
|
|
3
|
+
* 样式面板的字段定义 —— **分区与现役 engage-editor 一一对应**
|
|
4
|
+
* (`components/context-menu/sections/`:Size / Typography / Background / Border /
|
|
5
|
+
* Margin / Padding / Position / Alignment / SourceAttribute)。
|
|
6
|
+
*
|
|
7
|
+
* 做成**数据表**而不是写死在组件里,理由与工具条按钮表相同:分区与字段是**策略**,
|
|
8
|
+
* 会随产品迭代增减;写成 JSX 分支的话每加一个字段都要改渲染逻辑。
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ 每个字段最终产出一条 `elementStyle`(53),`property` 就是这里的 `property`。
|
|
11
|
+
* 所以字段名必须是**合法 CSS 属性名** —— 拼错不会报错,只会产出一条 SDK 应用不上的
|
|
12
|
+
* change(画布里可能因为浏览器容错看起来"生效"了,上线后没效果)。
|
|
13
|
+
*/
|
|
14
|
+
export type StyleFieldKind = 'length' | 'text' | 'color' | 'select';
|
|
15
|
+
export interface StyleField {
|
|
16
|
+
/** CSS 属性名,直接进 `elementStyle.property`。 */
|
|
17
|
+
property: string;
|
|
18
|
+
labelKey: string;
|
|
19
|
+
kind: StyleFieldKind;
|
|
20
|
+
/** `length` 类的单位后缀,仅用于输入框展示;写进 change 的是「值+单位」。 */
|
|
21
|
+
unit?: string;
|
|
22
|
+
/** `select` 类的候选值。 */
|
|
23
|
+
options?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface StyleSection {
|
|
26
|
+
id: string;
|
|
27
|
+
labelKey: string;
|
|
28
|
+
fields: StyleField[];
|
|
29
|
+
/**
|
|
30
|
+
* 该分区是否对当前元素可见。省略 = 恒可见。
|
|
31
|
+
* ⚠️ 判据只用**能力位**(DEC-14 一次往返批量拿到的),不要在这里发新的探测命令
|
|
32
|
+
* —— 那正是现役 `usesStyleProperty` 往客户页插临时元素的老路(C5)。
|
|
33
|
+
*/
|
|
34
|
+
visible?: (caps: ElementCapabilities) => boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare const STYLE_SECTIONS: StyleSection[];
|
|
37
|
+
/** 按能力位过滤出该元素可见的分区。 */
|
|
38
|
+
export declare function visibleSections(caps: ElementCapabilities | null): StyleSection[];
|
|
39
|
+
export declare function composeStyleValue(field: StyleField, raw: string): string;
|