@antv/infographic 0.2.7 → 0.2.8

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 (142) hide show
  1. package/dist/infographic.min.js +191 -191
  2. package/dist/infographic.min.js.map +1 -1
  3. package/esm/designs/items/BadgeCard.js +6 -1
  4. package/esm/designs/items/SimpleCircleNode.d.ts +8 -0
  5. package/esm/designs/items/SimpleCircleNode.js +14 -0
  6. package/esm/designs/items/index.d.ts +1 -0
  7. package/esm/designs/items/index.js +1 -0
  8. package/esm/designs/structures/hierarchy-mindmap.js +19 -5
  9. package/esm/designs/structures/hierarchy-tree.d.ts +2 -1
  10. package/esm/designs/structures/hierarchy-tree.js +23 -20
  11. package/esm/designs/structures/index.d.ts +1 -0
  12. package/esm/designs/structures/index.js +1 -0
  13. package/esm/designs/structures/relation-dagre-flow.d.ts +21 -0
  14. package/esm/designs/structures/relation-dagre-flow.js +497 -0
  15. package/esm/designs/utils/hierarchy-color.d.ts +1 -1
  16. package/esm/editor/plugins/edit-bar/edit-bar.js +27 -9
  17. package/esm/index.js +1 -1
  18. package/esm/jsx/global.d.ts +1 -0
  19. package/esm/jsx/types/element.d.ts +5 -1
  20. package/esm/jsx/utils/svg.js +2 -0
  21. package/esm/renderer/composites/icon.js +2 -0
  22. package/esm/renderer/composites/illus.d.ts +1 -1
  23. package/esm/renderer/composites/illus.js +9 -4
  24. package/esm/renderer/composites/text.js +4 -2
  25. package/esm/renderer/fonts/loader.js +3 -1
  26. package/esm/renderer/fonts/registry.js +1 -1
  27. package/esm/renderer/renderer.js +28 -25
  28. package/esm/resource/loader.js +3 -1
  29. package/esm/runtime/Infographic.js +1 -1
  30. package/esm/ssr/dom-shim.d.ts +4 -0
  31. package/esm/ssr/dom-shim.js +107 -0
  32. package/esm/ssr/index.d.ts +1 -0
  33. package/esm/ssr/index.js +1 -0
  34. package/esm/ssr/renderer.d.ts +2 -0
  35. package/esm/ssr/renderer.js +60 -0
  36. package/esm/syntax/index.js +57 -1
  37. package/esm/syntax/parser.js +44 -0
  38. package/esm/syntax/relations.d.ts +6 -0
  39. package/esm/syntax/relations.js +251 -0
  40. package/esm/syntax/schema.d.ts +1 -0
  41. package/esm/syntax/schema.js +12 -0
  42. package/esm/templates/built-in.js +2 -0
  43. package/esm/templates/relation-dagre-flow.d.ts +2 -0
  44. package/esm/templates/relation-dagre-flow.js +68 -0
  45. package/esm/types/data.d.ts +24 -3
  46. package/esm/utils/data.js +1 -1
  47. package/esm/utils/index.d.ts +1 -0
  48. package/esm/utils/index.js +1 -0
  49. package/esm/utils/is-browser.js +5 -9
  50. package/esm/utils/measure-text.d.ts +2 -2
  51. package/esm/utils/measure-text.js +4 -4
  52. package/esm/utils/recognizer.js +8 -5
  53. package/esm/utils/text.js +27 -19
  54. package/lib/designs/items/BadgeCard.js +6 -1
  55. package/lib/designs/items/SimpleCircleNode.d.ts +8 -0
  56. package/lib/designs/items/SimpleCircleNode.js +18 -0
  57. package/lib/designs/items/index.d.ts +1 -0
  58. package/lib/designs/items/index.js +1 -0
  59. package/lib/designs/structures/hierarchy-mindmap.js +19 -5
  60. package/lib/designs/structures/hierarchy-tree.d.ts +2 -1
  61. package/lib/designs/structures/hierarchy-tree.js +23 -20
  62. package/lib/designs/structures/index.d.ts +1 -0
  63. package/lib/designs/structures/index.js +1 -0
  64. package/lib/designs/structures/relation-dagre-flow.d.ts +21 -0
  65. package/lib/designs/structures/relation-dagre-flow.js +501 -0
  66. package/lib/designs/utils/hierarchy-color.d.ts +1 -1
  67. package/lib/editor/plugins/edit-bar/edit-bar.js +27 -9
  68. package/lib/jsx/global.d.ts +1 -0
  69. package/lib/jsx/types/element.d.ts +5 -1
  70. package/lib/jsx/utils/svg.js +2 -0
  71. package/lib/renderer/composites/icon.js +2 -0
  72. package/lib/renderer/composites/illus.d.ts +1 -1
  73. package/lib/renderer/composites/illus.js +8 -3
  74. package/lib/renderer/composites/text.js +4 -2
  75. package/lib/renderer/fonts/loader.js +2 -0
  76. package/lib/renderer/fonts/registry.js +6 -6
  77. package/lib/renderer/renderer.js +27 -24
  78. package/lib/resource/loader.js +3 -1
  79. package/lib/runtime/Infographic.js +1 -1
  80. package/lib/ssr/dom-shim.d.ts +4 -0
  81. package/lib/ssr/dom-shim.js +110 -0
  82. package/lib/ssr/index.d.ts +1 -0
  83. package/lib/ssr/index.js +5 -0
  84. package/lib/ssr/renderer.d.ts +2 -0
  85. package/lib/ssr/renderer.js +63 -0
  86. package/lib/syntax/index.js +57 -1
  87. package/lib/syntax/parser.js +44 -0
  88. package/lib/syntax/relations.d.ts +6 -0
  89. package/lib/syntax/relations.js +254 -0
  90. package/lib/syntax/schema.d.ts +1 -0
  91. package/lib/syntax/schema.js +13 -1
  92. package/lib/templates/built-in.js +2 -0
  93. package/lib/templates/relation-dagre-flow.d.ts +2 -0
  94. package/lib/templates/relation-dagre-flow.js +71 -0
  95. package/lib/types/data.d.ts +24 -3
  96. package/lib/utils/data.js +2 -5
  97. package/lib/utils/index.d.ts +1 -0
  98. package/lib/utils/index.js +1 -0
  99. package/lib/utils/is-browser.js +5 -9
  100. package/lib/utils/measure-text.d.ts +2 -2
  101. package/lib/utils/measure-text.js +4 -4
  102. package/lib/utils/recognizer.js +8 -5
  103. package/lib/utils/text.js +28 -23
  104. package/package.json +19 -7
  105. package/src/designs/items/BadgeCard.tsx +9 -2
  106. package/src/designs/items/SimpleCircleNode.tsx +46 -0
  107. package/src/designs/items/index.ts +1 -0
  108. package/src/designs/structures/hierarchy-mindmap.tsx +15 -2
  109. package/src/designs/structures/hierarchy-tree.tsx +33 -31
  110. package/src/designs/structures/index.ts +1 -0
  111. package/src/designs/structures/relation-dagre-flow.tsx +782 -0
  112. package/src/designs/utils/hierarchy-color.ts +6 -1
  113. package/src/editor/plugins/edit-bar/edit-bar.ts +41 -17
  114. package/src/index.ts +1 -1
  115. package/src/jsx/global.ts +1 -0
  116. package/src/jsx/types/element.ts +15 -6
  117. package/src/jsx/utils/svg.ts +2 -0
  118. package/src/renderer/composites/icon.ts +2 -0
  119. package/src/renderer/composites/illus.ts +16 -3
  120. package/src/renderer/composites/text.ts +7 -2
  121. package/src/renderer/fonts/loader.ts +7 -1
  122. package/src/renderer/fonts/registry.ts +1 -1
  123. package/src/renderer/renderer.ts +42 -24
  124. package/src/resource/loader.ts +3 -1
  125. package/src/runtime/Infographic.tsx +1 -1
  126. package/src/ssr/dom-shim.ts +120 -0
  127. package/src/ssr/index.ts +1 -0
  128. package/src/ssr/renderer.ts +72 -0
  129. package/src/syntax/index.ts +58 -1
  130. package/src/syntax/parser.ts +49 -0
  131. package/src/syntax/relations.ts +291 -0
  132. package/src/syntax/schema.ts +16 -0
  133. package/src/templates/built-in.ts +4 -2
  134. package/src/templates/relation-dagre-flow.ts +73 -0
  135. package/src/types/data.ts +26 -3
  136. package/src/utils/data.ts +1 -1
  137. package/src/utils/index.ts +1 -0
  138. package/src/utils/is-browser.ts +3 -9
  139. package/src/utils/measure-text.ts +6 -7
  140. package/src/utils/recognizer.ts +9 -5
  141. package/src/utils/svg.ts +0 -1
  142. package/src/utils/text.ts +25 -19
