@idraw/renderer 0.4.0-beta.3 → 0.4.0-beta.30

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.
@@ -1,24 +1,57 @@
1
- import { rotateElement, generateSVGPath } from '@idraw/util';
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { rotateElement, generateSVGPath, calcViewElementSize } from '@idraw/util';
2
13
  import { drawBox, drawBoxShadow } from './box';
3
14
  export function drawPath(ctx, elem, opts) {
15
+ var _a, _b;
4
16
  const { detail } = elem;
5
- const { originX, originY, originW, originH } = detail;
6
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
7
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
17
+ const { originX, originY, originW, originH, fillRule } = detail;
18
+ const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
19
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
8
20
  const scaleW = w / originW;
9
21
  const scaleH = h / originH;
10
22
  const viewOriginX = originX * scaleW;
11
23
  const viewOriginY = originY * scaleH;
12
24
  const internalX = x - viewOriginX;
13
25
  const internalY = y - viewOriginY;
26
+ const _c = elem.detail, { clipPath, clipPathStrokeColor, clipPathStrokeWidth } = _c, restDetail = __rest(_c, ["clipPath", "clipPathStrokeColor", "clipPathStrokeWidth"]);
14
27
  const scaleNum = viewScaleInfo.scale * viewSizeInfo.devicePixelRatio;
15
28
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
29
+ let boxViewElem = Object.assign({}, viewElem);
30
+ boxViewElem.detail = restDetail;
31
+ let boxOriginElem = Object.assign({}, elem);
32
+ boxOriginElem.detail = restDetail;
33
+ if (detail.fill && detail.fill !== 'string' && ((_b = (_a = detail.fill) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.includes('gradient'))) {
34
+ boxViewElem = Object.assign(Object.assign({}, viewElem), {
35
+ detail: Object.assign(Object.assign({}, viewElem.detail), {
36
+ background: detail.fill,
37
+ clipPath: {
38
+ commands: detail.commands,
39
+ originX,
40
+ originY,
41
+ originW,
42
+ originH
43
+ }
44
+ })
45
+ });
46
+ boxOriginElem.detail = Object.assign({}, boxViewElem.detail);
47
+ }
16
48
  rotateElement(ctx, { x, y, w, h, angle }, () => {
17
- drawBox(ctx, viewElem, {
18
- originElem: elem,
49
+ drawBox(ctx, boxViewElem, {
50
+ originElem: boxOriginElem,
19
51
  calcElemSize: { x, y, w, h, angle },
20
52
  viewScaleInfo,
21
53
  viewSizeInfo,
54
+ parentOpacity,
22
55
  renderContent: () => {
23
56
  drawBoxShadow(ctx, viewElem, {
24
57
  viewScaleInfo,
@@ -30,8 +63,15 @@ export function drawPath(ctx, elem, opts) {
30
63
  const pathStr = generateSVGPath(detail.commands || []);
31
64
  const path2d = new Path2D(pathStr);
32
65
  if (detail.fill) {
33
- ctx.fillStyle = detail.fill;
34
- ctx.fill(path2d);
66
+ if (typeof detail.fill === 'string') {
67
+ ctx.fillStyle = detail.fill;
68
+ }
69
+ else {
70
+ ctx.fillStyle = 'transparent';
71
+ }
72
+ }
73
+ if (detail.fill) {
74
+ ctx.fill(path2d, fillRule);
35
75
  }
36
76
  if (detail.stroke && detail.strokeWidth !== 0) {
37
77
  ctx.strokeStyle = detail.stroke;
@@ -1,8 +1,8 @@
1
- import { rotateElement } from '@idraw/util';
1
+ import { rotateElement, calcViewElementSize } from '@idraw/util';
2
2
  import { drawBox, drawBoxShadow } from './box';
3
3
  export function drawRect(ctx, elem, opts) {
4
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
5
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
4
+ const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
5
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
6
6
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
7
7
  rotateElement(ctx, { x, y, w, h, angle }, () => {
8
8
  drawBoxShadow(ctx, viewElem, {
@@ -14,6 +14,7 @@ export function drawRect(ctx, elem, opts) {
14
14
  calcElemSize: { x, y, w, h, angle },
15
15
  viewScaleInfo,
16
16
  viewSizeInfo,
17
+ parentOpacity,
17
18
  renderContent: () => {
18
19
  }
19
20
  });
@@ -1,17 +1,17 @@
1
- import { rotateElement } from '@idraw/util';
1
+ import { rotateElement, calcViewElementSize } from '@idraw/util';
2
+ import { getOpacity } from './box';
2
3
  export function drawSVG(ctx, elem, opts) {
3
4
  const content = opts.loader.getContent(elem);
4
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
5
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
5
+ const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
6
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo, viewSizeInfo }) || elem;
6
7
  rotateElement(ctx, { x, y, w, h, angle }, () => {
7
- if (!content) {
8
+ if (!content && !opts.loader.isDestroyed()) {
8
9
  opts.loader.load(elem, opts.elementAssets || {});
9
10
  }
10
11
  if (elem.type === 'svg' && content) {
11
- const { opacity } = elem.detail;
12
- ctx.globalAlpha = opacity ? opacity : 1;
12
+ ctx.globalAlpha = getOpacity(elem) * parentOpacity;
13
13
  ctx.drawImage(content, x, y, w, h);
14
- ctx.globalAlpha = 1;
14
+ ctx.globalAlpha = parentOpacity;
15
15
  }
16
16
  });
17
17
  }
@@ -1,53 +1,106 @@
1
- import { rotateElement } from '@idraw/util';
1
+ import { rotateElement, calcViewElementSize, enhanceFontFamliy } from '@idraw/util';
2
2
  import { is, isColorStr, getDefaultElementDetailConfig } from '@idraw/util';
3
- import { drawBox } from './box';
3
+ import { drawBox, drawBoxShadow } from './box';
4
4
  const detailConfig = getDefaultElementDetailConfig();
5
+ function isTextWidthWithinErrorRange(w0, w1, scale) {
6
+ if (scale < 0.5) {
7
+ if (w0 < w1 && (w0 - w1) / w0 > -0.15) {
8
+ return true;
9
+ }
10
+ }
11
+ return w0 >= w1;
12
+ }
5
13
  export function drawText(ctx, elem, opts) {
6
- const { calculator, viewScaleInfo, viewSizeInfo } = opts;
7
- const { x, y, w, h, angle } = (calculator === null || calculator === void 0 ? void 0 : calculator.elementSize(elem, viewScaleInfo, viewSizeInfo)) || elem;
14
+ const { viewScaleInfo, viewSizeInfo, parentOpacity } = opts;
15
+ const { x, y, w, h, angle } = calcViewElementSize(elem, { viewScaleInfo }) || elem;
8
16
  const viewElem = Object.assign(Object.assign({}, elem), { x, y, w, h, angle });
9
17
  rotateElement(ctx, { x, y, w, h, angle }, () => {
10
- drawBox(ctx, viewElem, {
11
- originElem: elem,
12
- calcElemSize: { x, y, w, h, angle },
18
+ drawBoxShadow(ctx, viewElem, {
13
19
  viewScaleInfo,
14
20
  viewSizeInfo,
15
21
  renderContent: () => {
16
- const detail = Object.assign(Object.assign({}, detailConfig), elem.detail);
17
- const fontSize = (detail.fontSize || detailConfig.fontSize) * viewScaleInfo.scale;
18
- const lineHeight = detail.lineHeight ? detail.lineHeight * viewScaleInfo.scale : fontSize;
19
- ctx.fillStyle = elem.detail.color || detailConfig.color;
20
- ctx.textBaseline = 'top';
21
- ctx.$setFont({
22
- fontWeight: detail.fontWeight,
23
- fontSize: fontSize,
24
- fontFamily: detail.fontFamily
22
+ drawBox(ctx, viewElem, {
23
+ originElem: elem,
24
+ calcElemSize: { x, y, w, h, angle },
25
+ viewScaleInfo,
26
+ viewSizeInfo,
27
+ parentOpacity
25
28
  });
26
- const detailText = detail.text.replace(/\r\n/gi, '\n');
27
- const fontHeight = lineHeight;
28
- const detailTextList = detailText.split('\n');
29
- const lines = [];
30
- let lineNum = 0;
31
- detailTextList.forEach((tempText, idx) => {
29
+ }
30
+ });
31
+ {
32
+ const detail = Object.assign(Object.assign({}, detailConfig), elem.detail);
33
+ const originFontSize = detail.fontSize || detailConfig.fontSize;
34
+ const fontSize = originFontSize * viewScaleInfo.scale;
35
+ if (fontSize < 2) {
36
+ return;
37
+ }
38
+ const originLineHeight = detail.lineHeight || originFontSize;
39
+ const lineHeight = originLineHeight * viewScaleInfo.scale;
40
+ ctx.fillStyle = elem.detail.color || detailConfig.color;
41
+ ctx.textBaseline = 'top';
42
+ ctx.$setFont({
43
+ fontWeight: detail.fontWeight,
44
+ fontSize: fontSize,
45
+ fontFamily: enhanceFontFamliy(detail.fontFamily)
46
+ });
47
+ let detailText = detail.text.replace(/\r\n/gi, '\n');
48
+ if (detail.textTransform === 'lowercase') {
49
+ detailText = detailText.toLowerCase();
50
+ }
51
+ else if (detail.textTransform === 'uppercase') {
52
+ detailText = detailText.toUpperCase();
53
+ }
54
+ const fontHeight = lineHeight;
55
+ const detailTextList = detailText.split('\n');
56
+ const lines = [];
57
+ let lineNum = 0;
58
+ detailTextList.forEach((itemText, idx) => {
59
+ if (detail.minInlineSize === 'maxContent') {
60
+ lines.push({
61
+ text: itemText,
62
+ width: ctx.$undoPixelRatio(ctx.measureText(itemText).width)
63
+ });
64
+ }
65
+ else {
32
66
  let lineText = '';
33
- if (tempText.length > 0) {
34
- for (let i = 0; i < tempText.length; i++) {
35
- if (ctx.measureText(lineText + (tempText[i] || '')).width < ctx.$doPixelRatio(w)) {
36
- lineText += tempText[i] || '';
67
+ let splitStr = '';
68
+ let tempStrList = itemText.split(splitStr);
69
+ if (detail.wordBreak === 'normal') {
70
+ const splitStr = ' ';
71
+ const wordList = itemText.split(splitStr);
72
+ tempStrList = [];
73
+ wordList.forEach((word, idx) => {
74
+ tempStrList.push(word);
75
+ if (idx < wordList.length - 1) {
76
+ tempStrList.push(splitStr);
77
+ }
78
+ });
79
+ }
80
+ if (tempStrList.length === 1 && detail.overflow === 'visible') {
81
+ lines.push({
82
+ text: tempStrList[0],
83
+ width: ctx.$undoPixelRatio(ctx.measureText(tempStrList[0]).width)
84
+ });
85
+ }
86
+ else if (tempStrList.length > 0) {
87
+ for (let i = 0; i < tempStrList.length; i++) {
88
+ if (isTextWidthWithinErrorRange(ctx.$doPixelRatio(w), ctx.measureText(lineText + tempStrList[i]).width, viewScaleInfo.scale)) {
89
+ lineText += tempStrList[i] || '';
37
90
  }
38
91
  else {
39
92
  lines.push({
40
93
  text: lineText,
41
94
  width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
42
95
  });
43
- lineText = tempText[i] || '';
96
+ lineText = tempStrList[i] || '';
44
97
  lineNum++;
45
98
  }
46
- if ((lineNum + 1) * fontHeight > h) {
99
+ if ((lineNum + 1) * fontHeight > h && detail.overflow === 'hidden') {
47
100
  break;
48
101
  }
49
- if (tempText.length - 1 === i) {
50
- if ((lineNum + 1) * fontHeight < h) {
102
+ if (tempStrList.length - 1 === i) {
103
+ if ((lineNum + 1) * fontHeight <= h) {
51
104
  lines.push({
52
105
  text: lineText,
53
106
  width: ctx.$undoPixelRatio(ctx.measureText(lineText).width)
@@ -66,45 +119,49 @@ export function drawText(ctx, elem, opts) {
66
119
  width: 0
67
120
  });
68
121
  }
69
- });
70
- let startY = 0;
71
- if (lines.length * fontHeight < h) {
72
- if (elem.detail.verticalAlign === 'top') {
73
- startY = 0;
74
- }
75
- else if (elem.detail.verticalAlign === 'bottom') {
76
- startY += h - lines.length * fontHeight;
77
- }
78
- else {
79
- startY += (h - lines.length * fontHeight) / 2;
80
- }
81
122
  }
82
- {
83
- const _y = y + startY;
84
- if (detail.textShadowColor !== undefined && isColorStr(detail.textShadowColor)) {
85
- ctx.shadowColor = detail.textShadowColor;
86
- }
87
- if (detail.textShadowOffsetX !== undefined && is.number(detail.textShadowOffsetX)) {
88
- ctx.shadowOffsetX = detail.textShadowOffsetX;
89
- }
90
- if (detail.textShadowOffsetY !== undefined && is.number(detail.textShadowOffsetY)) {
91
- ctx.shadowOffsetY = detail.textShadowOffsetY;
123
+ });
124
+ let startY = 0;
125
+ let eachLineStartY = 0;
126
+ if (fontHeight > fontSize) {
127
+ eachLineStartY = (fontHeight - fontSize) / 2;
128
+ }
129
+ if (lines.length * fontHeight < h) {
130
+ if (elem.detail.verticalAlign === 'top') {
131
+ startY = 0;
132
+ }
133
+ else if (elem.detail.verticalAlign === 'bottom') {
134
+ startY += h - lines.length * fontHeight;
135
+ }
136
+ else {
137
+ startY += (h - lines.length * fontHeight) / 2;
138
+ }
139
+ }
140
+ {
141
+ const _y = y + startY;
142
+ if (detail.textShadowColor !== undefined && isColorStr(detail.textShadowColor)) {
143
+ ctx.shadowColor = detail.textShadowColor;
144
+ }
145
+ if (detail.textShadowOffsetX !== undefined && is.number(detail.textShadowOffsetX)) {
146
+ ctx.shadowOffsetX = detail.textShadowOffsetX;
147
+ }
148
+ if (detail.textShadowOffsetY !== undefined && is.number(detail.textShadowOffsetY)) {
149
+ ctx.shadowOffsetY = detail.textShadowOffsetY;
150
+ }
151
+ if (detail.textShadowBlur !== undefined && is.number(detail.textShadowBlur)) {
152
+ ctx.shadowBlur = detail.textShadowBlur;
153
+ }
154
+ lines.forEach((line, i) => {
155
+ let _x = x;
156
+ if (detail.textAlign === 'center') {
157
+ _x = x + (w - line.width) / 2;
92
158
  }
93
- if (detail.textShadowBlur !== undefined && is.number(detail.textShadowBlur)) {
94
- ctx.shadowBlur = detail.textShadowBlur;
159
+ else if (detail.textAlign === 'right') {
160
+ _x = x + (w - line.width);
95
161
  }
96
- lines.forEach((line, i) => {
97
- let _x = x;
98
- if (detail.textAlign === 'center') {
99
- _x = x + (w - line.width) / 2;
100
- }
101
- else if (detail.textAlign === 'right') {
102
- _x = x + (w - line.width);
103
- }
104
- ctx.fillText(line.text, _x, _y + fontHeight * i);
105
- });
106
- }
162
+ ctx.fillText(line.text, _x, _y + fontHeight * i + eachLineStartY);
163
+ });
107
164
  }
108
- });
165
+ }
109
166
  });
110
167
  }
@@ -1,9 +1,17 @@
1
1
  import { EventEmitter } from '@idraw/util';
2
+ import type { LoadItemMap } from '@idraw/types';
3
+ import { Loader } from './loader';
2
4
  import type { Data, BoardRenderer, RendererOptions, RendererEventMap, RendererDrawOptions } from '@idraw/types';
3
5
  export declare class Renderer extends EventEmitter<RendererEventMap> implements BoardRenderer {
4
6
  #private;
5
7
  constructor(opts: RendererOptions);
8
+ isDestroyed(): boolean;
9
+ destroy(): void;
6
10
  updateOptions(opts: RendererOptions): void;
7
11
  drawData(data: Data, opts: RendererDrawOptions): void;
8
12
  scale(num: number): void;
13
+ setLoadItemMap(itemMap: LoadItemMap): void;
14
+ getLoadItemMap(): LoadItemMap;
15
+ getLoader(): Loader;
9
16
  }
17
+ export { drawRect } from './draw';
package/dist/esm/index.js CHANGED
@@ -9,9 +9,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _Renderer_instances, _Renderer_opts, _Renderer_loader, _Renderer_init;
12
+ var _Renderer_instances, _Renderer_opts, _Renderer_loader, _Renderer_hasDestroyed, _Renderer_init;
13
13
  import { EventEmitter } from '@idraw/util';
14
- import { drawElementList } from './draw/index';
14
+ import { drawElementList, drawLayout, drawGlobalBackground } from './draw/index';
15
15
  import { Loader } from './loader';
16
16
  export class Renderer extends EventEmitter {
17
17
  constructor(opts) {
@@ -19,15 +19,26 @@ export class Renderer extends EventEmitter {
19
19
  _Renderer_instances.add(this);
20
20
  _Renderer_opts.set(this, void 0);
21
21
  _Renderer_loader.set(this, new Loader());
22
+ _Renderer_hasDestroyed.set(this, false);
22
23
  __classPrivateFieldSet(this, _Renderer_opts, opts, "f");
23
24
  __classPrivateFieldGet(this, _Renderer_instances, "m", _Renderer_init).call(this);
24
25
  }
26
+ isDestroyed() {
27
+ return __classPrivateFieldGet(this, _Renderer_hasDestroyed, "f");
28
+ }
29
+ destroy() {
30
+ this.clear();
31
+ __classPrivateFieldSet(this, _Renderer_opts, null, "f");
32
+ __classPrivateFieldGet(this, _Renderer_loader, "f").destroy();
33
+ __classPrivateFieldSet(this, _Renderer_loader, null, "f");
34
+ __classPrivateFieldSet(this, _Renderer_hasDestroyed, true, "f");
35
+ }
25
36
  updateOptions(opts) {
26
37
  __classPrivateFieldSet(this, _Renderer_opts, opts, "f");
27
38
  }
28
39
  drawData(data, opts) {
29
40
  const loader = __classPrivateFieldGet(this, _Renderer_loader, "f");
30
- const { calculator } = __classPrivateFieldGet(this, _Renderer_opts, "f");
41
+ const { calculator, sharer } = __classPrivateFieldGet(this, _Renderer_opts, "f");
31
42
  const viewContext = __classPrivateFieldGet(this, _Renderer_opts, "f").viewContext;
32
43
  viewContext.clearRect(0, 0, viewContext.canvas.width, viewContext.canvas.height);
33
44
  const parentElementSize = {
@@ -36,9 +47,18 @@ export class Renderer extends EventEmitter {
36
47
  w: opts.viewSizeInfo.width,
37
48
  h: opts.viewSizeInfo.height
38
49
  };
39
- drawElementList(viewContext, data, Object.assign({ loader,
50
+ const drawOpts = Object.assign({ loader,
40
51
  calculator,
41
- parentElementSize, elementAssets: data.assets }, opts));
52
+ parentElementSize, elementAssets: data.assets, parentOpacity: 1, overrideElementMap: sharer === null || sharer === void 0 ? void 0 : sharer.getActiveOverrideElemenentMap() }, opts);
53
+ drawGlobalBackground(viewContext, data.global, drawOpts);
54
+ if (data.layout) {
55
+ drawLayout(viewContext, data.layout, drawOpts, () => {
56
+ drawElementList(viewContext, data, drawOpts);
57
+ });
58
+ }
59
+ else {
60
+ drawElementList(viewContext, data, drawOpts);
61
+ }
42
62
  }
43
63
  scale(num) {
44
64
  const { sharer } = __classPrivateFieldGet(this, _Renderer_opts, "f");
@@ -65,12 +85,23 @@ export class Renderer extends EventEmitter {
65
85
  });
66
86
  }
67
87
  }
88
+ setLoadItemMap(itemMap) {
89
+ __classPrivateFieldGet(this, _Renderer_loader, "f").setLoadItemMap(itemMap);
90
+ }
91
+ getLoadItemMap() {
92
+ return __classPrivateFieldGet(this, _Renderer_loader, "f").getLoadItemMap();
93
+ }
94
+ getLoader() {
95
+ return __classPrivateFieldGet(this, _Renderer_loader, "f");
96
+ }
68
97
  }
69
- _Renderer_opts = new WeakMap(), _Renderer_loader = new WeakMap(), _Renderer_instances = new WeakSet(), _Renderer_init = function _Renderer_init() {
98
+ _Renderer_opts = new WeakMap(), _Renderer_loader = new WeakMap(), _Renderer_hasDestroyed = new WeakMap(), _Renderer_instances = new WeakSet(), _Renderer_init = function _Renderer_init() {
70
99
  const loader = __classPrivateFieldGet(this, _Renderer_loader, "f");
71
100
  loader.on('load', (e) => {
72
101
  this.trigger('load', e);
73
102
  });
74
- loader.on('error', () => {
103
+ loader.on('error', (e) => {
104
+ console.error(e);
75
105
  });
76
106
  };
107
+ export { drawRect } from './draw';
@@ -1,17 +1,12 @@
1
- import type { RendererLoader, LoaderEventMap, LoadContent, LoadElementType, Element, ElementAssets } from '@idraw/types';
1
+ import type { RendererLoader, LoaderEventMap, LoadContent, LoadItemMap, LoadElementType, Element, ElementAssets } from '@idraw/types';
2
2
  import { EventEmitter } from '@idraw/util';
3
3
  export declare class Loader extends EventEmitter<LoaderEventMap> implements RendererLoader {
4
- private _loadFuncMap;
5
- private _currentLoadItemMap;
6
- private _storageLoadItemMap;
4
+ #private;
7
5
  constructor();
8
- private _registerLoadFunc;
9
- private _getLoadElementSource;
10
- private _createLoadItem;
11
- private _emitLoad;
12
- private _emitError;
13
- private _loadResource;
14
- private _isExistingErrorStorage;
6
+ isDestroyed(): boolean;
7
+ destroy(): void;
15
8
  load(element: Element<LoadElementType>, assets: ElementAssets): void;
16
9
  getContent(element: Element<LoadElementType>): LoadContent | null;
10
+ getLoadItemMap(): LoadItemMap;
11
+ setLoadItemMap(itemMap: LoadItemMap): void;
17
12
  }