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.
Files changed (167) hide show
  1. package/README.md +211 -0
  2. package/dist/cli.js +76 -0
  3. package/dist/config.js +63 -0
  4. package/dist/core.js +2 -0
  5. package/dist/preview-editor/assets/apple-touch-icon-BQcES9QK.png +0 -0
  6. package/dist/preview-editor/assets/default-image-wzZYQ86K.png +0 -0
  7. package/dist/preview-editor/assets/favicon-16-Cg6Nrosk.png +0 -0
  8. package/dist/preview-editor/assets/favicon-32-B_1744sp.png +0 -0
  9. package/dist/preview-editor/assets/index-BYB0hngG.js +72 -0
  10. package/dist/preview-editor/assets/index-CpBZEQDy.css +1 -0
  11. package/dist/preview-editor/assets/site-icon-CFMif8z4.png +0 -0
  12. package/dist/preview-editor/assets/svg-symbols-B2exBrAr.svg +118 -0
  13. package/dist/preview-editor/index.html +17 -0
  14. package/dist/server-core/_vendor/finmall-env.mjs +96 -0
  15. package/dist/server-core/assetProxy.js +154 -0
  16. package/dist/server-core/bbox.js +153 -0
  17. package/dist/server-core/browser.js +108 -0
  18. package/dist/server-core/buildDataFromSchema.js +50 -0
  19. package/dist/server-core/cardFiles.js +188 -0
  20. package/dist/server-core/cardHistory.js +156 -0
  21. package/dist/server-core/cardImage.js +85 -0
  22. package/dist/server-core/cardImportMeta.js +139 -0
  23. package/dist/server-core/cardListCache.js +68 -0
  24. package/dist/server-core/cardOpenFolder.js +135 -0
  25. package/dist/server-core/cardSave.js +127 -0
  26. package/dist/server-core/cardSidecar.js +72 -0
  27. package/dist/server-core/cardSync.js +259 -0
  28. package/dist/server-core/cardValidate.js +134 -0
  29. package/dist/server-core/index.js +82 -0
  30. package/dist/server-core/logger.js +241 -0
  31. package/dist/server-core/nodeModels.js +52 -0
  32. package/dist/server-core/renderStatus.js +207 -0
  33. package/dist/server-core/screenshot.js +123 -0
  34. package/dist/server-core/sliceStatic.js +44 -0
  35. package/dist/standalone.js +447 -0
  36. package/dist/vendored/App.vue +2330 -0
  37. package/dist/vendored/api.js +142 -0
  38. package/dist/vendored/assets/apple-touch-icon.png +0 -0
  39. package/dist/vendored/assets/default-image.png +0 -0
  40. package/dist/vendored/assets/favicon-16.png +0 -0
  41. package/dist/vendored/assets/favicon-32.png +0 -0
  42. package/dist/vendored/assets/logo.png +0 -0
  43. package/dist/vendored/assets/site-icon.png +0 -0
  44. package/dist/vendored/assets/svg-symbols.svg +118 -0
  45. package/dist/vendored/assets/svgIcons/icons.svg +54 -0
  46. package/dist/vendored/assets/svgIcons/index.js +39 -0
  47. package/dist/vendored/components/AbsoluteLayout.vue +42 -0
  48. package/dist/vendored/components/AlertCardInstance.vue +58 -0
  49. package/dist/vendored/components/AlertCardLayer.vue +59 -0
  50. package/dist/vendored/components/ApiPayloadTree.vue +168 -0
  51. package/dist/vendored/components/AppToast.vue +37 -0
  52. package/dist/vendored/components/Button.vue +37 -0
  53. package/dist/vendored/components/Canvas.vue +65 -0
  54. package/dist/vendored/components/CardGallery.vue +243 -0
  55. package/dist/vendored/components/CardPreview.vue +72 -0
  56. package/dist/vendored/components/CardSelect.vue +200 -0
  57. package/dist/vendored/components/CheckGroup.vue +131 -0
  58. package/dist/vendored/components/Column.vue +25 -0
  59. package/dist/vendored/components/ComponentPalette.vue +294 -0
  60. package/dist/vendored/components/ConfirmDialog.vue +39 -0
  61. package/dist/vendored/components/CustomPlaceholder.vue +33 -0
  62. package/dist/vendored/components/DatePickerOverlay.vue +345 -0
  63. package/dist/vendored/components/DebugPanel.vue +806 -0
  64. package/dist/vendored/components/DeviceOverlay.vue +70 -0
  65. package/dist/vendored/components/Divider.vue +22 -0
  66. package/dist/vendored/components/Dropdown.vue +191 -0
  67. package/dist/vendored/components/EventEditor.vue +247 -0
  68. package/dist/vendored/components/GridLayout.vue +67 -0
  69. package/dist/vendored/components/HoverGuides.vue +122 -0
  70. package/dist/vendored/components/Icon.vue +34 -0
  71. package/dist/vendored/components/Image.vue +34 -0
  72. package/dist/vendored/components/Input.vue +90 -0
  73. package/dist/vendored/components/JsonTree.vue +516 -0
  74. package/dist/vendored/components/ListLayout.vue +68 -0
  75. package/dist/vendored/components/LogValue.vue +51 -0
  76. package/dist/vendored/components/Map.vue +110 -0
  77. package/dist/vendored/components/MultiColumn.vue +49 -0
  78. package/dist/vendored/components/MultiText.vue +58 -0
  79. package/dist/vendored/components/NodeInspector.vue +295 -0
  80. package/dist/vendored/components/PickerOverlay.vue +131 -0
  81. package/dist/vendored/components/ProgressSlider.vue +167 -0
  82. package/dist/vendored/components/PropControl.vue +241 -0
  83. package/dist/vendored/components/PropTree.vue +128 -0
  84. package/dist/vendored/components/RadioButton.vue +74 -0
  85. package/dist/vendored/components/RemotePreview.vue +171 -0
  86. package/dist/vendored/components/RenderTree.vue +437 -0
  87. package/dist/vendored/components/Root.vue +30 -0
  88. package/dist/vendored/components/Row.vue +25 -0
  89. package/dist/vendored/components/SelectionOverlay.vue +105 -0
  90. package/dist/vendored/components/StructureTree.vue +949 -0
  91. package/dist/vendored/components/SvgCode.vue +19 -0
  92. package/dist/vendored/components/SvgSymbols.vue +30 -0
  93. package/dist/vendored/components/Switch.vue +38 -0
  94. package/dist/vendored/components/Text.vue +32 -0
  95. package/dist/vendored/components/Video.vue +70 -0
  96. package/dist/vendored/components/ViewContainer.vue +52 -0
  97. package/dist/vendored/components/base.js +12 -0
  98. package/dist/vendored/components/icons.js +47 -0
  99. package/dist/vendored/components/index.js +58 -0
  100. package/dist/vendored/components/setters/SetBgPosition.vue +64 -0
  101. package/dist/vendored/components/setters/SetBgSize.vue +90 -0
  102. package/dist/vendored/components/setters/SetCode.vue +90 -0
  103. package/dist/vendored/components/setters/SetColor.vue +244 -0
  104. package/dist/vendored/components/setters/SetCustomSelect.vue +58 -0
  105. package/dist/vendored/components/setters/SetExpr.vue +107 -0
  106. package/dist/vendored/components/setters/SetGradient.vue +125 -0
  107. package/dist/vendored/components/setters/SetGrid9.vue +68 -0
  108. package/dist/vendored/components/setters/SetIconSelect.vue +67 -0
  109. package/dist/vendored/components/setters/SetIfForm.vue +61 -0
  110. package/dist/vendored/components/setters/SetImage.vue +43 -0
  111. package/dist/vendored/components/setters/SetList.vue +139 -0
  112. package/dist/vendored/components/setters/SetNumber.vue +118 -0
  113. package/dist/vendored/components/setters/SetNumberStyle.vue +113 -0
  114. package/dist/vendored/components/setters/SetPadding.vue +77 -0
  115. package/dist/vendored/components/setters/SetSegment.vue +160 -0
  116. package/dist/vendored/components/setters/SetSelect.vue +51 -0
  117. package/dist/vendored/components/setters/SetSwitch.vue +49 -0
  118. package/dist/vendored/components/setters/SetText.vue +52 -0
  119. package/dist/vendored/components/setters/props.js +23 -0
  120. package/dist/vendored/fidelity/baseline-messageOverview.json +87 -0
  121. package/dist/vendored/fidelity/calibration.json +29 -0
  122. package/dist/vendored/fidelity/fidelity-messageOverview-after.html +114 -0
  123. package/dist/vendored/fidelity/fidelity-messageOverview-after.json +272 -0
  124. package/dist/vendored/fidelity/fidelity-messageOverview.html +185 -0
  125. package/dist/vendored/fidelity/fidelity-messageOverview.json +336 -0
  126. package/dist/vendored/fidelity/fidelity-messageOverview_v2.html +262 -0
  127. package/dist/vendored/fidelity/fidelity-messageOverview_v2.json +502 -0
  128. package/dist/vendored/fidelity/fidelity-messageOverview_v3.html +201 -0
  129. package/dist/vendored/fidelity/fidelity-messageOverview_v3.json +417 -0
  130. package/dist/vendored/fidelity/fidelity-messageOverview_visual.html +125 -0
  131. package/dist/vendored/fidelity/fidelity-messageOverview_visual.json +338 -0
  132. package/dist/vendored/index.html +16 -0
  133. package/dist/vendored/main.js +36 -0
  134. package/dist/vendored/meta/action-meta.json +141 -0
  135. package/dist/vendored/meta/component-meta.json +2714 -0
  136. package/dist/vendored/meta/directive-meta.json +40 -0
  137. package/dist/vendored/meta/style-meta.json +1086 -0
  138. package/dist/vendored/runtime/StyleParser.js +179 -0
  139. package/dist/vendored/runtime/adapter.js +166 -0
  140. package/dist/vendored/runtime/alert-card.js +125 -0
  141. package/dist/vendored/runtime/app-toast.js +33 -0
  142. package/dist/vendored/runtime/assets.js +16 -0
  143. package/dist/vendored/runtime/canvas-context.js +141 -0
  144. package/dist/vendored/runtime/card-runtime.js +289 -0
  145. package/dist/vendored/runtime/clipboard-node.js +83 -0
  146. package/dist/vendored/runtime/clipboard.js +29 -0
  147. package/dist/vendored/runtime/evaluate.js +152 -0
  148. package/dist/vendored/runtime/event-model.js +300 -0
  149. package/dist/vendored/runtime/hoverGuide.js +31 -0
  150. package/dist/vendored/runtime/jsapi-mock.js +256 -0
  151. package/dist/vendored/runtime/node-model.js +217 -0
  152. package/dist/vendored/runtime/property.js +364 -0
  153. package/dist/vendored/runtime/selectionOverlay.js +53 -0
  154. package/dist/vendored/runtime/toPreview.js +648 -0
  155. package/dist/vendored/standalone-main.js +36 -0
  156. package/dist/vendored/standalone.html +12 -0
  157. package/dist/vendored/styles/app.css +2565 -0
  158. package/dist/vendored/styles/card-gallery.css +234 -0
  159. package/dist/vendored/styles/card-select.css +281 -0
  160. package/dist/vendored/styles/components.css +383 -0
  161. package/dist/vendored/styles/dropdown.css +337 -0
  162. package/dist/vendored/styles/json-tree.css +308 -0
  163. package/dist/vendored/styles/node-inspector.css +1003 -0
  164. package/dist/vendored/styles/setters.css +962 -0
  165. package/dist/vendored/styles/standalone.css +27 -0
  166. package/dist/vendored/styles/structure-tree.css +320 -0
  167. 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>