@proteus-vue/render-backend 0.1.1-beta.0 → 0.1.1-beta.1

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.
Files changed (2) hide show
  1. package/dist/index.js +182 -35
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -86,8 +86,8 @@ var SEMANTIC_HEADLESS_MAP = {
86
86
  "ui.input": "input",
87
87
  "ui.list": "list",
88
88
  "ui.nav": "nav",
89
- "capability.scan-qr": "scan-qr",
90
- "capability.pick-photo": "pick-photo",
89
+ "capability.qr-code": "scan-qr",
90
+ "capability.camera": "pick-photo",
91
91
  "capability.location": "location",
92
92
  // ★G-32 B1:新增 implemented 语义(与 component-ir SEMANTIC_BACKEND_MAP headless 列同源)
93
93
  "layout.inline": "inline",
@@ -126,6 +126,7 @@ var SEMANTIC_HEADLESS_MAP = {
126
126
  "engineering.router-link": "router-link",
127
127
  // ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
128
128
  "engineering.transition": "transition",
129
+ "engineering.share-element": "share-element",
129
130
  "engineering.animate": "animate",
130
131
  // ★能力颗粒度对齐 C2
131
132
  "ui.progress": "progress",
@@ -253,8 +254,8 @@ var SEMANTIC_WEB_MAP = {
253
254
  "ui.list": { tag: "div", className: "proteus-list" },
254
255
  "ui.nav": { tag: "nav" },
255
256
  // ★G-31 B5:能力入口(G-28 组件化)——Web 端用标准元素承载,能力实现由 useNative 注入
256
- "capability.scan-qr": { tag: "button", className: "proteus-scan-qr" },
257
- "capability.pick-photo": { tag: "input", className: "proteus-pick-photo" },
257
+ "capability.qr-code": { tag: "button", className: "proteus-scan-qr" },
258
+ "capability.camera": { tag: "input", className: "proteus-pick-photo" },
258
259
  "capability.location": { tag: "button", className: "proteus-location" },
259
260
  // ★G-32 B1:新增 implemented 语义(与 component-ir SEMANTIC_BACKEND_MAP vue-dom 列同源)
260
261
  "layout.inline": { tag: "div", className: "proteus-inline" },
@@ -294,6 +295,8 @@ var SEMANTIC_WEB_MAP = {
294
295
  "engineering.router-link": { tag: "a", className: "proteus-router-link" },
295
296
  // ★G-32 B5 续二:工程原语动画组件形态(E19/E20——纯 CSS 声明)
296
297
  "engineering.transition": { tag: "div", className: "proteus-transition" },
298
+ // ★批次 8:共享元素转场(Web 无宿主共享元素 → 普通容器降级)
299
+ "engineering.share-element": { tag: "div", className: "proteus-share-element" },
297
300
  "engineering.animate": { tag: "div", className: "proteus-animate" },
298
301
  // ★能力颗粒度对齐 C2:进度条 / 表单标签 / 页面容器
299
302
  "ui.progress": { tag: "div", className: "proteus-progress" },
@@ -435,8 +438,8 @@ var SEMANTIC_NATIVE_MAPS = {
435
438
  "ui.input": "UITextField",
436
439
  "ui.list": "UITableView",
437
440
  "ui.nav": "UINavigationController",
438
- "capability.scan-qr": "AVCaptureSession",
439
- "capability.pick-photo": "UIImagePicker",
441
+ "capability.qr-code": "AVCaptureSession",
442
+ "capability.camera": "UIImagePicker",
440
443
  "capability.location": "CLLocationManager",
441
444
  // ★G-32 B1:新增 implemented 语义
442
445
  "layout.inline": "UITextAttachment",
@@ -475,6 +478,7 @@ var SEMANTIC_NATIVE_MAPS = {
475
478
  "engineering.router-link": "UIButton.link",
476
479
  // ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
477
480
  "engineering.transition": "UIView.transition",
481
+ "engineering.share-element": "UIView.matchedTransition",
478
482
  "engineering.animate": "CAKeyframeAnimation",
479
483
  // ★能力颗粒度对齐 C2
480
484
  "ui.progress": "UIProgressView",
@@ -503,8 +507,8 @@ var SEMANTIC_NATIVE_MAPS = {
503
507
  "ui.input": "EditText",
504
508
  "ui.list": "RecyclerView",
505
509
  "ui.nav": "NavigationRail",
506
- "capability.scan-qr": "CameraX",
507
- "capability.pick-photo": "PhotoPicker",
510
+ "capability.qr-code": "CameraX",
511
+ "capability.camera": "PhotoPicker",
508
512
  "capability.location": "FusedLocation",
509
513
  // ★G-32 B1:新增 implemented 语义
510
514
  "layout.inline": "TextView.inline",
@@ -543,6 +547,7 @@ var SEMANTIC_NATIVE_MAPS = {
543
547
  "engineering.router-link": "TextView.link",
544
548
  // ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
545
549
  "engineering.transition": "View.animate.transition",
550
+ "engineering.share-element": "SharedElementTransition",
546
551
  "engineering.animate": "ValueAnimator",
547
552
  // ★能力颗粒度对齐 C2
548
553
  "ui.progress": "ProgressBar",
@@ -571,8 +576,8 @@ var SEMANTIC_NATIVE_MAPS = {
571
576
  "ui.input": "TextInput",
572
577
  "ui.list": "List",
573
578
  "ui.nav": "Navigation",
574
- "capability.scan-qr": "ScanKit",
575
- "capability.pick-photo": "PhotoViewPicker",
579
+ "capability.qr-code": "ScanKit",
580
+ "capability.camera": "PhotoViewPicker",
576
581
  "capability.location": "geoLocationManager",
577
582
  // ★G-32 B1:新增 implemented 语义
578
583
  "layout.inline": "Span",
@@ -611,6 +616,7 @@ var SEMANTIC_NATIVE_MAPS = {
611
616
  "engineering.router-link": "Text.link",
612
617
  // ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
613
618
  "engineering.transition": "animateTo.transition",
619
+ "engineering.share-element": "geometryTransition",
614
620
  "engineering.animate": "Animator.transition",
615
621
  // ★能力颗粒度对齐 C2
616
622
  "ui.progress": "Progress",
@@ -735,8 +741,8 @@ var SEMANTIC_FLUTTER_MAP = {
735
741
  "ui.input": "TextField",
736
742
  "ui.list": "ListView",
737
743
  "ui.nav": "Navigator",
738
- "capability.scan-qr": "scanQR",
739
- "capability.pick-photo": "pickPhoto",
744
+ "capability.qr-code": "scanQR",
745
+ "capability.camera": "pickPhoto",
740
746
  "capability.location": "getLocation",
741
747
  // ★G-32 B1:新增 implemented 语义
742
748
  "layout.inline": "InlineSpan",
@@ -775,6 +781,8 @@ var SEMANTIC_FLUTTER_MAP = {
775
781
  "engineering.router-link": "TextButton",
776
782
  // ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
777
783
  "engineering.transition": "AnimatedOpacity",
784
+ "engineering.share-element": "Hero",
785
+ // Flutter Hero 即共享元素
778
786
  "engineering.animate": "AnimationController",
779
787
  // ★能力颗粒度对齐 C2
780
788
  "ui.progress": "LinearProgressIndicator",
@@ -1134,11 +1142,17 @@ var TAG_SEMANTIC_MAP = {
1134
1142
  // ★E18 组件形态(p- 前缀产 C-IR)
1135
1143
  "router-link": "engineering.router-link",
1136
1144
  // ★兼容别名(Vue Router 风格 <router-link> 标签;非 catalog 条目——p-view 先例 G-31 B4)
1145
+ "p-share-element": "engineering.share-element",
1146
+ // ★批次 8:页面间共享元素转场(≠ p-transition 页内过渡)
1137
1147
  "p-transition": "engineering.transition",
1138
1148
  "p-animate": "engineering.animate",
1139
1149
  // G-31 能力入口
1140
- "p-scan-qr": "capability.scan-qr",
1141
- "p-pick-photo": "capability.pick-photo",
1150
+ // ★2026-09-18 语义去重:原 capability.scan-qr / capability.pick-photo 是**重复名**——
1151
+ // 两个组件的实现分别调用 useQRCode() / useCamera(),对应真实能力即 C42 capability.qr-code /
1152
+ // C1 capability.camera(其 mpEquiv 与 hook 完全一致)。故**退役重复名、重指向真实能力**,
1153
+ // 并按 E8 双形态在两行补 tag(而非新建语义)。
1154
+ "p-scan-qr": "capability.qr-code",
1155
+ "p-pick-photo": "capability.camera",
1142
1156
  "p-location": "capability.location",
1143
1157
  // ★G-31 B4 现有组件对齐(src/components 实际标签 → L1 语义)
1144
1158
  "p-view": "layout.box",
@@ -1149,7 +1163,9 @@ var TAG_SEMANTIC_MAP = {
1149
1163
  "p-safe": "layout.safe",
1150
1164
  "p-sidebar": "layout.sidebar",
1151
1165
  // ★#405 语义登记批:剩余 10 组件全量入图(EXTRA_KIND 文档兑底退役)——
1152
- // 9 个新语义(catalog planned L2:语义层待多端映射)+ p-scroll-view 复用 layout.scroll(p-view 先例)
1166
+ // 9 个新语义(catalog planned L2:语义层待多端映射)+ p-scroll-view 复用 layout.scroll
1167
+ // (★2026-09-18 修正原文「p-view 先例」:显式 multi-tag 别名先例是上一行的 `router-link`
1168
+ // ——同一语义由两个标签提供;本条与 p-view 是并列的别名情形,非「先例」关系)
1153
1169
  "p-aspect": "layout.aspect",
1154
1170
  "p-zone": "layout.zone",
1155
1171
  "p-loading": "ui.loading",
@@ -1202,17 +1218,20 @@ var LAYOUT = [
1202
1218
  { id: "L12", kind: "layout", semantic: "layout.masonry", tag: "p-masonry", props: ["colCount", "gap"], mpEquiv: "\u7B2C\u4E09\u65B9\u7011\u5E03\u6D41", tier: "L1", status: "implemented" },
1203
1219
  // ★#405 语义登记批:Fluid 体系剩余组件(语义层待多端映射 → planned L2——G-31.4 不足 3 端降级)
1204
1220
  { id: "L13", kind: "layout", semantic: "layout.aspect", tag: "p-aspect", props: ["ratio", "maxWidth"], mpEquiv: "\u65E0\uFF08\u7EB5\u6A2A\u6BD4\u5BB9\u5668\uFF09", tier: "L2", status: "planned" },
1205
- { id: "L14", kind: "layout", semantic: "layout.zone", tag: "p-zone", props: ["designWidth"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u65AD\u70B9\u5206\u533A\uFF09", tier: "L2", status: "planned" }
1221
+ { id: "L14", kind: "layout", semantic: "layout.zone", tag: "p-zone", props: ["designWidth"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u65AD\u70B9\u5206\u533A\uFF09", tier: "L2", status: "planned" },
1222
+ // ★批次 7(2026-09-18)未登记组件补登记:安全区(刘海/折叠屏/降级)+ 侧边导航容器
1223
+ { id: "L15", kind: "layout", semantic: "layout.safe", tag: "p-safe", props: ["area", "fold", "fallback"], mpEquiv: "\u65E0\uFF08\u5B89\u5168\u533A\u8BED\u4E49\u5BB9\u5668\uFF09", tier: "L1", status: "implemented" },
1224
+ { id: "L16", kind: "layout", semantic: "layout.sidebar", tag: "p-sidebar", props: ["minSidebarWidth", "navWidth", "designWidth", "toggleLabel"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u65AD\u70B9\u4FA7\u680F\uFF09", tier: "L1", status: "implemented" }
1206
1225
  ];
1207
1226
  var UI = [
1208
1227
  { id: "U1", kind: "ui", semantic: "ui.text", tag: "p-text", props: ["content", "selectable", "truncate", "align", "userSelect", "overflow", "maxLines", "selectOnGesture", "space", "decode"], mpEquiv: "<text>", tier: "L1", status: "implemented" },
1209
1228
  { id: "U2", kind: "ui", semantic: "ui.heading", tag: "p-heading", props: ["level"], mpEquiv: "<h1>-<h6>", tier: "L1", status: "implemented" },
1210
- { id: "U3", kind: "ui", semantic: "ui.rich-text", tag: "p-rich-text", props: ["source", "schema"], mpEquiv: "<rich-text>", tier: "L1", status: "implemented" },
1229
+ { id: "U3", kind: "ui", semantic: "ui.rich-text", tag: "p-rich-text", props: ["nodes", "space", "userSelect", "mode", "source"], mpEquiv: "<rich-text>", tier: "L1", status: "implemented" },
1211
1230
  { id: "U4", kind: "ui", semantic: "ui.icon", tag: "p-icon", props: ["name", "type", "size", "color", "spin"], mpEquiv: "<icon>", tier: "L1", status: "implemented" },
1212
1231
  { id: "U5", kind: "ui", semantic: "ui.image", tag: "p-image", props: ["src", "fit", "placeholder", "lazy", "showMenuByLongpress", "fadeIn", "preload", "webp", "referrerPolicy"], mpEquiv: "<image>", tier: "L1", status: "implemented" },
1213
1232
  { id: "U6", kind: "ui", semantic: "ui.avatar", tag: "p-avatar", props: ["src", "shape", "size", "fallback"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
1214
- { id: "U7", kind: "ui", semantic: "ui.media", tag: "p-media", props: ["kind", "controls", "autoplay", "poster", "loop", "muted", "pictureInPicture"], mpEquiv: "<video>+<audio>", tier: "L1", status: "implemented" },
1215
- { id: "U8", kind: "ui", semantic: "ui.canvas", tag: "p-canvas", props: ["engine", "resolution"], mpEquiv: "<canvas>", tier: "L1", status: "implemented" },
1233
+ { id: "U7", kind: "ui", semantic: "ui.media", tag: "p-media", props: ["kind", "src", "duration", "controls", "autoplay", "loop", "muted", "initialTime", "poster", "objectFit", "title", "playBtnPosition", "direction", "showProgress", "showFullscreenBtn", "showPlayBtn", "showCenterPlayBtn", "showMuteBtn", "showBottomProgress", "enableProgressGesture", "enablePlayGesture", "pageGesture", "vslideGesture", "vslideGestureInFullscreen", "autoPauseIfNavigate", "autoPauseIfOpenNative", "danmuList", "danmuBtn", "enableDanmu", "pictureInPicture"], mpEquiv: "<video>+<audio>", tier: "L1", status: "implemented" },
1234
+ { id: "U8", kind: "ui", semantic: "ui.canvas", tag: "p-canvas", props: ["engine", "canvasId", "disableScroll", "resolution"], mpEquiv: "<canvas>", tier: "L1", status: "implemented" },
1216
1235
  { id: "U9", kind: "ui", semantic: "ui.svg", tag: "p-svg", props: ["path", "viewbox"], mpEquiv: "\u65E0", tier: "L1", status: "implemented" },
1217
1236
  { id: "U10", kind: "ui", semantic: "ui.input", tag: "p-input", props: ["type", "mask", "validation", "clearable"], mpEquiv: "<input>", tier: "L1", status: "implemented" },
1218
1237
  { id: "U11", kind: "ui", semantic: "ui.textarea", tag: "p-textarea", props: ["autosize", "maxLength", "count"], mpEquiv: "<textarea>", tier: "L1", status: "implemented" },
@@ -1233,9 +1252,16 @@ var UI = [
1233
1252
  // ★权威标尺批 H:局部文本选区
1234
1253
  { id: "U24", kind: "ui", semantic: "ui.selection", tag: "p-selection", props: ["disableContextMenu", "selectable"], mpEquiv: "<selection>", tier: "L1", status: "implemented" },
1235
1254
  // ★权威标尺批 I:相机
1236
- { id: "U25", kind: "ui", semantic: "ui.camera", tag: "p-camera", props: ["devicePosition", "flash", "aspectRatio"], mpEquiv: "<camera>", tier: "L1", status: "implemented" },
1255
+ { id: "U25", kind: "ui", semantic: "ui.camera", tag: "p-camera", props: ["mode", "resolution", "devicePosition", "flash", "frameSize", "aspectRatio"], mpEquiv: "<camera>", tier: "L1", status: "implemented" },
1237
1256
  // ★权威标尺批 J:地图
1238
- { id: "U26", kind: "ui", semantic: "ui.map", tag: "p-map", props: ["latitude", "longitude", "scale", "markers"], mpEquiv: "<map>", tier: "L1", status: "implemented" }
1257
+ { id: "U26", kind: "ui", semantic: "ui.map", tag: "p-map", props: ["latitude", "longitude", "scale", "minScale", "maxScale", "markers", "polyline", "circles", "polygons", "includePoints", "showLocation", "layerStyle", "rotate", "skew", "showCompass", "showScale", "enableZoom", "enableScroll", "enableRotate", "enableSatellite", "enableTraffic", "enablePoi", "enableBuilding", "enableOverlooking", "setting"], mpEquiv: "<map>", tier: "L1", status: "implemented" },
1258
+ // ★批次 7(2026-09-18)未登记组件补登记:这 3 个组件此前**只存在于 TAG_SEMANTIC_MAP**(编译器能解析、
1259
+ // 组件能渲染),但不在 SSOT catalog → C1 不变量(catalog tag ↔ TAG_SEMANTIC_MAP 双向)单向成立、
1260
+ // catalog 查询类 API(primitiveByTag / componentPrimitives)查不到它们。
1261
+ // ★p-button 尤其反讽:它是**端对齐全流程的参考实现**(21/21、SOP v2 范式),却不在语义清单里。
1262
+ { id: "U27", kind: "ui", semantic: "ui.button", tag: "p-button", props: ["disabled", "loading", "throttle", "size", "type", "plain", "formType", "openType", "hoverClass", "theme", "hoverStopPropagation", "hoverStartTime", "hoverStayTime", "lang", "sessionFrom", "sendMessageTitle", "sendMessagePath", "sendMessageImg", "appParameter", "showMessageCard", "phoneNumberNoQuotaToast", "needShowEntrance", "entrancePath"], mpEquiv: "<button>", tier: "L1", status: "implemented" },
1263
+ { id: "U28", kind: "ui", semantic: "ui.list", tag: "p-list-view", props: ["items", "itemHeight", "height", "bufferSize", "virtual", "lazy", "padding"], mpEquiv: "<list-view>\uFF08\u865A\u62DF\u6EDA\u52A8\uFF09", tier: "L1", status: "implemented" },
1264
+ { id: "U29", kind: "ui", semantic: "ui.nav", tag: "p-nav-bar", props: ["title", "back", "fixed", "loading", "frontColor", "backgroundColor", "colorAnimationDuration", "colorAnimationTimingFunc"], mpEquiv: "<navigation-bar>\uFF08\u81EA\u7ED8\uFF09", tier: "L1", status: "implemented" }
1239
1265
  ];
1240
1266
  var SHELL = [
1241
1267
  { id: "S1", kind: "shell", semantic: "shell.page", tag: "p-page", props: ["title", "statusBar", "pullRefresh"], mpEquiv: "<page>", tier: "L1", status: "implemented" },
@@ -1259,17 +1285,21 @@ var SHELL = [
1259
1285
  { id: "S15", kind: "shell", semantic: "shell.keyboard-accessory", tag: "p-keyboard-accessory", props: ["visible", "maxHeight", "background"], mpEquiv: "<keyboard-accessory>", tier: "L1", status: "implemented" },
1260
1286
  // ★权威标尺批 J:内嵌网页 / 广告位
1261
1287
  { id: "S16", kind: "shell", semantic: "shell.webview", tag: "p-webview", props: ["src", "height", "sandbox"], mpEquiv: "<web-view>", tier: "L1", status: "implemented" },
1262
- { id: "S17", kind: "shell", semantic: "shell.ad", tag: "p-ad", props: ["unitId", "adIntervals", "adType", "height"], mpEquiv: "<ad>", tier: "L1", status: "implemented" }
1288
+ { id: "S17", kind: "shell", semantic: "shell.ad", tag: "p-ad", props: ["unitId", "adIntervals", "adType", "adTheme", "height"], mpEquiv: "<ad>", tier: "L1", status: "implemented" }
1263
1289
  ];
1264
1290
  var GESTURE = [
1265
- { id: "G1", kind: "gesture", semantic: "gesture.tap", api: "v-gesture:tap", props: ["count"], mpEquiv: "bindtap", tier: "L1", status: "planned" },
1266
- { id: "G2", kind: "gesture", semantic: "gesture.longpress", api: "v-gesture:longpress", props: ["duration", "onEnd"], mpEquiv: "bindlongpress", tier: "L1", status: "planned" },
1267
- { id: "G3", kind: "gesture", semantic: "gesture.swipe", api: "v-gesture:swipe", props: ["direction", "threshold"], mpEquiv: "bindswipe", tier: "L1", status: "planned" },
1268
- { id: "G4", kind: "gesture", semantic: "gesture.pan", api: "v-gesture:pan", props: ["axis", "bounds"], mpEquiv: "bindtouchmove", tier: "L1", status: "planned" },
1269
- { id: "G5", kind: "gesture", semantic: "gesture.pinch", api: "v-gesture:pinch", props: ["scale", "onChange"], mpEquiv: "touchstart/move \u7EC4\u5408", tier: "L1", status: "planned" },
1270
- { id: "G6", kind: "gesture", semantic: "gesture.rotate", api: "v-gesture:rotate", props: ["angle"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "planned" },
1271
- { id: "G7", kind: "gesture", semantic: "gesture.press", api: "v-gesture:press", props: ["force"], mpEquiv: "3D Touch", tier: "L1", status: "planned" },
1272
- { id: "G8", kind: "gesture", semantic: "gesture.draggable", tag: "p-draggable", props: ["ghost", "snapToGrid", "onDrop"], mpEquiv: "movable-view", tier: "L1", status: "implemented" },
1291
+ // ★2026-09-18:G1/G2 由 planned → implemented——`v-gesture:tap|longpress` 已双端落地
1292
+ // (编译器新增 `directive/v-gesture` 规则:MP 映射 bindtap/bindlongpress;Web 走 Pointer 识别器)。
1293
+ // ★G3–G7 **保持 planned**:MP 端无事件对等(官方用 worklet 手势处理器<组件>,框架未生成),
1294
+ // mpEquiv 已改为**如实描述**(原值 bindswipe/bindtouchmove/组合/3D Touch 多为不准确表述)。
1295
+ { id: "G1", kind: "gesture", semantic: "gesture.tap", api: "v-gesture:tap", props: ["count"], mpEquiv: "bindtap\uFF08\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u7F16\u8BD1\u5668\u76F4\u6620\u5C04\uFF09", tier: "L1", status: "implemented" },
1296
+ { id: "G2", kind: "gesture", semantic: "gesture.longpress", api: "v-gesture:longpress", props: ["duration", "onEnd"], mpEquiv: "bindlongpress\uFF08\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u7F16\u8BD1\u5668\u76F4\u6620\u5C04\uFF09", tier: "L1", status: "implemented" },
1297
+ { id: "G3", kind: "gesture", semantic: "gesture.swipe", api: "v-gesture:swipe", props: ["direction", "threshold"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u9700 @touchstart/@touchend \u81EA\u884C\u5224\u5B9A\u65B9\u5411", tier: "L1", status: "planned" },
1298
+ { id: "G4", kind: "gesture", semantic: "gesture.pan", api: "v-gesture:pan", props: ["axis", "bounds"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <pan-gesture-handler>\uFF08worklet\uFF09\u6216 touch \u65CF\u81EA\u884C\u5224\u5B9A", tier: "L1", status: "planned" },
1299
+ { id: "G5", kind: "gesture", semantic: "gesture.pinch", api: "v-gesture:pinch", props: ["scale", "onChange"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <scale-gesture-handler>\uFF08worklet\uFF09", tier: "L1", status: "planned" },
1300
+ { id: "G6", kind: "gesture", semantic: "gesture.rotate", api: "v-gesture:rotate", props: ["angle"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\uFF08MP \u65E0 rotate \u624B\u52BF\u5904\u7406\u5668\uFF09", tier: "L1", status: "planned" },
1301
+ { id: "G7", kind: "gesture", semantic: "gesture.press", api: "v-gesture:press", props: ["force"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <force-press-gesture-handler>\uFF08worklet\uFF0C\u9700 3D Touch \u8BBE\u5907\uFF09", tier: "L1", status: "planned" },
1302
+ { id: "G8", kind: "gesture", semantic: "gesture.draggable", tag: "p-draggable", props: ["direction", "inertia", "outOfBounds", "x", "y", "damping", "friction", "disabled", "scaleEnabled", "scaleMin", "scaleMax", "scaleValue", "animation", "scaleArea", "ghost", "snapToGrid", "onDrop"], mpEquiv: "movable-view", tier: "L1", status: "implemented" },
1273
1303
  { id: "G9", kind: "gesture", semantic: "gesture.scrollable", tag: "p-scrollable", props: ["bounce", "refresh", "loadMore"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
1274
1304
  { id: "G10", kind: "gesture", semantic: "gesture.use-gesture", api: "useGesture()", props: ["recognizers", "simultaneous"], mpEquiv: "\u65E0", tier: "L1", status: "planned" }
1275
1305
  ];
@@ -1278,9 +1308,10 @@ function cap(id, name, api, mpEquiv, returnType) {
1278
1308
  }
1279
1309
  var CAPABILITY = [
1280
1310
  // 7.1 设备/硬件(15)
1281
- cap("C1", "camera", "useCamera()", "wx.createCameraContext", "Result<Media>"),
1311
+ // ★2026-09-18 双形态(E8 先例):能力入口组件 p-pick-photo 即 useCamera() 的声明式入口
1312
+ { id: "C1", kind: "capability", semantic: "capability.camera", api: "useCamera()", tag: "p-pick-photo", props: ["Result<Media>"], mpEquiv: "wx.createCameraContext", tier: "L1", status: "implemented" },
1282
1313
  cap("C2", "microphone", "useMicrophone()", "RecorderManager", "Result<AudioBuffer>"),
1283
- { id: "C3", kind: "capability", semantic: "capability.location", api: "useLocation()", props: ["Result<Coords>"], mpEquiv: "wx.getLocation", tier: "L1", status: "implemented" },
1314
+ { id: "C3", kind: "capability", semantic: "capability.location", api: "useLocation()", tag: "p-location", props: ["Result<Coords>"], mpEquiv: "wx.getLocation", tier: "L1", status: "implemented" },
1284
1315
  cap("C4", "map", "useMap()", "wx.createMapContext", "MapController"),
1285
1316
  cap("C5", "sensor", "useSensor()", "onAccelerometer/onCompass/onGyroscope", "SensorStream"),
1286
1317
  cap("C6", "vibrate", "useVibrate()", "wx.vibrateShort/Long", "void"),
@@ -1322,7 +1353,8 @@ var CAPABILITY = [
1322
1353
  cap("C39", "face-id", "useFaceID()", "\u7EC4\u5408", "Result<boolean>"),
1323
1354
  cap("C40", "payment", "usePayment()", "wx.requestPayment", "Result<PayResult>"),
1324
1355
  cap("C41", "login", "useLogin()", "wx.login", "Result<Token>"),
1325
- cap("C42", "qr-code", "useQRCode()", "wx.scanCode + canvas", "Result<string>"),
1356
+ // ★2026-09-18 双形态(E8 先例):能力入口组件 p-scan-qr 即 useQRCode() 的声明式入口
1357
+ { id: "C42", kind: "capability", semantic: "capability.qr-code", api: "useQRCode()", tag: "p-scan-qr", props: ["Result<string>"], mpEquiv: "wx.scanCode + canvas", tier: "L1", status: "implemented" },
1326
1358
  cap("C43", "file-system", "useFileSystem()", "wx.getFileSystemManager", "FSAdapter"),
1327
1359
  cap("C44", "archive", "useArchive()", "wx.compressFile", "Result<void>"),
1328
1360
  cap("C45", "shortcut", "useShortcut()", "wx.addToDesktop", "Result<void>"),
@@ -1404,7 +1436,18 @@ var ENGINEERING = [
1404
1436
  { id: "E25", kind: "engineering", semantic: "engineering.inspector", api: "useInspector()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
1405
1437
  { id: "E26", kind: "engineering", semantic: "engineering.performance", api: "usePerformance()", mpEquiv: "wx.reportPerformance", tier: "L1", status: "planned" },
1406
1438
  { id: "E27", kind: "engineering", semantic: "engineering.define-component", api: "defineComponent()", mpEquiv: "Component()", tier: "L1", status: "planned" },
1407
- { id: "E28", kind: "engineering", semantic: "engineering.define-capability", api: "defineCapability()", mpEquiv: "\u65E0", tier: "L1", status: "planned" }
1439
+ { id: "E28", kind: "engineering", semantic: "engineering.define-capability", api: "defineCapability()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
1440
+ // ★批次 8(2026-09-18):共享元素转场(官方 <share-element> 对齐)——能力由宿主提供,框架只声明语义
1441
+ { id: "E29", kind: "engineering", semantic: "engineering.share-element", tag: "p-share-element", props: ["shuttleKey", "animate", "duration", "easingFunction", "transitionOnGesture", "shuttleOnPush", "shuttleOnPop", "rectTweenType"], mpEquiv: "<share-element>\uFF08\u5BBF\u4E3B\u8DE8\u9875\u98DE\u884C\u52A8\u753B\uFF09", tier: "L1", status: "implemented" },
1442
+ // ★E30(2026-09-19):WebMCP 接入——把**能力面**暴露为浏览器内 agent 可调用工具。
1443
+ // 规范面:`document.modelContext.registerTool(...)`(★非 navigator)+ signal 注销(规范无 unregisterTool);
1444
+ // 灵感来自 VueUse v15 `useWebMCP`(document 命名空间 / signal 注销 / 方法可调用探测 / 三元组返回)。
1445
+ // 框架差异化:能力面统一 `CapResult<T>` 契约(G-32.4)→ 能力可**自动**派生为工具、响应归一不必逐个手写。
1446
+ // ★状态口径(与 E1-E28 / C15 / C26 等同款,非本轮新引入):hook 形态原语无**渲染后端映射**,
1447
+ // 故按 catalog 既有约定记 `planned`——该字段反映「已在 SEMANTIC_BACKEND_MAP 登记 ≥3 端」,
1448
+ // 不等于「代码未实现」(本原语已实现于 `packages/api/src/mcp.ts`)。
1449
+ // `mpEquiv: 无`:WebMCP 是浏览器侧 agent 通道,小程序无 `document.modelContext` → 如实降级(isSupported=false)。
1450
+ { id: "E30", kind: "engineering", semantic: "engineering.mcp", api: "useMCP()", props: ["tools", "capabilities", "prefix"], mpEquiv: "\u65E0\uFF08\u6D4F\u89C8\u5668\u4FA7 agent \u901A\u9053\uFF1BMP \u7AEF isSupported=false \u8BDA\u5B9E\u964D\u7EA7\uFF09", tier: "L1", status: "planned" }
1408
1451
  ];
1409
1452
  var PRIMITIVE_CATALOG = [...LAYOUT, ...UI, ...SHELL, ...GESTURE, ...CAPABILITY, ...ENGINEERING];
1410
1453
 
@@ -1447,7 +1490,7 @@ var MP_COMPONENTS = [
1447
1490
  { mp: "<ad>", proteus: "shell.ad\uFF08p-ad\uFF09", status: "ok", group: "component" },
1448
1491
  { mp: "<official-account>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
1449
1492
  { mp: "<open-data>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
1450
- { mp: "<share-element>", proteus: "p-share-element\uFF08L2 \u89C4\u5212\uFF09", status: "compat", group: "component", planned: true },
1493
+ { mp: "<share-element>", proteus: "engineering.share-element\uFF08p-share-element\uFF09", status: "ok", group: "component" },
1451
1494
  { mp: "<aria-component>", proteus: "aria-* \u5C5E\u6027\uFF08\u5404\u7EC4\u4EF6 ariaLabel\uFF1B\u4E24\u7AEF\u539F\u751F\u652F\u6301\uFF09", status: "ok", group: "component" },
1452
1495
  { mp: "<page-container>", proteus: "shell.page-container", status: "ok", group: "component" },
1453
1496
  { mp: "<voip-room>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1 VOIP\uFF09", status: "private", group: "component" },
@@ -1533,6 +1576,110 @@ var MP_API_GROUPS = [
1533
1576
  ];
1534
1577
  var MP_MAPPING_MATRIX = [...MP_COMPONENTS, ...MP_API_GROUPS];
1535
1578
 
1579
+ // ../component-ir/src/degradation.ts
1580
+ var PRIVATE_WEB_FALLBACK = {
1581
+ openType: "Web \u89E6\u53D1\u540C\u540D\u4E8B\u4EF6\uFF08\u5982 @contact\uFF09+ console \u63D0\u793A\u81EA\u5B9A\u4E49\u5BF9\u5E94\u4EA4\u4E92\uFF08\u53C2\u8003 Web p-button open-type\uFF09",
1582
+ appId: "Web \u65E0\u8DE8\u5E94\u7528\u8DF3\u8F6C\u80FD\u529B\uFF0C\u4EC5\u56DE\u663E\u53C2\u6570\u5E76\u63D0\u793A",
1583
+ shortLink: "Web \u65E0\u77ED\u94FE\u8DF3\u8F6C\u80FD\u529B\uFF0C\u4EC5\u56DE\u663E\u53C2\u6570\u5E76\u63D0\u793A",
1584
+ unitId: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u4F4D\uFF0C\u6E32\u67D3\u5360\u4F4D\u5E76\u63D0\u793A\uFF08\u4E0D\u9759\u9ED8\uFF09",
1585
+ adType: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u7C7B\u578B\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1586
+ adTheme: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u4E3B\u9898\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1587
+ adIntervals: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u81EA\u52A8\u5237\u65B0\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A"
1588
+ };
1589
+ var STYLE_WEB_FALLBACK = {
1590
+ hoverClass: "\u6620\u5C04 CSS :active/:hover \u7C7B\uFF08\u6846\u67B6\u9ED8\u8BA4\u7C7B\u6052\u5728\uFF0C\u81EA\u5B9A\u4E49\u7C7B\u4F5C\u9644\u52A0\u2014\u2014T3\uFF09",
1591
+ hoverStartTime: "Web \u7528 CSS transition-delay \u8FD1\u4F3C\u6309\u538B\u8D77\u59CB\u5EF6\u65F6",
1592
+ hoverStayTime: "Web \u7528 CSS transition-duration \u8FD1\u4F3C\u6309\u538B\u505C\u7559\u65F6\u957F",
1593
+ hoverStopPropagation: "Web \u7528 CSS pointer-events \u963B\u65AD\u5B50\u7EA7\u53CD\u9988\u8FD1\u4F3C"
1594
+ };
1595
+ var MP_HOST_WEB_FALLBACK = {
1596
+ alwaysEmbed: "Web \u65E0\u540C\u5C42/\u975E\u540C\u5C42\u5207\u6362\u6982\u5FF5\uFF08input \u59CB\u7EC8\u5728\u6587\u6863\u6D41\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1597
+ confirmHold: "Web \u65E0\u6CD5\u63A7\u5236\u8F6F\u952E\u76D8\u6536\u8D77\u65F6\u673A\uFF08\u7531\u6D4F\u89C8\u5668/\u7CFB\u7EDF\u51B3\u5B9A\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1598
+ adjustPosition: "Web \u7531\u6D4F\u89C8\u5668\u81EA\u8EAB\u5904\u7406\u952E\u76D8\u5F39\u8D77\u65F6\u7684\u89C6\u53E3\u6EDA\u52A8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1599
+ holdKeyboard: "Web \u65E0\u6CD5\u5728\u5931\u7126\u70B9\u51FB\u65F6\u4FDD\u6301\u952E\u76D8\uFF08\u6D4F\u89C8\u5668\u884C\u4E3A\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1600
+ cursorColor: "Web \u8FD1\u4F3C\uFF1ACSS caret-color\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
1601
+ selectionStart: "Web \u8FD1\u4F3C\uFF1AsetSelectionRange\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
1602
+ selectionEnd: "Web \u8FD1\u4F3C\uFF1AsetSelectionRange\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
1603
+ placeholderClass: "Web \u65E0\u300C\u5360\u4F4D\u7B26\u4E13\u7528\u7C7B\u540D\u300D\u901A\u9053\uFF08::placeholder \u4E0D\u53EF\u627F\u63A5\u4EFB\u610F\u7C7B\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1604
+ safePasswordCertPath: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF08\u5BBF\u4E3B\u7EA7\u52A0\u5BC6\u952E\u76D8\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1605
+ safePasswordLength: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1606
+ safePasswordTimeStamp: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1607
+ safePasswordNonce: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1608
+ safePasswordSalt: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1609
+ safePasswordCustomHash: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
1610
+ reportSubmit: "formId \u662F\u5C0F\u7A0B\u5E8F\u6A21\u677F\u6D88\u606F\u5BBF\u4E3B\u80FD\u529B\uFF0CWeb \u65E0\u5BF9\u5E94 \u2192 \u5FFD\u7565\u5E76\u63D0\u793A",
1611
+ reportSubmitTimeout: "formId \u662F\u5C0F\u7A0B\u5E8F\u6A21\u677F\u6D88\u606F\u5BBF\u4E3B\u80FD\u529B\uFF0CWeb \u65E0\u5BF9\u5E94 \u2192 \u5FFD\u7565\u5E76\u63D0\u793A"
1612
+ };
1613
+ var HOST_TAGS = {
1614
+ "p-map": "Web \u6A21\u62DF\u5C42\u6E32\u67D3\u9759\u6001\u5360\u4F4D\u5BB9\u5668\uFF0C\u5FFD\u7565\u8BE5\u5730\u56FE\u663E\u793A\u53C2\u6570\u5E76\u63D0\u793A",
1615
+ "p-media": "Web \u7528\u539F\u751F <video>\uFF0C\u5FFD\u7565\u8BE5\u64AD\u653E\u5668\u5916\u89C2/\u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A",
1616
+ "p-camera": "Web \u65E0\u6444\u50CF\u5934\u5BBF\u4E3B\uFF0C\u5FFD\u7565\u8BE5\u91C7\u96C6\u53C2\u6570\u5E76\u63D0\u793A\uFF08\u53EF\u9000\u5316 getUserMedia \u65F6\u53E6\u884C\u5B9E\u73B0\uFF09",
1617
+ "p-ad": "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\uFF0C\u5FFD\u7565\u8BE5\u5E7F\u544A\u53C2\u6570\u5E76\u63D0\u793A",
1618
+ "p-canvas": "Web \u7528 HTMLCanvasElement\uFF0C\u5FFD\u7565\u8BE5\u5C0F\u7A0B\u5E8F\u6E32\u67D3\u4E0A\u4E0B\u6587\u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A",
1619
+ "p-webview": "Web \u7528 <iframe>\uFF0C\u5FFD\u7565\u8BE5\u5C0F\u7A0B\u5E8F web-view \u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A"
1620
+ };
1621
+ var WEB_EXTENSION_MP_FALLBACK = {
1622
+ density: "\u5C0F\u7A0B\u5E8F\u65E0 DPI \u5BC6\u5EA6\u6982\u5FF5\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF08rpx \u5DF2\u6309\u8BBE\u8BA1\u7A3F\u5BBD\u5EA6\u6362\u7B97\uFF09",
1623
+ designWidth: "\u5C0F\u7A0B\u5E8F\u7528 rpx \u57FA\u51C6\uFF08750\uFF09\uFF0C\u8BE5 Web \u4E13\u7528\u57FA\u51C6\u5FFD\u7565\u5E76\u63D0\u793A",
1624
+ searchable: "\u5C0F\u7A0B\u5E8F\u65E0\u5185\u5EFA\u641C\u7D22\u8BED\u4E49\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF08\u7531\u4E1A\u52A1\u4FA7\u81EA\u7ED8\uFF09"
1625
+ };
1626
+ var TAG_PROP_MP_FALLBACK = {
1627
+ "p-stack": {
1628
+ snap: "\u5C0F\u7A0B\u5E8F view \u4E0D\u6EDA\u52A8\uFF08Skyline \u65E0 CSS overflow \u6EDA\u52A8\uFF0CS14 \u5B9E\u6D4B\uFF09\u2192 \u5438\u9644\u65E0\u8F7D\u4F53\uFF0C\u964D\u7EA7\u4E3A\u666E\u901A\u6392\u5217 + \u53EF\u89C2\u5BDF\u63D0\u793A\uFF1B\u9700\u7FFB\u9875\u8BF7\u7528 p-scroll-view \u7684 paging-enabled",
1629
+ loop: "\u56DE\u73AF\u4F9D\u8D56\u5438\u9644\u5BB9\u5668\uFF0C\u800C\u5C0F\u7A0B\u5E8F view \u4E0D\u6EDA\u52A8\uFF08S14\uFF09\u2192 \u4E00\u5E76\u964D\u7EA7\u4E3A\u666E\u901A\u6392\u5217 + \u53EF\u89C2\u5BDF\u63D0\u793A"
1630
+ }
1631
+ };
1632
+ var RULE_REGISTERED_PROPS = [
1633
+ ...Object.keys(PRIVATE_WEB_FALLBACK),
1634
+ ...Object.keys(STYLE_WEB_FALLBACK),
1635
+ ...Object.keys(WEB_EXTENSION_MP_FALLBACK),
1636
+ ...Object.keys(MP_HOST_WEB_FALLBACK),
1637
+ ...Object.values(TAG_PROP_MP_FALLBACK).flatMap((m) => Object.keys(m))
1638
+ ];
1639
+ var HOST_FALLBACK_TAGS = Object.keys(HOST_TAGS);
1640
+ function degradeProp(tag, prop) {
1641
+ const style = STYLE_WEB_FALLBACK[prop];
1642
+ if (style) return { mp: "supported", web: "fallback", behavior: style };
1643
+ const priv = PRIVATE_WEB_FALLBACK[prop];
1644
+ if (priv) return { mp: "supported", web: "fallback", behavior: priv };
1645
+ const mpHost = MP_HOST_WEB_FALLBACK[prop];
1646
+ if (mpHost) return { mp: "supported", web: "fallback", behavior: mpHost };
1647
+ if (tag && HOST_TAGS[tag]) {
1648
+ return { mp: "supported", web: "fallback", behavior: HOST_TAGS[tag] };
1649
+ }
1650
+ const tagProp = tag ? TAG_PROP_MP_FALLBACK[tag] : void 0;
1651
+ const tagPropBehavior = tagProp ? tagProp[prop] : void 0;
1652
+ if (tagPropBehavior) return { mp: "fallback", web: "supported", behavior: tagPropBehavior };
1653
+ const webExt = WEB_EXTENSION_MP_FALLBACK[prop];
1654
+ if (webExt) return { mp: "fallback", web: "supported", behavior: webExt };
1655
+ return { mp: "supported", web: "supported" };
1656
+ }
1657
+ function degradationOf(prim) {
1658
+ const out = {};
1659
+ for (const p of prim.props ?? []) out[p] = degradeProp(prim.tag, p);
1660
+ return out;
1661
+ }
1662
+ var DEGRADATION_TABLE = (() => {
1663
+ const out = {};
1664
+ for (const prim of PRIMITIVE_CATALOG) {
1665
+ if (!prim.tag) continue;
1666
+ out[prim.tag] = degradationOf(prim);
1667
+ }
1668
+ return out;
1669
+ })();
1670
+ var MP_UNSUPPORTED_PROPS = (() => {
1671
+ const kebab = (s) => s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
1672
+ const out = {};
1673
+ for (const [tag, table] of Object.entries(DEGRADATION_TABLE)) {
1674
+ const set = /* @__PURE__ */ new Set();
1675
+ for (const [prop, entry] of Object.entries(table)) {
1676
+ if (entry.mp === "unsupported") set.add(kebab(prop));
1677
+ }
1678
+ if (set.size) out[tag] = set;
1679
+ }
1680
+ return out;
1681
+ })();
1682
+
1536
1683
  // src/dispatcher.ts
1537
1684
  var DispatcherError = class extends Error {
1538
1685
  constructor(code, detail) {
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@proteus-vue/render-backend",
3
- "version": "0.1.1-beta.0",
3
+ "version": "0.1.1-beta.1",
4
4
  "description": "G-27 ProteusRenderBackend SPI:可插拔渲染后端接口 + conformance test + 官方后端原型(Headless/VueDom) + G-41 nodeOps Dispatcher——Render anywhere, on any engine(M1.4)",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
7
7
  "dependencies": {
8
- "@proteus-vue/component-ir": "0.1.1-beta.0",
9
- "@proteus-vue/contracts": "0.1.0"
8
+ "@proteus-vue/component-ir": "0.2.0-beta.1",
9
+ "@proteus-vue/contracts": "0.1.1-beta.0"
10
10
  },
11
11
  "peerDependencies": {
12
12
  "@vue/runtime-core": "^3.4.0"