ice-entity-designer 0.0.37 → 0.0.39

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.
@@ -66,6 +66,13 @@ export default class FlowNode extends ICEGroup {
66
66
  * 不参与引擎序列化(否则往返会重复挂载,且子组件 zIndex 抖动,见 ICEComponent.hasDerivedChildren)。
67
67
  */
68
68
  hasDerivedChildren(): boolean;
69
+ /**
70
+ * FlowNode **既是复合组件、又是容器**:形状 / 标题 / BPMN 角标都是派生的(不进文档),
71
+ * 但池装泳道、泳道装节点、分组装子节点都是**真实子节点**,必须进文档 ——
72
+ * 不然 `serialize() → load()` 之后池里的泳道与节点会整套消失(实测:3 个元素只剩 1 个)。
73
+ * 引擎的 `getSerializableChildren()` 钩子正是为这种「复合 + 容器」组件准备的。
74
+ */
75
+ getSerializableChildren(): any[];
69
76
  constructor(props?: any);
70
77
  /** 按当前 kind / 尺寸 / 配色重建形状与标题(切换类型或改样式时调用) */
71
78
  private __buildShape;
@@ -66,6 +66,13 @@ export default class FlowNode extends ICEGroup {
66
66
  * 不参与引擎序列化(否则往返会重复挂载,且子组件 zIndex 抖动,见 ICEComponent.hasDerivedChildren)。
67
67
  */
68
68
  hasDerivedChildren(): boolean;
69
+ /**
70
+ * FlowNode **既是复合组件、又是容器**:形状 / 标题 / BPMN 角标都是派生的(不进文档),
71
+ * 但池装泳道、泳道装节点、分组装子节点都是**真实子节点**,必须进文档 ——
72
+ * 不然 `serialize() → load()` 之后池里的泳道与节点会整套消失(实测:3 个元素只剩 1 个)。
73
+ * 引擎的 `getSerializableChildren()` 钩子正是为这种「复合 + 容器」组件准备的。
74
+ */
75
+ getSerializableChildren(): any[];
69
76
  constructor(props?: any);
70
77
  /** 按当前 kind / 尺寸 / 配色重建形状与标题(切换类型或改样式时调用) */
71
78
  private __buildShape;
@@ -371,6 +371,21 @@ declare abstract class ICEComponent extends ICEEventTarget {
371
371
  * 默认为 false(普通容器/叶子组件的子节点是「真数据」,必须序列化)。
372
372
  */
373
373
  hasDerivedChildren(): boolean;
374
+ /**
375
+ * 复合组件里**需要进文档的真实子节点**(可选实现)。
376
+ *
377
+ * 背景:`hasDerivedChildren() === true` 表示「子节点都是派生结果、不进文档」,
378
+ * 但有一类组件**既是复合组件、又是容器** —— 典型是流程图 / BPMN 的节点与池:
379
+ * 它自己按 state 派生形状(内框 / 角标 / 标题),同时又真的装着子节点(泳道、泳道里的节点)。
380
+ * 只声明 `hasDerivedChildren()` 的话,序列化会把**真实子节点也一起跳过**,
381
+ * 于是 `serialize() → load()` 之后池里的泳道和节点整套消失(实测:3 个元素只剩 1 个)。
382
+ *
383
+ * 实现这个方法的组件要返回「真实子节点」(通常 = `childNodes` 减去派生部件),
384
+ * 引擎据此只序列化这些子节点;反序列化时构造函数仍会重建派生部件,不会重复。
385
+ *
386
+ * 不实现时行为**与以前完全一致**(复合组件一个子节点都不进文档)—— 默认不变,属增量能力。
387
+ */
388
+ getSerializableChildren(): ICEComponent[];
374
389
  /**
375
390
  * 获取组件的最小包围盒,此盒子的变换矩阵与组件自身完全相同。
376
391
  * 此方法需要在 render() 之后调用,组件没有渲染时无法计算最小包围盒。
@@ -371,6 +371,21 @@ declare abstract class ICEComponent extends ICEEventTarget {
371
371
  * 默认为 false(普通容器/叶子组件的子节点是「真数据」,必须序列化)。
372
372
  */
373
373
  hasDerivedChildren(): boolean;
374
+ /**
375
+ * 复合组件里**需要进文档的真实子节点**(可选实现)。
376
+ *
377
+ * 背景:`hasDerivedChildren() === true` 表示「子节点都是派生结果、不进文档」,
378
+ * 但有一类组件**既是复合组件、又是容器** —— 典型是流程图 / BPMN 的节点与池:
379
+ * 它自己按 state 派生形状(内框 / 角标 / 标题),同时又真的装着子节点(泳道、泳道里的节点)。
380
+ * 只声明 `hasDerivedChildren()` 的话,序列化会把**真实子节点也一起跳过**,
381
+ * 于是 `serialize() → load()` 之后池里的泳道和节点整套消失(实测:3 个元素只剩 1 个)。
382
+ *
383
+ * 实现这个方法的组件要返回「真实子节点」(通常 = `childNodes` 减去派生部件),
384
+ * 引擎据此只序列化这些子节点;反序列化时构造函数仍会重建派生部件,不会重复。
385
+ *
386
+ * 不实现时行为**与以前完全一致**(复合组件一个子节点都不进文档)—— 默认不变,属增量能力。
387
+ */
388
+ getSerializableChildren(): ICEComponent[];
374
389
  /**
375
390
  * 获取组件的最小包围盒,此盒子的变换矩阵与组件自身完全相同。
376
391
  * 此方法需要在 render() 之后调用,组件没有渲染时无法计算最小包围盒。
@@ -53,6 +53,10 @@ export type { PowerSymbolKind } from './power/power_shapes.mjs';
53
53
  export { default as PowerDesigner, PowerLine } from './power/PowerDesigner.mjs';
54
54
  export type { PowerIssue, PowerTopology } from './power/PowerDesigner.mjs';
55
55
  export { POWER_VOLTAGE_LEVELS, voltageColorOf, defaultVoltageColors } from './power/power_voltage.mjs';
56
+ export { default as SecondaryDesigner, SecondaryWire } from './secondary/SecondaryDesigner.mjs';
57
+ export type { SecondaryIssue } from './secondary/SecondaryDesigner.mjs';
58
+ export { default as SecondarySymbol, TerminalStrip, SECONDARY_SYMBOL_KINDS, SECONDARY_SYMBOL_PRESETS, SECONDARY_STYLE, } from './secondary/secondary_shapes.mjs';
59
+ export type { SecondarySymbolKind } from './secondary/secondary_shapes.mjs';
56
60
  export { parseDate, formatDate, addDays, diffDays, eachDay, tickLabel } from './gantt/gantt_date.mjs';
57
61
  export { toPlantUml, fromPlantUml, arrowOf, detectUmlDialect } from './uml/uml_text.mjs';
58
62
  export type { UmlTextImportResult } from './uml/uml_text.mjs';
@@ -53,6 +53,10 @@ export type { PowerSymbolKind } from './power/power_shapes';
53
53
  export { default as PowerDesigner, PowerLine } from './power/PowerDesigner';
54
54
  export type { PowerIssue, PowerTopology } from './power/PowerDesigner';
55
55
  export { POWER_VOLTAGE_LEVELS, voltageColorOf, defaultVoltageColors } from './power/power_voltage';
56
+ export { default as SecondaryDesigner, SecondaryWire } from './secondary/SecondaryDesigner';
57
+ export type { SecondaryIssue } from './secondary/SecondaryDesigner';
58
+ export { default as SecondarySymbol, TerminalStrip, SECONDARY_SYMBOL_KINDS, SECONDARY_SYMBOL_PRESETS, SECONDARY_STYLE, } from './secondary/secondary_shapes';
59
+ export type { SecondarySymbolKind } from './secondary/secondary_shapes';
56
60
  export { parseDate, formatDate, addDays, diffDays, eachDay, tickLabel } from './gantt/gantt_date';
57
61
  export { toPlantUml, fromPlantUml, arrowOf, detectUmlDialect } from './uml/uml_text';
58
62
  export type { UmlTextImportResult } from './uml/uml_text';
@@ -73,6 +73,8 @@ export default class PowerSymbol extends ICEGroup {
73
73
  component: any;
74
74
  }>;
75
75
  hasDerivedChildren(): boolean;
76
+ /** 真实子节点 = childNodes 减去派生部件(`parts`);容器化的域包组件靠它做快照往返 */
77
+ getSerializableChildren(): any[];
76
78
  constructor(props?: any);
77
79
  protected static arrangeParam(props?: any): any;
78
80
  private static readonly __shapeKeys;
@@ -73,6 +73,8 @@ export default class PowerSymbol extends ICEGroup {
73
73
  component: any;
74
74
  }>;
75
75
  hasDerivedChildren(): boolean;
76
+ /** 真实子节点 = childNodes 减去派生部件(`parts`);容器化的域包组件靠它做快照往返 */
77
+ getSerializableChildren(): any[];
76
78
  constructor(props?: any);
77
79
  protected static arrangeParam(props?: any): any;
78
80
  private static readonly __shapeKeys;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Copyright (c) 2022 大漠穷秋.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ /**
9
+ * 二次回路(保护 / 电流电压回路 / 端子排)应用层 —— 简化版第一刀。
10
+ *
11
+ * 与一次侧的差别不在实现,而在**图种**:二次图是回路图(一条线 = 一个具体回路),
12
+ * 所以导线带**回路编号**(A411/B411/C411/N411)、端子带**端子号**(201…)、
13
+ * 电缆带**电缆编号**(1D1…)。这些在本包里都是数据字段 + 标注,判型仍走 typeId。
14
+ *
15
+ * 记法与范围见 `docs/power-secondary-spec.md`。
16
+ */
17
+ import FlowDesigner from '../flow/FlowDesigner.mjs';
18
+ import FlowEdge from '../flow/FlowEdge.mjs';
19
+ import type { SecondarySymbolKind } from './secondary_shapes.mjs';
20
+ export declare type SecondaryIssue = {
21
+ level: 'error' | 'warning';
22
+ message: string;
23
+ id?: string;
24
+ };
25
+ /** 二次回路的导线:复用引擎折线(插槽吸附 / 正交路由 / 标签),额外带回路编号与电缆编号 */
26
+ export declare class SecondaryWire extends FlowEdge {
27
+ static readonly typeId = "SecondaryWire";
28
+ constructor(props?: any);
29
+ }
30
+ /**
31
+ * @class SecondaryDesigner 二次回路设计器
32
+ *
33
+ * 薄薄一层:建二次元件 / 端子排 / 带回路编号的导线,其余(选择、增删改、撤销重做、快照、
34
+ * 适应视图、订阅)全部继承 `FlowDesigner`。
35
+ */
36
+ export default class SecondaryDesigner extends FlowDesigner {
37
+ constructor(ice: any);
38
+ get nodes(): any[];
39
+ /** 只看元件(含端子排里的端子),不含端子排容器本身 */
40
+ get symbols(): any[];
41
+ get terminals(): any[];
42
+ get edges(): any[];
43
+ /** 建一个二次元件(接点 / 按钮 / 切换开关 / 压板 / 信号灯 / 装置 / 绕组 / 端子 / 接地) */
44
+ createSymbol(kind: SecondarySymbolKind, props?: any): any;
45
+ /** 建一条二次导线:`circuitNo` 是回路编号(写在线上),`cableNo` 是电缆编号(数据字段) */
46
+ createWire(props?: any): any;
47
+ /**
48
+ * 建一个端子排(容器):端子是它的**真实子节点**,拖动端子排端子跟着走,端子各自还能接线。
49
+ *
50
+ * 注意:端子排刻意**不声明** `hasDerivedChildren()` —— 复合组件声明后序列化会跳过全部子节点,
51
+ * 端子会在快照往返时整套丢掉(BPMN 池/泳道目前就踩了这个坑)。
52
+ */
53
+ createTerminalStrip(props?: any): any;
54
+ /**
55
+ * 二次回路语义校验(简化版四条):
56
+ * 1. 每条导线必须有回路编号;
57
+ * 2. 电流回路三相编号成组(同一数字段上 A/B/C 都要有);
58
+ * 3. 端子号在同一张图上唯一;
59
+ * 4. 二次回路必须有接地(warning)。
60
+ */
61
+ validateSecondary(): SecondaryIssue[];
62
+ /** 元件的文字符号预设(属性面板 / 文档用) */
63
+ presetOf(kind: SecondarySymbolKind): any;
64
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Copyright (c) 2022 大漠穷秋.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ /**
9
+ * 二次回路(保护 / 电流电压回路 / 端子排)应用层 —— 简化版第一刀。
10
+ *
11
+ * 与一次侧的差别不在实现,而在**图种**:二次图是回路图(一条线 = 一个具体回路),
12
+ * 所以导线带**回路编号**(A411/B411/C411/N411)、端子带**端子号**(201…)、
13
+ * 电缆带**电缆编号**(1D1…)。这些在本包里都是数据字段 + 标注,判型仍走 typeId。
14
+ *
15
+ * 记法与范围见 `docs/power-secondary-spec.md`。
16
+ */
17
+ import FlowDesigner from '../flow/FlowDesigner';
18
+ import FlowEdge from '../flow/FlowEdge';
19
+ import type { SecondarySymbolKind } from './secondary_shapes';
20
+ export declare type SecondaryIssue = {
21
+ level: 'error' | 'warning';
22
+ message: string;
23
+ id?: string;
24
+ };
25
+ /** 二次回路的导线:复用引擎折线(插槽吸附 / 正交路由 / 标签),额外带回路编号与电缆编号 */
26
+ export declare class SecondaryWire extends FlowEdge {
27
+ static readonly typeId = "SecondaryWire";
28
+ constructor(props?: any);
29
+ }
30
+ /**
31
+ * @class SecondaryDesigner 二次回路设计器
32
+ *
33
+ * 薄薄一层:建二次元件 / 端子排 / 带回路编号的导线,其余(选择、增删改、撤销重做、快照、
34
+ * 适应视图、订阅)全部继承 `FlowDesigner`。
35
+ */
36
+ export default class SecondaryDesigner extends FlowDesigner {
37
+ constructor(ice: any);
38
+ get nodes(): any[];
39
+ /** 只看元件(含端子排里的端子),不含端子排容器本身 */
40
+ get symbols(): any[];
41
+ get terminals(): any[];
42
+ get edges(): any[];
43
+ /** 建一个二次元件(接点 / 按钮 / 切换开关 / 压板 / 信号灯 / 装置 / 绕组 / 端子 / 接地) */
44
+ createSymbol(kind: SecondarySymbolKind, props?: any): any;
45
+ /** 建一条二次导线:`circuitNo` 是回路编号(写在线上),`cableNo` 是电缆编号(数据字段) */
46
+ createWire(props?: any): any;
47
+ /**
48
+ * 建一个端子排(容器):端子是它的**真实子节点**,拖动端子排端子跟着走,端子各自还能接线。
49
+ *
50
+ * 注意:端子排刻意**不声明** `hasDerivedChildren()` —— 复合组件声明后序列化会跳过全部子节点,
51
+ * 端子会在快照往返时整套丢掉(BPMN 池/泳道目前就踩了这个坑)。
52
+ */
53
+ createTerminalStrip(props?: any): any;
54
+ /**
55
+ * 二次回路语义校验(简化版四条):
56
+ * 1. 每条导线必须有回路编号;
57
+ * 2. 电流回路三相编号成组(同一数字段上 A/B/C 都要有);
58
+ * 3. 端子号在同一张图上唯一;
59
+ * 4. 二次回路必须有接地(warning)。
60
+ */
61
+ validateSecondary(): SecondaryIssue[];
62
+ /** 元件的文字符号预设(属性面板 / 文档用) */
63
+ presetOf(kind: SecondarySymbolKind): any;
64
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Copyright (c) 2022 大漠穷秋.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ /**
9
+ * 电力**二次回路**元件库(简化版第一刀:保护电流回路 + 端子排)。
10
+ *
11
+ * 记法依据见 `docs/power-secondary-spec.md`:
12
+ * - 元件的通用图形符号按 GB/T 4728.7(等同 IEC 60617-7,开关 / 控制 / 保护器件);
13
+ * - 文字符号用二次侧主流的 **IEEE C37.2 功能编号**(52 断路器、43 切换开关、88 辅助继电器、
14
+ * 49 过流继电器、33 位置开关、63 压力…),与一次侧的 QF/QS 体系分开;
15
+ * - 回路编号(A411/B411/C411/N411)、端子号(201…)、电缆编号(1D1…)是数据字段,画成标注。
16
+ */
17
+ import { ICEGroup } from '../ice-render/index.mjs';
18
+ export declare const SECONDARY_SYMBOL_KINDS: readonly ["contactNO", "contactNC", "pushButton", "switchRemoteLocal", "linkPlate", "indicatorLamp", "relayDevice", "ctWinding", "terminal", "earth"];
19
+ export declare type SecondarySymbolKind = (typeof SECONDARY_SYMBOL_KINDS)[number];
20
+ /** 二次侧文字符号(IEEE C37.2 功能编号),与一次侧的 QF/QS 体系分开 */
21
+ export declare const SECONDARY_SYMBOL_PRESETS: Record<SecondarySymbolKind, {
22
+ label: string;
23
+ tag: string;
24
+ width: number;
25
+ height: number;
26
+ }>;
27
+ /** 二次回路的外观基准:统一线宽与描边色(与一次侧同一套视觉语言) */
28
+ export declare const SECONDARY_STYLE: {
29
+ strokeStyle: string;
30
+ lineWidth: number;
31
+ heavyLineWidth: number;
32
+ labelFontSize: number;
33
+ labelColor: string;
34
+ tagFontSize: number;
35
+ tagColor: string;
36
+ };
37
+ /**
38
+ * @class SecondarySymbol 二次回路元件(复合组件)
39
+ *
40
+ * 与其它域包同一套做法:内部形状按 `kind` 派生(`hasDerivedChildren() === true` 不进文档),
41
+ * 每个派生部件带稳定 `role`,测试按 role 认记法。
42
+ */
43
+ export default class SecondarySymbol extends ICEGroup {
44
+ static readonly typeId = "SecondarySymbol";
45
+ parts: Array<{
46
+ role: string;
47
+ component: any;
48
+ }>;
49
+ hasDerivedChildren(): boolean;
50
+ /** 真实子节点 = childNodes 减去派生部件(`parts`);容器化的域包组件靠它做快照往返 */
51
+ getSerializableChildren(): any[];
52
+ constructor(props?: any);
53
+ protected static arrangeParam(props?: any): any;
54
+ private static readonly __shapeKeys;
55
+ setState(patch: any): void;
56
+ applyPatch(patch?: any): void;
57
+ part(role: string): any;
58
+ protected syncShape(): void;
59
+ private __add;
60
+ /** 只清派生部件,不动真实子节点(端子排那种容器不受影响) */
61
+ private __clearParts;
62
+ }
63
+ /**
64
+ * @class TerminalStrip 端子排(容器)
65
+ *
66
+ * 端子排本质是**一列端子**(真实图纸里还会分「现场侧 / 屏柜侧」两列)。这里做成引擎的普通容器:
67
+ * 端子是它的**真实子节点** —— 拖动端子排时端子跟着走(容器语义),每个端子又有自己的上下插槽可以接线。
68
+ *
69
+ * 注意:**不要**给它加 `hasDerivedChildren()`。复合组件声明「子节点都是派生的」会让序列化
70
+ * 跳过全部子节点,端子排的端子在快照往返时会整套丢掉(BPMN 池/泳道目前就踩了这个坑)。
71
+ */
72
+ export declare class TerminalStrip extends ICEGroup {
73
+ static readonly typeId = "TerminalStrip";
74
+ constructor(props?: any);
75
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Copyright (c) 2022 大漠穷秋.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ /**
9
+ * 电力**二次回路**元件库(简化版第一刀:保护电流回路 + 端子排)。
10
+ *
11
+ * 记法依据见 `docs/power-secondary-spec.md`:
12
+ * - 元件的通用图形符号按 GB/T 4728.7(等同 IEC 60617-7,开关 / 控制 / 保护器件);
13
+ * - 文字符号用二次侧主流的 **IEEE C37.2 功能编号**(52 断路器、43 切换开关、88 辅助继电器、
14
+ * 49 过流继电器、33 位置开关、63 压力…),与一次侧的 QF/QS 体系分开;
15
+ * - 回路编号(A411/B411/C411/N411)、端子号(201…)、电缆编号(1D1…)是数据字段,画成标注。
16
+ */
17
+ import { ICEGroup } from '../ice-render/index';
18
+ export declare const SECONDARY_SYMBOL_KINDS: readonly ["contactNO", "contactNC", "pushButton", "switchRemoteLocal", "linkPlate", "indicatorLamp", "relayDevice", "ctWinding", "terminal", "earth"];
19
+ export declare type SecondarySymbolKind = (typeof SECONDARY_SYMBOL_KINDS)[number];
20
+ /** 二次侧文字符号(IEEE C37.2 功能编号),与一次侧的 QF/QS 体系分开 */
21
+ export declare const SECONDARY_SYMBOL_PRESETS: Record<SecondarySymbolKind, {
22
+ label: string;
23
+ tag: string;
24
+ width: number;
25
+ height: number;
26
+ }>;
27
+ /** 二次回路的外观基准:统一线宽与描边色(与一次侧同一套视觉语言) */
28
+ export declare const SECONDARY_STYLE: {
29
+ strokeStyle: string;
30
+ lineWidth: number;
31
+ heavyLineWidth: number;
32
+ labelFontSize: number;
33
+ labelColor: string;
34
+ tagFontSize: number;
35
+ tagColor: string;
36
+ };
37
+ /**
38
+ * @class SecondarySymbol 二次回路元件(复合组件)
39
+ *
40
+ * 与其它域包同一套做法:内部形状按 `kind` 派生(`hasDerivedChildren() === true` 不进文档),
41
+ * 每个派生部件带稳定 `role`,测试按 role 认记法。
42
+ */
43
+ export default class SecondarySymbol extends ICEGroup {
44
+ static readonly typeId = "SecondarySymbol";
45
+ parts: Array<{
46
+ role: string;
47
+ component: any;
48
+ }>;
49
+ hasDerivedChildren(): boolean;
50
+ /** 真实子节点 = childNodes 减去派生部件(`parts`);容器化的域包组件靠它做快照往返 */
51
+ getSerializableChildren(): any[];
52
+ constructor(props?: any);
53
+ protected static arrangeParam(props?: any): any;
54
+ private static readonly __shapeKeys;
55
+ setState(patch: any): void;
56
+ applyPatch(patch?: any): void;
57
+ part(role: string): any;
58
+ protected syncShape(): void;
59
+ private __add;
60
+ /** 只清派生部件,不动真实子节点(端子排那种容器不受影响) */
61
+ private __clearParts;
62
+ }
63
+ /**
64
+ * @class TerminalStrip 端子排(容器)
65
+ *
66
+ * 端子排本质是**一列端子**(真实图纸里还会分「现场侧 / 屏柜侧」两列)。这里做成引擎的普通容器:
67
+ * 端子是它的**真实子节点** —— 拖动端子排时端子跟着走(容器语义),每个端子又有自己的上下插槽可以接线。
68
+ *
69
+ * 注意:**不要**给它加 `hasDerivedChildren()`。复合组件声明「子节点都是派生的」会让序列化
70
+ * 跳过全部子节点,端子排的端子在快照往返时会整套丢掉(BPMN 池/泳道目前就踩了这个坑)。
71
+ */
72
+ export declare class TerminalStrip extends ICEGroup {
73
+ static readonly typeId = "TerminalStrip";
74
+ constructor(props?: any);
75
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "author": "大漠穷秋",
3
3
  "name": "ice-entity-designer",
4
- "version": "0.0.37",
4
+ "version": "0.0.39",
5
5
  "description": "An entity designer based on ice-render.",
6
6
  "repository": {
7
7
  "type": "git",