cardbuddy 0.11.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/README.md +46 -5
  2. package/dist/cli.js +51 -1
  3. package/dist/config.js +51 -16
  4. package/dist/core.js +2 -2
  5. package/dist/init.js +425 -0
  6. package/dist/preview-editor/assets/index-CHuGGIR3.js +276 -0
  7. package/dist/preview-editor/assets/{index-B4VZgNSK.css → index-CQScMhyg.css} +1 -1
  8. package/dist/preview-editor/index.html +2 -2
  9. package/dist/standalone.js +8 -0
  10. package/dist/vendored/mcp/client.mjs +537 -0
  11. package/dist/vendored/mcp/tools.mjs +268 -0
  12. package/dist/vendored/preview/assets/default-image.png +0 -0
  13. package/dist/{server-core → vendored/server/core}/ai-chat.js +82 -38
  14. package/dist/{server-core → vendored/server/core}/browser.js +1 -1
  15. package/dist/{server-core → vendored/server/core}/cardSave.js +8 -3
  16. package/dist/{server-core → vendored/server/core}/cardSync.js +6 -14
  17. package/dist/{server-core → vendored/server/core}/cardValidate.js +11 -8
  18. package/dist/{server-core → vendored/server/core}/index.js +5 -3
  19. package/dist/vendored/server/core/skillPaths.js +124 -0
  20. package/dist/{server-core → vendored/server/core}/sliceUpload.js +5 -8
  21. package/dist/vendored/skills/README.md +93 -0
  22. package/dist/vendored/skills/card-doctor/SKILL.md +52 -0
  23. package/dist/vendored/skills/card-skill-trainer/SKILL.md +312 -0
  24. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r038n.json +43 -0
  25. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r039n.json +47 -0
  26. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r050n.json +48 -0
  27. package/dist/vendored/skills/card-skill-trainer/scripts/build_dataset.py +472 -0
  28. package/dist/vendored/skills/card-skill-trainer/scripts/build_sample.mjs +162 -0
  29. package/dist/vendored/skills/card-skill-trainer/scripts/diagnose_case.mjs +241 -0
  30. package/dist/vendored/skills/card-skill-trainer/scripts/lib/scoring.mjs +525 -0
  31. package/dist/vendored/skills/card-skill-trainer/scripts/round_diff.mjs +133 -0
  32. package/dist/vendored/skills/card-skill-trainer/scripts/run_round.mjs +1043 -0
  33. package/dist/vendored/skills/card-skill-trainer/scripts/score_round.mjs +195 -0
  34. package/dist/vendored/skills/card-skill-trainer/scripts/test_missing_slice.py +122 -0
  35. package/dist/vendored/skills/dsl-card-ai/SKILL.md +191 -0
  36. package/dist/vendored/skills/dsl-card-generator/SKILL.md +480 -0
  37. package/dist/vendored/skills/dsl-card-generator/config/render-contract.json +11 -0
  38. package/dist/vendored/skills/dsl-card-generator/references/amount_formatting.md +138 -0
  39. package/dist/vendored/skills/dsl-card-generator/references/card_index.json +1597 -0
  40. package/dist/vendored/skills/dsl-card-generator/references/card_templates.json +384 -0
  41. package/dist/vendored/skills/dsl-card-generator/references/card_to_summary.md +56 -0
  42. package/dist/vendored/skills/dsl-card-generator/references/component_rules.md +76 -0
  43. package/dist/vendored/skills/dsl-card-generator/references/component_specs.md +393 -0
  44. package/dist/vendored/skills/dsl-card-generator/references/dsl_structure.md +208 -0
  45. package/dist/vendored/skills/dsl-card-generator/references/event_patterns.md +287 -0
  46. package/dist/vendored/skills/dsl-card-generator/references/expression_engine.md +121 -0
  47. package/dist/vendored/skills/dsl-card-generator/references/field_name_dict.json +34 -0
  48. package/dist/vendored/skills/dsl-card-generator/references/field_naming.md +101 -0
  49. package/dist/vendored/skills/dsl-card-generator/references/generation_pitfalls.md +928 -0
  50. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/README.md +69 -0
  51. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/examples_index.json +2967 -0
  52. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/patterns.json +2835 -0
  53. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/recipes_v2.json +648 -0
  54. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/recipes_v2_schema.md +295 -0
  55. package/dist/vendored/skills/dsl-card-generator/references/image_diff.md +48 -0
  56. package/dist/vendored/skills/dsl-card-generator/references/image_to_card.md +129 -0
  57. package/dist/vendored/skills/dsl-card-generator/references/ir-format.md +212 -0
  58. package/dist/vendored/skills/dsl-card-generator/references/message-center-pattern.md +149 -0
  59. package/dist/vendored/skills/dsl-card-generator/references/platform_jsapi.md +196 -0
  60. package/dist/vendored/skills/dsl-card-generator/references/previewer_contract.md +54 -0
  61. package/dist/vendored/skills/dsl-card-generator/references/quickref.md +197 -0
  62. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/absolute-badge.json +84 -0
  63. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/accordion-group-toggle.json +18 -0
  64. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/alertCard-pair.json +12 -0
  65. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/alertDialog-call.json +12 -0
  66. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-countdown.json +15 -0
  67. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-donut.json +15 -0
  68. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-gauge-score.json +11 -0
  69. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-radar.json +10 -0
  70. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-title-head.json +13 -0
  71. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/globalSet.json +12 -0
  72. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/label-col-modes.json +21 -0
  73. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/list-expand-collapse.json +17 -0
  74. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/money-format.json +11 -0
  75. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/opacity-switch.json +130 -0
  76. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/progress-bar.json +25 -0
  77. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/tab-billMode.json +15 -0
  78. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/title-underline-overlay.json +21 -0
  79. package/dist/vendored/skills/dsl-card-generator/references/recipes.md +797 -0
  80. package/dist/vendored/skills/dsl-card-generator/references/rules.md +235 -0
  81. package/dist/vendored/skills/dsl-card-generator/references/slices_convention.md +177 -0
  82. package/dist/vendored/skills/dsl-card-generator/references/spec_to_schema_patterns.md +609 -0
  83. package/dist/vendored/skills/dsl-card-generator/references/ui_fidelity_rules.md +131 -0
  84. package/dist/vendored/skills/dsl-card-generator/scripts/add_component.mjs +118 -0
  85. package/dist/vendored/skills/dsl-card-generator/scripts/analyze_component_usage.mjs +153 -0
  86. package/dist/vendored/skills/dsl-card-generator/scripts/apply_opacity_pattern.mjs +343 -0
  87. package/dist/vendored/skills/dsl-card-generator/scripts/build_card_index.mjs +108 -0
  88. package/dist/vendored/skills/dsl-card-generator/scripts/build_card_templates.mjs +190 -0
  89. package/dist/vendored/skills/dsl-card-generator/scripts/check_fidelity.mjs +257 -0
  90. package/dist/vendored/skills/dsl-card-generator/scripts/check_magic_values.mjs +79 -0
  91. package/dist/vendored/skills/dsl-card-generator/scripts/crop_slices.mjs +98 -0
  92. package/dist/vendored/skills/dsl-card-generator/scripts/describe_card.mjs +265 -0
  93. package/dist/vendored/skills/dsl-card-generator/scripts/diff_bands.mjs +257 -0
  94. package/dist/vendored/skills/dsl-card-generator/scripts/diff_card.mjs +316 -0
  95. package/dist/vendored/skills/dsl-card-generator/scripts/expand_ir.mjs +873 -0
  96. package/dist/vendored/skills/dsl-card-generator/scripts/extract_handcrafted.py +1199 -0
  97. package/dist/vendored/skills/dsl-card-generator/scripts/extract_subtree.mjs +191 -0
  98. package/dist/vendored/skills/dsl-card-generator/scripts/generate_cards.mjs +389 -0
  99. package/dist/vendored/skills/dsl-card-generator/scripts/inventory_schemas.py +160 -0
  100. package/dist/vendored/skills/dsl-card-generator/scripts/iterate.mjs +700 -0
  101. package/dist/vendored/skills/dsl-card-generator/scripts/lib/design_image.mjs +56 -0
  102. package/dist/vendored/skills/dsl-card-generator/scripts/lib/design_sample.mjs +328 -0
  103. package/dist/vendored/skills/dsl-card-generator/scripts/lib/layout-tokens.mjs +79 -0
  104. package/dist/vendored/skills/dsl-card-generator/scripts/lib/paths.mjs +103 -0
  105. package/dist/vendored/skills/dsl-card-generator/scripts/lib/scaffold.mjs +575 -0
  106. package/dist/vendored/skills/dsl-card-generator/scripts/lib/slicePath.mjs +81 -0
  107. package/dist/vendored/skills/dsl-card-generator/scripts/lib/slice_dedupe.mjs +147 -0
  108. package/dist/vendored/skills/dsl-card-generator/scripts/lint_autofix.mjs +363 -0
  109. package/dist/vendored/skills/dsl-card-generator/scripts/lint_card.mjs +1399 -0
  110. package/dist/vendored/skills/dsl-card-generator/scripts/preflight.mjs +249 -0
  111. package/dist/vendored/skills/dsl-card-generator/scripts/register_card_template.mjs +208 -0
  112. package/dist/vendored/skills/dsl-card-generator/scripts/render_baseline.mjs +231 -0
  113. package/dist/vendored/skills/dsl-card-generator/scripts/render_card.mjs +801 -0
  114. package/dist/vendored/skills/dsl-card-generator/scripts/render_diff.mjs +239 -0
  115. package/dist/vendored/skills/dsl-card-generator/scripts/resolve_card_template.mjs +73 -0
  116. package/dist/vendored/skills/dsl-card-generator/scripts/route_input.mjs +447 -0
  117. package/dist/vendored/skills/dsl-card-generator/scripts/scaffold_card.mjs +81 -0
  118. package/dist/vendored/skills/dsl-card-generator/scripts/slices_normalize.mjs +316 -0
  119. package/dist/vendored/skills/dsl-card-generator/scripts/spec_audit.mjs +462 -0
  120. package/dist/vendored/skills/dsl-card-generator/scripts/spec_to_schema_v3.mjs +7735 -0
  121. package/dist/vendored/skills/dsl-card-generator/scripts/spec_tree.mjs +355 -0
  122. package/dist/vendored/skills/dsl-card-generator/scripts/validate_all_schemas.py +71 -0
  123. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/default-image-wzZYQ86K.png +0 -0
  124. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-C9k-07y7.css +1 -0
  125. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-oFRM4f4V.js +55 -0
  126. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/svg-symbols-B2exBrAr.svg +118 -0
  127. package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/component-meta.json +2714 -0
  128. package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/directive-meta.json +40 -0
  129. package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/style-meta.json +1086 -0
  130. package/dist/vendored/{standalone.html → skills/dsl-card-generator/vendor/preview/standalone.html} +2 -1
  131. package/dist/vendored/skills/finmall-card-sync/SKILL.md +262 -0
  132. package/dist/vendored/skills/finmall-session-navigator/SKILL.md +169 -0
  133. package/dist/vendored/skills/finmall-session-navigator/scripts/finmall_login.mjs +882 -0
  134. package/dist/vendored/skills/finmall-session-navigator/scripts/package-lock.json +59 -0
  135. package/dist/vendored/skills/finmall-session-navigator/scripts/package.json +10 -0
  136. package/dist/vendored/skills/finmall-session-navigator/scripts/session-manager.mjs +96 -0
  137. package/dist/vendored/skills/shared/README.md +55 -0
  138. package/dist/vendored/skills/shared/auth-model.md +79 -0
  139. package/dist/vendored/skills/sketch-spec-to-card/SKILL.md +329 -0
  140. package/dist/vendored/skills/sketch-spec-to-card/references/boundary.json +14 -0
  141. package/dist/vendored/skills/sketch-spec-to-card/references/card_refs.json +13 -0
  142. package/dist/vendored/skills/sketch-spec-to-card/references/spec-schema.md +103 -0
  143. package/dist/vendored/skills/sketch-spec-to-card/scripts/build_prompt.py +797 -0
  144. package/dist/vendored/skills/sketch-spec-to-card/scripts/card_refs.py +94 -0
  145. package/dist/vendored/skills/sketch-spec-to-card/scripts/cluster_states.py +706 -0
  146. package/dist/vendored/skills/sketch-spec-to-card/scripts/parse_meaxure.py +1781 -0
  147. package/dist/vendored/skills/sketch-spec-to-card/scripts/png_utils.py +318 -0
  148. package/dist/vendored/skills/sketch-spec-to-card/scripts/vision.py +1118 -0
  149. package/dist/vendored/templates/helloCard/data.json +10 -0
  150. package/dist/vendored/templates/helloCard/schema.json +238 -0
  151. package/dist/vendored/tools/link-skills.mjs +485 -0
  152. package/package.json +2 -1
  153. package/dist/preview-editor/assets/index-jl4YJzKv.js +0 -180
  154. package/dist/vendored/App.vue +0 -2858
  155. package/dist/vendored/ansi.js +0 -185
  156. package/dist/vendored/assets/apple-touch-icon.png +0 -0
  157. package/dist/vendored/assets/default-image.png +0 -0
  158. package/dist/vendored/assets/favicon-16.png +0 -0
  159. package/dist/vendored/assets/favicon-32.png +0 -0
  160. package/dist/vendored/assets/site-icon.png +0 -0
  161. package/dist/vendored/assets/svgIcons/icons.svg +0 -87
  162. package/dist/vendored/assets/svgIcons/index.js +0 -39
  163. package/dist/vendored/components/AiSettings.vue +0 -392
  164. package/dist/vendored/components/AlertCardInstance.vue +0 -58
  165. package/dist/vendored/components/AlertCardLayer.vue +0 -59
  166. package/dist/vendored/components/ApiCallPanel.vue +0 -127
  167. package/dist/vendored/components/ApiPayloadTree.vue +0 -201
  168. package/dist/vendored/components/AppToast.vue +0 -37
  169. package/dist/vendored/components/CardGallery.vue +0 -291
  170. package/dist/vendored/components/CardPreview.vue +0 -72
  171. package/dist/vendored/components/CardSelect.vue +0 -206
  172. package/dist/vendored/components/ChatComposer.vue +0 -413
  173. package/dist/vendored/components/ChatMessage.vue +0 -383
  174. package/dist/vendored/components/ChatPanel.vue +0 -937
  175. package/dist/vendored/components/ComponentPalette.vue +0 -301
  176. package/dist/vendored/components/ConfirmDialog.vue +0 -54
  177. package/dist/vendored/components/DatePickerOverlay.vue +0 -345
  178. package/dist/vendored/components/DebugPanel.vue +0 -1734
  179. package/dist/vendored/components/DeviceOverlay.vue +0 -70
  180. package/dist/vendored/components/Dropdown.vue +0 -193
  181. package/dist/vendored/components/EventEditor.vue +0 -273
  182. package/dist/vendored/components/HoverGuides.vue +0 -122
  183. package/dist/vendored/components/JsonTree.vue +0 -547
  184. package/dist/vendored/components/LogValue.vue +0 -52
  185. package/dist/vendored/components/MarkdownBody.vue +0 -64
  186. package/dist/vendored/components/NewCardDialog.vue +0 -132
  187. package/dist/vendored/components/NodeInspector.vue +0 -295
  188. package/dist/vendored/components/NumberStepper.vue +0 -125
  189. package/dist/vendored/components/PickerOverlay.vue +0 -131
  190. package/dist/vendored/components/PropControl.vue +0 -245
  191. package/dist/vendored/components/PropTree.vue +0 -128
  192. package/dist/vendored/components/RemotePreview.vue +0 -173
  193. package/dist/vendored/components/SelectionOverlay.vue +0 -105
  194. package/dist/vendored/components/StructureTree.vue +0 -1002
  195. package/dist/vendored/components/Switch.vue +0 -38
  196. package/dist/vendored/components/setters/SetBgPosition.vue +0 -64
  197. package/dist/vendored/components/setters/SetBgSize.vue +0 -90
  198. package/dist/vendored/components/setters/SetCode.vue +0 -198
  199. package/dist/vendored/components/setters/SetColor.vue +0 -244
  200. package/dist/vendored/components/setters/SetCustomSelect.vue +0 -58
  201. package/dist/vendored/components/setters/SetExpr.vue +0 -107
  202. package/dist/vendored/components/setters/SetGradient.vue +0 -125
  203. package/dist/vendored/components/setters/SetGrid9.vue +0 -68
  204. package/dist/vendored/components/setters/SetIconSelect.vue +0 -67
  205. package/dist/vendored/components/setters/SetIfForm.vue +0 -61
  206. package/dist/vendored/components/setters/SetImage.vue +0 -43
  207. package/dist/vendored/components/setters/SetList.vue +0 -139
  208. package/dist/vendored/components/setters/SetNumber.vue +0 -118
  209. package/dist/vendored/components/setters/SetNumberStyle.vue +0 -113
  210. package/dist/vendored/components/setters/SetPadding.vue +0 -77
  211. package/dist/vendored/components/setters/SetSegment.vue +0 -160
  212. package/dist/vendored/components/setters/SetSelect.vue +0 -51
  213. package/dist/vendored/components/setters/SetSwitch.vue +0 -49
  214. package/dist/vendored/components/setters/SetText.vue +0 -52
  215. package/dist/vendored/components/setters/props.js +0 -23
  216. package/dist/vendored/fidelity/baseline-messageOverview.json +0 -87
  217. package/dist/vendored/fidelity/calibration.json +0 -29
  218. package/dist/vendored/fidelity/fidelity-messageOverview-after.html +0 -114
  219. package/dist/vendored/fidelity/fidelity-messageOverview-after.json +0 -272
  220. package/dist/vendored/fidelity/fidelity-messageOverview.html +0 -185
  221. package/dist/vendored/fidelity/fidelity-messageOverview.json +0 -336
  222. package/dist/vendored/fidelity/fidelity-messageOverview_v2.html +0 -262
  223. package/dist/vendored/fidelity/fidelity-messageOverview_v2.json +0 -502
  224. package/dist/vendored/fidelity/fidelity-messageOverview_v3.html +0 -201
  225. package/dist/vendored/fidelity/fidelity-messageOverview_v3.json +0 -417
  226. package/dist/vendored/fidelity/fidelity-messageOverview_visual.html +0 -125
  227. package/dist/vendored/fidelity/fidelity-messageOverview_visual.json +0 -338
  228. package/dist/vendored/index.html +0 -16
  229. package/dist/vendored/main.js +0 -37
  230. package/dist/vendored/runtime/ai-api.js +0 -165
  231. package/dist/vendored/runtime/alert-card.js +0 -125
  232. package/dist/vendored/runtime/app-toast.js +0 -33
  233. package/dist/vendored/runtime/clipboard-node.js +0 -78
  234. package/dist/vendored/runtime/clipboard.js +0 -29
  235. package/dist/vendored/runtime/event-model.js +0 -300
  236. package/dist/vendored/runtime/hoverGuide.js +0 -31
  237. package/dist/vendored/runtime/jsapi-mock.js +0 -256
  238. package/dist/vendored/runtime/markdown.js +0 -140
  239. package/dist/vendored/runtime/node-model.js +0 -217
  240. package/dist/vendored/skills/.manifest.json +0 -1101
  241. package/dist/vendored/standalone-main.js +0 -36
  242. package/dist/vendored/styles/ai-chat.css +0 -1850
  243. package/dist/vendored/styles/app.css +0 -3648
  244. package/dist/vendored/styles/card-gallery.css +0 -285
  245. package/dist/vendored/styles/card-select.css +0 -288
  246. package/dist/vendored/styles/components.css +0 -383
  247. package/dist/vendored/styles/dropdown.css +0 -324
  248. package/dist/vendored/styles/json-tree.css +0 -308
  249. package/dist/vendored/styles/node-inspector.css +0 -800
  250. package/dist/vendored/styles/setters.css +0 -1050
  251. package/dist/vendored/styles/standalone.css +0 -27
  252. package/dist/vendored/styles/structure-tree.css +0 -460
  253. /package/dist/vendored/{api.js → preview/api.js} +0 -0
  254. /package/dist/vendored/{assets → preview/assets}/svg-symbols.svg +0 -0
  255. /package/dist/vendored/{components → preview/components}/AbsoluteLayout.vue +0 -0
  256. /package/dist/vendored/{components → preview/components}/Button.vue +0 -0
  257. /package/dist/vendored/{components → preview/components}/Canvas.vue +0 -0
  258. /package/dist/vendored/{components → preview/components}/CheckGroup.vue +0 -0
  259. /package/dist/vendored/{components → preview/components}/Column.vue +0 -0
  260. /package/dist/vendored/{components → preview/components}/CustomPlaceholder.vue +0 -0
  261. /package/dist/vendored/{components → preview/components}/Divider.vue +0 -0
  262. /package/dist/vendored/{components → preview/components}/GridLayout.vue +0 -0
  263. /package/dist/vendored/{components → preview/components}/Icon.vue +0 -0
  264. /package/dist/vendored/{components → preview/components}/Image.vue +0 -0
  265. /package/dist/vendored/{components → preview/components}/Input.vue +0 -0
  266. /package/dist/vendored/{components → preview/components}/ListLayout.vue +0 -0
  267. /package/dist/vendored/{components → preview/components}/Map.vue +0 -0
  268. /package/dist/vendored/{components → preview/components}/MultiColumn.vue +0 -0
  269. /package/dist/vendored/{components → preview/components}/MultiText.vue +0 -0
  270. /package/dist/vendored/{components → preview/components}/ProgressSlider.vue +0 -0
  271. /package/dist/vendored/{components → preview/components}/RadioButton.vue +0 -0
  272. /package/dist/vendored/{components → preview/components}/RenderTree.vue +0 -0
  273. /package/dist/vendored/{components → preview/components}/Root.vue +0 -0
  274. /package/dist/vendored/{components → preview/components}/Row.vue +0 -0
  275. /package/dist/vendored/{components → preview/components}/SvgCode.vue +0 -0
  276. /package/dist/vendored/{components → preview/components}/SvgSymbols.vue +0 -0
  277. /package/dist/vendored/{components → preview/components}/Text.vue +0 -0
  278. /package/dist/vendored/{components → preview/components}/Video.vue +0 -0
  279. /package/dist/vendored/{components → preview/components}/ViewContainer.vue +0 -0
  280. /package/dist/vendored/{components → preview/components}/base.js +0 -0
  281. /package/dist/vendored/{components → preview/components}/icons.js +0 -0
  282. /package/dist/vendored/{components → preview/components}/index.js +0 -0
  283. /package/dist/vendored/{meta → preview/meta}/component-meta.json +0 -0
  284. /package/dist/vendored/{meta → preview/meta}/directive-meta.json +0 -0
  285. /package/dist/vendored/{meta → preview/meta}/style-meta.json +0 -0
  286. /package/dist/vendored/{runtime → preview/runtime}/StyleParser.js +0 -0
  287. /package/dist/vendored/{runtime → preview/runtime}/adapter.js +0 -0
  288. /package/dist/vendored/{runtime → preview/runtime}/assets.js +0 -0
  289. /package/dist/vendored/{runtime → preview/runtime}/canvas-context.js +0 -0
  290. /package/dist/vendored/{runtime → preview/runtime}/card-runtime.js +0 -0
  291. /package/dist/vendored/{runtime → preview/runtime}/evaluate.js +0 -0
  292. /package/dist/vendored/{runtime → preview/runtime}/property.js +0 -0
  293. /package/dist/vendored/{runtime → preview/runtime}/selectionOverlay.js +0 -0
  294. /package/dist/vendored/{runtime → preview/runtime}/toPreview.js +0 -0
  295. /package/dist/{server-core → vendored/server/core}/assetProxy.js +0 -0
  296. /package/dist/{server-core → vendored/server/core}/bbox.js +0 -0
  297. /package/dist/{server-core → vendored/server/core}/buildDataFromSchema.js +0 -0
  298. /package/dist/{server-core → vendored/server/core}/cardFiles.js +0 -0
  299. /package/dist/{server-core → vendored/server/core}/cardHistory.js +0 -0
  300. /package/dist/{server-core → vendored/server/core}/cardImage.js +0 -0
  301. /package/dist/{server-core → vendored/server/core}/cardImportMeta.js +0 -0
  302. /package/dist/{server-core → vendored/server/core}/cardListCache.js +0 -0
  303. /package/dist/{server-core → vendored/server/core}/cardOpenFolder.js +0 -0
  304. /package/dist/{server-core → vendored/server/core}/cardSidecar.js +0 -0
  305. /package/dist/{server-core → vendored/server/core}/codeBridge.js +0 -0
  306. /package/dist/{server-core → vendored/server/core}/logStream.js +0 -0
  307. /package/dist/{server-core → vendored/server/core}/logger.js +0 -0
  308. /package/dist/{server-core → vendored/server/core}/nodeModels.js +0 -0
  309. /package/dist/{server-core → vendored/server/core}/renderStatus.js +0 -0
  310. /package/dist/{server-core → vendored/server/core}/screenshot.js +0 -0
  311. /package/dist/{server-core → vendored/server/core}/sliceStatic.js +0 -0
  312. /package/dist/vendored/{meta → skills/dsl-card-generator/vendor/preview/meta}/action-meta.json +0 -0
  313. /package/dist/{server-core/_vendor → vendored/tools}/finmall-env.mjs +0 -0
