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,70 +0,0 @@
1
- <!--
2
- 设备级模拟 UI 图层:alertDialog 确认对话框 + showToast 弱提示。
3
- 相对固定视口 phone-viewport 定位(absolute inset:0),不随卡片内容滚动。
4
- 层级高于 alertCard 图层(z-index 1100 > 1000),模拟原生对话框盖住弹窗卡片。
5
- -->
6
- <template>
7
- <div class="device-ui">
8
- <!-- alertDialog:原生风格居中确认对话框 -->
9
- <transition name="dlg-fade">
10
- <div v-if="dialog" class="dlg-mask" @click.self="onMaskClick">
11
- <div class="dlg">
12
- <div v-if="dialog.title" class="dlg__title">{{ dialog.title }}</div>
13
- <div v-if="dialog.message" class="dlg__msg">{{ dialog.message }}</div>
14
- <div class="dlg__btns">
15
- <button
16
- v-if="dialog.cancelButton"
17
- type="button"
18
- class="dlg__btn dlg__btn--cancel"
19
- :class="{ 'dlg__btn--gray': dialog.cancelGrayStyle }"
20
- @click="onCancel"
21
- >{{ dialog.cancelButton }}</button>
22
- <button type="button" class="dlg__btn dlg__btn--ok" @click="onOk">{{ dialog.okButton }}</button>
23
- </div>
24
- </div>
25
- </div>
26
- </transition>
27
- <!-- showToast:居中弱提示(对齐 Vant Toast 视觉语言) -->
28
- <transition name="toast-fade">
29
- <div v-if="toast" class="dtoast" :class="{ 'dtoast--icon': toast.icon }">
30
- <span v-if="toast.icon" class="dtoast__icon" :class="'dtoast__icon--' + toast.icon">
31
- <svg class="dtoast__icon-svg" viewBox="0 0 24 24" aria-hidden="true">
32
- <path v-if="toast.icon === 'ok'" d="M5 13l4 4L19 7" />
33
- <path v-else d="M6 6l12 12M18 6L6 18" />
34
- </svg>
35
- </span>
36
- <span class="dtoast__msg">{{ toast.message }}</span>
37
- </div>
38
- </transition>
39
- </div>
40
- </template>
41
-
42
- <script>
43
- import { deviceUI, dismissDialog } from '@/runtime/jsapi-mock.js'
44
-
45
- export default {
46
- name: 'DeviceOverlay',
47
- computed: {
48
- dialog() {
49
- return deviceUI.dialog
50
- },
51
- toast() {
52
- return deviceUI.toast
53
- },
54
- },
55
- methods: {
56
- onOk() {
57
- dismissDialog({ ok: true, dismissByClickBg: false })
58
- },
59
- onCancel() {
60
- dismissDialog({ ok: false, dismissByClickBg: false })
61
- },
62
- onMaskClick() {
63
- // 仅当 clickBgToHide 为 true 时点击背景才关闭(dismissByClickBg 标记此关闭方式)
64
- if (this.dialog && this.dialog.clickBgToHide) {
65
- dismissDialog({ ok: false, dismissByClickBg: true })
66
- }
67
- },
68
- },
69
- }
70
- </script>
@@ -1,193 +0,0 @@
1
- <template>
2
- <div ref="root" class="dd" :class="['dd--' + size, { 'dd--open': open, 'dd--block': block, 'dd--disabled': disabled, 'dd--borderless': borderless, 'dd--dropup': dropUp }]" :style="rootStyle">
3
- <button
4
- v-if="!hasTriggerSlot"
5
- type="button"
6
- class="dd__trigger"
7
- :class="{ 'dd__trigger--active': open }"
8
- :disabled="disabled"
9
- @click="toggle"
10
- >
11
- <!-- current 插槽:自定义触发器内的已选值呈现(如「彩色类型标签 + 中文名」),缺省仍为纯文本 -->
12
- <span class="dd__label" :title="displayText"><slot name="current" :opt="current" :text="displayText">{{ displayText }}</slot></span>
13
- <span
14
- v-if="clearable && hasValue"
15
- class="dd__clear"
16
- role="button"
17
- tabindex="-1"
18
- title="清空"
19
- @click.stop="clear"
20
- >✕</span
21
- >
22
- <svg class="dd__chev" viewBox="0 0 16 16" :width="chevSize" :height="chevSize" aria-hidden="true"><use href="#icon-chevron" /></svg>
23
- </button>
24
- <div v-else class="dd__trigger dd__trigger--slot" @click="toggle">
25
- <slot name="trigger" :open="open" :toggle="toggle" />
26
- </div>
27
-
28
- <transition name="dd-fade">
29
- <div v-if="open" ref="pop" class="dd__pop" :class="['dd__pop--' + placement]">
30
- <slot :close="close" :choose="choose">
31
- <ul class="dd__list">
32
- <li
33
- v-for="opt in options"
34
- :key="opt.key"
35
- class="dd__item"
36
- :class="{ 'dd__item--selected': opt.key === value, 'dd__item--disabled': opt.disabled }"
37
- @mousemove="onHover(opt)"
38
- @click="onItemClick(opt)"
39
- >
40
- <!-- option 插槽:自定义单个选项的内容,缺省为 opt.value 纯文本 -->
41
- <span class="dd__item-text"><slot name="option" :opt="opt">{{ opt.value }}</slot></span>
42
- <svg v-if="opt.key === value" class="dd__check" viewBox="0 0 16 16" :width="checkSize" :height="checkSize" aria-hidden="true"><use href="#icon-check" /></svg>
43
- </li>
44
- <li v-if="!options.length" class="dd__empty">{{ placeholder || '无选项' }}</li>
45
- </ul>
46
- </slot>
47
- </div>
48
- </transition>
49
- </div>
50
- </template>
51
-
52
- <script>
53
- export default {
54
- name: 'Dropdown',
55
- emits: ['input', 'change'],
56
- props: {
57
- value: { type: [String, Number, null], default: '' },
58
- options: { type: Array, default: () => [] },
59
- placeholder: { type: String, default: '请选择' },
60
- // 尺寸:xs(表单紧凑 24px)/ sm(28px)/ md(顶栏 32px)/ lg(36px)
61
- size: { type: String, default: 'sm' },
62
- // block:撑满父容器宽度(表单内 select 用)
63
- block: { type: Boolean, default: false },
64
- disabled: { type: Boolean, default: false },
65
- // 弹层对齐:bottom-start(左对齐)/ bottom-end(右对齐)
66
- placement: { type: String, default: 'bottom-start' },
67
- // 外部宽度覆盖(px),优先级高于 size
68
- width: { type: [String, Number], default: null },
69
- // 无边框模式:默认 false(有边框);true 时不显示边框与选中高亮效果
70
- borderless: { type: Boolean, default: false },
71
- // 触发器显示文案自定义(默认取选中项 value 或 placeholder)
72
- label: { type: String, default: null },
73
- // 可清空:选中值后触发器右侧显示 ✕ 清除按钮(默认 false,避免影响其它下拉)
74
- clearable: { type: Boolean, default: false },
75
- },
76
- data() {
77
- return { open: false, dropUp: false }
78
- },
79
- computed: {
80
- hasTriggerSlot() {
81
- return !!this.$slots.trigger
82
- },
83
- current() {
84
- return this.options.find((o) => o.key === this.value) || null
85
- },
86
- hasValue() {
87
- return this.value !== '' && this.value !== null && this.value !== undefined
88
- },
89
- displayText() {
90
- if (this.label != null) return this.label
91
- if (this.current) return this.current.value || String(this.current.key)
92
- return this.placeholder || '请选择'
93
- },
94
- chevSize() {
95
- return this.size === 'xs' ? 11 : this.size === 'md' || this.size === 'lg' ? 13 : 12
96
- },
97
- checkSize() {
98
- return this.size === 'xs' ? 11 : 12
99
- },
100
- rootStyle() {
101
- if (this.width != null) return { width: typeof this.width === 'number' ? this.width + 'px' : this.width }
102
- return null
103
- },
104
- },
105
- watch: {
106
- open(v) {
107
- if (v) {
108
- document.addEventListener('click', this.onDocClick, true)
109
- } else {
110
- document.removeEventListener('click', this.onDocClick, true)
111
- }
112
- },
113
- },
114
- beforeUnmount() {
115
- document.removeEventListener('click', this.onDocClick, true)
116
- },
117
- methods: {
118
- toggle() {
119
- if (this.disabled) return
120
- if (!this.open) this.openMenu()
121
- else this.open = false
122
- },
123
- openMenu() {
124
- // 打开前先估算弹层高度,判断下方空间是否足够;不足且上方够则翻转到上方,
125
- // 避免触发器位于滚动/裁剪容器底部时弹层被裁掉、需手动滚动才可见。
126
- const root = this.$refs.root
127
- if (root) {
128
- const estH = Math.min(this.options.length * 31 + 12, 290)
129
- this.dropUp = this.shouldDropUp(root, estH)
130
- }
131
- this.open = true
132
- // 渲染后按弹层真实高度再校正一次(估算与实际有出入时兜底,避免闪烁)
133
- this.$nextTick(() => {
134
- const pop = this.$refs.pop
135
- const root = this.$refs.root
136
- if (!pop || !root) return
137
- const want = this.shouldDropUp(root, pop.offsetHeight)
138
- if (want !== this.dropUp) this.dropUp = want
139
- })
140
- },
141
- /** 触发器位于容器底部、下方空间不足以容纳弹层且上方空间足够时返回 true(向上弹出) */
142
- shouldDropUp(root, popH) {
143
- const tr = root.getBoundingClientRect()
144
- const clip = this.getClipRect(root)
145
- const spaceBelow = clip.bottom - tr.bottom
146
- const spaceAbove = tr.top - clip.top
147
- return spaceBelow < popH && spaceAbove >= popH
148
- },
149
- /** 向上回溯找到最近的会裁剪/滚动内容的祖先,作为可见区域边界;
150
- 找不到则回退到视口。弹层必须落在该矩形内才不会被裁掉。 */
151
- getClipRect(el) {
152
- let node = el.parentElement
153
- while (node && node !== document.body) {
154
- const ov = getComputedStyle(node).overflowY
155
- if (ov === 'auto' || ov === 'scroll' || ov === 'hidden') {
156
- return node.getBoundingClientRect()
157
- }
158
- node = node.parentElement
159
- }
160
- return document.documentElement.getBoundingClientRect()
161
- },
162
- close() {
163
- this.open = false
164
- this.dropUp = false
165
- },
166
- clear() {
167
- if (this.disabled) return
168
- this.close()
169
- // 即使值未变也照常回传空串,确保父级能把字段重置为空
170
- this.$emit('input', '')
171
- this.$emit('change', '')
172
- },
173
- onDocClick(e) {
174
- if (this.$refs.root && !this.$refs.root.contains(e.target)) this.close()
175
- },
176
- onHover() {},
177
- onItemClick(opt) {
178
- if (opt.disabled) return
179
- this.choose(opt.key)
180
- },
181
- choose(key) {
182
- this.close()
183
- if (key !== this.value) {
184
- this.$emit('input', key)
185
- this.$emit('change', key)
186
- } else {
187
- // 即使值未变也允许父级响应(如菜单按钮只关心点击)
188
- this.$emit('change', key)
189
- }
190
- },
191
- },
192
- }
193
- </script>
@@ -1,273 +0,0 @@
1
- <!--
2
- 节点事件编辑抽屉(右侧滑出)。
3
-
4
- 与属性编辑(NodeInspector)解耦:结构树的「事件」徽标 / 事件计数按钮
5
- 点击时单独打开本抽屉,只编辑 eventactions,不涉及属性/样式。
6
-
7
- 上下排布:上方事件开关列表,下方动作 / 脚本编辑区(复用 PropTree)。
8
- 数据模型与 NodeInspector 事件页签一致(EventEditModel):
9
- - 列出该节点所有可用事件(组件 events + 全局生命周期),每事件一个开关;
10
- - 开关开 -> 选中后在下方展示动作类型选择 + 参数表单;
11
- - 编辑即时(防抖)重建预览(emit apply),「应用」把改动暂存进内存工作副本(currentSchema),落盘由顶栏「保存到本地」负责;不再 emit write-back。
12
- -->
13
- <template>
14
- <div class="ee-overlay">
15
- <div class="ee-panel">
16
- <div class="ee-head">
17
- <span class="ee-title">
18
- 事件配置 · {{ compName }}
19
- <em class="ee-cls">{{ schemaNode && schemaNode.className }}</em>
20
- </span>
21
- <button class="ee-close" type="button" @click="onClose"></button>
22
- </div>
23
-
24
- <div class="ee-body">
25
- <aside class="ee-side">
26
- <p v-if="!eventModel || !eventModel.eventOptions.length" class="ee-empty">该节点无可用事件</p>
27
- <div v-else class="ee-evt-list">
28
- <div
29
- v-for="evt in eventModel.eventOptions"
30
- :key="evt.eventKey"
31
- class="ee-evt"
32
- :class="{ 'is-on': isOn(evt), 'is-sel': activeKey === evt.eventKey }"
33
- @click="onSelectEvent(evt)"
34
- >
35
- <span class="ee-evt-name" :title="evt.eventDesc || evt.eventName || evt.eventKey">{{ evt.eventName || evt.eventKey }}</span>
36
- <button
37
- class="ee-switch"
38
- type="button"
39
- role="switch"
40
- :aria-checked="isOn(evt)"
41
- :class="{ 'is-on': isOn(evt) }"
42
- @click.stop="onToggleEvent(evt)"
43
- ><span class="ee-switch__dot"></span></button>
44
- </div>
45
- </div>
46
- <!-- 帮助图标:与事件项左右靠边、垂直居中;点击弹出当前动作的使用说明 -->
47
- <button
48
- class="ee-help"
49
- type="button"
50
- :title="helpOpen ? '关闭使用说明' : '使用说明'"
51
- @click.stop="helpOpen = !helpOpen"
52
- >
53
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor"
54
- stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
55
- <circle cx="12" cy="12" r="10"></circle>
56
- <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
57
- <line x1="12" y1="17" x2="12.01" y2="17"></line>
58
- </svg>
59
- </button>
60
- <div v-if="helpOpen" class="ee-help__mask" @click="helpOpen = false"></div>
61
- <Transition name="pop">
62
- <div v-if="helpOpen" class="ee-help__pop" @click.stop>
63
- <p class="ee-help__text">{{ helpText }}</p>
64
- </div>
65
- </Transition>
66
- </aside>
67
-
68
- <section class="ee-detail">
69
- <template v-if="activeRow">
70
- <div class="ee-detail-head">
71
- <div class="ee-field-row">
72
- <label class="ee-field-label">动作类型</label>
73
- <Dropdown
74
- :value="activeRow.actionType"
75
- :options="actionOptions(activeRow)"
76
- size="sm"
77
- block
78
- @change="onActionType(activeRow, $event)"
79
- />
80
- </div>
81
- </div>
82
-
83
- <div class="ee-detail-body">
84
- <prop-tree
85
- v-if="activeRow.properties.length"
86
- :key="activeRow.formKey"
87
- :properties="activeRow.properties"
88
- mode="event"
89
- :plain="true"
90
- @leaf-change="onEventLeaf"
91
- />
92
- <p v-else class="ee-empty">该动作无可配置参数</p>
93
- <p v-if="activeRow.extraProperties.length" class="ee-evt-orphan">
94
- 另有 {{ activeRow.extraProperties.length }} 项 meta 未定义的参数,已原样保留
95
- </p>
96
- </div>
97
- </template>
98
-
99
- <p v-else class="ee-empty ee-detail-empty">请在左侧开启并选择一个事件</p>
100
- </section>
101
- </div>
102
-
103
- <div class="ee-foot">
104
- <span class="ee-tip">编辑即时预览(不记历史);「应用」写入历史并关闭,落盘由顶栏「保存到本地」负责</span>
105
- <div class="ee-foot-btns">
106
- <button class="ee-btn ee-btn--ghost" type="button" @click="onCancel">取消</button>
107
- <button class="ee-btn" type="button" @click="onApplyWrite">应用</button>
108
- </div>
109
- </div>
110
- </div>
111
- </div>
112
- </template>
113
-
114
- <script>
115
- import { reactive } from 'vue'
116
- import { EventEditModel, ACTION_MAP } from '@/runtime/event-model.js'
117
-
118
- export default {
119
- name: 'EventEditor',
120
- props: {
121
- comp: { type: Object, required: true },
122
- compNames: { type: Object, default: () => ({}) },
123
- rt: { type: Object, required: true },
124
- },
125
- emits: ['apply', 'commit', 'close'],
126
- data() {
127
- return {
128
- eventModel: null,
129
- activeKey: '',
130
- helpOpen: false,
131
- _t: null,
132
- _snapshot: null,
133
- _dirty: false,
134
- _written: false,
135
- }
136
- },
137
- computed: {
138
- schemaNode() {
139
- return (this.comp && this.comp._schemaNode) || null
140
- },
141
- compName() {
142
- const cn = this.schemaNode && this.schemaNode.className
143
- if (!cn) return '节点'
144
- return (this.compNames && this.compNames[cn]) || cn
145
- },
146
- activeRow() {
147
- if (!this.eventModel || !this.activeKey) return null
148
- return this.eventModel.rowForEvent(this.activeKey) || null
149
- },
150
- /** 帮助弹层文案:当前动作类型的使用说明;无选中动作时给通用引导 */
151
- helpText() {
152
- const d = this.activeRow ? this.actionDesc(this.activeRow.actionType) : ''
153
- return d || '先在上方开启事件,再选择动作类型并填写参数;编辑即时预览,「应用」写入历史。'
154
- },
155
- },
156
- watch: {
157
- comp: {
158
- immediate: true,
159
- handler() {
160
- this.buildModel()
161
- },
162
- },
163
- },
164
- methods: {
165
- buildModel() {
166
- const sn = this.schemaNode
167
- this.eventModel = sn ? reactive(new EventEditModel(sn)) : null
168
- this.activeKey = ''
169
- this.helpOpen = false
170
- this._snapshot = sn ? this.snapshotEventActions(sn) : null
171
- this._dirty = false
172
- this._written = false
173
- this.autoSelect()
174
- },
175
- snapshotEventActions(node) {
176
- const hadKey = Object.prototype.hasOwnProperty.call(node, 'eventactions')
177
- return {
178
- hadKey,
179
- eventactions: hadKey ? JSON.parse(JSON.stringify(node.eventactions || [])) : [],
180
- }
181
- },
182
- restoreSnapshot() {
183
- const sn = this.schemaNode
184
- if (!sn || !this._snapshot) return
185
- if (this._snapshot.hadKey) {
186
- sn.eventactions = JSON.parse(JSON.stringify(this._snapshot.eventactions || []))
187
- } else {
188
- delete sn.eventactions
189
- }
190
- },
191
- autoSelect() {
192
- // 默认展开「第一个已开启事件」的设置区(驱动下方输入框区域),但不整行高亮;
193
- // 没有已开启事件时保持空态。注意:仅选已开启项,不默认选中未开启的首项。
194
- if (!this.eventModel) { this.activeKey = ''; return }
195
- const firstOn = this.eventModel.eventOptions.find((e) => this.eventModel.rowForEvent(e.eventKey))
196
- this.activeKey = firstOn ? firstOn.eventKey : ''
197
- },
198
- isOn(evt) {
199
- return !!(this.eventModel && this.eventModel.rowForEvent(evt.eventKey))
200
- },
201
- onSelectEvent(evt) {
202
- this.activeKey = evt.eventKey
203
- },
204
- onToggleEvent(evt) {
205
- const wasOn = this.isOn(evt)
206
- this.eventModel.toggleEvent(evt)
207
- this._dirty = true
208
- // 开启后展开该事件的下方设置区(驱动右侧详情区),但不整行高亮;
209
- // 关闭当前正编辑的事件时收起详情区
210
- if (!wasOn) {
211
- this.activeKey = evt.eventKey
212
- } else if (this.activeKey === evt.eventKey) {
213
- this.activeKey = ''
214
- }
215
- this.scheduleApply()
216
- },
217
- actionOptions(row) {
218
- return (this.eventModel.actionOptionsForEvent(row.eventKey, row.actionType) || []).map((a) => ({
219
- key: a.actionType,
220
- value: a.actionName + (a._unknown ? ' · meta 未定义' : ''),
221
- }))
222
- },
223
- actionDesc(t) {
224
- return (ACTION_MAP[t] && ACTION_MAP[t].actionDesc) || ''
225
- },
226
- onActionType(row, type) {
227
- this.eventModel.setActionType(row, type)
228
- this._dirty = true
229
- this.scheduleApply()
230
- },
231
- onEventLeaf() {
232
- this.eventModel.refreshVisible()
233
- this._dirty = true
234
- this.scheduleApply()
235
- },
236
- scheduleApply() {
237
- if (this._t) clearTimeout(this._t)
238
- this._t = setTimeout(() => {
239
- this.applyAll()
240
- this.$emit('apply')
241
- }, 250)
242
- },
243
- applyAll() {
244
- if (this.eventModel) this.eventModel.applyToSchema()
245
- },
246
- /** 将改动暂存到内存工作副本(currentSchema,与预览同引用),并重建预览;
247
- * 不写盘——落盘由顶栏「保存到本地」统一负责。_written=true 表示已提交到内存,
248
- * 「取消」不再还原;随后关闭抽屉。 */
249
- onApplyWrite() {
250
- if (this._t) {
251
- clearTimeout(this._t)
252
- this._t = null
253
- }
254
- this.applyAll()
255
- this._written = true
256
- this.$emit('apply')
257
- this.$emit('commit')
258
- this.$emit('close')
259
- },
260
- onCancel() {
261
- this.onClose()
262
- },
263
- onClose() {
264
- if (this._t) { clearTimeout(this._t); this._t = null }
265
- if (this._dirty && !this._written) {
266
- this.restoreSnapshot()
267
- this.$emit('apply')
268
- }
269
- this.$emit('close')
270
- },
271
- },
272
- }
273
- </script>
@@ -1,122 +0,0 @@
1
- <!--
2
- 「组件结构」tab 的 hover 参考线(Photoshop 风格辅助线):
3
-
4
- 鼠标 hover 到结构树某节点时,于画布上绘制两对「贯穿」参考线,用于选中/定位前的快速预览——
5
- - 一对竖线:位于元素左、右边缘,纵向贯穿整个画布(高度 = 画布内容全高);
6
- - 一对横线:位于元素上、下边缘,横向贯穿整个画布(宽度 = 画布内容全宽)。
7
-
8
- 覆盖层作为 .phone__screen(滚动容器)的直接子节点,绝对定位于屏幕的 content 坐标系,
9
- 随卡片内容纵向滚动时自动贴合目标元素,无需手动跟随滚动;pointer-events:none 不挡交互。
10
-
11
- 与选中态遮罩 (SelectionOverlay) 相互独立:选中框(蓝虚线)与 hover 参考线(荧光绿贯穿线)
12
- 可同时显示、互不干扰。定位依据:hoverGuide.el 即目标节点画布根 DOM,由 App.onHoverNode
13
- 通过 data-cid 反查写入。
14
- -->
15
- <template>
16
- <div v-show="hoverGuide.visible" class="ce-guides" :style="containerStyle">
17
- <!-- 左 / 右竖线:贯穿画布全高 -->
18
- <div class="ce-guide ce-guide--v" :style="{ left: box.left + 'px' }"></div>
19
- <div class="ce-guide ce-guide--v" :style="{ left: box.right + 'px' }"></div>
20
- <!-- 上 / 下横线:贯穿画布全宽 -->
21
- <div class="ce-guide ce-guide--h" :style="{ top: box.top + 'px' }"></div>
22
- <div class="ce-guide ce-guide--h" :style="{ top: box.bottom + 'px' }"></div>
23
- </div>
24
- </template>
25
-
26
- <script>
27
- import { watch } from 'vue'
28
- import { hoverGuide } from '@/runtime/hoverGuide.js'
29
-
30
- export default {
31
- name: 'HoverGuides',
32
- // 模板需要访问模块级 reactive 对象 hoverGuide(v-show 控制显隐),
33
- // 但 Vue SFC 的 <template> 作用域只能访问组件实例属性,
34
- // 故通过 setup() 把它暴露出去(不能裸用 import 变量)。
35
- setup() {
36
- return { hoverGuide }
37
- },
38
- data() {
39
- return {
40
- // 元素边缘(content 坐标):左/上/右/下
41
- box: { left: 0, top: 0, right: 0, bottom: 0 },
42
- // 覆盖层尺寸 = 画布内容全宽 / 全高,使参考线贯穿整块画布
43
- containerStyle: { width: '0px', height: '0px' },
44
- _ro: null,
45
- _onScroll: null,
46
- _onResize: null,
47
- _raf: 0,
48
- _stopWatch: null,
49
- }
50
- },
51
- created() {
52
- // 注意:hoverGuide 是模块级 reactive 导入,不属于组件实例,
53
- // Options API 的字符串监听路径 'hoverGuide.el' 会相对 this 解析而失效,
54
- // 必须改用命令式 watch(getter) 才能正确监听目标元素变化。
55
- this._stopWatch = watch(
56
- () => hoverGuide.el,
57
- () => {
58
- this.bindTarget()
59
- this.schedule()
60
- },
61
- )
62
- },
63
- mounted() {
64
- this._onScroll = () => this.schedule()
65
- this._onResize = () => this.schedule()
66
- // 滚动(含嵌套滚动)与窗口缩放都可能改变元素视口位置,重算即可,
67
- // 因坐标基于 content 且覆盖层随滚动容器移动,重算值本身稳定,开销很小。
68
- document.addEventListener('scroll', this._onScroll, { passive: true, capture: true })
69
- window.addEventListener('resize', this._onResize)
70
- this.bindTarget()
71
- this.schedule()
72
- },
73
- beforeUnmount() {
74
- document.removeEventListener('scroll', this._onScroll, { capture: true })
75
- window.removeEventListener('resize', this._onResize)
76
- if (this._stopWatch) { this._stopWatch(); this._stopWatch = null }
77
- if (this._ro) { this._ro.disconnect(); this._ro = null }
78
- if (this._raf) cancelAnimationFrame(this._raf)
79
- },
80
- methods: {
81
- /** 把 ResizeObserver 绑定到当前目标元素,元素自身尺寸变化(编辑文本/改样式)时自动重算 */
82
- bindTarget() {
83
- if (this._ro) { this._ro.disconnect(); this._ro = null }
84
- const el = hoverGuide.el
85
- if (!el || typeof ResizeObserver === 'undefined') return
86
- this._ro = new ResizeObserver(() => this.schedule())
87
- this._ro.observe(el)
88
- },
89
- /** rAF 批处理,避免一帧内多次重算 */
90
- schedule() {
91
- if (this._raf) return
92
- this._raf = requestAnimationFrame(() => {
93
- this._raf = 0
94
- this.recompute()
95
- })
96
- },
97
- recompute() {
98
- const el = hoverGuide.el
99
- if (!el || !hoverGuide.visible) return
100
- const container = el.closest('.phone__screen')
101
- // 目标元素已脱离文档(如切换卡片后旧的 RenderTree 被卸载):自动隐藏,避免残留
102
- if (!container) {
103
- hoverGuide.visible = false
104
- return
105
- }
106
- const cRect = container.getBoundingClientRect()
107
- const eRect = el.getBoundingClientRect()
108
- // content 坐标:减屏幕视口偏移 + 加屏幕滚动量(抵消滚动,使参考线粘在元素上)
109
- const left = eRect.left - cRect.left + container.scrollLeft
110
- const top = eRect.top - cRect.top + container.scrollTop
111
- const width = eRect.width
112
- const height = eRect.height
113
- this.box = { left, top, right: left + width, bottom: top + height }
114
- // 贯穿尺寸:竖线高 = 画布内容全高(scrollHeight),横线宽 = 画布内容全宽(clientWidth)
115
- this.containerStyle = {
116
- width: container.clientWidth + 'px',
117
- height: container.scrollHeight + 'px',
118
- }
119
- },
120
- },
121
- }
122
- </script>