@compas-oscd/open-scd 0.34.0 → 0.34.2

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/WizardDivider.d.ts +8 -0
  2. package/dist/WizardDivider.js +37 -0
  3. package/dist/WizardDivider.js.map +1 -0
  4. package/dist/Wizarding.d.ts +10 -0
  5. package/dist/Wizarding.js +38 -0
  6. package/dist/Wizarding.js.map +1 -0
  7. package/dist/action-icon.d.ts +25 -0
  8. package/dist/action-icon.js +220 -0
  9. package/dist/action-icon.js.map +1 -0
  10. package/dist/action-pane.d.ts +25 -0
  11. package/dist/action-pane.js +176 -0
  12. package/dist/action-pane.js.map +1 -0
  13. package/dist/addons/Editor.d.ts +25 -0
  14. package/dist/addons/Editor.js +106 -0
  15. package/dist/addons/Editor.js.map +1 -0
  16. package/dist/addons/History.d.ts +86 -0
  17. package/dist/addons/History.js +490 -0
  18. package/dist/addons/History.js.map +1 -0
  19. package/dist/addons/Layout.d.ts +96 -0
  20. package/dist/addons/Layout.js +619 -0
  21. package/dist/addons/Layout.js.map +1 -0
  22. package/dist/addons/Settings.d.ts +68 -0
  23. package/dist/addons/Settings.js +465 -0
  24. package/dist/addons/Settings.js.map +1 -0
  25. package/dist/addons/Waiter.d.ts +14 -0
  26. package/dist/addons/Waiter.js +45 -0
  27. package/dist/addons/Waiter.js.map +1 -0
  28. package/dist/addons/Wizards.d.ts +15 -0
  29. package/dist/addons/Wizards.js +48 -0
  30. package/dist/addons/Wizards.js.map +1 -0
  31. package/dist/addons/editor/edit-action-to-v1-converter.d.ts +3 -0
  32. package/dist/addons/editor/edit-action-to-v1-converter.js +96 -0
  33. package/dist/addons/editor/edit-action-to-v1-converter.js.map +1 -0
  34. package/dist/addons/editor/edit-v1-to-v2-converter.d.ts +2 -0
  35. package/dist/addons/editor/edit-v1-to-v2-converter.js +37 -0
  36. package/dist/addons/editor/edit-v1-to-v2-converter.js.map +1 -0
  37. package/dist/addons/history/get-log-text.d.ts +5 -0
  38. package/dist/addons/history/get-log-text.js +26 -0
  39. package/dist/addons/history/get-log-text.js.map +1 -0
  40. package/dist/addons/menu-tabs/menu-tabs.d.ts +22 -0
  41. package/dist/addons/menu-tabs/menu-tabs.js +74 -0
  42. package/dist/addons/menu-tabs/menu-tabs.js.map +1 -0
  43. package/dist/addons/plugin-manager/custom-plugin-dialog.d.ts +28 -0
  44. package/dist/addons/plugin-manager/custom-plugin-dialog.js +177 -0
  45. package/dist/addons/plugin-manager/custom-plugin-dialog.js.map +1 -0
  46. package/dist/addons/plugin-manager/plugin-manager.d.ts +20 -0
  47. package/dist/addons/plugin-manager/plugin-manager.js +165 -0
  48. package/dist/addons/plugin-manager/plugin-manager.js.map +1 -0
  49. package/dist/filtered-list.d.ts +27 -0
  50. package/dist/filtered-list.js +168 -0
  51. package/dist/filtered-list.js.map +1 -0
  52. package/dist/finder-list.d.ts +37 -0
  53. package/dist/finder-list.js +207 -0
  54. package/dist/finder-list.js.map +1 -0
  55. package/dist/foundation/compare.d.ts +79 -0
  56. package/dist/foundation/compare.js +273 -0
  57. package/dist/foundation/compare.js.map +1 -0
  58. package/dist/foundation/dai.d.ts +30 -0
  59. package/dist/foundation/dai.js +127 -0
  60. package/dist/foundation/dai.js.map +1 -0
  61. package/dist/foundation/generators.d.ts +13 -0
  62. package/dist/foundation/generators.js +67 -0
  63. package/dist/foundation/generators.js.map +1 -0
  64. package/dist/foundation/ied.d.ts +22 -0
  65. package/dist/foundation/ied.js +84 -0
  66. package/dist/foundation/ied.js.map +1 -0
  67. package/dist/foundation/nsd.d.ts +4 -0
  68. package/dist/foundation/nsd.js +13 -0
  69. package/dist/foundation/nsd.js.map +1 -0
  70. package/dist/foundation/nsdoc.d.ts +14 -0
  71. package/dist/foundation/nsdoc.js +180 -0
  72. package/dist/foundation/nsdoc.js.map +1 -0
  73. package/dist/foundation/scl.d.ts +1 -0
  74. package/dist/foundation/scl.js +64 -0
  75. package/dist/foundation/scl.js.map +1 -0
  76. package/dist/foundation.d.ts +230 -0
  77. package/dist/foundation.js +1922 -0
  78. package/dist/foundation.js.map +1 -0
  79. package/dist/icons/compare.d.ts +3 -0
  80. package/dist/icons/compare.js +11 -0
  81. package/dist/icons/compare.js.map +1 -0
  82. package/dist/icons/icons.d.ts +41 -0
  83. package/dist/icons/icons.js +611 -0
  84. package/dist/icons/icons.js.map +1 -0
  85. package/dist/icons/ied-icons.d.ts +3 -0
  86. package/dist/icons/ied-icons.js +11 -0
  87. package/dist/icons/ied-icons.js.map +1 -0
  88. package/dist/icons/lnode.d.ts +16 -0
  89. package/dist/icons/lnode.js +50 -0
  90. package/dist/icons/lnode.js.map +1 -0
  91. package/dist/open-scd.d.ts +131 -0
  92. package/dist/open-scd.js +483 -0
  93. package/dist/open-scd.js.map +1 -0
  94. package/dist/oscd-filter-button.d.ts +27 -0
  95. package/dist/oscd-filter-button.js +89 -0
  96. package/dist/oscd-filter-button.js.map +1 -0
  97. package/dist/plain-compare-list.d.ts +36 -0
  98. package/dist/plain-compare-list.js +132 -0
  99. package/dist/plain-compare-list.js.map +1 -0
  100. package/dist/plugin-tag.d.ts +6 -0
  101. package/dist/plugin-tag.js +23 -0
  102. package/dist/plugin-tag.js.map +1 -0
  103. package/dist/plugin.d.ts +23 -0
  104. package/dist/plugin.events.d.ts +15 -0
  105. package/dist/plugin.events.js +12 -0
  106. package/dist/plugin.events.js.map +1 -0
  107. package/dist/plugin.js +2 -0
  108. package/dist/plugin.js.map +1 -0
  109. package/dist/plugins.d.ts +3 -0
  110. package/dist/plugins.js +256 -0
  111. package/dist/plugins.js.map +1 -0
  112. package/dist/schemas.d.ts +58 -0
  113. package/dist/schemas.js +9325 -0
  114. package/dist/schemas.js.map +1 -0
  115. package/dist/themes.d.ts +3 -0
  116. package/dist/themes.js +122 -0
  117. package/dist/themes.js.map +1 -0
  118. package/dist/translations/de.d.ts +2 -0
  119. package/dist/translations/de.js +954 -0
  120. package/dist/translations/de.js.map +1 -0
  121. package/dist/translations/en.d.ts +963 -0
  122. package/dist/translations/en.js +950 -0
  123. package/dist/translations/en.js.map +1 -0
  124. package/dist/translations/loader.d.ts +12 -0
  125. package/dist/translations/loader.js +10 -0
  126. package/dist/translations/loader.js.map +1 -0
  127. package/dist/wizard-checkbox.d.ts +37 -0
  128. package/dist/wizard-checkbox.js +152 -0
  129. package/dist/wizard-checkbox.js.map +1 -0
  130. package/dist/wizard-dialog.d.ts +45 -0
  131. package/dist/wizard-dialog.js +374 -0
  132. package/dist/wizard-dialog.js.map +1 -0
  133. package/dist/wizard-select.d.ts +31 -0
  134. package/dist/wizard-select.js +115 -0
  135. package/dist/wizard-select.js.map +1 -0
  136. package/dist/wizard-textfield.d.ts +50 -0
  137. package/dist/wizard-textfield.js +191 -0
  138. package/dist/wizard-textfield.js.map +1 -0
  139. package/dist/wizards.d.ts +23 -0
  140. package/dist/wizards.js +196 -0
  141. package/dist/wizards.js.map +1 -0
  142. package/package.json +99 -4
