@design.estate/wcctools 5.1.0

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 (55) hide show
  1. package/.smartconfig.json +65 -0
  2. package/changelog.md +414 -0
  3. package/dist_bundle/bundle.js +92419 -0
  4. package/dist_bundle/bundle.js.map +1 -0
  5. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  6. package/dist_ts_web/00_commitinfo_data.js +9 -0
  7. package/dist_ts_web/elements/wcc-contextmenu.d.ts +41 -0
  8. package/dist_ts_web/elements/wcc-contextmenu.js +329 -0
  9. package/dist_ts_web/elements/wcc-dashboard.d.ts +119 -0
  10. package/dist_ts_web/elements/wcc-dashboard.js +700 -0
  11. package/dist_ts_web/elements/wcc-frame.d.ts +22 -0
  12. package/dist_ts_web/elements/wcc-frame.js +256 -0
  13. package/dist_ts_web/elements/wcc-properties.d.ts +43 -0
  14. package/dist_ts_web/elements/wcc-properties.js +1147 -0
  15. package/dist_ts_web/elements/wcc-record-button.d.ts +12 -0
  16. package/dist_ts_web/elements/wcc-record-button.js +165 -0
  17. package/dist_ts_web/elements/wcc-recording-panel.d.ts +44 -0
  18. package/dist_ts_web/elements/wcc-recording-panel.js +1103 -0
  19. package/dist_ts_web/elements/wcc-sidebar.d.ts +91 -0
  20. package/dist_ts_web/elements/wcc-sidebar.js +1497 -0
  21. package/dist_ts_web/elements/wcctools.helpers.d.ts +46 -0
  22. package/dist_ts_web/elements/wcctools.helpers.js +106 -0
  23. package/dist_ts_web/index.d.ts +18 -0
  24. package/dist_ts_web/index.js +30 -0
  25. package/dist_ts_web/pages/index.d.ts +1 -0
  26. package/dist_ts_web/pages/index.js +2 -0
  27. package/dist_ts_web/services/recorder.service.d.ts +55 -0
  28. package/dist_ts_web/services/recorder.service.js +353 -0
  29. package/dist_ts_web/wcctools.interfaces.d.ts +29 -0
  30. package/dist_ts_web/wcctools.interfaces.js +2 -0
  31. package/dist_ts_web/wcctools.plugins.d.ts +2 -0
  32. package/dist_ts_web/wcctools.plugins.js +3 -0
  33. package/license.md +19 -0
  34. package/package.json +64 -0
  35. package/readme.md +568 -0
  36. package/ts_web/00_commitinfo_data.ts +8 -0
  37. package/ts_web/elements/wcc-contextmenu.ts +291 -0
  38. package/ts_web/elements/wcc-dashboard.ts +672 -0
  39. package/ts_web/elements/wcc-frame.ts +189 -0
  40. package/ts_web/elements/wcc-properties.ts +1089 -0
  41. package/ts_web/elements/wcc-record-button.ts +108 -0
  42. package/ts_web/elements/wcc-recording-panel.ts +1010 -0
  43. package/ts_web/elements/wcc-sidebar.ts +1470 -0
  44. package/ts_web/elements/wcctools.helpers.ts +153 -0
  45. package/ts_web/index.ts +38 -0
  46. package/ts_web/pages/index.ts +1 -0
  47. package/ts_web/readme.md +177 -0
  48. package/ts_web/services/recorder.service.ts +451 -0
  49. package/ts_web/tspublish.json +3 -0
  50. package/ts_web/types/dom-mediacapture-stub/index.d.ts +12 -0
  51. package/ts_web/types/dom-mediacapture-stub/package.json +6 -0
  52. package/ts_web/types/dom-webcodecs-stub/index.d.ts +2 -0
  53. package/ts_web/types/dom-webcodecs-stub/package.json +6 -0
  54. package/ts_web/wcctools.interfaces.ts +31 -0
  55. package/ts_web/wcctools.plugins.ts +5 -0
