@proteus-vue/render-backend 0.1.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.
- package/LICENSE +218 -0
- package/dist/basic-containers.d.ts +3 -1
- package/dist/index.js +452 -94
- package/dist/spi.d.ts +2 -1
- package/package.json +4 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
Proteus(普罗透斯)Vue 跨端编译框架
|
|
2
|
+
Copyright (c) 2026 Proteus Contributors
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
|
|
16
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
17
|
+
|
|
18
|
+
Apache License
|
|
19
|
+
Version 2.0, January 2004
|
|
20
|
+
http://www.apache.org/licenses/
|
|
21
|
+
|
|
22
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
23
|
+
|
|
24
|
+
1. Definitions.
|
|
25
|
+
|
|
26
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
27
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
28
|
+
|
|
29
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
30
|
+
the copyright owner that is granting the License.
|
|
31
|
+
|
|
32
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
33
|
+
other entities that control, are controlled by, or are under common
|
|
34
|
+
control with that entity. For the purposes of this definition,
|
|
35
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
36
|
+
direction or management of such entity, whether by contract or
|
|
37
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
38
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
39
|
+
|
|
40
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
41
|
+
exercising permissions granted by this License.
|
|
42
|
+
|
|
43
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
44
|
+
including but not limited to software source code, documentation
|
|
45
|
+
source, and configuration files.
|
|
46
|
+
|
|
47
|
+
"Object" form shall mean any form resulting from mechanical
|
|
48
|
+
transformation or translation of a Source form, including but
|
|
49
|
+
not limited to compiled object code, generated documentation,
|
|
50
|
+
and conversions to other media types.
|
|
51
|
+
|
|
52
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
53
|
+
Object form, made available under the License, as indicated by a
|
|
54
|
+
copyright notice that is included in or attached to the work
|
|
55
|
+
(an example is provided in the Appendix below).
|
|
56
|
+
|
|
57
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
58
|
+
form, that is based on (or derived from) the Work and for which the
|
|
59
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
60
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
61
|
+
of this License, Derivative Works shall not include works that remain
|
|
62
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
63
|
+
the Work and Derivative Works thereof.
|
|
64
|
+
|
|
65
|
+
"Contribution" shall mean any work of authorship, including
|
|
66
|
+
the original version of the Work and any modifications or additions
|
|
67
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
68
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
69
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
70
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
71
|
+
means any form of electronic, verbal, or written communication sent
|
|
72
|
+
to the Licensor or its representatives, including but not limited to
|
|
73
|
+
communication on electronic mailing lists, source code control systems,
|
|
74
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
75
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
76
|
+
excluding communication that is conspicuously marked or otherwise
|
|
77
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
78
|
+
|
|
79
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
80
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
81
|
+
subsequently incorporated within the Work.
|
|
82
|
+
|
|
83
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
84
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
85
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
86
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
87
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
88
|
+
Work and such Derivative Works in Source or Object form.
|
|
89
|
+
|
|
90
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
91
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
92
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
93
|
+
(except as stated in this section) patent license to make, have made,
|
|
94
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
95
|
+
where such license applies only to those patent claims licensable
|
|
96
|
+
by such Contributor that are necessarily infringed by their
|
|
97
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
98
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
99
|
+
institute patent litigation against any entity (including a
|
|
100
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
101
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
102
|
+
or contributory patent infringement, then any patent licenses
|
|
103
|
+
granted to You under this License for that Work shall terminate
|
|
104
|
+
as of the date such litigation is filed.
|
|
105
|
+
|
|
106
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
107
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
108
|
+
modifications, and in Source or Object form, provided that You
|
|
109
|
+
meet the following conditions:
|
|
110
|
+
|
|
111
|
+
(a) You must give any other recipients of the Work or
|
|
112
|
+
Derivative Works a copy of this License; and
|
|
113
|
+
|
|
114
|
+
(b) You must cause any modified files to carry prominent notices
|
|
115
|
+
stating that You changed the files; and
|
|
116
|
+
|
|
117
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
118
|
+
that You distribute, all copyright, patent, trademark, and
|
|
119
|
+
attribution notices from the Source form of the Work,
|
|
120
|
+
excluding those notices that do not pertain to any part of
|
|
121
|
+
the Derivative Works; and
|
|
122
|
+
|
|
123
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
124
|
+
distribution, then any Derivative Works that You distribute must
|
|
125
|
+
include a readable copy of the attribution notices contained
|
|
126
|
+
within such NOTICE file, excluding those notices that do not
|
|
127
|
+
pertain to any part of the Derivative Works, in at least one
|
|
128
|
+
of the following places: within a NOTICE text file distributed
|
|
129
|
+
as part of the Derivative Works; within the Source form or
|
|
130
|
+
documentation, if provided along with the Derivative Works; or,
|
|
131
|
+
within a display generated by the Derivative Works, if and
|
|
132
|
+
wherever such third-party notices normally appear. The contents
|
|
133
|
+
of the NOTICE file are for informational purposes only and
|
|
134
|
+
do not modify the License. You may add Your own attribution
|
|
135
|
+
notices within Derivative Works that You distribute, alongside
|
|
136
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
137
|
+
that such additional attribution notices cannot be construed
|
|
138
|
+
as modifying the License.
|
|
139
|
+
|
|
140
|
+
You may add Your own copyright statement to Your modifications and
|
|
141
|
+
may provide additional or different license terms and conditions
|
|
142
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
143
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
144
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
145
|
+
the conditions stated in this License.
|
|
146
|
+
|
|
147
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
148
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
149
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
150
|
+
this License, without any additional terms or conditions.
|
|
151
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
152
|
+
the terms of any separate license agreement you may have executed
|
|
153
|
+
with Licensor regarding such Contributions.
|
|
154
|
+
|
|
155
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
156
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
157
|
+
except as required for reasonable and customary use in describing the
|
|
158
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
159
|
+
|
|
160
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
161
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
162
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
163
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
164
|
+
implied, including, without limitation, any warranties or conditions
|
|
165
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
166
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
167
|
+
appropriateness of using or redistributing the Work and assume any
|
|
168
|
+
risks associated with Your exercise of permissions under this License.
|
|
169
|
+
|
|
170
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
171
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
172
|
+
unless required by applicable law (such as deliberate and grossly
|
|
173
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
174
|
+
liable to You for damages, including any direct, indirect, special,
|
|
175
|
+
incidental, or consequential damages of any character arising as a
|
|
176
|
+
result of this License or out of the use or inability to use the
|
|
177
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
178
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
179
|
+
other commercial damages or losses), even if such Contributor
|
|
180
|
+
has been advised of the possibility of such damages.
|
|
181
|
+
|
|
182
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
183
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
184
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
185
|
+
or other liability obligations and/or rights consistent with this
|
|
186
|
+
License. However, in accepting such obligations, You may act only
|
|
187
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
188
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
189
|
+
defend, and hold each Contributor harmless for any liability
|
|
190
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
191
|
+
of your accepting any such warranty or additional liability.
|
|
192
|
+
|
|
193
|
+
END OF TERMS AND CONDITIONS
|
|
194
|
+
|
|
195
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
196
|
+
|
|
197
|
+
To apply the Apache License to your work, attach the following
|
|
198
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
199
|
+
replaced with your own identifying information. (Don't include
|
|
200
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
201
|
+
comment syntax for the file format. We also recommend that a
|
|
202
|
+
file or class name and description of purpose be included on the
|
|
203
|
+
same "printed page" as the copyright notice for easier
|
|
204
|
+
identification within third-party archives.
|
|
205
|
+
|
|
206
|
+
Copyright [yyyy] [name of copyright owner]
|
|
207
|
+
|
|
208
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
209
|
+
you may not use this file except in compliance with the License.
|
|
210
|
+
You may obtain a copy of the License at
|
|
211
|
+
|
|
212
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
213
|
+
|
|
214
|
+
Unless required by applicable law or agreed to in writing, software
|
|
215
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
216
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
217
|
+
See the License for the specific language governing permissions and
|
|
218
|
+
limitations under the License.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PageConfig, PageHandle, ProteusHostContainer, BusinessSandbox } from './container-spi';
|
|
1
|
+
import type { PageConfig, PageHandle, ProteusHostContainer, BizManifest, BusinessSandbox } from './container-spi';
|
|
2
2
|
import type { StackContainer } from './stack-container';
|
|
3
3
|
import type { StackPolicy } from './container-spi';
|
|
4
4
|
import type { PageOwnership } from './page-ownership';
|
|
@@ -81,6 +81,8 @@ export interface MiniProgramContainer extends ProteusHostContainer {
|
|
|
81
81
|
registerTab(config: MiniProgramTabConfig): void;
|
|
82
82
|
listTabs(): string[];
|
|
83
83
|
ownershipOf(pageId: string): PageOwnership | null;
|
|
84
|
+
/** L1 沙箱(返回带 scope 隔离的小程序沙箱——覆盖基类 BusinessSandbox 宽返回型) */
|
|
85
|
+
createSandbox(bizId: string, manifest: BizManifest): Promise<MiniProgramSandbox>;
|
|
84
86
|
}
|
|
85
87
|
/** ★G-42 B6:小程序容器——页面栈导航语义(10 层上限)+ tab keep-alive + L1 沙箱(scope 隔离) */
|
|
86
88
|
export declare function createMiniProgramContainer(opts?: MiniProgramContainerOptions): MiniProgramContainer;
|
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.
|
|
90
|
-
"capability.
|
|
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,7 +126,18 @@ 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.
|
|
129
|
+
"engineering.share-element": "share-element",
|
|
130
|
+
"engineering.animate": "animate",
|
|
131
|
+
// ★能力颗粒度对齐 C2
|
|
132
|
+
"ui.progress": "progress",
|
|
133
|
+
"ui.label": "label",
|
|
134
|
+
"shell.page-container": "page-container",
|
|
135
|
+
"ui.selection": "selection",
|
|
136
|
+
"shell.keyboard-accessory": "keyboard-accessory",
|
|
137
|
+
"ui.camera": "camera",
|
|
138
|
+
"shell.webview": "webview",
|
|
139
|
+
"shell.ad": "ad",
|
|
140
|
+
"ui.map": "map"
|
|
130
141
|
};
|
|
131
142
|
var HEADLESS_CAPABILITIES = {
|
|
132
143
|
layout: "none",
|
|
@@ -243,8 +254,8 @@ var SEMANTIC_WEB_MAP = {
|
|
|
243
254
|
"ui.list": { tag: "div", className: "proteus-list" },
|
|
244
255
|
"ui.nav": { tag: "nav" },
|
|
245
256
|
// ★G-31 B5:能力入口(G-28 组件化)——Web 端用标准元素承载,能力实现由 useNative 注入
|
|
246
|
-
"capability.
|
|
247
|
-
"capability.
|
|
257
|
+
"capability.qr-code": { tag: "button", className: "proteus-scan-qr" },
|
|
258
|
+
"capability.camera": { tag: "input", className: "proteus-pick-photo" },
|
|
248
259
|
"capability.location": { tag: "button", className: "proteus-location" },
|
|
249
260
|
// ★G-32 B1:新增 implemented 语义(与 component-ir SEMANTIC_BACKEND_MAP vue-dom 列同源)
|
|
250
261
|
"layout.inline": { tag: "div", className: "proteus-inline" },
|
|
@@ -284,7 +295,19 @@ var SEMANTIC_WEB_MAP = {
|
|
|
284
295
|
"engineering.router-link": { tag: "a", className: "proteus-router-link" },
|
|
285
296
|
// ★G-32 B5 续二:工程原语动画组件形态(E19/E20——纯 CSS 声明)
|
|
286
297
|
"engineering.transition": { tag: "div", className: "proteus-transition" },
|
|
287
|
-
|
|
298
|
+
// ★批次 8:共享元素转场(Web 无宿主共享元素 → 普通容器降级)
|
|
299
|
+
"engineering.share-element": { tag: "div", className: "proteus-share-element" },
|
|
300
|
+
"engineering.animate": { tag: "div", className: "proteus-animate" },
|
|
301
|
+
// ★能力颗粒度对齐 C2:进度条 / 表单标签 / 页面容器
|
|
302
|
+
"ui.progress": { tag: "div", className: "proteus-progress" },
|
|
303
|
+
"ui.label": { tag: "label" },
|
|
304
|
+
"shell.page-container": { tag: "div", className: "proteus-page-container" },
|
|
305
|
+
"ui.selection": { tag: "div", className: "proteus-selection" },
|
|
306
|
+
"shell.keyboard-accessory": { tag: "div", className: "proteus-keyboard-accessory" },
|
|
307
|
+
"ui.camera": { tag: "video", className: "proteus-camera" },
|
|
308
|
+
"shell.webview": { tag: "div", className: "proteus-webview" },
|
|
309
|
+
"shell.ad": { tag: "div", className: "proteus-ad" },
|
|
310
|
+
"ui.map": { tag: "div", className: "proteus-map" }
|
|
288
311
|
};
|
|
289
312
|
function createVueDomBackend(doc) {
|
|
290
313
|
const documentLike = doc ?? defaultDocument();
|
|
@@ -415,8 +438,8 @@ var SEMANTIC_NATIVE_MAPS = {
|
|
|
415
438
|
"ui.input": "UITextField",
|
|
416
439
|
"ui.list": "UITableView",
|
|
417
440
|
"ui.nav": "UINavigationController",
|
|
418
|
-
"capability.
|
|
419
|
-
"capability.
|
|
441
|
+
"capability.qr-code": "AVCaptureSession",
|
|
442
|
+
"capability.camera": "UIImagePicker",
|
|
420
443
|
"capability.location": "CLLocationManager",
|
|
421
444
|
// ★G-32 B1:新增 implemented 语义
|
|
422
445
|
"layout.inline": "UITextAttachment",
|
|
@@ -455,7 +478,18 @@ var SEMANTIC_NATIVE_MAPS = {
|
|
|
455
478
|
"engineering.router-link": "UIButton.link",
|
|
456
479
|
// ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
|
|
457
480
|
"engineering.transition": "UIView.transition",
|
|
458
|
-
"engineering.
|
|
481
|
+
"engineering.share-element": "UIView.matchedTransition",
|
|
482
|
+
"engineering.animate": "CAKeyframeAnimation",
|
|
483
|
+
// ★能力颗粒度对齐 C2
|
|
484
|
+
"ui.progress": "UIProgressView",
|
|
485
|
+
"ui.label": "UILabel.label",
|
|
486
|
+
"shell.page-container": "UIPresentationController",
|
|
487
|
+
"ui.selection": "UITextView.selection",
|
|
488
|
+
"shell.keyboard-accessory": "UIInputView",
|
|
489
|
+
"ui.camera": "AVCaptureVideoPreviewLayer",
|
|
490
|
+
"shell.webview": "WKWebView",
|
|
491
|
+
"shell.ad": "UIView.ad",
|
|
492
|
+
"ui.map": "MKMapView"
|
|
459
493
|
},
|
|
460
494
|
android: {
|
|
461
495
|
"layout.box": "FrameLayout",
|
|
@@ -473,8 +507,8 @@ var SEMANTIC_NATIVE_MAPS = {
|
|
|
473
507
|
"ui.input": "EditText",
|
|
474
508
|
"ui.list": "RecyclerView",
|
|
475
509
|
"ui.nav": "NavigationRail",
|
|
476
|
-
"capability.
|
|
477
|
-
"capability.
|
|
510
|
+
"capability.qr-code": "CameraX",
|
|
511
|
+
"capability.camera": "PhotoPicker",
|
|
478
512
|
"capability.location": "FusedLocation",
|
|
479
513
|
// ★G-32 B1:新增 implemented 语义
|
|
480
514
|
"layout.inline": "TextView.inline",
|
|
@@ -513,7 +547,18 @@ var SEMANTIC_NATIVE_MAPS = {
|
|
|
513
547
|
"engineering.router-link": "TextView.link",
|
|
514
548
|
// ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
|
|
515
549
|
"engineering.transition": "View.animate.transition",
|
|
516
|
-
"engineering.
|
|
550
|
+
"engineering.share-element": "SharedElementTransition",
|
|
551
|
+
"engineering.animate": "ValueAnimator",
|
|
552
|
+
// ★能力颗粒度对齐 C2
|
|
553
|
+
"ui.progress": "ProgressBar",
|
|
554
|
+
"ui.label": "TextView.label",
|
|
555
|
+
"shell.page-container": "BottomSheetDialog",
|
|
556
|
+
"ui.selection": "TextView.selection",
|
|
557
|
+
"shell.keyboard-accessory": "InputMethodService.accessory",
|
|
558
|
+
"ui.camera": "CameraX.PreviewView",
|
|
559
|
+
"shell.webview": "WebView",
|
|
560
|
+
"shell.ad": "View.ad",
|
|
561
|
+
"ui.map": "MapView"
|
|
517
562
|
},
|
|
518
563
|
harmony: {
|
|
519
564
|
"layout.box": "Stack",
|
|
@@ -531,8 +576,8 @@ var SEMANTIC_NATIVE_MAPS = {
|
|
|
531
576
|
"ui.input": "TextInput",
|
|
532
577
|
"ui.list": "List",
|
|
533
578
|
"ui.nav": "Navigation",
|
|
534
|
-
"capability.
|
|
535
|
-
"capability.
|
|
579
|
+
"capability.qr-code": "ScanKit",
|
|
580
|
+
"capability.camera": "PhotoViewPicker",
|
|
536
581
|
"capability.location": "geoLocationManager",
|
|
537
582
|
// ★G-32 B1:新增 implemented 语义
|
|
538
583
|
"layout.inline": "Span",
|
|
@@ -571,7 +616,18 @@ var SEMANTIC_NATIVE_MAPS = {
|
|
|
571
616
|
"engineering.router-link": "Text.link",
|
|
572
617
|
// ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
|
|
573
618
|
"engineering.transition": "animateTo.transition",
|
|
574
|
-
"engineering.
|
|
619
|
+
"engineering.share-element": "geometryTransition",
|
|
620
|
+
"engineering.animate": "Animator.transition",
|
|
621
|
+
// ★能力颗粒度对齐 C2
|
|
622
|
+
"ui.progress": "Progress",
|
|
623
|
+
"ui.label": "Text.label",
|
|
624
|
+
"shell.page-container": "bindSheet",
|
|
625
|
+
"ui.selection": "Text.selection",
|
|
626
|
+
"shell.keyboard-accessory": "KeyboardAccessory",
|
|
627
|
+
"ui.camera": "XComponent.camera",
|
|
628
|
+
"shell.webview": "Web",
|
|
629
|
+
"shell.ad": "AdSlot",
|
|
630
|
+
"ui.map": "MapComponent"
|
|
575
631
|
}
|
|
576
632
|
};
|
|
577
633
|
function createNativeBackend(adapter, platform = "ios") {
|
|
@@ -685,8 +741,8 @@ var SEMANTIC_FLUTTER_MAP = {
|
|
|
685
741
|
"ui.input": "TextField",
|
|
686
742
|
"ui.list": "ListView",
|
|
687
743
|
"ui.nav": "Navigator",
|
|
688
|
-
"capability.
|
|
689
|
-
"capability.
|
|
744
|
+
"capability.qr-code": "scanQR",
|
|
745
|
+
"capability.camera": "pickPhoto",
|
|
690
746
|
"capability.location": "getLocation",
|
|
691
747
|
// ★G-32 B1:新增 implemented 语义
|
|
692
748
|
"layout.inline": "InlineSpan",
|
|
@@ -725,7 +781,19 @@ var SEMANTIC_FLUTTER_MAP = {
|
|
|
725
781
|
"engineering.router-link": "TextButton",
|
|
726
782
|
// ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
|
|
727
783
|
"engineering.transition": "AnimatedOpacity",
|
|
728
|
-
"engineering.
|
|
784
|
+
"engineering.share-element": "Hero",
|
|
785
|
+
// Flutter Hero 即共享元素
|
|
786
|
+
"engineering.animate": "AnimationController",
|
|
787
|
+
// ★能力颗粒度对齐 C2
|
|
788
|
+
"ui.progress": "LinearProgressIndicator",
|
|
789
|
+
"ui.label": "Text.label",
|
|
790
|
+
"shell.page-container": "showModalBottomSheet",
|
|
791
|
+
"ui.selection": "SelectableText",
|
|
792
|
+
"shell.keyboard-accessory": "KeyboardAccessoryView",
|
|
793
|
+
"ui.camera": "CameraPreview",
|
|
794
|
+
"shell.webview": "WebView",
|
|
795
|
+
"shell.ad": "AdWidget",
|
|
796
|
+
"ui.map": "GoogleMap"
|
|
729
797
|
};
|
|
730
798
|
function mapWidgetType(type) {
|
|
731
799
|
return WIDGET_MAP[type] ?? type;
|
|
@@ -1018,14 +1086,14 @@ function runHybridConformance(renderer) {
|
|
|
1018
1086
|
return { ok: checks.every((c) => c.pass), checks };
|
|
1019
1087
|
}
|
|
1020
1088
|
|
|
1021
|
-
// ../component-ir/
|
|
1089
|
+
// ../component-ir/src/schema.ts
|
|
1022
1090
|
var TAG_SEMANTIC_MAP = {
|
|
1023
1091
|
// G-32 ① 布局原语(12)
|
|
1024
1092
|
"p-box": "layout.box",
|
|
1025
1093
|
"p-inline": "layout.inline",
|
|
1026
1094
|
"p-stack": "layout.stack",
|
|
1027
1095
|
"p-grid": "layout.grid",
|
|
1028
|
-
|
|
1096
|
+
// ★Skyline 线收口:'p-fluid' 移除——layout.fluid 是 v-p-fluid **指令**语义(非标签),登记为标签会让 <p-fluid> 静默不渲染
|
|
1029
1097
|
"p-adaptive": "layout.adaptive",
|
|
1030
1098
|
"p-fit": "layout.fit",
|
|
1031
1099
|
"p-spacer": "layout.spacer",
|
|
@@ -1074,11 +1142,17 @@ var TAG_SEMANTIC_MAP = {
|
|
|
1074
1142
|
// ★E18 组件形态(p- 前缀产 C-IR)
|
|
1075
1143
|
"router-link": "engineering.router-link",
|
|
1076
1144
|
// ★兼容别名(Vue Router 风格 <router-link> 标签;非 catalog 条目——p-view 先例 G-31 B4)
|
|
1145
|
+
"p-share-element": "engineering.share-element",
|
|
1146
|
+
// ★批次 8:页面间共享元素转场(≠ p-transition 页内过渡)
|
|
1077
1147
|
"p-transition": "engineering.transition",
|
|
1078
1148
|
"p-animate": "engineering.animate",
|
|
1079
1149
|
// G-31 能力入口
|
|
1080
|
-
|
|
1081
|
-
|
|
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",
|
|
1082
1156
|
"p-location": "capability.location",
|
|
1083
1157
|
// ★G-31 B4 现有组件对齐(src/components 实际标签 → L1 语义)
|
|
1084
1158
|
"p-view": "layout.box",
|
|
@@ -1087,37 +1161,77 @@ var TAG_SEMANTIC_MAP = {
|
|
|
1087
1161
|
"p-nav-bar": "ui.nav",
|
|
1088
1162
|
// ★G-31 B4 Fluid 体系扩展语义(有明确系统原生对应——原则 #10.8)
|
|
1089
1163
|
"p-safe": "layout.safe",
|
|
1090
|
-
"p-sidebar": "layout.sidebar"
|
|
1164
|
+
"p-sidebar": "layout.sidebar",
|
|
1165
|
+
// ★#405 语义登记批:剩余 10 组件全量入图(EXTRA_KIND 文档兑底退役)——
|
|
1166
|
+
// 9 个新语义(catalog planned L2:语义层待多端映射)+ p-scroll-view 复用 layout.scroll
|
|
1167
|
+
// (★2026-09-18 修正原文「p-view 先例」:显式 multi-tag 别名先例是上一行的 `router-link`
|
|
1168
|
+
// ——同一语义由两个标签提供;本条与 p-view 是并列的别名情形,非「先例」关系)
|
|
1169
|
+
"p-aspect": "layout.aspect",
|
|
1170
|
+
"p-zone": "layout.zone",
|
|
1171
|
+
"p-loading": "ui.loading",
|
|
1172
|
+
"p-scale": "ui.scale",
|
|
1173
|
+
"p-skeleton": "ui.skeleton",
|
|
1174
|
+
"p-mask": "shell.mask",
|
|
1175
|
+
"p-popup": "shell.popup",
|
|
1176
|
+
"p-toolbar": "shell.toolbar",
|
|
1177
|
+
"p-scroll-view": "layout.scroll",
|
|
1178
|
+
// 滚动容器 = p-scroll 角色
|
|
1179
|
+
"p-error-boundary": "engineering.error-boundary",
|
|
1180
|
+
// E8 原语组件形态(useErrorBoundary API 形态并存)
|
|
1181
|
+
// ★能力颗粒度对齐 C2:新增真实组件
|
|
1182
|
+
"p-progress": "ui.progress",
|
|
1183
|
+
"p-label": "ui.label",
|
|
1184
|
+
"p-page-container": "shell.page-container",
|
|
1185
|
+
// ★权威标尺批 H:选区 / 键盘工具栏
|
|
1186
|
+
"p-selection": "ui.selection",
|
|
1187
|
+
"p-keyboard-accessory": "shell.keyboard-accessory",
|
|
1188
|
+
// ★权威标尺批 I:相机
|
|
1189
|
+
"p-camera": "ui.camera",
|
|
1190
|
+
// ★权威标尺批 J:内嵌网页 / 广告位
|
|
1191
|
+
"p-webview": "shell.webview",
|
|
1192
|
+
"p-ad": "shell.ad",
|
|
1193
|
+
"p-map": "ui.map"
|
|
1091
1194
|
};
|
|
1195
|
+
|
|
1196
|
+
// ../component-ir/src/to-ir.ts
|
|
1092
1197
|
function toComponentIR(tag, props = {}, children = []) {
|
|
1093
1198
|
if (!tag.startsWith("p-")) return null;
|
|
1094
1199
|
const semantic = TAG_SEMANTIC_MAP[tag];
|
|
1095
1200
|
if (!semantic) return null;
|
|
1096
1201
|
return { tag, semantic, props: { ...props }, children };
|
|
1097
1202
|
}
|
|
1203
|
+
|
|
1204
|
+
// ../component-ir/src/primitives.ts
|
|
1098
1205
|
var LAYOUT = [
|
|
1099
|
-
{ id: "L1", kind: "layout", semantic: "layout.box", tag: "p-box", props: ["aspectRatio", "overflow"], mpEquiv: "<view>", tier: "L1", status: "implemented" },
|
|
1206
|
+
{ id: "L1", kind: "layout", semantic: "layout.box", tag: "p-box", props: ["aspectRatio", "overflow", "hoverClass", "hoverStopPropagation", "hoverStartTime", "hoverStayTime"], mpEquiv: "<view>", tier: "L1", status: "implemented" },
|
|
1100
1207
|
{ id: "L2", kind: "layout", semantic: "layout.inline", tag: "p-inline", props: ["wrap"], mpEquiv: "<text> \u5185\u8054", tier: "L1", status: "implemented" },
|
|
1101
1208
|
{ id: "L3", kind: "layout", semantic: "layout.stack", tag: "p-stack", props: ["direction", "gap", "align", "wrap", "snap", "loop"], mpEquiv: "flex + scroll-view + swiper", tier: "L1", status: "implemented" },
|
|
1102
1209
|
{ id: "L4", kind: "layout", semantic: "layout.grid", tag: "p-grid", props: ["minColWidth", "maxCols", "gap", "autoFlow"], mpEquiv: "<view> + CSS Grid", tier: "L1", status: "implemented" },
|
|
1103
|
-
|
|
1210
|
+
// ★Skyline 线收口:layout.fluid 由 v-p-fluid **指令**承载(非标签)——无 tag,避免 <p-fluid> 幽灵
|
|
1211
|
+
{ id: "L5", kind: "layout", semantic: "layout.fluid", props: ["breakpoints", "minItemWidth"], mpEquiv: "\u54CD\u5E94\u5F0F CSS\uFF08v-p-fluid \u6307\u4EE4\uFF09", tier: "L1", status: "implemented" },
|
|
1104
1212
|
{ id: "L6", kind: "layout", semantic: "layout.adaptive", tag: "p-adaptive", props: ["sheet", "dialog", "popover", "drawer"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u5BBD\u5EA6\u8BED\u4E49\u65AD\u70B9\uFF09", tier: "L1", status: "implemented" },
|
|
1105
1213
|
{ id: "L7", kind: "layout", semantic: "layout.fit", tag: "p-fit", props: ["mode"], mpEquiv: "fit-content", tier: "L1", status: "implemented" },
|
|
1106
1214
|
{ id: "L8", kind: "layout", semantic: "layout.spacer", tag: "p-spacer", props: ["grow", "shrink"], mpEquiv: "flex:1", tier: "L1", status: "implemented" },
|
|
1107
1215
|
{ id: "L9", kind: "layout", semantic: "layout.divider", tag: "p-divider", props: ["orientation", "inset"], mpEquiv: "<view> + border", tier: "L1", status: "implemented" },
|
|
1108
|
-
{ id: "L10", kind: "layout", semantic: "layout.scroll", tag: "p-scroll", props: ["axis", "paging", "refresh", "indicator"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
|
|
1216
|
+
{ id: "L10", kind: "layout", semantic: "layout.scroll", tag: "p-scroll", props: ["axis", "paging", "refresh", "indicator", "upperThreshold", "lowerThreshold", "scrollIntoView", "scrollWithAnimation", "enableBackToTop", "enablePassive", "refresherEnabled", "refresherTriggered", "enhanced", "bounces", "scrollAnchoring", "padding"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
|
|
1109
1217
|
{ id: "L11", kind: "layout", semantic: "layout.virtual-list", tag: "p-virtual-list", props: ["itemSize", "buffer", "direction"], mpEquiv: "<scroll-view> + \u624B\u52A8\u56DE\u6536", tier: "L1", status: "implemented" },
|
|
1110
|
-
{ id: "L12", kind: "layout", semantic: "layout.masonry", tag: "p-masonry", props: ["colCount", "gap"], mpEquiv: "\u7B2C\u4E09\u65B9\u7011\u5E03\u6D41", tier: "L1", status: "implemented" }
|
|
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" },
|
|
1219
|
+
// ★#405 语义登记批:Fluid 体系剩余组件(语义层待多端映射 → planned L2——G-31.4 不足 3 端降级)
|
|
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" },
|
|
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" }
|
|
1111
1225
|
];
|
|
1112
1226
|
var UI = [
|
|
1113
|
-
{ id: "U1", kind: "ui", semantic: "ui.text", tag: "p-text", props: ["content", "selectable", "truncate", "align"], mpEquiv: "<text>", tier: "L1", status: "implemented" },
|
|
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" },
|
|
1114
1228
|
{ id: "U2", kind: "ui", semantic: "ui.heading", tag: "p-heading", props: ["level"], mpEquiv: "<h1>-<h6>", tier: "L1", status: "implemented" },
|
|
1115
|
-
{ id: "U3", kind: "ui", semantic: "ui.rich-text", tag: "p-rich-text", props: ["
|
|
1116
|
-
{ id: "U4", kind: "ui", semantic: "ui.icon", tag: "p-icon", props: ["name", "size", "color", "spin"], mpEquiv: "<icon>", tier: "L1", status: "implemented" },
|
|
1117
|
-
{ id: "U5", kind: "ui", semantic: "ui.image", tag: "p-image", props: ["src", "fit", "placeholder", "lazy"], mpEquiv: "<image>", 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" },
|
|
1230
|
+
{ id: "U4", kind: "ui", semantic: "ui.icon", tag: "p-icon", props: ["name", "type", "size", "color", "spin"], mpEquiv: "<icon>", tier: "L1", status: "implemented" },
|
|
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" },
|
|
1118
1232
|
{ id: "U6", kind: "ui", semantic: "ui.avatar", tag: "p-avatar", props: ["src", "shape", "size", "fallback"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
1119
|
-
{ id: "U7", kind: "ui", semantic: "ui.media", tag: "p-media", props: ["kind", "controls", "autoplay", "poster", "
|
|
1120
|
-
{ 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" },
|
|
1121
1235
|
{ id: "U9", kind: "ui", semantic: "ui.svg", tag: "p-svg", props: ["path", "viewbox"], mpEquiv: "\u65E0", tier: "L1", status: "implemented" },
|
|
1122
1236
|
{ id: "U10", kind: "ui", semantic: "ui.input", tag: "p-input", props: ["type", "mask", "validation", "clearable"], mpEquiv: "<input>", tier: "L1", status: "implemented" },
|
|
1123
1237
|
{ id: "U11", kind: "ui", semantic: "ui.textarea", tag: "p-textarea", props: ["autosize", "maxLength", "count"], mpEquiv: "<textarea>", tier: "L1", status: "implemented" },
|
|
@@ -1126,12 +1240,32 @@ var UI = [
|
|
|
1126
1240
|
{ id: "U14", kind: "ui", semantic: "ui.radio", tag: "p-radio", props: ["value", "group"], mpEquiv: "<radio>", tier: "L1", status: "implemented" },
|
|
1127
1241
|
{ id: "U15", kind: "ui", semantic: "ui.switch", tag: "p-switch", props: ["checked", "loading"], mpEquiv: "<switch>", tier: "L1", status: "implemented" },
|
|
1128
1242
|
{ id: "U16", kind: "ui", semantic: "ui.slider", tag: "p-slider", props: ["min", "max", "step", "range"], mpEquiv: "<slider>", tier: "L1", status: "implemented" },
|
|
1129
|
-
{ id: "U17", kind: "ui", semantic: "ui.picker", tag: "p-picker", props: ["mode", "start", "end"], mpEquiv: "<picker>", tier: "L1", status: "implemented" },
|
|
1130
|
-
{ id: "U18", kind: "ui", semantic: "ui.form", tag: "p-form", props: ["model", "rules", "layout"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" }
|
|
1243
|
+
{ id: "U17", kind: "ui", semantic: "ui.picker", tag: "p-picker", props: ["mode", "start", "end", "indicatorStyle", "indicatorClass", "maskClass", "maskStyle", "immediateChange"], mpEquiv: "<picker>", tier: "L1", status: "implemented" },
|
|
1244
|
+
{ id: "U18", kind: "ui", semantic: "ui.form", tag: "p-form", props: ["model", "rules", "layout"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
1245
|
+
// ★#405 语义登记批:反馈/状态类组件
|
|
1246
|
+
{ id: "U19", kind: "ui", semantic: "ui.loading", tag: "p-loading", props: ["size", "text"], mpEquiv: "wx.showLoading \u90E8\u5206", tier: "L2", status: "planned" },
|
|
1247
|
+
{ id: "U20", kind: "ui", semantic: "ui.scale", tag: "p-scale", props: ["level", "density", "baseSize"], mpEquiv: "\u65E0\uFF08\u65E0\u969C\u788D\u6863\u4F4D\uFF09", tier: "L2", status: "planned" },
|
|
1248
|
+
{ id: "U21", kind: "ui", semantic: "ui.skeleton", tag: "p-skeleton", props: ["rows", "avatar", "animated"], mpEquiv: "\u65E0", tier: "L2", status: "planned" },
|
|
1249
|
+
// ★能力颗粒度对齐 C2:进度条 / 表单标签
|
|
1250
|
+
{ id: "U22", kind: "ui", semantic: "ui.progress", tag: "p-progress", props: ["percent", "status", "type", "strokeWidth", "showInfo"], mpEquiv: "<progress>", tier: "L1", status: "implemented" },
|
|
1251
|
+
{ id: "U23", kind: "ui", semantic: "ui.label", tag: "p-label", props: ["for", "block"], mpEquiv: "<label>", tier: "L1", status: "implemented" },
|
|
1252
|
+
// ★权威标尺批 H:局部文本选区
|
|
1253
|
+
{ id: "U24", kind: "ui", semantic: "ui.selection", tag: "p-selection", props: ["disableContextMenu", "selectable"], mpEquiv: "<selection>", tier: "L1", status: "implemented" },
|
|
1254
|
+
// ★权威标尺批 I:相机
|
|
1255
|
+
{ id: "U25", kind: "ui", semantic: "ui.camera", tag: "p-camera", props: ["mode", "resolution", "devicePosition", "flash", "frameSize", "aspectRatio"], mpEquiv: "<camera>", tier: "L1", status: "implemented" },
|
|
1256
|
+
// ★权威标尺批 J:地图
|
|
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" }
|
|
1131
1265
|
];
|
|
1132
1266
|
var SHELL = [
|
|
1133
1267
|
{ id: "S1", kind: "shell", semantic: "shell.page", tag: "p-page", props: ["title", "statusBar", "pullRefresh"], mpEquiv: "<page>", tier: "L1", status: "implemented" },
|
|
1134
|
-
{ id: "S2", kind: "shell", semantic: "shell.nav", tag: "p-nav", props: ["title", "transparent"], mpEquiv: "\u5BFC\u822A\u680F\u914D\u7F6E", tier: "L1", status: "implemented" },
|
|
1268
|
+
{ id: "S2", kind: "shell", semantic: "shell.nav", tag: "p-nav", props: ["title", "transparent", "loading", "frontColor", "backgroundColor", "colorAnimationDuration", "colorAnimationTimingFunc"], mpEquiv: "\u5BFC\u822A\u680F\u914D\u7F6E", tier: "L1", status: "implemented" },
|
|
1135
1269
|
{ id: "S3", kind: "shell", semantic: "shell.tabbar", tag: "p-tabbar", props: ["tabs", "active", "badge"], mpEquiv: "<tabbar>", tier: "L1", status: "implemented" },
|
|
1136
1270
|
{ id: "S4", kind: "shell", semantic: "shell.segment", tag: "p-segment", props: ["options", "active"], mpEquiv: "<segment>", tier: "L1", status: "implemented" },
|
|
1137
1271
|
{ id: "S5", kind: "shell", semantic: "shell.drawer", tag: "p-drawer", props: ["side", "width", "overlay"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
@@ -1139,18 +1273,33 @@ var SHELL = [
|
|
|
1139
1273
|
{ id: "S7", kind: "shell", semantic: "shell.popover", tag: "p-popover", props: ["trigger", "placement"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
1140
1274
|
{ id: "S8", kind: "shell", semantic: "shell.toast", tag: "p-toast", props: ["message", "duration", "type"], mpEquiv: "wx.showToast", tier: "L1", status: "planned" },
|
|
1141
1275
|
{ id: "S9", kind: "shell", semantic: "shell.action-sheet", tag: "p-action-sheet", props: ["actions", "cancel"], mpEquiv: "wx.showActionSheet", tier: "L1", status: "implemented" },
|
|
1142
|
-
{ id: "S10", kind: "shell", semantic: "layout.split", tag: "p-split", props: ["breakpoint", "ratio", "collapse"], mpEquiv: "\u65E0\uFF08\u5206\u680F\u5E03\u5C40\uFF09", tier: "L1", status: "implemented" }
|
|
1276
|
+
{ id: "S10", kind: "shell", semantic: "layout.split", tag: "p-split", props: ["breakpoint", "ratio", "collapse"], mpEquiv: "\u65E0\uFF08\u5206\u680F\u5E03\u5C40\uFF09", tier: "L1", status: "implemented" },
|
|
1143
1277
|
// ★已落地绑定:分栏语义由 layout.split 承载(G-32 文档为 shell.split——机器事实以实现为准)
|
|
1278
|
+
// ★#405 语义登记批:弹层/工具栏组件
|
|
1279
|
+
{ id: "S11", kind: "shell", semantic: "shell.mask", tag: "p-mask", props: ["visible", "transparent"], mpEquiv: "\u7EC4\u5408\uFF08\u906E\u7F69\u5C42\uFF09", tier: "L2", status: "planned" },
|
|
1280
|
+
{ id: "S12", kind: "shell", semantic: "shell.popup", tag: "p-popup", props: ["position", "round", "overlay"], mpEquiv: "\u7EC4\u5408\uFF08\u5F39\u5C42\uFF09", tier: "L2", status: "planned" },
|
|
1281
|
+
{ id: "S13", kind: "shell", semantic: "shell.toolbar", tag: "p-toolbar", props: ["items", "itemWidth", "moreWidth"], mpEquiv: "\u65E0\uFF08\u6EA2\u51FA\u6298\u53E0\uFF09", tier: "L2", status: "planned" },
|
|
1282
|
+
// ★能力颗粒度对齐 C2:页面容器(对齐小程序 <page-container>)
|
|
1283
|
+
{ id: "S14", kind: "shell", semantic: "shell.page-container", tag: "p-page-container", props: ["show", "position", "overlay", "closeOnClickOverlay", "duration", "zIndex", "closeOnSlideDown", "overlayStyle", "customStyle"], mpEquiv: "<page-container>", tier: "L1", status: "implemented" },
|
|
1284
|
+
// ★权威标尺批 H:键盘上方工具栏
|
|
1285
|
+
{ id: "S15", kind: "shell", semantic: "shell.keyboard-accessory", tag: "p-keyboard-accessory", props: ["visible", "maxHeight", "background"], mpEquiv: "<keyboard-accessory>", tier: "L1", status: "implemented" },
|
|
1286
|
+
// ★权威标尺批 J:内嵌网页 / 广告位
|
|
1287
|
+
{ id: "S16", kind: "shell", semantic: "shell.webview", tag: "p-webview", props: ["src", "height", "sandbox"], mpEquiv: "<web-view>", 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" }
|
|
1144
1289
|
];
|
|
1145
1290
|
var GESTURE = [
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
{ id: "
|
|
1151
|
-
{ id: "
|
|
1152
|
-
{ id: "
|
|
1153
|
-
{ id: "
|
|
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" },
|
|
1154
1303
|
{ id: "G9", kind: "gesture", semantic: "gesture.scrollable", tag: "p-scrollable", props: ["bounce", "refresh", "loadMore"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
|
|
1155
1304
|
{ id: "G10", kind: "gesture", semantic: "gesture.use-gesture", api: "useGesture()", props: ["recognizers", "simultaneous"], mpEquiv: "\u65E0", tier: "L1", status: "planned" }
|
|
1156
1305
|
];
|
|
@@ -1159,9 +1308,10 @@ function cap(id, name, api, mpEquiv, returnType) {
|
|
|
1159
1308
|
}
|
|
1160
1309
|
var CAPABILITY = [
|
|
1161
1310
|
// 7.1 设备/硬件(15)
|
|
1162
|
-
|
|
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" },
|
|
1163
1313
|
cap("C2", "microphone", "useMicrophone()", "RecorderManager", "Result<AudioBuffer>"),
|
|
1164
|
-
{ 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" },
|
|
1165
1315
|
cap("C4", "map", "useMap()", "wx.createMapContext", "MapController"),
|
|
1166
1316
|
cap("C5", "sensor", "useSensor()", "onAccelerometer/onCompass/onGyroscope", "SensorStream"),
|
|
1167
1317
|
cap("C6", "vibrate", "useVibrate()", "wx.vibrateShort/Long", "void"),
|
|
@@ -1203,7 +1353,8 @@ var CAPABILITY = [
|
|
|
1203
1353
|
cap("C39", "face-id", "useFaceID()", "\u7EC4\u5408", "Result<boolean>"),
|
|
1204
1354
|
cap("C40", "payment", "usePayment()", "wx.requestPayment", "Result<PayResult>"),
|
|
1205
1355
|
cap("C41", "login", "useLogin()", "wx.login", "Result<Token>"),
|
|
1206
|
-
|
|
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" },
|
|
1207
1358
|
cap("C43", "file-system", "useFileSystem()", "wx.getFileSystemManager", "FSAdapter"),
|
|
1208
1359
|
cap("C44", "archive", "useArchive()", "wx.compressFile", "Result<void>"),
|
|
1209
1360
|
cap("C45", "shortcut", "useShortcut()", "wx.addToDesktop", "Result<void>"),
|
|
@@ -1212,7 +1363,49 @@ var CAPABILITY = [
|
|
|
1212
1363
|
{ id: "C47", kind: "capability", semantic: "capability.mini-program", api: "useMiniProgram()", props: ["MPContext"], mpEquiv: "wx.navigateToMiniProgram", tier: "L1", status: "planned" },
|
|
1213
1364
|
{ id: "C48", kind: "capability", semantic: "capability.embedded", api: "useEmbedded()", props: ["HostContext"], mpEquiv: "\u65E0\uFF08\u88AB\u5BBF\u4E3B\u5D4C\u5165\uFF09", tier: "L1", status: "planned" },
|
|
1214
1365
|
{ id: "C49", kind: "capability", semantic: "capability.live", api: "useLive()", props: ["LiveRoom"], mpEquiv: "wx...\uFF08\u76F4\u64AD\u7EC4\u4EF6\uFF09", tier: "L1", status: "planned" },
|
|
1215
|
-
{ id: "C50", kind: "capability", semantic: "capability.extension", api: "useExtension()", props: ["ExtensionAPI"], mpEquiv: "\u65E0\uFF08\u63D2\u4EF6/\u6269\u5C55\u70B9 G-21\uFF09", tier: "L1", status: "planned" }
|
|
1366
|
+
{ id: "C50", kind: "capability", semantic: "capability.extension", api: "useExtension()", props: ["ExtensionAPI"], mpEquiv: "\u65E0\uFF08\u63D2\u4EF6/\u6269\u5C55\u70B9 G-21\uFF09", tier: "L1", status: "planned" },
|
|
1367
|
+
// ★颗粒度对齐 C(2026-09-11):C51 小程序热更新(wx.getUpdateManager)
|
|
1368
|
+
{ id: "C51", kind: "capability", semantic: "capability.update", api: "useUpdate()", props: ["UpdateManagerAPI"], mpEquiv: "wx.getUpdateManager", tier: "L1", status: "planned" },
|
|
1369
|
+
// ★颗粒度对齐 C3(2026-09-11):相册 / Worker(对齐小程序媒体与多线程 API——纯 Hook,无 C-IR 节点 → planned)
|
|
1370
|
+
{ id: "C52", kind: "capability", semantic: "capability.album", api: "useAlbum()", props: ["AlbumAPI"], mpEquiv: "wx.chooseMedia/saveImageToPhotosAlbum/previewMedia", tier: "L1", status: "planned" },
|
|
1371
|
+
{ id: "C53", kind: "capability", semantic: "capability.worker", api: "useWorker()", props: ["WorkerHandle"], mpEquiv: "wx.createWorker", tier: "L1", status: "planned" },
|
|
1372
|
+
// ★颗粒度对齐 C3 批 2:收货地址 / WiFi / 微信运动(对齐小程序系统 API——纯 Hook → planned)
|
|
1373
|
+
{ id: "C54", kind: "capability", semantic: "capability.address", api: "useAddress()", props: ["ShippingAddress"], mpEquiv: "wx.chooseAddress", tier: "L1", status: "planned" },
|
|
1374
|
+
{ id: "C55", kind: "capability", semantic: "capability.wifi", api: "useWifi()", props: ["WifiAPI"], mpEquiv: "wx.getConnectedWifi/getWifiList/connectWifi", tier: "L1", status: "planned" },
|
|
1375
|
+
{ id: "C56", kind: "capability", semantic: "capability.we-run", api: "useWeRun()", props: ["WeRunData"], mpEquiv: "wx.getWeRunData", tier: "L1", status: "planned" },
|
|
1376
|
+
// ★组件实例 API 对齐(2026-09-12):画布组件实例(wx.createCanvasContext/SelectorQuery node/canvasToTempFilePath/OffscreenCanvas;纯 Hook → planned)
|
|
1377
|
+
{ id: "C57", kind: "capability", semantic: "capability.canvas", api: "useCanvas()", props: ["CanvasController"], mpEquiv: "wx.createCanvasContext/canvasToTempFilePath/createOffscreenCanvas", tier: "L1", status: "planned" },
|
|
1378
|
+
// ★组件实例 API 对齐(2026-09-12):元素查询 / 交叉观察 / 媒体查询(wx SelectorQuery/IntersectionObserver/MediaQueryObserver)
|
|
1379
|
+
{ id: "C58", kind: "capability", semantic: "capability.element-query", api: "useElement()", props: ["ElementQuery"], mpEquiv: "wx.createSelectorQuery", tier: "L1", status: "planned" },
|
|
1380
|
+
{ id: "C59", kind: "capability", semantic: "capability.intersection", api: "useIntersection()", props: ["IntersectionHandle"], mpEquiv: "wx.createIntersectionObserver", tier: "L1", status: "planned" },
|
|
1381
|
+
{ id: "C60", kind: "capability", semantic: "capability.media-query", api: "useMediaQuery()", props: ["MediaQueryObserver"], mpEquiv: "wx.createMediaQueryObserver", tier: "L1", status: "planned" },
|
|
1382
|
+
// ★组件实例 API 对齐(2026-09-12):媒体组件实例 + 广告(wx VideoContext/InnerAudioContext/LivePusherContext + 广告联盟)
|
|
1383
|
+
{ id: "C61", kind: "capability", semantic: "capability.video", api: "useVideo()", props: ["VideoController"], mpEquiv: "wx.createVideoContext", tier: "L1", status: "planned" },
|
|
1384
|
+
{ id: "C62", kind: "capability", semantic: "capability.audio", api: "useAudio()", props: ["AudioController"], mpEquiv: "wx.createInnerAudioContext", tier: "L1", status: "planned" },
|
|
1385
|
+
{ id: "C63", kind: "capability", semantic: "capability.live-pusher", api: "useLivePusher()", props: ["LivePusherController"], mpEquiv: "wx.createLivePusherContext", tier: "L1", status: "planned" },
|
|
1386
|
+
{ id: "C64", kind: "capability", semantic: "capability.ad", api: "useAd()", props: ["AdAPI"], mpEquiv: "wx.createRewardedVideoAd/createInterstitialAd/createBannerAd", tier: "L1", status: "planned" },
|
|
1387
|
+
// ★权威标尺缺口补齐(2026-09-12):隐私协议(wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize——合规刚需)
|
|
1388
|
+
{ id: "C65", kind: "capability", semantic: "capability.privacy", api: "usePrivacy()", props: ["PrivacyAPI"], mpEquiv: "wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize", tier: "L1", status: "planned" },
|
|
1389
|
+
// ★权威标尺缺口补齐批 D(2026-09-12):性能 / 预加载 / 图像编辑(通用能力,无资质门槛)
|
|
1390
|
+
{ id: "C66", kind: "capability", semantic: "capability.performance", api: "usePerformance()", props: ["PerformanceAPI"], mpEquiv: "wx.getPerformance/reportPerformance", tier: "L1", status: "planned" },
|
|
1391
|
+
{ id: "C67", kind: "capability", semantic: "capability.preload", api: "usePreload()", props: ["PreloadAPI"], mpEquiv: "wx.preloadAssets/preloadSkylineView/preloadWebview/preDownloadSubpackage", tier: "L1", status: "planned" },
|
|
1392
|
+
{ id: "C68", kind: "capability", semantic: "capability.image-edit", api: "useImageEdit()", props: ["ImageEditAPI"], mpEquiv: "wx.cropImage/editImage", tier: "L1", status: "planned" },
|
|
1393
|
+
// ★权威标尺缺口补齐批 E(2026-09-12):网络底层 / 媒体高级
|
|
1394
|
+
{ id: "C69", kind: "capability", semantic: "capability.socket", api: "useSocket()", props: ["UDPSocketHandle / TCPSocketHandle"], mpEquiv: "wx.createUDPSocket/createTCPSocket", tier: "L1", status: "planned" },
|
|
1395
|
+
{ id: "C70", kind: "capability", semantic: "capability.media-processing", api: "useMediaProcessing()", props: ["MediaProcessingAPI"], mpEquiv: "wx.createMediaContainer/createVideoDecoder/createMediaAudioPlayer", tier: "L1", status: "planned" },
|
|
1396
|
+
// ★权威标尺缺口补齐批 F(2026-09-12):录屏/缓存/空闲/窗口/导航拦截
|
|
1397
|
+
{ id: "C71", kind: "capability", semantic: "capability.screen-capture", api: "useScreenCapture()", props: ["ScreenCaptureAPI"], mpEquiv: "wx.getScreenRecordingState/onScreenRecordingStateChanged/onUserCaptureScreen/checkIsPictureInPictureActive", tier: "L1", status: "planned" },
|
|
1398
|
+
{ id: "C72", kind: "capability", semantic: "capability.cache-manager", api: "useCacheManager()", props: ["CacheManagerHandle"], mpEquiv: "wx.createCacheManager", tier: "L1", status: "planned" },
|
|
1399
|
+
{ id: "C73", kind: "capability", semantic: "capability.idle", api: "useIdle()", props: ["IdleAPI"], mpEquiv: "wx.requestIdleCallback/cancelIdleCallback", tier: "L1", status: "planned" },
|
|
1400
|
+
{ id: "C74", kind: "capability", semantic: "capability.window", api: "useWindow()", props: ["WindowAPI"], mpEquiv: "wx.setWindowSize", tier: "L1", status: "planned" },
|
|
1401
|
+
{ id: "C75", kind: "capability", semantic: "capability.navigation-guard", api: "useNavigationGuard()", props: ["NavigationGuardAPI"], mpEquiv: "wx.enableAlertBeforeUnload/disableAlertBeforeUnload", tier: "L1", status: "planned" },
|
|
1402
|
+
// ★权威标尺缺口补齐批 G(2026-09-12):AR/XR / iBeacon / 局域网 / 翻译 / 海报 / 设备探测
|
|
1403
|
+
{ id: "C76", kind: "capability", semantic: "capability.ar", api: "useAR()", props: ["ARAPI"], mpEquiv: "wx.createVKSession/isVKSupport", tier: "L1", status: "planned" },
|
|
1404
|
+
{ id: "C77", kind: "capability", semantic: "capability.beacon", api: "useBeacon()", props: ["BeaconAPI"], mpEquiv: "wx.onBeaconServiceChange/onBeaconUpdate", tier: "L1", status: "planned" },
|
|
1405
|
+
{ id: "C78", kind: "capability", semantic: "capability.local-service", api: "useLocalService()", props: ["LocalServiceAPI"], mpEquiv: "wx.onLocalServiceFound/Lost/ResolveFail/DiscoveryStop", tier: "L1", status: "planned" },
|
|
1406
|
+
{ id: "C79", kind: "capability", semantic: "capability.translation", api: "useTranslation()", props: ["TranslationAPI"], mpEquiv: "wx.onUserTriggerTranslation/onUserOffTranslation", tier: "L1", status: "planned" },
|
|
1407
|
+
{ id: "C80", kind: "capability", semantic: "capability.poster", api: "usePoster()", props: ["PosterAPI"], mpEquiv: "wx.onGeneratePoster", tier: "L1", status: "planned" },
|
|
1408
|
+
{ id: "C81", kind: "capability", semantic: "capability.device-capability", api: "useDeviceCapability()", props: ["DeviceCapabilityAPI"], mpEquiv: "wx.checkDeviceSupportHevc", tier: "L1", status: "planned" }
|
|
1216
1409
|
];
|
|
1217
1410
|
var ENGINEERING = [
|
|
1218
1411
|
{ id: "E1", kind: "engineering", semantic: "engineering.state", api: "useState()", mpEquiv: "data", tier: "L1", status: "planned" },
|
|
@@ -1222,7 +1415,8 @@ var ENGINEERING = [
|
|
|
1222
1415
|
{ id: "E5", kind: "engineering", semantic: "engineering.provide-inject", api: "useProvide()/useInject()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
|
|
1223
1416
|
{ id: "E6", kind: "engineering", semantic: "engineering.lifecycle", api: "useLifecycle()", mpEquiv: "onLoad/onShow/onHide/onUnload", tier: "L1", status: "planned" },
|
|
1224
1417
|
{ id: "E7", kind: "engineering", semantic: "engineering.ready", api: "useReady()", mpEquiv: "onReady", tier: "L1", status: "planned" },
|
|
1225
|
-
{ id: "E8", kind: "engineering", semantic: "engineering.error-boundary", api: "useErrorBoundary()", mpEquiv: "onError", tier: "L1", status: "planned" },
|
|
1418
|
+
{ id: "E8", kind: "engineering", semantic: "engineering.error-boundary", api: "useErrorBoundary()", tag: "p-error-boundary", mpEquiv: "onError", tier: "L1", status: "planned" },
|
|
1419
|
+
// ★#405:组件形态补登(双形态:Hook + p- 标签)
|
|
1226
1420
|
{ id: "E9", kind: "engineering", semantic: "engineering.page-param", api: "usePageParam()", mpEquiv: "onLoad(options)", tier: "L1", status: "planned" },
|
|
1227
1421
|
{ id: "E10", kind: "engineering", semantic: "engineering.route", api: "useRoute()", mpEquiv: "getCurrentPages()", tier: "L1", status: "planned" },
|
|
1228
1422
|
{ id: "E11", kind: "engineering", semantic: "engineering.router-push", api: "router.push()", mpEquiv: "wx.navigateTo", tier: "L1", status: "planned" },
|
|
@@ -1232,7 +1426,7 @@ var ENGINEERING = [
|
|
|
1232
1426
|
{ id: "E15", kind: "engineering", semantic: "engineering.router-relaunch", api: "router.reLaunch()", mpEquiv: "wx.reLaunch", tier: "L1", status: "planned" },
|
|
1233
1427
|
{ id: "E16", kind: "engineering", semantic: "engineering.router-before-each", api: "router.beforeEach()", mpEquiv: "onLaunch \u624B\u52A8", tier: "L1", status: "planned" },
|
|
1234
1428
|
{ id: "E17", kind: "engineering", semantic: "engineering.router-after-each", api: "router.afterEach()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
|
|
1235
|
-
{ id: "E18", kind: "engineering", semantic: "engineering.router-link", tag: "p-router-link", props: ["to", "replace", "switchTab"], mpEquiv: "<navigator>", tier: "L1", status: "implemented" },
|
|
1429
|
+
{ id: "E18", kind: "engineering", semantic: "engineering.router-link", tag: "p-router-link", props: ["to", "replace", "switchTab", "target", "url", "openType", "delta", "appId", "path", "extraData", "version", "shortLink", "hoverClass", "hoverStopPropagation", "hoverStartTime", "hoverStayTime"], mpEquiv: "<navigator>", tier: "L1", status: "implemented" },
|
|
1236
1430
|
{ id: "E19", kind: "engineering", semantic: "engineering.transition", tag: "p-transition", props: ["name", "mode"], mpEquiv: "transition CSS", tier: "L1", status: "implemented" },
|
|
1237
1431
|
{ id: "E20", kind: "engineering", semantic: "engineering.animate", tag: "p-animate", props: ["keyframes", "duration"], mpEquiv: "animation CSS", tier: "L1", status: "implemented" },
|
|
1238
1432
|
{ id: "E21", kind: "engineering", semantic: "engineering.animation", api: "useAnimation()", mpEquiv: "wx.createAnimation", tier: "L1", status: "planned" },
|
|
@@ -1242,9 +1436,22 @@ var ENGINEERING = [
|
|
|
1242
1436
|
{ id: "E25", kind: "engineering", semantic: "engineering.inspector", api: "useInspector()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
|
|
1243
1437
|
{ id: "E26", kind: "engineering", semantic: "engineering.performance", api: "usePerformance()", mpEquiv: "wx.reportPerformance", tier: "L1", status: "planned" },
|
|
1244
1438
|
{ id: "E27", kind: "engineering", semantic: "engineering.define-component", api: "defineComponent()", mpEquiv: "Component()", tier: "L1", status: "planned" },
|
|
1245
|
-
{ 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" }
|
|
1246
1451
|
];
|
|
1247
1452
|
var PRIMITIVE_CATALOG = [...LAYOUT, ...UI, ...SHELL, ...GESTURE, ...CAPABILITY, ...ENGINEERING];
|
|
1453
|
+
|
|
1454
|
+
// ../component-ir/src/audit.ts
|
|
1248
1455
|
var MP_COMPONENTS = [
|
|
1249
1456
|
{ mp: "<view>", proteus: "layout.box / layout.stack", status: "ok", group: "component" },
|
|
1250
1457
|
{ mp: "<text>", proteus: "ui.text / ui.heading", status: "ok", group: "component" },
|
|
@@ -1254,10 +1461,10 @@ var MP_COMPONENTS = [
|
|
|
1254
1461
|
{ mp: "<swiper-item>", proteus: "layout.stack \u5B50\u9879", status: "ok", group: "component" },
|
|
1255
1462
|
{ mp: "<movable-area>", proteus: "gesture.scrollable \u5BB9\u5668", status: "ok", group: "component" },
|
|
1256
1463
|
{ mp: "<movable-view>", proteus: "gesture.draggable", status: "ok", group: "component" },
|
|
1257
|
-
{ mp: "<cover-view>", proteus: "
|
|
1258
|
-
{ mp: "<cover-image>", proteus: "
|
|
1464
|
+
{ mp: "<cover-view>", proteus: "layout.box\uFF08Skyline \u540C\u5C42\u6E32\u67D3\u540E view \u5373\u53EF\u8986\u76D6\u2014\u2014\u5B98\u65B9\u5EFA\u8BAE\u66FF\u4EE3\uFF09", status: "ok", group: "component" },
|
|
1465
|
+
{ mp: "<cover-image>", proteus: "ui.image\uFF08\u540C\u5C42\u6E32\u67D3\u540E image \u5373\u53EF\u8986\u76D6\uFF09", status: "ok", group: "component" },
|
|
1259
1466
|
{ mp: "<icon>", proteus: "ui.icon", status: "ok", group: "component" },
|
|
1260
|
-
{ mp: "<progress>", proteus: "
|
|
1467
|
+
{ mp: "<progress>", proteus: "ui.progress", status: "ok", group: "component" },
|
|
1261
1468
|
{ mp: "<rich-text>", proteus: "ui.rich-text", status: "ok", group: "component" },
|
|
1262
1469
|
{ mp: "<button>", proteus: "ui.button", status: "ok", group: "component" },
|
|
1263
1470
|
{ mp: "<form>", proteus: "ui.form", status: "ok", group: "component" },
|
|
@@ -1269,59 +1476,210 @@ var MP_COMPONENTS = [
|
|
|
1269
1476
|
{ mp: "<picker-view>", proteus: "ui.picker mode=wheel", status: "ok", group: "component" },
|
|
1270
1477
|
{ mp: "<slider>", proteus: "ui.slider", status: "ok", group: "component" },
|
|
1271
1478
|
{ mp: "<switch>", proteus: "ui.switch", status: "ok", group: "component" },
|
|
1272
|
-
{ mp: "<label>", proteus: "
|
|
1479
|
+
{ mp: "<label>", proteus: "ui.label", status: "ok", group: "component" },
|
|
1273
1480
|
{ mp: "<navigator>", proteus: "engineering.router-link / router.*", status: "ok", group: "component" },
|
|
1274
1481
|
{ mp: "<audio>", proteus: "ui.media kind=audio\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
|
|
1275
1482
|
{ mp: "<video>", proteus: "ui.media kind=video\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
|
|
1276
|
-
{ mp: "<camera>", proteus: "
|
|
1483
|
+
{ mp: "<camera>", proteus: "ui.camera\uFF08p-camera\uFF09+ useCamera", status: "ok", group: "component" },
|
|
1277
1484
|
{ mp: "<live-player>", proteus: "ui.media kind=live\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
|
|
1278
1485
|
{ mp: "<live-pusher>", proteus: "ui.media kind=live mode=push", status: "ok", group: "component" },
|
|
1279
1486
|
{ mp: "<canvas>", proteus: "ui.canvas", status: "ok", group: "component" },
|
|
1280
|
-
{ mp: "<map>", proteus: "
|
|
1281
|
-
{ mp: "<web-view>", proteus: "
|
|
1487
|
+
{ mp: "<map>", proteus: "ui.map\uFF08p-map\uFF09+ useMap", status: "ok", group: "component" },
|
|
1488
|
+
{ mp: "<web-view>", proteus: "shell.webview\uFF08p-webview\uFF09+ \u5BBF\u4E3B\u6865", status: "ok", group: "component" },
|
|
1282
1489
|
{ mp: "<editor>", proteus: "ui.rich-text editable", status: "ok", group: "component" },
|
|
1283
|
-
{ mp: "<ad>", proteus: "
|
|
1284
|
-
{ mp: "<official-account>", proteus: "
|
|
1285
|
-
{ mp: "<open-data>", proteus: "
|
|
1286
|
-
{ mp: "<share-element>", proteus: "
|
|
1287
|
-
{ mp: "<aria-component>", proteus: "
|
|
1288
|
-
{ mp: "<page-container>", proteus: "
|
|
1289
|
-
{ mp: "<voip-room>", proteus: "
|
|
1290
|
-
{ mp: "<guild-room>", proteus: "
|
|
1490
|
+
{ mp: "<ad>", proteus: "shell.ad\uFF08p-ad\uFF09", status: "ok", group: "component" },
|
|
1491
|
+
{ mp: "<official-account>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
|
|
1492
|
+
{ mp: "<open-data>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
|
|
1493
|
+
{ mp: "<share-element>", proteus: "engineering.share-element\uFF08p-share-element\uFF09", status: "ok", group: "component" },
|
|
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" },
|
|
1495
|
+
{ mp: "<page-container>", proteus: "shell.page-container", status: "ok", group: "component" },
|
|
1496
|
+
{ mp: "<voip-room>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1 VOIP\uFF09", status: "private", group: "component" },
|
|
1497
|
+
{ mp: "<guild-room>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u6E38\u620F\uFF09", status: "private", group: "component" },
|
|
1498
|
+
// ★2026-09-11 补齐:此前矩阵漏列的真实微信内置组件(Skyline 族为主)——有等价能力标 ok/compat,无则 missing
|
|
1499
|
+
{ mp: "<match-media>", proteus: "p-adaptive / p-zone\uFF08\u5BB9\u5668\u65AD\u70B9\u66FF\u4EE3\uFF09", status: "ok", group: "component" },
|
|
1500
|
+
{ mp: "<navigation-bar>", proteus: "shell.nav\uFF08p-nav-bar \u81EA\u7ED8\uFF09", status: "ok", group: "component" },
|
|
1501
|
+
{ mp: "<keyframe-animation>", proteus: "engineering.animate / engineering.transition", status: "ok", group: "component" },
|
|
1502
|
+
{ mp: "<list-view>", proteus: "layout.virtual-list\uFF08p-list-view \u56DE\u6536\uFF09", status: "ok", group: "component" },
|
|
1503
|
+
{ mp: "<grid-view>", proteus: "layout.grid / layout.virtual-list", status: "ok", group: "component" },
|
|
1504
|
+
{ mp: "<snapshot>", proteus: "ui.canvas\uFF08\u622A\u56FE\u7ECF OffscreenCanvas\uFF09", status: "compat", group: "component" },
|
|
1505
|
+
{ mp: "<page-meta>", proteus: "shell.page\uFF08\u9875\u9762\u914D\u7F6E\u5C5E\u6027\uFF09", status: "compat", group: "component" },
|
|
1506
|
+
{ mp: "<root-portal>", proteus: "engineering.transition\uFF08teleport\u2192root-portal \u7F16\u8BD1\u671F\uFF09", status: "ok", group: "component" },
|
|
1507
|
+
{ mp: "<sticky-header>", proteus: "layout.scroll + sticky\uFF08CSS\uFF09", status: "compat", group: "component" },
|
|
1508
|
+
{ mp: "<sticky-section>", proteus: "layout.scroll + sticky\uFF08CSS\uFF09", status: "compat", group: "component" },
|
|
1509
|
+
{ mp: "<double-tap-gesture>", proteus: "gesture.draggable\uFF08p-draggable \u624B\u52BF\u8BC6\u522B\u5668\uFF09", status: "ok", group: "component" },
|
|
1510
|
+
{ mp: "<functional-page-navigator>", proteus: "\u2014\uFF08\u5FAE\u4FE1\u63D2\u4EF6\u9875\u4E13\u5C5E\uFF0C\u975E\u76EE\u6807\uFF09", status: "private", group: "component" },
|
|
1511
|
+
{ mp: "<open-container>", proteus: "\u2014\uFF08\u5FAE\u4FE1\u5F00\u5C4F\u5BB9\u5668\uFF0C\u79C1\u6709\uFF09", status: "private", group: "component" },
|
|
1512
|
+
// ★权威标尺批 H:局部文本选区 / 键盘上方工具栏(全端真实落地)
|
|
1513
|
+
{ mp: "<selection>", proteus: "ui.selection\uFF08p-selection\uFF09", status: "ok", group: "component" },
|
|
1514
|
+
{ mp: "<keyboard-accessory>", proteus: "shell.keyboard-accessory\uFF08p-keyboard-accessory\uFF09", status: "ok", group: "component" }
|
|
1291
1515
|
];
|
|
1292
1516
|
var MP_API_GROUPS = [
|
|
1293
|
-
{ mp: "wx.request/upload/download/websocket\uFF08\u7F51\u7EDC\uFF09", proteus: "
|
|
1294
|
-
{ mp: "wx.requestPayment", proteus: "
|
|
1295
|
-
{ mp: "wx.chooseImage/chooseMedia/previewImage\uFF08\u5A92\u4F53\uFF09", proteus: "
|
|
1296
|
-
{ mp: "wx.startRecord/RecorderManager\uFF08\u5F55\u97F3\uFF09", proteus: "
|
|
1297
|
-
{ mp: "wx.createVideoContext/CameraContext", proteus: "
|
|
1298
|
-
{ mp: "wx.scanCode", proteus: "
|
|
1299
|
-
{ mp: "wx.saveImageToPhotosAlbum", proteus: "
|
|
1300
|
-
{ mp: "wx.
|
|
1301
|
-
{ mp: "wx.
|
|
1302
|
-
{ mp: "wx.
|
|
1303
|
-
{ mp: "wx.
|
|
1304
|
-
|
|
1305
|
-
{ mp: "wx.
|
|
1306
|
-
{ mp: "wx.
|
|
1307
|
-
{ mp: "wx.
|
|
1308
|
-
{ mp: "wx.
|
|
1309
|
-
{ mp: "wx.
|
|
1517
|
+
{ mp: "wx.request/upload/download/websocket\uFF08\u7F51\u7EDC\uFF09", proteus: "useFetch / useUpload / useDownload / useWebSocket / useSocketTask", status: "ok", group: "api" },
|
|
1518
|
+
{ mp: "wx.requestPayment", proteus: "usePayment", status: "ok", group: "api" },
|
|
1519
|
+
{ mp: "wx.chooseImage/chooseMedia/previewImage\uFF08\u5A92\u4F53\uFF09", proteus: "useAlbum / useCamera + ui.image", status: "ok", group: "api" },
|
|
1520
|
+
{ mp: "wx.startRecord/RecorderManager\uFF08\u5F55\u97F3\uFF09", proteus: "useMicrophone / useRecorder", status: "ok", group: "api" },
|
|
1521
|
+
{ mp: "wx.createVideoContext/CameraContext", proteus: "ui.media + createCameraContext\uFF08ui.canvas \u627F\u63A5\uFF09", status: "ok", group: "api" },
|
|
1522
|
+
{ mp: "wx.scanCode", proteus: "useQRCode / p-scan-qr", status: "ok", group: "api" },
|
|
1523
|
+
{ mp: "wx.saveImageToPhotosAlbum/saveVideoToPhotosAlbum", proteus: "useAlbum\uFF08saveImage/saveVideo\uFF09", status: "ok", group: "api" },
|
|
1524
|
+
{ mp: "wx.createWorker\uFF08\u591A\u7EBF\u7A0B\uFF09", proteus: "useWorker", status: "ok", group: "api" },
|
|
1525
|
+
{ mp: "wx.chooseAddress\uFF08\u6536\u8D27\u5730\u5740\uFF09", proteus: "useAddress", status: "ok", group: "api" },
|
|
1526
|
+
{ mp: "wx.getConnectedWifi/getWifiList/connectWifi\uFF08WiFi\uFF09", proteus: "useWifi", status: "ok", group: "api" },
|
|
1527
|
+
{ mp: "wx.getWeRunData\uFF08\u5FAE\u4FE1\u8FD0\u52A8\uFF09", proteus: "useWeRun", status: "ok", group: "api" },
|
|
1528
|
+
// ★组件实例 API 对齐(2026-09-12):Canvas/查询/媒体组件实例(此前矩阵误标 useElement/useIntersection/useMedia——均为幽灵引用)
|
|
1529
|
+
{ mp: "wx.createCanvasContext / canvasToTempFilePath / createOffscreenCanvas\uFF08Canvas \u7EC4\u4EF6\u5B9E\u4F8B\uFF09", proteus: "useCanvas", status: "ok", group: "api" },
|
|
1530
|
+
{ mp: "wx.createSelectorQuery\uFF08\u5143\u7D20\u51E0\u4F55\u67E5\u8BE2\uFF09", proteus: "useElement", status: "ok", group: "api" },
|
|
1531
|
+
{ mp: "wx.createIntersectionObserver\uFF08\u4EA4\u53C9\u89C2\u5BDF\uFF09", proteus: "useIntersection", status: "ok", group: "api" },
|
|
1532
|
+
{ mp: "wx.createMediaQueryObserver\uFF08\u5A92\u4F53\u67E5\u8BE2\uFF09", proteus: "useMediaQuery", status: "ok", group: "api" },
|
|
1533
|
+
{ mp: "wx.createVideoContext\uFF08\u89C6\u9891\u7EC4\u4EF6\u5B9E\u4F8B\uFF09", proteus: "useVideo", status: "ok", group: "api" },
|
|
1534
|
+
{ mp: "wx.createInnerAudioContext\uFF08\u97F3\u9891\u5B9E\u4F8B\uFF09", proteus: "useAudio", status: "ok", group: "api" },
|
|
1535
|
+
{ mp: "wx.createLivePusherContext\uFF08\u76F4\u64AD\u63A8\u6D41\u5B9E\u4F8B\uFF09", proteus: "useLivePusher", status: "ok", group: "api" },
|
|
1536
|
+
{ mp: "wx.createRewardedVideoAd/createInterstitialAd/createBannerAd\uFF08\u5E7F\u544A\uFF09", proteus: "useAd", status: "ok", group: "api" },
|
|
1537
|
+
{ mp: "wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize\uFF08\u9690\u79C1\u534F\u8BAE\uFF09", proteus: "usePrivacy", status: "ok", group: "api" },
|
|
1538
|
+
{ mp: "wx.getPerformance/reportPerformance\uFF08\u6027\u80FD\uFF09", proteus: "usePerformance", status: "ok", group: "api" },
|
|
1539
|
+
{ mp: "wx.preloadAssets/preloadSkylineView/preloadWebview/preDownloadSubpackage\uFF08\u9884\u52A0\u8F7D\uFF09", proteus: "usePreload", status: "ok", group: "api" },
|
|
1540
|
+
{ mp: "wx.cropImage/editImage\uFF08\u56FE\u50CF\u7F16\u8F91\uFF09", proteus: "useImageEdit", status: "ok", group: "api" },
|
|
1541
|
+
{ mp: "wx.createUDPSocket/createTCPSocket\uFF08\u7F51\u7EDC\u5E95\u5C42 Socket\uFF09", proteus: "useSocket", status: "ok", group: "api" },
|
|
1542
|
+
{ mp: "wx.createMediaContainer/createVideoDecoder/createMediaAudioPlayer\uFF08\u5A92\u4F53\u9AD8\u7EA7\uFF09", proteus: "useMediaProcessing", status: "ok", group: "api" },
|
|
1543
|
+
{ mp: "wx.getScreenRecordingState/onScreenRecordingStateChanged/onUserCaptureScreen/checkIsPictureInPictureActive\uFF08\u5F55\u5C4F/\u622A\u5C4F\uFF09", proteus: "useScreenCapture", status: "ok", group: "api" },
|
|
1544
|
+
{ mp: "wx.createCacheManager\uFF08\u8BF7\u6C42\u7F13\u5B58\u7BA1\u7406\uFF09", proteus: "useCacheManager", status: "ok", group: "api" },
|
|
1545
|
+
{ mp: "wx.requestIdleCallback/cancelIdleCallback\uFF08\u7A7A\u95F2\u8C03\u5EA6\uFF09", proteus: "useIdle", status: "ok", group: "api" },
|
|
1546
|
+
{ mp: "wx.setWindowSize\uFF08PC \u7A97\u53E3\uFF09", proteus: "useWindow", status: "ok", group: "api" },
|
|
1547
|
+
{ mp: "wx.enableAlertBeforeUnload/disableAlertBeforeUnload\uFF08\u5378\u8F7D\u62E6\u622A\uFF09", proteus: "useNavigationGuard", status: "ok", group: "api" },
|
|
1548
|
+
{ mp: "wx.createVKSession/isVKSupport\uFF08AR/XR \u89C6\u89C9\u7B97\u6CD5\uFF09", proteus: "useAR", status: "ok", group: "api" },
|
|
1549
|
+
{ mp: "wx.onBeaconServiceChange/onBeaconUpdate\uFF08iBeacon\uFF09", proteus: "useBeacon", status: "ok", group: "api" },
|
|
1550
|
+
{ mp: "wx.onLocalServiceFound/Lost/ResolveFail/DiscoveryStop\uFF08\u5C40\u57DF\u7F51 mDNS\uFF09", proteus: "useLocalService", status: "ok", group: "api" },
|
|
1551
|
+
{ mp: "wx.onUserTriggerTranslation/onUserOffTranslation\uFF08\u7FFB\u8BD1\uFF09", proteus: "useTranslation", status: "ok", group: "api" },
|
|
1552
|
+
{ mp: "wx.onGeneratePoster\uFF08\u5206\u4EAB\u6D77\u62A5\uFF09", proteus: "usePoster", status: "ok", group: "api" },
|
|
1553
|
+
{ mp: "wx.checkDeviceSupportHevc\uFF08\u8BBE\u5907\u80FD\u529B\u63A2\u6D4B\uFF09", proteus: "useDeviceCapability", status: "ok", group: "api" },
|
|
1554
|
+
{ mp: "wx.getFileSystemManager/*\uFF08\u6587\u4EF6 30+\uFF09", proteus: "useFileSystem", status: "ok", group: "api" },
|
|
1555
|
+
{ mp: "wx.compressFile/unzip", proteus: "useArchive", status: "ok", group: "api" },
|
|
1556
|
+
{ mp: "wx.set/get/remove/clearStorage(+Sync)", proteus: "useStorage", status: "ok", group: "api" },
|
|
1557
|
+
{ mp: "wx.getLocation/chooseLocation/openLocation", proteus: "useLocation / p-location", status: "ok", group: "api" },
|
|
1558
|
+
{ mp: "wx.createMapContext", proteus: "useMap", status: "ok", group: "api" },
|
|
1559
|
+
{ mp: "wx.getSystemInfo\uFF08\u8BBE\u5907/\u5C4F\u5E55/\u7F51\u7EDC/\u7535\u91CF/\u4EAE\u5EA6/\u65B9\u5411/\u9707\u52A8/\u4F20\u611F\u5668/\u526A\u8D34\u677F/\u7535\u8BDD\uFF09", proteus: "useDevice / useScreen / useNetwork / useBattery / useBrightness / useOrientation / useVibrate / useSensor / useClipboard / usePhoneCall", status: "ok", group: "api" },
|
|
1560
|
+
{ mp: "wx.openBluetoothAdapter\uFF08\u84DD\u7259 20+\uFF09", proteus: "useBluetooth", status: "ok", group: "api" },
|
|
1561
|
+
{ mp: "wx.getHCEState\uFF08NFC\uFF09", proteus: "useNFC", status: "ok", group: "api" },
|
|
1562
|
+
{ mp: "wx.checkIsSupportFingerPrint/FaceID", proteus: "useBiometric / useFaceID", status: "ok", group: "api" },
|
|
1563
|
+
{ mp: "wx.showToast/showLoading/showModal/showActionSheet", proteus: "shell.toast + ui.loading + shell.modal + shell.action-sheet", status: "ok", group: "api" },
|
|
1310
1564
|
{ mp: "wx.setNavigationBarTitle/Color", proteus: "shell.nav", status: "ok", group: "api" },
|
|
1311
1565
|
{ mp: "wx.setTabBarItem/Style/hide/show", proteus: "shell.tabbar", status: "ok", group: "api" },
|
|
1312
|
-
{ mp: "wx.pageScrollTo", proteus: "
|
|
1313
|
-
{ mp: "wx.createAnimation", proteus: "engineering.
|
|
1314
|
-
{ mp: "wx.createSelectorQuery/IntersectionObserver", proteus: "
|
|
1315
|
-
{ mp: "wx.navigateTo/redirectTo/navigateBack/switchTab/reLaunch", proteus: "engineering.router-
|
|
1316
|
-
{ mp: "wx.getCurrentPages", proteus: "engineering.
|
|
1317
|
-
{ mp: "App()/Page() \u751F\u547D\u5468\u671F/getApp()", proteus: "
|
|
1318
|
-
{ mp: "wx.shareAppMessage/requestSubscribeMessage", proteus: "
|
|
1319
|
-
{ mp: "wx.login/checkSession/getUserInfo/authorize", proteus: "
|
|
1320
|
-
{ mp: "wx.getUpdateManager", proteus: "
|
|
1321
|
-
{ mp: "wx.requestWeChatPay/navigateToMiniProgram/\u6A21\u677F\u6D88\u606F/\u5BA2\u670D\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", proteus: "
|
|
1566
|
+
{ mp: "wx.pageScrollTo", proteus: "layout.scroll\uFF08p-scroll-view\uFF09", status: "ok", group: "api" },
|
|
1567
|
+
{ mp: "wx.createAnimation", proteus: "engineering.animate / engineering.transition", status: "ok", group: "api" },
|
|
1568
|
+
{ mp: "wx.createSelectorQuery/IntersectionObserver", proteus: "engineering.router-link + layout.scroll\uFF08\u5B9E\u6D4B\u80FD\u529B\uFF09", status: "ok", group: "api" },
|
|
1569
|
+
{ mp: "wx.navigateTo/redirectTo/navigateBack/switchTab/reLaunch", proteus: "engineering.router-link + router.* API", status: "ok", group: "api" },
|
|
1570
|
+
{ mp: "wx.getCurrentPages", proteus: "engineering.router-link + shared adapter", status: "ok", group: "api" },
|
|
1571
|
+
{ mp: "App()/Page() \u751F\u547D\u5468\u671F/getApp()", proteus: "useAppLifecycle / usePageLifecycle", status: "ok", group: "api" },
|
|
1572
|
+
{ mp: "wx.shareAppMessage/requestSubscribeMessage", proteus: "useShare / useNotification", status: "ok", group: "api" },
|
|
1573
|
+
{ mp: "wx.login/checkSession/getUserInfo/authorize", proteus: "useLogin / useAuth / usePermission", status: "ok", group: "api" },
|
|
1574
|
+
{ mp: "wx.getUpdateManager", proteus: "useUpdate", status: "ok", group: "api" },
|
|
1575
|
+
{ mp: "wx.requestWeChatPay/navigateToMiniProgram/\u6A21\u677F\u6D88\u606F/\u5BA2\u670D\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", proteus: "useMiniProgram", status: "private", group: "api" }
|
|
1322
1576
|
];
|
|
1323
1577
|
var MP_MAPPING_MATRIX = [...MP_COMPONENTS, ...MP_API_GROUPS];
|
|
1324
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
|
+
|
|
1325
1683
|
// src/dispatcher.ts
|
|
1326
1684
|
var DispatcherError = class extends Error {
|
|
1327
1685
|
constructor(code, detail) {
|
package/dist/spi.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import type { BackendId } from '@proteus-vue/contracts';
|
|
2
|
+
export type { BackendId } from '@proteus-vue/contracts';
|
|
2
3
|
/** 节点句柄(后端自己的节点表示——DOM 元素 / Flutter Element / 内存树节点……) */
|
|
3
4
|
export type NodeHandle = unknown;
|
|
4
5
|
/** 语义节点描述(IR 层:后端消费的中间表示,不绑定任何平台) */
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proteus-vue/render-backend",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
8
|
+
"@proteus-vue/component-ir": "0.2.0-beta.1",
|
|
9
|
+
"@proteus-vue/contracts": "0.1.1-beta.0"
|
|
9
10
|
},
|
|
10
11
|
"peerDependencies": {
|
|
11
12
|
"@vue/runtime-core": "^3.4.0"
|
|
@@ -27,4 +28,4 @@
|
|
|
27
28
|
"scripts": {
|
|
28
29
|
"build": "rm -rf dist && tsc -p tsconfig.build.json --emitDeclarationOnly && esbuild src/index.ts --bundle --format=esm --platform=neutral --outfile=dist/index.js --external:@vue/runtime-core"
|
|
29
30
|
}
|
|
30
|
-
}
|
|
31
|
+
}
|