@@ -1,10 +1,9 @@
1
1
  import { measureText as measure, registerFont } from 'measury';
2
2
  import AlibabaPuHuiTi from 'measury/fonts/AlibabaPuHuiTi-Regular';
3
- import { TextProps } from '../jsx';
3
+ import { JSXNode, TextProps } from '../jsx';
4
4
  import { DEFAULT_FONT } from '../renderer';
5
5
  import { encodeFontFamily } from './font';
6
6
  import { isBrowser } from './is-browser';
7
- import { isNode } from './is-node';
8
7
 
9
8
  let FONT_EXTEND_FACTOR = 1.01;
10
9
 
@@ -12,9 +11,7 @@ export const setFontExtendFactor = (factor: number) => {
12
11
  FONT_EXTEND_FACTOR = factor;
13
12
  };
14
13
 
15
- if (isNode) {
16
- registerFont(AlibabaPuHuiTi);
17
- }
14
+ registerFont(AlibabaPuHuiTi);
18
15
 
19
16
  let canvasContext: CanvasRenderingContext2D | null = null;
20
17
  let measureSpan: HTMLSpanElement | null = null;
@@ -105,13 +102,15 @@ function measureTextInBrowser(
105
102
  }
106
103
 
107
104
  export function measureText(
108
- text: string | number | undefined = '',
105
+ text: JSXNode = '',
109
106
  attrs: TextProps,
110
107
  ): { width: number; height: number } {
111
108
  if (attrs.width && attrs.height) {
112
109
  return { width: attrs.width, height: attrs.height };
113
110
  }
114
-
111
+ if (typeof text !== 'string' && typeof text !== 'number') {
112
+ return { width: 0, height: 0 };
113
+ }
115
114
  const {
116
115
  fontFamily = DEFAULT_FONT,
117
116
  fontSize = 14,
@@ -6,8 +6,12 @@ import { getTextEntity } from './text';
6
6
  const is = (element: SVGElement, role: string) => {
7
7
  return element?.dataset?.elementType === role;
8
8
  };
9
+ const isTagName = (element: HTMLElement | SVGElement, tagName: string) => {
10
+ return element.tagName.toLowerCase() === tagName.toLowerCase();
11
+ };
12
+
9
13
  export const isSVG = (element: any): element is SVGSVGElement =>
10
- element instanceof SVGElement && element.tagName === 'svg';
14
+ element instanceof SVGElement && isTagName(element, 'svg');
11
15
  export const isTitle = (element: SVGElement) => is(element, 'title');
12
16
  export const isDesc = (element: SVGElement) => is(element, 'desc');
13
17
  export const isShape = (element: SVGElement) => is(element, 'shape');
@@ -15,9 +19,9 @@ export const isShapesGroup = (element: SVGElement) =>
15
19
  is(element, 'shapes-group');
16
20
  export const isIllus = (element: SVGElement) => is(element, 'illus');
17
21
  export const isText = (element: SVGElement): element is SVGTextElement =>
18
- element instanceof SVGElement && element.tagName === 'text';
22
+ element instanceof SVGElement && isTagName(element, 'text');
19
23
  export const isGroup = (element: SVGElement): element is SVGGElement =>
20
- element instanceof SVGElement && element.tagName === 'g';
24
+ element instanceof SVGElement && isTagName(element, 'g');
21
25
  export const isItemIcon = (element: SVGElement) => is(element, 'item-icon');
22
26
  export const isItemIconGroup = (element: SVGElement) =>
23
27
  is(element, 'item-icon-group');
@@ -37,11 +41,11 @@ export const isRoughVolume = (element: SVGElement) =>
37
41
  export function isForeignObjectElement(
38
42
  element: any,
39
43
  ): element is SVGForeignObjectElement {
40
- return element.tagName === 'foreignObject';
44
+ return isTagName(element, 'foreignObject');
41
45
  }
42
46
 
43
47
  export function isTextEntity(element: any): element is HTMLSpanElement {
44
- return element.tagName === 'SPAN';
48
+ return isTagName(element, 'SPAN');
45
49
  }
46
50
 
47
51
  export function isEditableText(node: SVGElement): node is TextElement {
package/src/utils/svg.ts CHANGED
@@ -82,7 +82,6 @@ export function getOrCreateDefs(
82
82
  const defs = svg.querySelector<SVGDefsElement>(selector);
83
83
 
84
84
  if (defs) return defs;
85
-
86
85
  const newDefs = createElement<SVGDefsElement>('defs');
87
86
  if (defsId) newDefs.id = defsId;
88
87
  svg.prepend(newDefs);
package/src/utils/text.ts CHANGED
@@ -1,4 +1,4 @@
1
- import camelCase from 'lodash-es/camelCase';
1
+ import { camelCase } from 'lodash-es';
2
2
  import { TextProps } from '../editor';
3
3
  import type {
4
4
  TextAttributes,
@@ -7,6 +7,7 @@ import type {
7
7
  TextVerticalAlign,
8
8
  } from '../types';
9
9
  import { decodeFontFamily, encodeFontFamily } from './font';
10
+ import { measureText } from './measure-text';
10
11
  import { isForeignObjectElement } from './recognizer';
11
12
  import { createElement, setAttributes } from './svg';
12
13
 
@@ -20,6 +21,8 @@ export function createTextElement(
20
21
  attributes: TextAttributes,
21
22
  ): TextElement {
22
23
  const entity = document.createElement('span');
24
+ // Set xmlns on the span element (HTML content)
25
+ entity.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
23
26
  const foreignObject = createElement<SVGForeignObjectElement>(
24
27
  'foreignObject',
25
28
  { overflow: 'visible' },
@@ -46,9 +49,19 @@ export function updateTextElement(
46
49
 
47
50
  if (entity) {
48
51
  Object.assign(entity.style, getTextStyle(attributes));
49
-
50
52
  if (!width || !height) {
51
- const rect = measureTextSpan(entity);
53
+ const content = textContent ?? getTextContent(text);
54
+ const { fontFamily, fontSize, fontWeight, lineHeight } = entity.style;
55
+ const fSize = fontSize ? parseFloat(String(fontSize)) : 12;
56
+ const rect = measureText(content, {
57
+ fontFamily,
58
+ fontSize: fSize,
59
+ fontWeight,
60
+ lineHeight: lineHeight.endsWith('px')
61
+ ? parseFloat(lineHeight)
62
+ : (parseFloat(lineHeight) || 1.4) * fSize,
63
+ });
64
+
52
65
  if (!width && !text.hasAttribute('width')) width = String(rect.width);
53
66
  if (!height && !text.hasAttribute('height')) height = String(rect.height);
54
67
  }
@@ -153,32 +166,25 @@ export function getTextStyle(attributes: TextAttributes) {
153
166
  : +lineHeight;
154
167
  if (letterSpacing) style.letterSpacing = `${letterSpacing}px`;
155
168
  if (strokeWidth) style.strokeWidth = `${strokeWidth}px`;
156
- style.fontFamily = fontFamily
157
- ? encodeFontFamily(fontFamily)
158
- : fontFamily || '';
169
+ if (fontFamily) style.fontFamily = encodeFontFamily(fontFamily);
159
170
 
160
171
  return style;
161
172
  }
162
173
 
163
- function measureTextSpan(span: HTMLSpanElement) {
164
- const parentNode = span.parentNode;
165
- span.style.visibility = 'hidden';
166
- document.body.appendChild(span);
167
- const rect = span.getBoundingClientRect();
168
- if (parentNode) parentNode.appendChild(span);
169
- else document.body.removeChild(span);
170
- span.style.visibility = 'visible';
171
- return rect;
172
- }
173
-
174
174
  export function getTextContent(text: TextElement): string {
175
- return getTextEntity(text)?.innerText || '';
175
+ const entity = getTextEntity(text);
176
+ if (!entity) return '';
177
+ return entity.innerText || entity.textContent || '';
176
178
  }
177
179
 
178
180
  export function setTextContent(text: TextElement, content: string): void {
179
181
  const entity = getTextEntity(text);
180
182
  if (entity) {
181
- entity.innerText = content;
183
+ try {
184
+ entity.innerText = content;
185
+ } catch {
186
+ entity.textContent = content;
187
+ }
182
188
  }
183
189
  }
184
190