@@ -0,0 +1,700 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { DeesElement, property, state, html, customElement, queryAsync, render } from '@design.estate/dees-element';
36
+ import { classifyCatalogEntry, getDemoAtIndex, getDemoCount, getElementTagName, isElementConstructor, resolveTemplateFactory, } from './wcctools.helpers.js';
37
+ import * as plugins from '../wcctools.plugins.js';
38
+ // wcc tools
39
+ import './wcc-frame.js';
40
+ import './wcc-sidebar.js';
41
+ import './wcc-properties.js';
42
+ import {} from './wcc-properties.js';
43
+ import { breakpoints } from '@design.estate/dees-domtools';
44
+ import { WccFrame } from './wcc-frame.js';
45
+ import { WccSidebar } from './wcc-sidebar.js';
46
+ const applySectionFilterAndSort = (section, entries, fallbackSort) => {
47
+ let result = entries;
48
+ if (section.filter) {
49
+ const filterFn = section.filter;
50
+ result = result.filter(([name, item]) => filterFn(name, item));
51
+ }
52
+ const sortFn = section.sort ?? fallbackSort;
53
+ if (sortFn) {
54
+ result = [...result].sort(sortFn);
55
+ }
56
+ return result;
57
+ };
58
+ /**
59
+ * The navigable entries of a section, after classification and the section's own filter and sort.
60
+ * Elements sections keep only custom element classes with a usable static `demo`;
61
+ * pages sections keep only template factories.
62
+ */
63
+ export const getSectionItems = (section) => {
64
+ const entries = Object.entries(section.items).filter(([, item]) => section.type === 'elements'
65
+ ? classifyCatalogEntry(item) === 'demo'
66
+ : typeof item === 'function');
67
+ return applySectionFilterAndSort(section, entries);
68
+ };
69
+ /**
70
+ * Registered custom elements of an elements section that have no usable demo.
71
+ * They are listed (not navigable) in the sidebar's "Without demo" group.
72
+ */
73
+ export const getSectionItemsWithoutDemo = (section) => {
74
+ if (section.type !== 'elements') {
75
+ return [];
76
+ }
77
+ const entries = Object.entries(section.items).filter(([, item]) => classifyCatalogEntry(item) === 'no-demo');
78
+ return applySectionFilterAndSort(section, entries, ([a], [b]) => a.localeCompare(b));
79
+ };
80
+ let WccDashboard = (() => {
81
+ let _classDecorators = [customElement('wcc-dashboard')];
82
+ let _classDescriptor;
83
+ let _classExtraInitializers = [];
84
+ let _classThis;
85
+ let _classSuper = DeesElement;
86
+ let _sections_decorators;
87
+ let _sections_initializers = [];
88
+ let _sections_extraInitializers = [];
89
+ let _selectedSection_decorators;
90
+ let _selectedSection_initializers = [];
91
+ let _selectedSection_extraInitializers = [];
92
+ let _selectedType_decorators;
93
+ let _selectedType_initializers = [];
94
+ let _selectedType_extraInitializers = [];
95
+ let _selectedItemName_decorators;
96
+ let _selectedItemName_initializers = [];
97
+ let _selectedItemName_extraInitializers = [];
98
+ let _selectedItem_decorators;
99
+ let _selectedItem_initializers = [];
100
+ let _selectedItem_extraInitializers = [];
101
+ let _selectedDemoIndex_decorators;
102
+ let _selectedDemoIndex_initializers = [];
103
+ let _selectedDemoIndex_extraInitializers = [];
104
+ let _selectedViewport_decorators;
105
+ let _selectedViewport_initializers = [];
106
+ let _selectedViewport_extraInitializers = [];
107
+ let _selectedTheme_decorators;
108
+ let _selectedTheme_initializers = [];
109
+ let _selectedTheme_extraInitializers = [];
110
+ let _searchQuery_decorators;
111
+ let _searchQuery_initializers = [];
112
+ let _searchQuery_extraInitializers = [];
113
+ let _pinnedItems_decorators;
114
+ let _pinnedItems_initializers = [];
115
+ let _pinnedItems_extraInitializers = [];
116
+ let _sidebarWidth_decorators;
117
+ let _sidebarWidth_initializers = [];
118
+ let _sidebarWidth_extraInitializers = [];
119
+ let _unavailableEntry_decorators;
120
+ let _unavailableEntry_initializers = [];
121
+ let _unavailableEntry_extraInitializers = [];
122
+ let _emptyState_decorators;
123
+ let _emptyState_initializers = [];
124
+ let _emptyState_extraInitializers = [];
125
+ let _wccFrame_decorators;
126
+ let _wccFrame_initializers = [];
127
+ let _wccFrame_extraInitializers = [];
128
+ var WccDashboard = class extends _classSuper {
129
+ static { _classThis = this; }
130
+ static {
131
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
132
+ _sections_decorators = [property()];
133
+ _selectedSection_decorators = [property()];
134
+ _selectedType_decorators = [property()];
135
+ _selectedItemName_decorators = [property()];
136
+ _selectedItem_decorators = [property()];
137
+ _selectedDemoIndex_decorators = [property({ type: Number })];
138
+ _selectedViewport_decorators = [property()];
139
+ _selectedTheme_decorators = [property()];
140
+ _searchQuery_decorators = [property()];
141
+ _pinnedItems_decorators = [property({ attribute: false })];
142
+ _sidebarWidth_decorators = [property({ type: Number })];
143
+ _unavailableEntry_decorators = [state()];
144
+ _emptyState_decorators = [state()];
145
+ _wccFrame_decorators = [queryAsync('wcc-frame')];
146
+ __esDecorate(this, null, _sections_decorators, { kind: "accessor", name: "sections", static: false, private: false, access: { has: obj => "sections" in obj, get: obj => obj.sections, set: (obj, value) => { obj.sections = value; } }, metadata: _metadata }, _sections_initializers, _sections_extraInitializers);
147
+ __esDecorate(this, null, _selectedSection_decorators, { kind: "accessor", name: "selectedSection", static: false, private: false, access: { has: obj => "selectedSection" in obj, get: obj => obj.selectedSection, set: (obj, value) => { obj.selectedSection = value; } }, metadata: _metadata }, _selectedSection_initializers, _selectedSection_extraInitializers);
148
+ __esDecorate(this, null, _selectedType_decorators, { kind: "accessor", name: "selectedType", static: false, private: false, access: { has: obj => "selectedType" in obj, get: obj => obj.selectedType, set: (obj, value) => { obj.selectedType = value; } }, metadata: _metadata }, _selectedType_initializers, _selectedType_extraInitializers);
149
+ __esDecorate(this, null, _selectedItemName_decorators, { kind: "accessor", name: "selectedItemName", static: false, private: false, access: { has: obj => "selectedItemName" in obj, get: obj => obj.selectedItemName, set: (obj, value) => { obj.selectedItemName = value; } }, metadata: _metadata }, _selectedItemName_initializers, _selectedItemName_extraInitializers);
150
+ __esDecorate(this, null, _selectedItem_decorators, { kind: "accessor", name: "selectedItem", static: false, private: false, access: { has: obj => "selectedItem" in obj, get: obj => obj.selectedItem, set: (obj, value) => { obj.selectedItem = value; } }, metadata: _metadata }, _selectedItem_initializers, _selectedItem_extraInitializers);
151
+ __esDecorate(this, null, _selectedDemoIndex_decorators, { kind: "accessor", name: "selectedDemoIndex", static: false, private: false, access: { has: obj => "selectedDemoIndex" in obj, get: obj => obj.selectedDemoIndex, set: (obj, value) => { obj.selectedDemoIndex = value; } }, metadata: _metadata }, _selectedDemoIndex_initializers, _selectedDemoIndex_extraInitializers);
152
+ __esDecorate(this, null, _selectedViewport_decorators, { kind: "accessor", name: "selectedViewport", static: false, private: false, access: { has: obj => "selectedViewport" in obj, get: obj => obj.selectedViewport, set: (obj, value) => { obj.selectedViewport = value; } }, metadata: _metadata }, _selectedViewport_initializers, _selectedViewport_extraInitializers);
153
+ __esDecorate(this, null, _selectedTheme_decorators, { kind: "accessor", name: "selectedTheme", static: false, private: false, access: { has: obj => "selectedTheme" in obj, get: obj => obj.selectedTheme, set: (obj, value) => { obj.selectedTheme = value; } }, metadata: _metadata }, _selectedTheme_initializers, _selectedTheme_extraInitializers);
154
+ __esDecorate(this, null, _searchQuery_decorators, { kind: "accessor", name: "searchQuery", static: false, private: false, access: { has: obj => "searchQuery" in obj, get: obj => obj.searchQuery, set: (obj, value) => { obj.searchQuery = value; } }, metadata: _metadata }, _searchQuery_initializers, _searchQuery_extraInitializers);
155
+ __esDecorate(this, null, _pinnedItems_decorators, { kind: "accessor", name: "pinnedItems", static: false, private: false, access: { has: obj => "pinnedItems" in obj, get: obj => obj.pinnedItems, set: (obj, value) => { obj.pinnedItems = value; } }, metadata: _metadata }, _pinnedItems_initializers, _pinnedItems_extraInitializers);
156
+ __esDecorate(this, null, _sidebarWidth_decorators, { kind: "accessor", name: "sidebarWidth", static: false, private: false, access: { has: obj => "sidebarWidth" in obj, get: obj => obj.sidebarWidth, set: (obj, value) => { obj.sidebarWidth = value; } }, metadata: _metadata }, _sidebarWidth_initializers, _sidebarWidth_extraInitializers);
157
+ __esDecorate(this, null, _unavailableEntry_decorators, { kind: "accessor", name: "unavailableEntry", static: false, private: false, access: { has: obj => "unavailableEntry" in obj, get: obj => obj.unavailableEntry, set: (obj, value) => { obj.unavailableEntry = value; } }, metadata: _metadata }, _unavailableEntry_initializers, _unavailableEntry_extraInitializers);
158
+ __esDecorate(this, null, _emptyState_decorators, { kind: "accessor", name: "emptyState", static: false, private: false, access: { has: obj => "emptyState" in obj, get: obj => obj.emptyState, set: (obj, value) => { obj.emptyState = value; } }, metadata: _metadata }, _emptyState_initializers, _emptyState_extraInitializers);
159
+ __esDecorate(this, null, _wccFrame_decorators, { kind: "accessor", name: "wccFrame", static: false, private: false, access: { has: obj => "wccFrame" in obj, get: obj => obj.wccFrame, set: (obj, value) => { obj.wccFrame = value; } }, metadata: _metadata }, _wccFrame_initializers, _wccFrame_extraInitializers);
160
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
161
+ WccDashboard = _classThis = _classDescriptor.value;
162
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
163
+ __runInitializers(_classThis, _classExtraInitializers);
164
+ }
165
+ #sections_accessor_storage = __runInitializers(this, _sections_initializers, []);
166
+ get sections() { return this.#sections_accessor_storage; }
167
+ set sections(value) { this.#sections_accessor_storage = value; }
168
+ #selectedSection_accessor_storage = (__runInitializers(this, _sections_extraInitializers), __runInitializers(this, _selectedSection_initializers, null));
169
+ get selectedSection() { return this.#selectedSection_accessor_storage; }
170
+ set selectedSection(value) { this.#selectedSection_accessor_storage = value; }
171
+ #selectedType_accessor_storage = (__runInitializers(this, _selectedSection_extraInitializers), __runInitializers(this, _selectedType_initializers, 'element'));
172
+ get selectedType() { return this.#selectedType_accessor_storage; }
173
+ set selectedType(value) { this.#selectedType_accessor_storage = value; }
174
+ #selectedItemName_accessor_storage = (__runInitializers(this, _selectedType_extraInitializers), __runInitializers(this, _selectedItemName_initializers, ''));
175
+ get selectedItemName() { return this.#selectedItemName_accessor_storage; }
176
+ set selectedItemName(value) { this.#selectedItemName_accessor_storage = value; }
177
+ #selectedItem_accessor_storage = (__runInitializers(this, _selectedItemName_extraInitializers), __runInitializers(this, _selectedItem_initializers, null));
178
+ get selectedItem() { return this.#selectedItem_accessor_storage; }
179
+ set selectedItem(value) { this.#selectedItem_accessor_storage = value; }
180
+ #selectedDemoIndex_accessor_storage = (__runInitializers(this, _selectedItem_extraInitializers), __runInitializers(this, _selectedDemoIndex_initializers, 0));
181
+ get selectedDemoIndex() { return this.#selectedDemoIndex_accessor_storage; }
182
+ set selectedDemoIndex(value) { this.#selectedDemoIndex_accessor_storage = value; }
183
+ #selectedViewport_accessor_storage = (__runInitializers(this, _selectedDemoIndex_extraInitializers), __runInitializers(this, _selectedViewport_initializers, 'desktop'));
184
+ get selectedViewport() { return this.#selectedViewport_accessor_storage; }
185
+ set selectedViewport(value) { this.#selectedViewport_accessor_storage = value; }
186
+ #selectedTheme_accessor_storage = (__runInitializers(this, _selectedViewport_extraInitializers), __runInitializers(this, _selectedTheme_initializers, 'dark'));
187
+ get selectedTheme() { return this.#selectedTheme_accessor_storage; }
188
+ set selectedTheme(value) { this.#selectedTheme_accessor_storage = value; }
189
+ #searchQuery_accessor_storage = (__runInitializers(this, _selectedTheme_extraInitializers), __runInitializers(this, _searchQuery_initializers, ''));
190
+ get searchQuery() { return this.#searchQuery_accessor_storage; }
191
+ set searchQuery(value) { this.#searchQuery_accessor_storage = value; }
192
+ #pinnedItems_accessor_storage = (__runInitializers(this, _searchQuery_extraInitializers), __runInitializers(this, _pinnedItems_initializers, new Set()));
193
+ // Pinned items as Set of "sectionName::itemName"
194
+ get pinnedItems() { return this.#pinnedItems_accessor_storage; }
195
+ set pinnedItems(value) { this.#pinnedItems_accessor_storage = value; }
196
+ #sidebarWidth_accessor_storage = (__runInitializers(this, _pinnedItems_extraInitializers), __runInitializers(this, _sidebarWidth_initializers, 200));
197
+ // Sidebar width (resizable)
198
+ get sidebarWidth() { return this.#sidebarWidth_accessor_storage; }
199
+ set sidebarWidth(value) { this.#sidebarWidth_accessor_storage = value; }
200
+ #unavailableEntry_accessor_storage = (__runInitializers(this, _sidebarWidth_extraInitializers), __runInitializers(this, _unavailableEntry_initializers, null));
201
+ /** Set when the route addresses an entry that cannot be previewed. */
202
+ get unavailableEntry() { return this.#unavailableEntry_accessor_storage; }
203
+ set unavailableEntry(value) { this.#unavailableEntry_accessor_storage = value; }
204
+ #emptyState_accessor_storage = (__runInitializers(this, _unavailableEntry_extraInitializers), __runInitializers(this, _emptyState_initializers, null));
205
+ /** What the frame shows instead of a demo, if anything. */
206
+ get emptyState() { return this.#emptyState_accessor_storage; }
207
+ set emptyState(value) { this.#emptyState_accessor_storage = value; }
208
+ // Derived from selectedViewport - no need for separate property
209
+ get isNative() {
210
+ return this.selectedViewport === 'native';
211
+ }
212
+ frameScrollY = (__runInitializers(this, _emptyState_extraInitializers), 0);
213
+ sidebarScrollY = 0;
214
+ scrollPositionsApplied = false;
215
+ renderedSelection = null;
216
+ renderGeneration = 0;
217
+ routeDisposers = [];
218
+ scrollDisposers = [];
219
+ scrollSetupTimeout;
220
+ routeSettleTimeout;
221
+ scrollUpdateTimeout;
222
+ #wccFrame_accessor_storage = __runInitializers(this, _wccFrame_initializers, void 0);
223
+ get wccFrame() { return this.#wccFrame_accessor_storage; }
224
+ set wccFrame(value) { this.#wccFrame_accessor_storage = value; }
225
+ constructor(config) {
226
+ super();
227
+ if (config && config.sections) {
228
+ this.sections = config.sections;
229
+ }
230
+ }
231
+ /**
232
+ * Find a listed item by name across all sections, returns the item and its section
233
+ */
234
+ findItemByName(name) {
235
+ for (const section of this.sections) {
236
+ const found = getSectionItems(section).find(([itemName]) => itemName === name);
237
+ if (found) {
238
+ return { item: found[1], section };
239
+ }
240
+ }
241
+ return null;
242
+ }
243
+ /**
244
+ * Find a section by name (URL-decoded)
245
+ */
246
+ findSectionByName(name) {
247
+ return this.sections.find(s => s.name === name) || null;
248
+ }
249
+ render() {
250
+ return html `
251
+ <style>
252
+ :host {
253
+ background: #fcfcfc;
254
+ display: block;
255
+ box-sizing: border-box;
256
+ position: fixed;
257
+ inset: 0;
258
+ min-width: 0;
259
+ overflow: hidden;
260
+ container-type: inline-size;
261
+ container-name: wccDashboard;
262
+ }
263
+ :host([hidden]) {
264
+ display: none;
265
+ }
266
+ </style>
267
+ <wcc-sidebar
268
+ .dashboardRef=${this}
269
+ .selectedItem=${this.selectedItem}
270
+ .searchQuery=${this.searchQuery}
271
+ .pinnedItems=${this.pinnedItems}
272
+ .sidebarWidth=${this.sidebarWidth}
273
+ .isNative=${this.isNative}
274
+ @selectedType=${(eventArg) => {
275
+ this.selectedType = eventArg.detail;
276
+ }}
277
+ @selectedItemName=${(eventArg) => {
278
+ this.selectedItemName = eventArg.detail;
279
+ }}
280
+ @selectedItem=${(eventArg) => {
281
+ this.unavailableEntry = null;
282
+ this.selectedItem = eventArg.detail;
283
+ }}
284
+ @searchChanged=${(eventArg) => {
285
+ this.searchQuery = eventArg.detail;
286
+ this.updateUrlWithScrollState();
287
+ }}
288
+ @pinnedChanged=${(eventArg) => {
289
+ this.pinnedItems = eventArg.detail;
290
+ this.updateUrlWithScrollState();
291
+ }}
292
+ @widthChanged=${async (eventArg) => {
293
+ this.sidebarWidth = eventArg.detail;
294
+ this.updateUrlWithScrollState();
295
+ const frame = await this.wccFrame;
296
+ if (frame) {
297
+ frame.sidebarWidth = eventArg.detail;
298
+ frame.requestUpdate();
299
+ }
300
+ }}
301
+ ></wcc-sidebar>
302
+ <wcc-properties
303
+ role="region"
304
+ aria-label="Properties and preview controls"
305
+ .dashboardRef=${this}
306
+ .selectedItem=${this.selectedItem}
307
+ .selectedViewport=${this.selectedViewport}
308
+ .selectedTheme=${this.selectedTheme}
309
+ .isNative=${this.isNative}
310
+ .sidebarWidth=${this.sidebarWidth}
311
+ @selectedViewport=${(eventArg) => {
312
+ this.selectedViewport = eventArg.detail;
313
+ }}
314
+ @selectedTheme=${(eventArg) => {
315
+ this.selectedTheme = eventArg.detail;
316
+ }}
317
+ @editorStateChanged=${async (eventArg) => {
318
+ const frame = await this.wccFrame;
319
+ if (frame) {
320
+ frame.advancedEditorOpen = eventArg.detail.isOpen;
321
+ frame.requestUpdate();
322
+ }
323
+ }}
324
+ @toggleNative=${() => {
325
+ this.toggleNative();
326
+ }}
327
+ ></wcc-properties>
328
+ <wcc-frame
329
+ id="wccFrame"
330
+ role="main"
331
+ aria-label="Preview"
332
+ viewport=${this.selectedViewport}
333
+ .isNative=${this.isNative}
334
+ .sidebarWidth=${this.sidebarWidth}
335
+ .emptyState=${this.emptyState}
336
+ >
337
+ </wcc-frame>
338
+ `;
339
+ }
340
+ toggleNative() {
341
+ // Toggle between 'native' and 'desktop' viewports
342
+ this.selectedViewport = this.selectedViewport === 'native' ? 'desktop' : 'native';
343
+ this.buildUrl();
344
+ }
345
+ handleDocumentKeydown = (__runInitializers(this, _wccFrame_extraInitializers), (event) => {
346
+ if (event.key === 'Escape' && this.isNative) {
347
+ this.selectedViewport = 'desktop';
348
+ this.buildUrl();
349
+ }
350
+ });
351
+ async connectedCallback() {
352
+ const connected = super.connectedCallback();
353
+ document.addEventListener('keydown', this.handleDocumentKeydown);
354
+ // On a reconnect firstUpdated does not run again
355
+ if (this.hasUpdated) {
356
+ this.scheduleScrollListeners();
357
+ }
358
+ await this.connectRoutes();
359
+ return connected;
360
+ }
361
+ async disconnectedCallback() {
362
+ const disconnected = super.disconnectedCallback();
363
+ document.removeEventListener('keydown', this.handleDocumentKeydown);
364
+ for (const dispose of this.routeDisposers) {
365
+ dispose();
366
+ }
367
+ this.routeDisposers = [];
368
+ for (const dispose of this.scrollDisposers) {
369
+ dispose();
370
+ }
371
+ this.scrollDisposers = [];
372
+ clearTimeout(this.scrollSetupTimeout);
373
+ clearTimeout(this.routeSettleTimeout);
374
+ clearTimeout(this.scrollUpdateTimeout);
375
+ return disconnected;
376
+ }
377
+ async connectRoutes() {
378
+ const domtools = await this.domtoolsPromise;
379
+ if (!this.isConnected || this.routeDisposers.length > 0) {
380
+ return;
381
+ }
382
+ this.domtools = domtools;
383
+ const handleRoute = async (routeInfo) => {
384
+ const { sectionName, itemName, demoIndex, viewport, theme } = routeInfo.params;
385
+ await this.applyRoute({ sectionName, itemName, demoIndex, viewport, theme }, routeInfo.queryParams);
386
+ };
387
+ this.routeDisposers = [
388
+ domtools.router.on('/wcctools-route/:sectionName/:itemName/:demoIndex/:viewport/:theme', handleRoute),
389
+ // Route without demo index (kept for existing links)
390
+ domtools.router.on('/wcctools-route/:sectionName/:itemName/:viewport/:theme', handleRoute),
391
+ ];
392
+ await domtools.router._handleRouteState();
393
+ }
394
+ async firstUpdated() {
395
+ this.scheduleScrollListeners();
396
+ }
397
+ scheduleScrollListeners() {
398
+ // Set up scroll listeners after DOM is ready
399
+ clearTimeout(this.scrollSetupTimeout);
400
+ this.scrollSetupTimeout = setTimeout(() => {
401
+ this.setupScrollListeners();
402
+ }, 500);
403
+ }
404
+ /**
405
+ * Resolve a section/item pair to a listed entry, or to the reason it cannot be previewed.
406
+ * The legacy section names `element` and `page` search every section.
407
+ */
408
+ resolveEntry(sectionNameArg, itemNameArg) {
409
+ const section = this.findSectionByName(sectionNameArg);
410
+ const isLegacyName = !section && (sectionNameArg === 'element' || sectionNameArg === 'page');
411
+ const candidates = section ? [section] : isLegacyName ? this.sections : [];
412
+ for (const candidate of candidates) {
413
+ const listed = getSectionItems(candidate).find(([name]) => name === itemNameArg);
414
+ if (listed) {
415
+ return { kind: 'listed', section: candidate, item: listed[1] };
416
+ }
417
+ }
418
+ for (const candidate of candidates) {
419
+ if (getSectionItemsWithoutDemo(candidate).some(([name]) => name === itemNameArg)) {
420
+ return { kind: 'no-demo', section: candidate };
421
+ }
422
+ }
423
+ for (const candidate of candidates) {
424
+ if (Object.prototype.hasOwnProperty.call(candidate.items, itemNameArg)) {
425
+ const item = candidate.items[itemNameArg];
426
+ const notDemoable = candidate.type === 'elements'
427
+ ? classifyCatalogEntry(item) === 'ignored'
428
+ : typeof item !== 'function';
429
+ return { kind: notDemoable ? 'ignored' : 'missing', section: candidate };
430
+ }
431
+ }
432
+ return { kind: 'missing', section };
433
+ }
434
+ /**
435
+ * Apply a `/wcctools-route/...` location to the dashboard state.
436
+ */
437
+ async applyRoute(routeArg, queryParamsArg) {
438
+ const sectionName = decodeURIComponent(routeArg.sectionName);
439
+ const itemName = routeArg.itemName;
440
+ this.selectedItemName = itemName;
441
+ this.selectedDemoIndex = parseInt(routeArg.demoIndex ?? '0', 10) || 0;
442
+ this.selectedViewport = routeArg.viewport;
443
+ this.selectedTheme = routeArg.theme;
444
+ const resolved = this.resolveEntry(sectionName, itemName);
445
+ if (resolved.kind === 'listed') {
446
+ this.selectedSection = resolved.section;
447
+ this.selectedType = resolved.section.type === 'elements' ? 'element' : 'page';
448
+ this.selectedItem = resolved.item;
449
+ this.unavailableEntry = null;
450
+ }
451
+ else {
452
+ this.selectedSection = resolved.section;
453
+ this.selectedType = resolved.section?.type === 'pages' ? 'page' : 'element';
454
+ this.selectedItem = null;
455
+ this.unavailableEntry = { kind: resolved.kind, sectionName, itemName };
456
+ }
457
+ // Restore state from query parameters
458
+ const queryParams = queryParamsArg ?? {};
459
+ this.searchQuery = queryParams.search || '';
460
+ if (queryParams.frameScrollY) {
461
+ this.frameScrollY = parseInt(queryParams.frameScrollY, 10);
462
+ }
463
+ if (queryParams.sidebarScrollY) {
464
+ this.sidebarScrollY = parseInt(queryParams.sidebarScrollY, 10);
465
+ }
466
+ if (queryParams.pinned) {
467
+ const newPinned = new Set(queryParams.pinned.split(',').filter(Boolean));
468
+ // Only update if actually different to avoid update loops
469
+ if (this.pinnedItems.size !== newPinned.size ||
470
+ ![...newPinned].every(k => this.pinnedItems.has(k))) {
471
+ this.pinnedItems = newPinned;
472
+ }
473
+ }
474
+ else if (this.pinnedItems.size > 0) {
475
+ this.pinnedItems = new Set();
476
+ }
477
+ if (queryParams.sidebarWidth) {
478
+ this.sidebarWidth = parseInt(queryParams.sidebarWidth, 10);
479
+ }
480
+ // Apply scroll positions and update frame after a short delay to ensure DOM is ready
481
+ clearTimeout(this.routeSettleTimeout);
482
+ this.routeSettleTimeout = setTimeout(async () => {
483
+ this.applyScrollPositions();
484
+ const frame = await this.wccFrame;
485
+ if (!this.isConnected) {
486
+ return;
487
+ }
488
+ if (frame) {
489
+ frame.sidebarWidth = this.sidebarWidth;
490
+ frame.requestUpdate();
491
+ }
492
+ }, 100);
493
+ const domtoolsInstance = await plugins.deesDomtools.elementBasic.setup();
494
+ this.selectedTheme === 'bright'
495
+ ? domtoolsInstance.themeManager.goBright()
496
+ : domtoolsInstance.themeManager.goDark();
497
+ }
498
+ async updated(changedPropertiesArg) {
499
+ super.updated(changedPropertiesArg);
500
+ if (changedPropertiesArg.has('selectedItemName') && this.selectedItemName) {
501
+ document.title = this.selectedItemName;
502
+ }
503
+ await this.renderSelection();
504
+ }
505
+ /**
506
+ * Render the selected demo or page into the frame. Only a change of the selected item,
507
+ * demo index, type or unavailable entry re-renders; theme, viewport, search, pins and
508
+ * sidebar width leave the rendered demo (and its internal state) untouched.
509
+ */
510
+ async renderSelection() {
511
+ const selection = {
512
+ item: this.selectedItem,
513
+ demoIndex: this.selectedDemoIndex,
514
+ type: this.selectedType,
515
+ unavailable: this.unavailableEntry,
516
+ };
517
+ const previous = this.renderedSelection;
518
+ if (previous &&
519
+ previous.item === selection.item &&
520
+ previous.demoIndex === selection.demoIndex &&
521
+ previous.type === selection.type &&
522
+ previous.unavailable === selection.unavailable) {
523
+ return;
524
+ }
525
+ this.renderedSelection = selection;
526
+ const generation = ++this.renderGeneration;
527
+ const frame = await this.wccFrame;
528
+ const viewport = await frame.getViewportElement();
529
+ if (generation !== this.renderGeneration) {
530
+ return;
531
+ }
532
+ const target = this.resolveRenderTarget();
533
+ if ('emptyState' in target) {
534
+ render(html ``, viewport);
535
+ this.emptyState = target.emptyState;
536
+ return;
537
+ }
538
+ try {
539
+ const template = await resolveTemplateFactory(target.factory);
540
+ if (generation !== this.renderGeneration) {
541
+ return;
542
+ }
543
+ render(template, viewport);
544
+ this.emptyState = null;
545
+ }
546
+ catch (error) {
547
+ if (generation !== this.renderGeneration) {
548
+ return;
549
+ }
550
+ console.error(`wcctools: rendering "${this.selectedItemName}" failed`, error);
551
+ render(html ``, viewport);
552
+ this.emptyState = {
553
+ title: `${this.selectedItemName} failed to render`,
554
+ detail: error instanceof Error ? error.message : String(error),
555
+ };
556
+ }
557
+ }
558
+ resolveRenderTarget() {
559
+ const unavailable = this.unavailableEntry;
560
+ if (unavailable) {
561
+ return { emptyState: this.getUnavailableEmptyState(unavailable) };
562
+ }
563
+ const item = this.selectedItem;
564
+ if (!item) {
565
+ return {
566
+ emptyState: {
567
+ title: 'Nothing selected',
568
+ detail: 'Choose an element or page in the sidebar to preview it here.',
569
+ },
570
+ };
571
+ }
572
+ if (this.selectedType === 'page') {
573
+ return { factory: item };
574
+ }
575
+ const demo = isElementConstructor(item) ? item.demo : undefined;
576
+ const demoFactory = demo ? getDemoAtIndex(demo, this.selectedDemoIndex) : null;
577
+ if (!demoFactory) {
578
+ const count = demo ? getDemoCount(demo) : 0;
579
+ return {
580
+ emptyState: {
581
+ title: `${this.selectedItemName} has no demo ${this.selectedDemoIndex + 1}`,
582
+ detail: `This element defines ${count} ${count === 1 ? 'demo' : 'demos'}.`,
583
+ },
584
+ };
585
+ }
586
+ return { factory: demoFactory };
587
+ }
588
+ getUnavailableEmptyState(entryArg) {
589
+ switch (entryArg.kind) {
590
+ case 'no-demo': {
591
+ const section = this.findSectionByName(entryArg.sectionName);
592
+ const item = section?.items[entryArg.itemName]
593
+ ?? this.sections.map((s) => s.items[entryArg.itemName]).find((i) => i !== undefined);
594
+ const tagName = getElementTagName(item);
595
+ return {
596
+ title: `${entryArg.itemName} has no demo`,
597
+ detail: `${tagName ? `<${tagName}>` : 'This element'} is a registered custom element without a static demo. It is listed under "Without demo".`,
598
+ };
599
+ }
600
+ case 'ignored':
601
+ return {
602
+ title: `${entryArg.itemName} cannot be previewed`,
603
+ detail: 'This export is not a custom element with a demo, so the catalog does not list it.',
604
+ };
605
+ case 'missing':
606
+ return {
607
+ title: `${entryArg.itemName} was not found`,
608
+ detail: `No entry with this name exists in "${entryArg.sectionName}".`,
609
+ };
610
+ }
611
+ }
612
+ getRouteUrl() {
613
+ const sectionName = this.selectedSection
614
+ ? encodeURIComponent(this.selectedSection.name)
615
+ : this.selectedType; // Fallback for legacy
616
+ const baseUrl = `/wcctools-route/${sectionName}/${this.selectedItemName}/${this.selectedDemoIndex}/${this.selectedViewport}/${this.selectedTheme}`;
617
+ const queryParams = new URLSearchParams();
618
+ if (this.searchQuery) {
619
+ queryParams.set('search', this.searchQuery);
620
+ }
621
+ if (this.frameScrollY > 0) {
622
+ queryParams.set('frameScrollY', this.frameScrollY.toString());
623
+ }
624
+ if (this.sidebarScrollY > 0) {
625
+ queryParams.set('sidebarScrollY', this.sidebarScrollY.toString());
626
+ }
627
+ if (this.pinnedItems.size > 0) {
628
+ queryParams.set('pinned', Array.from(this.pinnedItems).join(','));
629
+ }
630
+ if (this.sidebarWidth !== 200) {
631
+ queryParams.set('sidebarWidth', this.sidebarWidth.toString());
632
+ }
633
+ const queryString = queryParams.toString();
634
+ return queryString ? `${baseUrl}?${queryString}` : baseUrl;
635
+ }
636
+ buildUrl() {
637
+ this.domtools.router.pushUrl(this.getRouteUrl());
638
+ }
639
+ handleFrameScroll = (event) => {
640
+ this.frameScrollY = event.currentTarget.scrollTop;
641
+ this.debouncedScrollUpdate();
642
+ };
643
+ handleSidebarScroll = (event) => {
644
+ this.sidebarScrollY = event.currentTarget.scrollTop;
645
+ this.debouncedScrollUpdate();
646
+ };
647
+ async setupScrollListeners() {
648
+ const wccFrame = await this.wccFrame;
649
+ // Prevent duplicate listeners and listeners on a removed dashboard
650
+ if (!this.isConnected || this.scrollDisposers.length > 0) {
651
+ return;
652
+ }
653
+ const wccSidebar = this.shadowRoot.querySelector('wcc-sidebar');
654
+ if (wccFrame) {
655
+ // The frame element itself is the scrollable container
656
+ wccFrame.addEventListener('scroll', this.handleFrameScroll);
657
+ this.scrollDisposers.push(() => wccFrame.removeEventListener('scroll', this.handleFrameScroll));
658
+ }
659
+ // Use the sidebar's scrollable container (.menu element)
660
+ const scrollContainer = wccSidebar?.scrollableContainer;
661
+ if (scrollContainer) {
662
+ scrollContainer.addEventListener('scroll', this.handleSidebarScroll);
663
+ this.scrollDisposers.push(() => scrollContainer.removeEventListener('scroll', this.handleSidebarScroll));
664
+ }
665
+ }
666
+ debouncedScrollUpdate() {
667
+ clearTimeout(this.scrollUpdateTimeout);
668
+ this.scrollUpdateTimeout = setTimeout(() => {
669
+ this.updateUrlWithScrollState();
670
+ }, 300);
671
+ }
672
+ updateUrlWithScrollState() {
673
+ // Use replaceState to update URL without navigation
674
+ window.history.replaceState(null, '', this.getRouteUrl());
675
+ }
676
+ async applyScrollPositions() {
677
+ // Only apply scroll positions once to avoid interfering with user scrolling
678
+ if (this.scrollPositionsApplied) {
679
+ return;
680
+ }
681
+ const wccFrame = await this.wccFrame;
682
+ const wccSidebar = this.shadowRoot.querySelector('wcc-sidebar');
683
+ if (wccFrame && this.frameScrollY > 0) {
684
+ // The frame element itself is the scrollable container
685
+ wccFrame.scrollTop = this.frameScrollY;
686
+ }
687
+ if (wccSidebar && this.sidebarScrollY > 0) {
688
+ // Use the sidebar's scrollable container (.menu element)
689
+ const scrollContainer = wccSidebar.scrollableContainer;
690
+ if (scrollContainer) {
691
+ scrollContainer.scrollTop = this.sidebarScrollY;
692
+ }
693
+ }
694
+ this.scrollPositionsApplied = true;
695
+ }
696
+ };
697
+ return WccDashboard = _classThis;
698
+ })();
699
+ export { WccDashboard };
700
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjLWRhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy93Y2MtZGFzaGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBdUIsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pJLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLFlBQVksRUFDWixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQUN2QixNQUFNLHVCQUF1QixDQUFDO0FBSS9CLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsWUFBWTtBQUNaLE9BQU8sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBZSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUk5QyxNQUFNLHlCQUF5QixHQUFHLENBQ2hDLE9BQW9CLEVBQ3BCLE9BQXdCLEVBQ3hCLFlBQTZELEVBQzVDLEVBQUU7SUFDbkIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQ3JCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25CLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDaEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFB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