@@ -1,245 +0,0 @@
1
- <!--
2
- 类型化属性控件(meta 驱动的分派注册表)。
3
-
4
- 参照 ubomp-h5-sub 的「控件注册 + itemValueFrom 切换」范式:
5
- - 按 meta.itemType 渲染对应类型化设置器(颜色/数字/枚举/开关/文本/图标/表达式…);
6
- - 按 meta.itemTypeRange 决定是否显示「值来源」切换:const('0') / var('1') / image('2');
7
- - 写回:直接 mutate 传入的 Property 实例的 itemValue / itemValueFrom,
8
- 再由父级(PropTree / NodeInspector)统一刷新预览或定点并入样式实例树。
9
-
10
- 本组件只渲染「单个属性」,不负责字段发现(那是 PropTree / NodeInspector 的事)。
11
-
12
- 所有设置器统一 props:value / options / watches / itemInfo / disabled,
13
- 统一 emit:input(新值) / change(触发预览) / sync(批量样式,仅 CustomSelect)。
14
- -->
15
- <template>
16
- <div class="pc" :class="{ 'pc--readonly': disabled }">
17
- <!-- 值来源切换(仅当 meta 声明了多于一种来源 且 允许切换时显示) -->
18
- <div class="pc-srcs" v-if="sources.length > 1 && bExchange">
19
- <button
20
- v-for="s in sources"
21
- :key="s.key"
22
- type="button"
23
- class="pc-src"
24
- :class="{ 'is-active': property.itemValueFrom === s.key }"
25
- :disabled="disabled"
26
- @click="setSource(s.key)"
27
- >{{ s.label }}</button>
28
- </div>
29
-
30
- <div class="pc-body">
31
- <!-- 图片素材来源 -->
32
- <SetImage
33
- v-if="property.itemValueFrom === '2'"
34
- :value="property.itemValue"
35
- :options="property.itemOption"
36
- :item-info="property"
37
- :disabled="disabled"
38
- @input="onInput"
39
- @change="onChange"
40
- />
41
-
42
- <!-- 变量 / 表达式来源:带语法高亮、可拖拽调高度 -->
43
- <SetExpr
44
- v-else-if="property.itemValueFrom === '1'"
45
- :value="property.itemValue"
46
- :disabled="disabled"
47
- :item-info="property"
48
- @input="onInput"
49
- @change="onChange"
50
- />
51
-
52
- <!-- 常量来源:按 itemType 分派 -->
53
- <component
54
- v-else
55
- :is="setterComp.comp"
56
- :value="property.itemValue"
57
- :options="property.itemOption"
58
- :watches="watches"
59
- :item-info="property"
60
- :disabled="disabled"
61
- :kind="setterComp.kind"
62
- :multiline="setterComp.multiline"
63
- :boolean="setterComp.boolean"
64
- @input="onInput"
65
- @change="onChange"
66
- @sync="onSync"
67
- />
68
- </div>
69
- </div>
70
- </template>
71
-
72
- <script>
73
- import SetText from './setters/SetText.vue'
74
- import SetNumber from './setters/SetNumber.vue'
75
- import SetSelect from './setters/SetSelect.vue'
76
- import SetSegment from './setters/SetSegment.vue'
77
- import SetSwitch from './setters/SetSwitch.vue'
78
- import SetColor from './setters/SetColor.vue'
79
- import SetIconSelect from './setters/SetIconSelect.vue'
80
- import SetIfForm from './setters/SetIfForm.vue'
81
- import SetNumberStyle from './setters/SetNumberStyle.vue'
82
- import SetPadding from './setters/SetPadding.vue'
83
- import SetGrid9 from './setters/SetGrid9.vue'
84
- import SetBgPosition from './setters/SetBgPosition.vue'
85
- import SetBgSize from './setters/SetBgSize.vue'
86
- import SetGradient from './setters/SetGradient.vue'
87
- import SetCustomSelect from './setters/SetCustomSelect.vue'
88
- import SetList from './setters/SetList.vue'
89
- import SetImage from './setters/SetImage.vue'
90
- import SetCode from './setters/SetCode.vue'
91
- import SetExpr from './setters/SetExpr.vue'
92
-
93
- const FROM_LABEL = { '0': '常量', '1': '变量', '2': '图片' }
94
- // meta.itemTypeRange 字符串 -> 允许的来源 key
95
- const RANGE_KEYS = { const: '0', var: '1', image: '2' }
96
-
97
- /** itemType -> 设置器组件 + 附加 props(kind / multiline / boolean) */
98
- function resolveSetter(itemType) {
99
- switch (itemType) {
100
- case 'InputNumber': return { comp: SetNumber }
101
- case 'Color': return { comp: SetColor }
102
- case 'Select': return { comp: SetSelect }
103
- case 'TabSelect': return { comp: SetSegment, kind: 'TabSelect' }
104
- case 'Input': return { comp: SetText }
105
- case 'Textarea': return { comp: SetText, multiline: true }
106
- case 'Switcher': return { comp: SetSwitch }
107
- case 'BooleanForm': return { comp: SetSwitch, boolean: true }
108
- case 'PaddingStyle': return { comp: SetPadding }
109
- case 'NumberStyle': return { comp: SetNumberStyle }
110
- case 'PositionStyle': return { comp: SetGrid9, kind: 'PositionStyle' }
111
- case 'BackgroundPositionStyle': return { comp: SetBgPosition }
112
- case 'BackgroundSizeStyle': return { comp: SetBgSize }
113
- case 'GradientStyle': return { comp: SetGradient }
114
- case 'FontStyle': return { comp: SetSegment, kind: 'FontStyle' }
115
- case 'TextDecorationStyle': return { comp: SetSegment, kind: 'TextDecorationStyle' }
116
- case 'JustifyContentStyle': return { comp: SetSegment, kind: 'JustifyContentStyle' }
117
- case 'AlignItemsStyle': return { comp: SetSegment, kind: 'AlignItemsStyle' }
118
- case 'IconSelect': return { comp: SetIconSelect }
119
- case 'CustomSelect': return { comp: SetCustomSelect }
120
- case 'List': return { comp: SetList }
121
- case 'IfForm': return { comp: SetIfForm }
122
- case 'Code': return { comp: SetCode }
123
- // 未识别 / (none) / 缺省:普通文本框,保证可回填、可编辑
124
- default: return { comp: SetText }
125
- }
126
- }
127
-
128
- export default {
129
- name: 'PropControl',
130
- components: {
131
- SetText, SetNumber, SetSelect, SetSegment, SetSwitch, SetColor,
132
- SetIconSelect, SetIfForm, SetNumberStyle, SetPadding, SetGrid9,
133
- SetBgPosition, SetBgSize, SetGradient, SetCustomSelect, SetList, SetImage, SetCode, SetExpr,
134
- },
135
- props: {
136
- property: { type: Object, required: true },
137
- watches: { type: Object, default: () => ({}) },
138
- disabled: { type: Boolean, default: false },
139
- /**
140
- * 是否允许显示「常量 / 变量 / 图片」来源切换。
141
- * 对齐线上编辑器 editorOptions.bExchange:指令(directives)区块固定为 false,
142
- * 故显隐设置 / 具体条件这类指令子项不渲染切换 tab,直接以常量形态呈现。
143
- */
144
- bExchange: { type: Boolean, default: true },
145
- },
146
- emits: ['change', 'sync'],
147
- computed: {
148
- itemType() {
149
- return (this.property && this.property.itemType) || ''
150
- },
151
- sources() {
152
- const raw = (this.property && this.property.itemTypeRange) || 'const'
153
- const keys = String(raw).split(',').map((s) => s.trim()).filter(Boolean)
154
- let list = keys
155
- .map((k) => ({ key: RANGE_KEYS[k], label: FROM_LABEL[RANGE_KEYS[k]] }))
156
- .filter((x) => x.key)
157
- // 当前 itemValueFrom 若不在声明来源内(schema 越界或缺失),也纳入以免丢值;
158
- // 但仅当它是合法来源键('0'/'1'/'2')时才塞入,忽略 undefined/非法值,
159
- // 避免单一来源属性(如 Code 脚本)被误渲染出脏来源按钮。
160
- const cur = String(this.property.itemValueFrom)
161
- if (/^[012]$/.test(cur) && !list.some((s) => s.key === cur)) {
162
- list = list.concat([{ key: cur, label: FROM_LABEL[cur] || '来源' + cur }])
163
- }
164
- return list
165
- },
166
- setterComp() {
167
- return resolveSetter(this.itemType)
168
- },
169
- },
170
- methods: {
171
- onInput(v) {
172
- this.property.itemValue = v
173
- // 输入即触发预览刷新:NodeInspector 的 scheduleApply 自带 250ms 防抖,
174
- // 故高频输入只会触发一次(约 250ms 后)重建预览,满足「即时预览」预期(问题 #6)。
175
- this.$emit('change')
176
- },
177
- onChange() {
178
- this.$emit('change')
179
- },
180
- onSync(map) {
181
- this.$emit('sync', map)
182
- },
183
- setSource(k) {
184
- if (this.disabled) return
185
- const prop = this.property
186
- const to = String(k)
187
- if (prop.itemValueFrom === to) return
188
- // 切换来源:先把「当前来源」的实时值归档进缓存,再切到目标来源;
189
- // 目标来源有缓存值则原样回填,没有(从未编辑过)才给默认值。
190
- // 这样每种来源(常量/变量/图片)各存各的,互不复写 —— 修复「切走再切回内容被清空」。
191
- if (!prop._valuesByFrom) {
192
- prop._valuesByFrom = { '0': undefined, '1': undefined, '2': undefined }
193
- }
194
- prop._valuesByFrom[prop.itemValueFrom] = prop.itemValue
195
- prop.itemValueFrom = to
196
- if (prop._valuesByFrom[to] !== undefined) {
197
- prop.itemValue = prop._valuesByFrom[to]
198
- } else if (to === '0') {
199
- const d = prop.itemDefaultValue
200
- prop.itemValue = d === undefined || d === null ? this.defaultFor() : d
201
- prop._valuesByFrom[to] = prop.itemValue
202
- } else {
203
- // 变量('1') / 图片('2') 首次进入时给空串作为起点(非清空,后续切回会回填)
204
- prop.itemValue = ''
205
- prop._valuesByFrom[to] = ''
206
- }
207
- this.$emit('change')
208
- },
209
- defaultFor() {
210
- switch (this.itemType) {
211
- case 'Color': return '#000000'
212
- case 'InputNumber': return 0
213
- case 'Switcher': return '0'
214
- case 'BooleanForm': return false
215
- case 'TabSelect':
216
- case 'Select': {
217
- const opt = this.property.itemOption || {}
218
- const list = opt.iParamList || opt.iTypeList || []
219
- return list.length ? list[0].key : ''
220
- }
221
- default: return ''
222
- }
223
- },
224
- },
225
- }
226
- </script>
227
-
228
- <style scoped>
229
- .pc { display: flex; flex-direction: column; gap: 6px; }
230
- /* .pc-body 是块级容器,唯一子节点 .st-switch 是 inline-flex(内联级原子盒子)。
231
- 行盒高度由继承的 line-height(body 默认 16px / normal ≈ 21.5px)决定,而非 18px 的开关本身,
232
- 导致 .pc-body 被撑到 21.5px 且开关按 baseline 对齐而非垂直居中。置 0 让行盒坍缩为 18px。 */
233
- .pc-body { line-height: 0; }
234
- .pc-srcs { display: flex; gap: 4px; line-height: 1.5; }
235
- .pc-src {
236
- flex: 1; height: 24px; font-size: 12px; padding: 0 10px; border: 1px solid var(--border);
237
- background: transparent; color: var(--text-dim); border-radius: 6px; cursor: pointer;
238
- transition: background 0.12s, color 0.12s, border-color 0.12s;
239
- }
240
- .pc-src:hover { background: var(--bg-hover); color: var(--text); }
241
- /* 选中态与分段控件 .st-seg 同语言:浅底 + 同色文字 + 发丝描边,不做实心填充 */
242
- .pc-src.is-active { background: var(--accent-soft); color: var(--accent); border-color: var(--accent-border); }
243
- .pc-src.is-active:hover { background: var(--accent-soft); color: var(--accent); }
244
- .pc--readonly .pc-src { opacity: .6; cursor: not-allowed; }
245
- </style>
@@ -1,128 +0,0 @@
1
- <!--
2
- 属性树递归渲染器。
3
-
4
- 职责(与编辑器右侧面板的字段组织一致):
5
- - group 类型 / 含 itemChildren 的属性 → 渲染可折叠分组头,递归渲染其子属性;
6
- - 叶子属性 → 「标签 + 控件」一行,控件交给全局 <prop-control>;
7
- - 把「从根到当前叶子的链」(Property[]) 透传给父级,父级据此决定:
8
- * style 模式:调用 NodeEditModel.applyStyleChange(链首分组, 链身);
9
- * property / directive 模式:整树导出(applyToSchema)。
10
-
11
- 本组件通过全局注册 self-reference(prop-tree)+ 全局 prop-control 实现递归,
12
- 避免与 PropControl 互相 import 造成的循环依赖。
13
- -->
14
- <template>
15
- <div class="ptree" :class="{ 'ptree--plain': plain }">
16
- <template v-for="p in properties" :key="p.itemId">
17
- <!-- 分组(自身可见 且 存在可见后代才渲染,避免空分组) -->
18
- <div v-if="isGroup(p) && groupVisible(p)" class="ptree__group">
19
- <div class="ptree__group-head" type="button" @click="toggle(p)">
20
- <span class="ptree__caret" :class="{ 'is-open': isOpen(p) }">▸</span>
21
- <span class="ptree__group-name">{{ p.itemName || p.itemKey }}</span>
22
- </div>
23
- <div v-show="isOpen(p)" class="ptree__group-body">
24
- <prop-tree
25
- v-if="p.itemChildren && p.itemChildren.properties.length"
26
- :properties="p.itemChildren.properties"
27
- :mode="mode"
28
- :depth="depth + 1"
29
- :chain="chain.concat(p)"
30
- :watches="watches"
31
- :disabled="disabled"
32
- :b-exchange="bExchange"
33
- :plain="plain"
34
- @leaf-change="$emit('leaf-change', $event)"
35
- @leaf-sync="$emit('leaf-sync', $event)"
36
- />
37
- </div>
38
- </div>
39
-
40
- <!-- 叶子(itemCondition 判定为不可见时不渲染,与线上编辑器一致) -->
41
- <div
42
- v-else-if="p.itemVisible !== false"
43
- class="ptree__row"
44
- :class="{ 'ptree__row--disabled': disabled, 'ptree__row--block': isBlock(p) }"
45
- >
46
- <label class="ptree__label" :title="p.itemDesc || p.itemName || p.itemKey">{{ p.itemName || p.itemKey || p.itemType || '字段' }}</label>
47
- <div class="ptree__control">
48
- <prop-control
49
- :property="p"
50
- :watches="watches"
51
- :disabled="disabled"
52
- :b-exchange="bExchange"
53
- @change="onLeaf(p)"
54
- @sync="onSync"
55
- />
56
- </div>
57
- </div>
58
- </template>
59
- </div>
60
- </template>
61
-
62
- <script>
63
- export default {
64
- name: 'PropTree',
65
- props: {
66
- properties: { type: Array, default: () => [] },
67
- mode: { type: String, default: 'property' },
68
- /** 嵌套深度:顶层 ptree 为 1,每深入一层 +1(用于决定是否显示分组计数) */
69
- depth: { type: Number, default: 1 },
70
- /** 从根到当前层父分组的链(Property[]),叶子变更时拼接上自身 */
71
- chain: { type: Array, default: () => [] },
72
- /** 同级联动快照,供 itemWatch 使用(如 flexDirection 决定对齐图标方向) */
73
- watches: { type: Object, default: () => ({}) },
74
- disabled: { type: Boolean, default: false },
75
- /** 是否允许显示来源切换 tab(指令区块由父级传 false) */
76
- bExchange: { type: Boolean, default: true },
77
- /** 无 hover 高亮模式(事件抽屉脚本/参数区用,深/浅主题一致) */
78
- plain: { type: Boolean, default: false },
79
- },
80
- emits: ['leaf-change', 'leaf-sync'],
81
- data() {
82
- // 分组默认展开
83
- return { openMap: {} }
84
- },
85
- methods: {
86
- isGroup(p) {
87
- if (!p) return false
88
- if (p.itemType === 'group') return true
89
- const kids = p.itemChildren && p.itemChildren.properties
90
- return !!(kids && kids.length)
91
- },
92
- childCount(p) {
93
- const kids = p.itemChildren && p.itemChildren.properties
94
- return kids ? kids.length : 0
95
- },
96
- /** 需要整行铺开的控件(代码编辑器这类高控件,横排会被挤扁) */
97
- isBlock(p) {
98
- return p && p.itemType === 'Code'
99
- },
100
- /** 分组是否应当渲染:自身可见 且 至少存在一个可见后代(叶子或子分组) */
101
- groupVisible(p) {
102
- if (p.itemVisible === false) return false
103
- const kids = p.itemChildren && p.itemChildren.properties
104
- if (!kids || !kids.length) return true
105
- return kids.some((c) => {
106
- if (c.itemVisible === false) return false
107
- if (this.isGroup(c)) return this.groupVisible(c)
108
- return true
109
- })
110
- },
111
- isOpen(p) {
112
- // 默认展开;仅当显式置为 false 时收起
113
- return this.openMap[p.itemId] !== false
114
- },
115
- toggle(p) {
116
- this.openMap[p.itemId] = this.openMap[p.itemId] === false
117
- // 触发响应式
118
- this.openMap = Object.assign({}, this.openMap)
119
- },
120
- onLeaf(p) {
121
- this.$emit('leaf-change', this.chain.concat(p))
122
- },
123
- onSync(map) {
124
- this.$emit('leaf-sync', map)
125
- },
126
- },
127
- }
128
- </script>
@@ -1,173 +0,0 @@
1
- <template>
2
- <transition name="modal">
3
- <div v-if="visible" class="rp-mask" @click.self="$emit('close')">
4
- <div class="rp-card modal-card" role="dialog" aria-label="远端预览二维码">
5
- <div class="rp-head">
6
- <span class="rp-title">远端预览(真机扫码)</span>
7
- <button class="rp-x" type="button" @click="$emit('close')" aria-label="关闭">×</button>
8
- </div>
9
- <div class="rp-body">
10
- <div class="rp-qr-wrap">
11
- <img v-if="qrDataUrl" :src="qrDataUrl" class="rp-qr" :class="{ 'rp-qr--blurred': publishing }" alt="preview qr" />
12
- <div v-else class="rp-qr rp-qr--loading">{{ loading ? '准备中…' : '—' }}</div>
13
- <div v-if="publishing" class="rp-qr-loading">
14
- <span class="rp-spinner" />
15
- <span class="rp-loading-text">正在发布预览…</span>
16
- </div>
17
- </div>
18
- <p class="rp-tip">手机(FinMall App)扫一扫,真机查看当前卡片预览</p>
19
-
20
- <div class="rp-url">
21
- <code class="rp-url-text">{{ url || '—' }}</code>
22
- <button class="rp-copy" type="button" :disabled="!url" @click="copyUrl">
23
- {{ copied ? '已复制 ✓' : '复制链接' }}
24
- </button>
25
- </div>
26
- <p v-if="warn" class="rp-warn">{{ warn }}</p>
27
- </div>
28
- </div>
29
- </div>
30
- </transition>
31
- </template>
32
-
33
- <script>
34
- import QRCode from 'qrcode'
35
- import { apiFetch } from '@/api.js'
36
-
37
- /**
38
- * 复刻 ubomp-h5-sub 的 PreviewPopover.vue(onPopoverShow)远端预览逻辑:
39
- * 1) 先显示「简版」二维码:app://previewCard?cardId=<id>(对齐 PreviewPopover 第80行)
40
- * 2) 调后端 /__preview 走全链路:
41
- * prepreview 保存(IDC10010)→ 取 code(IDC10015)→ 发布测试版(IDC10020)→ 通知真机(IDC10021)
42
- * 3) 再显示「完整版」二维码:app://previewCard?cardId=<id>&cardCode=<code>&cardVersion=00000000&socket=<wss>
43
- * (对齐 PreviewPopover 第92行,socket = CARD_WEBSOCKET + /websocket/card/<id>)
44
- * 二维码编码的是原生 App scheme(非 http 地址),由 FinMall App 扫码后自行渲染卡片。
45
- * 参考 ubomp-h5-sub/src/modules/inner_card/views/editor/components/PreviewPopover.vue
46
- */
47
- export default {
48
- name: 'RemotePreview',
49
- props: {
50
- visible: { type: Boolean, default: false },
51
- // 远端卡片 id(schema.pageId,数值型),对应 ubomp 的 cardId / $route.query.id
52
- pageId: { type: [String, Number], default: '' },
53
- // 当前卡片完整 schema(含 pageId),用于「预览前先保存」当前编辑内容
54
- schema: { type: Object, default: null },
55
- // 远端卡片 code(可选;留空时由 /__preview 经 IDC10015 取回)
56
- cardCode: { type: String, default: '' },
57
- },
58
- data() {
59
- return {
60
- qrDataUrl: '',
61
- url: '',
62
- loading: false,
63
- publishing: false,
64
- copied: false,
65
- copyTimer: null,
66
- warn: '',
67
- code: '',
68
- }
69
- },
70
- watch: {
71
- visible(v) {
72
- if (v) this.open()
73
- },
74
- pageId() {
75
- if (this.visible) this.open()
76
- },
77
- },
78
- beforeUnmount() {
79
- if (this.copyTimer) clearTimeout(this.copyTimer)
80
- },
81
- methods: {
82
- buildSocket(cardId) {
83
- // 对应 ubomp config/uat.env.js:CARD_WEBSOCKET = wss://<host>/pmb-web
84
- // 域名不硬编码:从 .env.cb 的 FINMALL_BASE_URL 经 vite 暴露到
85
- // import.meta.env 读取(默认 UAT 域名),部署到其他环境时改配置即可。
86
- const base = import.meta.env.FINMALL_BASE_URL || 'https://uat-pkg.finmall.com'
87
- const wsHost = base.replace(/^https?:/, 'wss:')
88
- return `${wsHost}/pmb-web/websocket/card/${cardId}`
89
- },
90
- fullUrl(cardId, cardCode) {
91
- const socket = this.buildSocket(cardId)
92
- return (
93
- `app://previewCard?cardId=${encodeURIComponent(cardId)}` +
94
- `&cardCode=${encodeURIComponent(cardCode || '')}` +
95
- `&cardVersion=00000000` +
96
- `&socket=${encodeURIComponent(socket)}`
97
- )
98
- },
99
- async makeQr(text) {
100
- return QRCode.toDataURL(text, {
101
- width: 220,
102
- margin: 1,
103
- errorCorrectionLevel: 'H',
104
- color: { dark: '#10131a', light: '#ffffff' },
105
- })
106
- },
107
- async open() {
108
- this.qrDataUrl = ''
109
- this.url = ''
110
- this.loading = true
111
- this.publishing = false
112
- this.copied = false
113
- this.warn = ''
114
- this.code = this.cardCode || ''
115
- const cardId = String(this.pageId || '').trim()
116
- if (!cardId) {
117
- this.warn = '当前卡片缺少 pageId(远端卡片 id),无法生成预览二维码'
118
- this.loading = false
119
- return
120
- }
121
- // 1) 简版二维码(仅 cardId)
122
- this.url = `app://previewCard?cardId=${encodeURIComponent(cardId)}`
123
- try {
124
- this.qrDataUrl = await this.makeQr(this.url)
125
- } catch (e) {
126
- this.warn = '二维码生成失败:' + (e && e.message)
127
- }
128
- // 2) 走远端全链路:保存 → 取 code → 发布 → 通知
129
- this.publishing = true
130
- try {
131
- const resp = await apiFetch('/__preview', {
132
- method: 'POST',
133
- headers: { 'content-type': 'application/json' },
134
- body: JSON.stringify({ schema: this.schema || { pageId: cardId } }),
135
- })
136
- const data = await resp.json().catch(() => ({}))
137
- if (!resp.ok) throw new Error(data.message || 'preview failed')
138
- if (data.cardCode !== undefined) this.code = data.cardCode
139
- // 3) 完整版二维码(带 cardCode / socket)
140
- this.url = this.fullUrl(cardId, this.code)
141
- this.qrDataUrl = await this.makeQr(this.url)
142
- } catch (e) {
143
- this.warn = '远端发布失败:' + (e && e.message)
144
- } finally {
145
- this.publishing = false
146
- this.loading = false
147
- }
148
- },
149
- async copyUrl() {
150
- if (!this.url) return
151
- try {
152
- if (navigator.clipboard && navigator.clipboard.writeText) {
153
- await navigator.clipboard.writeText(this.url)
154
- } else {
155
- const ta = document.createElement('textarea')
156
- ta.value = this.url
157
- ta.style.position = 'fixed'
158
- ta.style.opacity = '0'
159
- document.body.appendChild(ta)
160
- ta.select()
161
- document.execCommand('copy')
162
- document.body.removeChild(ta)
163
- }
164
- this.copied = true
165
- if (this.copyTimer) clearTimeout(this.copyTimer)
166
- this.copyTimer = setTimeout(() => { this.copied = false }, 1500)
167
- } catch (e) {
168
- this.warn = '复制失败:' + (e && e.message)
169
- }
170
- },
171
- },
172
- }
173
- </script>
@@ -1,105 +0,0 @@
1
- <!--
2
- 节点覆盖层(DevTools 风格):作为 .phone__screen(滚动容器)的直接子节点,绝对定位于
3
- 屏幕的 content 坐标系:这样它随卡片内容纵向滚动时自动贴合目标元素,无需手动跟随滚动。
4
-
5
- 位置/尺寸由 store.el 的 getBoundingClientRect() 相对屏幕计算而来,对任意元素类型
6
- (canvas / input / button / div / span …)均生效。
7
-
8
- 本组件通过 props 复用:
9
- - store:驱动覆盖层的响应式 store(默认选中态 store);
10
- - boxClass:覆盖层样式 class(默认选中态 ce-sel-overlay)。
11
- (hover 参考线为独立组件 HoverGuides.vue,不再复用本组件。)
12
- -->
13
- <template>
14
- <div
15
- v-show="store.visible"
16
- :class="boxClass"
17
- :style="boxStyle"
18
- ><svg width="100%" height="100%" style="display: block;" xmlns="http://www.w3.org/2000/svg"><rect id="controls_bounding_rect" x="0" y="0" width="100%" height="100%" fill="transparent" style="stroke: var(--accent);" stroke-width="1" stroke-dasharray="4"></rect></svg>
19
- </div>
20
- </template>
21
-
22
- <script>
23
- import { selectionOverlay } from '@/runtime/selectionOverlay.js'
24
-
25
- export default {
26
- name: 'SelectionOverlay',
27
- props: {
28
- // 驱动覆盖层的响应式 store(默认选中态;hover 参考线复用本组件时传 hoverGuide)
29
- store: { type: Object, default: () => selectionOverlay },
30
- // 覆盖层样式 class(选中态 = ce-sel-overlay;hover 参考线 = ce-guide-overlay)
31
- boxClass: { type: String, default: 'ce-sel-overlay' },
32
- },
33
- data() {
34
- return {
35
- boxStyle: { top: '0px', left: '0px', width: '0px', height: '0px' },
36
- _ro: null,
37
- _onScroll: null,
38
- _onResize: null,
39
- _raf: 0,
40
- }
41
- },
42
- watch: {
43
- // 目标元素变化或显隐变化:重新定位(并接管对该元素的尺寸监听)
44
- 'store.el'() {
45
- this.bindTarget()
46
- this.schedule()
47
- },
48
- },
49
- mounted() {
50
- this._onScroll = () => this.schedule()
51
- this._onResize = () => this.schedule()
52
- // 滚动(含嵌套滚动)与窗口缩放都可能改变元素视口位置,重算即可,
53
- // 因坐标基于 content 且覆盖层随滚动容器移动,重算值本身稳定,开销很小。
54
- document.addEventListener('scroll', this._onScroll, { passive: true, capture: true })
55
- window.addEventListener('resize', this._onResize)
56
- this.bindTarget()
57
- this.schedule()
58
- },
59
- beforeUnmount() {
60
- document.removeEventListener('scroll', this._onScroll, { capture: true })
61
- window.removeEventListener('resize', this._onResize)
62
- if (this._ro) { this._ro.disconnect(); this._ro = null }
63
- if (this._raf) cancelAnimationFrame(this._raf)
64
- },
65
- methods: {
66
- /** 把 ResizeObserver 绑定到当前目标元素,元素自身尺寸变化(编辑文本/改样式)时自动重算 */
67
- bindTarget() {
68
- if (this._ro) { this._ro.disconnect(); this._ro = null }
69
- const el = this.store.el
70
- if (!el || typeof ResizeObserver === 'undefined') return
71
- this._ro = new ResizeObserver(() => this.schedule())
72
- this._ro.observe(el)
73
- },
74
- /** rAF 批处理,避免一帧内多次重算 */
75
- schedule() {
76
- if (this._raf) return
77
- this._raf = requestAnimationFrame(() => {
78
- this._raf = 0
79
- this.recompute()
80
- })
81
- },
82
- recompute() {
83
- const el = this.store.el
84
- if (!el || !this.store.visible) return
85
- const container = el.closest('.phone__screen')
86
- // 目标元素已脱离文档(如切换卡片后旧的 RenderTree 被卸载):自动隐藏,避免残留
87
- if (!container) {
88
- this.store.visible = false
89
- return
90
- }
91
- const cRect = container.getBoundingClientRect()
92
- const eRect = el.getBoundingClientRect()
93
- // content 坐标:减屏幕视口偏移 + 加屏幕滚动量(抵消滚动,使覆盖层粘在元素上)
94
- const top = eRect.top - cRect.top + container.scrollTop
95
- const left = eRect.left - cRect.left + container.scrollLeft
96
- this.boxStyle = {
97
- top: top + 'px',
98
- left: left + 'px',
99
- width: eRect.width + 'px',
100
- height: eRect.height + 'px',
101
- }
102
- },
103
- },
104
- }
105
- </script>