@beehexa/vueflow-tokens 2611.3.4 → 2611.5.3
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 +42 -5
- package/dist/index.d.ts +18 -2
- package/dist/index.js +57 -3
- package/dist/styles.css +190 -5
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -36,16 +36,53 @@ host/dimension changes. The factory uses VueFlow 1's real `fitViewOnInit` option
|
|
|
36
36
|
- `getNodeColor(type)`, `getEdgeColorPalette(category)`, `styleTargetEdge(edge, nodes)`:
|
|
37
37
|
source-backed directed edge identity; target stroke and marker remain paired.
|
|
38
38
|
- `FLOW_EDGE`, `FLOW_ICON`: numeric source values at VueFlow/icon API boundaries.
|
|
39
|
+
- `getFlowCategoryStyles(type, part?)`: custom semantic content role binding;
|
|
40
|
+
`foreground` (default) sets category text, `border` sets border colour and
|
|
41
|
+
`background` sets the category surface.
|
|
42
|
+
- `getFlowIconStyles(type, { size?, color?, disabled? })`: category-border glyphs
|
|
43
|
+
or separate `status-success|warning|error|info|loading` / `control-expand|collapse|help`
|
|
44
|
+
icon roles. Edge icon keys use `edge-dependency|edge-transformation`.
|
|
45
|
+
Sizes accept `small|medium|large` or a numeric API size; explicit colours must
|
|
46
|
+
already be source-resolved semantic roles.
|
|
47
|
+
- `getFlowEdgeStyles(category, suppliedStyle?)`: SVG width, non-scaling stroke,
|
|
48
|
+
no-fill and static relation dashes. The supplied directed target stroke wins
|
|
49
|
+
over category fallback, preserving stroke/arrow identity.
|
|
39
50
|
- Public option, category, dimension, node-state, style and theme interfaces are emitted
|
|
40
51
|
in `dist/index.d.ts`; CSS has a typed `./css` export.
|
|
41
52
|
|
|
42
|
-
Use
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
53
|
+
Use public source typography/content markers and graph presentation factories in
|
|
54
|
+
custom semantic content. Keep category labels and icons, selected outline, separate
|
|
55
|
+
keyboard focus and readable error messages. Do not append hexadecimal alpha suffixes
|
|
56
|
+
to CSS variables. Do not animate idle graph nodes, rotate category icons, add
|
|
57
|
+
glass/gradients, or override core controls in each consumer.
|
|
46
58
|
Preserve graph IDs, stored coordinates and relationship direction on theme changes.
|
|
47
59
|
Exports must capture the current graph surface/font rather than force white/system fonts.
|
|
48
60
|
|
|
61
|
+
Ordinary nodes, MiniMap cards and Controls use `radius.100` (8 px). Controls
|
|
62
|
+
round exposed corners without clipping focus, and MiniMap fills clip.
|
|
63
|
+
Connector logos retain nested `radius.075` (6 px). Decision/loop nodes and graph
|
|
64
|
+
handles keep their circular geometry; `FLOW_EDGE.radius` remains edge-path geometry.
|
|
65
|
+
Consumer-owned inspector cards and controls/toolbars use `--bh-radius-100`; dialogs/drawers use `radius.150` (12 px).
|
|
66
|
+
|
|
67
|
+
Bind `data-bh-high-contrast="true"` on the actual `bh-vue-flow` host when the user's
|
|
68
|
+
high-contrast setting is enabled. Native node/edge/path, graph buttons and custom
|
|
69
|
+
`role="button"` focus rings then use `border.width.accent` (4px), retaining the
|
|
70
|
+
source focus colour and offset. The default is `border.width.focused` (2px).
|
|
71
|
+
Bind `data-bh-large-text="true"` and `data-bh-increased-spacing="true"` on that
|
|
72
|
+
same host for the existing user accessibility settings (1.125em node text;
|
|
73
|
+
1.6 line-height / 0.02em letter-spacing). These are opt-in adaptations, not new
|
|
74
|
+
default typography. `bh-flow-icon[data-bh-loading="true"]` animates only an
|
|
75
|
+
actual loading glyph and respects reduced motion.
|
|
76
|
+
`bh-flow-category-mark[data-bh-category="<FlowCategory>"]` is a labelled 6px
|
|
77
|
+
circular relationship marker in the category's border role, never a status dot.
|
|
78
|
+
|
|
79
|
+
For a native category Tag, bind the cached immutable result of
|
|
80
|
+
`getFlowCategoryBadgeStyles(type)` to its public `style` prop and omit its
|
|
81
|
+
`color` prop. This pairs category foreground, background and border; a frame/edge
|
|
82
|
+
stroke from `getNodeColor(type)` is not a filled badge background. Both themes'
|
|
83
|
+
small-text pairs are checked at WCAG AA 4.5:1 and demonstrated with real native
|
|
84
|
+
Tags in the Ant Design Vue family. Category labels are not execution status.
|
|
85
|
+
|
|
49
86
|
Resting handles use the neutral icon role, not keyboard-focus color. TaskFlow-style
|
|
50
87
|
graph fullscreen uses an isolated local stacking context at `z-index.modal` (400), allowing
|
|
51
88
|
global inspectors above it. Child chrome may use private z10/z15 within that context,
|
|
@@ -53,7 +90,7 @@ not global1001/1002. This is not an editor takeover at `z-index.fullscreen` (450
|
|
|
53
90
|
|
|
54
91
|
## Build and validation
|
|
55
92
|
|
|
56
|
-
The shared `build-
|
|
93
|
+
The shared `build-runtime-packages.mjs` compiles strict NodeNext source and checks generated
|
|
57
94
|
output. Actual packed-consumer checks exercise exports/CSS with strict TypeScript and
|
|
58
95
|
`skipLibCheck` at the upstream vendor-declaration boundary. Source version `0.0.0`
|
|
59
96
|
stays private; only the authorized runner stamps real package/internal dependency versions.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CSSProperties } from 'vue';
|
|
2
|
-
import { type FlowProps, type Node, type Edge } from '@vue-flow/core';
|
|
2
|
+
import { type FlowProps, type Node, type Edge, type Styles } from '@vue-flow/core';
|
|
3
3
|
export interface VueFlowThemeOptions {
|
|
4
4
|
dark?: boolean;
|
|
5
5
|
locale?: 'en' | 'vi';
|
|
@@ -72,6 +72,20 @@ export declare function getNodeColorPalette(category: FlowCategory): FlowNodePal
|
|
|
72
72
|
export declare function getEdgeColorPalette(category: FlowEdgeCategory): FlowNodePalette;
|
|
73
73
|
/** Unknown/custom node types retain the task category, matching VueFlow's default node. */
|
|
74
74
|
export declare function getNodeColor(type: string): string;
|
|
75
|
+
export type FlowCategoryPart = 'foreground' | 'border' | 'background';
|
|
76
|
+
/** Apply a category role to custom semantic content without a consumer-owned recipe. */
|
|
77
|
+
export declare function getFlowCategoryStyles(type: string, part?: FlowCategoryPart): CSSProperties;
|
|
78
|
+
/** Paired native Tag paint; a category stroke is not an on-bold background. */
|
|
79
|
+
export declare function getFlowCategoryBadgeStyles(type: string): Readonly<CSSProperties>;
|
|
80
|
+
export interface FlowIconOptions {
|
|
81
|
+
size?: keyof typeof FLOW_ICON | number;
|
|
82
|
+
color?: string;
|
|
83
|
+
disabled?: boolean;
|
|
84
|
+
}
|
|
85
|
+
/** Category glyphs and operational/status glyphs retain distinct source roles. */
|
|
86
|
+
export declare function getFlowIconStyles(type: string, options?: FlowIconOptions): CSSProperties;
|
|
87
|
+
/** Directed target stroke wins over category fallback; dashes communicate relation kind. */
|
|
88
|
+
export declare function getFlowEdgeStyles(category: FlowEdgeCategory, suppliedStyle?: CSSProperties): Styles;
|
|
75
89
|
export declare const FLOW_VIEWPORT: {
|
|
76
90
|
minZoom: number;
|
|
77
91
|
maxZoom: number;
|
|
@@ -103,7 +117,7 @@ export interface FlowNodeState {
|
|
|
103
117
|
selfDependency?: boolean;
|
|
104
118
|
}
|
|
105
119
|
export interface FlowNodeStyles {
|
|
106
|
-
container:
|
|
120
|
+
container: Styles;
|
|
107
121
|
content: CSSProperties;
|
|
108
122
|
icon: CSSProperties;
|
|
109
123
|
label: CSSProperties;
|
|
@@ -115,3 +129,5 @@ export interface FlowNodeStyles {
|
|
|
115
129
|
}
|
|
116
130
|
/** Custom content and layout share fixed source geometry, not viewport-dependent sizing. */
|
|
117
131
|
export declare function getFlowNodeStyles(type: NodeType, state?: FlowNodeState): FlowNodeStyles;
|
|
132
|
+
/** Minimal detail removes costly decoration, never semantic contrast or graph data. */
|
|
133
|
+
export declare function getFlowDetailStyles(level: 'minimal' | 'basic' | 'detailed', suppliedStyle: Styles): Styles;
|
package/dist/index.js
CHANGED
|
@@ -50,7 +50,7 @@ export const FLOW_ICON = {
|
|
|
50
50
|
large: numberToken('size.icon.large')
|
|
51
51
|
};
|
|
52
52
|
const nodeCategories = {
|
|
53
|
-
task: 'task', task_data: 'task', profile: 'task', task_dependency: 'dependency',
|
|
53
|
+
task: 'task', task_data: 'task', profile: 'task', dependency: 'dependency', task_dependency: 'dependency',
|
|
54
54
|
task_transformation: 'transformation', transformation: 'transformation',
|
|
55
55
|
transformationGroup: 'transformation', validation: 'validation',
|
|
56
56
|
validationGroup: 'validation', push_step: 'pushStep', pushStep: 'pushStep',
|
|
@@ -79,6 +79,54 @@ export function getEdgeColorPalette(category) {
|
|
|
79
79
|
export function getNodeColor(type) {
|
|
80
80
|
return palettes[nodeCategories[type] ?? 'task'].border;
|
|
81
81
|
}
|
|
82
|
+
/** Apply a category role to custom semantic content without a consumer-owned recipe. */
|
|
83
|
+
export function getFlowCategoryStyles(type, part = 'foreground') {
|
|
84
|
+
const palette = palettes[nodeCategories[type] ?? 'task'];
|
|
85
|
+
if (part === 'border')
|
|
86
|
+
return { borderColor: palette.border };
|
|
87
|
+
if (part === 'background')
|
|
88
|
+
return { backgroundColor: palette.background };
|
|
89
|
+
return { color: palette.text };
|
|
90
|
+
}
|
|
91
|
+
const categoryBadgeStyles = {};
|
|
92
|
+
/** Paired native Tag paint; a category stroke is not an on-bold background. */
|
|
93
|
+
export function getFlowCategoryBadgeStyles(type) {
|
|
94
|
+
const category = nodeCategories[type] ?? 'task';
|
|
95
|
+
const palette = palettes[category];
|
|
96
|
+
return categoryBadgeStyles[category] ??= Object.freeze({
|
|
97
|
+
color: palette.text,
|
|
98
|
+
backgroundColor: palette.background,
|
|
99
|
+
borderColor: palette.border
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const iconRoles = {
|
|
103
|
+
'status-success': 'color.icon.success', 'status-warning': 'color.icon.warning',
|
|
104
|
+
'status-error': 'color.icon.danger', 'status-info': 'color.icon.info',
|
|
105
|
+
'status-loading': 'color.icon.info', 'control-expand': 'color.icon',
|
|
106
|
+
'control-collapse': 'color.icon', 'control-help': 'color.icon'
|
|
107
|
+
};
|
|
108
|
+
/** Category glyphs and operational/status glyphs retain distinct source roles. */
|
|
109
|
+
export function getFlowIconStyles(type, options = {}) {
|
|
110
|
+
const size = options.size ?? 'medium';
|
|
111
|
+
const category = type.startsWith('edge-') ? type.slice(5) : type;
|
|
112
|
+
return {
|
|
113
|
+
fontSize: `${typeof size === 'number' ? size : FLOW_ICON[size]}px`,
|
|
114
|
+
color: options.disabled ? variable('color.icon.disabled') :
|
|
115
|
+
options.color ?? (iconRoles[type] ? variable(iconRoles[type]) : getNodeColor(category)),
|
|
116
|
+
display: 'inline-flex', alignItems: 'center', justifyContent: 'center'
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const edgeDashes = {
|
|
120
|
+
dependency: undefined, transformation: '5,5', conditional: '2,2', dataFlow: '8,3,2,3'
|
|
121
|
+
};
|
|
122
|
+
/** Directed target stroke wins over category fallback; dashes communicate relation kind. */
|
|
123
|
+
export function getFlowEdgeStyles(category, suppliedStyle) {
|
|
124
|
+
return {
|
|
125
|
+
stroke: suppliedStyle?.stroke ?? getEdgeColorPalette(category).primary,
|
|
126
|
+
strokeWidth: FLOW_EDGE.width, strokeDasharray: edgeDashes[category],
|
|
127
|
+
fill: 'none', vectorEffect: 'non-scaling-stroke'
|
|
128
|
+
};
|
|
129
|
+
}
|
|
82
130
|
export const FLOW_VIEWPORT = {
|
|
83
131
|
minZoom: 0.2, maxZoom: 4, snapToGrid: true,
|
|
84
132
|
snapGrid: [20, 20], fitViewOnInit: true
|
|
@@ -110,12 +158,14 @@ export function createVueFlowTheme(options = {}) {
|
|
|
110
158
|
/** Preserve target identity for both the visible stroke and arrow marker. */
|
|
111
159
|
export function styleTargetEdge(edge, nodes) {
|
|
112
160
|
const target = nodes.find(node => node.id === edge.target);
|
|
113
|
-
const stroke = getNodeColor(target?.type
|
|
161
|
+
const stroke = getNodeColor(target?.type || target?.data?.nodeType || 'task');
|
|
114
162
|
return {
|
|
115
163
|
...edge, animated: false,
|
|
116
164
|
style: { ...(typeof edge.style === 'object' ? edge.style : {}), stroke },
|
|
117
165
|
markerEnd: {
|
|
118
|
-
...(typeof edge.markerEnd === 'object' ? edge.markerEnd : {
|
|
166
|
+
...(typeof edge.markerEnd === 'object' ? edge.markerEnd : {
|
|
167
|
+
type: edge.markerEnd === MarkerType.Arrow ? MarkerType.Arrow : MarkerType.ArrowClosed
|
|
168
|
+
}),
|
|
119
169
|
color: stroke, width: FLOW_EDGE.marker, height: FLOW_EDGE.marker
|
|
120
170
|
}
|
|
121
171
|
};
|
|
@@ -157,3 +207,7 @@ export function getFlowNodeStyles(type, state = {}) {
|
|
|
157
207
|
connectorArrow: { color: palette.primary, font: variable('font.label.default') }
|
|
158
208
|
};
|
|
159
209
|
}
|
|
210
|
+
/** Minimal detail removes costly decoration, never semantic contrast or graph data. */
|
|
211
|
+
export function getFlowDetailStyles(level, suppliedStyle) {
|
|
212
|
+
return level === 'minimal' ? { ...suppliedStyle, boxShadow: 'none' } : suppliedStyle;
|
|
213
|
+
}
|
package/dist/styles.css
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
.bh-vue-flow .vue-flow__node-output {
|
|
19
19
|
background: var(--bh-color-surface);
|
|
20
20
|
border: var(--bh-border-width-default) solid var(--bh-color-border-bold);
|
|
21
|
-
border-radius: var(--bh-radius-
|
|
21
|
+
border-radius: var(--bh-radius-100);
|
|
22
22
|
padding: var(--bh-space-150);
|
|
23
23
|
}
|
|
24
24
|
.bh-vue-flow .vue-flow__node-default.selectable:hover,
|
|
@@ -33,10 +33,16 @@
|
|
|
33
33
|
}
|
|
34
34
|
.bh-vue-flow .vue-flow__node:focus-visible,
|
|
35
35
|
.bh-vue-flow .vue-flow__node :focus-visible,
|
|
36
|
-
.bh-vue-flow .vue-
|
|
36
|
+
.bh-vue-flow .vue-flow__edge:focus-visible,
|
|
37
|
+
.bh-vue-flow .vue-flow__edge-path:focus-visible,
|
|
38
|
+
.bh-vue-flow :is(button, [role='button']):focus-visible {
|
|
37
39
|
outline: var(--bh-border-width-focused) solid var(--bh-flow-focus, var(--bh-color-border-focus));
|
|
38
40
|
outline-offset: var(--bh-state-focus-offset);
|
|
39
41
|
}
|
|
42
|
+
.bh-vue-flow[data-bh-high-contrast='true'] :is(.vue-flow__node, .vue-flow__edge, .vue-flow__edge-path, button, [role='button']):focus-visible,
|
|
43
|
+
.bh-vue-flow[data-bh-high-contrast='true'] .vue-flow__node :focus-visible {
|
|
44
|
+
outline-width: var(--bh-border-width-accent);
|
|
45
|
+
}
|
|
40
46
|
.bh-vue-flow .vue-flow__node[data-error='true'] {
|
|
41
47
|
border-color: var(--bh-flow-error, var(--bh-color-border-danger));
|
|
42
48
|
border-style: dashed;
|
|
@@ -69,9 +75,14 @@
|
|
|
69
75
|
border: var(--bh-border-width-selected) dashed var(--bh-color-border-focus);
|
|
70
76
|
}
|
|
71
77
|
.bh-vue-flow .vue-flow__controls {
|
|
78
|
+
box-sizing: border-box;
|
|
79
|
+
display: flex;
|
|
80
|
+
flex-direction: column;
|
|
81
|
+
gap: var(--bh-space-050);
|
|
82
|
+
padding: var(--bh-space-050);
|
|
72
83
|
background: var(--bh-color-surface);
|
|
73
84
|
border: var(--bh-border-width-default) solid var(--bh-color-border);
|
|
74
|
-
border-radius: var(--bh-radius-
|
|
85
|
+
border-radius: var(--bh-radius-100);
|
|
75
86
|
box-shadow: var(--bh-elevation-shadow-raised);
|
|
76
87
|
}
|
|
77
88
|
.bh-vue-flow .vue-flow__controls-button {
|
|
@@ -82,7 +93,10 @@
|
|
|
82
93
|
background: var(--bh-color-surface);
|
|
83
94
|
color: var(--bh-color-icon);
|
|
84
95
|
fill: currentColor;
|
|
85
|
-
border
|
|
96
|
+
border: 0;
|
|
97
|
+
}
|
|
98
|
+
.bh-vue-flow .vue-flow__controls-button {
|
|
99
|
+
border-radius: var(--bh-radius-050);
|
|
86
100
|
}
|
|
87
101
|
.bh-vue-flow .vue-flow__controls-button:hover {
|
|
88
102
|
background: var(--bh-color-background-neutral-subtle-hover);
|
|
@@ -98,8 +112,9 @@
|
|
|
98
112
|
.bh-vue-flow .vue-flow__minimap {
|
|
99
113
|
background: var(--bh-color-surface);
|
|
100
114
|
border: var(--bh-border-width-default) solid var(--bh-color-border-bold);
|
|
101
|
-
border-radius: var(--bh-radius-
|
|
115
|
+
border-radius: var(--bh-radius-100);
|
|
102
116
|
box-shadow: var(--bh-elevation-shadow-raised);
|
|
117
|
+
overflow: hidden;
|
|
103
118
|
}
|
|
104
119
|
.bh-vue-flow .vue-flow__minimap-mask { fill: var(--bh-color-surface-scrim); }
|
|
105
120
|
.bh-vue-flow .vue-flow__minimap-node { stroke: var(--bh-color-border-bold); }
|
|
@@ -114,3 +129,173 @@
|
|
|
114
129
|
height: var(--bh-size-target-touch);
|
|
115
130
|
}
|
|
116
131
|
}
|
|
132
|
+
@media (width < 768px) {
|
|
133
|
+
.bh-vue-flow .vue-flow__controls-button {
|
|
134
|
+
width: var(--bh-size-target-touch);
|
|
135
|
+
height: var(--bh-size-target-touch);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* User-selected accessibility adaptations belong to the actual graph host. */
|
|
140
|
+
.bh-vue-flow[data-bh-large-text='true'] .vue-flow__node {
|
|
141
|
+
font-size: 1.125em;
|
|
142
|
+
}
|
|
143
|
+
.bh-vue-flow[data-bh-increased-spacing='true'] .vue-flow__node {
|
|
144
|
+
line-height: 1.6;
|
|
145
|
+
letter-spacing: 0.02em;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.bh-flow-icon[data-bh-loading='true'] {
|
|
149
|
+
animation: bh-flow-loading 1s linear infinite;
|
|
150
|
+
}
|
|
151
|
+
@keyframes bh-flow-loading {
|
|
152
|
+
to { transform: rotate(360deg); }
|
|
153
|
+
}
|
|
154
|
+
@media (prefers-reduced-motion: reduce) {
|
|
155
|
+
.bh-flow-icon[data-bh-loading='true'] { animation: none; }
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Labelled relationship markers identify categories, never operational status. */
|
|
159
|
+
.bh-flow-category-mark {
|
|
160
|
+
display: inline-block;
|
|
161
|
+
flex: none;
|
|
162
|
+
width: var(--bh-space-075);
|
|
163
|
+
height: var(--bh-space-075);
|
|
164
|
+
border-radius: 50%;
|
|
165
|
+
background: var(--bh-flow-category-task-border);
|
|
166
|
+
}
|
|
167
|
+
.bh-flow-category-mark[data-bh-category='dependency'] { background: var(--bh-flow-category-dependency-border); }
|
|
168
|
+
.bh-flow-category-mark[data-bh-category='transformation'] { background: var(--bh-flow-category-transformation-border); }
|
|
169
|
+
.bh-flow-category-mark[data-bh-category='validation'] { background: var(--bh-flow-category-validation-border); }
|
|
170
|
+
.bh-flow-category-mark[data-bh-category='pushStep'] { background: var(--bh-flow-category-pushStep-border); }
|
|
171
|
+
.bh-flow-category-mark[data-bh-category='decision'] { background: var(--bh-flow-category-decision-border); }
|
|
172
|
+
.bh-flow-category-mark[data-bh-category='loop'] { background: var(--bh-flow-category-loop-border); }
|
|
173
|
+
.bh-flow-category-mark[data-bh-category='grouped'] { background: var(--bh-flow-category-grouped-border); }
|
|
174
|
+
|
|
175
|
+
/* Native workflow-canvas theme variables are its public styling API. Scope the host
|
|
176
|
+
protocol here; never change application-wide primary/text variables. */
|
|
177
|
+
.bh-workflow-canvas {
|
|
178
|
+
--background: var(--bh-color-surface-page);
|
|
179
|
+
--foreground: var(--bh-color-text);
|
|
180
|
+
--card: var(--bh-color-surface);
|
|
181
|
+
--popover: var(--bh-color-surface-overlay);
|
|
182
|
+
--muted: var(--bh-color-background-neutral);
|
|
183
|
+
--muted-foreground: var(--bh-color-text-subtle);
|
|
184
|
+
--primary: var(--bh-color-border-focus);
|
|
185
|
+
--destructive: var(--bh-color-border-danger);
|
|
186
|
+
--border: var(--bh-color-border);
|
|
187
|
+
--radius: var(--bh-radius-050);
|
|
188
|
+
--wf-font-mono: var(--bh-font-family-mono);
|
|
189
|
+
--wf-control-height: var(--bh-size-control-default);
|
|
190
|
+
--wf-dock-radius: var(--bh-radius-100);
|
|
191
|
+
--wf-focus-outline: var(--bh-border-width-focused) solid var(--bh-color-border-focus);
|
|
192
|
+
--wf-focus-outline-offset: var(--bh-state-focus-offset);
|
|
193
|
+
--wf-chrome-shadow: var(--bh-elevation-shadow-overlay);
|
|
194
|
+
color: var(--bh-color-text);
|
|
195
|
+
font: var(--bh-font-body-default);
|
|
196
|
+
}
|
|
197
|
+
.bh-workflow-canvas .wf-canvas {
|
|
198
|
+
--wf-bg: var(--bh-diagram-canvas);
|
|
199
|
+
--wf-grid: var(--bh-diagram-grid);
|
|
200
|
+
--wf-edge: var(--bh-diagram-edge);
|
|
201
|
+
--wf-edge-active: var(--bh-diagram-selection-ring);
|
|
202
|
+
--wf-edge-failure: var(--bh-diagram-fail-stroke);
|
|
203
|
+
--wf-label-bg: var(--bh-diagram-edge-label-bg);
|
|
204
|
+
--wf-label-fg: var(--bh-diagram-edge-label-text);
|
|
205
|
+
--wf-label-border: var(--bh-color-border);
|
|
206
|
+
--wf-chrome-bg: var(--bh-color-surface);
|
|
207
|
+
--wf-chrome-fg: var(--bh-color-text);
|
|
208
|
+
--wf-chrome-hover: var(--bh-color-background-neutral-subtle-hover);
|
|
209
|
+
--wf-chrome-border: var(--bh-color-border-bold);
|
|
210
|
+
--wf-dock-height: calc(var(--bh-size-control-default) + var(--bh-space-100) + 2 * var(--bh-border-width-default));
|
|
211
|
+
--wf-chrome-radius: var(--bh-radius-050);
|
|
212
|
+
--wf-node-width: var(--bh-diagram-card-width);
|
|
213
|
+
--wf-node-bg: var(--bh-diagram-node-fill);
|
|
214
|
+
--wf-node-fg: var(--bh-diagram-node-title);
|
|
215
|
+
--wf-node-muted: var(--bh-diagram-node-desc);
|
|
216
|
+
--wf-node-border: var(--bh-diagram-node-border);
|
|
217
|
+
--wf-node-radius: var(--bh-radius-100);
|
|
218
|
+
--wf-node-selected-border: var(--bh-diagram-node-border);
|
|
219
|
+
--wf-node-ring: var(--bh-diagram-selection-ring);
|
|
220
|
+
--wf-node-shape-shadow: none;
|
|
221
|
+
--wf-node-shape-selected: none;
|
|
222
|
+
--wf-node-padding-block: var(--bh-diagram-padding);
|
|
223
|
+
--wf-node-column-gap: var(--bh-space-150);
|
|
224
|
+
--wf-node-row-gap: var(--bh-space-050);
|
|
225
|
+
--wf-node-status-size: var(--bh-size-icon-default);
|
|
226
|
+
--wf-node-logo-size: var(--bh-content-partner-logo-image-size);
|
|
227
|
+
--wf-tone-bg: var(--bh-diagram-tile-bg);
|
|
228
|
+
--wf-tone-fg: var(--bh-diagram-tile-glyph);
|
|
229
|
+
--wf-node-kind-bg: var(--bh-diagram-node-fill);
|
|
230
|
+
--wf-node-kind-fg: var(--bh-diagram-node-desc);
|
|
231
|
+
}
|
|
232
|
+
.bh-workflow-canvas .wf-node__badge {
|
|
233
|
+
width: var(--bh-diagram-tile-size);
|
|
234
|
+
height: var(--bh-diagram-tile-size);
|
|
235
|
+
}
|
|
236
|
+
.bh-workflow-canvas .wf-node__badge > svg {
|
|
237
|
+
width: auto;
|
|
238
|
+
height: var(--bh-diagram-glyph-size);
|
|
239
|
+
}
|
|
240
|
+
.bh-workflow-canvas .wf-node__content > .wf-node__kind {
|
|
241
|
+
padding: 0;
|
|
242
|
+
background: transparent;
|
|
243
|
+
}
|
|
244
|
+
.bh-workflow-canvas .wf-node__title {
|
|
245
|
+
white-space: normal;
|
|
246
|
+
overflow-wrap: anywhere;
|
|
247
|
+
}
|
|
248
|
+
.bh-workflow-canvas .wf-node__head { height: auto; }
|
|
249
|
+
.bh-workflow-canvas .wf-node__logos { padding-block-start: var(--bh-space-050); }
|
|
250
|
+
/* Native node image geometry has no independent aspect-ratio input. */
|
|
251
|
+
.bh-workflow-canvas .wf-node__logos > img {
|
|
252
|
+
width: auto;
|
|
253
|
+
flex: none;
|
|
254
|
+
}
|
|
255
|
+
.bh-workflow-canvas .wf-node__execution > svg,
|
|
256
|
+
.bh-workflow-canvas .wf-node__indicators svg {
|
|
257
|
+
width: auto;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* Native dock geometry has fixed-pixel gaps/type and opacity-only disabled paint,
|
|
261
|
+
without corresponding variables. Keep its actual controls, but scale this
|
|
262
|
+
shared compact family through the same Source roles as native AntD docks. */
|
|
263
|
+
.bh-workflow-canvas .wf-dock__bar {
|
|
264
|
+
gap: var(--bh-space-025);
|
|
265
|
+
padding: var(--bh-space-050);
|
|
266
|
+
border-width: var(--bh-border-width-default);
|
|
267
|
+
}
|
|
268
|
+
.bh-workflow-canvas .wf-dock__group {
|
|
269
|
+
gap: var(--bh-space-025);
|
|
270
|
+
}
|
|
271
|
+
.bh-workflow-canvas .wf-dock__group + .wf-dock__group {
|
|
272
|
+
margin-left: var(--bh-space-025);
|
|
273
|
+
padding-left: var(--bh-space-050);
|
|
274
|
+
border-left-width: var(--bh-border-width-default);
|
|
275
|
+
}
|
|
276
|
+
.bh-workflow-canvas .wf-dock__btn {
|
|
277
|
+
gap: var(--bh-space-050);
|
|
278
|
+
padding-inline: var(--bh-space-075);
|
|
279
|
+
font: var(--bh-font-label-small);
|
|
280
|
+
}
|
|
281
|
+
.bh-workflow-canvas .wf-dock__btn:not(:disabled):active {
|
|
282
|
+
background: var(--bh-color-background-neutral-subtle-pressed);
|
|
283
|
+
}
|
|
284
|
+
.bh-workflow-canvas .wf-dock__btn:disabled {
|
|
285
|
+
opacity: 1;
|
|
286
|
+
color: var(--bh-color-text-disabled);
|
|
287
|
+
background: transparent;
|
|
288
|
+
cursor: not-allowed;
|
|
289
|
+
}
|
|
290
|
+
.bh-workflow-canvas .wf-dock__icon {
|
|
291
|
+
width: auto;
|
|
292
|
+
height: var(--bh-size-icon-default);
|
|
293
|
+
}
|
|
294
|
+
@media (pointer: coarse), (width < 768px) {
|
|
295
|
+
.bh-workflow-canvas {
|
|
296
|
+
--wf-control-height: var(--bh-size-target-touch);
|
|
297
|
+
}
|
|
298
|
+
.bh-workflow-canvas .wf-canvas {
|
|
299
|
+
--wf-dock-height: calc(var(--bh-size-target-touch) + var(--bh-space-100) + 2 * var(--bh-border-width-default));
|
|
300
|
+
}
|
|
301
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beehexa/vueflow-tokens",
|
|
3
|
-
"version": "2611.3
|
|
3
|
+
"version": "2611.5.3",
|
|
4
4
|
"description": "Source-backed Beehexa theme, semantic categories and geometry for VueFlow 1",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"./package.json": "./package.json"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@beehexa/design-tokens": "2611.3
|
|
32
|
+
"@beehexa/design-tokens": "2611.5.3"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"@vue-flow/core": "^1.0.0",
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"access": "public"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
|
-
"build": "node ../../scripts/build-
|
|
45
|
-
"check": "node ../../scripts/build-
|
|
44
|
+
"build": "node ../../scripts/build-runtime-packages.mjs vueflow-tokens",
|
|
45
|
+
"check": "node ../../scripts/build-runtime-packages.mjs vueflow-tokens --check",
|
|
46
46
|
"prepack": "npm run build"
|
|
47
47
|
},
|
|
48
48
|
"engines": {
|