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,132 +0,0 @@
1
- <!--
2
- 新增空白卡片弹窗:顶栏「新增空白卡片」图标按钮(网格预览旁边)触发。
3
- 卡片 ID 必填、描述选填:ID 校验形状(字母/数字开头,含 _ -),描述 ≤200 字,留空则由后端用 ID 兜显示名;
4
- ID 重名做前置判定(父级传 existing-ids = 实时扫描 src/cards 的本地卡片):撞上就红字提示并禁用「创建」,
5
- 不必等后端 409 才知道;后端仍是权威闸(列表可能过期、macOS 文件系统不区分大小写)。
6
- 确认后 POST /__cards 由后端写空骨架(schema + 派生 data)到 src/cards/<id>/。
7
- 失败(ID 已存在 / 校验不过 / 服务报错)原地红字保留弹窗;成功 emit created(id),
8
- 父级关弹窗 + 刷列表 + 切换到新卡。
9
- 骨架与「编辑变量」弹窗同构(ni-overlay / ni-panel / ni-head / ni-foot),视觉语言统一。
10
- -->
11
- <template>
12
- <transition name="modal">
13
- <div v-if="visible" class="ni-overlay" @click.self="$emit('close')">
14
- <div class="ni-panel modal-card newcard-dlg" role="alertdialog" aria-modal="true" aria-label="新增空白卡片">
15
- <div class="ni-head">
16
- <span class="ni-title">新增空白卡片</span>
17
- <button class="ni-close" type="button" title="关闭" @click="$emit('close')"></button>
18
- </div>
19
- <div class="ni-body">
20
- <div class="ni-scroll">
21
- <div class="ni-field-row">
22
- <label class="ni-field-label"><i>*</i>卡片 ID</label>
23
- <input
24
- class="ni-input"
25
- :class="{ 'newcard-dlg__input--dup': !!dupId }"
26
- type="text"
27
- v-model="id"
28
- placeholder="英文标识,如 myNewCard(字母/数字/_/-)"
29
- :aria-invalid="dupId ? 'true' : null"
30
- :disabled="busy"
31
- @keydown.enter="submit"
32
- />
33
- </div>
34
- <div class="ni-field-row">
35
- <label class="ni-field-label">卡片描述</label>
36
- <input
37
- class="ni-input"
38
- type="text"
39
- v-model="desc"
40
- placeholder="选填,卡片用途简述;留空则用卡片 ID 作显示名"
41
- :disabled="busy"
42
- @keydown.enter="submit"
43
- />
44
- </div>
45
- <p v-if="dupId" class="newcard-dlg__err" role="alert">卡片 ID 已存在:本地已有「{{ dupId }}」,换一个 ID</p>
46
- <p v-else-if="error" class="newcard-dlg__err" role="alert">{{ error }}</p>
47
- </div>
48
- </div>
49
- <div class="ni-foot">
50
- <span class="ni-tip">创建后写入 src/cards/&lt;id&gt;/ 空骨架,并切换到新卡</span>
51
- <div class="ni-foot-btns">
52
- <button class="ni-btn ni-btn--ghost" type="button" :disabled="busy" @click="$emit('close')">取消</button>
53
- <button class="ni-btn" type="button" :disabled="busy || !!dupId" @click="submit">{{ busy ? '创建中…' : '创建' }}</button>
54
- </div>
55
- </div>
56
- </div>
57
- </div>
58
- </transition>
59
- </template>
60
-
61
- <script>
62
- import { apiFetch } from '@/api.js'
63
-
64
- const ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/
65
-
66
- export default {
67
- name: 'NewCardDialog',
68
- props: {
69
- visible: { type: Boolean, default: false },
70
- /** 本地已有卡片 ID(父级实时拉 GET /__cards):用于 ID 重名前置判定 */
71
- existingIds: { type: Array, default: () => [] },
72
- },
73
- emits: ['close', 'created'],
74
- data() {
75
- return { id: '', desc: '', error: '', busy: false }
76
- },
77
- computed: {
78
- /** 与本地卡片撞名的 ID(未撞返回空串):输入即时判定,不等提交 */
79
- dupId() {
80
- const id = this.id.trim()
81
- if (!id) return ''
82
- return this.existingIds.find((x) => x === id) || ''
83
- },
84
- },
85
- watch: {
86
- // 每次打开重置:上一次的失败错误 / 半截输入不带进新会话
87
- visible(v) {
88
- if (v) {
89
- this.id = ''
90
- this.desc = ''
91
- this.error = ''
92
- this.busy = false
93
- }
94
- },
95
- },
96
- methods: {
97
- validate() {
98
- const id = this.id.trim()
99
- const desc = this.desc.trim()
100
- if (!id) return '卡片 ID 必填'
101
- if (!ID_RE.test(id)) return '卡片 ID 只能以字母/数字开头,含字母/数字/_/-(≤64 字符)'
102
- if (this.dupId) return `卡片 ID 已存在:本地已有「${this.dupId}」,换一个 ID`
103
- if (desc.length > 200) return '卡片描述过长(≤200 字)'
104
- return ''
105
- },
106
- async submit() {
107
- if (this.busy) return
108
- const err = this.validate()
109
- if (err) {
110
- this.error = err
111
- return
112
- }
113
- this.busy = true
114
- this.error = ''
115
- try {
116
- const res = await apiFetch('/__cards', {
117
- method: 'POST',
118
- headers: { 'Content-Type': 'application/json' },
119
- body: JSON.stringify({ id: this.id.trim(), desc: this.desc.trim() }),
120
- })
121
- const r = await res.json().catch(() => null)
122
- if (!res.ok) throw new Error((r && (r.message || r.error)) || `HTTP ${res.status}`)
123
- this.$emit('created', this.id.trim())
124
- } catch (e) {
125
- this.error = `创建失败:${e.message}`
126
- } finally {
127
- this.busy = false
128
- }
129
- },
130
- },
131
- }
132
- </script>
@@ -1,295 +0,0 @@
1
- <!--
2
- 节点属性面板(meta 驱动,可编辑写回)。
3
-
4
- 数据源:预览树节点 comp._schemaNode(与 currentSchema 同引用)。构建 NodeEditModel 后:
5
- - 组件属性 / 指令:表单树 == 实例树,直接 mutate Property.itemValue,整树导出(applyToSchema);
6
- - 样式:表单树(styleForm, 完整 meta) 与实例树(style, 精简) 分离,改动经 applyStyleChange 定点并入;
7
- - 编辑即时(防抖)重建预览(emit apply),「应用」把改动暂存进内存工作副本(currentSchema),落盘由顶栏「保存到本地」负责;不再 emit write-back。
8
-
9
- 面板布局对齐线上编辑器右侧「属性 / 事件」:
10
- 属性 tab:基本信息 + 组件属性 + 样式 + 指令(分组可折叠,叶子用类型化控件);
11
- 事件 tab:事件动作列表,每条 = 触发事件 + 动作类型 + 动作参数。
12
- 参数由 meta/action-meta.json 声明(Property meta 形态),
13
- 因此和属性页签共用 Property / PropTree / PropControl 同一套渲染与回写机制,
14
- customAction 的脚本走 itemType=Code 的 SetCode 设置器(CodeJar + Prism)。
15
- 导出纪律见 runtime/event-model.js 文件头:必填/原有/改过的参数才写回 schema。
16
- -->
17
- <template>
18
- <div class="ni-overlay">
19
- <div class="ni-panel modal-card">
20
- <div class="ni-head">
21
- <span class="ni-title">
22
- 节点属性 · {{ compName }}
23
- <em class="ni-cls">{{ schemaNode && schemaNode.className }}</em>
24
- </span>
25
- <button class="ni-close" type="button" @click="onClose"></button>
26
- </div>
27
-
28
- <div v-if="!model" class="ni-body">
29
- <p class="ni-empty">无法定位该节点的原始 schema(_schemaNode 缺失)</p>
30
- </div>
31
-
32
- <div v-else class="ni-body">
33
- <!-- ============ 属性 ============ -->
34
- <div class="ni-scroll">
35
- <!-- 基本信息 -->
36
- <section class="ni-sec">
37
- <div class="ni-sec-head" @click="toggleSec('basic')">
38
- <span class="ni-caret" :class="{ 'is-open': secOpen.basic }">▸</span>基本信息
39
- </div>
40
- <div v-show="secOpen.basic" class="ni-sec-body">
41
- <div class="ni-field-row">
42
- <label class="ni-field-label">组件类型</label>
43
- <span class="ni-static">{{ compName }}</span>
44
- </div>
45
- <div class="ni-field-row" v-if="hasField('componentId')">
46
- <label class="ni-field-label">实例 ID</label>
47
- <input class="ni-input" :value="schemaNode.componentId" @input="onMetaInput('componentId', $event.target.value)" />
48
- </div>
49
- <div class="ni-field-row" v-if="hasField('name')">
50
- <label class="ni-field-label">节点名</label>
51
- <input class="ni-input" :value="schemaNode.name" @input="onMetaInput('name', $event.target.value)" />
52
- </div>
53
- </div>
54
- </section>
55
-
56
- <!-- 组件属性 -->
57
- <section class="ni-sec" v-show="model.properties.length">
58
- <div class="ni-sec-head" @click="toggleSec('props')">
59
- <span class="ni-caret" :class="{ 'is-open': secOpen.props }">▸</span>
60
- 组件属性
61
- </div>
62
- <div v-show="secOpen.props" class="ni-sec-body">
63
- <prop-tree
64
- :properties="model.properties"
65
- mode="property"
66
- :plain="true"
67
- @leaf-change="onPropChange"
68
- @leaf-sync="onStyleSync"
69
- />
70
- </div>
71
- </section>
72
-
73
- <!-- 样式 -->
74
- <section class="ni-sec">
75
- <div class="ni-sec-head" @click="toggleSec('style')">
76
- <span class="ni-caret" :class="{ 'is-open': secOpen.style }">▸</span>
77
- 样式
78
- </div>
79
- <div v-show="secOpen.style" class="ni-sec-body">
80
- <prop-tree
81
- :properties="model.styleForm"
82
- mode="style"
83
- :watches="styleWatches"
84
- :plain="true"
85
- @leaf-change="onStyleChange"
86
- @leaf-sync="onStyleSync"
87
- />
88
- </div>
89
- </section>
90
-
91
- <!-- 指令 -->
92
- <section class="ni-sec" v-if="model.hasDirectives">
93
- <div class="ni-sec-head" @click="toggleSec('directive')">
94
- <span class="ni-caret" :class="{ 'is-open': secOpen.directive }">▸</span>
95
- 指令
96
- </div>
97
- <div v-show="secOpen.directive" class="ni-sec-body">
98
- <p v-if="!model.directives.length" class="ni-empty">无指令</p>
99
- <prop-tree
100
- v-else
101
- :properties="model.directives"
102
- mode="directive"
103
- :b-exchange="false"
104
- :plain="true"
105
- @leaf-change="onPropChange"
106
- @leaf-sync="onStyleSync"
107
- />
108
- </div>
109
- </section>
110
- </div>
111
-
112
- </div>
113
-
114
- <div class="ni-foot">
115
- <span class="ni-tip">编辑即时预览(不记历史);「取消」丢弃改动并还原,「应用」写入历史并关闭,落盘由顶栏「保存到本地」负责</span>
116
- <div class="ni-foot-btns">
117
- <button class="ni-btn ni-btn--ghost" type="button" @click="onCancel">取消</button>
118
- <button class="ni-btn" type="button" @click="onApplyWrite">应用</button>
119
- </div>
120
- </div>
121
- </div>
122
- </div>
123
- </template>
124
-
125
- <script>
126
- import { reactive } from 'vue'
127
- import { NodeEditModel } from '@/runtime/node-model.js'
128
-
129
- export default {
130
- name: 'NodeInspector',
131
- props: {
132
- comp: { type: Object, required: true },
133
- compNames: { type: Object, default: () => ({}) },
134
- rt: { type: Object, required: true },
135
- },
136
- emits: ['apply', 'commit', 'close'],
137
- data() {
138
- return {
139
- model: null,
140
- secOpen: { basic: true, props: true, style: true, directive: true },
141
- _t: null,
142
- _snapshot: null,
143
- _dirty: false,
144
- _written: false,
145
- }
146
- },
147
- computed: {
148
- schemaNode() {
149
- return (this.comp && this.comp._schemaNode) || null
150
- },
151
- compName() {
152
- const cn = this.schemaNode && this.schemaNode.className
153
- if (!cn) return '节点'
154
- return (this.compNames && this.compNames[cn]) || cn
155
- },
156
- /** 样式编辑联动快照:把所有样式字段 itemKey→itemValue 摊平,供 itemWatch 使用 */
157
- styleWatches() {
158
- const w = {}
159
- const walk = (props) => {
160
- (props || []).forEach((p) => {
161
- if (p.itemKey != null) w[p.itemKey] = p.itemValue
162
- if (p.itemChildren && p.itemChildren.properties) walk(p.itemChildren.properties)
163
- })
164
- }
165
- if (this.model) walk(this.model.styleForm)
166
- return w
167
- },
168
- },
169
- watch: {
170
- comp: {
171
- immediate: true,
172
- handler() {
173
- this.buildModel()
174
- },
175
- },
176
- },
177
- methods: {
178
- buildModel() {
179
- const sn = this.schemaNode
180
- this.model = sn ? reactive(new NodeEditModel(sn)) : null
181
- this._snapshot = sn ? this.snapshotNode(sn) : null
182
- this._dirty = false
183
- this._written = false
184
- },
185
- snapshotNode(node) {
186
- const has = (k) => Object.prototype.hasOwnProperty.call(node, k)
187
- const clone = (v) => v === undefined ? undefined : JSON.parse(JSON.stringify(v))
188
- return {
189
- hasProperties: has('properties'), properties: clone(node.properties),
190
- hasStyle: has('style'), style: clone(node.style),
191
- hasDirectives: has('directives'), directives: clone(node.directives),
192
- hasComponentId: has('componentId'), componentId: clone(node.componentId),
193
- hasName: has('name'), name: clone(node.name),
194
- }
195
- },
196
- restoreSnapshot() {
197
- const sn = this.schemaNode
198
- if (!sn || !this._snapshot) return
199
- const s = this._snapshot
200
- const setOrDel = (had, key, val) => { if (had) sn[key] = JSON.parse(JSON.stringify(val)); else delete sn[key] }
201
- setOrDel(s.hasProperties, 'properties', s.properties)
202
- setOrDel(s.hasStyle, 'style', s.style)
203
- setOrDel(s.hasDirectives, 'directives', s.directives)
204
- setOrDel(s.hasComponentId, 'componentId', s.componentId)
205
- setOrDel(s.hasName, 'name', s.name)
206
- },
207
- toggleSec(k) {
208
- this.secOpen[k] = !this.secOpen[k]
209
- this.secOpen = Object.assign({}, this.secOpen)
210
- },
211
- hasField(name) {
212
- return this.schemaNode && Object.prototype.hasOwnProperty.call(this.schemaNode, name)
213
- },
214
- onMetaInput(field, v) {
215
- if (!this.schemaNode) return
216
- this.schemaNode[field] = v
217
- this._dirty = true
218
- this.scheduleApply()
219
- },
220
- /** 组件属性 / 指令:整树导出即可 */
221
- onPropChange() {
222
- this.model.refreshVisible()
223
- this._dirty = true
224
- this.scheduleApply()
225
- },
226
- /** 样式:定点并入实例树 */
227
- onStyleChange(chain) {
228
- if (!chain || !chain.length) return
229
- this.model.applyStyleChange(chain[0], chain.slice(1))
230
- this.model.refreshVisible()
231
- this._dirty = true
232
- this.scheduleApply()
233
- },
234
- /** 常用样式(CustomSelect)批量写入:sync map 形如 { 'style.font.color': '#333' } */
235
- onStyleSync(map) {
236
- if (!map) return
237
- for (const path in map) {
238
- const parts = String(path).split('.')
239
- if (parts.length < 3 || parts[0] !== 'style') continue
240
- const groupKey = parts[1]
241
- const fieldKey = parts[2]
242
- const group = this.model.styleForm.find((p) => p.itemKey === groupKey)
243
- if (!group) continue
244
- const child = group.itemChildren.properties.find((c) => c.itemKey === fieldKey)
245
- if (!child) continue
246
- child.itemValue = map[path]
247
- this.model.applyStyleChange(group, [child])
248
- }
249
- this.model.refreshVisible()
250
- this.scheduleApply()
251
- },
252
- scheduleApply() {
253
- if (this._t) clearTimeout(this._t)
254
- this._t = setTimeout(() => {
255
- this.applyAll()
256
- this.$emit('apply')
257
- }, 250)
258
- },
259
- applyAll() {
260
- if (this.model) this.model.applyToSchema()
261
- },
262
- /** 将改动暂存到内存工作副本(currentSchema,与预览同引用),并重建预览;
263
- * 不写盘——落盘由顶栏「保存到本地」统一负责。_written=true 表示已提交到内存,
264
- * 「取消」不再还原。 */
265
- onApplyWrite() {
266
- if (this._t) {
267
- clearTimeout(this._t)
268
- this._t = null
269
- }
270
- this.applyAll()
271
- this._written = true
272
- this.$emit('apply')
273
- this.$emit('commit')
274
- this.$emit('close')
275
- },
276
-
277
- /** 丢弃本次编辑(还原到打开时快照)+ 关闭面板。
278
- * 已本地保存(_written)的改动视为已提交,不再还原。 */
279
- discardAndClose() {
280
- if (this._t) { clearTimeout(this._t); this._t = null }
281
- if (this._dirty && !this._written) {
282
- this.restoreSnapshot()
283
- this.$emit('apply')
284
- }
285
- this.$emit('close')
286
- },
287
- onClose() {
288
- this.discardAndClose()
289
- },
290
- onCancel() {
291
- this.discardAndClose()
292
- },
293
- },
294
- }
295
- </script>
@@ -1,125 +0,0 @@
1
- <!--
2
- 数字步进输入框:[−] 输入框 [+]。
3
-
4
- 与 setters/SetNumber.vue 的分工:SetNumber 复刻编辑器 common/InputNumber(方向键步进 + 单位后缀 +
5
- 预设值浮层),本组件只做「显式 − / + 按钮 + 直接键入」,用于变量默认值这类需要一眼看到步进入口、
6
- 又不带单位 / 预设的表单场景。方向键上下同样可步进,键盘与鼠标两条路都在。
7
-
8
- 外壳直接复用 setters.css 的 .st-number 家族(同一 28px 高、同一底色 / 边框 / 发丝线附属件语言),
9
- 只新增 − / + 按钮这一种附属件,不另起一套样式。
10
-
11
- 约定沿用 setter 家族:value 进、input 出,且**文本原样**上抛(组件内不转数字),由调用方决定解析口径;
12
- 非法字符当场回滚,因此不产生需要额外报错文案的中间态。
13
- -->
14
- <template>
15
- <div class="st-number st-number--step">
16
- <button
17
- type="button"
18
- class="st-number__step"
19
- title="减少"
20
- aria-label="减少"
21
- :disabled="disabled || !canStep(-1)"
22
- @click="bump(-1)"
23
- >
24
- <svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true">
25
- <line x1="3.5" y1="8" x2="12.5" y2="8" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" />
26
- </svg>
27
- </button>
28
- <input
29
- ref="field"
30
- class="st-number__field"
31
- type="text"
32
- inputmode="decimal"
33
- :value="text"
34
- :placeholder="placeholder"
35
- :disabled="disabled"
36
- @input="onInput($event.target.value)"
37
- @change="$emit('change')"
38
- @keydown.up.prevent="bump(1)"
39
- @keydown.down.prevent="bump(-1)"
40
- />
41
- <button
42
- type="button"
43
- class="st-number__step st-number__step--inc"
44
- title="增加"
45
- aria-label="增加"
46
- :disabled="disabled || !canStep(1)"
47
- @click="bump(1)"
48
- >
49
- <svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true">
50
- <path d="M8 3.5v9M3.5 8h9" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" />
51
- </svg>
52
- </button>
53
- </div>
54
- </template>
55
-
56
- <script>
57
- /** 允许键入的数字字面量:空串 / 负号 / 整数 / 小数(含 "12." ".5" 这类输入中间态) */
58
- const NUM_TEXT = /^-?(?:\d+(?:\.\d*)?|\.\d*)?$/
59
-
60
- export default {
61
- name: 'NumberStepper',
62
- props: {
63
- value: { type: [String, Number], default: '' },
64
- /** 步长,支持小数(如 0.1);非正数或非数值回落 1 */
65
- step: { type: Number, default: 1 },
66
- min: { type: Number, default: -Infinity },
67
- max: { type: Number, default: Infinity },
68
- placeholder: { type: String, default: '请输入数字' },
69
- disabled: { type: Boolean, default: false },
70
- },
71
- emits: ['input', 'change'],
72
- data() {
73
- return { text: '' }
74
- },
75
- computed: {
76
- stepSize() {
77
- return Number.isFinite(this.step) && this.step > 0 ? this.step : 1
78
- },
79
- /** 当前文本对应的数值;空串或 "-" 这类未成形的输入为 null */
80
- num() {
81
- const n = parseFloat(this.text)
82
- return Number.isFinite(n) ? n : null
83
- },
84
- },
85
- watch: {
86
- value: {
87
- immediate: true,
88
- handler(v) {
89
- const next = v === undefined || v === null ? '' : String(v)
90
- if (next !== this.text) this.text = next
91
- },
92
- },
93
- },
94
- methods: {
95
- /** 越界后按钮置灰:未设边界(±Infinity)时始终可点 */
96
- canStep(dir) {
97
- const base = this.num === null ? 0 : this.num
98
- return dir > 0 ? base < this.max : base > this.min
99
- },
100
- /** 消掉二进制浮点噪声(0.1 + 0.2 → 0.30000000000000004) */
101
- tidy(n) {
102
- return Number(n.toPrecision(12))
103
- },
104
- clamp(n) {
105
- return Math.min(this.max, Math.max(this.min, n))
106
- },
107
- onInput(v) {
108
- if (!NUM_TEXT.test(v)) {
109
- // 非法按键丢弃并回滚显示(与 SetNumber 同一手法):绑定的 text 未变,需手动写回 DOM
110
- this.$refs.field.value = this.text
111
- return
112
- }
113
- this.text = v
114
- this.$emit('input', v)
115
- },
116
- bump(dir) {
117
- if (this.disabled) return
118
- const base = this.num === null ? 0 : this.num
119
- this.text = String(this.clamp(this.tidy(base + dir * this.stepSize)))
120
- this.$emit('input', this.text)
121
- this.$emit('change')
122
- },
123
- },
124
- }
125
- </script>
@@ -1,131 +0,0 @@
1
- <!--
2
- showPicker 模拟展现层:底部弹出级联选择器。
3
- 相对固定视口 phone-viewport 定位(absolute inset:0),不随卡片内容滚动;
4
- 层级同 DeviceOverlay(z-index 1100),盖住弹窗卡片。
5
-
6
- 交互对齐 docs「showPicker - 选择器」:
7
- - mode='single' 单列;mode='multi' 多列(一级驱动二级 children 级联)。
8
- - 点击某列项即选中(中间高亮带提示当前项);点「确定」回传 result,点「取消」不回传。
9
- - result 数组每项 { key, value },value 取节点 text。
10
- -->
11
- <template>
12
- <div class="device-ui">
13
- <transition name="picker-fade">
14
- <div v-if="picker" class="pk-mask" @click.self="onCancel">
15
- <div class="pk-sheet">
16
- <div class="pk-bar">
17
- <button type="button" class="pk-bar__btn pk-bar__btn--cancel" @click="onCancel">取消</button>
18
- <div v-if="picker.title" class="pk-bar__title">{{ picker.title }}</div>
19
- <button type="button" class="pk-bar__btn pk-bar__btn--ok" @click="onConfirm">确定</button>
20
- </div>
21
- <div class="pk-cols" :class="'pk-cols--' + columns.length">
22
- <div v-for="(col, ci) in columns" :key="ci" class="pk-col">
23
- <div class="pk-col__band"></div>
24
- <div class="pk-col__list">
25
- <div
26
- v-for="(item, ii) in col.items"
27
- :key="item.key"
28
- class="pk-item"
29
- :class="{ 'pk-item--on': sel[ci] === ii }"
30
- @click="select(ci, ii)"
31
- >{{ item.text }}</div>
32
- </div>
33
- </div>
34
- </div>
35
- </div>
36
- </div>
37
- </transition>
38
- </div>
39
- </template>
40
-
41
- <script>
42
- import { deviceUI, dismissPicker } from '@/runtime/jsapi-mock.js'
43
-
44
- export default {
45
- name: 'PickerOverlay',
46
- data() {
47
- return {
48
- sel: [], // 每列选中索引(列数由 mode 决定)
49
- }
50
- },
51
- computed: {
52
- picker() {
53
- return deviceUI.picker
54
- },
55
- // 列定义:single -> 单列(顶级项,忽略 children);multi -> 两列(级联,第二列为第一列选中项的 children)
56
- columns() {
57
- if (!this.picker) return []
58
- const ds = this.picker.dataSource || []
59
- if (this.picker.mode === 'multi') {
60
- const col1 = ds.map((n) => ({ key: String(n.key), text: n.text }))
61
- const sel1 = this.sel[0] || 0
62
- const children = (ds[sel1] && ds[sel1].children) || []
63
- const col2 = children.map((n) => ({ key: String(n.key), text: n.text }))
64
- return [{ items: col1, level: 0 }, { items: col2, level: 1 }]
65
- }
66
- return [{ items: ds.map((n) => ({ key: String(n.key), text: n.text })), level: 0 }]
67
- },
68
- },
69
- watch: {
70
- // picker 切换(含入参变化)时按 currentValue 初始化选中项
71
- picker: {
72
- immediate: true,
73
- handler(p) {
74
- if (!p) {
75
- this.sel = []
76
- return
77
- }
78
- const ds = p.dataSource || []
79
- const cv = p.currentValue || []
80
- if (p.mode === 'multi') {
81
- const i1 = ds.findIndex((n) => String(n.key) === String(cv[0]))
82
- const idx1 = i1 >= 0 ? i1 : 0
83
- const children = (ds[idx1] && ds[idx1].children) || []
84
- const i2 = children.findIndex((n) => String(n.key) === String(cv[1]))
85
- this.sel = [idx1, i2 >= 0 ? i2 : children.length ? 0 : -1]
86
- } else {
87
- const i1 = ds.findIndex((n) => String(n.key) === String(cv[0]))
88
- this.sel = [i1 >= 0 ? i1 : 0]
89
- }
90
- },
91
- },
92
- },
93
- methods: {
94
- select(ci, ii) {
95
- const next = this.sel.slice()
96
- next[ci] = ii
97
- // 切换第一列时重置第二列选中(级联)
98
- if (ci === 0 && this.picker.mode === 'multi') {
99
- const ds = this.picker.dataSource || []
100
- const children = (ds[ii] && ds[ii].children) || []
101
- next[1] = children.length ? 0 : -1
102
- }
103
- this.sel = next
104
- },
105
- buildResult() {
106
- const p = this.picker
107
- if (!p) return []
108
- const ds = p.dataSource || []
109
- // 回传对象携带 text(卡片回调读 result[0].text)与 value(文档出参规范),两者取节点 text。
110
- const wrap = (n) => ({ key: String(n.key), text: n.text, value: n.text })
111
- if (p.mode === 'multi') {
112
- const n1 = ds[this.sel[0]] || ds[0]
113
- const children = (n1 && n1.children) || []
114
- const n2 = children[this.sel[1]] || children[0]
115
- const arr = []
116
- if (n1) arr.push(wrap(n1))
117
- if (n2) arr.push(wrap(n2))
118
- return arr
119
- }
120
- const n1 = ds[this.sel[0]] || ds[0]
121
- return n1 ? [wrap(n1)] : []
122
- },
123
- onConfirm() {
124
- dismissPicker(true, this.buildResult())
125
- },
126
- onCancel() {
127
- dismissPicker(false)
128
- },
129
- },
130
- }
131
- </script>