cardbuddy 0.6.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 +211 -0
- package/dist/cli.js +76 -0
- package/dist/config.js +63 -0
- package/dist/core.js +2 -0
- package/dist/preview-editor/assets/apple-touch-icon-BQcES9QK.png +0 -0
- package/dist/preview-editor/assets/default-image-wzZYQ86K.png +0 -0
- package/dist/preview-editor/assets/favicon-16-Cg6Nrosk.png +0 -0
- package/dist/preview-editor/assets/favicon-32-B_1744sp.png +0 -0
- package/dist/preview-editor/assets/index-BYB0hngG.js +72 -0
- package/dist/preview-editor/assets/index-CpBZEQDy.css +1 -0
- package/dist/preview-editor/assets/site-icon-CFMif8z4.png +0 -0
- package/dist/preview-editor/assets/svg-symbols-B2exBrAr.svg +118 -0
- package/dist/preview-editor/index.html +17 -0
- package/dist/server-core/_vendor/finmall-env.mjs +96 -0
- package/dist/server-core/assetProxy.js +154 -0
- package/dist/server-core/bbox.js +153 -0
- package/dist/server-core/browser.js +108 -0
- package/dist/server-core/buildDataFromSchema.js +50 -0
- package/dist/server-core/cardFiles.js +188 -0
- package/dist/server-core/cardHistory.js +156 -0
- package/dist/server-core/cardImage.js +85 -0
- package/dist/server-core/cardImportMeta.js +139 -0
- package/dist/server-core/cardListCache.js +68 -0
- package/dist/server-core/cardOpenFolder.js +135 -0
- package/dist/server-core/cardSave.js +127 -0
- package/dist/server-core/cardSidecar.js +72 -0
- package/dist/server-core/cardSync.js +259 -0
- package/dist/server-core/cardValidate.js +134 -0
- package/dist/server-core/index.js +82 -0
- package/dist/server-core/logger.js +241 -0
- package/dist/server-core/nodeModels.js +52 -0
- package/dist/server-core/renderStatus.js +207 -0
- package/dist/server-core/screenshot.js +123 -0
- package/dist/server-core/sliceStatic.js +44 -0
- package/dist/standalone.js +447 -0
- package/dist/vendored/App.vue +2330 -0
- package/dist/vendored/api.js +142 -0
- 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/logo.png +0 -0
- package/dist/vendored/assets/site-icon.png +0 -0
- package/dist/vendored/assets/svg-symbols.svg +118 -0
- package/dist/vendored/assets/svgIcons/icons.svg +54 -0
- package/dist/vendored/assets/svgIcons/index.js +39 -0
- package/dist/vendored/components/AbsoluteLayout.vue +42 -0
- package/dist/vendored/components/AlertCardInstance.vue +58 -0
- package/dist/vendored/components/AlertCardLayer.vue +59 -0
- package/dist/vendored/components/ApiPayloadTree.vue +168 -0
- package/dist/vendored/components/AppToast.vue +37 -0
- package/dist/vendored/components/Button.vue +37 -0
- package/dist/vendored/components/Canvas.vue +65 -0
- package/dist/vendored/components/CardGallery.vue +243 -0
- package/dist/vendored/components/CardPreview.vue +72 -0
- package/dist/vendored/components/CardSelect.vue +200 -0
- package/dist/vendored/components/CheckGroup.vue +131 -0
- package/dist/vendored/components/Column.vue +25 -0
- package/dist/vendored/components/ComponentPalette.vue +294 -0
- package/dist/vendored/components/ConfirmDialog.vue +39 -0
- package/dist/vendored/components/CustomPlaceholder.vue +33 -0
- package/dist/vendored/components/DatePickerOverlay.vue +345 -0
- package/dist/vendored/components/DebugPanel.vue +806 -0
- package/dist/vendored/components/DeviceOverlay.vue +70 -0
- package/dist/vendored/components/Divider.vue +22 -0
- package/dist/vendored/components/Dropdown.vue +191 -0
- package/dist/vendored/components/EventEditor.vue +247 -0
- package/dist/vendored/components/GridLayout.vue +67 -0
- package/dist/vendored/components/HoverGuides.vue +122 -0
- package/dist/vendored/components/Icon.vue +34 -0
- package/dist/vendored/components/Image.vue +34 -0
- package/dist/vendored/components/Input.vue +90 -0
- package/dist/vendored/components/JsonTree.vue +516 -0
- package/dist/vendored/components/ListLayout.vue +68 -0
- package/dist/vendored/components/LogValue.vue +51 -0
- package/dist/vendored/components/Map.vue +110 -0
- package/dist/vendored/components/MultiColumn.vue +49 -0
- package/dist/vendored/components/MultiText.vue +58 -0
- package/dist/vendored/components/NodeInspector.vue +295 -0
- package/dist/vendored/components/PickerOverlay.vue +131 -0
- package/dist/vendored/components/ProgressSlider.vue +167 -0
- package/dist/vendored/components/PropControl.vue +241 -0
- package/dist/vendored/components/PropTree.vue +128 -0
- package/dist/vendored/components/RadioButton.vue +74 -0
- package/dist/vendored/components/RemotePreview.vue +171 -0
- package/dist/vendored/components/RenderTree.vue +437 -0
- package/dist/vendored/components/Root.vue +30 -0
- package/dist/vendored/components/Row.vue +25 -0
- package/dist/vendored/components/SelectionOverlay.vue +105 -0
- package/dist/vendored/components/StructureTree.vue +949 -0
- package/dist/vendored/components/SvgCode.vue +19 -0
- package/dist/vendored/components/SvgSymbols.vue +30 -0
- package/dist/vendored/components/Switch.vue +38 -0
- package/dist/vendored/components/Text.vue +32 -0
- package/dist/vendored/components/Video.vue +70 -0
- package/dist/vendored/components/ViewContainer.vue +52 -0
- package/dist/vendored/components/base.js +12 -0
- package/dist/vendored/components/icons.js +47 -0
- package/dist/vendored/components/index.js +58 -0
- package/dist/vendored/components/setters/SetBgPosition.vue +64 -0
- package/dist/vendored/components/setters/SetBgSize.vue +90 -0
- package/dist/vendored/components/setters/SetCode.vue +90 -0
- package/dist/vendored/components/setters/SetColor.vue +244 -0
- package/dist/vendored/components/setters/SetCustomSelect.vue +58 -0
- package/dist/vendored/components/setters/SetExpr.vue +107 -0
- package/dist/vendored/components/setters/SetGradient.vue +125 -0
- package/dist/vendored/components/setters/SetGrid9.vue +68 -0
- package/dist/vendored/components/setters/SetIconSelect.vue +67 -0
- package/dist/vendored/components/setters/SetIfForm.vue +61 -0
- package/dist/vendored/components/setters/SetImage.vue +43 -0
- package/dist/vendored/components/setters/SetList.vue +139 -0
- package/dist/vendored/components/setters/SetNumber.vue +118 -0
- package/dist/vendored/components/setters/SetNumberStyle.vue +113 -0
- package/dist/vendored/components/setters/SetPadding.vue +77 -0
- package/dist/vendored/components/setters/SetSegment.vue +160 -0
- package/dist/vendored/components/setters/SetSelect.vue +51 -0
- package/dist/vendored/components/setters/SetSwitch.vue +49 -0
- package/dist/vendored/components/setters/SetText.vue +52 -0
- package/dist/vendored/components/setters/props.js +23 -0
- package/dist/vendored/fidelity/baseline-messageOverview.json +87 -0
- package/dist/vendored/fidelity/calibration.json +29 -0
- package/dist/vendored/fidelity/fidelity-messageOverview-after.html +114 -0
- package/dist/vendored/fidelity/fidelity-messageOverview-after.json +272 -0
- package/dist/vendored/fidelity/fidelity-messageOverview.html +185 -0
- package/dist/vendored/fidelity/fidelity-messageOverview.json +336 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_v2.html +262 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_v2.json +502 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_v3.html +201 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_v3.json +417 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_visual.html +125 -0
- package/dist/vendored/fidelity/fidelity-messageOverview_visual.json +338 -0
- package/dist/vendored/index.html +16 -0
- package/dist/vendored/main.js +36 -0
- package/dist/vendored/meta/action-meta.json +141 -0
- package/dist/vendored/meta/component-meta.json +2714 -0
- package/dist/vendored/meta/directive-meta.json +40 -0
- package/dist/vendored/meta/style-meta.json +1086 -0
- package/dist/vendored/runtime/StyleParser.js +179 -0
- package/dist/vendored/runtime/adapter.js +166 -0
- package/dist/vendored/runtime/alert-card.js +125 -0
- package/dist/vendored/runtime/app-toast.js +33 -0
- package/dist/vendored/runtime/assets.js +16 -0
- package/dist/vendored/runtime/canvas-context.js +141 -0
- package/dist/vendored/runtime/card-runtime.js +289 -0
- package/dist/vendored/runtime/clipboard-node.js +83 -0
- package/dist/vendored/runtime/clipboard.js +29 -0
- package/dist/vendored/runtime/evaluate.js +152 -0
- package/dist/vendored/runtime/event-model.js +300 -0
- package/dist/vendored/runtime/hoverGuide.js +31 -0
- package/dist/vendored/runtime/jsapi-mock.js +256 -0
- package/dist/vendored/runtime/node-model.js +217 -0
- package/dist/vendored/runtime/property.js +364 -0
- package/dist/vendored/runtime/selectionOverlay.js +53 -0
- package/dist/vendored/runtime/toPreview.js +648 -0
- package/dist/vendored/standalone-main.js +36 -0
- package/dist/vendored/standalone.html +12 -0
- package/dist/vendored/styles/app.css +2565 -0
- package/dist/vendored/styles/card-gallery.css +234 -0
- package/dist/vendored/styles/card-select.css +281 -0
- package/dist/vendored/styles/components.css +383 -0
- package/dist/vendored/styles/dropdown.css +337 -0
- package/dist/vendored/styles/json-tree.css +308 -0
- package/dist/vendored/styles/node-inspector.css +1003 -0
- package/dist/vendored/styles/setters.css +962 -0
- package/dist/vendored/styles/standalone.css +27 -0
- package/dist/vendored/styles/structure-tree.css +320 -0
- package/package.json +42 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
「组件结构」tab 的 hover 参考线(Photoshop 风格辅助线):
|
|
3
|
+
|
|
4
|
+
鼠标 hover 到结构树某节点时,于画布上绘制两对「贯穿」参考线,用于选中/定位前的快速预览——
|
|
5
|
+
- 一对竖线:位于元素左、右边缘,纵向贯穿整个画布(高度 = 画布内容全高);
|
|
6
|
+
- 一对横线:位于元素上、下边缘,横向贯穿整个画布(宽度 = 画布内容全宽)。
|
|
7
|
+
|
|
8
|
+
覆盖层作为 .phone__screen(滚动容器)的直接子节点,绝对定位于屏幕的 content 坐标系,
|
|
9
|
+
随卡片内容纵向滚动时自动贴合目标元素,无需手动跟随滚动;pointer-events:none 不挡交互。
|
|
10
|
+
|
|
11
|
+
与选中态遮罩 (SelectionOverlay) 相互独立:选中框(蓝虚线)与 hover 参考线(荧光绿贯穿线)
|
|
12
|
+
可同时显示、互不干扰。定位依据:hoverGuide.el 即目标节点画布根 DOM,由 App.onHoverNode
|
|
13
|
+
通过 data-cid 反查写入。
|
|
14
|
+
-->
|
|
15
|
+
<template>
|
|
16
|
+
<div v-show="hoverGuide.visible" class="ce-guides" :style="containerStyle">
|
|
17
|
+
<!-- 左 / 右竖线:贯穿画布全高 -->
|
|
18
|
+
<div class="ce-guide ce-guide--v" :style="{ left: box.left + 'px' }"></div>
|
|
19
|
+
<div class="ce-guide ce-guide--v" :style="{ left: box.right + 'px' }"></div>
|
|
20
|
+
<!-- 上 / 下横线:贯穿画布全宽 -->
|
|
21
|
+
<div class="ce-guide ce-guide--h" :style="{ top: box.top + 'px' }"></div>
|
|
22
|
+
<div class="ce-guide ce-guide--h" :style="{ top: box.bottom + 'px' }"></div>
|
|
23
|
+
</div>
|
|
24
|
+
</template>
|
|
25
|
+
|
|
26
|
+
<script>
|
|
27
|
+
import { watch } from 'vue'
|
|
28
|
+
import { hoverGuide } from '@/runtime/hoverGuide.js'
|
|
29
|
+
|
|
30
|
+
export default {
|
|
31
|
+
name: 'HoverGuides',
|
|
32
|
+
// 模板需要访问模块级 reactive 对象 hoverGuide(v-show 控制显隐),
|
|
33
|
+
// 但 Vue SFC 的 <template> 作用域只能访问组件实例属性,
|
|
34
|
+
// 故通过 setup() 把它暴露出去(不能裸用 import 变量)。
|
|
35
|
+
setup() {
|
|
36
|
+
return { hoverGuide }
|
|
37
|
+
},
|
|
38
|
+
data() {
|
|
39
|
+
return {
|
|
40
|
+
// 元素边缘(content 坐标):左/上/右/下
|
|
41
|
+
box: { left: 0, top: 0, right: 0, bottom: 0 },
|
|
42
|
+
// 覆盖层尺寸 = 画布内容全宽 / 全高,使参考线贯穿整块画布
|
|
43
|
+
containerStyle: { width: '0px', height: '0px' },
|
|
44
|
+
_ro: null,
|
|
45
|
+
_onScroll: null,
|
|
46
|
+
_onResize: null,
|
|
47
|
+
_raf: 0,
|
|
48
|
+
_stopWatch: null,
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
created() {
|
|
52
|
+
// 注意:hoverGuide 是模块级 reactive 导入,不属于组件实例,
|
|
53
|
+
// Options API 的字符串监听路径 'hoverGuide.el' 会相对 this 解析而失效,
|
|
54
|
+
// 必须改用命令式 watch(getter) 才能正确监听目标元素变化。
|
|
55
|
+
this._stopWatch = watch(
|
|
56
|
+
() => hoverGuide.el,
|
|
57
|
+
() => {
|
|
58
|
+
this.bindTarget()
|
|
59
|
+
this.schedule()
|
|
60
|
+
},
|
|
61
|
+
)
|
|
62
|
+
},
|
|
63
|
+
mounted() {
|
|
64
|
+
this._onScroll = () => this.schedule()
|
|
65
|
+
this._onResize = () => this.schedule()
|
|
66
|
+
// 滚动(含嵌套滚动)与窗口缩放都可能改变元素视口位置,重算即可,
|
|
67
|
+
// 因坐标基于 content 且覆盖层随滚动容器移动,重算值本身稳定,开销很小。
|
|
68
|
+
document.addEventListener('scroll', this._onScroll, { passive: true, capture: true })
|
|
69
|
+
window.addEventListener('resize', this._onResize)
|
|
70
|
+
this.bindTarget()
|
|
71
|
+
this.schedule()
|
|
72
|
+
},
|
|
73
|
+
beforeUnmount() {
|
|
74
|
+
document.removeEventListener('scroll', this._onScroll, { capture: true })
|
|
75
|
+
window.removeEventListener('resize', this._onResize)
|
|
76
|
+
if (this._stopWatch) { this._stopWatch(); this._stopWatch = null }
|
|
77
|
+
if (this._ro) { this._ro.disconnect(); this._ro = null }
|
|
78
|
+
if (this._raf) cancelAnimationFrame(this._raf)
|
|
79
|
+
},
|
|
80
|
+
methods: {
|
|
81
|
+
/** 把 ResizeObserver 绑定到当前目标元素,元素自身尺寸变化(编辑文本/改样式)时自动重算 */
|
|
82
|
+
bindTarget() {
|
|
83
|
+
if (this._ro) { this._ro.disconnect(); this._ro = null }
|
|
84
|
+
const el = hoverGuide.el
|
|
85
|
+
if (!el || typeof ResizeObserver === 'undefined') return
|
|
86
|
+
this._ro = new ResizeObserver(() => this.schedule())
|
|
87
|
+
this._ro.observe(el)
|
|
88
|
+
},
|
|
89
|
+
/** rAF 批处理,避免一帧内多次重算 */
|
|
90
|
+
schedule() {
|
|
91
|
+
if (this._raf) return
|
|
92
|
+
this._raf = requestAnimationFrame(() => {
|
|
93
|
+
this._raf = 0
|
|
94
|
+
this.recompute()
|
|
95
|
+
})
|
|
96
|
+
},
|
|
97
|
+
recompute() {
|
|
98
|
+
const el = hoverGuide.el
|
|
99
|
+
if (!el || !hoverGuide.visible) return
|
|
100
|
+
const container = el.closest('.phone__screen')
|
|
101
|
+
// 目标元素已脱离文档(如切换卡片后旧的 RenderTree 被卸载):自动隐藏,避免残留
|
|
102
|
+
if (!container) {
|
|
103
|
+
hoverGuide.visible = false
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
const cRect = container.getBoundingClientRect()
|
|
107
|
+
const eRect = el.getBoundingClientRect()
|
|
108
|
+
// content 坐标:减屏幕视口偏移 + 加屏幕滚动量(抵消滚动,使参考线粘在元素上)
|
|
109
|
+
const left = eRect.left - cRect.left + container.scrollLeft
|
|
110
|
+
const top = eRect.top - cRect.top + container.scrollTop
|
|
111
|
+
const width = eRect.width
|
|
112
|
+
const height = eRect.height
|
|
113
|
+
this.box = { left, top, right: left + width, bottom: top + height }
|
|
114
|
+
// 贯穿尺寸:竖线高 = 画布内容全高(scrollHeight),横线宽 = 画布内容全宽(clientWidth)
|
|
115
|
+
this.containerStyle = {
|
|
116
|
+
width: container.clientWidth + 'px',
|
|
117
|
+
height: container.scrollHeight + 'px',
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
}
|
|
122
|
+
</script>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!-- 官方 module 1990 / 508:有内联 svg 源码走 SvgCode,否则从 sprite 取 -->
|
|
2
|
+
<template>
|
|
3
|
+
<span class="ce_icon" :style="styleObj" @click="$emit('click', $event)">
|
|
4
|
+
<svg-code v-if="content && content.trim()" :color="color" :content="content" />
|
|
5
|
+
<svg-symbols v-else :color="color" :icon="icon" />
|
|
6
|
+
</span>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<script>
|
|
10
|
+
import StyleParser from '../runtime/StyleParser.js'
|
|
11
|
+
import SvgSymbols from './SvgSymbols.vue'
|
|
12
|
+
import SvgCode from './SvgCode.vue'
|
|
13
|
+
import base from './base.js'
|
|
14
|
+
|
|
15
|
+
export default {
|
|
16
|
+
name: 'CeIcon',
|
|
17
|
+
// 必须声明 emits:否则父级传入的 onClick 会同时作为原生监听透传到根元素
|
|
18
|
+
// 且被 $emit 再次调用,导致 handler 双触发(折叠 toggle 会被第二次改回去)
|
|
19
|
+
emits: ['click'],
|
|
20
|
+
mixins: [base],
|
|
21
|
+
components: { SvgSymbols, SvgCode },
|
|
22
|
+
props: {
|
|
23
|
+
styleProps: { type: Object, default: () => ({}) },
|
|
24
|
+
icon: { type: String, default: '' },
|
|
25
|
+
color: { type: String, default: '' },
|
|
26
|
+
content: { type: String, default: '' },
|
|
27
|
+
},
|
|
28
|
+
computed: {
|
|
29
|
+
styleObj() {
|
|
30
|
+
return new StyleParser(this, this.styleProps).parse()
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
</script>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!-- 官方 module 1968 / 498:外层控尺寸,内层 div 用 background-image 填充 -->
|
|
2
|
+
<template>
|
|
3
|
+
<div class="ce_image" :style="styleObj" @click="$emit('click', $event)">
|
|
4
|
+
<div class="ce_image_fill" :style="fillStyleObj" />
|
|
5
|
+
</div>
|
|
6
|
+
</template>
|
|
7
|
+
|
|
8
|
+
<script>
|
|
9
|
+
import StyleParser from '../runtime/StyleParser.js'
|
|
10
|
+
import { DEFAULT_IMAGE_URL } from '../runtime/assets.js'
|
|
11
|
+
import base from './base.js'
|
|
12
|
+
|
|
13
|
+
export default {
|
|
14
|
+
name: 'CeImage',
|
|
15
|
+
emits: ['click'],
|
|
16
|
+
mixins: [base],
|
|
17
|
+
props: {
|
|
18
|
+
styleProps: { type: Object, default: () => ({}) },
|
|
19
|
+
value: { type: [String, Number], default: '' },
|
|
20
|
+
},
|
|
21
|
+
computed: {
|
|
22
|
+
styleObj() {
|
|
23
|
+
return new StyleParser(this, this.styleProps).parse()
|
|
24
|
+
},
|
|
25
|
+
fillStyleObj() {
|
|
26
|
+
const out = {}
|
|
27
|
+
new StyleParser(this, this.styleProps).parseImage(this.styleProps.image || {}, out)
|
|
28
|
+
const src = this.adapter.doReplaceUrl(this.doI18n(this.value || DEFAULT_IMAGE_URL))
|
|
29
|
+
out.backgroundImage = `url(${src})`
|
|
30
|
+
return out
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
</script>
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<!-- 官方 module 1973 / 500 -->
|
|
2
|
+
<template>
|
|
3
|
+
<input
|
|
4
|
+
class="ce_input"
|
|
5
|
+
:style="styleObj"
|
|
6
|
+
:type="type"
|
|
7
|
+
:placeholder="doI18n(placeholder)"
|
|
8
|
+
:maxlength="maxLength"
|
|
9
|
+
:value="inputValue"
|
|
10
|
+
@input="$emit('input', $event.target.value)"
|
|
11
|
+
@change="$emit('change')"
|
|
12
|
+
/>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<script>
|
|
16
|
+
import StyleParser from '../runtime/StyleParser.js'
|
|
17
|
+
import base from './base.js'
|
|
18
|
+
|
|
19
|
+
export default {
|
|
20
|
+
name: 'CeInput',
|
|
21
|
+
emits: ['input', 'change'],
|
|
22
|
+
mixins: [base],
|
|
23
|
+
props: {
|
|
24
|
+
styleProps: { type: Object, default: () => ({}) },
|
|
25
|
+
value: { type: [String, Number], default: '' },
|
|
26
|
+
placeholder: { type: [String, Number], default: '' },
|
|
27
|
+
inputType: { type: String, default: '' },
|
|
28
|
+
maxLength: { type: [String, Number], default: '' },
|
|
29
|
+
},
|
|
30
|
+
data() {
|
|
31
|
+
return {
|
|
32
|
+
typeMap: {
|
|
33
|
+
text: 'text',
|
|
34
|
+
number: 'text',
|
|
35
|
+
email: 'text',
|
|
36
|
+
password: 'password',
|
|
37
|
+
phone: 'text',
|
|
38
|
+
},
|
|
39
|
+
regexpMap: {
|
|
40
|
+
number: /^-?([0-9]*|(0|[1-9][0-9]*)\.[0-9]{0,})?$/i,
|
|
41
|
+
email: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
|
|
42
|
+
phone: /^[0-9]{11}$/,
|
|
43
|
+
},
|
|
44
|
+
inputValue: '',
|
|
45
|
+
oldValue: '',
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
created() {
|
|
49
|
+
this.inputValue = this.value
|
|
50
|
+
this.oldValue = this.inputValue
|
|
51
|
+
},
|
|
52
|
+
computed: {
|
|
53
|
+
type() {
|
|
54
|
+
return this.typeMap[this.inputType]
|
|
55
|
+
},
|
|
56
|
+
styleObj() {
|
|
57
|
+
const parser = new StyleParser(this, this.styleProps)
|
|
58
|
+
const out = parser.parse()
|
|
59
|
+
parser.parseFont(this.styleProps.font || {}, out)
|
|
60
|
+
// 官方是 Object.assign({padding}, out),样式里显式写了 padding 则以样式为准
|
|
61
|
+
return Object.assign(
|
|
62
|
+
{ padding: `${this.adapter.doSize(4)} ${this.adapter.doSize(8)}` },
|
|
63
|
+
out
|
|
64
|
+
)
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
watch: {
|
|
68
|
+
value() {
|
|
69
|
+
this.inputValue = this.value
|
|
70
|
+
this.oldValue = this.inputValue
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
methods: {
|
|
74
|
+
/**
|
|
75
|
+
* 官方 script 里定义了 doInput 做格式校验,但模板上绑的是直接 $emit("input"),
|
|
76
|
+
* 这个方法其实没被接线。保留原样以维持行为一致(输入框是非受控的,
|
|
77
|
+
* 只有外部 value 变化时才会回写 DOM)。
|
|
78
|
+
*/
|
|
79
|
+
doInput(v) {
|
|
80
|
+
const re = this.regexpMap[this.inputType]
|
|
81
|
+
if (!re || re.test(v)) {
|
|
82
|
+
this.$emit('input', v)
|
|
83
|
+
this.inputValue = v
|
|
84
|
+
} else {
|
|
85
|
+
this.inputValue = this.oldValue
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
}
|
|
90
|
+
</script>
|