@joint/core 4.0.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/LICENSE +376 -0
- package/README.md +49 -0
- package/dist/geometry.js +6486 -0
- package/dist/geometry.min.js +8 -0
- package/dist/joint.d.ts +5536 -0
- package/dist/joint.js +39629 -0
- package/dist/joint.min.js +8 -0
- package/dist/joint.nowrap.js +39626 -0
- package/dist/joint.nowrap.min.js +8 -0
- package/dist/vectorizer.js +9135 -0
- package/dist/vectorizer.min.js +8 -0
- package/dist/version.mjs +3 -0
- package/index.js +3 -0
- package/joint.mjs +27 -0
- package/package.json +192 -0
- package/src/V/annotation.mjs +0 -0
- package/src/V/index.mjs +2642 -0
- package/src/anchors/index.mjs +123 -0
- package/src/config/index.mjs +12 -0
- package/src/connectionPoints/index.mjs +202 -0
- package/src/connectionStrategies/index.mjs +73 -0
- package/src/connectors/curve.mjs +553 -0
- package/src/connectors/index.mjs +6 -0
- package/src/connectors/jumpover.mjs +452 -0
- package/src/connectors/normal.mjs +12 -0
- package/src/connectors/rounded.mjs +17 -0
- package/src/connectors/smooth.mjs +44 -0
- package/src/connectors/straight.mjs +110 -0
- package/src/dia/Cell.mjs +945 -0
- package/src/dia/CellView.mjs +1316 -0
- package/src/dia/Element.mjs +519 -0
- package/src/dia/ElementView.mjs +859 -0
- package/src/dia/Graph.mjs +1112 -0
- package/src/dia/HighlighterView.mjs +319 -0
- package/src/dia/Link.mjs +565 -0
- package/src/dia/LinkView.mjs +2207 -0
- package/src/dia/Paper.mjs +3171 -0
- package/src/dia/PaperLayer.mjs +75 -0
- package/src/dia/ToolView.mjs +69 -0
- package/src/dia/ToolsView.mjs +128 -0
- package/src/dia/attributes/calc.mjs +128 -0
- package/src/dia/attributes/connection.mjs +75 -0
- package/src/dia/attributes/defs.mjs +76 -0
- package/src/dia/attributes/eval.mjs +64 -0
- package/src/dia/attributes/index.mjs +69 -0
- package/src/dia/attributes/legacy.mjs +148 -0
- package/src/dia/attributes/offset.mjs +53 -0
- package/src/dia/attributes/props.mjs +30 -0
- package/src/dia/attributes/shape.mjs +92 -0
- package/src/dia/attributes/text.mjs +180 -0
- package/src/dia/index.mjs +13 -0
- package/src/dia/layers/GridLayer.mjs +176 -0
- package/src/dia/ports.mjs +874 -0
- package/src/elementTools/Control.mjs +153 -0
- package/src/elementTools/HoverConnect.mjs +37 -0
- package/src/elementTools/index.mjs +5 -0
- package/src/env/index.mjs +43 -0
- package/src/g/bezier.mjs +175 -0
- package/src/g/curve.mjs +956 -0
- package/src/g/ellipse.mjs +245 -0
- package/src/g/extend.mjs +64 -0
- package/src/g/geometry.helpers.mjs +58 -0
- package/src/g/index.mjs +17 -0
- package/src/g/intersection.mjs +511 -0
- package/src/g/line.bearing.mjs +30 -0
- package/src/g/line.length.mjs +5 -0
- package/src/g/line.mjs +356 -0
- package/src/g/line.squaredLength.mjs +10 -0
- package/src/g/path.mjs +2260 -0
- package/src/g/point.mjs +375 -0
- package/src/g/points.mjs +247 -0
- package/src/g/polygon.mjs +51 -0
- package/src/g/polyline.mjs +523 -0
- package/src/g/rect.mjs +556 -0
- package/src/g/types.mjs +10 -0
- package/src/highlighters/addClass.mjs +27 -0
- package/src/highlighters/index.mjs +5 -0
- package/src/highlighters/list.mjs +111 -0
- package/src/highlighters/mask.mjs +220 -0
- package/src/highlighters/opacity.mjs +17 -0
- package/src/highlighters/stroke.mjs +100 -0
- package/src/layout/index.mjs +4 -0
- package/src/layout/ports/port.mjs +188 -0
- package/src/layout/ports/portLabel.mjs +224 -0
- package/src/linkAnchors/index.mjs +76 -0
- package/src/linkTools/Anchor.mjs +235 -0
- package/src/linkTools/Arrowhead.mjs +103 -0
- package/src/linkTools/Boundary.mjs +48 -0
- package/src/linkTools/Button.mjs +121 -0
- package/src/linkTools/Connect.mjs +85 -0
- package/src/linkTools/HoverConnect.mjs +161 -0
- package/src/linkTools/Segments.mjs +393 -0
- package/src/linkTools/Vertices.mjs +253 -0
- package/src/linkTools/helpers.mjs +33 -0
- package/src/linkTools/index.mjs +8 -0
- package/src/mvc/Collection.mjs +560 -0
- package/src/mvc/Data.mjs +46 -0
- package/src/mvc/Dom/Dom.mjs +587 -0
- package/src/mvc/Dom/Event.mjs +130 -0
- package/src/mvc/Dom/animations.mjs +122 -0
- package/src/mvc/Dom/events.mjs +69 -0
- package/src/mvc/Dom/index.mjs +13 -0
- package/src/mvc/Dom/methods.mjs +392 -0
- package/src/mvc/Dom/props.mjs +77 -0
- package/src/mvc/Dom/vars.mjs +5 -0
- package/src/mvc/Events.mjs +337 -0
- package/src/mvc/Listener.mjs +33 -0
- package/src/mvc/Model.mjs +239 -0
- package/src/mvc/View.mjs +323 -0
- package/src/mvc/ViewBase.mjs +182 -0
- package/src/mvc/index.mjs +9 -0
- package/src/mvc/mvcUtils.mjs +90 -0
- package/src/polyfills/array.js +4 -0
- package/src/polyfills/base64.js +68 -0
- package/src/polyfills/index.mjs +5 -0
- package/src/polyfills/number.js +3 -0
- package/src/polyfills/string.js +3 -0
- package/src/polyfills/typedArray.js +47 -0
- package/src/routers/index.mjs +6 -0
- package/src/routers/manhattan.mjs +856 -0
- package/src/routers/metro.mjs +91 -0
- package/src/routers/normal.mjs +6 -0
- package/src/routers/oneSide.mjs +60 -0
- package/src/routers/orthogonal.mjs +323 -0
- package/src/routers/rightAngle.mjs +1056 -0
- package/src/shapes/index.mjs +3 -0
- package/src/shapes/standard.mjs +755 -0
- package/src/util/cloneCells.mjs +67 -0
- package/src/util/getRectPoint.mjs +65 -0
- package/src/util/index.mjs +5 -0
- package/src/util/svgTagTemplate.mjs +110 -0
- package/src/util/util.mjs +1754 -0
- package/src/util/utilHelpers.mjs +2402 -0
- package/src/util/wrappers.mjs +56 -0
- package/types/geometry.d.ts +815 -0
- package/types/index.d.ts +53 -0
- package/types/joint.d.ts +4391 -0
- package/types/joint.head.d.ts +12 -0
- package/types/vectorizer.d.ts +327 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { uniq, toArray, isEmpty } from './util.mjs';
|
|
2
|
+
|
|
3
|
+
// Clone `cells` returning an object that maps the original cell ID to the clone. The number
|
|
4
|
+
// of clones is exactly the same as the `cells.length`.
|
|
5
|
+
// This function simply clones all the `cells`. However, it also reconstructs
|
|
6
|
+
// all the `source/target` and `parent/embed` references within the `cells`.
|
|
7
|
+
// This is the main difference from the `cell.clone()` method. The
|
|
8
|
+
// `cell.clone()` method works on one single cell only.
|
|
9
|
+
// For example, for a graph: `A --- L ---> B`, `cloneCells([A, L, B])`
|
|
10
|
+
// returns `[A2, L2, B2]` resulting to a graph: `A2 --- L2 ---> B2`, i.e.
|
|
11
|
+
// the source and target of the link `L2` is changed to point to `A2` and `B2`.
|
|
12
|
+
export function cloneCells(cells) {
|
|
13
|
+
|
|
14
|
+
cells = uniq(cells);
|
|
15
|
+
|
|
16
|
+
// A map of the form [original cell ID] -> [clone] helping
|
|
17
|
+
// us to reconstruct references for source/target and parent/embeds.
|
|
18
|
+
// This is also the returned value.
|
|
19
|
+
const cloneMap = toArray(cells).reduce(function(map, cell) {
|
|
20
|
+
map[cell.id] = cell.clone();
|
|
21
|
+
return map;
|
|
22
|
+
}, {});
|
|
23
|
+
|
|
24
|
+
toArray(cells).forEach(function(cell) {
|
|
25
|
+
|
|
26
|
+
const clone = cloneMap[cell.id];
|
|
27
|
+
// assert(clone exists)
|
|
28
|
+
|
|
29
|
+
if (clone.isLink()) {
|
|
30
|
+
const source = clone.source();
|
|
31
|
+
const target = clone.target();
|
|
32
|
+
if (source.id && cloneMap[source.id]) {
|
|
33
|
+
// Source points to an element and the element is among the clones.
|
|
34
|
+
// => Update the source of the cloned link.
|
|
35
|
+
clone.prop('source/id', cloneMap[source.id].id);
|
|
36
|
+
}
|
|
37
|
+
if (target.id && cloneMap[target.id]) {
|
|
38
|
+
// Target points to an element and the element is among the clones.
|
|
39
|
+
// => Update the target of the cloned link.
|
|
40
|
+
clone.prop('target/id', cloneMap[target.id].id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Find the parent of the original cell
|
|
45
|
+
const parent = cell.get('parent');
|
|
46
|
+
if (parent && cloneMap[parent]) {
|
|
47
|
+
clone.set('parent', cloneMap[parent].id);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Find the embeds of the original cell
|
|
51
|
+
const embeds = toArray(cell.get('embeds')).reduce(function(newEmbeds, embed) {
|
|
52
|
+
// Embedded cells that are not being cloned can not be carried
|
|
53
|
+
// over with other embedded cells.
|
|
54
|
+
if (cloneMap[embed]) {
|
|
55
|
+
newEmbeds.push(cloneMap[embed].id);
|
|
56
|
+
}
|
|
57
|
+
return newEmbeds;
|
|
58
|
+
}, []);
|
|
59
|
+
|
|
60
|
+
if (!isEmpty(embeds)) {
|
|
61
|
+
clone.set('embeds', embeds);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return cloneMap;
|
|
66
|
+
}
|
|
67
|
+
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as g from '../g/index.mjs';
|
|
2
|
+
|
|
3
|
+
export const Positions = {
|
|
4
|
+
TOP: 'top',
|
|
5
|
+
RIGHT: 'right',
|
|
6
|
+
BOTTOM: 'bottom',
|
|
7
|
+
LEFT: 'left',
|
|
8
|
+
TOP_LEFT: 'top-left',
|
|
9
|
+
TOP_RIGHT: 'top-right',
|
|
10
|
+
BOTTOM_LEFT: 'bottom-left',
|
|
11
|
+
BOTTOM_RIGHT: 'bottom-right',
|
|
12
|
+
CENTER: 'center',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export function getRectPoint(rect, position) {
|
|
16
|
+
const r = new g.Rect(rect);
|
|
17
|
+
switch (position) {
|
|
18
|
+
case undefined:
|
|
19
|
+
throw new Error('Position required');
|
|
20
|
+
|
|
21
|
+
// Middle Points
|
|
22
|
+
case Positions.LEFT:
|
|
23
|
+
case 'leftMiddle':
|
|
24
|
+
return r.leftMiddle();
|
|
25
|
+
|
|
26
|
+
case Positions.RIGHT:
|
|
27
|
+
case 'rightMiddle':
|
|
28
|
+
return r.rightMiddle();
|
|
29
|
+
|
|
30
|
+
case Positions.TOP:
|
|
31
|
+
case 'topMiddle':
|
|
32
|
+
return r.topMiddle();
|
|
33
|
+
|
|
34
|
+
case Positions.BOTTOM:
|
|
35
|
+
case 'bottomMiddle':
|
|
36
|
+
return r.bottomMiddle();
|
|
37
|
+
|
|
38
|
+
// Corners
|
|
39
|
+
case Positions.TOP_LEFT:
|
|
40
|
+
case 'topLeft':
|
|
41
|
+
case 'origin':
|
|
42
|
+
return r.topLeft();
|
|
43
|
+
|
|
44
|
+
case Positions.TOP_RIGHT:
|
|
45
|
+
case 'topRight':
|
|
46
|
+
return r.topRight();
|
|
47
|
+
|
|
48
|
+
case Positions.BOTTOM_LEFT:
|
|
49
|
+
case 'bottomLeft':
|
|
50
|
+
return r.bottomLeft();
|
|
51
|
+
|
|
52
|
+
case Positions.BOTTOM_RIGHT:
|
|
53
|
+
case 'bottomRight':
|
|
54
|
+
case 'corner':
|
|
55
|
+
return r.bottomRight();
|
|
56
|
+
|
|
57
|
+
// Center
|
|
58
|
+
case Positions.CENTER:
|
|
59
|
+
return r.center();
|
|
60
|
+
|
|
61
|
+
// TODO: calc(), percentage etc.
|
|
62
|
+
default:
|
|
63
|
+
throw new Error(`Unknown position: ${position}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import V from '../V/index.mjs';
|
|
2
|
+
|
|
3
|
+
export function svg(strings, ...expressions) {
|
|
4
|
+
const svgParts = [];
|
|
5
|
+
strings.forEach((part, index) => {
|
|
6
|
+
svgParts.push(part);
|
|
7
|
+
if (index in expressions) {
|
|
8
|
+
svgParts.push(expressions[index]);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const markup = parseFromSVGString(svgParts.join(''));
|
|
12
|
+
return markup;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function parseFromSVGString(str) {
|
|
16
|
+
const parser = new DOMParser();
|
|
17
|
+
const markupString = `<svg>${str.trim()}</svg>`;
|
|
18
|
+
const xmldocument = parser.parseFromString(markupString.replace(/@/g, ''), 'application/xml');
|
|
19
|
+
if (xmldocument.getElementsByTagName('parsererror')[0]) {
|
|
20
|
+
throw new Error('Invalid SVG markup');
|
|
21
|
+
}
|
|
22
|
+
const document = parser.parseFromString(markupString, 'text/html');
|
|
23
|
+
const svg = document.querySelector('svg');
|
|
24
|
+
return build(svg);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function buildNode(node) {
|
|
28
|
+
const markupNode = {};
|
|
29
|
+
const { tagName, attributes, namespaceURI, style, childNodes } = node;
|
|
30
|
+
|
|
31
|
+
markupNode.namespaceURI = namespaceURI;
|
|
32
|
+
markupNode.tagName = (namespaceURI === V.namespace.xhtml)
|
|
33
|
+
// XHTML documents must use lower case for all HTML element and attribute names.
|
|
34
|
+
// The tagName property returns upper case value for HTML elements.
|
|
35
|
+
// e.g. <DIV> vs.<div/>
|
|
36
|
+
? tagName.toLowerCase()
|
|
37
|
+
: tagName;
|
|
38
|
+
|
|
39
|
+
const stylesObject = {};
|
|
40
|
+
for (var i = style.length; i--;) {
|
|
41
|
+
var nameString = style[i];
|
|
42
|
+
stylesObject[nameString] = style.getPropertyValue(nameString);
|
|
43
|
+
}
|
|
44
|
+
markupNode.style = stylesObject;
|
|
45
|
+
|
|
46
|
+
// selector fallbacks to tagName
|
|
47
|
+
const selectorAttribute = attributes.getNamedItem('@selector');
|
|
48
|
+
if (selectorAttribute) {
|
|
49
|
+
markupNode.selector = selectorAttribute.value;
|
|
50
|
+
attributes.removeNamedItem('@selector');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const groupSelectorAttribute = attributes.getNamedItem('@group-selector');
|
|
54
|
+
if (groupSelectorAttribute) {
|
|
55
|
+
const groupSelectors = groupSelectorAttribute.value.split(',');
|
|
56
|
+
markupNode.groupSelector = groupSelectors.map(s => s.trim());
|
|
57
|
+
|
|
58
|
+
attributes.removeNamedItem('@group-selector');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const className = attributes.getNamedItem('class');
|
|
62
|
+
if (className) {
|
|
63
|
+
markupNode.className = className.value;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const children = [];
|
|
67
|
+
childNodes.forEach(node => {
|
|
68
|
+
switch (node.nodeType) {
|
|
69
|
+
case Node.TEXT_NODE: {
|
|
70
|
+
const trimmedText = node.data.replace(/\s\s+/g, ' ');
|
|
71
|
+
if (trimmedText.trim()) {
|
|
72
|
+
children.push(trimmedText);
|
|
73
|
+
}
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case Node.ELEMENT_NODE: {
|
|
77
|
+
children.push(buildNode(node));
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
default:
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
if (children.length) {
|
|
85
|
+
markupNode.children = children;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const nodeAttrs = {};
|
|
89
|
+
|
|
90
|
+
Array.from(attributes).forEach(nodeAttribute => {
|
|
91
|
+
const { name, value } = nodeAttribute;
|
|
92
|
+
nodeAttrs[name] = value;
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
if (Object.keys(nodeAttrs).length > 0) {
|
|
96
|
+
markupNode.attributes = nodeAttrs;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return markupNode;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function build(root) {
|
|
103
|
+
const markup = [];
|
|
104
|
+
|
|
105
|
+
Array.from(root.children).forEach(node => {
|
|
106
|
+
markup.push(buildNode(node));
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
return markup;
|
|
110
|
+
}
|