@@ -0,0 +1,191 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement, html, state, property, query, } from 'lit-element';
3
+ import { get } from 'lit-translate';
4
+ import '@material/mwc-icon-button';
5
+ import '@material/mwc-list/mwc-list-item';
6
+ import '@material/mwc-menu';
7
+ import '@material/mwc-switch';
8
+ import { TextField } from '@material/mwc-textfield';
9
+ /** A potentially `nullable` `TextField` that allows for selection of an SI
10
+ * `multiplier` if an SI `unit` is given.
11
+ *
12
+ * NB: Use `maybeValue: string | null` instead of `value` if `nullable`!*/
13
+ let WizardTextField = class WizardTextField extends TextField {
14
+ get multiplier() {
15
+ if (this.unit == '')
16
+ return null;
17
+ return (this.multipliers[this.multiplierIndex] ?? this.multipliers[0] ?? null);
18
+ }
19
+ set multiplier(value) {
20
+ const index = this.multipliers.indexOf(value);
21
+ if (index >= 0)
22
+ this.multiplierIndex = index;
23
+ this.suffix = (this.multiplier ?? '') + this.unit;
24
+ }
25
+ get null() {
26
+ return this.nullable && this.isNull;
27
+ }
28
+ set null(value) {
29
+ if (!this.nullable || value === this.isNull)
30
+ return;
31
+ this.isNull = value;
32
+ if (this.null)
33
+ this.disable();
34
+ else
35
+ this.enable();
36
+ }
37
+ /** Replacement for `value`, can only be `null` if [[`nullable`]]. */
38
+ get maybeValue() {
39
+ return this.null ? null : this.value;
40
+ }
41
+ set maybeValue(value) {
42
+ if (value === null)
43
+ this.null = true;
44
+ else {
45
+ this.null = false;
46
+ this.value = value;
47
+ }
48
+ }
49
+ selectMultiplier(se) {
50
+ this.multiplier = this.multipliers[se.detail.index];
51
+ }
52
+ enable() {
53
+ if (this.nulled === null)
54
+ return;
55
+ this.value = this.nulled;
56
+ this.nulled = null;
57
+ this.helperPersistent = false;
58
+ this.disabled = false;
59
+ }
60
+ disable() {
61
+ if (this.nulled !== null)
62
+ return;
63
+ this.nulled = this.value;
64
+ this.value = this.defaultValue;
65
+ this.helperPersistent = true;
66
+ this.disabled = true;
67
+ }
68
+ async firstUpdated() {
69
+ await super.firstUpdated();
70
+ if (this.multiplierMenu)
71
+ this.multiplierMenu.anchor =
72
+ this.multiplierButton ?? null;
73
+ }
74
+ checkValidity() {
75
+ if (this.reservedValues &&
76
+ this.reservedValues.some(array => array === this.value)) {
77
+ this.setCustomValidity(get('textfield.unique'));
78
+ return false;
79
+ }
80
+ this.setCustomValidity(''); //Reset. Otherwise super.checkValidity always falseM
81
+ return super.checkValidity();
82
+ }
83
+ constructor() {
84
+ super();
85
+ /** Whether [[`maybeValue`]] may be `null` */
86
+ this.nullable = false;
87
+ /** Selectable SI multipliers for a non-empty [[`unit`]]. */
88
+ this.multipliers = [null, ''];
89
+ this.multiplierIndex = 0;
90
+ /** SI Unit, must be non-empty to allow for selecting a [[`multiplier`]].
91
+ * Overrides `suffix`. */
92
+ this.unit = '';
93
+ this.isNull = false;
94
+ /** The default `value` displayed if [[`maybeValue`]] is `null`. */
95
+ this.defaultValue = '';
96
+ /** Additional values that cause validation to fail. */
97
+ this.reservedValues = [];
98
+ // FIXME: workaround to allow disable of the whole component - need basic refactor
99
+ this.disabledSwitch = false;
100
+ this.nulled = null;
101
+ this.disabledSwitch = this.hasAttribute('disabled');
102
+ }
103
+ renderUnitSelector() {
104
+ if (this.multipliers.length && this.unit)
105
+ return html `<div style="position:relative;">
106
+ <mwc-icon-button
107
+ style="margin:5px;"
108
+ icon="more"
109
+ ?disabled=${this.null || this.disabledSwitch}
110
+ @click=${() => this.multiplierMenu?.show()}
111
+ ></mwc-icon-button>
112
+ <mwc-menu
113
+ @selected=${this.selectMultiplier}
114
+ fixed
115
+ .anchor=${this.multiplierButton ?? null}
116
+ >${this.renderMulplierList()}</mwc-menu
117
+ >
118
+ </div>`;
119
+ else
120
+ return html ``;
121
+ }
122
+ renderMulplierList() {
123
+ return html `${this.multipliers.map(multiplier => html `<mwc-list-item ?selected=${multiplier === this.multiplier}
124
+ >${multiplier === null
125
+ ? get('textfield.noMultiplier')
126
+ : multiplier}</mwc-list-item
127
+ >`)}`;
128
+ }
129
+ renderSwitch() {
130
+ if (this.nullable) {
131
+ return html `<mwc-switch
132
+ style="margin-left: 12px;"
133
+ ?checked=${!this.null}
134
+ ?disabled=${this.disabledSwitch}
135
+ @change=${() => {
136
+ this.null = !this.nullSwitch.checked;
137
+ }}
138
+ ></mwc-switch>`;
139
+ }
140
+ return html ``;
141
+ }
142
+ render() {
143
+ return html `
144
+ <div style="display: flex; flex-direction: row;">
145
+ <div style="flex: auto;">${super.render()}</div>
146
+ ${this.renderUnitSelector()}
147
+ <div style="display: flex; align-items: center; height: 56px;">
148
+ ${this.renderSwitch()}
149
+ </div>
150
+ </div>
151
+ `;
152
+ }
153
+ };
154
+ __decorate([
155
+ property({ type: Boolean })
156
+ ], WizardTextField.prototype, "nullable", void 0);
157
+ __decorate([
158
+ property({ type: Array })
159
+ ], WizardTextField.prototype, "multipliers", void 0);
160
+ __decorate([
161
+ property({ type: String })
162
+ ], WizardTextField.prototype, "multiplier", null);
163
+ __decorate([
164
+ property({ type: String })
165
+ ], WizardTextField.prototype, "unit", void 0);
166
+ __decorate([
167
+ state()
168
+ ], WizardTextField.prototype, "null", null);
169
+ __decorate([
170
+ property({ type: String })
171
+ ], WizardTextField.prototype, "maybeValue", null);
172
+ __decorate([
173
+ property({ type: String })
174
+ ], WizardTextField.prototype, "defaultValue", void 0);
175
+ __decorate([
176
+ property({ type: Array })
177
+ ], WizardTextField.prototype, "reservedValues", void 0);
178
+ __decorate([
179
+ query('mwc-switch')
180
+ ], WizardTextField.prototype, "nullSwitch", void 0);
181
+ __decorate([
182
+ query('mwc-menu')
183
+ ], WizardTextField.prototype, "multiplierMenu", void 0);
184
+ __decorate([
185
+ query('mwc-icon-button')
186
+ ], WizardTextField.prototype, "multiplierButton", void 0);
187
+ WizardTextField = __decorate([
188
+ customElement('wizard-textfield')
189
+ ], WizardTextField);
190
+ export { WizardTextField };
191
+ //# sourceMappingURL=wizard-textfield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard-textfield.js","sourceRoot":"","sources":["../src/wizard-textfield.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,GAEN,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,2BAA2B,CAAC;AACnC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,oBAAoB,CAAC;AAC5B,OAAO,sBAAsB,CAAC;AAK9B,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD;;;0EAG0E;AAEnE,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,SAAS;IAS5C,IAAI,UAAU;QACZ,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,CACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CACtE,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,KAAoB;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,KAAK,IAAI,CAAC;YAAE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7C,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;IACpD,CAAC;IAOD,IAAY,IAAI;QACd,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;IACtC,CAAC;IACD,IAAY,IAAI,CAAC,KAAc;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO;QACpD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;;YACzB,IAAI,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IACD,qEAAqE;IAErE,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACvC,CAAC;IACD,IAAI,UAAU,CAAC,KAAoB;QACjC,IAAI,KAAK,KAAK,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;aAChC;YACH,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACpB;IACH,CAAC;IAiBO,gBAAgB,CAAC,EAAuB;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAEO,MAAM;QACZ,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,cAAc;YACrB,IAAI,CAAC,cAAc,CAAC,MAAM;gBACvB,IAAI,CAAC,gBAAgC,IAAI,IAAI,CAAC;IACrD,CAAC;IAED,aAAa;QACX,IACE,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,EACvD;YACA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;SACd;QACD,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,oDAAoD;QAChF,OAAO,KAAK,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED;QACE,KAAK,EAAE,CAAC;QAtGV,6CAA6C;QAE7C,aAAQ,GAAG,KAAK,CAAC;QACjB,4DAA4D;QAE5D,gBAAW,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjB,oBAAe,GAAG,CAAC,CAAC;QAa5B;iCACyB;QAEzB,SAAI,GAAG,EAAE,CAAC;QACF,WAAM,GAAG,KAAK,CAAC;QAuBvB,mEAAmE;QAEnE,iBAAY,GAAG,EAAE,CAAC;QAClB,uDAAuD;QAEvD,mBAAc,GAAa,EAAE,CAAC;QAE9B,kFAAkF;QAC1E,mBAAc,GAAG,KAAK,CAAC;QAMvB,WAAM,GAAkB,IAAI,CAAC;QA4CnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAED,kBAAkB;QAChB,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI;YACtC,OAAO,IAAI,CAAA;;;;sBAIK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc;mBACnC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE;;;sBAG9B,IAAI,CAAC,gBAAgB;;oBAEvB,IAAI,CAAC,gBAAgB,IAAI,IAAI;aACpC,IAAI,CAAC,kBAAkB,EAAE;;aAEzB,CAAC;;YACL,OAAO,IAAI,CAAA,EAAE,CAAC;IACrB,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAA,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAChC,UAAU,CAAC,EAAE,CACX,IAAI,CAAA,4BAA4B,UAAU,KAAK,IAAI,CAAC,UAAU;aACzD,UAAU,KAAK,IAAI;YACpB,CAAC,CAAC,GAAG,CAAC,wBAAwB,CAAC;YAC/B,CAAC,CAAC,UAAU;UACd,CACL,EAAE,CAAC;IACN,CAAC;IAED,YAAY;QACV,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,IAAI,CAAA;;mBAEE,CAAC,IAAI,CAAC,IAAI;oBACT,IAAI,CAAC,cAAc;kBACrB,GAAG,EAAE;gBACb,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC;YACxC,CAAC;qBACY,CAAC;SACjB;QACD,OAAO,IAAI,CAAA,EAAE,CAAC;IAChB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;mCAEoB,KAAK,CAAC,MAAM,EAAE;UACvC,IAAI,CAAC,kBAAkB,EAAE;;YAEvB,IAAI,CAAC,YAAY,EAAE;;;KAG1B,CAAC;IACJ,CAAC;CACF,CAAA;AAhKC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iDACX;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;oDACD;AAGzB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDAM1B;AASD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CACjB;AAGV;IADC,KAAK,EAAE;2CAGP;AASD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDAG1B;AAUD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qDACT;AAGlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;uDACI;AAKT;IAApB,KAAK,CAAC,YAAY,CAAC;mDAAqB;AACtB;IAAlB,KAAK,CAAC,UAAU,CAAC;uDAAuB;AACf;IAAzB,KAAK,CAAC,iBAAiB,CAAC;yDAA+B;AA3D7C,eAAe;IAD3B,aAAa,CAAC,kBAAkB,CAAC;GACrB,eAAe,CAmK3B;SAnKY,eAAe","sourcesContent":["import {\n customElement,\n html,\n state,\n property,\n query,\n TemplateResult,\n} from 'lit-element';\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-icon-button';\nimport '@material/mwc-list/mwc-list-item';\nimport '@material/mwc-menu';\nimport '@material/mwc-switch';\nimport { IconButton } from '@material/mwc-icon-button';\nimport { Menu } from '@material/mwc-menu';\nimport { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation';\nimport { Switch } from '@material/mwc-switch';\nimport { TextField } from '@material/mwc-textfield';\n\n/** A potentially `nullable` `TextField` that allows for selection of an SI\n * `multiplier` if an SI `unit` is given.\n *\n * NB: Use `maybeValue: string | null` instead of `value` if `nullable`!*/\n@customElement('wizard-textfield')\nexport class WizardTextField extends TextField {\n /** Whether [[`maybeValue`]] may be `null` */\n @property({ type: Boolean })\n nullable = false;\n /** Selectable SI multipliers for a non-empty [[`unit`]]. */\n @property({ type: Array })\n multipliers = [null, ''];\n private multiplierIndex = 0;\n @property({ type: String })\n get multiplier(): string | null {\n if (this.unit == '') return null;\n return (\n this.multipliers[this.multiplierIndex] ?? this.multipliers[0] ?? null\n );\n }\n set multiplier(value: string | null) {\n const index = this.multipliers.indexOf(value);\n if (index >= 0) this.multiplierIndex = index;\n this.suffix = (this.multiplier ?? '') + this.unit;\n }\n /** SI Unit, must be non-empty to allow for selecting a [[`multiplier`]].\n * Overrides `suffix`. */\n @property({ type: String })\n unit = '';\n private isNull = false;\n @state()\n private get null(): boolean {\n return this.nullable && this.isNull;\n }\n private set null(value: boolean) {\n if (!this.nullable || value === this.isNull) return;\n this.isNull = value;\n if (this.null) this.disable();\n else this.enable();\n }\n /** Replacement for `value`, can only be `null` if [[`nullable`]]. */\n @property({ type: String })\n get maybeValue(): string | null {\n return this.null ? null : this.value;\n }\n set maybeValue(value: string | null) {\n if (value === null) this.null = true;\n else {\n this.null = false;\n this.value = value;\n }\n }\n /** The default `value` displayed if [[`maybeValue`]] is `null`. */\n @property({ type: String })\n defaultValue = '';\n /** Additional values that cause validation to fail. */\n @property({ type: Array })\n reservedValues: string[] = [];\n\n // FIXME: workaround to allow disable of the whole component - need basic refactor\n private disabledSwitch = false;\n\n @query('mwc-switch') nullSwitch?: Switch;\n @query('mwc-menu') multiplierMenu?: Menu;\n @query('mwc-icon-button') multiplierButton?: IconButton;\n\n private nulled: string | null = null;\n\n private selectMultiplier(se: SingleSelectedEvent): void {\n this.multiplier = this.multipliers[se.detail.index];\n }\n\n private enable(): void {\n if (this.nulled === null) return;\n this.value = this.nulled;\n this.nulled = null;\n this.helperPersistent = false;\n this.disabled = false;\n }\n\n private disable(): void {\n if (this.nulled !== null) return;\n this.nulled = this.value;\n this.value = this.defaultValue;\n this.helperPersistent = true;\n this.disabled = true;\n }\n\n async firstUpdated(): Promise<void> {\n await super.firstUpdated();\n if (this.multiplierMenu)\n this.multiplierMenu.anchor =\n (this.multiplierButton as HTMLElement) ?? null;\n }\n\n checkValidity(): boolean {\n if (\n this.reservedValues &&\n this.reservedValues.some(array => array === this.value)\n ) {\n this.setCustomValidity(get('textfield.unique'));\n return false;\n }\n this.setCustomValidity(''); //Reset. Otherwise super.checkValidity always falseM\n return super.checkValidity();\n }\n\n constructor() {\n super();\n\n this.disabledSwitch = this.hasAttribute('disabled');\n }\n\n renderUnitSelector(): TemplateResult {\n if (this.multipliers.length && this.unit)\n return html`<div style=\"position:relative;\">\n <mwc-icon-button\n style=\"margin:5px;\"\n icon=\"more\"\n ?disabled=${this.null || this.disabledSwitch}\n @click=${() => this.multiplierMenu?.show()}\n ></mwc-icon-button>\n <mwc-menu\n @selected=${this.selectMultiplier}\n fixed\n .anchor=${this.multiplierButton ?? null}\n >${this.renderMulplierList()}</mwc-menu\n >\n </div>`;\n else return html``;\n }\n\n renderMulplierList(): TemplateResult {\n return html`${this.multipliers.map(\n multiplier =>\n html`<mwc-list-item ?selected=${multiplier === this.multiplier}\n >${multiplier === null\n ? get('textfield.noMultiplier')\n : multiplier}</mwc-list-item\n >`\n )}`;\n }\n\n renderSwitch(): TemplateResult {\n if (this.nullable) {\n return html`<mwc-switch\n style=\"margin-left: 12px;\"\n ?checked=${!this.null}\n ?disabled=${this.disabledSwitch}\n @change=${() => {\n this.null = !this.nullSwitch!.checked;\n }}\n ></mwc-switch>`;\n }\n return html``;\n }\n\n render(): TemplateResult {\n return html`\n <div style=\"display: flex; flex-direction: row;\">\n <div style=\"flex: auto;\">${super.render()}</div>\n ${this.renderUnitSelector()}\n <div style=\"display: flex; align-items: center; height: 56px;\">\n ${this.renderSwitch()}\n </div>\n </div>\n `;\n }\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import '@material/mwc-icon';
2
+ import '@material/mwc-list';
3
+ import '@material/mwc-list/mwc-check-list-item';
4
+ import '@material/mwc-list/mwc-list-item';
5
+ import { Wizard } from './foundation.js';
6
+ interface MergeOptions {
7
+ title?: string;
8
+ selected?: (diff: Diff<Element | string>) => boolean;
9
+ disabled?: (diff: Diff<Element | string>) => boolean;
10
+ auto?: (sink: Element, source: Element) => boolean;
11
+ }
12
+ export type Diff<T> = {
13
+ ours: T;
14
+ theirs: null;
15
+ } | {
16
+ ours: null;
17
+ theirs: T;
18
+ } | {
19
+ ours: T;
20
+ theirs: T;
21
+ };
22
+ export declare function mergeWizard(sink: Element, source: Element, options?: MergeOptions): Wizard;
23
+ export {};
@@ -0,0 +1,196 @@
1
+ import { html } from 'lit-element';
2
+ import { repeat } from 'lit-html/directives/repeat';
3
+ import { get } from 'lit-translate';
4
+ import '@material/mwc-icon';
5
+ import '@material/mwc-list';
6
+ import '@material/mwc-list/mwc-check-list-item';
7
+ import '@material/mwc-list/mwc-list-item';
8
+ import { identity, isEqual, isSame, newWizardEvent, } from './foundation.js';
9
+ function describe(element) {
10
+ const id = identity(element);
11
+ return typeof id === 'string' ? id.replace(/^>/, '') : get('unidentifiable');
12
+ }
13
+ function mergeWizardAction(attrDiffs, childDiffs, sink, source, options) {
14
+ return (_, wizard) => {
15
+ const actions = [];
16
+ const checkList = wizard.shadowRoot.querySelector('mwc-list');
17
+ const selectedAttrDiffs = checkList.selected
18
+ .filter(item => item.classList.contains('attr'))
19
+ .map(item => attrDiffs[item.value]);
20
+ const newSink = sink.cloneNode(false);
21
+ const parent = selectedAttrDiffs.length ? newSink : sink;
22
+ if (selectedAttrDiffs.length) {
23
+ if (sink.childElementCount === 0)
24
+ newSink.textContent = sink.textContent;
25
+ for (const [name, diff] of selectedAttrDiffs)
26
+ if (name === 'value') {
27
+ newSink.textContent = diff.theirs;
28
+ }
29
+ else if (diff.theirs === null)
30
+ newSink.removeAttribute(name);
31
+ else
32
+ newSink.setAttribute(name, diff.theirs);
33
+ actions.push({ old: { element: sink }, new: { element: newSink } });
34
+ }
35
+ let acted = false;
36
+ const selectedChildDiffs = checkList.selected
37
+ .filter(item => item.classList.contains('child'))
38
+ .map(item => childDiffs[item.value]);
39
+ if (selectedChildDiffs.length) {
40
+ for (const diff of selectedChildDiffs)
41
+ if (!diff.ours)
42
+ actions.push({
43
+ new: { parent, element: diff.theirs },
44
+ });
45
+ else if (!diff.theirs)
46
+ actions.push({
47
+ old: {
48
+ parent,
49
+ element: diff.ours,
50
+ reference: diff.ours.nextSibling,
51
+ },
52
+ });
53
+ else {
54
+ acted = true;
55
+ wizard.dispatchEvent(newWizardEvent(mergeWizard(diff.ours, diff.theirs, {
56
+ ...options,
57
+ title: undefined,
58
+ })));
59
+ }
60
+ }
61
+ if (actions.length === 0 && !acted)
62
+ wizard.dispatchEvent(newWizardEvent());
63
+ return [
64
+ {
65
+ actions,
66
+ title: get('merge.log', {
67
+ sink: describe(sink),
68
+ source: describe(source),
69
+ tag: sink.tagName,
70
+ }),
71
+ },
72
+ ];
73
+ };
74
+ }
75
+ export function mergeWizard(sink, source, options) {
76
+ const attrDiffs = [];
77
+ const ourText = sink.textContent ?? '';
78
+ const theirText = source.textContent ?? '';
79
+ if (sink.childElementCount === 0 &&
80
+ source.childElementCount === 0 &&
81
+ theirText !== ourText)
82
+ attrDiffs.push(['value', { ours: ourText, theirs: theirText }]);
83
+ const attributeNames = new Set(source.getAttributeNames().concat(sink.getAttributeNames()));
84
+ for (const name of attributeNames)
85
+ if (source.getAttribute(name) !== sink.getAttribute(name))
86
+ attrDiffs.push([
87
+ name,
88
+ {
89
+ theirs: source.getAttribute(name),
90
+ ours: sink.getAttribute(name),
91
+ },
92
+ ]);
93
+ const childDiffs = [];
94
+ const ourChildren = Array.from(sink.children);
95
+ const theirChildren = Array.from(source.children);
96
+ theirChildren.forEach(theirs => {
97
+ const twinIndex = ourChildren.findIndex(ourChild => isSame(theirs, ourChild));
98
+ const ours = twinIndex > -1 ? ourChildren[twinIndex] : null;
99
+ if (ours)
100
+ ourChildren.splice(twinIndex, 1);
101
+ if (ours && isEqual(theirs, ours))
102
+ return;
103
+ if (!ours || !isEqual(theirs, ours))
104
+ childDiffs.push({ theirs, ours });
105
+ });
106
+ ourChildren.forEach(ours => childDiffs.push({ theirs: null, ours }));
107
+ return [
108
+ {
109
+ title: options?.title ??
110
+ get('merge.defaultTitle', {
111
+ sink: describe(sink),
112
+ source: describe(source),
113
+ tag: sink.tagName,
114
+ }),
115
+ primary: {
116
+ label: get('merge.title'),
117
+ icon: 'merge_type',
118
+ action: mergeWizardAction(attrDiffs, childDiffs, sink, source, options),
119
+ auto: options?.auto?.(sink, source) ?? false,
120
+ },
121
+ content: [
122
+ html `
123
+ <mwc-list multi>
124
+ ${repeat(attrDiffs, e => e, ([name, diff], index) => html `<mwc-check-list-item
125
+ value=${index}
126
+ class="attr"
127
+ twoline
128
+ left
129
+ hasMeta
130
+ .selected=${options?.selected?.(diff) ?? false}
131
+ .disabled=${options?.disabled?.(diff) ?? false}
132
+ style="--mdc-checkbox-checked-color: var(--mdc-theme-${diff.ours
133
+ ? diff.theirs
134
+ ? 'secondary'
135
+ : 'error'
136
+ : 'primary'});"
137
+ >
138
+ <span>${name}</span>
139
+ <span slot="secondary"
140
+ >${diff.ours ?? ''}
141
+ ${diff.ours && diff.theirs ? html `&cularr;` : ' '}
142
+ ${diff.theirs ?? ''}</span
143
+ >
144
+ <mwc-icon slot="meta"
145
+ >${diff.ours
146
+ ? diff.theirs
147
+ ? 'edit'
148
+ : 'delete'
149
+ : 'add'}</mwc-icon
150
+ >
151
+ </mwc-check-list-item>`)}
152
+ ${childDiffs.length
153
+ ? html `<mwc-list-item noninteractive
154
+ >${get('merge.children')}</mwc-list-item
155
+ >
156
+ <li padded divider role="separator"></li>`
157
+ : ''}
158
+ ${repeat(childDiffs, e => e, (diff, index) => html `<mwc-check-list-item
159
+ value=${index}
160
+ class="child"
161
+ twoline
162
+ left
163
+ hasMeta
164
+ .selected=${options?.selected?.(diff) ?? false}
165
+ .disabled=${options?.disabled?.(diff) ?? false}
166
+ style="--mdc-checkbox-checked-color: var(--mdc-theme-${diff.ours
167
+ ? diff.theirs
168
+ ? 'secondary'
169
+ : 'error'
170
+ : 'primary'});"
171
+ >
172
+ <span>${diff.ours?.tagName ?? diff.theirs?.tagName}</span>
173
+ <span slot="secondary"
174
+ >${diff.ours ? describe(diff.ours) : ''}
175
+ ${diff.ours &&
176
+ diff.theirs &&
177
+ describe(diff.ours) + describe(diff.theirs)
178
+ ? html `&cularr;`
179
+ : ' '}
180
+ ${diff.theirs ? describe(diff.theirs) : ''}</span
181
+ >
182
+ <mwc-icon slot="meta"
183
+ >${diff.ours
184
+ ? diff.theirs
185
+ ? 'merge_type'
186
+ : 'delete'
187
+ : 'add'}</mwc-icon
188
+ >
189
+ </mwc-check-list-item>`)}
190
+ </mwc-list>
191
+ `,
192
+ ],
193
+ },
194
+ ];
195
+ }
196
+ //# sourceMappingURL=wizards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizards.js","sourceRoot":"","sources":["../src/wizards.ts"],"names":[],"mappings":"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","sourcesContent":["import { html } from 'lit-element';\nimport { repeat } from 'lit-html/directives/repeat';\nimport { get } from 'lit-translate';\n\nimport '@material/mwc-icon';\nimport '@material/mwc-list';\nimport '@material/mwc-list/mwc-check-list-item';\nimport '@material/mwc-list/mwc-list-item';\nimport { ListItem } from '@material/mwc-list/mwc-list-item';\n\nimport {\n identity,\n isEqual,\n isSame,\n newWizardEvent,\n Wizard,\n WizardActor,\n} from './foundation.js';\nimport { EditorAction, SimpleAction } from '@openscd/core/foundation/deprecated/editor.js';\ninterface MergeOptions {\n title?: string;\n selected?: (diff: Diff<Element | string>) => boolean;\n disabled?: (diff: Diff<Element | string>) => boolean;\n auto?: (sink: Element, source: Element) => boolean;\n}\n\nexport type Diff<T> =\n | { ours: T; theirs: null }\n | { ours: null; theirs: T }\n | { ours: T; theirs: T };\n\nfunction describe(element: Element): string {\n const id = identity(element);\n\n return typeof id === 'string' ? id.replace(/^>/, '') : get('unidentifiable');\n}\n\nfunction mergeWizardAction(\n attrDiffs: [string, Diff<string>][],\n childDiffs: Diff<Element>[],\n sink: Element,\n source: Element,\n options?: MergeOptions\n): WizardActor {\n return (_, wizard: Element): EditorAction[] => {\n const actions: SimpleAction[] = [];\n const checkList = wizard.shadowRoot!.querySelector('mwc-list')!;\n\n const selectedAttrDiffs = (<ListItem[]>checkList.selected)\n .filter(item => item.classList.contains('attr'))\n .map(item => attrDiffs[item.value as unknown as number]);\n\n const newSink = <Element>sink.cloneNode(false);\n const parent = selectedAttrDiffs.length ? newSink : sink;\n if (selectedAttrDiffs.length) {\n if (sink.childElementCount === 0) newSink.textContent = sink.textContent;\n for (const [name, diff] of selectedAttrDiffs)\n if (name === 'value') {\n newSink.textContent = diff.theirs;\n } else if (diff.theirs === null) newSink.removeAttribute(name);\n else newSink.setAttribute(name, diff.theirs);\n actions.push({ old: { element: sink }, new: { element: newSink } });\n }\n\n let acted = false;\n\n const selectedChildDiffs = (<ListItem[]>checkList.selected)\n .filter(item => item.classList.contains('child'))\n .map(item => childDiffs[item.value as unknown as number]);\n if (selectedChildDiffs.length) {\n for (const diff of selectedChildDiffs)\n if (!diff.ours)\n actions.push({\n new: { parent, element: diff.theirs },\n });\n else if (!diff.theirs)\n actions.push({\n old: {\n parent,\n element: diff.ours,\n reference: diff.ours.nextSibling,\n },\n });\n else {\n acted = true;\n wizard.dispatchEvent(\n newWizardEvent(\n mergeWizard(diff.ours, diff.theirs, {\n ...options,\n title: undefined,\n })\n )\n );\n }\n }\n\n if (actions.length === 0 && !acted) wizard.dispatchEvent(newWizardEvent());\n\n return [\n {\n actions,\n title: get('merge.log', {\n sink: describe(sink),\n source: describe(source),\n tag: sink.tagName,\n }),\n },\n ];\n };\n}\n\nexport function mergeWizard(\n sink: Element,\n source: Element,\n options?: MergeOptions\n): Wizard {\n const attrDiffs: [string, Diff<string>][] = [];\n const ourText = sink.textContent ?? '';\n const theirText = source.textContent ?? '';\n\n if (\n sink.childElementCount === 0 &&\n source.childElementCount === 0 &&\n theirText !== ourText\n )\n attrDiffs.push(['value', { ours: ourText, theirs: theirText }]);\n\n const attributeNames = new Set(\n source.getAttributeNames().concat(sink.getAttributeNames())\n );\n\n for (const name of attributeNames)\n if (source.getAttribute(name) !== sink.getAttribute(name))\n attrDiffs.push([\n name,\n <Diff<string>>{\n theirs: source.getAttribute(name),\n ours: sink.getAttribute(name),\n },\n ]);\n\n const childDiffs: Diff<Element>[] = [];\n const ourChildren = Array.from(sink.children);\n const theirChildren = Array.from(source.children);\n\n theirChildren.forEach(theirs => {\n const twinIndex = ourChildren.findIndex(ourChild =>\n isSame(theirs, ourChild)\n );\n const ours = twinIndex > -1 ? ourChildren[twinIndex] : null;\n\n if (ours) ourChildren.splice(twinIndex, 1);\n if (ours && isEqual(theirs, ours)) return;\n\n if (!ours || !isEqual(theirs, ours)) childDiffs.push({ theirs, ours });\n });\n\n ourChildren.forEach(ours => childDiffs.push({ theirs: null, ours }));\n\n return [\n {\n title:\n options?.title ??\n get('merge.defaultTitle', {\n sink: describe(sink),\n source: describe(source),\n tag: sink.tagName,\n }),\n primary: {\n label: get('merge.title'),\n icon: 'merge_type',\n action: mergeWizardAction(attrDiffs, childDiffs, sink, source, options),\n auto: options?.auto?.(sink, source) ?? false,\n },\n content: [\n html`\n <mwc-list multi>\n ${repeat(\n attrDiffs,\n e => e,\n ([name, diff], index) =>\n html`<mwc-check-list-item\n value=${index}\n class=\"attr\"\n twoline\n left\n hasMeta\n .selected=${options?.selected?.(diff) ?? false}\n .disabled=${options?.disabled?.(diff) ?? false}\n style=\"--mdc-checkbox-checked-color: var(--mdc-theme-${diff.ours\n ? diff.theirs\n ? 'secondary'\n : 'error'\n : 'primary'});\"\n >\n <span>${name}</span>\n <span slot=\"secondary\"\n >${diff.ours ?? ''}\n ${diff.ours && diff.theirs ? html`&cularr;` : ' '}\n ${diff.theirs ?? ''}</span\n >\n <mwc-icon slot=\"meta\"\n >${diff.ours\n ? diff.theirs\n ? 'edit'\n : 'delete'\n : 'add'}</mwc-icon\n >\n </mwc-check-list-item>`\n )}\n ${childDiffs.length\n ? html`<mwc-list-item noninteractive\n >${get('merge.children')}</mwc-list-item\n >\n <li padded divider role=\"separator\"></li>`\n : ''}\n ${repeat(\n childDiffs,\n e => e,\n (diff, index) =>\n html`<mwc-check-list-item\n value=${index}\n class=\"child\"\n twoline\n left\n hasMeta\n .selected=${options?.selected?.(diff) ?? false}\n .disabled=${options?.disabled?.(diff) ?? false}\n style=\"--mdc-checkbox-checked-color: var(--mdc-theme-${diff.ours\n ? diff.theirs\n ? 'secondary'\n : 'error'\n : 'primary'});\"\n >\n <span>${diff.ours?.tagName ?? diff.theirs?.tagName}</span>\n <span slot=\"secondary\"\n >${diff.ours ? describe(diff.ours) : ''}\n ${diff.ours &&\n diff.theirs &&\n describe(diff.ours) + describe(diff.theirs)\n ? html`&cularr;`\n : ' '}\n ${diff.theirs ? describe(diff.theirs) : ''}</span\n >\n <mwc-icon slot=\"meta\"\n >${diff.ours\n ? diff.theirs\n ? 'merge_type'\n : 'delete'\n : 'add'}</mwc-icon\n >\n </mwc-check-list-item>`\n )}\n </mwc-list>\n `,\n ],\n },\n ];\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@compas-oscd/open-scd",
3
- "version": "0.34.0",
3
+ "version": "0.34.2",
4
4
  "repository": "https://github.com/openscd/open-scd.git",
