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,38 +0,0 @@
1
- <!-- 通用开关组件(受控)。
2
- 视觉对齐 App.vue 内的 .theme-toggle 范式,配色严格遵循
3
- 《深浅主题配色规范手册》§4.5 Switch:
4
- - 关闭:中性灰(复用 --bg-input / --border-strong / --text-faint)
5
- - 开启:主色实心(--accent)+ 滑块用主色上的文字(--on-accent)
6
- 双主题仅切换同名 Token 取值,组件不写颜色分支、禁止硬编码十六进制。 -->
7
- <template>
8
- <button
9
- type="button"
10
- class="switch"
11
- :class="{ 'switch--on': modelValue, 'switch--disabled': disabled }"
12
- role="switch"
13
- :aria-checked="String(modelValue)"
14
- :disabled="disabled"
15
- @click="onClick"
16
- >
17
- <span class="switch__track">
18
- <span class="switch__thumb"></span>
19
- </span>
20
- </button>
21
- </template>
22
-
23
- <script>
24
- export default {
25
- name: 'Switch',
26
- props: {
27
- modelValue: { type: Boolean, default: false },
28
- disabled: { type: Boolean, default: false },
29
- },
30
- emits: ['update:modelValue'],
31
- methods: {
32
- onClick() {
33
- if (this.disabled) return
34
- this.$emit('update:modelValue', !this.modelValue)
35
- },
36
- },
37
- }
38
- </script>
@@ -1,64 +0,0 @@
1
- <!--
2
- 背景图位置设置器:对应编辑器 style/BackgroundPositionStyle。
3
- 左侧九宫格给常用位置,右侧两个带单位数值给自定义 X / Y(DSL 值形如 "50% 50%")。
4
- -->
5
- <template>
6
- <div class="st-bgpos">
7
- <SetGrid9 kind="BackgroundPositionStyle" :value="value" :disabled="disabled" @input="pickGrid" @change="$emit('change')" />
8
- <div class="st-bgpos__xy">
9
- <SetNumberStyle :value="x" :options="numOptions('X')" :disabled="disabled" @input="setX" @change="emitOut" />
10
- <SetNumberStyle :value="y" :options="numOptions('Y')" :disabled="disabled" @input="setY" @change="emitOut" />
11
- </div>
12
- </div>
13
- </template>
14
-
15
- <script>
16
- import { setterProps, setterEmits } from './props.js'
17
- import SetGrid9 from './SetGrid9.vue'
18
- import SetNumberStyle from './SetNumberStyle.vue'
19
-
20
- const UNITS = [
21
- { key: 'number', value: 'px' },
22
- { key: 'percent', value: '%' },
23
- ]
24
-
25
- export default {
26
- name: 'SetBgPosition',
27
- components: { SetGrid9, SetNumberStyle },
28
- props: setterProps,
29
- emits: setterEmits,
30
- data() {
31
- return { x: '', y: '' }
32
- },
33
- watch: {
34
- value: { immediate: true, handler() { this.parse() } },
35
- },
36
- methods: {
37
- parse() {
38
- const parts = String(this.value || '').split(/\s+/)
39
- this.x = parts[0] || ''
40
- this.y = parts[1] || ''
41
- },
42
- numOptions(placeholder) {
43
- return { placeholder, iTypeList: UNITS }
44
- },
45
- pickGrid(v) {
46
- this.$emit('input', v)
47
- },
48
- setX(v) {
49
- this.x = v
50
- this.emitValue()
51
- },
52
- setY(v) {
53
- this.y = v
54
- this.emitValue()
55
- },
56
- emitValue() {
57
- this.$emit('input', `${this.x || '0'} ${this.y || '0'}`)
58
- },
59
- emitOut() {
60
- this.$emit('change')
61
- },
62
- },
63
- }
64
- </script>
@@ -1,90 +0,0 @@
1
- <!--
2
- 背景图大小设置器:对应编辑器 style/BackgroundSizeStyle。
3
- 下拉给 cover / contain,选「自定义」时展开宽高两个带单位数值(DSL 值形如 "auto auto")。
4
- -->
5
- <template>
6
- <div class="st-bgsize">
7
- <Dropdown
8
- :value="preset"
9
- :options="bgOptions"
10
- size="sm"
11
- block
12
- :disabled="disabled"
13
- @input="pickPreset($event)"
14
- />
15
- <div v-if="!preset" class="st-bgsize__xy">
16
- <SetNumberStyle :value="x" :options="{ placeholder: '宽' }" :disabled="disabled" @input="setX" @change="emitOut" />
17
- <SetNumberStyle :value="y" :options="{ placeholder: '高' }" :disabled="disabled" @input="setY" @change="emitOut" />
18
- </div>
19
- </div>
20
- </template>
21
-
22
- <script>
23
- import { setterProps, setterEmits } from './props.js'
24
- import SetNumberStyle from './SetNumberStyle.vue'
25
- import Dropdown from '../Dropdown.vue'
26
-
27
- const TYPES = [
28
- { key: 'cover', desc: 'cover:保持纵横比,缩放到完全覆盖背景定位区域的最小尺寸' },
29
- { key: 'contain', desc: 'contain:保持纵横比,缩放到能放进背景定位区域的最大尺寸' },
30
- ]
31
-
32
- export default {
33
- name: 'SetBgSize',
34
- components: { SetNumberStyle, Dropdown },
35
- computed: {
36
- bgOptions() {
37
- return [{ key: '', value: '自定义' }].concat(
38
- this.TYPES.map((t) => ({ key: t.key, value: t.key }))
39
- )
40
- },
41
- },
42
- props: setterProps,
43
- emits: setterEmits,
44
- data() {
45
- return { TYPES, preset: '', x: '', y: '' }
46
- },
47
- watch: {
48
- value: { immediate: true, handler() { this.parse() } },
49
- },
50
- methods: {
51
- parse() {
52
- const v = String(this.value || '')
53
- const keys = TYPES.map((t) => t.key)
54
- this.preset = keys.includes(v) ? v : ''
55
- const parts = v.split(/\s+/)
56
- if (parts.length >= 2) {
57
- this.x = parts[0] || ''
58
- this.y = parts[1] || ''
59
- } else {
60
- this.x = ''
61
- this.y = ''
62
- }
63
- },
64
- pickPreset(v) {
65
- this.preset = v
66
- if (!v) {
67
- this.x = 'auto'
68
- this.y = 'auto'
69
- }
70
- this.emitValue()
71
- this.$emit('change')
72
- },
73
- setX(v) {
74
- this.x = v
75
- this.emitValue()
76
- },
77
- setY(v) {
78
- this.y = v
79
- this.emitValue()
80
- },
81
- emitValue() {
82
- const out = this.preset ? this.preset : `${this.x || 'auto'} ${this.y || 'auto'}`
83
- this.$emit('input', out)
84
- },
85
- emitOut() {
86
- this.$emit('change')
87
- },
88
- },
89
- }
90
- </script>
@@ -1,198 +0,0 @@
1
- <!--
2
- 代码设置器:对应编辑器里 customAction 的脚本编辑框。
3
- itemType === 'Code' 时使用。
4
-
5
- 值形态:itemValue 是**对象** `{ code, compiled? }`(schema 实测形态),
6
- 不是裸字符串。这里只改写 options.codeKey(默认 'code')那一个键,
7
- 其余键(如线上 babel 产物 compiled)原样保留 —— 避免编辑器把不认识的
8
- 字段擦掉造成回传丢数据。
9
-
10
- 编辑器实例由 CodeJar 托管 DOM,因此**不能**用 :value 双向绑定重渲染,
11
- 只在挂载时灌一次初值;外部值变化(切换节点/切换动作类型)通过 key 重建组件。
12
- -->
13
- <template>
14
- <div class="st-code">
15
- <div
16
- ref="editor"
17
- class="st-code__editor"
18
- :class="{ 'is-disabled': disabled, 'is-bridged': !!bridge }"
19
- ></div>
20
- <!-- 右上角语言标签:弱化的只读标识,不参与交互 -->
21
- <span class="st-code__lang" aria-hidden="true">JS</span>
22
- <div class="st-code__foot">
23
- <span class="st-code__hint">{{ lines }} 行 · {{ chars }} 字符</span>
24
- <!-- VSCode 代码桥:生成临时 js 用外部编辑器编辑,保存实时回写;断开即删临时文件 -->
25
- <span class="st-code__foot-actions">
26
- <span v-if="bridge" class="st-code__bridge-tag" :title="bridge.file">VSCode 同步中</span>
27
- <button
28
- type="button"
29
- class="st-code__vscode"
30
- :class="{ 'is-on': !!bridge }"
31
- :title="
32
- bridge
33
- ? '断开 VSCode 桥接并删除临时文件'
34
- : '在 VSCode 中编辑:保存实时同步回编辑区,断开后清除临时文件'
35
- "
36
- :disabled="disabled"
37
- @click="toggleBridge"
38
- >
39
- <!-- 图标左侧小字:未桥接时是动作说明;桥接后由状态徽标接替,避免两段文字挤一行 -->
40
- <span v-if="!bridge" class="st-code__vscode-label">在编辑器中打开</span>
41
- <svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true">
42
- <path
43
- fill="currentColor"
44
- d="M23.15 2.587 18.21.21a1.494 1.494 0 0 0-1.705.29l-9.46 8.63-4.12-3.128a.999.999 0 0 0-1.276.057L.327 7.261A1 1 0 0 0 .326 8.74L3.899 12 .326 15.26a1 1 0 0 0 .001 1.479L1.65 17.94a.999.999 0 0 0 1.276.057l4.12-3.128 9.46 8.63a1.492 1.492 0 0 0 1.704.29l4.942-2.377A1.5 1.5 0 0 0 24 20.06V3.939a1.5 1.5 0 0 0-.85-1.352zm-5.146 14.861L10.826 12l7.178-5.448v10.896z"
45
- />
46
- </svg>
47
- </button>
48
- </span>
49
- </div>
50
- </div>
51
- </template>
52
-
53
- <script>
54
- import { CodeJar } from 'codejar'
55
- import Prism from 'prismjs'
56
- import 'prismjs/components/prism-javascript'
57
- import { setterProps, setterEmits } from './props.js'
58
- import {
59
- codeBridgeOpen,
60
- codeBridgeFetch,
61
- codeBridgeHeartbeat,
62
- codeBridgeClose,
63
- subscribeCodeBridge,
64
- } from '../../api.js'
65
-
66
- export default {
67
- name: 'SetCode',
68
- props: setterProps,
69
- emits: setterEmits,
70
- data() {
71
- return { code: '', bridge: null }
72
- },
73
- computed: {
74
- codeKey() {
75
- return this.options.codeKey || 'code'
76
- },
77
- lines() {
78
- return this.code ? this.code.split('\n').length : 0
79
- },
80
- chars() {
81
- return this.code.length
82
- },
83
- },
84
- mounted() {
85
- this.code = this.readCode()
86
- this.$nextTick(() => this.initJar())
87
- },
88
- beforeUnmount() {
89
- if (this._t) clearTimeout(this._t)
90
- // 组件卸载(抽屉关闭 / 切节点 / key 重建)即结束桥接会话,服务端删除临时文件
91
- this.teardownBridge(true)
92
- if (this._jar && this._jar.destroy) this._jar.destroy()
93
- },
94
- methods: {
95
- readCode() {
96
- const v = this.value
97
- if (v == null) return ''
98
- if (typeof v === 'string') return v
99
- if (typeof v === 'object') return String(v[this.codeKey] || '')
100
- return String(v)
101
- },
102
- initJar() {
103
- const el = this.$refs.editor
104
- if (!el) return
105
- const highlight = (editor) => {
106
- editor.innerHTML = Prism.highlight(editor.textContent, Prism.languages.javascript, 'javascript')
107
- }
108
- this._jar = CodeJar(el, highlight, {
109
- tab: ' ',
110
- indentOn: /[({[]$/,
111
- addClosing: true,
112
- history: true,
113
- })
114
- this._jar.updateCode(this.code)
115
- this._jar.onUpdate((code) => this.onCode(code))
116
- },
117
- onCode(code) {
118
- if (this.disabled || this.bridge) return
119
- this.code = code
120
- // 保留 compiled 等未知键,只覆写 codeKey
121
- const base = this.value && typeof this.value === 'object' ? Object.assign({}, this.value) : {}
122
- base[this.codeKey] = code
123
- this.$emit('input', base)
124
- // 代码输入频繁,change(触发重建预览)做防抖
125
- if (this._t) clearTimeout(this._t)
126
- this._t = setTimeout(() => this.$emit('change'), 400)
127
- },
128
- /* ---------------- VSCode 代码桥 ---------------- */
129
- toggleBridge() {
130
- if (this.bridge) this.teardownBridge(true)
131
- else this.setupBridge()
132
- },
133
- async setupBridge() {
134
- if (this.disabled || this.bridge) return
135
- const label = this.itemInfo && this.itemInfo.itemKey ? String(this.itemInfo.itemKey) : ''
136
- try {
137
- const info = await codeBridgeOpen(this.code, label)
138
- this.bridge = { id: info.id, file: info.file }
139
- } catch (e) {
140
- console.error('[VSCode 桥接建立失败]', e)
141
- return
142
- }
143
- // 桥接期间 Web 编辑区只读:外部编辑器为唯一写入源,避免双向冲突
144
- this.setEditorEditable(false)
145
- this._hb = setInterval(() => {
146
- if (!this.bridge) return
147
- codeBridgeHeartbeat(this.bridge.id).catch(() => {})
148
- }, 5000)
149
- this._bridgeUnsub = subscribeCodeBridge((payload) => {
150
- if (!this.bridge || !payload || payload.id !== this.bridge.id) return
151
- // code-bridge-closed 带 reason(ttl / client):服务端已清理,本地同步收 UI
152
- if (payload.reason) return this.teardownBridge(false)
153
- this.pullBridgeCode()
154
- })
155
- },
156
- async pullBridgeCode() {
157
- if (!this.bridge) return
158
- let r
159
- try {
160
- r = await codeBridgeFetch(this.bridge.id)
161
- } catch (e) {
162
- return // 会话已失效:等 closed 事件或 TTL 收尾
163
- }
164
- const code = String(r.code == null ? '' : r.code)
165
- if (code === this.code) return
166
- this.applyExternalCode(code)
167
- },
168
- applyExternalCode(code) {
169
- this.code = code
170
- // callOnUpdate=false:不触发 onUpdate,切断「回写 → input → 再写临时文件」回声环
171
- if (this._jar) this._jar.updateCode(code, false)
172
- const base = this.value && typeof this.value === 'object' ? Object.assign({}, this.value) : {}
173
- base[this.codeKey] = code
174
- this.$emit('input', base)
175
- if (this._t) clearTimeout(this._t)
176
- this._t = setTimeout(() => this.$emit('change'), 400)
177
- },
178
- teardownBridge(notifyServer) {
179
- const b = this.bridge
180
- this.bridge = null
181
- if (this._hb) {
182
- clearInterval(this._hb)
183
- this._hb = null
184
- }
185
- if (this._bridgeUnsub) {
186
- this._bridgeUnsub()
187
- this._bridgeUnsub = null
188
- }
189
- this.setEditorEditable(true)
190
- if (b && notifyServer) codeBridgeClose(b.id).catch(() => {})
191
- },
192
- setEditorEditable(on) {
193
- const el = this.$refs.editor
194
- if (el) el.setAttribute('contenteditable', on ? 'true' : 'false')
195
- },
196
- },
197
- }
198
- </script>
@@ -1,244 +0,0 @@
1
- <!--
2
- 颜色设置器:对应编辑器 common/Color。
3
-
4
- 使用第三方开源颜色选择器 @ckpack/vue-color 的 Sketch 控件(原生 <input type="color">
5
- 不支持 alpha,且交互简陋)。支持 rgba / hex / 空串;选择器以弹层形式挂载到 body,
6
- 避免被面板滚动容器裁切。色块预览使用棋盘格背景以展示透明效果。
7
- 重置按钮用「循环箭头」图标(语义更贴切),替代原来的 × 字符。
8
- -->
9
- <template>
10
- <div class="st-color">
11
- <!-- 色块预览 + 文本输入 + 重置(顶行) -->
12
- <div class="st-color__top" ref="top">
13
- <button
14
- ref="swatch"
15
- class="st-color__swatch"
16
- type="button"
17
- :title="text || '未设置'"
18
- :disabled="disabled"
19
- @click="togglePop"
20
- >
21
- <span class="st-color__checker" />
22
- <span class="st-color__fill" :style="{ background: displayColor || 'transparent' }" />
23
- </button>
24
-
25
- <input
26
- class="ni-input st-color__text"
27
- type="text"
28
- placeholder="如 #333333 / rgba(0,0,0,.5)"
29
- :disabled="disabled"
30
- :value="text"
31
- @input="onTextInput($event.target.value)"
32
- @change="$emit('change')"
33
- />
34
-
35
- <button
36
- class="st-color__clear"
37
- type="button"
38
- title="重置(清空颜色)"
39
- :disabled="disabled"
40
- @click="clear"
41
- >
42
- <svg viewBox="0 0 16 16" class="st-ic" aria-hidden="true"><use href="#icon-reset" /></svg>
43
- </button>
44
- </div>
45
-
46
- <!-- 透明度滑块(仅当颜色值非空时显示),作为快捷调节 -->
47
- <div v-if="text" class="st-color__alpha-row">
48
- <span class="st-color__alpha-label">透明度</span>
49
- <input
50
- class="st-color__alpha-slider"
51
- type="range"
52
- min="0"
53
- max="100"
54
- :disabled="disabled"
55
- :value="Math.round(alpha * 100)"
56
- @input="onAlphaChange($event.target.value)"
57
- @change="$emit('change')"
58
- />
59
- <span class="st-color__alpha-val">{{ Math.round(alpha * 100) }}%</span>
60
- </div>
61
-
62
- <!-- 第三方颜色选择器弹层(挂载到 body,避免被滚动容器裁切) -->
63
- <Teleport to="body">
64
- <div
65
- v-if="popOpen"
66
- ref="pop"
67
- class="st-color__pop"
68
- :style="popStyle"
69
- @mousedown.stop
70
- >
71
- <Sketch
72
- :model-value="pickerValue"
73
- :disable-alpha="false"
74
- @update:model-value="onPicker"
75
- />
76
- </div>
77
- </Teleport>
78
- </div>
79
- </template>
80
-
81
- <script>
82
- import { setterProps, setterEmits } from './props.js'
83
- import { Sketch } from '@ckpack/vue-color'
84
-
85
- /** 解析任意 CSS 颜色为 { r, g, b, a },解析失败返回 null */
86
- function parseColor(v) {
87
- const s = String(v || '').trim()
88
- if (!s) return null
89
- // #RRGGBB
90
- let m = s.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)
91
- if (m) return { r: parseInt(m[1], 16), g: parseInt(m[2], 16), b: parseInt(m[3], 16), a: 1 }
92
- // #RGB
93
- m = s.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i)
94
- if (m) {
95
- const p = (c) => parseInt(c + c, 16)
96
- return { r: p(m[1]), g: p(m[2]), b: p(m[3]), a: 1 }
97
- }
98
- // #RRGGBBAA
99
- m = s.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)
100
- if (m) return { r: parseInt(m[1], 16), g: parseInt(m[2], 16), b: parseInt(m[3], 16), a: parseInt(m[4], 16) / 255 }
101
- // rgb() / rgba()
102
- m = s.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)(?:\s*,\s*([\d.]+))?\s*\)$/i)
103
- if (m) {
104
- const a = m[4] !== undefined ? parseFloat(m[4]) : 1
105
- return { r: Math.round(parseFloat(m[1])), g: Math.round(parseFloat(m[2])), b: Math.round(parseFloat(m[3])), a }
106
- }
107
- return null
108
- }
109
-
110
- /** {r,g,b,a} → #rrggbb */
111
- function toHex(c) {
112
- if (!c) return '#000000'
113
- const p = (n) => Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0')
114
- return '#' + p(c.r) + p(c.g) + p(c.b)
115
- }
116
-
117
- /** {r,g,b,a} → rgba() 字符串 */
118
- function toRgba(c) {
119
- if (!c) return ''
120
- if (c.a >= 1) return toHex(c)
121
- return `rgba(${Math.round(c.r)}, ${Math.round(c.g)}, ${Math.round(c.b)}, ${+c.a.toFixed(2)})`
122
- }
123
-
124
- export default {
125
- name: 'SetColor',
126
- components: { Sketch },
127
- props: setterProps,
128
- emits: setterEmits,
129
- data() {
130
- return {
131
- _rgb: null, // 缓存解析后的 {r,g,b,a},供滑块编辑时用
132
- popOpen: false,
133
- popW: 240,
134
- popStyle: { position: 'fixed', left: '0px', top: '0px' },
135
- }
136
- },
137
- computed: {
138
- text() {
139
- return this.value === undefined || this.value === null ? '' : String(this.value)
140
- },
141
- parsed() {
142
- return parseColor(this.text) || { r: 0, g: 0, b: 0, a: 1 }
143
- },
144
- /** 传给 Sketch 的初始颜色(空值时给黑色作为起点) */
145
- pickerValue() {
146
- return this.text || '#000000'
147
- },
148
- /** 当前透明度 0~1 */
149
- alpha() {
150
- return this.parsed.a
151
- },
152
- /** 用于色块预览的完整颜色值(含 alpha) */
153
- displayColor() {
154
- return toRgba(this.parsed)
155
- },
156
- },
157
- watch: {
158
- text() {
159
- this._rgb = parseColor(this.text)
160
- },
161
- },
162
- beforeUnmount() {
163
- this.removeDocListener()
164
- },
165
- methods: {
166
- onTextInput(v) {
167
- this._rgb = parseColor(v)
168
- this.$emit('input', v)
169
- },
170
- onAlphaChange(pct) {
171
- const a = Math.max(0, Math.min(1, parseInt(pct, 10) / 100))
172
- const base = this._rgb || this.parsed
173
- const c = { ...base, a }
174
- this._rgb = c
175
- this.$emit('input', toRgba(c))
176
- this.$emit('change')
177
- },
178
- /** 第三方选择器回调:payload 含 hex / rgba([r,g,b,a]) / a */
179
- onPicker(c) {
180
- const rgba = c && c.rgba
181
- let r, g, b, a
182
- if (Array.isArray(rgba)) {
183
- ;[r, g, b, a] = rgba
184
- } else if (rgba) {
185
- r = rgba.r; g = rgba.g; b = rgba.b; a = rgba.a
186
- } else {
187
- const parsed = parseColor(c.hex) || { r: 0, g: 0, b: 0, a: 1 }
188
- r = parsed.r; g = parsed.g; b = parsed.b; a = parsed.a
189
- }
190
- a = a == null ? 1 : a
191
- const hex = c.hex || toHex({ r, g, b, a: 1 })
192
- this._rgb = { r, g, b, a }
193
- this.$emit('input', a >= 1 ? hex : `rgba(${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)}, ${+a.toFixed(2)})`)
194
- this.$emit('change')
195
- },
196
- clear() {
197
- if (this.disabled) return
198
- this._rgb = null
199
- this.closePop()
200
- this.$emit('input', '')
201
- this.$emit('change')
202
- },
203
- togglePop() {
204
- if (this.disabled) return
205
- this.popOpen ? this.closePop() : this.openPop()
206
- },
207
- openPop() {
208
- const el = this.$refs.swatch
209
- if (!el) return
210
- const rect = el.getBoundingClientRect()
211
- const topRect = (this.$refs.top && this.$refs.top.getBoundingClientRect()) || rect
212
- const popW = Math.max(220, Math.min(Math.round(topRect.width), 400))
213
- const popH = 320
214
- const vw = window.innerWidth
215
- const vh = window.innerHeight
216
- let left = topRect.left
217
- let top = rect.bottom + 6
218
- if (left + popW > vw - 8) left = Math.max(8, vw - popW - 8)
219
- if (top + popH > vh - 8) top = Math.max(8, rect.top - popH - 6)
220
- this.popW = popW
221
- this.popStyle = { position: 'fixed', left: left + 'px', top: top + 'px', width: popW + 'px', zIndex: 4000 }
222
- this.popOpen = true
223
- this.$nextTick(() => {
224
- document.addEventListener('mousedown', this.onDocClick, true)
225
- })
226
- },
227
- closePop() {
228
- if (!this.popOpen) return
229
- this.popOpen = false
230
- this.removeDocListener()
231
- },
232
- removeDocListener() {
233
- document.removeEventListener('mousedown', this.onDocClick, true)
234
- },
235
- onDocClick(e) {
236
- const pop = this.$refs.pop
237
- const sw = this.$refs.swatch
238
- if (pop && pop.contains(e.target)) return
239
- if (sw && sw.contains(e.target)) return
240
- this.closePop()
241
- },
242
- },
243
- }
244
- </script>
@@ -1,58 +0,0 @@
1
- <!--
2
- 常用样式设置器:对应编辑器 custom/CustomSelect。
3
-
4
- itemOption.list 每一项是一段「DOM 描述 + sync 映射」:
5
- {type:'div', style:{…}, list:[{type:'span', innerText:'黑色', style:{…}}],
6
- sync:{'style.font.color':'#333333', 'style.font.fontSize':'14', …}}
7
- 点击后编辑器会把 sync 里的点号路径批量写回组件(style.<分组>.<字段>)。
8
- 这里不直接改数据,而是向上抛 `sync` 事件,由 NodeInspector 统一落到 NodeEditModel,
9
- 这样样式的定点写入仍然走 Style.applyChange,不会污染实例树。
10
- -->
11
- <template>
12
- <div class="st-customsel">
13
- <div
14
- v-for="(info, i) in list"
15
- :key="i"
16
- class="st-customsel__item"
17
- :style="normalizeStyle(info.style)"
18
- :title="'应用:' + Object.keys(info.sync || {}).join('、')"
19
- @click="apply(info)"
20
- >
21
- <span v-for="(c, ci) in info.list || []" :key="ci" :style="normalizeStyle(c.style)">{{ c.innerText }}</span>
22
- <span v-if="!(info.list || []).length">{{ info.innerText || '样式' + (i + 1) }}</span>
23
- </div>
24
- <p v-if="!list.length" class="st-list__empty">未配置常用样式</p>
25
- </div>
26
- </template>
27
-
28
- <script>
29
- import { setterProps, setterEmits } from './props.js'
30
-
31
- /** 只保留视觉相关的样式,剔除会撑破面板的定位/尺寸类声明 */
32
- const DROP = new Set(['width', 'height', 'lineHeight', 'marginRight', 'cursor', 'textAlign'])
33
-
34
- export default {
35
- name: 'SetCustomSelect',
36
- props: setterProps,
37
- emits: [...setterEmits, 'sync'],
38
- computed: {
39
- list() {
40
- return this.options.list || []
41
- },
42
- },
43
- methods: {
44
- normalizeStyle(s) {
45
- if (!s || typeof s !== 'object') return {}
46
- const out = {}
47
- for (const k in s) if (!DROP.has(k)) out[k] = s[k]
48
- return out
49
- },
50
- apply(info) {
51
- if (this.disabled) return
52
- const sync = info.sync || {}
53
- if (!Object.keys(sync).length) return
54
- this.$emit('sync', sync)
55
- },
56
- },
57
- }
58
- </script>