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,201 +0,0 @@
1
- <!--
2
- 接口调用 tab 的「返回数据」结构化折叠树(只读,对齐 Chrome 控制台对象检视器)。
3
- - 复合类型(对象 / 数组)可点击折叠 / 展开,默认全部折叠,折叠时显示预览摘要。
4
- - 基础类型按类型着色(复用 .jt__val--* 配色),字符串不带引号(DevTools 风格)。
5
- - 折叠状态在整棵树内共享(openState),按节点路径独立记录。
6
- -->
7
- <template>
8
- <div class="apt" :class="{ 'apt--root': isRoot }">
9
- <!-- 根级别:非复合值(如 payload 就是字符串)直接作为单个叶子展示 -->
10
- <div v-if="!isComplex(value)" class="apt__leaf apt__leaf--root">
11
- <span class="apt__caret apt__caret--leaf">▶</span>
12
- <span v-if="rootKeyLabel !== null" class="jt__key">{{ rootKeyLabel }}</span>
13
- <span v-if="rootKeyLabel !== null" class="jt__colon">:</span>
14
- <span class="jt__val" :class="'jt__val--' + typeOf(value)">{{ format(value) }}</span>
15
- </div>
16
-
17
- <template v-else>
18
- <!-- 日志场景(rootCollapsed):根对象/数组先收成一行摘要、点击展开(Chrome 控制台风格),
19
- 避免每个实参默认逐键占行稀释日志密度;接口调用面板不传该 prop,行为不变 -->
20
- <div
21
- v-if="rootCollapsed && isRoot"
22
- class="apt__branch apt__branch--root"
23
- @click="rootOpen = !rootOpen"
24
- >
25
- <span class="apt__caret" :class="{ 'apt__caret--open': rootOpen }">▶</span>
26
- <span class="jt__bracket">{{ isArrayRoot ? '[' : '{' }}</span>
27
- <span v-if="!rootOpen" class="jt__preview">{{ preview(value) }}</span>
28
- <template v-else>
29
- <span class="jt__count">{{ rootCount }} {{ isArrayRoot ? '项' : '键' }}</span>
30
- </template>
31
- <span v-if="!rootOpen" class="jt__bracket">{{ isArrayRoot ? ']' : '}' }}</span>
32
- </div>
33
- <div
34
- v-show="!(rootCollapsed && isRoot) || rootOpen"
35
- class="apt__list"
36
- :class="{ 'apt__list--nested': rootCollapsed && isRoot && rootOpen }"
37
- >
38
- <div v-for="(entry, i) in entries" :key="i" class="apt__node">
39
- <!-- 复合类型且未超最大深度:可折叠分支 -->
40
- <div v-if="canExpand(entry)" class="apt__branch" @click="toggle(entry)">
41
- <span class="apt__caret" :class="{ 'apt__caret--open': isOpen(entry) }">▶</span>
42
- <span v-if="entry.keyLabel !== null" class="jt__key">{{ entry.keyLabel }}</span>
43
- <span class="jt__bracket">{{ entry.isArray ? '[' : '{' }}</span>
44
- <template v-if="!isOpen(entry)">
45
- <span class="jt__preview">{{ preview(entry.value) }}</span>
46
- <span class="jt__bracket">{{ entry.isArray ? ']' : '}' }}</span>
47
- </template>
48
- </div>
49
- <!-- 复合类型但已达最大深度:不再可展开,仅作摘要叶子 -->
50
- <div v-else-if="isComplex(entry.value)" class="apt__leaf">
51
- <span class="apt__caret apt__caret--leaf">▶</span>
52
- <span v-if="entry.keyLabel !== null" class="jt__key">{{ entry.keyLabel }}</span>
53
- <span v-if="entry.keyLabel !== null" class="jt__colon">:</span>
54
- <span class="jt__val" :class="'jt__val--' + (entry.isArray ? 'array' : 'object')">{{ entry.count }} {{ entry.isArray ? '项' : '键' }}(已折叠)</span>
55
- </div>
56
- <!-- 基础类型:叶子 -->
57
- <div v-else class="apt__leaf">
58
- <span class="apt__caret apt__caret--leaf">▶</span>
59
- <span v-if="entry.keyLabel !== null" class="jt__key">{{ entry.keyLabel }}</span>
60
- <span v-if="entry.keyLabel !== null" class="jt__colon">:</span>
61
- <span class="jt__val" :class="'jt__val--' + entry.type">{{ format(entry.value) }}</span>
62
- </div>
63
-
64
- <!-- 展开后的子层级 -->
65
- <div v-if="isComplex(entry.value) && isOpen(entry)" class="apt__children">
66
- <ApiPayloadTree
67
- :value="entry.value"
68
- :depth="depth + 1"
69
- :path="entry.path"
70
- :open-state="state"
71
- :max-depth="maxDepth"
72
- />
73
- <div class="apt__close">
74
- <span class="jt__bracket">{{ entry.isArray ? ']' : '}' }}</span>
75
- <span class="jt__count">{{ entry.count }} {{ entry.isArray ? '项' : '键' }}</span>
76
- </div>
77
- </div>
78
- </div>
79
- </div>
80
- <div v-if="rootCollapsed && isRoot && rootOpen" class="apt__close">
81
- <span class="jt__bracket">{{ isArrayRoot ? ']' : '}' }}</span>
82
- <span class="jt__count">{{ rootCount }} {{ isArrayRoot ? '项' : '键' }}</span>
83
- </div>
84
- </template>
85
- </div>
86
- </template>
87
-
88
- <script>
89
- import { reactive } from 'vue'
90
-
91
- export default {
92
- name: 'ApiPayloadTree',
93
- props: {
94
- // 当前节点的值(对象 / 数组 / 基础类型均可)
95
- value: { default: () => ({}) },
96
- // 当前层级深度(根=0),用于根判断
97
- depth: { type: Number, default: 0 },
98
- // 从根到当前节点的路径(key 数组),用作折叠状态的唯一 key
99
- path: { type: Array, default: () => [] },
100
- // 跨整棵树共享的折叠状态对象:{ '<path>': bool }
101
- openState: { type: Object, default: null },
102
- // 仅当根级别 value 为基元类型且需要展示 key 时传入(如顶层字符串)
103
- rootKeyLabel: { type: [String, Number, null], default: null },
104
- // 最大可展开深度(保护):达到该深度的复合节点不再可展开,
105
- // 避免日志中循环引用 / 超深结构在展开时无限递归。默认 100(接口调用场景基本无感)。
106
- maxDepth: { type: Number, default: 100 },
107
- // 根节点默认折叠成一行摘要(事件日志使用);接口调用面板保持逐行铺开
108
- rootCollapsed: { type: Boolean, default: false },
109
- },
110
- data() {
111
- return {
112
- // 若未传入共享状态(理论只发生在根),自行创建,保证递归子组件拿到同一引用
113
- localOpenState: this.openState || reactive({}),
114
- // 根摘要行的展开态(仅 rootCollapsed 场景使用)
115
- rootOpen: false,
116
- }
117
- },
118
- computed: {
119
- isRoot() {
120
- return this.depth === 0
121
- },
122
- isArrayRoot() {
123
- return Array.isArray(this.value)
124
- },
125
- rootCount() {
126
- return this.isArrayRoot ? this.value.length : Object.keys(this.value || {}).length
127
- },
128
- state() {
129
- return this.openState || this.localOpenState
130
- },
131
- entries() {
132
- const d = this.value
133
- if (Array.isArray(d)) {
134
- return d.map((v, i) => this.makeEntry(String(i), v, true, i))
135
- }
136
- if (d && typeof d === 'object') {
137
- return Object.keys(d).map((k) => this.makeEntry(k, d[k], false, k))
138
- }
139
- return []
140
- },
141
- },
142
- methods: {
143
- typeOf(v) {
144
- if (v === null) return 'null'
145
- if (Array.isArray(v)) return 'array'
146
- return typeof v
147
- },
148
- isComplex(v) {
149
- return v !== null && typeof v === 'object'
150
- },
151
- makeEntry(keyLabel, value, isArrayBranch, rawKey) {
152
- const isArr = Array.isArray(value)
153
- const count = isArr
154
- ? value.length
155
- : value && typeof value === 'object'
156
- ? Object.keys(value).length
157
- : 0
158
- return {
159
- keyLabel,
160
- value,
161
- isArray: isArr,
162
- count,
163
- type: this.typeOf(value),
164
- path: [...this.path, rawKey],
165
- }
166
- },
167
- pathKey(entry) {
168
- return entry.path.join('/')
169
- },
170
- isOpen(entry) {
171
- // 必须直接以 st[k] 读取:Vue 3 的 reactive get 陷阱对「不存在的 key」同样会 track,
172
- // 而 hasOwnProperty 走 getOwnPropertyDescriptor(Vue 未代理)不会 track——
173
- // 若先用 hasOwnProperty 短路返回,首次点击写入新 key 时无人订阅,视图不会重渲染(点了没反应)。
174
- const v = this.state[this.pathKey(entry)]
175
- // 默认全部折叠,由用户逐层点开
176
- return v === undefined ? false : v
177
- },
178
- /** 当前节点是否可展开:复合类型且未超过最大深度(保护循环引用 / 超深结构) */
179
- canExpand(entry) {
180
- return this.isComplex(entry.value) && this.depth < this.maxDepth
181
- },
182
- toggle(entry) {
183
- const k = this.pathKey(entry)
184
- this.state[k] = !this.isOpen(entry)
185
- },
186
- preview(val) {
187
- if (Array.isArray(val)) return ' … ' + val.length + ' 项'
188
- const keys = Object.keys(val)
189
- const head = keys.slice(0, 3).join(', ')
190
- return ' … ' + head + (keys.length > 3 ? ', …' : '') + ' '
191
- },
192
- format(v) {
193
- if (v === null) return 'null'
194
- if (typeof v === 'string') return v // DevTools 风格:字符串不带引号
195
- if (typeof v === 'number') return String(v)
196
- if (typeof v === 'boolean') return String(v)
197
- return JSON.stringify(v)
198
- },
199
- },
200
- }
201
- </script>
@@ -1,37 +0,0 @@
1
- <!--
2
- App 级弱提示(toast):顶栏异步操作(远端保存 / 同步)完成后的反馈。
3
- 固定悬浮在 App 外壳顶部居中,不随手机预览框定位(区别于设备框内的 showToast)。
4
- 通过 runtime/app-toast.js 的 appToast 响应式单例读取,2.4s 自动消失。
5
- -->
6
- <template>
7
- <transition name="apptoast-fade">
8
- <div
9
- v-if="toast.visible"
10
- class="apptoast"
11
- :class="'apptoast--' + toast.type"
12
- role="status"
13
- aria-live="polite"
14
- >
15
- <span class="apptoast__icon">
16
- <svg class="apptoast__icon-svg" viewBox="0 0 24 24" aria-hidden="true">
17
- <path v-if="toast.type === 'ok'" d="M5 13l4 4L19 7" />
18
- <path v-else d="M6 6l12 12M18 6L6 18" />
19
- </svg>
20
- </span>
21
- <span class="apptoast__msg">{{ toast.message }}</span>
22
- </div>
23
- </transition>
24
- </template>
25
-
26
- <script>
27
- import { appToast } from '@/runtime/app-toast.js'
28
-
29
- export default {
30
- name: 'AppToast',
31
- computed: {
32
- toast() {
33
- return appToast
34
- },
35
- },
36
- }
37
- </script>
@@ -1,291 +0,0 @@
1
- <!--
2
- 卡片网格预览弹窗:点击顶栏「网格预览」图标按钮打开。
3
- 展示本地全部卡片(GET /__cards 的 cardList)的缩略图墙,每格含:
4
- - 预览图:复用本地静态服务 /__card-image/<id>,读取卡片目录下的同名预览图
5
- (src/cards/<id>/<id>.png),不触发实时无头截图
6
- - 标题:card.name
7
- - 卡 id:card.id
8
- 缩略图按可见性懒加载(IntersectionObserver),避免一次打开对 70+ 张图同时发起请求。
9
- 点击任一张 → emit select(id)(父级 onSelect 载入工作台并持久化)+ close 关闭弹窗。
10
- 搜索框按 id / 名称过滤;Esc 或点遮罩关闭;当前选中卡高亮。
11
- 每格右下角常驻删除钮(仅图标、hover / 键盘聚焦显现):点击弹警告确认,
12
- 确认后 emit delete(id) 交父级调 DELETE /__card/<id> 删除本地卡片文件夹。
13
- -->
14
- <template>
15
- <transition name="modal">
16
- <div v-if="visible" class="cg-mask" @click.self="close">
17
- <div class="cg-modal modal-card" role="dialog" aria-modal="true" aria-label="卡片网格预览">
18
- <header class="cg-modal__head">
19
- <div class="cg-modal__title">
20
- <svg class="app__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#icon-grid" /></svg>
21
- <span>卡片网格预览</span>
22
- <span class="cg-modal__count">{{ cards.length }} 张本地卡片</span>
23
- </div>
24
- <div class="cg-modal__search">
25
- <svg class="cg-modal__search-icon" viewBox="0 0 16 16" width="13" height="13" aria-hidden="true"><use href="#icon-search" /></svg>
26
- <input
27
- ref="search"
28
- v-model="query"
29
- class="cg-modal__input"
30
- type="text"
31
- placeholder="搜索卡片 ID / 名称…"
32
- />
33
- </div>
34
- <button
35
- class="cg-modal__sort"
36
- :class="{ 'cg-modal__sort--active': sortByTime }"
37
- type="button"
38
- :title="sortByTime ? '已按修改时间排序(新→旧),点击取消' : '按修改时间排序(新→旧)'"
39
- :aria-pressed="sortByTime"
40
- @click="toggleSort"
41
- >按修改时间排序</button>
42
- <button class="cg-modal__close" type="button" title="关闭" @click="close" aria-label="关闭">
43
- <svg class="app__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="6" y1="6" x2="18" y2="18" /><line x1="18" y1="6" x2="6" y2="18" /></svg>
44
- </button>
45
- </header>
46
-
47
- <div ref="grid" class="cg-grid">
48
- <button
49
- v-for="card in filtered"
50
- :key="card.id"
51
- :data-id="card.id"
52
- type="button"
53
- class="cg-tile"
54
- :class="{
55
- 'cg-tile--active': card.id === selectedId,
56
- 'cg-tile--failed': failed.has(card.id),
57
- }"
58
- @click="choose(card)"
59
- >
60
- <div class="cg-tile__thumb">
61
- <!-- 导入标记:仅含 .import-meta.json 侧车的卡(经远端同步导入)显示,悬浮于缩略图右上角 -->
62
- <span v-if="card.imported" class="cg-tile__tag" title="导入卡片(含 .import-meta.json 来源信息)">导入</span>
63
- <img
64
- v-if="visibleIds.has(card.id) && !failed.has(card.id)"
65
- class="cg-tile__img"
66
- :src="thumbUrl(card.id)"
67
- :alt="card.name"
68
- loading="lazy"
69
- @error="onImgError(card.id)"
70
- />
71
- <div v-else-if="!visibleIds.has(card.id)" class="cg-tile__skeleton">预览加载中…</div>
72
- <!-- 无封面(空白新卡无位图、且空白卡跳过无头截图直接 404):
73
- 回退工程统一占位图(与 Image 组件兜底图同源),浅色底与缩略图区调性一致 -->
74
- <img v-else class="cg-tile__img cg-tile__img--placeholder" :src="placeholderUrl" :alt="`暂无封面:${card.name}`" />
75
- </div>
76
- <div class="cg-tile__meta">
77
- <span class="cg-tile__name" :title="card.name">{{ card.name }}</span>
78
- <span class="cg-tile__id" :title="card.id">{{ card.id }}</span>
79
- </div>
80
- <!-- 删除钮:仅图标不带文字,悬浮于格子右下角。格子本身是 button,
81
- 这里用 span + role=button 避免 button 套 button 的非法结构;
82
- click.stop 阻止冒泡到格子的「选中载入」。 -->
83
- <span
84
- class="cg-tile__del"
85
- role="button"
86
- tabindex="0"
87
- :title="`删除本地卡片 ${card.id}`"
88
- :aria-label="`删除本地卡片 ${card.id}`"
89
- @click.stop="askDelete(card)"
90
- @keydown.enter.stop.prevent="askDelete(card)"
91
- @keydown.space.stop.prevent="askDelete(card)"
92
- >
93
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><use href="#icon-trash" /></svg>
94
- </span>
95
- </button>
96
- <p v-if="!filtered.length" class="cg-empty">无匹配卡片</p>
97
- </div>
98
- </div>
99
- <!-- 删除确认:警告级(橙黄 + 三角图标);删除本地目录不可逆,文案明示影响范围 -->
100
- <ConfirmDialog
101
- :visible="pendingDelete != null"
102
- title="删除卡片"
103
- :message="pendingDelete ? `将删除本地卡片目录 src/cards/${pendingDelete.id}/(schema / 切图 / 预览图一并删除),不可恢复。确定删除「${pendingDelete.name}」吗?` : ''"
104
- confirm-text="删除"
105
- severity="warn"
106
- @confirm="confirmDelete"
107
- @cancel="pendingDelete = null"
108
- />
109
- </div>
110
- </transition>
111
- </template>
112
-
113
- <script>
114
- import { resolveApiBase } from '@/api.js'
115
- import { DEFAULT_IMAGE_URL } from '@/runtime/assets.js'
116
- import ConfirmDialog from './ConfirmDialog.vue'
117
-
118
- export default {
119
- name: 'CardGallery',
120
- components: { ConfirmDialog },
121
- props: {
122
- /** 是否显示弹窗 */
123
- visible: { type: Boolean, default: false },
124
- /** 卡片列表(与顶栏 csel-combo 同源:GET /__cards 的 cardList) */
125
- cards: { type: Array, default: () => [] },
126
- /** 当前选中卡片 id,用于高亮 */
127
- selectedId: { type: String, default: '' },
128
- },
129
- emits: ['select', 'close', 'delete'],
130
- data() {
131
- return {
132
- query: '',
133
- // 排序开关:false=按名称(默认),true=按修改时间新→旧;初始值从 localStorage 读取
134
- sortByTime: this.loadSortByTime(),
135
- // 已滚动进入视口、应当发起缩略图请求的卡片 id 集合(IntersectionObserver 填充)
136
- visibleIds: new Set(),
137
- // 缩略图加载失败的卡片 id 集合(回退占位)
138
- failed: new Set(),
139
- observer: null,
140
- // 截图端点 base(弹窗打开时按当前 apiBase 解析一次)
141
- base: '',
142
- // 待删除确认的卡片(null = 无确认中);确认后才 emit delete 交父级真删
143
- pendingDelete: null,
144
- // 无封面占位图(工程统一兜底图,Vite 统一套 base)
145
- placeholderUrl: DEFAULT_IMAGE_URL,
146
- }
147
- },
148
- created() {
149
- // 仅确保 data 阶段读取的持久化值已落盘(无记录时建立基线)
150
- this.saveSortByTime()
151
- },
152
- computed: {
153
- filtered() {
154
- const q = this.query.trim().toLowerCase()
155
- let arr = this.cards
156
- if (q) {
157
- arr = arr.filter(
158
- (c) =>
159
- c.id.toLowerCase().includes(q) ||
160
- String(c.name || '').toLowerCase().includes(q)
161
- )
162
- }
163
- // 排序:时间模式按修改时间新→旧;否则按名称(默认)
164
- const sorted = this.sortByTime
165
- ? arr.slice().sort((a, b) => (b.mtime || 0) - (a.mtime || 0))
166
- : arr.slice().sort((a, b) => String(a.name || '').localeCompare(String(b.name || '')))
167
- return sorted
168
- },
169
- },
170
- watch: {
171
- visible(v) {
172
- if (v) {
173
- this.query = ''
174
- this.failed = new Set()
175
- this.$nextTick(() => {
176
- this.setupObserver()
177
- this.focusSearch()
178
- })
179
- window.addEventListener('keydown', this.onKey)
180
- } else {
181
- this.teardownObserver()
182
- window.removeEventListener('keydown', this.onKey)
183
- }
184
- },
185
- // 搜索过滤改变列表 DOM → 重新观察新出现的卡片格子,保证懒加载继续生效
186
- query() {
187
- if (this.visible) this.$nextTick(this.setupObserver)
188
- },
189
- // 切换排序方式时立即持久化,避免每次刷新都要手动再点一次
190
- sortByTime(v) {
191
- this.saveSortByTime()
192
- },
193
- },
194
- beforeUnmount() {
195
- this.teardownObserver()
196
- window.removeEventListener('keydown', this.onKey)
197
- },
198
- methods: {
199
- /** 格子删除钮:进入警告确认(不直接删,避免误触丢目录) */
200
- askDelete(card) {
201
- this.pendingDelete = card
202
- },
203
- /** 确认删除:清掉本格懒加载 / 失败标记后上抛父级(父级调接口 + 刷列表 + 兜底换卡) */
204
- confirmDelete() {
205
- const card = this.pendingDelete
206
- this.pendingDelete = null
207
- if (!card) return
208
- this.visibleIds.delete(card.id)
209
- this.failed.delete(card.id)
210
- this.$emit('delete', card.id)
211
- },
212
- /** 缩略图地址:复用本地静态服务 /__card-image/<id>,直接读取卡片目录下的同名预览图
213
- * (src/cards/<id>/<id>.png),不触发实时无头截图。 */
214
- thumbUrl(id) {
215
- const base = this.base || resolveApiBase() || ''
216
- return base + '/__card-image/' + encodeURIComponent(id)
217
- },
218
- /** 建立滚动容器内缩略图懒加载观察器:仅对进入视口(含 200px 预载边距)的格子发起截图请求。 */
219
- setupObserver() {
220
- this.base = resolveApiBase() || ''
221
- const grid = this.$refs.grid
222
- if (!grid) return
223
- this.teardownObserver()
224
- this.observer = new IntersectionObserver(
225
- (entries) => {
226
- for (const e of entries) {
227
- if (!e.isIntersecting) continue
228
- const id = e.target.getAttribute('data-id')
229
- if (id && !this.visibleIds.has(id)) {
230
- const next = new Set(this.visibleIds)
231
- next.add(id)
232
- this.visibleIds = next
233
- }
234
- this.observer.unobserve(e.target)
235
- }
236
- },
237
- { root: grid, rootMargin: '200px' }
238
- )
239
- grid.querySelectorAll('.cg-tile').forEach((el) => this.observer.observe(el))
240
- },
241
- teardownObserver() {
242
- if (this.observer) {
243
- this.observer.disconnect()
244
- this.observer = null
245
- }
246
- },
247
- onImgError(id) {
248
- const next = new Set(this.failed)
249
- next.add(id)
250
- this.failed = next
251
- },
252
- /** 读取持久化的排序方式(localStorage)。无记录或损坏时回退默认 false。 */
253
- loadSortByTime() {
254
- try {
255
- return localStorage.getItem('cardbuddy:cardgallery-sort-by-time') === '1'
256
- } catch (e) {
257
- return false
258
- }
259
- },
260
- /** 持久化排序方式到 localStorage:'1'=按修改时间,'0'=按名称。 */
261
- saveSortByTime() {
262
- try {
263
- localStorage.setItem(
264
- 'cardbuddy:cardgallery-sort-by-time',
265
- this.sortByTime ? '1' : '0'
266
- )
267
- } catch (e) {
268
- /* localStorage 不可用时忽略 */
269
- }
270
- },
271
- /** 切换「按修改时间排序」:激活时列表新→旧;再次点击取消,回到按名称默认排序。 */
272
- toggleSort() {
273
- this.sortByTime = !this.sortByTime
274
- },
275
- onKey(e) {
276
- if (e.key === 'Escape') this.close()
277
- },
278
- focusSearch() {
279
- if (this.$refs.search) this.$refs.search.focus()
280
- },
281
- choose(card) {
282
- if (!card) return
283
- this.$emit('select', card.id)
284
- this.close()
285
- },
286
- close() {
287
- this.$emit('close')
288
- },
289
- },
290
- }
291
- </script>
@@ -1,72 +0,0 @@
1
- <!--
2
- 自包含卡片预览组件(供独立截图/视觉比对复用,无需编辑器和 dev server)。
3
-
4
- 与编辑器 App.vue 共用同一套渲染内核(RenderTree / Adapter / createCardRuntime /
5
- buildPreview),但只保留「卡片本身」:
6
- - provide 下发的 adapter/cardRuntime/customComponents 与编辑器预览一致;
7
- - 挂载 [data-card-ready] 供无头浏览器等待首帧落定;
8
- - adapter 使用 apiBase:'',让 /slices 等站内资源保持同源相对路径,
9
- 不依赖 8787 本地开发服务。
10
- -->
11
- <template>
12
- <div class="card-preview">
13
- <div
14
- class="phone__screen phone__screen--bg-white"
15
- :style="screenStyle"
16
- :data-card-ready="ready ? '1' : null"
17
- >
18
- <RenderTree
19
- v-if="preview"
20
- :node="preview.view"
21
- :scope="runtime.state"
22
- />
23
- </div>
24
- </div>
25
- </template>
26
-
27
- <script>
28
- import RenderTree from './RenderTree.vue'
29
- import Adapter from '../runtime/adapter.js'
30
- import { createCardRuntime } from '../runtime/card-runtime.js'
31
- import { buildPreview } from '../runtime/toPreview.js'
32
- import { installJsApiMock } from '../runtime/jsapi-mock.js'
33
-
34
- export default {
35
- name: 'CardPreview',
36
- components: { RenderTree },
37
- props: {
38
- schema: { type: Object, required: true },
39
- data: { type: Object, default: () => ({}) },
40
- width: { type: [String, Number], default: 375 },
41
- },
42
- provide() {
43
- return {
44
- adapter: this.adapter,
45
- cardRuntime: this.runtime,
46
- customComponents: {},
47
- }
48
- },
49
- data() {
50
- const adapter = new Adapter({ apiBase: '' })
51
- const runtime = createCardRuntime(this.data || {}, adapter)
52
- installJsApiMock(runtime)
53
- return {
54
- adapter,
55
- runtime,
56
- preview: buildPreview(this.schema),
57
- ready: false,
58
- }
59
- },
60
- computed: {
61
- screenStyle() {
62
- const width = Number(this.width) || (this.preview && this.preview.view && this.preview.view.width) || 375
63
- return { width: width + 'px' }
64
- },
65
- },
66
- mounted() {
67
- this.$nextTick(() => {
68
- this.ready = true
69
- })
70
- },
71
- }
72
- </script>