@omicronenergy/oscd-shell 0.0.5 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/foundation/cyrb64.d.ts +6 -0
  2. package/dist/foundation/cyrb64.js +26 -0
  3. package/dist/foundation/cyrb64.js.map +1 -0
  4. package/dist/foundation.d.ts +1 -0
  5. package/dist/foundation.js +2 -0
  6. package/dist/foundation.js.map +1 -0
  7. package/dist/locales/de.d.ts +10 -0
  8. package/dist/locales/de.js +15 -0
  9. package/dist/locales/de.js.map +1 -0
  10. package/dist/locales.d.ts +13 -0
  11. package/dist/locales.js +21 -0
  12. package/dist/locales.js.map +1 -0
  13. package/dist/oscd-shell.d.ts +119 -0
  14. package/dist/oscd-shell.js +685 -0
  15. package/dist/oscd-shell.js.map +1 -0
  16. package/dist/utils/plugin-utils.d.ts +29 -0
  17. package/dist/utils/plugin-utils.js +138 -0
  18. package/dist/utils/plugin-utils.js.map +1 -0
  19. package/dist/utils/plugin-utils.spec.d.ts +1 -0
  20. package/dist/utils/plugin-utils.spec.js +115 -0
  21. package/dist/utils/plugin-utils.spec.js.map +1 -0
  22. package/package.json +40 -35
  23. package/.editorconfig +0 -22
  24. package/.github/actions/setup-node-env/action.yml +0 -49
  25. package/.github/workflows/release-please.yml +0 -84
  26. package/.github/workflows/test.yml +0 -18
  27. package/.github/workflows/update-screenshots.yml +0 -29
  28. package/.husky/commit-msg +0 -1
  29. package/.husky/pre-commit +0 -1
  30. package/.release-please-manifest.json +0 -1
  31. package/CHANGELOG.md +0 -73
  32. package/CONTRIBUTING.md +0 -393
  33. package/commitlint.config.js +0 -1
  34. package/demo/AddPlugins.js +0 -42
  35. package/demo/DemoPluginSrc.js +0 -9
  36. package/demo/embedded.html +0 -17
  37. package/demo/index.html +0 -95
  38. package/foundation/cyrb64.ts +0 -27
  39. package/foundation/edit-event.ts +0 -273
  40. package/foundation/open-event.ts +0 -21
  41. package/foundation.ts +0 -28
  42. package/lit-localize.json +0 -15
  43. package/localization/de.xlf +0 -75
  44. package/oscd-shell.editing.spec.ts +0 -813
  45. package/oscd-shell.plugging.spec.ts +0 -78
  46. package/oscd-shell.spec.ts +0 -431
  47. package/oscd-shell.test.ts +0 -382
  48. package/oscd-shell.ts +0 -906
  49. package/release-please-config.json +0 -21
  50. package/rollup.config.js +0 -51
  51. package/screenshots/Chromium/baseline/app-bar-de.png +0 -0
  52. package/screenshots/Chromium/baseline/app-bar-en.png +0 -0
  53. package/screenshots/Chromium/baseline/document-name-de.png +0 -0
  54. package/screenshots/Chromium/baseline/document-name-en.png +0 -0
  55. package/screenshots/Chromium/baseline/editor-plugins-de.png +0 -0
  56. package/screenshots/Chromium/baseline/editor-plugins-en.png +0 -0
  57. package/screenshots/Chromium/baseline/editor-plugins-selected-de.png +0 -0
  58. package/screenshots/Chromium/baseline/editor-plugins-selected-en.png +0 -0
  59. package/screenshots/Chromium/baseline/editor-plugins-with-doc-de.png +0 -0
  60. package/screenshots/Chromium/baseline/editor-plugins-with-doc-en.png +0 -0
  61. package/screenshots/Chromium/baseline/log-entries-de.png +0 -0
  62. package/screenshots/Chromium/baseline/log-entries-en.png +0 -0
  63. package/screenshots/Chromium/baseline/log-entries-redone-de.png +0 -0
  64. package/screenshots/Chromium/baseline/log-entries-redone-en.png +0 -0
  65. package/screenshots/Chromium/baseline/log-entries-undone-de.png +0 -0
  66. package/screenshots/Chromium/baseline/log-entries-undone-en.png +0 -0
  67. package/screenshots/Chromium/baseline/log-screen-de.png +0 -0
  68. package/screenshots/Chromium/baseline/log-screen-en.png +0 -0
  69. package/screenshots/Chromium/baseline/menu-drawer-de.png +0 -0
  70. package/screenshots/Chromium/baseline/menu-drawer-en.png +0 -0
  71. package/screenshots/Chromium/baseline/menu-plugins-de.png +0 -0
  72. package/screenshots/Chromium/baseline/menu-plugins-en.png +0 -0
  73. package/screenshots/Chromium/baseline/menu-plugins-triggered-de.png +0 -0
  74. package/screenshots/Chromium/baseline/menu-plugins-triggered-en.png +0 -0
  75. package/screenshots/Firefox/baseline/app-bar-de.png +0 -0
  76. package/screenshots/Firefox/baseline/app-bar-en.png +0 -0
  77. package/screenshots/Firefox/baseline/document-name-de.png +0 -0
  78. package/screenshots/Firefox/baseline/document-name-en.png +0 -0
  79. package/screenshots/Firefox/baseline/editor-plugins-de.png +0 -0
  80. package/screenshots/Firefox/baseline/editor-plugins-en.png +0 -0
  81. package/screenshots/Firefox/baseline/editor-plugins-selected-de.png +0 -0
  82. package/screenshots/Firefox/baseline/editor-plugins-selected-en.png +0 -0
  83. package/screenshots/Firefox/baseline/editor-plugins-with-doc-de.png +0 -0
  84. package/screenshots/Firefox/baseline/editor-plugins-with-doc-en.png +0 -0
  85. package/screenshots/Firefox/baseline/log-entries-de.png +0 -0
  86. package/screenshots/Firefox/baseline/log-entries-en.png +0 -0
  87. package/screenshots/Firefox/baseline/log-entries-redone-de.png +0 -0
  88. package/screenshots/Firefox/baseline/log-entries-redone-en.png +0 -0
  89. package/screenshots/Firefox/baseline/log-entries-undone-de.png +0 -0
  90. package/screenshots/Firefox/baseline/log-entries-undone-en.png +0 -0
  91. package/screenshots/Firefox/baseline/log-screen-de.png +0 -0
  92. package/screenshots/Firefox/baseline/log-screen-en.png +0 -0
  93. package/screenshots/Firefox/baseline/menu-drawer-de.png +0 -0
  94. package/screenshots/Firefox/baseline/menu-drawer-en.png +0 -0
  95. package/screenshots/Firefox/baseline/menu-plugins-de.png +0 -0
  96. package/screenshots/Firefox/baseline/menu-plugins-en.png +0 -0
  97. package/screenshots/Firefox/baseline/menu-plugins-triggered-de.png +0 -0
  98. package/screenshots/Firefox/baseline/menu-plugins-triggered-en.png +0 -0
  99. package/screenshots/Webkit/baseline/app-bar-de.png +0 -0
  100. package/screenshots/Webkit/baseline/app-bar-en.png +0 -0
  101. package/screenshots/Webkit/baseline/document-name-de.png +0 -0
  102. package/screenshots/Webkit/baseline/document-name-en.png +0 -0
  103. package/screenshots/Webkit/baseline/editor-plugins-de.png +0 -0
  104. package/screenshots/Webkit/baseline/editor-plugins-en.png +0 -0
  105. package/screenshots/Webkit/baseline/editor-plugins-selected-de.png +0 -0
  106. package/screenshots/Webkit/baseline/editor-plugins-selected-en.png +0 -0
  107. package/screenshots/Webkit/baseline/editor-plugins-with-doc-de.png +0 -0
  108. package/screenshots/Webkit/baseline/editor-plugins-with-doc-en.png +0 -0
  109. package/screenshots/Webkit/baseline/log-entries-de.png +0 -0
  110. package/screenshots/Webkit/baseline/log-entries-en.png +0 -0
  111. package/screenshots/Webkit/baseline/log-entries-redone-de.png +0 -0
  112. package/screenshots/Webkit/baseline/log-entries-redone-en.png +0 -0
  113. package/screenshots/Webkit/baseline/log-entries-undone-de.png +0 -0
  114. package/screenshots/Webkit/baseline/log-entries-undone-en.png +0 -0
  115. package/screenshots/Webkit/baseline/log-screen-de.png +0 -0
  116. package/screenshots/Webkit/baseline/log-screen-en.png +0 -0
  117. package/screenshots/Webkit/baseline/menu-drawer-de.png +0 -0
  118. package/screenshots/Webkit/baseline/menu-drawer-en.png +0 -0
  119. package/screenshots/Webkit/baseline/menu-plugins-de.png +0 -0
  120. package/screenshots/Webkit/baseline/menu-plugins-en.png +0 -0
  121. package/screenshots/Webkit/baseline/menu-plugins-triggered-de.png +0 -0
  122. package/screenshots/Webkit/baseline/menu-plugins-triggered-en.png +0 -0
  123. package/tsconfig.json +0 -23
  124. package/utils/testing.spec.ts +0 -210
  125. package/utils/testing.ts +0 -65
  126. package/web-dev-server.config.js +0 -24
  127. package/web-test-runner.config.js +0 -180
