@jzg223/design-runtime 0.0.1 → 0.1.0-rc.2
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/CHANGELOG.md +18 -0
- package/README.md +52 -0
- package/dist/board/api.js +57 -0
- package/dist/board/board-chart.vue.js +7 -0
- package/dist/board/board-chart2.vue.js +93 -0
- package/dist/board/context.js +15 -0
- package/dist/board/datav-map.js +66 -0
- package/dist/board/design-board.vue.js +172 -0
- package/dist/board/design-board2.vue.js +331 -0
- package/dist/board/echarts.js +40 -0
- package/dist/board/part-node.vue.js +63 -0
- package/dist/board/part-node2.vue.js +125 -0
- package/dist/board/part-renderer.vue.js +561 -0
- package/dist/board/part-renderer2.vue.js +884 -0
- package/dist/board/theme-host.js +129 -0
- package/dist/board-engine/asset.js +32 -0
- package/dist/board-engine/chart-option.js +377 -0
- package/dist/board-engine/data-hub.js +67 -0
- package/dist/board-engine/datav-meta.js +51 -0
- package/dist/board-engine/i18n.js +130 -0
- package/dist/board-engine/param-catalog.js +137 -0
- package/dist/board-engine/params.js +61 -0
- package/dist/board-engine/render-model.js +65 -0
- package/dist/board-engine/schema.js +856 -0
- package/dist/board-engine/theme-manifest.js +19 -0
- package/dist/board-engine/version.js +4 -0
- package/dist/host.js +6 -1
- package/dist/index.js +172 -24
- package/dist/style.css +1067 -0
- package/dist/types/board/api.d.ts +45 -0
- package/dist/types/board/board-chart.vue.d.ts +15 -0
- package/dist/types/board/context.d.ts +29 -0
- package/dist/types/board/datav-map.d.ts +24 -0
- package/dist/types/board/design-board.vue.d.ts +1409 -0
- package/dist/types/board/echarts.d.ts +25 -0
- package/dist/types/board/part-node.vue.d.ts +1237 -0
- package/dist/types/board/part-renderer.vue.d.ts +1205 -0
- package/dist/types/board/theme-host.d.ts +41 -0
- package/dist/types/board-engine/asset.d.ts +37 -0
- package/dist/types/board-engine/chart-option.d.ts +737 -0
- package/dist/types/board-engine/data-hub.d.ts +48 -0
- package/dist/types/board-engine/datav-meta.d.ts +37 -0
- package/dist/types/board-engine/i18n.d.ts +43 -0
- package/dist/types/board-engine/index.d.ts +25 -0
- package/dist/types/board-engine/param-catalog.d.ts +82 -0
- package/dist/types/board-engine/params.d.ts +37 -0
- package/dist/types/board-engine/render-model.d.ts +87 -0
- package/dist/types/board-engine/schema.d.ts +513 -0
- package/dist/types/board-engine/theme-manifest.d.ts +23 -0
- package/dist/types/board-engine/types.d.ts +147 -0
- package/dist/types/board-engine/version.d.ts +10 -0
- package/dist/types/host.d.ts +21 -0
- package/dist/types/index.d.ts +21 -2
- package/package.json +21 -4
package/dist/style.css
CHANGED
|
@@ -22,6 +22,77 @@
|
|
|
22
22
|
padding: 32px 0;
|
|
23
23
|
color: var(--design-platform-muted);
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* 主题变量的**应用级兜底**(:root 上的默认值)。
|
|
27
|
+
*
|
|
28
|
+
* 为什么要有它:主题是"外部文件"(public/theme/*.css,发布后还能替换/遗漏)。
|
|
29
|
+
* 万一 theme 目录没部署、或某个自定义主题只写了一部分变量,看板必须还能"看得清",
|
|
30
|
+
* 而不是白屏/透明一片。这里的值刻意朴素(单一深蓝底 + 白字 + 8 色调色板)。
|
|
31
|
+
*
|
|
32
|
+
* 优先级(由低到高):本文件(:root) < 主题 CSS([data-board-theme="x"],挂在舞台元素上) < 部件级配置(内联样式)
|
|
33
|
+
* —— CSS 变量的继承规则天然如此:**离元素更近的声明赢**,所以舞台上的主题值会盖住这里的默认值。
|
|
34
|
+
*/
|
|
35
|
+
:root {
|
|
36
|
+
--brd-scheme: dark;
|
|
37
|
+
|
|
38
|
+
--brd-bg: #070c18;
|
|
39
|
+
--brd-decor: none;
|
|
40
|
+
|
|
41
|
+
/* 布局部件(容器)的面板:主题没给就退成"半透明深蓝 + 轻投影" */
|
|
42
|
+
--brd-panel-bg: rgba(10, 22, 42, 0.9);
|
|
43
|
+
--brd-panel-shadow: 0 8px 18px 0 rgba(0, 0, 0, 0.35);
|
|
44
|
+
|
|
45
|
+
/* 内容部件(非容器)的内边距:与内置主题保持一致,主题没给也不会贴边 */
|
|
46
|
+
--brd-body-pad: 15px;
|
|
47
|
+
--brd-watermark: rgba(255, 255, 255, 0.07);
|
|
48
|
+
|
|
49
|
+
--brd-text: #eaf2ff;
|
|
50
|
+
--brd-sub: rgba(200, 216, 240, 0.72);
|
|
51
|
+
--brd-line: rgba(140, 170, 220, 0.18);
|
|
52
|
+
/* 表格线:行线与表头线同源,"要么都有、要么都没有" */
|
|
53
|
+
--brd-table-line-w: 1px;
|
|
54
|
+
--brd-table-line: rgba(140, 170, 220, 0.28);
|
|
55
|
+
--brd-table-head-line: var(--brd-table-line);
|
|
56
|
+
--brd-table-col-line: 0 none;
|
|
57
|
+
--brd-head: rgba(255, 255, 255, 0.045);
|
|
58
|
+
--brd-hover: rgba(140, 170, 220, 0.1);
|
|
59
|
+
--brd-stripe: rgba(140, 170, 220, 0.045);
|
|
60
|
+
|
|
61
|
+
--brd-accent: #4d8dff;
|
|
62
|
+
--brd-accent2: #22d3ee;
|
|
63
|
+
--brd-glow: rgba(77, 141, 255, 0.5);
|
|
64
|
+
--brd-glow-soft: rgba(77, 141, 255, 0.12);
|
|
65
|
+
--brd-top: rgba(150, 205, 255, 0.8);
|
|
66
|
+
--brd-num-glow: none;
|
|
67
|
+
--brd-chip: rgba(10, 22, 42, 0.92);
|
|
68
|
+
--brd-radius: 0px;
|
|
69
|
+
|
|
70
|
+
--brd-tooltip-bg: rgba(9, 17, 31, 0.94);
|
|
71
|
+
--brd-tooltip-border: rgba(96, 150, 232, 0.32);
|
|
72
|
+
|
|
73
|
+
/* 运行时工具栏(右上角那条):兜底按深色主题给 */
|
|
74
|
+
--brd-toolbar-bg: rgba(20, 32, 50, 0.55);
|
|
75
|
+
--brd-toolbar-border: rgba(120, 170, 230, 0.25);
|
|
76
|
+
--brd-toolbar-text: #cfe3ff;
|
|
77
|
+
--brd-toolbar-input-bg: rgba(10, 20, 34, 0.6);
|
|
78
|
+
--brd-toolbar-show: rgba(200, 220, 255, 0.35);
|
|
79
|
+
|
|
80
|
+
/* DataV 边框配色:第二条默认 transparent(关掉"沿边流动的光带",四条边才一致) */
|
|
81
|
+
--brd-frame-1: var(--brd-accent);
|
|
82
|
+
--brd-frame-2: var(--brd-accent2);
|
|
83
|
+
/* DataV 装饰部件配色:保持双色 */
|
|
84
|
+
--brd-deco-1: var(--brd-accent);
|
|
85
|
+
--brd-deco-2: var(--brd-accent2);
|
|
86
|
+
|
|
87
|
+
--brd-chart-1: #4d8dff;
|
|
88
|
+
--brd-chart-2: #22d3ee;
|
|
89
|
+
--brd-chart-3: #a78bfa;
|
|
90
|
+
--brd-chart-4: #fbbf24;
|
|
91
|
+
--brd-chart-5: #fb7185;
|
|
92
|
+
--brd-chart-6: #34d399;
|
|
93
|
+
--brd-chart-7: #38bdf8;
|
|
94
|
+
--brd-chart-8: #f472b6;
|
|
95
|
+
}
|
|
25
96
|
|
|
26
97
|
.embed-list[data-v-0524a510] {
|
|
27
98
|
width: 100%;
|
|
@@ -214,6 +285,1002 @@
|
|
|
214
285
|
color: rgba(0, 0, 0, 0.45);
|
|
215
286
|
}
|
|
216
287
|
|
|
288
|
+
.drb-chart[data-v-ab9edc2c] {
|
|
289
|
+
position: relative;
|
|
290
|
+
width: 100%;
|
|
291
|
+
height: 100%;
|
|
292
|
+
min-height: 0;
|
|
293
|
+
}
|
|
294
|
+
.drb-chart__error[data-v-ab9edc2c] {
|
|
295
|
+
display: flex;
|
|
296
|
+
align-items: center;
|
|
297
|
+
justify-content: center;
|
|
298
|
+
height: 100%;
|
|
299
|
+
padding: 8px;
|
|
300
|
+
font-size: 12px;
|
|
301
|
+
line-height: 1.5;
|
|
302
|
+
text-align: center;
|
|
303
|
+
color: #ff9f9f;
|
|
304
|
+
background: rgba(255, 80, 80, 0.08);
|
|
305
|
+
}
|
|
306
|
+
.part-body[data-v-16075a7b] {
|
|
307
|
+
width: 100%;
|
|
308
|
+
height: 100%;
|
|
309
|
+
overflow: hidden;
|
|
310
|
+
position: relative;
|
|
311
|
+
/* 内边距不在元素上写死,也不在 JS 里内联:值来自主题变量 --brd-body-pad(兜底见 src/styles/theme-fallback.css),
|
|
312
|
+
而且**只给卡片类部件**(见下面 .has-body-pad)。box-sizing 必须是 border-box,
|
|
313
|
+
否则 width:100% + padding 会撑出父框 30px。 */
|
|
314
|
+
box-sizing: border-box;
|
|
315
|
+
}
|
|
316
|
+
/* 卡片类部件(kpi/图表/表格/交叉表/进度/筛选)才吃主题的内容内边距:
|
|
317
|
+
文本、播报、按钮、图片、视频、web元素、装饰都不吃(它们要么只有一行字,要么本来就该铺满) */
|
|
318
|
+
.part-body.has-body-pad[data-v-16075a7b] {
|
|
319
|
+
padding: var(--brd-body-pad, 0px);
|
|
320
|
+
}
|
|
321
|
+
/* 边框/容器:标题要骑在框线上,不能裁切(见 bodyClass 注释) */
|
|
322
|
+
.part-body.ov-visible[data-v-16075a7b] {
|
|
323
|
+
overflow: visible;
|
|
324
|
+
}
|
|
325
|
+
/* ---------------------------------------------------------------------------
|
|
326
|
+
布局部件(容器)的面板:**底色与投影取自主题变量**(public/theme/*.css 的 --brd-panel-bg /
|
|
327
|
+
--brd-panel-shadow,兜底值在 src/styles/theme-fallback.css)。
|
|
328
|
+
这样"换个主题 = 全看板的容器样式一起变",不需要每个部件单独设置;
|
|
329
|
+
某个容器想跟主题不一样时,在部件设置里显式配底色/投影(内联样式优先于这里)。
|
|
330
|
+
|
|
331
|
+
其余装饰(科技感):两个开关各自独立(部件设置 → 装饰)
|
|
332
|
+
dec-glass = 上沿一道渐变高光 + 内侧一圈微光(面板"浮起来")
|
|
333
|
+
dec-corner = 四角切角(8 条 1px 渐变拼出 4 个 L 形,不额外加 DOM)
|
|
334
|
+
⚠️ 只给容器(.is-panel);数据类部件不画这些(规范见 schema.js 的 CONTAINER_DECOR)。
|
|
335
|
+
⚠️ 必须 pointer-events:none —— 否则会挡住子部件的点击/拖拽。
|
|
336
|
+
⚠️ 装饰用伪元素叠上去,面板底色是元素自身的 background(在伪元素之下)。
|
|
337
|
+
--------------------------------------------------------------------------- */
|
|
338
|
+
.part-body.is-panel[data-v-16075a7b] {
|
|
339
|
+
background: var(--brd-panel-bg, transparent);
|
|
340
|
+
box-shadow: var(--brd-panel-shadow, none);
|
|
341
|
+
/* 容器本来就没有 has-body-pad 类,这里只是把话说明白:容器的内边距是它自己的配置 */
|
|
342
|
+
padding: 0;
|
|
343
|
+
/* 内容压在装饰之上 */
|
|
344
|
+
/* DataV 边框:铺满整块、不吃事件;它的 SVG 自己会按父容器尺寸自适应 */
|
|
345
|
+
/* ---- 边框预设 1:四角 L 形括号(默认,最轻)---- */
|
|
346
|
+
/* ---- 边框预设 2:切角描边(DataV border-box 的味道)----
|
|
347
|
+
4 条直边(去掉两端的切角长度)+ 4 个 45° 斜线,全部用 1px 渐变拼出来,不引 SVG/DOM。
|
|
348
|
+
切角长度固定 16px,所以面板宽窄变化时斜角大小不变(用 SVG + preserveAspectRatio 会变形)。 */
|
|
349
|
+
/* ---- 边框预设 3:整圈细描边 + 沿上边流动的光带 ---- */
|
|
350
|
+
/* 流光:一条 30% 宽的高光沿上边来回跑(纯 CSS,别用 JS 定时器去改样式) */
|
|
351
|
+
}
|
|
352
|
+
.part-body.is-panel[data-v-16075a7b] > * {
|
|
353
|
+
position: relative;
|
|
354
|
+
z-index: 1;
|
|
355
|
+
}
|
|
356
|
+
.part-body.is-panel > .datav-frame[data-v-16075a7b] {
|
|
357
|
+
position: absolute;
|
|
358
|
+
inset: 0;
|
|
359
|
+
z-index: 0;
|
|
360
|
+
pointer-events: none;
|
|
361
|
+
}
|
|
362
|
+
.part-body.is-panel.dec-glass[data-v-16075a7b]::before {
|
|
363
|
+
content: '';
|
|
364
|
+
position: absolute;
|
|
365
|
+
inset: 0;
|
|
366
|
+
z-index: 0;
|
|
367
|
+
pointer-events: none;
|
|
368
|
+
background: linear-gradient(90deg, transparent 0%, var(--brd-top, #9cd) 22%, var(--brd-top, #9cd) 78%, transparent 100%) 0 0/100% 1px no-repeat, radial-gradient(120% 60% at 50% 0%, var(--brd-glow-soft, transparent) 0%, transparent 70%);
|
|
369
|
+
}
|
|
370
|
+
.part-body.is-panel.bd-corner[data-v-16075a7b]::after {
|
|
371
|
+
content: '';
|
|
372
|
+
position: absolute;
|
|
373
|
+
inset: 6px;
|
|
374
|
+
z-index: 0;
|
|
375
|
+
pointer-events: none;
|
|
376
|
+
opacity: 0.75;
|
|
377
|
+
background: linear-gradient(var(--brd-accent), var(--brd-accent)) left top / 14px 1px no-repeat, linear-gradient(var(--brd-accent), var(--brd-accent)) left top / 1px 14px no-repeat, linear-gradient(var(--brd-accent), var(--brd-accent)) right top / 14px 1px no-repeat, linear-gradient(var(--brd-accent), var(--brd-accent)) right top / 1px 14px no-repeat, linear-gradient(var(--brd-accent), var(--brd-accent)) left bottom / 14px 1px no-repeat, linear-gradient(var(--brd-accent), var(--brd-accent)) left bottom / 1px 14px no-repeat, linear-gradient(var(--brd-accent), var(--brd-accent)) right bottom / 14px 1px no-repeat, linear-gradient(var(--brd-accent), var(--brd-accent)) right bottom / 1px 14px no-repeat;
|
|
378
|
+
}
|
|
379
|
+
.part-body.is-panel.bd-cut[data-v-16075a7b]::after {
|
|
380
|
+
content: '';
|
|
381
|
+
position: absolute;
|
|
382
|
+
inset: 5px;
|
|
383
|
+
z-index: 0;
|
|
384
|
+
pointer-events: none;
|
|
385
|
+
--c: var(--brd-accent, #4d8dff);
|
|
386
|
+
--cut: 16px;
|
|
387
|
+
background: linear-gradient(var(--c), var(--c)) center top / calc(100% - var(--cut) * 2) 1px no-repeat, /* 下边 */ linear-gradient(var(--c), var(--c)) center bottom / calc(100% - var(--cut) * 2) 1px no-repeat, /* 左边 */ linear-gradient(var(--c), var(--c)) left center / 1px calc(100% - var(--cut) * 2) no-repeat, /* 右边 */ linear-gradient(var(--c), var(--c)) right center / 1px calc(100% - var(--cut) * 2) no-repeat, /* 四个 45° 斜切角(在小方块里画一条对角线) */ linear-gradient(45deg, transparent calc(50% - 0.5px), var(--c) calc(50% - 0.5px), var(--c) calc(50% + 0.5px), transparent calc(50% + 0.5px)) left top / var(--cut) var(--cut) no-repeat, linear-gradient(-45deg, transparent calc(50% - 0.5px), var(--c) calc(50% - 0.5px), var(--c) calc(50% + 0.5px), transparent calc(50% + 0.5px)) right top / var(--cut) var(--cut) no-repeat, linear-gradient(-45deg, transparent calc(50% - 0.5px), var(--c) calc(50% - 0.5px), var(--c) calc(50% + 0.5px), transparent calc(50% + 0.5px)) left bottom / var(--cut) var(--cut) no-repeat, linear-gradient(45deg, transparent calc(50% - 0.5px), var(--c) calc(50% - 0.5px), var(--c) calc(50% + 0.5px), transparent calc(50% + 0.5px)) right bottom / var(--cut) var(--cut) no-repeat;
|
|
388
|
+
}
|
|
389
|
+
.part-body.is-panel.bd-glow[data-v-16075a7b]::after {
|
|
390
|
+
content: '';
|
|
391
|
+
position: absolute;
|
|
392
|
+
inset: 0;
|
|
393
|
+
z-index: 0;
|
|
394
|
+
pointer-events: none;
|
|
395
|
+
border-radius: var(--brd-radius, 0px);
|
|
396
|
+
border: 1px solid var(--brd-accent, #4d8dff);
|
|
397
|
+
opacity: 0.55;
|
|
398
|
+
box-shadow: 0 0 18px -4px var(--brd-glow, transparent), inset 0 0 22px -10px var(--brd-glow, transparent);
|
|
399
|
+
}
|
|
400
|
+
.part-body.is-panel.bd-glow > .glass-run[data-v-16075a7b] {
|
|
401
|
+
position: absolute;
|
|
402
|
+
left: 0;
|
|
403
|
+
right: 0;
|
|
404
|
+
top: 0;
|
|
405
|
+
height: 2px;
|
|
406
|
+
z-index: 0;
|
|
407
|
+
pointer-events: none;
|
|
408
|
+
overflow: hidden;
|
|
409
|
+
}
|
|
410
|
+
.part-body.is-panel.bd-glow > .glass-run[data-v-16075a7b]::before {
|
|
411
|
+
content: '';
|
|
412
|
+
position: absolute;
|
|
413
|
+
top: 0;
|
|
414
|
+
left: -30%;
|
|
415
|
+
width: 30%;
|
|
416
|
+
height: 100%;
|
|
417
|
+
background: linear-gradient(90deg, transparent, var(--brd-top, #9cd), transparent);
|
|
418
|
+
animation: brd-run-16075a7b 4.5s linear infinite;
|
|
419
|
+
}
|
|
420
|
+
@keyframes brd-run-16075a7b {
|
|
421
|
+
0% {
|
|
422
|
+
left: -30%;
|
|
423
|
+
}
|
|
424
|
+
100% {
|
|
425
|
+
left: 100%;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
.part-empty[data-v-16075a7b] {
|
|
429
|
+
width: 100%;
|
|
430
|
+
height: 100%;
|
|
431
|
+
display: flex;
|
|
432
|
+
align-items: center;
|
|
433
|
+
justify-content: center;
|
|
434
|
+
color: var(--brd-sub, rgba(140, 150, 165, 0.9));
|
|
435
|
+
font-size: 12px;
|
|
436
|
+
letter-spacing: 0.04em;
|
|
437
|
+
text-align: center;
|
|
438
|
+
}
|
|
439
|
+
.kpi[data-v-16075a7b] {
|
|
440
|
+
height: 100%;
|
|
441
|
+
display: flex;
|
|
442
|
+
flex-direction: column;
|
|
443
|
+
justify-content: center;
|
|
444
|
+
gap: 6px;
|
|
445
|
+
}
|
|
446
|
+
/* 指标卡标题:过长要省略号,不能顶出卡片被硬切;前面挂一根发光小竖条(科技感) */
|
|
447
|
+
.kpi-title[data-v-16075a7b] {
|
|
448
|
+
white-space: nowrap;
|
|
449
|
+
overflow: hidden;
|
|
450
|
+
text-overflow: ellipsis;
|
|
451
|
+
display: flex;
|
|
452
|
+
align-items: center;
|
|
453
|
+
gap: 6px;
|
|
454
|
+
}
|
|
455
|
+
.kpi-title[data-v-16075a7b]::before {
|
|
456
|
+
content: '';
|
|
457
|
+
flex: 0 0 auto;
|
|
458
|
+
width: 3px;
|
|
459
|
+
height: 12px;
|
|
460
|
+
border-radius: 2px;
|
|
461
|
+
background: linear-gradient(180deg, var(--brd-accent2, #4d8dff), var(--brd-accent, #4d8dff));
|
|
462
|
+
box-shadow: 0 0 10px var(--brd-glow, transparent);
|
|
463
|
+
}
|
|
464
|
+
.kpi-value[data-v-16075a7b] {
|
|
465
|
+
display: flex;
|
|
466
|
+
align-items: baseline;
|
|
467
|
+
/* 大屏指标卡:数字要够大、字距收紧、等宽数字(翻页/刷新时不会左右跳)+ 辉光 */
|
|
468
|
+
}
|
|
469
|
+
.kpi-value .num[data-v-16075a7b] {
|
|
470
|
+
font-size: 38px;
|
|
471
|
+
line-height: 1.05;
|
|
472
|
+
letter-spacing: -0.01em;
|
|
473
|
+
text-shadow: var(--brd-num-glow, none);
|
|
474
|
+
}
|
|
475
|
+
.kpi-value .unit[data-v-16075a7b] {
|
|
476
|
+
margin-left: 6px;
|
|
477
|
+
font-size: 13px;
|
|
478
|
+
font-weight: 400;
|
|
479
|
+
opacity: 0.62;
|
|
480
|
+
}
|
|
481
|
+
.part-table-wrap[data-v-16075a7b] {
|
|
482
|
+
width: 100%;
|
|
483
|
+
height: 100%;
|
|
484
|
+
overflow: auto;
|
|
485
|
+
position: relative;
|
|
486
|
+
}
|
|
487
|
+
/* 表格右上角的导出按钮:悬停才明显,避免干扰大屏观感 */
|
|
488
|
+
.part-toolbar[data-v-16075a7b] {
|
|
489
|
+
position: absolute;
|
|
490
|
+
right: 8px;
|
|
491
|
+
top: 6px;
|
|
492
|
+
z-index: 3;
|
|
493
|
+
color: var(--brd-sub, rgba(200, 220, 255, 0.45));
|
|
494
|
+
cursor: pointer;
|
|
495
|
+
font-size: 13px;
|
|
496
|
+
}
|
|
497
|
+
.part-toolbar[data-v-16075a7b]:hover {
|
|
498
|
+
color: var(--brd-accent, #4fa8ff);
|
|
499
|
+
}
|
|
500
|
+
.part-table th.sortable[data-v-16075a7b] {
|
|
501
|
+
cursor: pointer;
|
|
502
|
+
user-select: none;
|
|
503
|
+
}
|
|
504
|
+
/* 有自定义列宽时:colgroup 给出各列宽度(显式宽度作为该列**最小宽度**生效,所以拖列宽照样变宽)。
|
|
505
|
+
宽度本身由 tableStyle 计算:
|
|
506
|
+
· 所有列都拖过 ⇒ max(100%, 合计) —— 真的超宽才让容器横向滚动
|
|
507
|
+
· 只拖了部分列 ⇒ 不写宽度,按 100% 排
|
|
508
|
+
⚠️ 以前这里写死 `width: max-content; min-width: 100%`:纵向滚动条占掉十几像素后
|
|
509
|
+
max-content 就比可视宽度大一点 ⇒ 凭空多出一条横向滚动条(用户报过)。
|
|
510
|
+
⚠️ 也不要同时用 table-layout:fixed —— 它和 max-content 一起会让浏览器把列宽按比例压缩。 */
|
|
511
|
+
.part-table.fixed[data-v-16075a7b] {
|
|
512
|
+
width: 100%;
|
|
513
|
+
}
|
|
514
|
+
.part-table th .sort-mark[data-v-16075a7b] {
|
|
515
|
+
margin-left: 4px;
|
|
516
|
+
font-size: 10px;
|
|
517
|
+
color: var(--brd-accent, #4fa8ff);
|
|
518
|
+
}
|
|
519
|
+
/* 表头右边缘的列宽拖拽把手。
|
|
520
|
+
⚠️ 宽度必须够、且**大部分要落在本单元格内**:原来 width:7px / right:-3px 时,
|
|
521
|
+
真正能被命中的只有格子内的 4px(伸到格子外的 3px 会被右邻 th 盖住),
|
|
522
|
+
命中点稍一取整就落到右邻表头上,表现成"拖列宽没反应"(验收脚本就栽在这 0.5px 上)。 */
|
|
523
|
+
.part-table th .col-resizer[data-v-16075a7b] {
|
|
524
|
+
position: absolute;
|
|
525
|
+
right: -2px;
|
|
526
|
+
top: 0;
|
|
527
|
+
width: 11px;
|
|
528
|
+
height: 100%;
|
|
529
|
+
cursor: col-resize;
|
|
530
|
+
z-index: 2;
|
|
531
|
+
}
|
|
532
|
+
.part-table th.group-head[data-v-16075a7b] {
|
|
533
|
+
text-align: center;
|
|
534
|
+
/* 分组表头的竖线也走"列线"变量(整条声明形式,默认不声明 ⇒ 不画) */
|
|
535
|
+
border-left: var(--brd-table-col-line, 0 none);
|
|
536
|
+
}
|
|
537
|
+
.agg-list[data-v-16075a7b] {
|
|
538
|
+
margin: 0 0 8px;
|
|
539
|
+
}
|
|
540
|
+
.agg-list .agg-del[data-v-16075a7b] {
|
|
541
|
+
margin-left: 6px;
|
|
542
|
+
color: #ff7875;
|
|
543
|
+
cursor: pointer;
|
|
544
|
+
}
|
|
545
|
+
.part-table[data-v-16075a7b] {
|
|
546
|
+
width: 100%;
|
|
547
|
+
border-collapse: collapse;
|
|
548
|
+
font-size: 12.5px;
|
|
549
|
+
color: inherit;
|
|
550
|
+
/* ⚠️ 必须 fixed 布局(不是为了好看,是为了"不凭空出横向滚动条"):
|
|
551
|
+
auto 布局下 `white-space: nowrap` 的单元格最小宽度 = 整行文字宽度,
|
|
552
|
+
几个长文本列加起来必然超过卡片 ⇒ 表格撑破容器、冒出横向滚动条(交叉表列短所以没这问题)。
|
|
553
|
+
fixed 布局严格按 colgroup 给宽度(列宽由 colWidthOf 决定:拖过的用拖的值、数值列 110px、
|
|
554
|
+
文本列 auto 平分),超出的文字用省略号截断 ⇒ 表格始终等于容器宽度。
|
|
555
|
+
真把某列拖得很宽时,tableStyle 会写 max(100%, 合计) ⇒ 那时才横向滚动(那是合理的)。 */
|
|
556
|
+
table-layout: fixed;
|
|
557
|
+
/* 列分隔线:**整条声明**形式的变量,默认 `0 none` = 压根不声明右边框。
|
|
558
|
+
⚠️ 不能写成 `border-right: 1px solid var(--brd-table-col-line, transparent)`:
|
|
559
|
+
那会给每个单元格留一条 1px 的透明边框,在 border-collapse 下这 1px 不涂背景 ⇒
|
|
560
|
+
露出底下的画布,成了"表头左右两条若隐若现的缝"(用户反馈"四条边颜色不一样"的一半原因)。
|
|
561
|
+
想要整张网格:主题里写 --brd-table-col-line: 1px solid rgba(...)。 */
|
|
562
|
+
}
|
|
563
|
+
.part-table th[data-v-16075a7b] {
|
|
564
|
+
position: sticky;
|
|
565
|
+
top: 0;
|
|
566
|
+
/* 表头去掉"整块灰底",改成"极淡的底 + 一条细分割线"(现代表格观感) */
|
|
567
|
+
background: var(--brd-head, rgba(120, 150, 190, 0.18));
|
|
568
|
+
backdrop-filter: blur(6px);
|
|
569
|
+
padding: 8px 10px;
|
|
570
|
+
font-weight: 500;
|
|
571
|
+
letter-spacing: 0.04em;
|
|
572
|
+
color: var(--brd-sub, inherit);
|
|
573
|
+
white-space: nowrap;
|
|
574
|
+
/* fixed 布局下超出的文字要截断(配合省略号),否则会被硬切、看着像 bug */
|
|
575
|
+
overflow: hidden;
|
|
576
|
+
text-overflow: ellipsis;
|
|
577
|
+
/* 表头下沿线:用 **inset 阴影**而不是 border —— sticky + border-collapse 下 border 会被表头裁/滚动时丢,
|
|
578
|
+
阴影跟着单元格走。
|
|
579
|
+
颜色=--brd-table-head-line(默认取 --brd-table-line,与表体行线同色;想更突出就在主题里单独给色)。
|
|
580
|
+
注:2026-09 试过"表头画整圈四边",用户看完要求"还是原来的效果" ⇒ 恢复成只有下边一条。 */
|
|
581
|
+
box-shadow: inset 0 calc(-1 * var(--brd-table-line-w, 1px)) 0 var(--brd-table-head-line, var(--brd-table-line, var(--brd-line, transparent)));
|
|
582
|
+
}
|
|
583
|
+
.part-table td[data-v-16075a7b] {
|
|
584
|
+
padding: 7px 10px;
|
|
585
|
+
/* 单元格一律居中(用户要求;原来是"维度列左、度量列右")——统一在 CSS 里给,
|
|
586
|
+
模板里的内联 text-align 全部去掉,否则内联会盖掉这里(踩过:表头 .group-head 的居中就被内联盖掉过)。 */
|
|
587
|
+
text-align: center;
|
|
588
|
+
/* 行分隔线:与表头线同一套主题变量 ⇒ "要么都有、要么都没有" */
|
|
589
|
+
border-bottom: var(--brd-table-line-w, 1px) solid var(--brd-table-line, var(--brd-line, rgba(140, 160, 190, 0.16)));
|
|
590
|
+
white-space: nowrap;
|
|
591
|
+
overflow: hidden;
|
|
592
|
+
text-overflow: ellipsis;
|
|
593
|
+
}
|
|
594
|
+
.part-table th[data-v-16075a7b]:not(:last-child),
|
|
595
|
+
.part-table td[data-v-16075a7b]:not(:last-child) {
|
|
596
|
+
border-right: var(--brd-table-col-line, 0 none);
|
|
597
|
+
}
|
|
598
|
+
.part-table tbody tr[data-v-16075a7b] {
|
|
599
|
+
transition: background 0.15s;
|
|
600
|
+
}
|
|
601
|
+
.part-table tbody tr[data-v-16075a7b]:hover {
|
|
602
|
+
background: var(--brd-hover, rgba(140, 160, 190, 0.1));
|
|
603
|
+
}
|
|
604
|
+
.part-table.stripe tbody tr[data-v-16075a7b]:nth-child(even) {
|
|
605
|
+
background: var(--brd-stripe, rgba(140, 160, 190, 0.08));
|
|
606
|
+
}
|
|
607
|
+
.part-table.bordered th[data-v-16075a7b],
|
|
608
|
+
.part-table.bordered td[data-v-16075a7b] {
|
|
609
|
+
border: var(--brd-table-line-w, 1px) solid var(--brd-table-line, rgba(140, 160, 190, 0.22));
|
|
610
|
+
}
|
|
611
|
+
.part-table.cross[data-v-16075a7b] {
|
|
612
|
+
/* 合计行上方那条线:跟行线同一套变量(保持"要么都有、要么都没有") */
|
|
613
|
+
}
|
|
614
|
+
.part-table.cross .row-head[data-v-16075a7b] {
|
|
615
|
+
font-weight: 600;
|
|
616
|
+
position: sticky;
|
|
617
|
+
left: 0;
|
|
618
|
+
background: var(--brd-line, rgba(120, 150, 190, 0.1));
|
|
619
|
+
}
|
|
620
|
+
.part-table.cross .total[data-v-16075a7b] {
|
|
621
|
+
font-weight: 600;
|
|
622
|
+
background: var(--brd-line, rgba(120, 150, 190, 0.1));
|
|
623
|
+
}
|
|
624
|
+
.part-table.cross .grand[data-v-16075a7b] {
|
|
625
|
+
background: var(--brd-line, rgba(120, 150, 190, 0.2));
|
|
626
|
+
}
|
|
627
|
+
.part-table.cross tfoot td[data-v-16075a7b] {
|
|
628
|
+
border-top: var(--brd-table-line-w, 1px) solid var(--brd-table-head-line, var(--brd-table-line, var(--brd-line)));
|
|
629
|
+
}
|
|
630
|
+
.part-text[data-v-16075a7b] {
|
|
631
|
+
width: 100%;
|
|
632
|
+
height: 100%;
|
|
633
|
+
display: flex;
|
|
634
|
+
align-items: center;
|
|
635
|
+
white-space: pre-wrap;
|
|
636
|
+
word-break: break-all;
|
|
637
|
+
overflow: hidden;
|
|
638
|
+
}
|
|
639
|
+
.part-text span[data-v-16075a7b] {
|
|
640
|
+
display: block;
|
|
641
|
+
width: 100%;
|
|
642
|
+
}
|
|
643
|
+
.part-text.ov-ellipsis[data-v-16075a7b] {
|
|
644
|
+
white-space: nowrap;
|
|
645
|
+
text-overflow: ellipsis;
|
|
646
|
+
}
|
|
647
|
+
.part-text.ov-ellipsis span[data-v-16075a7b] {
|
|
648
|
+
overflow: hidden;
|
|
649
|
+
text-overflow: ellipsis;
|
|
650
|
+
white-space: nowrap;
|
|
651
|
+
}
|
|
652
|
+
.part-text.ov-shrink span[data-v-16075a7b] {
|
|
653
|
+
word-break: break-word;
|
|
654
|
+
}
|
|
655
|
+
/* DataV 装饰部件:铺满即可(组件内部用 autoResize 按父容器尺寸自适应) */
|
|
656
|
+
.part-decoration[data-v-16075a7b] {
|
|
657
|
+
width: 100%;
|
|
658
|
+
height: 100%;
|
|
659
|
+
min-height: 16px;
|
|
660
|
+
}
|
|
661
|
+
.part-image[data-v-16075a7b],
|
|
662
|
+
.part-iframe[data-v-16075a7b],
|
|
663
|
+
.part-video[data-v-16075a7b],
|
|
664
|
+
.part-carousel[data-v-16075a7b] {
|
|
665
|
+
width: 100%;
|
|
666
|
+
height: 100%;
|
|
667
|
+
}
|
|
668
|
+
.part-image img[data-v-16075a7b],
|
|
669
|
+
.part-iframe img[data-v-16075a7b],
|
|
670
|
+
.part-video img[data-v-16075a7b],
|
|
671
|
+
.part-carousel img[data-v-16075a7b],
|
|
672
|
+
.part-image iframe[data-v-16075a7b],
|
|
673
|
+
.part-iframe iframe[data-v-16075a7b],
|
|
674
|
+
.part-video iframe[data-v-16075a7b],
|
|
675
|
+
.part-carousel iframe[data-v-16075a7b],
|
|
676
|
+
.part-image video[data-v-16075a7b],
|
|
677
|
+
.part-iframe video[data-v-16075a7b],
|
|
678
|
+
.part-video video[data-v-16075a7b],
|
|
679
|
+
.part-carousel video[data-v-16075a7b] {
|
|
680
|
+
width: 100%;
|
|
681
|
+
height: 100%;
|
|
682
|
+
display: block;
|
|
683
|
+
}
|
|
684
|
+
.part-border[data-v-16075a7b],
|
|
685
|
+
.part-container[data-v-16075a7b] {
|
|
686
|
+
width: 100%;
|
|
687
|
+
height: 100%;
|
|
688
|
+
position: relative;
|
|
689
|
+
}
|
|
690
|
+
/* 容器内的子部件区:铺满容器内框。
|
|
691
|
+
⚠️ 内边距**不在元素上写 padding**(用户:'part-children 的 padding 属性去掉'):
|
|
692
|
+
值由 `.part-body` 上的 `--brd-child-pad` 下发,唯一真源是"部件设置 → 容器 → 内边距"(schema.paddingOf)。
|
|
693
|
+
写死一份的话,改了配置也看不出区别,排查时还以为是这里在起作用。 */
|
|
694
|
+
.part-children[data-v-16075a7b] {
|
|
695
|
+
position: absolute;
|
|
696
|
+
inset: 0;
|
|
697
|
+
box-sizing: border-box;
|
|
698
|
+
padding: var(--brd-child-pad, 0px);
|
|
699
|
+
}
|
|
700
|
+
/* 绝对定位模式:原点 = 内框左上角(absolute 子元素不受 padding 影响,留 padding 反而误导),
|
|
701
|
+
子级的 x/y 就按这个原点算,和 schema 里的换算公式一致 */
|
|
702
|
+
.part-children.is-free[data-v-16075a7b] {
|
|
703
|
+
padding: 0;
|
|
704
|
+
}
|
|
705
|
+
/* 移动端堆叠:上面让出标题让位(原来是内联 paddingTop = 内边距 + 标题让位) */
|
|
706
|
+
.part-children.is-stacked[data-v-16075a7b] {
|
|
707
|
+
padding-top: calc(var(--brd-child-pad, 0px) + var(--brd-title-reserve, 0px));
|
|
708
|
+
}
|
|
709
|
+
/* 设计模式下,**选中的容器**把"内容区"画成虚线(内容区 = 内边距以内那块,子级该待的地方)。
|
|
710
|
+
outline + 负 offset 正好压到内边距内沿,不用额外 DOM。
|
|
711
|
+
有了它,"子级跨满却戳出容器"这种几何问题一眼可见
|
|
712
|
+
(用户反馈:"设计模式下 container 内包了 text,text 的区域好像超出了 container 的范围")。 */
|
|
713
|
+
.part-children.is-active[data-v-16075a7b] {
|
|
714
|
+
outline: 1px dashed rgba(24, 144, 255, 0.55);
|
|
715
|
+
outline-offset: calc(-1 * var(--brd-child-pad, 0px));
|
|
716
|
+
}
|
|
717
|
+
/* ---------------------------------------------------------------------------
|
|
718
|
+
设计模式的"抓取环"(只在 design 且容器有子级时渲染,见模板)
|
|
719
|
+
- 4 条透明点击带贴在容器边缘:子级铺满容器时,容器自己几乎没地方可点(内边距还会被画布缩放再缩小),
|
|
720
|
+
点这圈带子就能选中容器;
|
|
721
|
+
- 宽度用 `--board-hit`(由设计器按画布缩放算好,恒定 ~8 **屏幕**像素;画布缩到 0.5 时逻辑宽度自动翻倍);
|
|
722
|
+
- 尺寸不参与布局(absolute)⇒ 不影响"所见即所得";
|
|
723
|
+
- 悬停给一点点淡蓝提示,能看出"这里可以点选容器"。
|
|
724
|
+
⚠️ 它们压在子级之上(z-index 5),所以"贴着容器边缘的那 8px"点不到子级 —— 想选子级点它的中间,
|
|
725
|
+
或者用左侧图层面板 / 部件设置里的「所属容器」。
|
|
726
|
+
--------------------------------------------------------------------------- */
|
|
727
|
+
.hit[data-v-16075a7b] {
|
|
728
|
+
position: absolute;
|
|
729
|
+
z-index: 5;
|
|
730
|
+
cursor: move;
|
|
731
|
+
}
|
|
732
|
+
.hit[data-v-16075a7b]:hover {
|
|
733
|
+
background: rgba(24, 144, 255, 0.14);
|
|
734
|
+
}
|
|
735
|
+
.hit-t[data-v-16075a7b] {
|
|
736
|
+
left: 0;
|
|
737
|
+
right: 0;
|
|
738
|
+
top: 0;
|
|
739
|
+
height: var(--board-hit, 8px);
|
|
740
|
+
}
|
|
741
|
+
.hit-b[data-v-16075a7b] {
|
|
742
|
+
left: 0;
|
|
743
|
+
right: 0;
|
|
744
|
+
bottom: 0;
|
|
745
|
+
height: var(--board-hit, 8px);
|
|
746
|
+
}
|
|
747
|
+
.hit-l[data-v-16075a7b] {
|
|
748
|
+
top: 0;
|
|
749
|
+
bottom: 0;
|
|
750
|
+
left: 0;
|
|
751
|
+
width: var(--board-hit, 8px);
|
|
752
|
+
}
|
|
753
|
+
.hit-r[data-v-16075a7b] {
|
|
754
|
+
top: 0;
|
|
755
|
+
bottom: 0;
|
|
756
|
+
right: 0;
|
|
757
|
+
width: var(--board-hit, 8px);
|
|
758
|
+
}
|
|
759
|
+
/* 面板标题(静态边框/自由容器):两种样式(部件设置 → 面板 → 标题样式)
|
|
760
|
+
chip(默认)= 胶囊,贴在面板上沿的框内(left 24 让开左上角的切角标记;偏移可调,见 titleOffsetOf)
|
|
761
|
+
bar = 框内顶部一条标题栏(高度见 schema.TITLE_BAR_HEIGHT,子级区自动让位) */
|
|
762
|
+
.border-title[data-v-16075a7b],
|
|
763
|
+
.container-title[data-v-16075a7b] {
|
|
764
|
+
position: absolute;
|
|
765
|
+
left: 24px;
|
|
766
|
+
top: 0;
|
|
767
|
+
display: inline-flex;
|
|
768
|
+
align-items: center;
|
|
769
|
+
gap: 6px;
|
|
770
|
+
padding: 2px 10px;
|
|
771
|
+
font-size: 13px;
|
|
772
|
+
font-weight: 600;
|
|
773
|
+
letter-spacing: 0.03em;
|
|
774
|
+
color: var(--brd-text, inherit);
|
|
775
|
+
background: var(--brd-chip, rgba(7, 12, 24, 0.9));
|
|
776
|
+
border-radius: 8px;
|
|
777
|
+
max-width: calc(100% - 28px);
|
|
778
|
+
/* span 上做省略号:flex 容器自身的 text-overflow 对匿名文本项不生效(实测) */
|
|
779
|
+
/* bar:整条铺满、贴顶、带渐变底与下沿强调线 */
|
|
780
|
+
}
|
|
781
|
+
.border-title .pt-text[data-v-16075a7b],
|
|
782
|
+
.container-title .pt-text[data-v-16075a7b] {
|
|
783
|
+
min-width: 0;
|
|
784
|
+
overflow: hidden;
|
|
785
|
+
text-overflow: ellipsis;
|
|
786
|
+
white-space: nowrap;
|
|
787
|
+
}
|
|
788
|
+
.border-title[data-v-16075a7b]::before,
|
|
789
|
+
.container-title[data-v-16075a7b]::before {
|
|
790
|
+
content: '';
|
|
791
|
+
flex: 0 0 auto;
|
|
792
|
+
width: 3px;
|
|
793
|
+
height: 12px;
|
|
794
|
+
border-radius: 2px;
|
|
795
|
+
background: linear-gradient(180deg, var(--brd-accent2, #4d8dff), var(--brd-accent, #4d8dff));
|
|
796
|
+
box-shadow: 0 0 10px var(--brd-glow, transparent);
|
|
797
|
+
}
|
|
798
|
+
.border-title.ts-bar[data-v-16075a7b],
|
|
799
|
+
.container-title.ts-bar[data-v-16075a7b] {
|
|
800
|
+
left: 0;
|
|
801
|
+
right: 0;
|
|
802
|
+
top: 0;
|
|
803
|
+
max-width: none;
|
|
804
|
+
height: 34px;
|
|
805
|
+
padding: 0 12px;
|
|
806
|
+
border-radius: 0;
|
|
807
|
+
background: linear-gradient(180deg, var(--brd-glow-soft, rgba(120, 170, 255, 0.12)), transparent);
|
|
808
|
+
box-shadow: inset 0 -1px 0 var(--brd-accent, transparent);
|
|
809
|
+
font-size: 14px;
|
|
810
|
+
}
|
|
811
|
+
.container-title[data-v-16075a7b] {
|
|
812
|
+
background: transparent;
|
|
813
|
+
}
|
|
814
|
+
.container-title.ts-bar[data-v-16075a7b] {
|
|
815
|
+
background: linear-gradient(180deg, var(--brd-glow-soft, rgba(120, 170, 255, 0.12)), transparent);
|
|
816
|
+
}
|
|
817
|
+
.part-tabs[data-v-16075a7b] {
|
|
818
|
+
width: 100%;
|
|
819
|
+
height: 100%;
|
|
820
|
+
display: flex;
|
|
821
|
+
flex-direction: column;
|
|
822
|
+
}
|
|
823
|
+
.tab-head[data-v-16075a7b] {
|
|
824
|
+
display: flex;
|
|
825
|
+
gap: 4px;
|
|
826
|
+
border-bottom: 1px solid rgba(140, 160, 190, 0.3);
|
|
827
|
+
}
|
|
828
|
+
.tab-item[data-v-16075a7b] {
|
|
829
|
+
padding: 4px 12px;
|
|
830
|
+
font-size: 12px;
|
|
831
|
+
cursor: pointer;
|
|
832
|
+
opacity: 0.75;
|
|
833
|
+
}
|
|
834
|
+
.tab-item.active[data-v-16075a7b] {
|
|
835
|
+
opacity: 1;
|
|
836
|
+
font-weight: 600;
|
|
837
|
+
border-bottom: 2px solid currentColor;
|
|
838
|
+
}
|
|
839
|
+
.tab-body[data-v-16075a7b] {
|
|
840
|
+
flex: 1;
|
|
841
|
+
overflow: auto;
|
|
842
|
+
padding: 8px;
|
|
843
|
+
}
|
|
844
|
+
/* 有子部件时 tab 体就是一套子栅格:内边距同样来自"容器内边距"配置(CSS 变量在 .part-body 上),
|
|
845
|
+
不在元素上写死、也不写死在这里 */
|
|
846
|
+
.tab-body.is-grid[data-v-16075a7b] {
|
|
847
|
+
padding: var(--brd-child-pad, 0px);
|
|
848
|
+
}
|
|
849
|
+
/* 移动端堆叠:上面还要让出标题让位 */
|
|
850
|
+
.tab-body.is-stacked[data-v-16075a7b] {
|
|
851
|
+
padding-top: calc(var(--brd-child-pad, 0px) + var(--brd-title-reserve, 0px));
|
|
852
|
+
}
|
|
853
|
+
/* 绝对定位模式下:padding 对 absolute 子元素不生效,坐标原点就是内框左上角,
|
|
854
|
+
所以这里不能留 padding,否则子级位置与换算公式对不上 */
|
|
855
|
+
.tab-body.is-free[data-v-16075a7b] {
|
|
856
|
+
padding: 0;
|
|
857
|
+
}
|
|
858
|
+
.tab-content[data-v-16075a7b] {
|
|
859
|
+
font-size: 12px;
|
|
860
|
+
white-space: pre-wrap;
|
|
861
|
+
}
|
|
862
|
+
.part-carousel[data-v-16075a7b] {
|
|
863
|
+
position: relative;
|
|
864
|
+
}
|
|
865
|
+
.carousel-item[data-v-16075a7b] {
|
|
866
|
+
position: absolute;
|
|
867
|
+
inset: 0;
|
|
868
|
+
transition: opacity 0.5s;
|
|
869
|
+
display: flex;
|
|
870
|
+
align-items: center;
|
|
871
|
+
justify-content: center;
|
|
872
|
+
}
|
|
873
|
+
.carousel-title[data-v-16075a7b] {
|
|
874
|
+
position: absolute;
|
|
875
|
+
left: 0;
|
|
876
|
+
right: 0;
|
|
877
|
+
bottom: 0;
|
|
878
|
+
padding: 4px 10px;
|
|
879
|
+
font-size: 12px;
|
|
880
|
+
background: rgba(0, 0, 0, 0.35);
|
|
881
|
+
color: #fff;
|
|
882
|
+
}
|
|
883
|
+
.carousel-dots[data-v-16075a7b] {
|
|
884
|
+
position: absolute;
|
|
885
|
+
left: 0;
|
|
886
|
+
right: 0;
|
|
887
|
+
bottom: 6px;
|
|
888
|
+
text-align: center;
|
|
889
|
+
}
|
|
890
|
+
.carousel-dots span[data-v-16075a7b] {
|
|
891
|
+
display: inline-block;
|
|
892
|
+
width: 7px;
|
|
893
|
+
height: 7px;
|
|
894
|
+
border-radius: 50%;
|
|
895
|
+
margin: 0 3px;
|
|
896
|
+
background: rgba(255, 255, 255, 0.5);
|
|
897
|
+
cursor: pointer;
|
|
898
|
+
}
|
|
899
|
+
.carousel-dots span.active[data-v-16075a7b] {
|
|
900
|
+
background: #fff;
|
|
901
|
+
}
|
|
902
|
+
.part-marquee[data-v-16075a7b] {
|
|
903
|
+
width: 100%;
|
|
904
|
+
height: 100%;
|
|
905
|
+
overflow: hidden;
|
|
906
|
+
display: flex;
|
|
907
|
+
align-items: center;
|
|
908
|
+
}
|
|
909
|
+
.marquee-inner[data-v-16075a7b] {
|
|
910
|
+
white-space: nowrap;
|
|
911
|
+
animation-name: board-marquee-16075a7b;
|
|
912
|
+
animation-timing-function: linear;
|
|
913
|
+
animation-iteration-count: infinite;
|
|
914
|
+
padding-left: 100%;
|
|
915
|
+
font-size: inherit;
|
|
916
|
+
}
|
|
917
|
+
@keyframes board-marquee-16075a7b {
|
|
918
|
+
0% {
|
|
919
|
+
transform: translateX(0);
|
|
920
|
+
}
|
|
921
|
+
100% {
|
|
922
|
+
transform: translateX(-100%);
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
.part-progress[data-v-16075a7b] {
|
|
926
|
+
width: 100%;
|
|
927
|
+
height: 100%;
|
|
928
|
+
display: flex;
|
|
929
|
+
flex-direction: column;
|
|
930
|
+
justify-content: center;
|
|
931
|
+
}
|
|
932
|
+
.pg-head[data-v-16075a7b] {
|
|
933
|
+
display: flex;
|
|
934
|
+
justify-content: space-between;
|
|
935
|
+
font-size: 12px;
|
|
936
|
+
margin-bottom: 6px;
|
|
937
|
+
opacity: 0.9;
|
|
938
|
+
}
|
|
939
|
+
.pg-bar[data-v-16075a7b] {
|
|
940
|
+
height: 10px;
|
|
941
|
+
border-radius: 6px;
|
|
942
|
+
background: rgba(140, 160, 190, 0.25);
|
|
943
|
+
overflow: hidden;
|
|
944
|
+
}
|
|
945
|
+
.pg-fill[data-v-16075a7b] {
|
|
946
|
+
height: 100%;
|
|
947
|
+
border-radius: 6px;
|
|
948
|
+
background: currentColor;
|
|
949
|
+
transition: width 0.4s;
|
|
950
|
+
}
|
|
951
|
+
.part-button[data-v-16075a7b] {
|
|
952
|
+
width: 100%;
|
|
953
|
+
height: 100%;
|
|
954
|
+
display: flex;
|
|
955
|
+
align-items: center;
|
|
956
|
+
justify-content: center;
|
|
957
|
+
}
|
|
958
|
+
/* 导航:**只做布局**(排列/点击区/尺寸变量),斜切卡片、下划光带、选中态配色全部由主题 CSS
|
|
959
|
+
(.part-nav.nav-\3c style> .nav-item / .nav-item.is-active)负责 —— 框架不写死视觉,换肤才有效。 */
|
|
960
|
+
.part-nav[data-v-16075a7b] {
|
|
961
|
+
width: 100%;
|
|
962
|
+
height: 100%;
|
|
963
|
+
display: flex;
|
|
964
|
+
align-items: center;
|
|
965
|
+
justify-content: center;
|
|
966
|
+
}
|
|
967
|
+
.part-nav .nav-item[data-v-16075a7b] {
|
|
968
|
+
width: var(--nav-item-w, 120px);
|
|
969
|
+
height: var(--nav-item-h, 34px);
|
|
970
|
+
display: inline-flex;
|
|
971
|
+
align-items: center;
|
|
972
|
+
justify-content: center;
|
|
973
|
+
cursor: pointer;
|
|
974
|
+
user-select: none;
|
|
975
|
+
/* 字号/字体走继承:部件设置里的 text.fontSize / fontFamily 挂在 .part-nav 上,
|
|
976
|
+
写死 15px 会把设计稿的 22px 菜单字盖掉(踩过:005 导航条字变小了一号) */
|
|
977
|
+
font-size: inherit;
|
|
978
|
+
font-family: inherit;
|
|
979
|
+
color: inherit;
|
|
980
|
+
line-height: 1;
|
|
981
|
+
white-space: nowrap;
|
|
982
|
+
}
|
|
983
|
+
.part-nav .nav-item .nav-text[data-v-16075a7b] {
|
|
984
|
+
padding: 0 10px;
|
|
985
|
+
overflow: hidden;
|
|
986
|
+
text-overflow: ellipsis;
|
|
987
|
+
}
|
|
988
|
+
/* 绝对定位模式:菜单项沿设计稿的斜切板各就各位(等宽流式排布对不上设计稿) */
|
|
989
|
+
.part-nav.is-absolute[data-v-16075a7b] {
|
|
990
|
+
display: block;
|
|
991
|
+
position: relative;
|
|
992
|
+
}
|
|
993
|
+
.part-nav.is-absolute .nav-item[data-v-16075a7b] {
|
|
994
|
+
position: absolute;
|
|
995
|
+
}
|
|
996
|
+
.part-nav.is-absolute .nav-item .nav-text[data-v-16075a7b] {
|
|
997
|
+
padding: 0;
|
|
998
|
+
}
|
|
999
|
+
.btn[data-v-16075a7b] {
|
|
1000
|
+
padding: 6px 18px;
|
|
1001
|
+
border-radius: 4px;
|
|
1002
|
+
cursor: pointer;
|
|
1003
|
+
font-size: 13px;
|
|
1004
|
+
border: 1px solid currentColor;
|
|
1005
|
+
background: rgba(120, 170, 230, 0.18);
|
|
1006
|
+
color: inherit;
|
|
1007
|
+
}
|
|
1008
|
+
.btn[data-v-16075a7b]:hover {
|
|
1009
|
+
background: rgba(120, 170, 230, 0.32);
|
|
1010
|
+
}
|
|
1011
|
+
.btn.btn-primary[data-v-16075a7b] {
|
|
1012
|
+
background: rgba(58, 160, 255, 0.85);
|
|
1013
|
+
color: #fff;
|
|
1014
|
+
border-color: transparent;
|
|
1015
|
+
}
|
|
1016
|
+
.btn.btn-ghost[data-v-16075a7b] {
|
|
1017
|
+
background: transparent;
|
|
1018
|
+
}
|
|
1019
|
+
.part-filter[data-v-16075a7b] {
|
|
1020
|
+
width: 100%;
|
|
1021
|
+
height: 100%;
|
|
1022
|
+
display: flex;
|
|
1023
|
+
align-items: center;
|
|
1024
|
+
gap: 8px;
|
|
1025
|
+
}
|
|
1026
|
+
.filter-label[data-v-16075a7b] {
|
|
1027
|
+
font-size: 12px;
|
|
1028
|
+
opacity: 0.85;
|
|
1029
|
+
white-space: nowrap;
|
|
1030
|
+
}
|
|
1031
|
+
.filter-input[data-v-16075a7b] {
|
|
1032
|
+
flex: 1;
|
|
1033
|
+
height: 26px;
|
|
1034
|
+
padding: 0 8px;
|
|
1035
|
+
font-size: 12px;
|
|
1036
|
+
color: inherit;
|
|
1037
|
+
background: rgba(255, 255, 255, 0.08);
|
|
1038
|
+
border: 1px solid rgba(140, 160, 190, 0.4);
|
|
1039
|
+
border-radius: 3px;
|
|
1040
|
+
outline: none;
|
|
1041
|
+
}
|
|
1042
|
+
.filter-input option[data-v-16075a7b] {
|
|
1043
|
+
color: #1f2d3d;
|
|
1044
|
+
}
|
|
1045
|
+
.board-view[data-v-16c3c220] {
|
|
1046
|
+
/* 舞台铺满**容器**(不是视口):独立窗口预览时 #app 是 100%,两者等价;
|
|
1047
|
+
在宿主页签里 100vw 会比页签宽(左侧还有页签栏)⇒ 横向溢出,故一律用百分比。 */
|
|
1048
|
+
width: 100%;
|
|
1049
|
+
height: 100%;
|
|
1050
|
+
overflow: hidden;
|
|
1051
|
+
position: relative;
|
|
1052
|
+
}
|
|
1053
|
+
/* 舞台底纹:radial 光晕 + 44px 细网格(值来自主题的 --brd-decor)。
|
|
1054
|
+
用伪元素而不是叠在 background 上,因为画布/舞台还会被设置纯色底或背景图。 */
|
|
1055
|
+
.board-view[data-v-16c3c220]::before {
|
|
1056
|
+
content: '';
|
|
1057
|
+
position: absolute;
|
|
1058
|
+
inset: 0;
|
|
1059
|
+
pointer-events: none;
|
|
1060
|
+
background: var(--brd-decor, none);
|
|
1061
|
+
opacity: 0.9;
|
|
1062
|
+
}
|
|
1063
|
+
.board-scroll[data-v-16c3c220] {
|
|
1064
|
+
width: 100%;
|
|
1065
|
+
height: 100%;
|
|
1066
|
+
}
|
|
1067
|
+
.board-canvas[data-v-16c3c220] {
|
|
1068
|
+
overflow: hidden;
|
|
1069
|
+
/* 画布的默认文字色=主题的正文色。⚠️ 这里原来写死 #fff:
|
|
1070
|
+
浅色主题(极光白)下"继承它的文字"(表格、播报、没显式设色的部件)就是白底白字
|
|
1071
|
+
—— 用户切到极光白后反馈"字体颜色看不清"的一半原因就在这里。 */
|
|
1072
|
+
color: var(--brd-text, #fff);
|
|
1073
|
+
}
|
|
1074
|
+
/* 画布自己的底纹(板子设了纯色底时,舞台那层的底纹会被盖住 ⇒ 这里再铺一层)。
|
|
1075
|
+
z-index:0 + 部件自身 z-index≥1,所以部件永远在底纹之上。 */
|
|
1076
|
+
.board-canvas[data-v-16c3c220]::before {
|
|
1077
|
+
content: '';
|
|
1078
|
+
position: absolute;
|
|
1079
|
+
inset: 0;
|
|
1080
|
+
z-index: 0;
|
|
1081
|
+
pointer-events: none;
|
|
1082
|
+
background: var(--brd-decor, none);
|
|
1083
|
+
}
|
|
1084
|
+
.view-part[data-v-16c3c220] {
|
|
1085
|
+
position: absolute;
|
|
1086
|
+
}
|
|
1087
|
+
.watermark[data-v-16c3c220] {
|
|
1088
|
+
position: absolute;
|
|
1089
|
+
left: 0;
|
|
1090
|
+
right: 0;
|
|
1091
|
+
top: 0;
|
|
1092
|
+
bottom: 0;
|
|
1093
|
+
display: flex;
|
|
1094
|
+
align-items: center;
|
|
1095
|
+
justify-content: center;
|
|
1096
|
+
font-size: 60px;
|
|
1097
|
+
/* 水印:浅色主题下白水印看不见 ⇒ 也跟着主题(浅色主题给了深色低透明) */
|
|
1098
|
+
color: var(--brd-watermark, rgba(255, 255, 255, 0.07));
|
|
1099
|
+
transform: rotate(-24deg);
|
|
1100
|
+
pointer-events: none;
|
|
1101
|
+
}
|
|
1102
|
+
.board-toolbar[data-v-16c3c220] {
|
|
1103
|
+
position: absolute;
|
|
1104
|
+
right: 16px;
|
|
1105
|
+
top: 12px;
|
|
1106
|
+
z-index: 100;
|
|
1107
|
+
/* 工具栏配色也走主题变量:深色主题是"深底浅字",浅色主题(极光白)必须反过来,
|
|
1108
|
+
否则在白底上看不清(用户切到极光白后反馈"字体颜色要调整")。
|
|
1109
|
+
默认值=原来的深色样式,所以不设这些变量的主题观感不变。 */
|
|
1110
|
+
background: var(--brd-toolbar-bg, rgba(20, 32, 50, 0.55));
|
|
1111
|
+
border: 1px solid var(--brd-toolbar-border, rgba(120, 170, 230, 0.25));
|
|
1112
|
+
border-radius: 4px;
|
|
1113
|
+
color: var(--brd-toolbar-text, #cfe3ff);
|
|
1114
|
+
padding: 4px 10px;
|
|
1115
|
+
display: flex;
|
|
1116
|
+
align-items: center;
|
|
1117
|
+
gap: 12px;
|
|
1118
|
+
font-size: 12px;
|
|
1119
|
+
opacity: 0.25;
|
|
1120
|
+
transition: opacity 0.2s;
|
|
1121
|
+
/* 手机:默认不透明(原来 opacity .25 在触屏上几乎看不见,也点不准),图标与间距放大 */
|
|
1122
|
+
}
|
|
1123
|
+
.board-toolbar[data-v-16c3c220]:hover {
|
|
1124
|
+
opacity: 1;
|
|
1125
|
+
}
|
|
1126
|
+
.board-toolbar .tb-lang[data-v-16c3c220] {
|
|
1127
|
+
background: var(--brd-toolbar-input-bg, rgba(10, 20, 34, 0.6));
|
|
1128
|
+
color: inherit;
|
|
1129
|
+
border: 1px solid var(--brd-toolbar-border, rgba(120, 170, 230, 0.3));
|
|
1130
|
+
border-radius: 3px;
|
|
1131
|
+
font-size: 12px;
|
|
1132
|
+
height: 22px;
|
|
1133
|
+
outline: none;
|
|
1134
|
+
}
|
|
1135
|
+
.board-toolbar .tb-lang option[data-v-16c3c220] {
|
|
1136
|
+
color: #1f2d3d;
|
|
1137
|
+
}
|
|
1138
|
+
.board-toolbar .tb-params[data-v-16c3c220] {
|
|
1139
|
+
display: flex;
|
|
1140
|
+
align-items: center;
|
|
1141
|
+
gap: 4px;
|
|
1142
|
+
max-width: 46vw;
|
|
1143
|
+
overflow: hidden;
|
|
1144
|
+
}
|
|
1145
|
+
.board-toolbar .tb-params .ant-tag[data-v-16c3c220] {
|
|
1146
|
+
margin: 0;
|
|
1147
|
+
font-size: 11px;
|
|
1148
|
+
}
|
|
1149
|
+
.board-toolbar .tb-params .tb-clear[data-v-16c3c220] {
|
|
1150
|
+
color: #4fa8ff;
|
|
1151
|
+
cursor: pointer;
|
|
1152
|
+
font-size: 11px;
|
|
1153
|
+
}
|
|
1154
|
+
.board-toolbar i[data-v-16c3c220] {
|
|
1155
|
+
cursor: pointer;
|
|
1156
|
+
font-size: 15px;
|
|
1157
|
+
}
|
|
1158
|
+
.board-toolbar i[data-v-16c3c220]:hover {
|
|
1159
|
+
color: #4fa8ff;
|
|
1160
|
+
}
|
|
1161
|
+
.board-toolbar.is-mobile[data-v-16c3c220] {
|
|
1162
|
+
opacity: 1;
|
|
1163
|
+
left: 8px;
|
|
1164
|
+
right: 8px;
|
|
1165
|
+
top: 8px;
|
|
1166
|
+
/* ⚠️ 不换行:换行会让工具栏变成两行(≈80px),而画布只留了 44px 顶部内边距 ⇒
|
|
1167
|
+
第一行内容被压在工具栏下面(截图里标题被切掉一半)。窄屏就让看板名省略号收缩。 */
|
|
1168
|
+
flex-wrap: nowrap;
|
|
1169
|
+
justify-content: flex-end;
|
|
1170
|
+
gap: 8px;
|
|
1171
|
+
padding: 6px 8px;
|
|
1172
|
+
}
|
|
1173
|
+
.board-toolbar.is-mobile .tb-title[data-v-16c3c220] {
|
|
1174
|
+
font-size: 13px;
|
|
1175
|
+
margin-right: auto;
|
|
1176
|
+
min-width: 0;
|
|
1177
|
+
overflow: hidden;
|
|
1178
|
+
text-overflow: ellipsis;
|
|
1179
|
+
white-space: nowrap;
|
|
1180
|
+
}
|
|
1181
|
+
.board-toolbar.is-mobile .tb-params[data-v-16c3c220] {
|
|
1182
|
+
max-width: 100%;
|
|
1183
|
+
order: 3;
|
|
1184
|
+
flex: 1 1 auto;
|
|
1185
|
+
min-width: 0;
|
|
1186
|
+
}
|
|
1187
|
+
.board-toolbar.is-mobile i[data-v-16c3c220] {
|
|
1188
|
+
font-size: 20px;
|
|
1189
|
+
padding: 2px 4px;
|
|
1190
|
+
flex: 0 0 auto;
|
|
1191
|
+
}
|
|
1192
|
+
.board-toolbar.is-mobile .tb-lang[data-v-16c3c220] {
|
|
1193
|
+
height: 26px;
|
|
1194
|
+
flex: 0 0 auto;
|
|
1195
|
+
}
|
|
1196
|
+
.board-toolbar.is-mobile .tb-ops[data-v-16c3c220] {
|
|
1197
|
+
flex: 0 0 auto;
|
|
1198
|
+
display: flex;
|
|
1199
|
+
align-items: center;
|
|
1200
|
+
gap: 4px;
|
|
1201
|
+
}
|
|
1202
|
+
.board-toolbar.is-hidden[data-v-16c3c220] {
|
|
1203
|
+
display: none;
|
|
1204
|
+
}
|
|
1205
|
+
.show-toolbar[data-v-16c3c220] {
|
|
1206
|
+
position: absolute;
|
|
1207
|
+
right: 8px;
|
|
1208
|
+
top: 8px;
|
|
1209
|
+
z-index: 100;
|
|
1210
|
+
color: var(--brd-toolbar-show, rgba(200, 220, 255, 0.35));
|
|
1211
|
+
cursor: pointer;
|
|
1212
|
+
font-size: 16px;
|
|
1213
|
+
}
|
|
1214
|
+
.show-toolbar[data-v-16c3c220]:hover {
|
|
1215
|
+
color: var(--brd-accent, #4fa8ff);
|
|
1216
|
+
}
|
|
1217
|
+
.board-empty[data-v-16c3c220] {
|
|
1218
|
+
position: absolute;
|
|
1219
|
+
left: 0;
|
|
1220
|
+
right: 0;
|
|
1221
|
+
top: 40%;
|
|
1222
|
+
text-align: center;
|
|
1223
|
+
color: var(--brd-sub, #8fa4bf);
|
|
1224
|
+
}
|
|
1225
|
+
.board-empty i[data-v-16c3c220] {
|
|
1226
|
+
font-size: 42px;
|
|
1227
|
+
}
|
|
1228
|
+
.board-empty p[data-v-16c3c220] {
|
|
1229
|
+
margin-top: 12px;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
/* 工具栏按钮 / 参数 chip / 空态图标(替代 antd 1.x 的 a-icon / a-tag) */
|
|
1233
|
+
.board-empty__icon[data-v-16c3c220] {
|
|
1234
|
+
display: inline-flex;
|
|
1235
|
+
align-items: center;
|
|
1236
|
+
justify-content: center;
|
|
1237
|
+
width: 42px;
|
|
1238
|
+
height: 42px;
|
|
1239
|
+
font-size: 26px;
|
|
1240
|
+
font-weight: 700;
|
|
1241
|
+
line-height: 1;
|
|
1242
|
+
color: var(--brd-sub, #8fa4bf);
|
|
1243
|
+
border: 2px solid currentcolor;
|
|
1244
|
+
border-radius: 50%;
|
|
1245
|
+
}
|
|
1246
|
+
.tb-btn[data-v-16c3c220] {
|
|
1247
|
+
display: inline-flex;
|
|
1248
|
+
align-items: center;
|
|
1249
|
+
justify-content: center;
|
|
1250
|
+
width: 22px;
|
|
1251
|
+
height: 22px;
|
|
1252
|
+
padding: 0;
|
|
1253
|
+
color: inherit;
|
|
1254
|
+
cursor: pointer;
|
|
1255
|
+
background: transparent;
|
|
1256
|
+
border: 0;
|
|
1257
|
+
border-radius: 3px;
|
|
1258
|
+
}
|
|
1259
|
+
.tb-btn[data-v-16c3c220]:hover {
|
|
1260
|
+
color: var(--brd-accent, #4fa8ff);
|
|
1261
|
+
background: rgba(120, 170, 230, 0.12);
|
|
1262
|
+
}
|
|
1263
|
+
.tb-param[data-v-16c3c220] {
|
|
1264
|
+
display: inline-flex;
|
|
1265
|
+
align-items: center;
|
|
1266
|
+
gap: 4px;
|
|
1267
|
+
padding: 0 6px;
|
|
1268
|
+
font-size: 11px;
|
|
1269
|
+
line-height: 18px;
|
|
1270
|
+
color: #e6f0ff;
|
|
1271
|
+
background: rgba(77, 141, 255, 0.22);
|
|
1272
|
+
border: 1px solid rgba(120, 170, 230, 0.45);
|
|
1273
|
+
border-radius: 3px;
|
|
1274
|
+
}
|
|
1275
|
+
.tb-param__x[data-v-16c3c220] {
|
|
1276
|
+
cursor: pointer;
|
|
1277
|
+
font-style: normal;
|
|
1278
|
+
opacity: 0.7;
|
|
1279
|
+
}
|
|
1280
|
+
.tb-param__x[data-v-16c3c220]:hover {
|
|
1281
|
+
opacity: 1;
|
|
1282
|
+
}
|
|
1283
|
+
|
|
217
1284
|
/**
|
|
218
1285
|
* 只用自有 class(`dr-` 前缀)做布局微调。
|
|
219
1286
|
* ⚠ 不要写 `:deep(.ant-*)` 去改宿主的组件内部样式 —— 那会和宿主的主题定制打架,
|