cardbuddy 0.9.1 → 0.10.0
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 +17 -2
- package/dist/cli.js +3 -0
- package/dist/config.js +7 -0
- package/dist/portGuard.js +293 -0
- package/dist/preview-editor/assets/index-C_UKS0NF.css +1 -0
- package/dist/preview-editor/assets/{index-B9MOriNv.js → index-D1iIJ4sl.js} +14 -13
- package/dist/preview-editor/index.html +2 -2
- package/dist/server-core/assetProxy.js +3 -22
- package/dist/server-core/buildDataFromSchema.js +36 -4
- package/dist/server-core/cardListCache.js +0 -17
- package/dist/server-core/index.js +3 -5
- package/dist/server-core/logStream.js +1 -6
- package/dist/standalone.js +24 -8
- package/dist/vendored/App.vue +136 -46
- package/dist/vendored/components/ComponentPalette.vue +1 -1
- package/dist/vendored/components/DebugPanel.vue +735 -90
- package/dist/vendored/components/NumberStepper.vue +125 -0
- package/dist/vendored/components/ProgressSlider.vue +9 -1
- package/dist/vendored/components/StructureTree.vue +2 -2
- package/dist/vendored/runtime/clipboard-node.js +0 -5
- package/dist/vendored/styles/app.css +618 -210
- package/dist/vendored/styles/card-gallery.css +3 -3
- package/dist/vendored/styles/card-select.css +13 -6
- package/dist/vendored/styles/dropdown.css +1 -2
- package/dist/vendored/styles/json-tree.css +3 -3
- package/dist/vendored/styles/node-inspector.css +7 -294
- package/dist/vendored/styles/setters.css +48 -49
- package/dist/vendored/styles/structure-tree.css +6 -11
- package/package.json +1 -1
- package/dist/preview-editor/assets/index-CwD14gm3.css +0 -1
- package/dist/vendored/assets/logo.png +0 -0
|
@@ -0,0 +1,125 @@
|
|
|
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>
|
|
@@ -53,7 +53,15 @@ export default {
|
|
|
53
53
|
rootStyle() {
|
|
54
54
|
// 注意:滑块根不裁切自身内容。滑块块在 0%/100% 时会落在轨道端点、且
|
|
55
55
|
// 按下时整体放大 1.2×,若这里 overflow:hidden 会把块裁掉。
|
|
56
|
-
|
|
56
|
+
// 节点高度下限:不得小于轨道(processHeight + 上下内置 8px 外边距)与滑块块
|
|
57
|
+
// (blockHeight)高度,避免节点被布局压缩(flex shrink / 定高父容器)后轨道 / 滑块块溢出裁切。
|
|
58
|
+
const trackH = (Number(this.processHeight) || 5) + 16
|
|
59
|
+
const blockH = Number(this.blockHeight) || 15
|
|
60
|
+
return {
|
|
61
|
+
height: 'auto',
|
|
62
|
+
minHeight: this.adapter.doSize(Math.max(trackH, blockH)),
|
|
63
|
+
boxSizing: 'border-box',
|
|
64
|
+
}
|
|
57
65
|
},
|
|
58
66
|
min() {
|
|
59
67
|
const n = Number(this.minProgress)
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<template>
|
|
9
9
|
<div class="st">
|
|
10
10
|
<!--
|
|
11
|
-
|
|
11
|
+
顶部工具条:与变量 mock 视图 JsonTree 的 .jt__toolbar 同款
|
|
12
12
|
(sticky 顶部 + .jt__tool 按钮风格),保持两个 tab 操作入口一致。
|
|
13
13
|
-->
|
|
14
14
|
<div class="st__toolbar st__toolbar--top">
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
title="按组件名 / 类型 / 实例ID 过滤结构树"
|
|
41
41
|
/>
|
|
42
42
|
<!--
|
|
43
|
-
顶部「+
|
|
43
|
+
顶部「+ 添加」按钮:与变量 mock 视图(JsonTree)工具栏右侧的「+ 添加」同款,
|
|
44
44
|
位于面板右上角。插入锚点由「当前选中节点」决定(未选中→根;容器→末尾子节点;
|
|
45
45
|
非容器→其后兄弟),与线上编辑器「卡片-组件」面板行为一致。
|
|
46
46
|
-->
|
|
@@ -40,11 +40,6 @@ export function setClipboardNode(schemaNode, sourceCardId = null) {
|
|
|
40
40
|
nodeClipboard.sourceCardId = sourceCardId || null
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
export function clearClipboard() {
|
|
44
|
-
nodeClipboard.node = null
|
|
45
|
-
nodeClipboard.sourceCardId = null
|
|
46
|
-
}
|
|
47
|
-
|
|
48
43
|
/**
|
|
49
44
|
* 递归收集子树中所有节点的 className(去重),用于跨卡片粘贴前的兼容性校验。
|
|
50
45
|
* @param {Object} node schema 节点
|