@@ -0,0 +1,685 @@
1
+ var _OpenSCD_plugins, _OpenSCD_actions;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet, __decorate } from "tslib";
3
+ import '@webcomponents/scoped-custom-element-registry';
4
+ import { configureLocalization, localized, msg } from '@lit/localize';
5
+ import { css, html, LitElement, nothing } from 'lit';
6
+ import { customElement, property, query, state } from 'lit/decorators.js';
7
+ import { html as staticHtml, unsafeStatic } from 'lit/static-html.js';
8
+ import '@omicronenergy/oscd-ui/app-bar/oscd-app-bar.js';
9
+ import '@omicronenergy/oscd-ui/dialog/oscd-dialog.js';
10
+ import '@omicronenergy/oscd-ui/divider/oscd-divider.js';
11
+ import '@omicronenergy/oscd-ui/iconbutton/oscd-filled-icon-button.js';
12
+ import '@omicronenergy/oscd-ui/select/oscd-filled-select.js';
13
+ import '@omicronenergy/oscd-ui/textfield/oscd-filled-text-field.js';
14
+ import '@omicronenergy/oscd-ui/icon/oscd-icon.js';
15
+ import '@omicronenergy/oscd-ui/list/oscd-list.js';
16
+ import '@omicronenergy/oscd-ui/list/oscd-list-item.js';
17
+ import '@omicronenergy/oscd-ui/menu/oscd-menu.js';
18
+ import '@omicronenergy/oscd-ui/menu/oscd-menu-item.js';
19
+ import '@omicronenergy/oscd-ui/navigation-drawer/oscd-navigation-drawer.js';
20
+ import '@omicronenergy/oscd-ui/navigation-drawer/oscd-navigation-drawer-header.js';
21
+ import '@omicronenergy/oscd-ui/tabs/oscd-secondary-tab.js';
22
+ import '@omicronenergy/oscd-ui/select/oscd-select-option.js';
23
+ import '@omicronenergy/oscd-ui/tabs/oscd-tabs.js';
24
+ import '@omicronenergy/oscd-ui/button/oscd-text-button.js';
25
+ import { XMLEditor } from '@omicronenergy/oscd-editor';
26
+ import { sourceLocale, targetLocales } from './locales.js';
27
+ import { loadSourcedPlugins } from './utils/plugin-utils.js';
28
+ const _customElementsDefine = window.customElements.define;
29
+ window.customElements.define = (name, cl, conf) => {
30
+ if (!customElements.get(name)) {
31
+ _customElementsDefine.call(window.customElements, name, cl, conf);
32
+ }
33
+ };
34
+ const { getLocale, setLocale } = configureLocalization({
35
+ sourceLocale,
36
+ targetLocales,
37
+ loadLocale: locale => import(new URL(`./locales/${locale}.js`, import.meta.url).href),
38
+ });
39
+ function renderActionItem(control, slot = 'actionItems') {
40
+ return html `<oscd-filled-icon-button
41
+ slot="${slot}"
42
+ aria-label="${control.getName()}"
43
+ ?disabled=${control.isDisabled()}
44
+ @click=${control.action}
45
+ ><oscd-icon>${control.icon}</oscd-icon></oscd-filled-icon-button
46
+ >`;
47
+ }
48
+ function renderMenuItem(control) {
49
+ return html `
50
+ <oscd-list-item
51
+ type="button"
52
+ .disabled=${control.isDisabled()}
53
+ @click=${control.action}
54
+ >
55
+ <oscd-icon slot="start">${control.icon}</oscd-icon>
56
+ <span>${control.getName()}</span>
57
+ </oscd-list-item>
58
+ `;
59
+ }
60
+ let OpenSCD = class OpenSCD extends LitElement {
61
+ isEditable(docName) {
62
+ return !!this.editable.find(ext => docName.toLowerCase().endsWith(`.${ext}`));
63
+ }
64
+ get editableDocs() {
65
+ return Object.keys(this.docs).filter(name => this.isEditable(name));
66
+ }
67
+ /** The set of `XMLDocument`s currently loaded */
68
+ get docs() {
69
+ return this._docs;
70
+ }
71
+ set docs(newDocs) {
72
+ this._docs = newDocs;
73
+ this.onDocsChanged();
74
+ }
75
+ onDocsChanged() {
76
+ this.stateVersion += 1;
77
+ }
78
+ get doc() {
79
+ return this.docs[this.docName];
80
+ }
81
+ get last() {
82
+ return this.xmlEditor.past.length - 1;
83
+ }
84
+ get canUndo() {
85
+ return this.xmlEditor.past.length >= 0;
86
+ }
87
+ get canRedo() {
88
+ return this.xmlEditor.future.length >= 0;
89
+ }
90
+ get plugins() {
91
+ return __classPrivateFieldGet(this, _OpenSCD_plugins, "f");
92
+ }
93
+ set plugins(plugins) {
94
+ __classPrivateFieldSet(this, _OpenSCD_plugins, Object.entries(plugins).reduce((acc, [pluginType, kind]) => {
95
+ const convertedPlugins = loadSourcedPlugins(kind);
96
+ acc[pluginType] = convertedPlugins;
97
+ return acc;
98
+ }, { menu: [], editor: [], background: [] }), "f");
99
+ }
100
+ handleOpenDoc({ detail: { docName, doc } }) {
101
+ this.docs = {
102
+ ...this.docs,
103
+ [docName]: doc,
104
+ };
105
+ if (this.isEditable(docName)) {
106
+ this.docName = docName;
107
+ }
108
+ this.requestUpdate();
109
+ }
110
+ /** Undo the last `n` [[Edit]]s committed */
111
+ undo(n = 1) {
112
+ if (!this.canUndo || n < 1) {
113
+ return;
114
+ }
115
+ this.xmlEditor.undo();
116
+ if (n > 1) {
117
+ this.undo(n - 1);
118
+ }
119
+ this.requestUpdate();
120
+ }
121
+ /** Redo the last `n` [[Edit]]s that have been undone */
122
+ redo(n = 1) {
123
+ if (!this.canRedo || n < 1) {
124
+ return;
125
+ }
126
+ this.xmlEditor.redo();
127
+ if (n > 1) {
128
+ this.redo(n - 1);
129
+ }
130
+ this.requestUpdate();
131
+ }
132
+ get locale() {
133
+ return getLocale();
134
+ }
135
+ set locale(tag) {
136
+ try {
137
+ setLocale(tag);
138
+ }
139
+ catch {
140
+ // don't change locale if tag is invalid
141
+ }
142
+ }
143
+ get editor() {
144
+ return this.editors[this.editorIndex]?.tagName ?? '';
145
+ }
146
+ get menu() {
147
+ return (this.plugins.menu
148
+ ?.map(({ name, tagName, requireDoc, icon, translations }) => ({
149
+ icon,
150
+ getName: () => translations?.[this.locale] ||
151
+ name,
152
+ isDisabled: () => (requireDoc && !this.docName) ?? false,
153
+ tagName,
154
+ action: () => {
155
+ if (tagName) {
156
+ this.shadowRoot.querySelector(tagName).run?.();
157
+ this.menuUI.opened = false;
158
+ }
159
+ },
160
+ }))
161
+ .filter(p => p !== undefined)).concat(__classPrivateFieldGet(this, _OpenSCD_actions, "f"));
162
+ }
163
+ get editors() {
164
+ return this.plugins.editor?.map(({ name, tagName, requireDoc, icon, translations, }) => ({
165
+ icon,
166
+ getName: () => translations?.[this.locale] ||
167
+ name,
168
+ isDisabled: () => (requireDoc && !this.docName) ?? false,
169
+ tagName,
170
+ }));
171
+ }
172
+ handleKeyPress(e) {
173
+ if (!e.ctrlKey) {
174
+ return;
175
+ }
176
+ if (!Object.prototype.hasOwnProperty.call(this.hotkeys, e.key)) {
177
+ return;
178
+ }
179
+ this.hotkeys[e.key]();
180
+ e.preventDefault();
181
+ }
182
+ constructor() {
183
+ super();
184
+ /** The file endings of editable files */
185
+ this.editable = [
186
+ 'cid',
187
+ 'icd',
188
+ 'iid',
189
+ 'scd',
190
+ 'sed',
191
+ 'ssd',
192
+ ];
193
+ this._docs = {};
194
+ /** The name of the [[`doc`]] currently being edited */
195
+ this.docName = '';
196
+ this.xmlEditor = new XMLEditor();
197
+ this.stateVersion = -1;
198
+ _OpenSCD_plugins.set(this, { menu: [], editor: [], background: [] });
199
+ this.editorIndex = 0;
200
+ this.controls = {
201
+ undo: {
202
+ icon: 'undo',
203
+ getName: () => msg('Undo'),
204
+ action: () => {
205
+ this.undo();
206
+ this.menuUI.opened = false;
207
+ },
208
+ isDisabled: () => !this.canUndo,
209
+ },
210
+ redo: {
211
+ icon: 'redo',
212
+ getName: () => msg('Redo'),
213
+ action: () => {
214
+ this.redo();
215
+ this.menuUI.opened = false;
216
+ },
217
+ isDisabled: () => !this.canRedo,
218
+ },
219
+ menu: {
220
+ icon: 'menu',
221
+ getName: () => msg('Menu'),
222
+ action: async () => {
223
+ this.menuUI.opened = !this.menuUI.opened;
224
+ await this.menuUI.updateComplete;
225
+ if (this.menuUI.opened) {
226
+ this.menuUI.querySelector('oscd-list').focus();
227
+ }
228
+ },
229
+ isDisabled: () => false,
230
+ },
231
+ };
232
+ _OpenSCD_actions.set(this, [this.controls.undo, this.controls.redo]);
233
+ this.hotkeys = {
234
+ m: this.controls.menu.action,
235
+ z: this.controls.undo.action,
236
+ y: this.controls.redo.action,
237
+ Z: this.controls.redo.action,
238
+ };
239
+ document.addEventListener('keydown', event => this.handleKeyPress(event));
240
+ this.addEventListener('oscd-open', event => this.handleOpenDoc(event));
241
+ this.addEventListener('oscd-edit-v2', (event) => {
242
+ this.xmlEditor.commit(event.detail.edit);
243
+ });
244
+ // Catch all edits (from commits AND events) and trigger an update
245
+ this.xmlEditor.subscribe(() => {
246
+ this.stateVersion += 1;
247
+ });
248
+ }
249
+ updated(changedProps) {
250
+ super.updated(changedProps);
251
+ this.updateComplete.then(() => {
252
+ // Ensure the active tab is set after tabs are rendered
253
+ const oscdTabs = this.shadowRoot.querySelector('oscd-tabs');
254
+ if (oscdTabs && oscdTabs.activeTabIndex !== this.editorIndex) {
255
+ oscdTabs.activeTabIndex = this.editorIndex;
256
+ }
257
+ });
258
+ }
259
+ renderPlugin(tagName) {
260
+ const tag = unsafeStatic(tagName);
261
+ return staticHtml `<${tag}
262
+ .locale="${this.locale}"
263
+ .docName="${this.docName}"
264
+ .doc=${this.doc}
265
+ .docs=${this.docs}
266
+ .editCount=${this.stateVersion}
267
+ .stateVersion=${this.stateVersion}
268
+ .editor=${this.xmlEditor}>
269
+ </${tag}>`;
270
+ }
271
+ render() {
272
+ return html `<oscd-app-bar slot="appContent">
273
+ ${renderActionItem(this.controls.menu, 'actionStart')}
274
+ <div slot="title" id="title">
275
+ ${this.editableDocs.length > 1
276
+ ? html `<oscd-filled-icon-button
277
+ id="fileMenuButton"
278
+ @click=${() => this.fileMenuUI.show()}
279
+ ><oscd-icon>arrow_drop_down</oscd-icon></oscd-filled-icon-button
280
+ >`
281
+ : nothing}
282
+ ${this.docName}
283
+ ${this.docName
284
+ ? html `<oscd-filled-icon-button
285
+ @click=${() => this.editFileUI.show()}
286
+ ><oscd-icon>edit</oscd-icon></oscd-filled-icon-button
287
+ >`
288
+ : nothing}
289
+ <oscd-menu
290
+ fixed
291
+ id="fileMenu"
292
+ anchor="fileMenuButton"
293
+ corner="BOTTOM_END"
294
+ >
295
+ ${this.editableDocs.map((name, index) => html `<oscd-menu-item
296
+ @click=${() => {
297
+ this.docName = name;
298
+ }}
299
+ ?disabled=${!this.isEditable(name)}
300
+ ?selected=${this.docName === name}
301
+ id=${index}
302
+ >${name}</oscd-menu-item
303
+ >`)}
304
+ </oscd-menu>
305
+ </div>
306
+
307
+ <div slot="actionEnd">
308
+ ${__classPrivateFieldGet(this, _OpenSCD_actions, "f").map(op => renderActionItem(op))}
309
+ </div>
310
+
311
+ <oscd-tabs
312
+ .activeTabIndex=${this.editorIndex}
313
+ @change=${(event) => {
314
+ const tabs = event.currentTarget;
315
+ this.editorIndex = tabs.activeTabIndex;
316
+ }}
317
+ >
318
+ ${this.editors.map(editor => editor.isDisabled()
319
+ ? nothing
320
+ : html `<oscd-secondary-tab>
321
+ <oscd-icon slot="icon">${editor.icon}</oscd-icon>
322
+ ${editor.getName()}
323
+ </oscd-secondary-tab>`)}
324
+ </oscd-tabs>
325
+ </oscd-app-bar>
326
+
327
+ <oscd-navigation-drawer hasheader type="modal" id="menu">
328
+ <oscd-navigation-drawer-header>
329
+ <span slot="headline">${msg('Menu')}</span>
330
+ ${this.docName
331
+ ? html `<span slot="supporting-text">${this.docName}</span>`
332
+ : ''}
333
+ </oscd-navigation-drawer-header>
334
+ <oscd-list>
335
+ <oscd-divider></oscd-divider>
336
+ ${this.menu.map(renderMenuItem)}
337
+ </oscd-list>
338
+ </oscd-navigation-drawer>
339
+
340
+ ${this.editor ? this.renderPlugin(this.editor) : nothing}
341
+
342
+ <oscd-dialog
343
+ id="editFile"
344
+ @closed=${(event) => {
345
+ const dialog = event.target;
346
+ if (dialog.returnValue === 'remove') {
347
+ delete this.docs[this.docName];
348
+ this.docName = this.editableDocs[0] || '';
349
+ }
350
+ }}
351
+ >
352
+ <div slot="headline">
353
+ <oscd-icon>description</oscd-icon>${this.docName}
354
+ </div>
355
+ <form slot="content" id="edit-file-form" method="dialog">
356
+ <oscd-filled-text-field
357
+ id="fileName"
358
+ label="${msg('Filename')}"
359
+ value="${this.docName.replace(/\.[^.]+$/, '')}"
360
+ @input=${(event) => {
361
+ const input = event.target;
362
+ const { value } = input;
363
+ const name = `${value}.${this.fileExtensionUI.value}`;
364
+ if (name in this.docs && name !== this.docName) {
365
+ input.setCustomValidity('File already exists!');
366
+ }
367
+ else {
368
+ input.setCustomValidity('');
369
+ }
370
+ input.reportValidity();
371
+ }}
372
+ ></oscd-filled-text-field>
373
+ <oscd-filled-select
374
+ label="${msg('Extension')}"
375
+ fixedMenuPosition
376
+ id="fileExtension"
377
+ @selected=${() => this.fileNameUI.reportValidity()}
378
+ >
379
+ ${this.editable.map(ext => html `<oscd-select-option
380
+ ?selected=${this.docName.endsWith(`.${ext}`)}
381
+ value="${ext}"
382
+ >${ext}</oscd-select-option
383
+ >`)}
384
+ </oscd-filled-select>
385
+ </form>
386
+ <div slot="actions">
387
+ <oscd-text-button
388
+ form="edit-file-form"
389
+ class="edit-dialog-remove-button"
390
+ value="remove"
391
+ >
392
+ <oscd-icon slot="icon">delete</oscd-icon>
393
+ ${msg('Close file')}
394
+ </oscd-text-button>
395
+ <oscd-text-button form="edit-file-form" value="close">
396
+ ${msg('Cancel')}
397
+ </oscd-text-button>
398
+ <oscd-text-button
399
+ @click=${() => {
400
+ const valid = this.fileNameUI.checkValidity();
401
+ if (!valid) {
402
+ this.fileNameUI.reportValidity();
403
+ return;
404
+ }
405
+ const newDocName = `${this.fileNameUI.value}.${this.fileExtensionUI.value}`;
406
+ const doc = this.docs[this.docName];
407
+ delete this.docs[this.docName];
408
+ this.docs = {
409
+ ...this.docs,
410
+ [newDocName]: doc,
411
+ };
412
+ this.docName = newDocName;
413
+ this.editFileUI.close();
414
+ }}
415
+ trailing-icon
416
+ >
417
+ <oscd-icon slot="icon">edit</oscd-icon>
418
+ ${msg('Rename')}
419
+ </oscd-text-button>
420
+ </div>
421
+ </oscd-dialog>
422
+
423
+ <aside>
424
+ <div class="menu-plugins">
425
+ ${this.plugins.menu.map(plugin => this.renderPlugin(plugin.tagName))}
426
+ </div>
427
+ <div class="background-plugins">
428
+ ${this.plugins.background
429
+ .filter(plugin => !plugin.requireDoc || !!this.docName)
430
+ .map(plugin => this.renderPlugin(plugin.tagName))}
431
+ </div>
432
+ </aside> `;
433
+ }
434
+ firstUpdated() {
435
+ const background = getComputedStyle(this.menuUI).getPropertyValue('--oscd-base2');
436
+ document.body.style.background = background;
437
+ }
438
+ };
439
+ _OpenSCD_plugins = new WeakMap();
440
+ _OpenSCD_actions = new WeakMap();
441
+ OpenSCD.styles = css `
442
+ .fileext {
443
+ opacity: 0.81;
444
+ }
445
+
446
+ .filename {
447
+ caret-color: var(--oscd-secondary);
448
+ }
449
+
450
+ .filename:focus {
451
+ outline: none;
452
+ }
453
+
454
+ aside {
455
+ position: absolute;
456
+ top: 0;
457
+ left: 0;
458
+ width: 0;
459
+ height: 0;
460
+ overflow: hidden;
461
+ margin: 0;
462
+ padding: 0;
463
+ }
464
+
465
+ abbr {
466
+ text-decoration: none;
467
+ }
468
+
469
+ @media (prefers-color-scheme: light) {
470
+ * {
471
+ --oscd-primary: var(--oscd-theme-primary, #2aa198);
472
+ --oscd-secondary: var(--oscd-theme-secondary, #6c71c4);
473
+ --oscd-base03: var(--oscd-theme-base03, #002b36);
474
+ --oscd-base02: var(--oscd-theme-base02, #073642);
475
+ --oscd-base01: var(--oscd-theme-base01, #586e75);
476
+ --oscd-base00: var(--oscd-theme-base00, #657b83);
477
+ --oscd-base0: var(--oscd-theme-base0, #839496);
478
+ --oscd-base1: var(--oscd-theme-base1, #93a1a1);
479
+ --oscd-base2: var(--oscd-theme-base2, #eee8d5);
480
+ --oscd-base3: var(--oscd-theme-base3, #fdf6e3);
481
+
482
+ --mdc-theme-text-disabled-on-light: rgba(255, 255, 255, 0.38);
483
+ }
484
+ }
485
+
486
+ @media (prefers-color-scheme: dark) {
487
+ * {
488
+ --oscd-primary: var(--oscd-theme-secondary, #6c71c4);
489
+ --oscd-secondary: var(--oscd-theme-primary, #2aa198);
490
+ --oscd-base03: var(--oscd-theme-base3, #fdf6e3);
491
+ --oscd-base02: var(--oscd-theme-base2, #eee8d5);
492
+ --oscd-base01: var(--oscd-theme-base1, #93a1a1);
493
+ --oscd-base00: var(--oscd-theme-base0, #839496);
494
+ --oscd-base0: var(--oscd-theme-base00, #657b83);
495
+ --oscd-base1: var(--oscd-theme-base01, #586e75);
496
+ --oscd-base2: var(--oscd-theme-base02, #073642);
497
+ --oscd-base3: var(--oscd-theme-base03, #002b36);
498
+ }
499
+ }
500
+
501
+ * {
502
+ --oscd-error: var(--oscd-theme-error, #dc322f);
503
+
504
+ --oscd-text-font: var(--oscd-theme-text-font, 'Roboto');
505
+ --oscd-icon-font: var(--oscd-theme-icon-font, 'Material Icons');
506
+ --oscd-text-font-mono: var(--oscd-theme-text-font-mono, 'Roboto Mono');
507
+
508
+ --oscd-warning: var(--oscd-theme-warning, #b58900);
509
+ --md-sys-color-primary: var(--oscd-primary);
510
+ --md-sys-color-on-primary: var(--oscd-base3);
511
+
512
+ --md-sys-color-secondary: var(--oscd-secondary);
513
+ --md-sys-color-on-secondary: var(--oscd-base3);
514
+ --md-sys-color-secondary-container: var(--oscd-base2);
515
+
516
+ --md-sys-color-surface: var(--oscd-base3);
517
+ --md-sys-color-on-surface: var(--oscd-base00);
518
+ --md-sys-color-surface-variant: var(--oscd-base3);
519
+ --md-sys-color-on-surface-variant: var(--oscd-base00);
520
+ --md-sys-color-surface-bright: var(--oscd-base2);
521
+ --md-sys-color-surface-container: var(--oscd-base3);
522
+ --md-sys-color-surface-container-high: var(--oscd-base3);
523
+ --md-sys-color-surface-container-highest: var(--oscd-base3);
524
+
525
+ --md-sys-color-outline-variant: var(--oscd-primary);
526
+ --md-sys-color-scrim: #000000;
527
+ --md-sys-color-error: var(--oscd-error);
528
+ --md-sys-color-on-error: var(--oscd-base3);
529
+
530
+ /* --md-menu-item-selected-label-text-color: var(--oscd-base01); */
531
+ --md-icon-button-disabled-icon-color: var(--oscd-base3);
532
+
533
+ /* MDC Theme Colors
534
+ * Needed for supporting any pluggins still using the depricated MWC Components
535
+ */
536
+ --mdc-theme-primary: var(--oscd-primary);
537
+ --mdc-theme-secondary: var(--oscd-secondary);
538
+ --mdc-theme-background: var(--oscd-base3);
539
+ --mdc-theme-surface: var(--oscd-base3);
540
+ --mdc-theme-on-primary: var(--oscd-base2);
541
+ --mdc-theme-on-secondary: var(--oscd-base02);
542
+ --mdc-theme-on-background: var(--oscd-base00);
543
+ --mdc-theme-on-surface: var(--oscd-base00);
544
+ --mdc-theme-text-primary-on-background: var(--oscd-base01);
545
+ --mdc-theme-text-secondary-on-background: var(--oscd-base00);
546
+ --mdc-theme-text-icon-on-background: var(--oscd-base00);
547
+ --mdc-theme-error: var(--oscd-error);
548
+
549
+ --mdc-button-disabled-ink-color: var(--oscd-base1);
550
+
551
+ --mdc-drawer-heading-ink-color: var(--oscd-base00);
552
+
553
+ --mdc-dialog-heading-ink-color: var(--oscd-base00);
554
+
555
+ --mdc-text-field-fill-color: var(--oscd-base2);
556
+ --mdc-text-field-ink-color: var(--oscd-base02);
557
+ --mdc-text-field-label-ink-color: var(--oscd-base01);
558
+ --mdc-text-field-idle-line-color: var(--oscd-base00);
559
+ --mdc-text-field-hover-line-color: var(--oscd-base02);
560
+
561
+ --mdc-select-fill-color: var(--oscd-base2);
562
+ --mdc-select-ink-color: var(--oscd-base02);
563
+ --mdc-select-label-ink-color: var(--oscd-base01);
564
+ --mdc-select-idle-line-color: var(--oscd-base00);
565
+ --mdc-select-hover-line-color: var(--oscd-base02);
566
+ --mdc-select-dropdown-icon-color: var(--oscd-base01);
567
+
568
+ --mdc-typography-font-family: var(--oscd-text-font);
569
+ --mdc-icon-font: var(--oscd-icon-font);
570
+ }
571
+
572
+ oscd-navigation-drawer-header {
573
+ --md-list-item-supporting-text-color: var(--md-sys-color-on-surface);
574
+ }
575
+ oscd-app-bar * {
576
+ --md-filled-icon-button-disabled-container-opacity: 0;
577
+ --md-filled-icon-button-disabled-icon-color: var(
578
+ --md-sys-color-on-primary
579
+ );
580
+ }
581
+
582
+ oscd-tabs {
583
+ display: flex;
584
+ flex-grow: 1;
585
+ --md-secondary-tab-container-color: var(--oscd-primary);
586
+ }
587
+ oscd-secondary-tab {
588
+ --md-sys-color-on-surface: var(--md-sys-color-on-primary);
589
+ --md-sys-color-on-surface-variant: var(--md-sys-color-on-primary);
590
+ --md-secondary-tab-active-indicator-color: var(--oscd-base2);
591
+ }
592
+
593
+ .edit-dialog-remove-button {
594
+ --md-text-button-icon-color: var(--oscd-error);
595
+ --md-text-button-label-text-color: var(--oscd-error);
596
+
597
+ --md-text-button-focus-label-text-color: var(--oscd-error);
598
+ --md-text-button-focus-icon-color: var(--oscd-error);
599
+
600
+ --md-text-button-hover-label-text-color: var(--oscd-error);
601
+ --md-text-button-hover-state-layer-color: var(--oscd-error);
602
+ --md-text-button-hover-icon-color: var(--oscd-error);
603
+
604
+ --md-text-button-pressed-label-text-color: var(--oscd-error);
605
+ --md-text-button-pressed-state-layer-color: var(--oscd-error);
606
+ --md-text-button-pressed-icon-color: var(--oscd-error);
607
+ }
608
+
609
+ #title {
610
+ position: relative;
611
+ }
612
+ `;
613
+ __decorate([
614
+ property({ type: Array, reflect: true })
615
+ ], OpenSCD.prototype, "editable", void 0);
616
+ __decorate([
617
+ state()
618
+ ], OpenSCD.prototype, "editableDocs", null);
619
+ __decorate([
620
+ state()
621
+ ], OpenSCD.prototype, "docs", null);
622
+ __decorate([
623
+ property({ type: String, reflect: true })
624
+ ], OpenSCD.prototype, "docName", void 0);
625
+ __decorate([
626
+ state()
627
+ /** The `XMLDocument` currently being edited */
628
+ ], OpenSCD.prototype, "doc", null);
629
+ __decorate([
630
+ state()
631
+ ], OpenSCD.prototype, "xmlEditor", void 0);
632
+ __decorate([
633
+ state()
634
+ ], OpenSCD.prototype, "stateVersion", void 0);
635
+ __decorate([
636
+ state()
637
+ ], OpenSCD.prototype, "last", null);
638
+ __decorate([
639
+ state()
640
+ ], OpenSCD.prototype, "canUndo", null);
641
+ __decorate([
642
+ state()
643
+ ], OpenSCD.prototype, "canRedo", null);
644
+ __decorate([
645
+ property({ type: Object })
646
+ ], OpenSCD.prototype, "plugins", null);
647
+ __decorate([
648
+ query('#editFile')
649
+ ], OpenSCD.prototype, "editFileUI", void 0);
650
+ __decorate([
651
+ query('#menu')
652
+ ], OpenSCD.prototype, "menuUI", void 0);
653
+ __decorate([
654
+ query('#fileName')
655
+ ], OpenSCD.prototype, "fileNameUI", void 0);
656
+ __decorate([
657
+ query('#fileExtension')
658
+ ], OpenSCD.prototype, "fileExtensionUI", void 0);
659
+ __decorate([
660
+ query('#fileMenu')
661
+ ], OpenSCD.prototype, "fileMenuUI", void 0);
662
+ __decorate([
663
+ query('#fileMenuButton')
664
+ ], OpenSCD.prototype, "fileMenuButtonUI", void 0);
665
+ __decorate([
666
+ property({ type: String, reflect: true })
667
+ ], OpenSCD.prototype, "locale", null);
668
+ __decorate([
669
+ state()
670
+ ], OpenSCD.prototype, "editorIndex", void 0);
671
+ __decorate([
672
+ state()
673
+ ], OpenSCD.prototype, "editor", null);
674
+ __decorate([
675
+ state()
676
+ ], OpenSCD.prototype, "menu", null);
677
+ __decorate([
678
+ state()
679
+ ], OpenSCD.prototype, "editors", null);
680
+ OpenSCD = __decorate([
681
+ customElement('oscd-shell'),
682
+ localized()
683
+ ], OpenSCD);
684
+ export { OpenSCD };
685
+ //# sourceMappingURL=oscd-shell.js.map