@compas-oscd/open-scd 0.34.17 → 0.34.19

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 (250) hide show
  1. package/dist/WizardDivider.d.ts +8 -8
  2. package/dist/WizardDivider.js +26 -26
  3. package/dist/Wizarding.js +36 -36
  4. package/dist/Wizarding.js.map +1 -1
  5. package/dist/action-icon.d.ts +25 -25
  6. package/dist/action-icon.js +51 -51
  7. package/dist/action-pane.d.ts +25 -25
  8. package/dist/action-pane.js +86 -86
  9. package/dist/addons/Editor.d.ts +25 -25
  10. package/dist/addons/Editor.js +105 -105
  11. package/dist/addons/Editor.js.map +1 -1
  12. package/dist/addons/History.d.ts +86 -93
  13. package/dist/addons/History.js +301 -302
  14. package/dist/addons/History.js.map +1 -1
  15. package/dist/addons/Layout.d.ts +96 -96
  16. package/dist/addons/Layout.js +448 -448
  17. package/dist/addons/Layout.js.map +1 -1
  18. package/dist/addons/Settings.d.ts +68 -68
  19. package/dist/addons/Settings.js +272 -272
  20. package/dist/addons/Settings.js.map +1 -1
  21. package/dist/addons/Waiter.d.ts +14 -14
  22. package/dist/addons/Waiter.js +40 -40
  23. package/dist/addons/Waiter.js.map +1 -1
  24. package/dist/addons/Wizards.d.ts +15 -15
  25. package/dist/addons/Wizards.js +46 -46
  26. package/dist/addons/editor/edit-action-to-v1-converter.d.ts +3 -3
  27. package/dist/addons/editor/edit-action-to-v1-converter.js +95 -95
  28. package/dist/addons/editor/edit-action-to-v1-converter.js.map +1 -1
  29. package/dist/addons/editor/edit-v1-to-v2-converter.d.ts +2 -2
  30. package/dist/addons/editor/edit-v1-to-v2-converter.js +36 -36
  31. package/dist/addons/editor/edit-v1-to-v2-converter.js.map +1 -1
  32. package/dist/addons/history/get-log-text.d.ts +5 -5
  33. package/dist/addons/history/get-log-text.js +25 -25
  34. package/dist/addons/history/get-log-text.js.map +1 -1
  35. package/dist/addons/menu-tabs/menu-tabs.d.ts +22 -22
  36. package/dist/addons/menu-tabs/menu-tabs.js +59 -59
  37. package/dist/addons/plugin-manager/custom-plugin-dialog.d.ts +28 -28
  38. package/dist/addons/plugin-manager/custom-plugin-dialog.js +71 -71
  39. package/dist/addons/plugin-manager/plugin-manager.d.ts +20 -20
  40. package/dist/addons/plugin-manager/plugin-manager.js +77 -77
  41. package/dist/core/api/api.js +7 -0
  42. package/dist/core/api/api.js.map +1 -0
  43. package/dist/core/api/editor/subject.js +22 -0
  44. package/dist/core/api/editor/subject.js.map +1 -0
  45. package/dist/core/api/editor/xml-editor.js +82 -0
  46. package/dist/core/api/editor/xml-editor.js.map +1 -0
  47. package/dist/core/api/plugin-state-api.js +27 -0
  48. package/dist/core/api/plugin-state-api.js.map +1 -0
  49. package/dist/core/foundation/cyrb64.js +26 -0
  50. package/dist/core/foundation/cyrb64.js.map +1 -0
  51. package/dist/core/foundation/deprecated/edit-event.js +44 -0
  52. package/dist/core/foundation/deprecated/edit-event.js.map +1 -0
  53. package/dist/core/foundation/deprecated/editor.js +94 -0
  54. package/dist/core/foundation/deprecated/editor.js.map +1 -0
  55. package/dist/core/foundation/deprecated/history.js +17 -0
  56. package/dist/core/foundation/deprecated/history.js.map +1 -0
  57. package/dist/core/foundation/deprecated/open-event.js +9 -0
  58. package/dist/core/foundation/deprecated/open-event.js.map +1 -0
  59. package/dist/core/foundation/deprecated/settings.js +19 -0
  60. package/dist/core/foundation/deprecated/settings.js.map +1 -0
  61. package/dist/core/foundation/deprecated/validation.js +8 -0
  62. package/dist/core/foundation/deprecated/validation.js.map +1 -0
  63. package/dist/core/foundation/deprecated/waiter.js +12 -0
  64. package/dist/core/foundation/deprecated/waiter.js.map +1 -0
  65. package/dist/core/foundation/edit-completed-event.js +11 -0
  66. package/dist/core/foundation/edit-completed-event.js.map +1 -0
  67. package/dist/core/foundation/edit-event.js +8 -0
  68. package/dist/core/foundation/edit-event.js.map +1 -0
  69. package/dist/core/foundation/edit.js +31 -0
  70. package/dist/core/foundation/edit.js.map +1 -0
  71. package/dist/core/foundation/handle-edit.js +151 -0
  72. package/dist/core/foundation/handle-edit.js.map +1 -0
  73. package/dist/core/foundation/open-event.js +8 -0
  74. package/dist/core/foundation/open-event.js.map +1 -0
  75. package/dist/core/foundation/plugin.js +2 -0
  76. package/dist/core/foundation/plugin.js.map +1 -0
  77. package/dist/core/foundation.js +14 -0
  78. package/dist/core/foundation.js.map +1 -0
  79. package/dist/core/locales.js +21 -0
  80. package/dist/core/locales.js.map +1 -0
  81. package/dist/filtered-list.d.ts +27 -27
  82. package/dist/filtered-list.js +118 -118
  83. package/dist/finder-list.d.ts +37 -37
  84. package/dist/finder-list.js +153 -153
  85. package/dist/foundation/compare.d.ts +79 -79
  86. package/dist/foundation/compare.js +216 -216
  87. package/dist/foundation/dai.d.ts +30 -30
  88. package/dist/foundation/dai.js +126 -126
  89. package/dist/foundation/generators.d.ts +13 -13
  90. package/dist/foundation/generators.js +66 -66
  91. package/dist/foundation/ied.d.ts +22 -22
  92. package/dist/foundation/ied.js +83 -83
  93. package/dist/foundation/ied.js.map +1 -1
  94. package/dist/foundation/nsd.d.ts +4 -4
  95. package/dist/foundation/nsd.js +12 -12
  96. package/dist/foundation/nsdoc.d.ts +14 -14
  97. package/dist/foundation/nsdoc.js +178 -178
  98. package/dist/foundation/scl.d.ts +1 -1
  99. package/dist/foundation/scl.js +63 -63
  100. package/dist/foundation.d.ts +230 -230
  101. package/dist/foundation.js +1921 -1921
  102. package/dist/foundation.js.map +1 -1
  103. package/dist/icons/compare.d.ts +3 -3
  104. package/dist/icons/compare.js +4 -4
  105. package/dist/icons/icons.d.ts +41 -41
  106. package/dist/icons/icons.js +92 -92
  107. package/dist/icons/ied-icons.d.ts +3 -3
  108. package/dist/icons/ied-icons.js +4 -4
  109. package/dist/icons/lnode.d.ts +16 -16
  110. package/dist/icons/lnode.js +17 -17
  111. package/dist/open-scd.d.ts +131 -131
  112. package/dist/open-scd.js +438 -438
  113. package/dist/open-scd.js.map +1 -1
  114. package/dist/openscd/src/WizardDivider.js +37 -0
  115. package/dist/openscd/src/WizardDivider.js.map +1 -0
  116. package/dist/openscd/src/Wizarding.js +38 -0
  117. package/dist/openscd/src/Wizarding.js.map +1 -0
  118. package/dist/openscd/src/action-icon.js +220 -0
  119. package/dist/openscd/src/action-icon.js.map +1 -0
  120. package/dist/openscd/src/action-pane.js +176 -0
  121. package/dist/openscd/src/action-pane.js.map +1 -0
  122. package/dist/openscd/src/addons/Editor.js +106 -0
  123. package/dist/openscd/src/addons/Editor.js.map +1 -0
  124. package/dist/openscd/src/addons/History.js +490 -0
  125. package/dist/openscd/src/addons/History.js.map +1 -0
  126. package/dist/openscd/src/addons/Layout.js +619 -0
  127. package/dist/openscd/src/addons/Layout.js.map +1 -0
  128. package/dist/openscd/src/addons/Settings.js +465 -0
  129. package/dist/openscd/src/addons/Settings.js.map +1 -0
  130. package/dist/openscd/src/addons/Waiter.js +45 -0
  131. package/dist/openscd/src/addons/Waiter.js.map +1 -0
  132. package/dist/openscd/src/addons/Wizards.js +48 -0
  133. package/dist/openscd/src/addons/Wizards.js.map +1 -0
  134. package/dist/openscd/src/addons/editor/edit-action-to-v1-converter.js +96 -0
  135. package/dist/openscd/src/addons/editor/edit-action-to-v1-converter.js.map +1 -0
  136. package/dist/openscd/src/addons/editor/edit-v1-to-v2-converter.js +37 -0
  137. package/dist/openscd/src/addons/editor/edit-v1-to-v2-converter.js.map +1 -0
  138. package/dist/openscd/src/addons/history/get-log-text.js +26 -0
  139. package/dist/openscd/src/addons/history/get-log-text.js.map +1 -0
  140. package/dist/openscd/src/addons/menu-tabs/menu-tabs.js +74 -0
  141. package/dist/openscd/src/addons/menu-tabs/menu-tabs.js.map +1 -0
  142. package/dist/openscd/src/addons/plugin-manager/custom-plugin-dialog.js +177 -0
  143. package/dist/openscd/src/addons/plugin-manager/custom-plugin-dialog.js.map +1 -0
  144. package/dist/openscd/src/addons/plugin-manager/plugin-manager.js +165 -0
  145. package/dist/openscd/src/addons/plugin-manager/plugin-manager.js.map +1 -0
  146. package/dist/openscd/src/filtered-list.js +168 -0
  147. package/dist/openscd/src/filtered-list.js.map +1 -0
  148. package/dist/openscd/src/finder-list.js +207 -0
  149. package/dist/openscd/src/finder-list.js.map +1 -0
  150. package/dist/openscd/src/foundation/compare.js +273 -0
  151. package/dist/openscd/src/foundation/compare.js.map +1 -0
  152. package/dist/openscd/src/foundation/dai.js +127 -0
  153. package/dist/openscd/src/foundation/dai.js.map +1 -0
  154. package/dist/openscd/src/foundation/generators.js +67 -0
  155. package/dist/openscd/src/foundation/generators.js.map +1 -0
  156. package/dist/openscd/src/foundation/ied.js +84 -0
  157. package/dist/openscd/src/foundation/ied.js.map +1 -0
  158. package/dist/openscd/src/foundation/nsd.js +13 -0
  159. package/dist/openscd/src/foundation/nsd.js.map +1 -0
  160. package/dist/openscd/src/foundation/nsdoc.js +180 -0
  161. package/dist/openscd/src/foundation/nsdoc.js.map +1 -0
  162. package/dist/openscd/src/foundation/scl.js +64 -0
  163. package/dist/openscd/src/foundation/scl.js.map +1 -0
  164. package/dist/openscd/src/foundation.js +1922 -0
  165. package/dist/openscd/src/foundation.js.map +1 -0
  166. package/dist/openscd/src/icons/compare.js +11 -0
  167. package/dist/openscd/src/icons/compare.js.map +1 -0
  168. package/dist/openscd/src/icons/icons.js +611 -0
  169. package/dist/openscd/src/icons/icons.js.map +1 -0
  170. package/dist/openscd/src/icons/ied-icons.js +11 -0
  171. package/dist/openscd/src/icons/ied-icons.js.map +1 -0
  172. package/dist/openscd/src/icons/lnode.js +50 -0
  173. package/dist/openscd/src/icons/lnode.js.map +1 -0
  174. package/dist/openscd/src/open-scd.js +483 -0
  175. package/dist/openscd/src/open-scd.js.map +1 -0
  176. package/dist/openscd/src/oscd-filter-button.js +89 -0
  177. package/dist/openscd/src/oscd-filter-button.js.map +1 -0
  178. package/dist/openscd/src/plain-compare-list.js +132 -0
  179. package/dist/openscd/src/plain-compare-list.js.map +1 -0
  180. package/dist/openscd/src/plugin-tag.js +23 -0
  181. package/dist/openscd/src/plugin-tag.js.map +1 -0
  182. package/dist/openscd/src/plugin.events.js +12 -0
  183. package/dist/openscd/src/plugin.events.js.map +1 -0
  184. package/dist/openscd/src/plugin.js +2 -0
  185. package/dist/openscd/src/plugin.js.map +1 -0
  186. package/dist/openscd/src/plugins.js +256 -0
  187. package/dist/openscd/src/plugins.js.map +1 -0
  188. package/dist/openscd/src/schemas.js +9325 -0
  189. package/dist/openscd/src/schemas.js.map +1 -0
  190. package/dist/openscd/src/themes.js +122 -0
  191. package/dist/openscd/src/themes.js.map +1 -0
  192. package/dist/openscd/src/translations/de.js +954 -0
  193. package/dist/openscd/src/translations/de.js.map +1 -0
  194. package/dist/openscd/src/translations/en.js +950 -0
  195. package/dist/openscd/src/translations/en.js.map +1 -0
  196. package/dist/openscd/src/translations/loader.js +10 -0
  197. package/dist/openscd/src/translations/loader.js.map +1 -0
  198. package/dist/openscd/src/wizard-checkbox.js +152 -0
  199. package/dist/openscd/src/wizard-checkbox.js.map +1 -0
  200. package/dist/openscd/src/wizard-dialog.js +374 -0
  201. package/dist/openscd/src/wizard-dialog.js.map +1 -0
  202. package/dist/openscd/src/wizard-select.js +115 -0
  203. package/dist/openscd/src/wizard-select.js.map +1 -0
  204. package/dist/openscd/src/wizard-textfield.js +191 -0
  205. package/dist/openscd/src/wizard-textfield.js.map +1 -0
  206. package/dist/openscd/src/wizards.js +196 -0
  207. package/dist/openscd/src/wizards.js.map +1 -0
  208. package/dist/oscd-filter-button.d.ts +27 -27
  209. package/dist/oscd-filter-button.js +59 -59
  210. package/dist/plain-compare-list.d.ts +36 -36
  211. package/dist/plain-compare-list.js +70 -70
  212. package/dist/plugin-tag.d.ts +6 -6
  213. package/dist/plugin-tag.js +22 -22
  214. package/dist/plugin.d.ts +23 -23
  215. package/dist/plugin.events.d.ts +15 -15
  216. package/dist/plugin.events.js +11 -11
  217. package/dist/plugin.js +1 -1
  218. package/dist/plugin.js.map +1 -1
  219. package/dist/plugins.d.ts +3 -3
  220. package/dist/plugins.js +255 -255
  221. package/dist/schemas.d.ts +58 -58
  222. package/dist/schemas.js +59 -59
  223. package/dist/themes.d.ts +3 -3
  224. package/dist/themes.js +13 -13
  225. package/dist/themes.js.map +1 -1
  226. package/dist/translations/de.d.ts +2 -2
  227. package/dist/translations/de.js +952 -952
  228. package/dist/translations/en.d.ts +963 -963
  229. package/dist/translations/en.js +948 -948
  230. package/dist/translations/loader.d.ts +12 -12
  231. package/dist/translations/loader.js +9 -9
  232. package/dist/translations/loader.js.map +1 -1
  233. package/dist/wizard-checkbox.d.ts +37 -37
  234. package/dist/wizard-checkbox.js +130 -130
  235. package/dist/wizard-dialog.d.ts +45 -45
  236. package/dist/wizard-dialog.js +235 -235
  237. package/dist/wizard-dialog.js.map +1 -1
  238. package/dist/wizard-select.d.ts +31 -31
  239. package/dist/wizard-select.js +102 -102
  240. package/dist/wizard-textfield.d.ts +50 -50
  241. package/dist/wizard-textfield.js +162 -162
  242. package/dist/wizards.d.ts +23 -23
  243. package/dist/wizards.js +148 -148
  244. package/dist/wizards.js.map +1 -1
  245. package/dist/xml/src/foundation.js +67 -0
  246. package/dist/xml/src/foundation.js.map +1 -0
  247. package/dist/xml/src/index.js +2 -0
  248. package/dist/xml/src/index.js.map +1 -0
  249. package/package.json +38 -127
  250. package/dist/Wizarding.d.ts +0 -10
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-pane.js","sourceRoot":"","sources":["../../../src/action-pane.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n customElement,\n html,\n LitElement,\n property,\n TemplateResult,\n} from 'lit-element';\nimport { classMap } from 'lit-html/directives/class-map';\n\nimport '@material/mwc-icon';\nimport { nothing } from 'lit-html';\n\nfunction closestTo<E extends Element>(node: Node, selector: string): E | null {\n const closest =\n node.nodeType === Node.ELEMENT_NODE\n ? (<Element>node).closest<E>(selector)\n : null;\n\n if (closest) return closest;\n\n const root = <Document | DocumentFragment>node.getRootNode();\n\n if (root instanceof ShadowRoot) return closestTo(root.host, selector);\n\n return null;\n}\n\n/**\n * A responsive container rendering actions in a header.\n *\n * The \"action\" slot may contain up to eight icon buttons.\n * The \"icon\" slot, if filled overrides the icon property.\n * The default slot will be rendered into the pane body in a single column.\n */\n@customElement('action-pane')\nexport class ActionPane extends LitElement {\n /** caption text, displayed in the header */\n @property({ type: String })\n label?: string;\n /** icon name, displayed unless the \"icon\" slot is filled */\n @property({ type: String })\n icon?: string;\n /** color header with secondary theme color while focus is within */\n @property({ type: Boolean })\n secondary = false;\n /** highlight pane with dotted outline */\n @property({ type: Boolean })\n highlighted = false;\n /** nesting level, default (closest pane ancestor's level) + 1 */\n @property({ type: Number })\n level = 1;\n\n async firstUpdated(): Promise<void> {\n this.tabIndex = 0;\n\n const parentPane = closestTo<ActionPane>(this.parentNode!, 'action-pane');\n if (parentPane) this.level = parentPane.level + 1;\n\n this.level = Math.floor(this.level);\n }\n\n private renderHeader(): TemplateResult {\n const content = html`<span\n ><slot name=\"icon\"\n >${this.icon\n ? html`<mwc-icon>${this.icon}</mwc-icon>`\n : nothing}</slot\n ></span\n >\n ${this.label ?? nothing}\n <nav><slot name=\"action\"></slot></nav>`;\n\n const headingLevel = Math.floor(Math.max(this.level, 1));\n // Sometimes a TemplateResult is passed in as Label, not a string. So only when it's a string show a title.\n const title = typeof this.label === 'string' ? this.label : '';\n switch (headingLevel) {\n case 1:\n return html`<h1 title=\"${title}\">${content}</h1>`;\n case 2:\n return html`<h2 title=\"${title}\">${content}</h2>`;\n case 3:\n return html`<h3 title=\"${title}\">${content}</h3>`;\n default:\n return html`<h4 title=\"${title}\">${content}</h4>`;\n }\n }\n\n render(): TemplateResult {\n return html`<section\n class=\"${classMap({\n secondary: this.secondary,\n highlighted: this.highlighted,\n contrasted: this.level % 2 === 0,\n })}\"\n >\n ${this.renderHeader()}\n <div><slot></slot></div>\n </section>`;\n }\n\n static styles = css`\n :host {\n outline: none;\n }\n\n :host(:focus-within) section {\n box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14),\n 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2);\n outline-width: 4px;\n transition: all 250ms linear;\n }\n\n section {\n background-color: var(--mdc-theme-surface);\n transition: all 200ms linear;\n outline-style: solid;\n margin: 0px;\n outline-width: 0px;\n outline-color: var(--mdc-theme-primary);\n }\n\n section.secondary {\n outline-color: var(--mdc-theme-secondary);\n }\n\n section > div {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 8px 12px 16px;\n clear: right;\n }\n\n .highlighted {\n outline-style: dotted;\n outline-width: 2px;\n }\n\n :host(:focus-within) .highlighted {\n outline-style: solid;\n }\n\n .contrasted {\n background-color: var(--mdc-theme-on-primary);\n }\n\n h1,\n h2,\n h3,\n h4 {\n color: var(--mdc-theme-on-surface);\n font-family: 'Roboto', sans-serif;\n font-weight: 300;\n overflow: clip visible;\n white-space: nowrap;\n text-overflow: ellipsis;\n margin: 0px;\n line-height: 52px;\n padding-left: 0.3em;\n }\n\n nav {\n float: right;\n }\n\n mwc-icon {\n vertical-align: middle;\n position: relative;\n top: -0.1em;\n --mdc-icon-size: 1em;\n }\n\n ::slotted([slot='icon']) {\n vertical-align: middle;\n position: relative;\n top: -0.1em;\n --mdc-icon-size: 1em;\n }\n `;\n}\n"]}
@@ -0,0 +1,106 @@
1
+ import { __decorate } from "tslib";
2
+ import { newEditEvent, newEditEventV2 } from '@openscd/core';
3
+ import { property, LitElement, customElement, html, } from 'lit-element';
4
+ import { get } from 'lit-translate';
5
+ import { newLogEvent } from '@openscd/core/foundation/deprecated/history.js';
6
+ import { newValidateEvent } from '@openscd/core/foundation/deprecated/validation.js';
7
+ import { isComplex, isInsert, isRemove, isUpdate, } from '@openscd/core';
8
+ import { convertEditActiontoV1 } from './editor/edit-action-to-v1-converter.js';
9
+ import { convertEditV1toV2 } from './editor/edit-v1-to-v2-converter.js';
10
+ let OscdEditor = class OscdEditor extends LitElement {
11
+ constructor() {
12
+ super(...arguments);
13
+ /** The `XMLDocument` to be edited */
14
+ this.doc = null;
15
+ /** The name of the current [[`doc`]] */
16
+ this.docName = '';
17
+ /** The UUID of the current [[`doc`]] */
18
+ this.docId = '';
19
+ }
20
+ onAction(event) {
21
+ const edit = convertEditActiontoV1(event.detail.action);
22
+ const editV2 = convertEditV1toV2(edit);
23
+ this.host.dispatchEvent(newEditEventV2(editV2));
24
+ }
25
+ handleEditEvent(event) {
26
+ /**
27
+ * This is a compatibility fix for plugins based on open energy tools edit events
28
+ * because their edit event look slightly different
29
+ * see https://github.com/OpenEnergyTools/open-scd-core/blob/main/foundation/edit-event-v1.ts for details
30
+ */
31
+ if (isOpenEnergyEditEvent(event)) {
32
+ event = convertOpenEnergyEditEventToEditEvent(event);
33
+ }
34
+ const edit = event.detail.edit;
35
+ const editV2 = convertEditV1toV2(edit);
36
+ this.host.dispatchEvent(newEditEventV2(editV2));
37
+ }
38
+ /**
39
+ *
40
+ * @deprecated [Move to handleOpenDoc instead]
41
+ */
42
+ async onOpenDoc(event) {
43
+ this.doc = event.detail.doc;
44
+ this.docName = event.detail.docName;
45
+ this.docId = event.detail.docId ?? '';
46
+ await this.updateComplete;
47
+ this.dispatchEvent(newValidateEvent());
48
+ this.dispatchEvent(newLogEvent({
49
+ kind: 'info',
50
+ title: get('openSCD.loaded', { name: this.docName }),
51
+ }));
52
+ }
53
+ handleOpenDoc({ detail: { docName, doc } }) {
54
+ this.doc = doc;
55
+ this.docName = docName;
56
+ }
57
+ connectedCallback() {
58
+ super.connectedCallback();
59
+ // Deprecated editor action API, use 'oscd-edit' instead.
60
+ this.host.addEventListener('editor-action', this.onAction.bind(this));
61
+ // Deprecated edit event API, use 'oscd-edit-v2' instead.
62
+ this.host.addEventListener('oscd-edit', event => this.handleEditEvent(event));
63
+ this.host.addEventListener('oscd-edit-v2', event => this.handleEditEventV2(event));
64
+ this.host.addEventListener('open-doc', this.onOpenDoc);
65
+ this.host.addEventListener('oscd-open', this.handleOpenDoc);
66
+ }
67
+ render() {
68
+ return html `<slot></slot>`;
69
+ }
70
+ async handleEditEventV2(event) {
71
+ const { edit, title, squash } = event.detail;
72
+ this.editor.commit(edit, { title, squash });
73
+ await this.updateComplete;
74
+ this.dispatchEvent(newValidateEvent());
75
+ }
76
+ };
77
+ __decorate([
78
+ property({ attribute: false })
79
+ ], OscdEditor.prototype, "doc", void 0);
80
+ __decorate([
81
+ property({ type: String })
82
+ ], OscdEditor.prototype, "docName", void 0);
83
+ __decorate([
84
+ property({ type: String })
85
+ ], OscdEditor.prototype, "docId", void 0);
86
+ __decorate([
87
+ property({ type: Object })
88
+ ], OscdEditor.prototype, "editor", void 0);
89
+ __decorate([
90
+ property({
91
+ type: Object,
92
+ })
93
+ ], OscdEditor.prototype, "host", void 0);
94
+ OscdEditor = __decorate([
95
+ customElement('oscd-editor')
96
+ ], OscdEditor);
97
+ export { OscdEditor };
98
+ function isOpenEnergyEditEvent(event) {
99
+ const eventDetail = event.detail;
100
+ return isComplex(eventDetail) || isInsert(eventDetail) || isUpdate(eventDetail) || isRemove(eventDetail);
101
+ }
102
+ function convertOpenEnergyEditEventToEditEvent(event) {
103
+ const eventDetail = event.detail;
104
+ return newEditEvent(eventDetail);
105
+ }
106
+ //# sourceMappingURL=Editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../../src/addons/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EditEventV2,\n OpenEvent,\n newEditEvent,\n newEditEventV2,\n XMLEditor\n} from '@openscd/core';\nimport {\n property,\n LitElement,\n customElement,\n TemplateResult,\n html,\n} from 'lit-element';\nimport { get } from 'lit-translate';\n\nimport {\n EditorAction,\n EditorActionEvent,\n} from '@openscd/core/foundation/deprecated/editor.js';\n\nimport { newLogEvent } from '@openscd/core/foundation/deprecated/history.js';\nimport { newValidateEvent } from '@openscd/core/foundation/deprecated/validation.js';\nimport { OpenDocEvent } from '@openscd/core/foundation/deprecated/open-event.js';\n\nimport {\n Edit,\n EditEvent,\n isComplex,\n isInsert,\n isRemove,\n isUpdate,\n} from '@openscd/core';\n\nimport { convertEditActiontoV1 } from './editor/edit-action-to-v1-converter.js';\nimport { convertEditV1toV2 } from './editor/edit-v1-to-v2-converter.js';\n\n@customElement('oscd-editor')\nexport class OscdEditor extends LitElement {\n /** The `XMLDocument` to be edited */\n @property({ attribute: false })\n doc: XMLDocument | null = null;\n /** The name of the current [[`doc`]] */\n @property({ type: String }) docName = '';\n /** The UUID of the current [[`doc`]] */\n @property({ type: String }) docId = '';\n /** XML Editor to apply changes to the scd */\n @property({ type: Object }) editor!: XMLEditor;\n\n @property({\n type: Object,\n })\n host!: HTMLElement;\n\n private onAction(event: EditorActionEvent<EditorAction>) {\n const edit = convertEditActiontoV1(event.detail.action);\n const editV2 = convertEditV1toV2(edit);\n\n this.host.dispatchEvent(newEditEventV2(editV2));\n }\n\n handleEditEvent(event: EditEvent) {\n /**\n * This is a compatibility fix for plugins based on open energy tools edit events\n * because their edit event look slightly different\n * see https://github.com/OpenEnergyTools/open-scd-core/blob/main/foundation/edit-event-v1.ts for details\n */\n if (isOpenEnergyEditEvent(event)) {\n event = convertOpenEnergyEditEventToEditEvent(event);\n }\n\n const edit = event.detail.edit;\n const editV2 = convertEditV1toV2(edit);\n\n this.host.dispatchEvent(newEditEventV2(editV2));\n }\n\n /**\n *\n * @deprecated [Move to handleOpenDoc instead]\n */\n private async onOpenDoc(event: OpenDocEvent) {\n this.doc = event.detail.doc;\n this.docName = event.detail.docName;\n this.docId = event.detail.docId ?? '';\n\n await this.updateComplete;\n\n this.dispatchEvent(newValidateEvent());\n\n this.dispatchEvent(\n newLogEvent({\n kind: 'info',\n title: get('openSCD.loaded', { name: this.docName }),\n })\n );\n }\n\n handleOpenDoc({ detail: { docName, doc } }: OpenEvent) {\n this.doc = doc;\n this.docName = docName;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n // Deprecated editor action API, use 'oscd-edit' instead.\n this.host.addEventListener('editor-action', this.onAction.bind(this));\n // Deprecated edit event API, use 'oscd-edit-v2' instead.\n this.host.addEventListener('oscd-edit', event => this.handleEditEvent(event));\n\n this.host.addEventListener('oscd-edit-v2', event => this.handleEditEventV2(event));\n this.host.addEventListener('open-doc', this.onOpenDoc);\n this.host.addEventListener('oscd-open', this.handleOpenDoc);\n }\n\n render(): TemplateResult {\n return html`<slot></slot>`;\n }\n\n async handleEditEventV2(event: EditEventV2) {\n const { edit, title, squash } = event.detail;\n\n this.editor.commit(edit, { title, squash });\n\n await this.updateComplete;\n this.dispatchEvent(newValidateEvent());\n }\n}\n\nfunction isOpenEnergyEditEvent(event: CustomEvent<unknown>): boolean {\n const eventDetail = event.detail as Edit;\n return isComplex(eventDetail) || isInsert(eventDetail) || isUpdate(eventDetail) || isRemove(eventDetail);\n}\n\nfunction convertOpenEnergyEditEventToEditEvent(event: CustomEvent<unknown>): EditEvent {\n const eventDetail = event.detail as Edit;\n return newEditEvent(eventDetail);\n}\n"]}
@@ -0,0 +1,490 @@
1
+ import { __decorate } from "tslib";
2
+ import { html, state, property, query, customElement, LitElement, } from 'lit-element';
3
+ import { get } from 'lit-translate';
4
+ import '@material/mwc-button';
5
+ import '@material/mwc-dialog';
6
+ import '@material/mwc-icon';
7
+ import '@material/mwc-icon-button';
8
+ import '@material/mwc-icon-button-toggle';
9
+ import '@material/mwc-list';
10
+ import '@material/mwc-list/mwc-list-item';
11
+ import '@material/mwc-snackbar';
12
+ import '../filtered-list.js';
13
+ import { getFilterIcon, iconColors } from '../icons/icons.js';
14
+ import { getLogText } from './history/get-log-text.js';
15
+ const icons = {
16
+ info: 'info',
17
+ warning: 'warning',
18
+ error: 'report',
19
+ };
20
+ function getPluginName(src) {
21
+ let storedPluginsString = localStorage.getItem('plugins');
22
+ if (!storedPluginsString) {
23
+ storedPluginsString = '[]';
24
+ }
25
+ const storedPlugins = JSON.parse(storedPluginsString);
26
+ const wantedPlugin = storedPlugins.find((p) => p.src === src);
27
+ if (!wantedPlugin) {
28
+ return `pluginnotfound: ${src} in ${storedPluginsString}`;
29
+ }
30
+ const name = wantedPlugin.name;
31
+ if (!name) {
32
+ return `pluginhasnoname:${src}`;
33
+ }
34
+ return name;
35
+ }
36
+ export var HistoryUIKind;
37
+ (function (HistoryUIKind) {
38
+ HistoryUIKind["log"] = "log";
39
+ HistoryUIKind["history"] = "history";
40
+ HistoryUIKind["diagnostic"] = "diagnostic";
41
+ })(HistoryUIKind || (HistoryUIKind = {}));
42
+ export function newHistoryUIEvent(show, kind, eventInitDict) {
43
+ return new CustomEvent('history-dialog-ui', {
44
+ bubbles: true,
45
+ composed: true,
46
+ ...eventInitDict,
47
+ detail: {
48
+ show,
49
+ kind,
50
+ ...eventInitDict?.detail,
51
+ },
52
+ });
53
+ }
54
+ export function newEmptyIssuesEvent(pluginSrc, eventInitDict) {
55
+ return new CustomEvent('empty-issues', {
56
+ bubbles: true,
57
+ composed: true,
58
+ ...eventInitDict,
59
+ detail: { pluginSrc, ...eventInitDict?.detail },
60
+ });
61
+ }
62
+ let OscdHistory = class OscdHistory extends LitElement {
63
+ onIssue(de) {
64
+ const issues = this.diagnoses.get(de.detail.validatorId);
65
+ if (!issues)
66
+ this.diagnoses.set(de.detail.validatorId, [de.detail]);
67
+ else
68
+ issues?.push(de.detail);
69
+ this.latestIssue = de.detail;
70
+ this.issueUI.close();
71
+ this.issueUI.show();
72
+ }
73
+ undo() {
74
+ this.editor.undo();
75
+ }
76
+ redo() {
77
+ this.editor.redo();
78
+ }
79
+ onReset() {
80
+ this.log = [];
81
+ this.editor.reset();
82
+ this.updateHistory();
83
+ }
84
+ onInfo(detail) {
85
+ const entry = {
86
+ time: new Date(),
87
+ ...detail,
88
+ };
89
+ this.log.push(entry);
90
+ if (!this.logUI.open) {
91
+ const ui = {
92
+ error: this.errorUI,
93
+ warning: this.warningUI,
94
+ info: this.infoUI,
95
+ }[detail.kind];
96
+ ui.close();
97
+ ui.show();
98
+ }
99
+ if (detail.kind == 'error') {
100
+ this.errorUI.close(); // hack to reset timeout
101
+ this.errorUI.show();
102
+ }
103
+ this.requestUpdate('log', []);
104
+ }
105
+ onLog(le) {
106
+ switch (le.detail.kind) {
107
+ case 'reset':
108
+ this.onReset();
109
+ break;
110
+ case 'action':
111
+ // No longer needed
112
+ break;
113
+ default:
114
+ this.onInfo(le.detail);
115
+ break;
116
+ }
117
+ }
118
+ historyUIHandler(e) {
119
+ const ui = {
120
+ log: this.logUI,
121
+ history: this.historyUI,
122
+ diagnostic: this.diagnosticUI,
123
+ }[e.detail.kind];
124
+ if (e.detail.show)
125
+ ui.show();
126
+ else
127
+ ui.close();
128
+ }
129
+ emptyIssuesHandler(e) {
130
+ if (this.diagnoses.get(e.detail.pluginSrc))
131
+ this.diagnoses.get(e.detail.pluginSrc).length = 0;
132
+ }
133
+ handleKeyPress(e) {
134
+ const ctrlAnd = (key) => e.key === key && e.ctrlKey;
135
+ if (ctrlAnd('y'))
136
+ this.redo();
137
+ if (ctrlAnd('z'))
138
+ this.undo();
139
+ if (ctrlAnd('l'))
140
+ this.logUI.open ? this.logUI.close() : this.logUI.show();
141
+ if (ctrlAnd('d'))
142
+ this.diagnosticUI.open
143
+ ? this.diagnosticUI.close()
144
+ : this.diagnosticUI.show();
145
+ }
146
+ updateHistory() {
147
+ const { past, future } = this.editor;
148
+ const activeIndex = past.length - 1;
149
+ const allEntries = [...past, ...future];
150
+ this.history = allEntries.map((e, index) => {
151
+ const { title, message } = getLogText(e.redo);
152
+ return {
153
+ isActive: index === activeIndex,
154
+ time: e.time,
155
+ title: e.title ?? title,
156
+ message
157
+ };
158
+ });
159
+ }
160
+ constructor() {
161
+ super();
162
+ /** All [[`LogEntry`]]s received so far through [[`LogEvent`]]s. */
163
+ this.log = [];
164
+ this.diagnoses = new Map();
165
+ this.history = [];
166
+ this.unsubscribers = [];
167
+ this.undo = this.undo.bind(this);
168
+ this.redo = this.redo.bind(this);
169
+ this.onLog = this.onLog.bind(this);
170
+ this.onIssue = this.onIssue.bind(this);
171
+ this.historyUIHandler = this.historyUIHandler.bind(this);
172
+ this.emptyIssuesHandler = this.emptyIssuesHandler.bind(this);
173
+ this.handleKeyPress = this.handleKeyPress.bind(this);
174
+ document.onkeydown = this.handleKeyPress;
175
+ }
176
+ connectedCallback() {
177
+ super.connectedCallback();
178
+ this.unsubscribers.push(this.editor.subscribe(e => this.updateHistory()), this.editor.subscribeUndoRedo(e => this.updateHistory()));
179
+ this.host.addEventListener('log', this.onLog);
180
+ this.host.addEventListener('issue', this.onIssue);
181
+ this.host.addEventListener('history-dialog-ui', this.historyUIHandler);
182
+ this.host.addEventListener('empty-issues', this.emptyIssuesHandler);
183
+ this.diagnoses.clear();
184
+ }
185
+ disconnectedCallback() {
186
+ this.unsubscribers.forEach(u => u());
187
+ }
188
+ renderLogEntry(entry, index, log) {
189
+ return html ` <abbr title="${entry.title}">
190
+ <mwc-list-item
191
+ class="${entry.kind}"
192
+ graphic="icon"
193
+ ?twoline=${!!entry.message}
194
+ >
195
+ <span>
196
+ <!-- FIXME: replace tt with mwc-chip asap -->
197
+ <tt>${entry.time?.toLocaleString()}</tt>
198
+ ${entry.title}</span
199
+ >
200
+ <span slot="secondary">${entry.message}</span>
201
+ <mwc-icon
202
+ slot="graphic"
203
+ style="--mdc-theme-text-icon-on-background:var(${iconColors[entry.kind]})"
204
+ >${icons[entry.kind]}</mwc-icon
205
+ >
206
+ </mwc-list-item></abbr
207
+ >`;
208
+ }
209
+ renderHistoryEntry(entry) {
210
+ return html ` <abbr title="${entry.title}">
211
+ <mwc-list-item
212
+ ?twoline=${!!entry.message}
213
+ ?activated=${entry.isActive}
214
+ >
215
+ <span>
216
+ <tt>${this.formatTime(entry.time)}</tt>
217
+ ${entry.title}
218
+ </span>
219
+ <span slot="secondary">${entry.message}</span>
220
+ </mwc-list-item>
221
+ </abbr>`;
222
+ }
223
+ formatTime(time) {
224
+ const date = new Date(time);
225
+ const hours = date.getHours();
226
+ const minutes = date.getMinutes();
227
+ return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
228
+ }
229
+ renderLog() {
230
+ if (this.log.length > 0)
231
+ return this.log.slice().reverse().map(this.renderLogEntry, this);
232
+ else
233
+ return html `<mwc-list-item disabled graphic="icon">
234
+ <span>${get('log.placeholder')}</span>
235
+ <mwc-icon slot="graphic">info</mwc-icon>
236
+ </mwc-list-item>`;
237
+ }
238
+ renderHistory() {
239
+ if (this.history.length > 0)
240
+ return this.history.slice().reverse().map(e => this.renderHistoryEntry(e));
241
+ else
242
+ return html `<mwc-list-item disabled graphic="icon">
243
+ <span>${get('history.placeholder')}</span>
244
+ <mwc-icon slot="graphic">info</mwc-icon>
245
+ </mwc-list-item>`;
246
+ }
247
+ renderIssueEntry(issue) {
248
+ return html ` <abbr title="${issue.title + '\n' + issue.message}"
249
+ ><mwc-list-item ?twoline=${!!issue.message}>
250
+ <span> ${issue.title}</span>
251
+ <span slot="secondary">${issue.message}</span>
252
+ </mwc-list-item></abbr
253
+ >`;
254
+ }
255
+ renderValidatorsIssues(issues) {
256
+ if (issues.length === 0)
257
+ return [html ``];
258
+ return [
259
+ html `
260
+ <mwc-list-item noninteractive>
261
+ ${getPluginName(issues[0].validatorId)}
262
+ </mwc-list-item>
263
+ `,
264
+ html `<li divider padded role="separator"></li>`,
265
+ ...issues.map(issue => this.renderIssueEntry(issue)),
266
+ ];
267
+ }
268
+ renderIssues() {
269
+ const issueItems = [];
270
+ this.diagnoses.forEach(issues => {
271
+ this.renderValidatorsIssues(issues).forEach(issueItem => issueItems.push(issueItem));
272
+ });
273
+ return issueItems.length
274
+ ? issueItems
275
+ : html `<mwc-list-item disabled graphic="icon">
276
+ <span>${get('diag.placeholder')}</span>
277
+ <mwc-icon slot="graphic">info</mwc-icon>
278
+ </mwc-list-item>`;
279
+ }
280
+ renderFilterButtons() {
281
+ return Object.keys(icons).map(kind => html `<mwc-icon-button-toggle id="${kind}filter" on
282
+ >${getFilterIcon(kind, false)}
283
+ ${getFilterIcon(kind, true)}</mwc-icon-button-toggle
284
+ >`);
285
+ }
286
+ renderLogDialog() {
287
+ return html ` <mwc-dialog id="log" heading="${get('log.name')}">
288
+ ${this.renderFilterButtons()}
289
+ <mwc-list id="content" wrapFocus>${this.renderLog()}</mwc-list>
290
+ <mwc-button slot="primaryAction" dialogaction="close"
291
+ >${get('close')}</mwc-button
292
+ >
293
+ </mwc-dialog>`;
294
+ }
295
+ renderHistoryUI() {
296
+ return html ` <mwc-dialog id="history" heading="${get('history.name')}">
297
+ <mwc-list id="content" wrapFocus>${this.renderHistory()}</mwc-list>
298
+ <mwc-button
299
+ icon="undo"
300
+ label="${get('undo')}"
301
+ ?disabled=${!this.editor.canUndo}
302
+ @click=${this.undo}
303
+ slot="secondaryAction"
304
+ ></mwc-button>
305
+ <mwc-button
306
+ icon="redo"
307
+ label="${get('redo')}"
308
+ ?disabled=${!this.editor.canRedo}
309
+ @click=${this.redo}
310
+ slot="secondaryAction"
311
+ ></mwc-button>
312
+ <mwc-button slot="primaryAction" dialogaction="close"
313
+ >${get('close')}</mwc-button
314
+ >
315
+ </mwc-dialog>`;
316
+ }
317
+ render() {
318
+ return html `<slot></slot>
319
+ <style>
320
+ #log > mwc-icon-button-toggle {
321
+ position: absolute;
322
+ top: 8px;
323
+ right: 14px;
324
+ }
325
+ #log > mwc-icon-button-toggle:nth-child(2) {
326
+ right: 62px;
327
+ }
328
+ #log > mwc-icon-button-toggle:nth-child(3) {
329
+ right: 110px;
330
+ }
331
+ #log > mwc-icon-button-toggle:nth-child(4) {
332
+ right: 158px;
333
+ }
334
+ #content mwc-list-item.info,
335
+ #content mwc-list-item.warning,
336
+ #content mwc-list-item.error {
337
+ display: none;
338
+ }
339
+ #infofilter[on] ~ #content mwc-list-item.info {
340
+ display: flex;
341
+ }
342
+ #warningfilter[on] ~ #content mwc-list-item.warning {
343
+ display: flex;
344
+ }
345
+ #errorfilter[on] ~ #content mwc-list-item.error {
346
+ display: flex;
347
+ }
348
+
349
+ #infofilter[on] {
350
+ color: var(--cyan);
351
+ }
352
+
353
+ #warningfilter[on] {
354
+ color: var(--yellow);
355
+ }
356
+
357
+ #errorfilter[on] {
358
+ color: var(--red);
359
+ }
360
+
361
+ #actionfilter[on] {
362
+ color: var(--blue);
363
+ }
364
+
365
+ #log,
366
+ #history {
367
+ --mdc-dialog-min-width: 92vw;
368
+ }
369
+
370
+ #log > #filterContainer {
371
+ position: absolute;
372
+ top: 14px;
373
+ right: 14px;
374
+ }
375
+ </style>
376
+ ${this.renderLogDialog()} ${this.renderHistoryUI()}
377
+ <mwc-dialog id="diagnostic" heading="${get('diag.name')}">
378
+ <filtered-list id="content" wrapFocus>
379
+ ${this.renderIssues()}
380
+ </filtered-list>
381
+ <mwc-button slot="primaryAction" dialogaction="close">
382
+ ${get('close')}
383
+ </mwc-button>
384
+ </mwc-dialog>
385
+
386
+ <mwc-snackbar
387
+ id="info"
388
+ timeoutMs="4000"
389
+ labelText="${this.log
390
+ .slice()
391
+ .reverse()
392
+ .find(le => le.kind === 'info')?.title ??
393
+ get('log.snackbar.placeholder')}"
394
+ >
395
+ <mwc-icon-button icon="close" slot="dismiss"></mwc-icon-button>
396
+ </mwc-snackbar>
397
+ <mwc-snackbar
398
+ id="warning"
399
+ timeoutMs="6000"
400
+ labelText="${this.log
401
+ .slice()
402
+ .reverse()
403
+ .find(le => le.kind === 'warning')?.title ??
404
+ get('log.snackbar.placeholder')}"
405
+ >
406
+ <mwc-button
407
+ slot="action"
408
+ icon="history"
409
+ @click=${() => this.logUI.show()}
410
+ >${get('log.snackbar.show')}</mwc-button
411
+ >
412
+ <mwc-icon-button icon="close" slot="dismiss"></mwc-icon-button>
413
+ </mwc-snackbar>
414
+ <mwc-snackbar
415
+ id="error"
416
+ timeoutMs="10000"
417
+ labelText="${this.log
418
+ .slice()
419
+ .reverse()
420
+ .find(le => le.kind === 'error')?.title ??
421
+ get('log.snackbar.placeholder')}"
422
+ >
423
+ <mwc-button
424
+ slot="action"
425
+ icon="history"
426
+ @click=${() => this.logUI.show()}
427
+ >${get('log.snackbar.show')}</mwc-button
428
+ >
429
+ <mwc-icon-button icon="close" slot="dismiss"></mwc-icon-button>
430
+ </mwc-snackbar>
431
+ <mwc-snackbar
432
+ id="issue"
433
+ timeoutMs="10000"
434
+ labelText="${this.latestIssue?.title ??
435
+ get('log.snackbar.placeholder')}"
436
+ >
437
+ <mwc-button
438
+ slot="action"
439
+ icon="rule"
440
+ @click=${() => this.diagnosticUI.show()}
441
+ >${get('log.snackbar.show')}</mwc-button
442
+ >
443
+ <mwc-icon-button icon="close" slot="dismiss"></mwc-icon-button>
444
+ </mwc-snackbar>`;
445
+ }
446
+ };
447
+ __decorate([
448
+ property({ type: Array })
449
+ ], OscdHistory.prototype, "log", void 0);
450
+ __decorate([
451
+ property({ type: Object })
452
+ ], OscdHistory.prototype, "editor", void 0);
453
+ __decorate([
454
+ property()
455
+ ], OscdHistory.prototype, "diagnoses", void 0);
456
+ __decorate([
457
+ property({ type: Object })
458
+ ], OscdHistory.prototype, "host", void 0);
459
+ __decorate([
460
+ state()
461
+ ], OscdHistory.prototype, "latestIssue", void 0);
462
+ __decorate([
463
+ state()
464
+ ], OscdHistory.prototype, "history", void 0);
465
+ __decorate([
466
+ query('#log')
467
+ ], OscdHistory.prototype, "logUI", void 0);
468
+ __decorate([
469
+ query('#history')
470
+ ], OscdHistory.prototype, "historyUI", void 0);
471
+ __decorate([
472
+ query('#diagnostic')
473
+ ], OscdHistory.prototype, "diagnosticUI", void 0);
474
+ __decorate([
475
+ query('#error')
476
+ ], OscdHistory.prototype, "errorUI", void 0);
477
+ __decorate([
478
+ query('#warning')
479
+ ], OscdHistory.prototype, "warningUI", void 0);
480
+ __decorate([
481
+ query('#info')
482
+ ], OscdHistory.prototype, "infoUI", void 0);
483
+ __decorate([
484
+ query('#issue')
485
+ ], OscdHistory.prototype, "issueUI", void 0);
486
+ OscdHistory = __decorate([
487
+ customElement('oscd-history')
488
+ ], OscdHistory);
489
+ export { OscdHistory };
490
+ //# sourceMappingURL=History.js.map