5
5
  "directory": "packages/openscd",
6
6
  "description": "A bottom-up substation configuration designer for projects described using SCL `IEC 61850-6` Edition 2 or greater.",
@@ -14,12 +14,107 @@
14
14
  ],
15
15
  "author": "OMICRON electronics GmbH",
16
16
  "license": "Apache-2.0",
17
- "main": "open-scd.js",
18
- "module": "open-scd.js",
17
+ "main": "./dist/foundation.js",
18
+ "module": "./dist/foundation.js",
19
+ "types": "./dist/foundation.d.ts",
19
20
  "type": "module",
20
21
  "files": [
21
- "./build/**"
22
+ "dist/**"
22
23
  ],
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/foundation.d.ts",
27
+ "default": "./dist/foundation.js"
28
+ },
29
+ "./src/foundation.js": {
30
+ "types": "./dist/foundation.d.ts",
31
+ "default": "./dist/foundation.js"
32
+ },
33
+ "./src/foundation": {
34
+ "types": "./dist/foundation.d.ts",
35
+ "default": "./dist/foundation.js"
36
+ },
37
+ "./src/foundation/nsdoc.js": {
38
+ "types": "./dist/foundation/nsdoc.d.ts",
39
+ "default": "./dist/foundation/nsdoc.js"
40
+ },
41
+ "./src/plain-compare-list.js": {
42
+ "types": "./dist/plain-compare-list.d.ts",
43
+ "default": "./dist/plain-compare-list.js"
44
+ },
45
+ "./src/filtered-list.js": {
46
+ "types": "./dist/filtered-list.d.ts",
47
+ "default": "./dist/filtered-list.js"
48
+ },
49
+ "./src/action-pane.js": {
50
+ "types": "./dist/action-pane.d.ts",
51
+ "default": "./dist/action-pane.js"
52
+ },
53
+ "./src/action-icon.js": {
54
+ "types": "./dist/action-icon.d.ts",
55
+ "default": "./dist/action-icon.js"
56
+ },
57
+ "./src/addons/History.js": {
58
+ "types": "./dist/addons/History.d.ts",
59
+ "default": "./dist/addons/History.js"
60
+ },
61
+ "./src/addons/Layout.js": {
62
+ "types": "./dist/addons/Layout.d.ts",
63
+ "default": "./dist/addons/Layout.js"
64
+ },
65
+ "./src/addons/Waiter.js": {
66
+ "types": "./dist/addons/Waiter.d.ts",
67
+ "default": "./dist/addons/Waiter.js"
68
+ },
69
+ "./src/addons/Settings.js": {
70
+ "types": "./dist/addons/Settings.d.ts",
71
+ "default": "./dist/addons/Settings.js"
72
+ },
73
+ "./src/addons/Wizards.js": {
74
+ "types": "./dist/addons/Wizards.d.ts",
75
+ "default": "./dist/addons/Wizards.js"
76
+ },
77
+ "./src/plugin.js": {
78
+ "types": "./dist/plugin.d.ts",
79
+ "default": "./dist/plugin.js"
80
+ },
81
+ "./src/plugin.events.js": {
82
+ "types": "./dist/plugin.events.d.ts",
83
+ "default": "./dist/plugin.events.js"
84
+ },
85
+ "./src/plugin-tag.js": {
86
+ "types": "./dist/plugin-tag.d.ts",
87
+ "default": "./dist/plugin-tag.js"
88
+ },
89
+ "./src/wizard-dialog.js": {
90
+ "types": "./dist/wizard-dialog.d.ts",
91
+ "default": "./dist/wizard-dialog.js"
92
+ },
93
+ "./src/wizard-textfield.js": {
94
+ "types": "./dist/wizard-textfield.d.ts",
95
+ "default": "./dist/wizard-textfield.js"
96
+ },
97
+ "./src/Wizarding.js": {
98
+ "types": "./dist/Wizarding.d.ts",
99
+ "default": "./dist/Wizarding.js"
100
+ },
101
+ "./test/mock-editor-logger.js": {
102
+ "types": "./dist/test/mock-editor-logger.d.ts",
103
+ "default": "./dist/test/mock-editor-logger.js"
104
+ },
105
+ "./test/mock-wizard-editor.js": {
106
+ "types": "./dist/test/mock-wizard-editor.d.ts",
107
+ "default": "./dist/test/mock-wizard-editor.js"
108
+ },
109
+ "./test/unit/mock-logger.js": {
110
+ "types": "./dist/test/unit/mock-logger.d.ts",
111
+ "default": "./dist/test/unit/mock-logger.js"
112
+ },
113
+ "./test/mock-open-scd.js": {
114
+ "types": "./dist/test/mock-open-scd.d.ts",
115
+ "default": "./dist/test/mock-open-scd.js"
116
+ }
117
+ },
23
118
  "dependencies": {
24
119
  "@material/mwc-dialog": "0.22.1",
25
120
  "@material/mwc-drawer": "0.22.1",