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.
- package/README.md +46 -5
- package/dist/cli.js +51 -1
- package/dist/config.js +51 -16
- package/dist/core.js +2 -2
- package/dist/init.js +425 -0
- package/dist/preview-editor/assets/index-CHuGGIR3.js +276 -0
- package/dist/preview-editor/assets/{index-B4VZgNSK.css → index-CQScMhyg.css} +1 -1
- package/dist/preview-editor/index.html +2 -2
- package/dist/standalone.js +8 -0
- package/dist/vendored/mcp/client.mjs +537 -0
- package/dist/vendored/mcp/tools.mjs +268 -0
- package/dist/vendored/preview/assets/default-image.png +0 -0
- package/dist/{server-core → vendored/server/core}/ai-chat.js +82 -38
- package/dist/{server-core → vendored/server/core}/browser.js +1 -1
- package/dist/{server-core → vendored/server/core}/cardSave.js +8 -3
- package/dist/{server-core → vendored/server/core}/cardSync.js +6 -14
- package/dist/{server-core → vendored/server/core}/cardValidate.js +11 -8
- package/dist/{server-core → vendored/server/core}/index.js +5 -3
- package/dist/vendored/server/core/skillPaths.js +124 -0
- package/dist/{server-core → vendored/server/core}/sliceUpload.js +5 -8
- package/dist/vendored/skills/README.md +93 -0
- package/dist/vendored/skills/card-doctor/SKILL.md +52 -0
- package/dist/vendored/skills/card-skill-trainer/SKILL.md +312 -0
- package/dist/vendored/skills/card-skill-trainer/baselines/v3-r038n.json +43 -0
- package/dist/vendored/skills/card-skill-trainer/baselines/v3-r039n.json +47 -0
- package/dist/vendored/skills/card-skill-trainer/baselines/v3-r050n.json +48 -0
- package/dist/vendored/skills/card-skill-trainer/scripts/build_dataset.py +472 -0
- package/dist/vendored/skills/card-skill-trainer/scripts/build_sample.mjs +162 -0
- package/dist/vendored/skills/card-skill-trainer/scripts/diagnose_case.mjs +241 -0
- package/dist/vendored/skills/card-skill-trainer/scripts/lib/scoring.mjs +525 -0
- package/dist/vendored/skills/card-skill-trainer/scripts/round_diff.mjs +133 -0
- package/dist/vendored/skills/card-skill-trainer/scripts/run_round.mjs +1043 -0
- package/dist/vendored/skills/card-skill-trainer/scripts/score_round.mjs +195 -0
- package/dist/vendored/skills/card-skill-trainer/scripts/test_missing_slice.py +122 -0
- package/dist/vendored/skills/dsl-card-ai/SKILL.md +191 -0
- package/dist/vendored/skills/dsl-card-generator/SKILL.md +480 -0
- package/dist/vendored/skills/dsl-card-generator/config/render-contract.json +11 -0
- package/dist/vendored/skills/dsl-card-generator/references/amount_formatting.md +138 -0
- package/dist/vendored/skills/dsl-card-generator/references/card_index.json +1597 -0
- package/dist/vendored/skills/dsl-card-generator/references/card_templates.json +384 -0
- package/dist/vendored/skills/dsl-card-generator/references/card_to_summary.md +56 -0
- package/dist/vendored/skills/dsl-card-generator/references/component_rules.md +76 -0
- package/dist/vendored/skills/dsl-card-generator/references/component_specs.md +393 -0
- package/dist/vendored/skills/dsl-card-generator/references/dsl_structure.md +208 -0
- package/dist/vendored/skills/dsl-card-generator/references/event_patterns.md +287 -0
- package/dist/vendored/skills/dsl-card-generator/references/expression_engine.md +121 -0
- package/dist/vendored/skills/dsl-card-generator/references/field_name_dict.json +34 -0
- package/dist/vendored/skills/dsl-card-generator/references/field_naming.md +101 -0
- package/dist/vendored/skills/dsl-card-generator/references/generation_pitfalls.md +928 -0
- package/dist/vendored/skills/dsl-card-generator/references/handcrafted/README.md +69 -0
- package/dist/vendored/skills/dsl-card-generator/references/handcrafted/examples_index.json +2967 -0
- package/dist/vendored/skills/dsl-card-generator/references/handcrafted/patterns.json +2835 -0
- package/dist/vendored/skills/dsl-card-generator/references/handcrafted/recipes_v2.json +648 -0
- package/dist/vendored/skills/dsl-card-generator/references/handcrafted/recipes_v2_schema.md +295 -0
- package/dist/vendored/skills/dsl-card-generator/references/image_diff.md +48 -0
- package/dist/vendored/skills/dsl-card-generator/references/image_to_card.md +129 -0
- package/dist/vendored/skills/dsl-card-generator/references/ir-format.md +212 -0
- package/dist/vendored/skills/dsl-card-generator/references/message-center-pattern.md +149 -0
- package/dist/vendored/skills/dsl-card-generator/references/platform_jsapi.md +196 -0
- package/dist/vendored/skills/dsl-card-generator/references/previewer_contract.md +54 -0
- package/dist/vendored/skills/dsl-card-generator/references/quickref.md +197 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/absolute-badge.json +84 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/accordion-group-toggle.json +18 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/alertCard-pair.json +12 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/alertDialog-call.json +12 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-countdown.json +15 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-donut.json +15 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-gauge-score.json +11 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-radar.json +10 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-title-head.json +13 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/globalSet.json +12 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/label-col-modes.json +21 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/list-expand-collapse.json +17 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/money-format.json +11 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/opacity-switch.json +130 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/progress-bar.json +25 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/tab-billMode.json +15 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/title-underline-overlay.json +21 -0
- package/dist/vendored/skills/dsl-card-generator/references/recipes.md +797 -0
- package/dist/vendored/skills/dsl-card-generator/references/rules.md +235 -0
- package/dist/vendored/skills/dsl-card-generator/references/slices_convention.md +177 -0
- package/dist/vendored/skills/dsl-card-generator/references/spec_to_schema_patterns.md +609 -0
- package/dist/vendored/skills/dsl-card-generator/references/ui_fidelity_rules.md +131 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/add_component.mjs +118 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/analyze_component_usage.mjs +153 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/apply_opacity_pattern.mjs +343 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/build_card_index.mjs +108 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/build_card_templates.mjs +190 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/check_fidelity.mjs +257 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/check_magic_values.mjs +79 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/crop_slices.mjs +98 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/describe_card.mjs +265 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/diff_bands.mjs +257 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/diff_card.mjs +316 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/expand_ir.mjs +873 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/extract_handcrafted.py +1199 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/extract_subtree.mjs +191 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/generate_cards.mjs +389 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/inventory_schemas.py +160 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/iterate.mjs +700 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lib/design_image.mjs +56 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lib/design_sample.mjs +328 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lib/layout-tokens.mjs +79 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lib/paths.mjs +103 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lib/scaffold.mjs +575 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lib/slicePath.mjs +81 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lib/slice_dedupe.mjs +147 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lint_autofix.mjs +363 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/lint_card.mjs +1399 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/preflight.mjs +249 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/register_card_template.mjs +208 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/render_baseline.mjs +231 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/render_card.mjs +801 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/render_diff.mjs +239 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/resolve_card_template.mjs +73 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/route_input.mjs +447 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/scaffold_card.mjs +81 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/slices_normalize.mjs +316 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/spec_audit.mjs +462 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/spec_to_schema_v3.mjs +7735 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/spec_tree.mjs +355 -0
- package/dist/vendored/skills/dsl-card-generator/scripts/validate_all_schemas.py +71 -0
- package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/default-image-wzZYQ86K.png +0 -0
- package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-C9k-07y7.css +1 -0
- package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-oFRM4f4V.js +55 -0
- package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/svg-symbols-B2exBrAr.svg +118 -0
- package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/component-meta.json +2714 -0
- package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/directive-meta.json +40 -0
- package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/style-meta.json +1086 -0
- package/dist/vendored/{standalone.html → skills/dsl-card-generator/vendor/preview/standalone.html} +2 -1
- package/dist/vendored/skills/finmall-card-sync/SKILL.md +262 -0
- package/dist/vendored/skills/finmall-session-navigator/SKILL.md +169 -0
- package/dist/vendored/skills/finmall-session-navigator/scripts/finmall_login.mjs +882 -0
- package/dist/vendored/skills/finmall-session-navigator/scripts/package-lock.json +59 -0
- package/dist/vendored/skills/finmall-session-navigator/scripts/package.json +10 -0
- package/dist/vendored/skills/finmall-session-navigator/scripts/session-manager.mjs +96 -0
- package/dist/vendored/skills/shared/README.md +55 -0
- package/dist/vendored/skills/shared/auth-model.md +79 -0
- package/dist/vendored/skills/sketch-spec-to-card/SKILL.md +329 -0
- package/dist/vendored/skills/sketch-spec-to-card/references/boundary.json +14 -0
- package/dist/vendored/skills/sketch-spec-to-card/references/card_refs.json +13 -0
- package/dist/vendored/skills/sketch-spec-to-card/references/spec-schema.md +103 -0
- package/dist/vendored/skills/sketch-spec-to-card/scripts/build_prompt.py +797 -0
- package/dist/vendored/skills/sketch-spec-to-card/scripts/card_refs.py +94 -0
- package/dist/vendored/skills/sketch-spec-to-card/scripts/cluster_states.py +706 -0
- package/dist/vendored/skills/sketch-spec-to-card/scripts/parse_meaxure.py +1781 -0
- package/dist/vendored/skills/sketch-spec-to-card/scripts/png_utils.py +318 -0
- package/dist/vendored/skills/sketch-spec-to-card/scripts/vision.py +1118 -0
- package/dist/vendored/templates/helloCard/data.json +10 -0
- package/dist/vendored/templates/helloCard/schema.json +238 -0
- package/dist/vendored/tools/link-skills.mjs +485 -0
- package/package.json +2 -1
- package/dist/preview-editor/assets/index-jl4YJzKv.js +0 -180
- package/dist/vendored/App.vue +0 -2858
- package/dist/vendored/ansi.js +0 -185
- package/dist/vendored/assets/apple-touch-icon.png +0 -0
- package/dist/vendored/assets/default-image.png +0 -0
- package/dist/vendored/assets/favicon-16.png +0 -0
- package/dist/vendored/assets/favicon-32.png +0 -0
- package/dist/vendored/assets/site-icon.png +0 -0
- package/dist/vendored/assets/svgIcons/icons.svg +0 -87
- package/dist/vendored/assets/svgIcons/index.js +0 -39
- package/dist/vendored/components/AiSettings.vue +0 -392
- package/dist/vendored/components/AlertCardInstance.vue +0 -58
- package/dist/vendored/components/AlertCardLayer.vue +0 -59
- package/dist/vendored/components/ApiCallPanel.vue +0 -127
- package/dist/vendored/components/ApiPayloadTree.vue +0 -201
- package/dist/vendored/components/AppToast.vue +0 -37
- package/dist/vendored/components/CardGallery.vue +0 -291
- package/dist/vendored/components/CardPreview.vue +0 -72
- package/dist/vendored/components/CardSelect.vue +0 -206
- package/dist/vendored/components/ChatComposer.vue +0 -413
- package/dist/vendored/components/ChatMessage.vue +0 -383
- package/dist/vendored/components/ChatPanel.vue +0 -937
- package/dist/vendored/components/ComponentPalette.vue +0 -301
- package/dist/vendored/components/ConfirmDialog.vue +0 -54
- package/dist/vendored/components/DatePickerOverlay.vue +0 -345
- package/dist/vendored/components/DebugPanel.vue +0 -1734
- package/dist/vendored/components/DeviceOverlay.vue +0 -70
- package/dist/vendored/components/Dropdown.vue +0 -193
- package/dist/vendored/components/EventEditor.vue +0 -273
- package/dist/vendored/components/HoverGuides.vue +0 -122
- package/dist/vendored/components/JsonTree.vue +0 -547
- package/dist/vendored/components/LogValue.vue +0 -52
- package/dist/vendored/components/MarkdownBody.vue +0 -64
- package/dist/vendored/components/NewCardDialog.vue +0 -132
- package/dist/vendored/components/NodeInspector.vue +0 -295
- package/dist/vendored/components/NumberStepper.vue +0 -125
- package/dist/vendored/components/PickerOverlay.vue +0 -131
- package/dist/vendored/components/PropControl.vue +0 -245
- package/dist/vendored/components/PropTree.vue +0 -128
- package/dist/vendored/components/RemotePreview.vue +0 -173
- package/dist/vendored/components/SelectionOverlay.vue +0 -105
- package/dist/vendored/components/StructureTree.vue +0 -1002
- package/dist/vendored/components/Switch.vue +0 -38
- package/dist/vendored/components/setters/SetBgPosition.vue +0 -64
- package/dist/vendored/components/setters/SetBgSize.vue +0 -90
- package/dist/vendored/components/setters/SetCode.vue +0 -198
- package/dist/vendored/components/setters/SetColor.vue +0 -244
- package/dist/vendored/components/setters/SetCustomSelect.vue +0 -58
- package/dist/vendored/components/setters/SetExpr.vue +0 -107
- package/dist/vendored/components/setters/SetGradient.vue +0 -125
- package/dist/vendored/components/setters/SetGrid9.vue +0 -68
- package/dist/vendored/components/setters/SetIconSelect.vue +0 -67
- package/dist/vendored/components/setters/SetIfForm.vue +0 -61
- package/dist/vendored/components/setters/SetImage.vue +0 -43
- package/dist/vendored/components/setters/SetList.vue +0 -139
- package/dist/vendored/components/setters/SetNumber.vue +0 -118
- package/dist/vendored/components/setters/SetNumberStyle.vue +0 -113
- package/dist/vendored/components/setters/SetPadding.vue +0 -77
- package/dist/vendored/components/setters/SetSegment.vue +0 -160
- package/dist/vendored/components/setters/SetSelect.vue +0 -51
- package/dist/vendored/components/setters/SetSwitch.vue +0 -49
- package/dist/vendored/components/setters/SetText.vue +0 -52
- package/dist/vendored/components/setters/props.js +0 -23
- package/dist/vendored/fidelity/baseline-messageOverview.json +0 -87
- package/dist/vendored/fidelity/calibration.json +0 -29
- package/dist/vendored/fidelity/fidelity-messageOverview-after.html +0 -114
- package/dist/vendored/fidelity/fidelity-messageOverview-after.json +0 -272
- package/dist/vendored/fidelity/fidelity-messageOverview.html +0 -185
- package/dist/vendored/fidelity/fidelity-messageOverview.json +0 -336
- package/dist/vendored/fidelity/fidelity-messageOverview_v2.html +0 -262
- package/dist/vendored/fidelity/fidelity-messageOverview_v2.json +0 -502
- package/dist/vendored/fidelity/fidelity-messageOverview_v3.html +0 -201
- package/dist/vendored/fidelity/fidelity-messageOverview_v3.json +0 -417
- package/dist/vendored/fidelity/fidelity-messageOverview_visual.html +0 -125
- package/dist/vendored/fidelity/fidelity-messageOverview_visual.json +0 -338
- package/dist/vendored/index.html +0 -16
- package/dist/vendored/main.js +0 -37
- package/dist/vendored/runtime/ai-api.js +0 -165
- package/dist/vendored/runtime/alert-card.js +0 -125
- package/dist/vendored/runtime/app-toast.js +0 -33
- package/dist/vendored/runtime/clipboard-node.js +0 -78
- package/dist/vendored/runtime/clipboard.js +0 -29
- package/dist/vendored/runtime/event-model.js +0 -300
- package/dist/vendored/runtime/hoverGuide.js +0 -31
- package/dist/vendored/runtime/jsapi-mock.js +0 -256
- package/dist/vendored/runtime/markdown.js +0 -140
- package/dist/vendored/runtime/node-model.js +0 -217
- package/dist/vendored/skills/.manifest.json +0 -1101
- package/dist/vendored/standalone-main.js +0 -36
- package/dist/vendored/styles/ai-chat.css +0 -1850
- package/dist/vendored/styles/app.css +0 -3648
- package/dist/vendored/styles/card-gallery.css +0 -285
- package/dist/vendored/styles/card-select.css +0 -288
- package/dist/vendored/styles/components.css +0 -383
- package/dist/vendored/styles/dropdown.css +0 -324
- package/dist/vendored/styles/json-tree.css +0 -308
- package/dist/vendored/styles/node-inspector.css +0 -800
- package/dist/vendored/styles/setters.css +0 -1050
- package/dist/vendored/styles/standalone.css +0 -27
- package/dist/vendored/styles/structure-tree.css +0 -460
- /package/dist/vendored/{api.js → preview/api.js} +0 -0
- /package/dist/vendored/{assets → preview/assets}/svg-symbols.svg +0 -0
- /package/dist/vendored/{components → preview/components}/AbsoluteLayout.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Button.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Canvas.vue +0 -0
- /package/dist/vendored/{components → preview/components}/CheckGroup.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Column.vue +0 -0
- /package/dist/vendored/{components → preview/components}/CustomPlaceholder.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Divider.vue +0 -0
- /package/dist/vendored/{components → preview/components}/GridLayout.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Icon.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Image.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Input.vue +0 -0
- /package/dist/vendored/{components → preview/components}/ListLayout.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Map.vue +0 -0
- /package/dist/vendored/{components → preview/components}/MultiColumn.vue +0 -0
- /package/dist/vendored/{components → preview/components}/MultiText.vue +0 -0
- /package/dist/vendored/{components → preview/components}/ProgressSlider.vue +0 -0
- /package/dist/vendored/{components → preview/components}/RadioButton.vue +0 -0
- /package/dist/vendored/{components → preview/components}/RenderTree.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Root.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Row.vue +0 -0
- /package/dist/vendored/{components → preview/components}/SvgCode.vue +0 -0
- /package/dist/vendored/{components → preview/components}/SvgSymbols.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Text.vue +0 -0
- /package/dist/vendored/{components → preview/components}/Video.vue +0 -0
- /package/dist/vendored/{components → preview/components}/ViewContainer.vue +0 -0
- /package/dist/vendored/{components → preview/components}/base.js +0 -0
- /package/dist/vendored/{components → preview/components}/icons.js +0 -0
- /package/dist/vendored/{components → preview/components}/index.js +0 -0
- /package/dist/vendored/{meta → preview/meta}/component-meta.json +0 -0
- /package/dist/vendored/{meta → preview/meta}/directive-meta.json +0 -0
- /package/dist/vendored/{meta → preview/meta}/style-meta.json +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/StyleParser.js +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/adapter.js +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/assets.js +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/canvas-context.js +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/card-runtime.js +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/evaluate.js +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/property.js +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/selectionOverlay.js +0 -0
- /package/dist/vendored/{runtime → preview/runtime}/toPreview.js +0 -0
- /package/dist/{server-core → vendored/server/core}/assetProxy.js +0 -0
- /package/dist/{server-core → vendored/server/core}/bbox.js +0 -0
- /package/dist/{server-core → vendored/server/core}/buildDataFromSchema.js +0 -0
- /package/dist/{server-core → vendored/server/core}/cardFiles.js +0 -0
- /package/dist/{server-core → vendored/server/core}/cardHistory.js +0 -0
- /package/dist/{server-core → vendored/server/core}/cardImage.js +0 -0
- /package/dist/{server-core → vendored/server/core}/cardImportMeta.js +0 -0
- /package/dist/{server-core → vendored/server/core}/cardListCache.js +0 -0
- /package/dist/{server-core → vendored/server/core}/cardOpenFolder.js +0 -0
- /package/dist/{server-core → vendored/server/core}/cardSidecar.js +0 -0
- /package/dist/{server-core → vendored/server/core}/codeBridge.js +0 -0
- /package/dist/{server-core → vendored/server/core}/logStream.js +0 -0
- /package/dist/{server-core → vendored/server/core}/logger.js +0 -0
- /package/dist/{server-core → vendored/server/core}/nodeModels.js +0 -0
- /package/dist/{server-core → vendored/server/core}/renderStatus.js +0 -0
- /package/dist/{server-core → vendored/server/core}/screenshot.js +0 -0
- /package/dist/{server-core → vendored/server/core}/sliceStatic.js +0 -0
- /package/dist/vendored/{meta → skills/dsl-card-generator/vendor/preview/meta}/action-meta.json +0 -0
- /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>
|