@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,1497 @@
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 * as plugins from '../wcctools.plugins.js';
36
+ import { DeesElement, property, html, customElement, state } from '@design.estate/dees-element';
37
+ import { WccDashboard, getSectionItems, getSectionItemsWithoutDemo } from './wcc-dashboard.js';
38
+ import { getDemoCount, getElementDemoGroups, getElementTagName, hasMultipleDemos } from './wcctools.helpers.js';
39
+ import { WccContextmenu } from './wcc-contextmenu.js';
40
+ const SIDEBAR_MIN_WIDTH = 150;
41
+ const SIDEBAR_MAX_WIDTH = 400;
42
+ const PINNED_SECTION = '__pinned__';
43
+ let WccSidebar = (() => {
44
+ let _classDecorators = [customElement('wcc-sidebar')];
45
+ let _classDescriptor;
46
+ let _classExtraInitializers = [];
47
+ let _classThis;
48
+ let _classSuper = DeesElement;
49
+ let _selectedItem_decorators;
50
+ let _selectedItem_initializers = [];
51
+ let _selectedItem_extraInitializers = [];
52
+ let _selectedType_decorators;
53
+ let _selectedType_initializers = [];
54
+ let _selectedType_extraInitializers = [];
55
+ let _dashboardRef_decorators;
56
+ let _dashboardRef_initializers = [];
57
+ let _dashboardRef_extraInitializers = [];
58
+ let _isNative_decorators;
59
+ let _isNative_initializers = [];
60
+ let _isNative_extraInitializers = [];
61
+ let _expandedElements_decorators;
62
+ let _expandedElements_initializers = [];
63
+ let _expandedElements_extraInitializers = [];
64
+ let _collapsedSections_decorators;
65
+ let _collapsedSections_initializers = [];
66
+ let _collapsedSections_extraInitializers = [];
67
+ let _expandedWithoutDemo_decorators;
68
+ let _expandedWithoutDemo_initializers = [];
69
+ let _expandedWithoutDemo_extraInitializers = [];
70
+ let _searchQuery_decorators;
71
+ let _searchQuery_initializers = [];
72
+ let _searchQuery_extraInitializers = [];
73
+ let _pinnedItems_decorators;
74
+ let _pinnedItems_initializers = [];
75
+ let _pinnedItems_extraInitializers = [];
76
+ let _sidebarWidth_decorators;
77
+ let _sidebarWidth_initializers = [];
78
+ let _sidebarWidth_extraInitializers = [];
79
+ let _isResizing_decorators;
80
+ let _isResizing_initializers = [];
81
+ let _isResizing_extraInitializers = [];
82
+ let _isHidden_decorators;
83
+ let _isHidden_initializers = [];
84
+ let _isHidden_extraInitializers = [];
85
+ let _isMenuScrolled_decorators;
86
+ let _isMenuScrolled_initializers = [];
87
+ let _isMenuScrolled_extraInitializers = [];
88
+ var WccSidebar = class extends _classSuper {
89
+ static { _classThis = this; }
90
+ static {
91
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
92
+ _selectedItem_decorators = [property({ attribute: false })];
93
+ _selectedType_decorators = [property({ attribute: false })];
94
+ _dashboardRef_decorators = [property()];
95
+ _isNative_decorators = [property()];
96
+ _expandedElements_decorators = [state()];
97
+ _collapsedSections_decorators = [state()];
98
+ _expandedWithoutDemo_decorators = [state()];
99
+ _searchQuery_decorators = [property()];
100
+ _pinnedItems_decorators = [property({ attribute: false })];
101
+ _sidebarWidth_decorators = [property({ type: Number })];
102
+ _isResizing_decorators = [state()];
103
+ _isHidden_decorators = [state()];
104
+ _isMenuScrolled_decorators = [state()];
105
+ __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);
106
+ __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);
107
+ __esDecorate(this, null, _dashboardRef_decorators, { kind: "accessor", name: "dashboardRef", static: false, private: false, access: { has: obj => "dashboardRef" in obj, get: obj => obj.dashboardRef, set: (obj, value) => { obj.dashboardRef = value; } }, metadata: _metadata }, _dashboardRef_initializers, _dashboardRef_extraInitializers);
108
+ __esDecorate(this, null, _isNative_decorators, { kind: "accessor", name: "isNative", static: false, private: false, access: { has: obj => "isNative" in obj, get: obj => obj.isNative, set: (obj, value) => { obj.isNative = value; } }, metadata: _metadata }, _isNative_initializers, _isNative_extraInitializers);
109
+ __esDecorate(this, null, _expandedElements_decorators, { kind: "accessor", name: "expandedElements", static: false, private: false, access: { has: obj => "expandedElements" in obj, get: obj => obj.expandedElements, set: (obj, value) => { obj.expandedElements = value; } }, metadata: _metadata }, _expandedElements_initializers, _expandedElements_extraInitializers);
110
+ __esDecorate(this, null, _collapsedSections_decorators, { kind: "accessor", name: "collapsedSections", static: false, private: false, access: { has: obj => "collapsedSections" in obj, get: obj => obj.collapsedSections, set: (obj, value) => { obj.collapsedSections = value; } }, metadata: _metadata }, _collapsedSections_initializers, _collapsedSections_extraInitializers);
111
+ __esDecorate(this, null, _expandedWithoutDemo_decorators, { kind: "accessor", name: "expandedWithoutDemo", static: false, private: false, access: { has: obj => "expandedWithoutDemo" in obj, get: obj => obj.expandedWithoutDemo, set: (obj, value) => { obj.expandedWithoutDemo = value; } }, metadata: _metadata }, _expandedWithoutDemo_initializers, _expandedWithoutDemo_extraInitializers);
112
+ __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);
113
+ __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);
114
+ __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);
115
+ __esDecorate(this, null, _isResizing_decorators, { kind: "accessor", name: "isResizing", static: false, private: false, access: { has: obj => "isResizing" in obj, get: obj => obj.isResizing, set: (obj, value) => { obj.isResizing = value; } }, metadata: _metadata }, _isResizing_initializers, _isResizing_extraInitializers);
116
+ __esDecorate(this, null, _isHidden_decorators, { kind: "accessor", name: "isHidden", static: false, private: false, access: { has: obj => "isHidden" in obj, get: obj => obj.isHidden, set: (obj, value) => { obj.isHidden = value; } }, metadata: _metadata }, _isHidden_initializers, _isHidden_extraInitializers);
117
+ __esDecorate(this, null, _isMenuScrolled_decorators, { kind: "accessor", name: "isMenuScrolled", static: false, private: false, access: { has: obj => "isMenuScrolled" in obj, get: obj => obj.isMenuScrolled, set: (obj, value) => { obj.isMenuScrolled = value; } }, metadata: _metadata }, _isMenuScrolled_initializers, _isMenuScrolled_extraInitializers);
118
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
119
+ WccSidebar = _classThis = _classDescriptor.value;
120
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
121
+ __runInitializers(_classThis, _classExtraInitializers);
122
+ }
123
+ #selectedItem_accessor_storage = __runInitializers(this, _selectedItem_initializers, void 0);
124
+ get selectedItem() { return this.#selectedItem_accessor_storage; }
125
+ set selectedItem(value) { this.#selectedItem_accessor_storage = value; }
126
+ #selectedType_accessor_storage = (__runInitializers(this, _selectedItem_extraInitializers), __runInitializers(this, _selectedType_initializers, void 0));
127
+ get selectedType() { return this.#selectedType_accessor_storage; }
128
+ set selectedType(value) { this.#selectedType_accessor_storage = value; }
129
+ #dashboardRef_accessor_storage = (__runInitializers(this, _selectedType_extraInitializers), __runInitializers(this, _dashboardRef_initializers, void 0));
130
+ get dashboardRef() { return this.#dashboardRef_accessor_storage; }
131
+ set dashboardRef(value) { this.#dashboardRef_accessor_storage = value; }
132
+ #isNative_accessor_storage = (__runInitializers(this, _dashboardRef_extraInitializers), __runInitializers(this, _isNative_initializers, false));
133
+ get isNative() { return this.#isNative_accessor_storage; }
134
+ set isNative(value) { this.#isNative_accessor_storage = value; }
135
+ #expandedElements_accessor_storage = (__runInitializers(this, _isNative_extraInitializers), __runInitializers(this, _expandedElements_initializers, new Set()));
136
+ // Track which elements are expanded (for multi-demo elements)
137
+ get expandedElements() { return this.#expandedElements_accessor_storage; }
138
+ set expandedElements(value) { this.#expandedElements_accessor_storage = value; }
139
+ #collapsedSections_accessor_storage = (__runInitializers(this, _expandedElements_extraInitializers), __runInitializers(this, _collapsedSections_initializers, new Set()));
140
+ // Track which sections are collapsed
141
+ get collapsedSections() { return this.#collapsedSections_accessor_storage; }
142
+ set collapsedSections(value) { this.#collapsedSections_accessor_storage = value; }
143
+ #expandedWithoutDemo_accessor_storage = (__runInitializers(this, _collapsedSections_extraInitializers), __runInitializers(this, _expandedWithoutDemo_initializers, new Set()));
144
+ // Sections whose "Without demo" group is open
145
+ get expandedWithoutDemo() { return this.#expandedWithoutDemo_accessor_storage; }
146
+ set expandedWithoutDemo(value) { this.#expandedWithoutDemo_accessor_storage = value; }
147
+ #searchQuery_accessor_storage = (__runInitializers(this, _expandedWithoutDemo_extraInitializers), __runInitializers(this, _searchQuery_initializers, ''));
148
+ // Search query for filtering sidebar items
149
+ get searchQuery() { return this.#searchQuery_accessor_storage; }
150
+ set searchQuery(value) { this.#searchQuery_accessor_storage = value; }
151
+ #pinnedItems_accessor_storage = (__runInitializers(this, _searchQuery_extraInitializers), __runInitializers(this, _pinnedItems_initializers, new Set()));
152
+ // Pinned items as Set of "sectionName::itemName"
153
+ get pinnedItems() { return this.#pinnedItems_accessor_storage; }
154
+ set pinnedItems(value) { this.#pinnedItems_accessor_storage = value; }
155
+ #sidebarWidth_accessor_storage = (__runInitializers(this, _pinnedItems_extraInitializers), __runInitializers(this, _sidebarWidth_initializers, 200));
156
+ // Sidebar width (resizable)
157
+ get sidebarWidth() { return this.#sidebarWidth_accessor_storage; }
158
+ set sidebarWidth(value) { this.#sidebarWidth_accessor_storage = value; }
159
+ #isResizing_accessor_storage = (__runInitializers(this, _sidebarWidth_extraInitializers), __runInitializers(this, _isResizing_initializers, false));
160
+ // Track if currently resizing
161
+ get isResizing() { return this.#isResizing_accessor_storage; }
162
+ set isResizing(value) { this.#isResizing_accessor_storage = value; }
163
+ #isHidden_accessor_storage = (__runInitializers(this, _isResizing_extraInitializers), __runInitializers(this, _isHidden_initializers, false));
164
+ // Delayed hide for native mode transition
165
+ get isHidden() { return this.#isHidden_accessor_storage; }
166
+ set isHidden(value) { this.#isHidden_accessor_storage = value; }
167
+ #isMenuScrolled_accessor_storage = (__runInitializers(this, _isHidden_extraInitializers), __runInitializers(this, _isMenuScrolled_initializers, false));
168
+ // Track if menu is scrolled for header shadow
169
+ get isMenuScrolled() { return this.#isMenuScrolled_accessor_storage; }
170
+ set isMenuScrolled(value) { this.#isMenuScrolled_accessor_storage = value; }
171
+ sectionsInitialized = (__runInitializers(this, _isMenuScrolled_extraInitializers), false);
172
+ /** data-key of the tree item that holds the roving tab stop */
173
+ focusedKey = null;
174
+ hideTimeout;
175
+ highlightedGroup = null;
176
+ groupHighlightTimeout;
177
+ async disconnectedCallback() {
178
+ const disconnected = super.disconnectedCallback();
179
+ // A removed sidebar has no frame transition to wait for
180
+ clearTimeout(this.hideTimeout);
181
+ this.isHidden = this.isNative;
182
+ this.endGroupHighlight();
183
+ return disconnected;
184
+ }
185
+ /**
186
+ * Returns the scrollable container element (.menu) for external scroll management
187
+ */
188
+ get scrollableContainer() {
189
+ return this.shadowRoot?.querySelector('.menu');
190
+ }
191
+ render() {
192
+ return html `
193
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" rel="stylesheet" />
194
+ <style>
195
+ :host {
196
+ /* CSS Variables - Always dark theme to match wcc-properties */
197
+ --background: #0a0a0a;
198
+ --foreground: #e5e5e5;
199
+ --card: #0f0f0f;
200
+ --card-foreground: #f0f0f0;
201
+ --muted: #1a1a1a;
202
+ --muted-foreground: #666;
203
+ --accent: #222;
204
+ --accent-foreground: #fff;
205
+ --border: rgba(255, 255, 255, 0.06);
206
+ --input: #141414;
207
+ --primary: #3b82f6;
208
+ --primary-foreground: #fff;
209
+ --ring: #3b82f6;
210
+ --radius: 4px;
211
+
212
+ display: ${this.isHidden ? 'none' : 'flex'};
213
+ flex-direction: column;
214
+ border-right: 1px solid rgba(255, 255, 255, 0.08);
215
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
216
+ font-size: 14px;
217
+ box-sizing: border-box;
218
+ position: absolute;
219
+ left: 0px;
220
+ width: ${this.sidebarWidth}px;
221
+ top: 0px;
222
+ bottom: 0px;
223
+ overflow: hidden;
224
+ background: var(--background);
225
+ color: var(--foreground);
226
+ }
227
+
228
+ .sidebar-header {
229
+ flex-shrink: 0;
230
+ transition: box-shadow 0.2s ease, border-color 0.2s ease;
231
+ border-bottom: 1px solid transparent;
232
+ position: relative;
233
+ z-index: 1;
234
+ }
235
+
236
+ .sidebar-header.scrolled {
237
+ box-shadow: 0 8px 24px -2px rgba(0, 0, 0, 1);
238
+ border-bottom-color: var(--border);
239
+ }
240
+
241
+ .menu {
242
+ flex: 1;
243
+ min-height: 0;
244
+ overflow-y: auto;
245
+ overflow-x: hidden;
246
+ padding: 0.5rem 0;
247
+ }
248
+
249
+ .section-header {
250
+ padding: 0.3rem 0.75rem;
251
+ font-size: 0.65rem;
252
+ font-weight: 500;
253
+ text-transform: uppercase;
254
+ letter-spacing: 0.08em;
255
+ color: #888;
256
+ margin: 0;
257
+ margin-top: 0.5rem;
258
+ background: rgba(59, 130, 246, 0.03);
259
+ border-bottom: 1px solid var(--border);
260
+ border-top: 1px solid var(--border);
261
+ display: flex;
262
+ align-items: center;
263
+ gap: 0.5rem;
264
+ cursor: pointer;
265
+ user-select: none;
266
+ transition: all 0.15s ease;
267
+ }
268
+
269
+ .section-header:first-child {
270
+ margin-top: 0;
271
+ }
272
+
273
+ .section-header:hover {
274
+ background: rgba(59, 130, 246, 0.08);
275
+ }
276
+
277
+ .section-header .expand-icon {
278
+ font-size: 14px;
279
+ opacity: 0.5;
280
+ transition: transform 0.2s ease;
281
+ }
282
+
283
+ .section-header.collapsed .expand-icon {
284
+ transform: rotate(-90deg);
285
+ }
286
+
287
+ .section-header .section-icon {
288
+ font-size: 14px;
289
+ opacity: 0.6;
290
+ }
291
+
292
+ .section-content {
293
+ overflow: hidden;
294
+ }
295
+
296
+ .section-content.collapsed {
297
+ display: none;
298
+ }
299
+
300
+ .material-symbols-outlined {
301
+ font-family: 'Material Symbols Outlined';
302
+ font-weight: normal;
303
+ font-style: normal;
304
+ font-size: 16px;
305
+ display: inline-block;
306
+ line-height: 1;
307
+ text-transform: none;
308
+ letter-spacing: normal;
309
+ word-wrap: normal;
310
+ white-space: nowrap;
311
+ direction: ltr;
312
+ font-variation-settings: 'FILL' 0, 'wght' 300, 'GRAD' 0, 'opsz' 24;
313
+ opacity: 0.5;
314
+ }
315
+
316
+ .selectOption {
317
+ user-select: none;
318
+ position: relative;
319
+ margin: 0.125rem 0.5rem;
320
+ padding: 0.5rem 0.75rem;
321
+ transition: all 0.15s ease;
322
+ display: grid;
323
+ grid-template-columns: 20px 1fr;
324
+ align-items: center;
325
+ gap: 0.5rem;
326
+ border-radius: var(--radius);
327
+ cursor: pointer;
328
+ font-size: 0.75rem;
329
+ color: #999;
330
+ background: transparent;
331
+ }
332
+
333
+ .selectOption.folder {
334
+ grid-template-columns: 16px 1fr;
335
+ }
336
+
337
+ .selectOption.folder .text {
338
+ margin-left: 4px;
339
+ }
340
+
341
+ .selectOption .expand-icon {
342
+ font-size: 14px;
343
+ opacity: 0.5;
344
+ transition: transform 0.2s ease;
345
+ }
346
+
347
+ .selectOption.expanded .expand-icon {
348
+ transform: rotate(90deg);
349
+ }
350
+
351
+ .selectOption:hover {
352
+ background: rgba(59, 130, 246, 0.05);
353
+ color: #bbb;
354
+ }
355
+
356
+ .selectOption:hover .material-symbols-outlined {
357
+ opacity: 0.7;
358
+ }
359
+
360
+ .selectOption.selected {
361
+ background: rgba(59, 130, 246, 0.15);
362
+ color: var(--primary);
363
+ }
364
+
365
+ .selectOption.selected .material-symbols-outlined {
366
+ opacity: 1;
367
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24;
368
+ }
369
+
370
+ .selectOption.selected:hover {
371
+ background: rgba(59, 130, 246, 0.2);
372
+ color: var(--primary);
373
+ }
374
+
375
+ .selectOption .text {
376
+ display: block;
377
+ overflow: hidden;
378
+ text-overflow: ellipsis;
379
+ white-space: nowrap;
380
+ font-weight: 400;
381
+ }
382
+
383
+ .demo-children {
384
+ margin-left: 1rem;
385
+ overflow: hidden;
386
+ }
387
+
388
+ .demo-child {
389
+ user-select: none;
390
+ position: relative;
391
+ margin: 0.125rem 0.5rem;
392
+ padding: 0.35rem 0.75rem;
393
+ transition: all 0.15s ease;
394
+ display: grid;
395
+ grid-template-columns: 16px 1fr;
396
+ align-items: center;
397
+ gap: 0.5rem;
398
+ border-radius: var(--radius);
399
+ cursor: pointer;
400
+ font-size: 0.7rem;
401
+ color: #777;
402
+ background: transparent;
403
+ }
404
+
405
+ .demo-child:hover {
406
+ background: rgba(59, 130, 246, 0.05);
407
+ color: #bbb;
408
+ }
409
+
410
+ .demo-child.selected {
411
+ background: rgba(59, 130, 246, 0.15);
412
+ color: var(--primary);
413
+ }
414
+
415
+ .demo-child .material-symbols-outlined {
416
+ font-size: 14px;
417
+ }
418
+
419
+ ::-webkit-scrollbar {
420
+ width: 8px;
421
+ }
422
+
423
+ ::-webkit-scrollbar-track {
424
+ background: transparent;
425
+ }
426
+
427
+ ::-webkit-scrollbar-thumb {
428
+ background: rgba(255, 255, 255, 0.1);
429
+ border-radius: 4px;
430
+ }
431
+
432
+ ::-webkit-scrollbar-thumb:hover {
433
+ background: rgba(255, 255, 255, 0.2);
434
+ }
435
+
436
+ .search-container {
437
+ padding: 0.5rem;
438
+ border-bottom: 1px solid var(--border);
439
+ position: relative;
440
+ }
441
+
442
+ .search-input {
443
+ width: 100%;
444
+ box-sizing: border-box;
445
+ background: var(--input);
446
+ border: 1px solid var(--border);
447
+ border-radius: var(--radius);
448
+ padding: 0.5rem 1.75rem 0.5rem 0.75rem;
449
+ color: var(--foreground);
450
+ font-size: 0.75rem;
451
+ font-family: inherit;
452
+ outline: none;
453
+ transition: border-color 0.15s ease;
454
+ }
455
+
456
+ .search-input:focus {
457
+ border-color: var(--primary);
458
+ }
459
+
460
+ .search-input::placeholder {
461
+ color: var(--muted-foreground);
462
+ }
463
+
464
+ .search-clear {
465
+ position: absolute;
466
+ right: 0.75rem;
467
+ top: 50%;
468
+ transform: translateY(-50%);
469
+ background: none;
470
+ border: none;
471
+ padding: 0.25rem;
472
+ cursor: pointer;
473
+ color: var(--muted-foreground);
474
+ display: flex;
475
+ align-items: center;
476
+ justify-content: center;
477
+ border-radius: 2px;
478
+ transition: color 0.15s ease, background 0.15s ease;
479
+ }
480
+
481
+ .search-clear:hover {
482
+ color: var(--foreground);
483
+ background: rgba(255, 255, 255, 0.1);
484
+ }
485
+
486
+ .search-clear .material-symbols-outlined {
487
+ font-size: 14px;
488
+ opacity: 1;
489
+ }
490
+
491
+ .highlight {
492
+ background: rgba(59, 130, 246, 0.3);
493
+ border-radius: 2px;
494
+ }
495
+
496
+ /* Pinned item highlight in original section */
497
+ .selectOption.pinned {
498
+ background: rgba(245, 158, 11, 0.08);
499
+ }
500
+
501
+ .selectOption.pinned:hover {
502
+ background: rgba(245, 158, 11, 0.12);
503
+ }
504
+
505
+ .selectOption.pinned.selected {
506
+ background: rgba(245, 158, 11, 0.18);
507
+ }
508
+
509
+ /* Pinned section styling */
510
+ .section-header.pinned-section {
511
+ background: rgba(245, 158, 11, 0.08);
512
+ color: #f59e0b;
513
+ }
514
+
515
+ .section-header.pinned-section:hover {
516
+ background: rgba(245, 158, 11, 0.12);
517
+ }
518
+
519
+ .section-header.pinned-section .section-icon {
520
+ opacity: 0.8;
521
+ }
522
+
523
+ /* Section tag pill for pinned items */
524
+ .section-tag {
525
+ font-size: 0.5rem;
526
+ color: #888;
527
+ margin-left: auto;
528
+ text-transform: uppercase;
529
+ letter-spacing: 0.02em;
530
+ background: rgba(255, 255, 255, 0.06);
531
+ padding: 0.15rem 0.4rem;
532
+ border-radius: 9999px;
533
+ white-space: nowrap;
534
+ }
535
+
536
+ /* Group container */
537
+ .item-group {
538
+ margin: 0.375rem 0.375rem;
539
+ border: 1px solid rgba(255, 255, 255, 0.08);
540
+ border-radius: 6px;
541
+ padding: 0.25rem 0;
542
+ background: rgba(255, 255, 255, 0.01);
543
+ }
544
+
545
+ .item-group-legend {
546
+ font-size: 0.55rem;
547
+ text-transform: uppercase;
548
+ letter-spacing: 0.05em;
549
+ color: #555;
550
+ padding: 0.125rem 0.625rem 0.25rem;
551
+ display: block;
552
+ cursor: context-menu;
553
+ }
554
+
555
+ .item-group .selectOption {
556
+ margin-left: 0.25rem;
557
+ margin-right: 0.25rem;
558
+ }
559
+
560
+ .item-group.group-highlight {
561
+ background: rgba(59, 130, 246, 0.15);
562
+ transition: background 0.3s ease;
563
+ }
564
+
565
+ .item-group.group-filter-match {
566
+ border-color: rgba(245, 158, 11, 0.5);
567
+ }
568
+
569
+ /* Resize handle */
570
+ .resize-handle {
571
+ position: absolute;
572
+ top: 0;
573
+ right: 0;
574
+ bottom: 0;
575
+ width: 4px;
576
+ cursor: col-resize;
577
+ background: transparent;
578
+ transition: background 0.15s ease;
579
+ z-index: 10;
580
+ }
581
+
582
+ .resize-handle:hover {
583
+ background: rgba(59, 130, 246, 0.3);
584
+ }
585
+
586
+ .resize-handle.active {
587
+ background: var(--primary);
588
+ }
589
+
590
+ @container wccDashboard (max-width: 600px) {
591
+ :host {
592
+ right: 0;
593
+ bottom: auto;
594
+ width: 100%;
595
+ height: 120px;
596
+ border-right: 0;
597
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
598
+ }
599
+
600
+ .resize-handle {
601
+ display: none;
602
+ }
603
+ }
604
+
605
+ nav.sidebar-nav {
606
+ flex: 1;
607
+ min-height: 0;
608
+ display: flex;
609
+ flex-direction: column;
610
+ }
611
+
612
+ .tree {
613
+ flex: 1;
614
+ min-height: 0;
615
+ display: flex;
616
+ flex-direction: column;
617
+ }
618
+
619
+ .treeitem {
620
+ outline: none;
621
+ }
622
+
623
+ .treeitem:focus-visible {
624
+ outline: 2px solid var(--ring);
625
+ outline-offset: -2px;
626
+ }
627
+
628
+ .search-input:focus-visible {
629
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.35);
630
+ }
631
+
632
+ .search-input::-webkit-search-cancel-button {
633
+ -webkit-appearance: none;
634
+ display: none;
635
+ }
636
+
637
+ .search-clear:focus-visible {
638
+ outline: 2px solid var(--ring);
639
+ outline-offset: 0;
640
+ color: var(--foreground);
641
+ }
642
+
643
+ .resize-handle:focus-visible {
644
+ outline: none;
645
+ background: var(--primary);
646
+ }
647
+
648
+ /* Elements without a demo: listed for coverage, not navigable */
649
+ .nodemo-header {
650
+ user-select: none;
651
+ margin: 0.375rem 0.5rem 0.125rem;
652
+ padding: 0.4rem 0.75rem;
653
+ display: grid;
654
+ grid-template-columns: 16px 1fr auto;
655
+ align-items: center;
656
+ gap: 0.5rem;
657
+ border-radius: var(--radius);
658
+ cursor: pointer;
659
+ font-size: 0.65rem;
660
+ text-transform: uppercase;
661
+ letter-spacing: 0.05em;
662
+ color: #666;
663
+ border-top: 1px dashed rgba(255, 255, 255, 0.08);
664
+ }
665
+
666
+ .nodemo-header:hover {
667
+ color: #999;
668
+ background: rgba(255, 255, 255, 0.03);
669
+ }
670
+
671
+ .nodemo-header .expand-icon {
672
+ font-size: 14px;
673
+ opacity: 0.5;
674
+ transition: transform 0.2s ease;
675
+ }
676
+
677
+ .nodemo-header[aria-expanded='true'] .expand-icon {
678
+ transform: rotate(90deg);
679
+ }
680
+
681
+ .nodemo-count {
682
+ font-size: 0.6rem;
683
+ letter-spacing: 0;
684
+ color: #777;
685
+ background: rgba(255, 255, 255, 0.06);
686
+ padding: 0.05rem 0.4rem;
687
+ border-radius: 9999px;
688
+ }
689
+
690
+ .selectOption.nodemo {
691
+ cursor: default;
692
+ color: #5c5c5c;
693
+ padding-top: 0.35rem;
694
+ padding-bottom: 0.35rem;
695
+ }
696
+
697
+ .selectOption.nodemo:hover {
698
+ background: transparent;
699
+ color: #5c5c5c;
700
+ }
701
+
702
+ .selectOption.nodemo .material-symbols-outlined {
703
+ opacity: 0.35;
704
+ }
705
+ </style>
706
+ <nav class="sidebar-nav" aria-label="Catalog">
707
+ <div class="sidebar-header ${this.isMenuScrolled ? 'scrolled' : ''}">
708
+ <div class="search-container" role="search">
709
+ <input
710
+ type="search"
711
+ class="search-input"
712
+ placeholder="Search..."
713
+ aria-label="Search catalog"
714
+ aria-controls="wcc-tree"
715
+ .value=${this.searchQuery}
716
+ @input=${this.handleSearchInput}
717
+ @keydown=${this.handleSearchKeydown}
718
+ />
719
+ ${this.searchQuery ? html `
720
+ <button type="button" class="search-clear" aria-label="Clear search" @click=${this.clearSearch}>
721
+ <i class="material-symbols-outlined" aria-hidden="true">close</i>
722
+ </button>
723
+ ` : null}
724
+ </div>
725
+ </div>
726
+ <div
727
+ class="tree"
728
+ id="wcc-tree"
729
+ role="tree"
730
+ aria-label="Catalog entries"
731
+ @keydown=${this.handleTreeKeydown}
732
+ @focusin=${this.handleTreeFocusin}
733
+ >
734
+ ${this.renderPinnedSection()}
735
+ <div class="menu" @scroll=${this.handleMenuScroll}>
736
+ ${this.renderSections()}
737
+ </div>
738
+ </div>
739
+ </nav>
740
+ <div
741
+ class="resize-handle ${this.isResizing ? 'active' : ''}"
742
+ role="separator"
743
+ tabindex="0"
744
+ aria-orientation="vertical"
745
+ aria-label="Resize sidebar"
746
+ aria-controls="wcc-tree"
747
+ aria-valuemin=${SIDEBAR_MIN_WIDTH}
748
+ aria-valuemax=${SIDEBAR_MAX_WIDTH}
749
+ aria-valuenow=${this.sidebarWidth}
750
+ @mousedown=${this.startResize}
751
+ @keydown=${this.handleResizeKeydown}
752
+ ></div>
753
+ `;
754
+ }
755
+ // ============ Tree item keys ============
756
+ getSectionKey(sectionName) {
757
+ return `section:${sectionName}`;
758
+ }
759
+ getItemKey(sectionName, groupName, itemName) {
760
+ return `item:${sectionName}::${groupName ?? ''}::${itemName}`;
761
+ }
762
+ /**
763
+ * Initialize collapsed sections from section config
764
+ */
765
+ initCollapsedSections() {
766
+ if (this.sectionsInitialized || !this.dashboardRef?.sections)
767
+ return;
768
+ const collapsed = new Set();
769
+ for (const section of this.dashboardRef.sections) {
770
+ if (section.collapsed) {
771
+ collapsed.add(section.name);
772
+ }
773
+ }
774
+ this.collapsedSections = collapsed;
775
+ this.sectionsInitialized = true;
776
+ }
777
+ // ============ Pinning helpers ============
778
+ getPinKey(sectionName, itemName) {
779
+ return `${sectionName}::${itemName}`;
780
+ }
781
+ isPinned(sectionName, itemName) {
782
+ return this.pinnedItems.has(this.getPinKey(sectionName, itemName));
783
+ }
784
+ togglePin(sectionName, itemName) {
785
+ const key = this.getPinKey(sectionName, itemName);
786
+ const newPinned = new Set(this.pinnedItems);
787
+ if (newPinned.has(key)) {
788
+ newPinned.delete(key);
789
+ }
790
+ else {
791
+ newPinned.add(key);
792
+ }
793
+ this.pinnedItems = newPinned;
794
+ this.dispatchEvent(new CustomEvent('pinnedChanged', { detail: newPinned }));
795
+ }
796
+ showContextMenu(e, sectionName, itemName) {
797
+ const isPinned = this.isPinned(sectionName, itemName);
798
+ const section = this.dashboardRef?.sections?.find(s => s.name === sectionName);
799
+ const sectionEntries = section ? getSectionItems(section) : [];
800
+ const foundEntry = sectionEntries.find(([name]) => name === itemName);
801
+ const item = foundEntry?.[1];
802
+ const groups = getElementDemoGroups(item);
803
+ const menuItems = [
804
+ {
805
+ name: isPinned ? 'Unpin' : 'Pin',
806
+ iconName: 'push_pin',
807
+ action: () => this.togglePin(sectionName, itemName),
808
+ },
809
+ ];
810
+ if (groups.length > 0) {
811
+ menuItems.push({
812
+ name: 'Show in Group:',
813
+ iconName: 'folder',
814
+ action: () => { },
815
+ disabled: true,
816
+ });
817
+ for (const groupName of groups) {
818
+ menuItems.push({
819
+ name: groupName,
820
+ iconName: 'label',
821
+ action: () => this.scrollToGroup(sectionName, groupName),
822
+ });
823
+ }
824
+ }
825
+ const owner = e.currentTarget?.closest('[role="treeitem"]') ?? undefined;
826
+ WccContextmenu.show(e, menuItems, { ownerElement: owner });
827
+ }
828
+ showGroupContextMenu(e, groupName) {
829
+ WccContextmenu.show(e, [
830
+ {
831
+ name: `Show "${groupName}"`,
832
+ iconName: 'filter_alt',
833
+ action: () => {
834
+ this.searchQuery = groupName;
835
+ this.dispatchEvent(new CustomEvent('searchChanged', { detail: this.searchQuery }));
836
+ },
837
+ },
838
+ ]);
839
+ }
840
+ /**
841
+ * Render the PINNED section (only if there are pinned items)
842
+ */
843
+ renderPinnedSection() {
844
+ if (!this.dashboardRef?.sections || this.pinnedItems.size === 0) {
845
+ return null;
846
+ }
847
+ const isCollapsed = this.collapsedSections.has(PINNED_SECTION);
848
+ // Collect pinned items with their original section info
849
+ // Pinned items are NOT filtered by search - they always remain visible
850
+ const pinnedEntries = [];
851
+ for (const key of this.pinnedItems) {
852
+ const [sectionName, itemName] = key.split('::');
853
+ const section = this.dashboardRef.sections.find(s => s.name === sectionName);
854
+ if (section) {
855
+ const found = getSectionItems(section).find(([name]) => name === itemName);
856
+ if (found) {
857
+ pinnedEntries.push({ sectionName, itemName, item: found[1], section });
858
+ }
859
+ }
860
+ }
861
+ if (pinnedEntries.length === 0) {
862
+ return null;
863
+ }
864
+ return html `
865
+ <div
866
+ class="treeitem section-header pinned-section ${isCollapsed ? 'collapsed' : ''}"
867
+ role="treeitem"
868
+ tabindex="-1"
869
+ aria-level="1"
870
+ aria-expanded=${isCollapsed ? 'false' : 'true'}
871
+ data-key=${this.getSectionKey(PINNED_SECTION)}
872
+ @click=${() => this.toggleSectionCollapsed(PINNED_SECTION)}
873
+ >
874
+ <i class="material-symbols-outlined expand-icon" aria-hidden="true">expand_more</i>
875
+ <i class="material-symbols-outlined section-icon" aria-hidden="true">push_pin</i>
876
+ <span>Pinned</span>
877
+ </div>
878
+ <div class="section-content ${isCollapsed ? 'collapsed' : ''}" role="group" aria-label="Pinned">
879
+ ${pinnedEntries.map(({ sectionName, itemName, item, section }) => {
880
+ const isSelected = this.selectedItem === item;
881
+ const type = section.type === 'elements' ? 'element' : 'page';
882
+ const icon = section.type === 'elements'
883
+ ? (getElementDemoGroups(item).length > 1 ? 'library_books' : 'featured_video')
884
+ : 'insert_drive_file';
885
+ return html `
886
+ <div
887
+ class="treeitem selectOption ${isSelected ? 'selected' : ''}"
888
+ role="treeitem"
889
+ tabindex="-1"
890
+ aria-level="2"
891
+ aria-selected=${isSelected ? 'true' : 'false'}
892
+ aria-current=${isSelected ? 'page' : 'false'}
893
+ data-key=${`pinned:${sectionName}::${itemName}`}
894
+ title=${itemName}
895
+ @click=${async () => {
896
+ await plugins.deesDomtools.DomTools.setupDomTools();
897
+ this.selectItem(type, itemName, item, 0, section);
898
+ }}
899
+ @contextmenu=${(e) => this.showContextMenu(e, sectionName, itemName)}
900
+ >
901
+ <i class="material-symbols-outlined" aria-hidden="true">${icon}</i>
902
+ <div class="text">${this.highlightMatch(itemName)}</div>
903
+ <span class="section-tag">${sectionName}</span>
904
+ </div>
905
+ `;
906
+ })}
907
+ </div>
908
+ `;
909
+ }
910
+ /**
911
+ * Render all sections
912
+ */
913
+ renderSections() {
914
+ if (!this.dashboardRef?.sections) {
915
+ return null;
916
+ }
917
+ this.initCollapsedSections();
918
+ return this.dashboardRef.sections.map((section) => {
919
+ const listedEntries = getSectionItems(section).filter(([name, item]) => this.entryMatchesSearch(name, item));
920
+ const withoutDemoEntries = getSectionItemsWithoutDemo(section).filter(([name, item]) => this.entryMatchesSearch(name, item));
921
+ // Hide section if no items match the search
922
+ if (listedEntries.length === 0 && withoutDemoEntries.length === 0 && this.searchQuery) {
923
+ return null;
924
+ }
925
+ const isCollapsed = this.collapsedSections.has(section.name);
926
+ return html `
927
+ <div
928
+ class="treeitem section-header ${isCollapsed ? 'collapsed' : ''}"
929
+ role="treeitem"
930
+ tabindex="-1"
931
+ aria-level="1"
932
+ aria-expanded=${isCollapsed ? 'false' : 'true'}
933
+ data-key=${this.getSectionKey(section.name)}
934
+ @click=${() => this.toggleSectionCollapsed(section.name)}
935
+ >
936
+ <i class="material-symbols-outlined expand-icon" aria-hidden="true">expand_more</i>
937
+ ${section.icon ? html `<i class="material-symbols-outlined section-icon" aria-hidden="true">${section.icon}</i>` : null}
938
+ <span>${section.name}</span>
939
+ </div>
940
+ <div class="section-content ${isCollapsed ? 'collapsed' : ''}" role="group" aria-label=${section.name}>
941
+ ${this.renderSectionItems(section, listedEntries)}
942
+ ${this.renderWithoutDemoGroup(section, withoutDemoEntries)}
943
+ </div>
944
+ `;
945
+ });
946
+ }
947
+ /**
948
+ * Render the listed (navigable) items of a section
949
+ */
950
+ renderSectionItems(section, filteredEntries) {
951
+ if (section.type === 'pages') {
952
+ return filteredEntries.map(([pageName, item]) => {
953
+ const isPinned = this.isPinned(section.name, pageName);
954
+ const isSelected = this.selectedItem === item;
955
+ return html `
956
+ <div
957
+ class="treeitem selectOption ${isSelected ? 'selected' : ''} ${isPinned ? 'pinned' : ''}"
958
+ role="treeitem"
959
+ tabindex="-1"
960
+ aria-level="2"
961
+ aria-selected=${isSelected ? 'true' : 'false'}
962
+ aria-current=${isSelected ? 'page' : 'false'}
963
+ data-key=${this.getItemKey(section.name, null, pageName)}
964
+ title=${pageName}
965
+ @click=${async () => {
966
+ await plugins.deesDomtools.DomTools.setupDomTools();
967
+ this.selectItem('page', pageName, item, 0, section);
968
+ }}
969
+ @contextmenu=${(e) => this.showContextMenu(e, section.name, pageName)}
970
+ >
971
+ <i class="material-symbols-outlined" aria-hidden="true">insert_drive_file</i>
972
+ <div class="text">${this.highlightMatch(pageName)}</div>
973
+ </div>
974
+ `;
975
+ });
976
+ }
977
+ // type === 'elements' - group by demoGroups (supports string | string[])
978
+ const groupedItems = new Map();
979
+ for (const entry of filteredEntries) {
980
+ const groups = getElementDemoGroups(entry[1]);
981
+ for (const group of groups.length > 0 ? groups : [null]) {
982
+ if (!groupedItems.has(group)) {
983
+ groupedItems.set(group, []);
984
+ }
985
+ groupedItems.get(group).push(entry);
986
+ }
987
+ }
988
+ const renderItems = [];
989
+ for (const entry of groupedItems.get(null) || []) {
990
+ renderItems.push({ type: 'element', entry, sortKey: entry[0].toLowerCase() });
991
+ }
992
+ for (const [groupName, items] of groupedItems) {
993
+ if (groupName === null)
994
+ continue;
995
+ renderItems.push({ type: 'group', groupName, items, sortKey: groupName.toLowerCase() });
996
+ }
997
+ // Sort all items alphabetically by sortKey
998
+ renderItems.sort((a, b) => a.sortKey.localeCompare(b.sortKey));
999
+ return renderItems.map((item) => {
1000
+ if (item.type === 'element') {
1001
+ return this.renderElementItem(item.entry, section, null);
1002
+ }
1003
+ return html `
1004
+ <div
1005
+ class="item-group ${this.isGroupFilterMatch(item.groupName) ? 'group-filter-match' : ''}"
1006
+ role="group"
1007
+ aria-label=${item.groupName}
1008
+ data-group="${item.groupName}"
1009
+ >
1010
+ <span
1011
+ class="item-group-legend"
1012
+ aria-hidden="true"
1013
+ @contextmenu=${(e) => this.showGroupContextMenu(e, item.groupName)}
1014
+ >${item.groupName}</span>
1015
+ ${item.items.map((entry) => this.renderElementItem(entry, section, item.groupName))}
1016
+ </div>
1017
+ `;
1018
+ });
1019
+ }
1020
+ /**
1021
+ * Render the "Without demo" group: registered elements that have no demo.
1022
+ * Listed for coverage; the entries are not navigable.
1023
+ */
1024
+ renderWithoutDemoGroup(section, entries) {
1025
+ if (section.type !== 'elements' || entries.length === 0) {
1026
+ return null;
1027
+ }
1028
+ // A search opens the group so its matches are visible
1029
+ const isOpen = !!this.searchQuery || this.expandedWithoutDemo.has(section.name);
1030
+ return html `
1031
+ <div
1032
+ class="treeitem nodemo-header"
1033
+ role="treeitem"
1034
+ tabindex="-1"
1035
+ aria-level="2"
1036
+ aria-expanded=${isOpen ? 'true' : 'false'}
1037
+ data-key=${`nodemo-group:${section.name}`}
1038
+ @click=${() => this.toggleWithoutDemo(section.name)}
1039
+ >
1040
+ <i class="material-symbols-outlined expand-icon" aria-hidden="true">chevron_right</i>
1041
+ <span>Without demo</span>
1042
+ <span class="nodemo-count" aria-label=${`${entries.length} elements`}>${entries.length}</span>
1043
+ </div>
1044
+ ${isOpen ? html `
1045
+ <div class="nodemo-list" role="group" aria-label="Without demo">
1046
+ ${entries.map(([elementName, item]) => {
1047
+ const tagName = getElementTagName(item);
1048
+ return html `
1049
+ <div
1050
+ class="treeitem selectOption nodemo"
1051
+ role="treeitem"
1052
+ tabindex="-1"
1053
+ aria-level="3"
1054
+ aria-disabled="true"
1055
+ aria-description="No demo"
1056
+ data-key=${`nodemo:${section.name}::${elementName}`}
1057
+ title=${tagName ? `<${tagName}> has no demo` : `${elementName} has no demo`}
1058
+ >
1059
+ <i class="material-symbols-outlined" aria-hidden="true">block</i>
1060
+ <div class="text">${this.highlightMatch(elementName)}</div>
1061
+ </div>
1062
+ `;
1063
+ })}
1064
+ </div>
1065
+ ` : null}
1066
+ `;
1067
+ }
1068
+ /**
1069
+ * Render a single element item (used by renderSectionItems)
1070
+ */
1071
+ renderElementItem(entry, section, groupName) {
1072
+ const [elementName, item] = entry;
1073
+ const demoCount = getDemoCount(item.demo);
1074
+ const isMultiDemo = hasMultipleDemos(item.demo);
1075
+ const isExpanded = this.expandedElements.has(elementName);
1076
+ const isSelected = this.selectedItem === item;
1077
+ const isPinned = this.isPinned(section.name, elementName);
1078
+ const itemKey = this.getItemKey(section.name, groupName, elementName);
1079
+ if (isMultiDemo) {
1080
+ // Multi-demo element - render as expandable folder
1081
+ return html `
1082
+ <div
1083
+ class="treeitem selectOption folder ${isExpanded ? 'expanded' : ''} ${isSelected ? 'selected' : ''} ${isPinned ? 'pinned' : ''}"
1084
+ role="treeitem"
1085
+ tabindex="-1"
1086
+ aria-level="2"
1087
+ aria-expanded=${isExpanded ? 'true' : 'false'}
1088
+ data-key=${itemKey}
1089
+ title=${elementName}
1090
+ @click=${() => this.toggleExpanded(elementName)}
1091
+ @contextmenu=${(e) => this.showContextMenu(e, section.name, elementName)}
1092
+ >
1093
+ <i class="material-symbols-outlined expand-icon" aria-hidden="true">chevron_right</i>
1094
+ <div class="text">${this.highlightMatch(elementName)}</div>
1095
+ </div>
1096
+ ${isExpanded ? html `
1097
+ <div class="demo-children" role="group" aria-label=${`${elementName} demos`}>
1098
+ ${Array.from({ length: demoCount }, (_, demoIndex) => {
1099
+ const isThisDemoSelected = isSelected && this.dashboardRef.selectedDemoIndex === demoIndex;
1100
+ return html `
1101
+ <div
1102
+ class="treeitem demo-child ${isThisDemoSelected ? 'selected' : ''}"
1103
+ role="treeitem"
1104
+ tabindex="-1"
1105
+ aria-level="3"
1106
+ aria-selected=${isThisDemoSelected ? 'true' : 'false'}
1107
+ aria-current=${isThisDemoSelected ? 'page' : 'false'}
1108
+ data-key=${`${itemKey}::demo${demoIndex}`}
1109
+ @click=${async () => {
1110
+ await plugins.deesDomtools.DomTools.setupDomTools();
1111
+ this.selectItem('element', elementName, item, demoIndex, section);
1112
+ }}
1113
+ >
1114
+ <i class="material-symbols-outlined" aria-hidden="true">play_circle</i>
1115
+ <div class="text">demo${demoIndex + 1}</div>
1116
+ </div>
1117
+ `;
1118
+ })}
1119
+ </div>
1120
+ ` : null}
1121
+ `;
1122
+ }
1123
+ // Single demo element
1124
+ const icon = getElementDemoGroups(item).length > 1 ? 'library_books' : 'featured_video';
1125
+ return html `
1126
+ <div
1127
+ class="treeitem selectOption ${isSelected ? 'selected' : ''} ${isPinned ? 'pinned' : ''}"
1128
+ role="treeitem"
1129
+ tabindex="-1"
1130
+ aria-level="2"
1131
+ aria-selected=${isSelected ? 'true' : 'false'}
1132
+ aria-current=${isSelected ? 'page' : 'false'}
1133
+ data-key=${itemKey}
1134
+ title=${elementName}
1135
+ @click=${async () => {
1136
+ await plugins.deesDomtools.DomTools.setupDomTools();
1137
+ this.selectItem('element', elementName, item, 0, section);
1138
+ }}
1139
+ @contextmenu=${(e) => this.showContextMenu(e, section.name, elementName)}
1140
+ >
1141
+ <i class="material-symbols-outlined" aria-hidden="true">${icon}</i>
1142
+ <div class="text">${this.highlightMatch(elementName)}</div>
1143
+ </div>
1144
+ `;
1145
+ }
1146
+ toggleSectionCollapsed(sectionName) {
1147
+ const newSet = new Set(this.collapsedSections);
1148
+ if (newSet.has(sectionName)) {
1149
+ newSet.delete(sectionName);
1150
+ }
1151
+ else {
1152
+ newSet.add(sectionName);
1153
+ }
1154
+ this.collapsedSections = newSet;
1155
+ }
1156
+ toggleExpanded(elementName) {
1157
+ const newSet = new Set(this.expandedElements);
1158
+ if (newSet.has(elementName)) {
1159
+ newSet.delete(elementName);
1160
+ }
1161
+ else {
1162
+ newSet.add(elementName);
1163
+ }
1164
+ this.expandedElements = newSet;
1165
+ }
1166
+ toggleWithoutDemo(sectionName) {
1167
+ if (this.searchQuery) {
1168
+ // Search keeps the group open while it has matches
1169
+ return;
1170
+ }
1171
+ const newSet = new Set(this.expandedWithoutDemo);
1172
+ if (newSet.has(sectionName)) {
1173
+ newSet.delete(sectionName);
1174
+ }
1175
+ else {
1176
+ newSet.add(sectionName);
1177
+ }
1178
+ this.expandedWithoutDemo = newSet;
1179
+ }
1180
+ handleSearchInput(e) {
1181
+ const input = e.target;
1182
+ this.searchQuery = input.value;
1183
+ this.dispatchEvent(new CustomEvent('searchChanged', { detail: this.searchQuery }));
1184
+ }
1185
+ handleSearchKeydown(e) {
1186
+ if (e.key === 'ArrowDown') {
1187
+ const target = this.getRovingTreeItem();
1188
+ if (target) {
1189
+ e.preventDefault();
1190
+ this.focusTreeItem(target);
1191
+ }
1192
+ }
1193
+ else if (e.key === 'Escape' && this.searchQuery) {
1194
+ e.preventDefault();
1195
+ this.clearSearch();
1196
+ }
1197
+ }
1198
+ clearSearch() {
1199
+ this.searchQuery = '';
1200
+ this.dispatchEvent(new CustomEvent('searchChanged', { detail: this.searchQuery }));
1201
+ const input = this.shadowRoot.querySelector('.search-input');
1202
+ if (input)
1203
+ input.focus();
1204
+ }
1205
+ handleMenuScroll(e) {
1206
+ const target = e.target;
1207
+ this.isMenuScrolled = target.scrollTop > 0;
1208
+ }
1209
+ matchesSearch(name) {
1210
+ if (!this.searchQuery)
1211
+ return true;
1212
+ return name.toLowerCase().includes(this.searchQuery.toLowerCase());
1213
+ }
1214
+ /** An entry matches by name, registered tag name, or one of its demo groups. */
1215
+ entryMatchesSearch(name, item) {
1216
+ if (this.matchesSearch(name))
1217
+ return true;
1218
+ const tagName = getElementTagName(item);
1219
+ if (tagName && this.matchesSearch(tagName))
1220
+ return true;
1221
+ return getElementDemoGroups(item).some((groupName) => this.matchesSearch(groupName));
1222
+ }
1223
+ isGroupFilterMatch(groupName) {
1224
+ return !!this.searchQuery && groupName.toLowerCase() === this.searchQuery.toLowerCase();
1225
+ }
1226
+ scrollToGroup(sectionName, groupName) {
1227
+ // Ensure the section is not collapsed
1228
+ this.collapsedSections.delete(sectionName);
1229
+ // Clear any active search so all groups are visible
1230
+ this.searchQuery = '';
1231
+ this.requestUpdate();
1232
+ // After render, scroll to the group element
1233
+ this.updateComplete.then(() => {
1234
+ const groupEl = this.shadowRoot?.querySelector(`.item-group[data-group="${groupName}"]`);
1235
+ if (groupEl && this.isConnected) {
1236
+ groupEl.scrollIntoView({ behavior: 'smooth', block: 'center' });
1237
+ // Brief highlight flash
1238
+ this.endGroupHighlight();
1239
+ groupEl.classList.add('group-highlight');
1240
+ this.highlightedGroup = groupEl;
1241
+ this.groupHighlightTimeout = setTimeout(() => this.endGroupHighlight(), 1500);
1242
+ }
1243
+ });
1244
+ }
1245
+ endGroupHighlight() {
1246
+ clearTimeout(this.groupHighlightTimeout);
1247
+ this.highlightedGroup?.classList.remove('group-highlight');
1248
+ this.highlightedGroup = null;
1249
+ }
1250
+ highlightMatch(text) {
1251
+ if (!this.searchQuery)
1252
+ return html `${text}`;
1253
+ const lowerText = text.toLowerCase();
1254
+ const lowerQuery = this.searchQuery.toLowerCase();
1255
+ const index = lowerText.indexOf(lowerQuery);
1256
+ if (index === -1)
1257
+ return html `${text}`;
1258
+ const before = text.slice(0, index);
1259
+ const match = text.slice(index, index + this.searchQuery.length);
1260
+ const after = text.slice(index + this.searchQuery.length);
1261
+ return html `${before}<span class="highlight">${match}</span>${after}`;
1262
+ }
1263
+ // ============ Keyboard navigation (ARIA tree, roving tabindex) ============
1264
+ getTreeItems() {
1265
+ return Array.from(this.shadowRoot?.querySelectorAll('[role="treeitem"]') ?? []);
1266
+ }
1267
+ getVisibleTreeItems() {
1268
+ return this.getTreeItems().filter((itemArg) => itemArg.getClientRects().length > 0);
1269
+ }
1270
+ /** The tree item that should hold the tab stop: last focused, else selected, else first. */
1271
+ getRovingTreeItem() {
1272
+ const visible = this.getVisibleTreeItems();
1273
+ return visible.find((itemArg) => itemArg.dataset.key === this.focusedKey)
1274
+ ?? visible.find((itemArg) => itemArg.getAttribute('aria-selected') === 'true')
1275
+ ?? visible[0]
1276
+ ?? null;
1277
+ }
1278
+ syncRovingTabindex() {
1279
+ const active = this.getRovingTreeItem();
1280
+ for (const item of this.getTreeItems()) {
1281
+ item.tabIndex = item === active ? 0 : -1;
1282
+ }
1283
+ }
1284
+ focusTreeItem(itemArg) {
1285
+ this.focusedKey = itemArg.dataset.key ?? null;
1286
+ for (const item of this.getTreeItems()) {
1287
+ item.tabIndex = item === itemArg ? 0 : -1;
1288
+ }
1289
+ itemArg.focus();
1290
+ itemArg.scrollIntoView({ block: 'nearest' });
1291
+ }
1292
+ handleTreeFocusin(e) {
1293
+ const item = e.target.closest('[role="treeitem"]');
1294
+ if (item) {
1295
+ this.focusedKey = item.dataset.key ?? null;
1296
+ for (const other of this.getTreeItems()) {
1297
+ other.tabIndex = other === item ? 0 : -1;
1298
+ }
1299
+ }
1300
+ }
1301
+ handleTreeKeydown(e) {
1302
+ const current = e.target.closest('[role="treeitem"]');
1303
+ if (!current)
1304
+ return;
1305
+ const items = this.getVisibleTreeItems();
1306
+ const index = items.indexOf(current);
1307
+ const level = Number(current.getAttribute('aria-level'));
1308
+ const expanded = current.getAttribute('aria-expanded');
1309
+ // The menu key and Shift+F10 open the entry's context menu, anchored to the entry
1310
+ if (e.key === 'ContextMenu' || (e.key === 'F10' && e.shiftKey)) {
1311
+ e.preventDefault();
1312
+ const rect = current.getBoundingClientRect();
1313
+ current.dispatchEvent(new MouseEvent('contextmenu', {
1314
+ bubbles: true,
1315
+ composed: true,
1316
+ cancelable: true,
1317
+ clientX: rect.left,
1318
+ clientY: rect.bottom,
1319
+ }));
1320
+ return;
1321
+ }
1322
+ switch (e.key) {
1323
+ case 'ArrowDown':
1324
+ if (items[index + 1])
1325
+ this.focusTreeItem(items[index + 1]);
1326
+ break;
1327
+ case 'ArrowUp':
1328
+ if (index > 0)
1329
+ this.focusTreeItem(items[index - 1]);
1330
+ break;
1331
+ case 'Home':
1332
+ if (items[0])
1333
+ this.focusTreeItem(items[0]);
1334
+ break;
1335
+ case 'End':
1336
+ if (items.length > 0)
1337
+ this.focusTreeItem(items[items.length - 1]);
1338
+ break;
1339
+ case 'ArrowRight':
1340
+ if (expanded === 'false') {
1341
+ current.click();
1342
+ }
1343
+ else if (expanded === 'true') {
1344
+ const next = items[index + 1];
1345
+ if (next && Number(next.getAttribute('aria-level')) > level)
1346
+ this.focusTreeItem(next);
1347
+ }
1348
+ break;
1349
+ case 'ArrowLeft':
1350
+ if (expanded === 'true') {
1351
+ current.click();
1352
+ }
1353
+ else {
1354
+ const parent = items.slice(0, index).reverse()
1355
+ .find((itemArg) => Number(itemArg.getAttribute('aria-level')) < level);
1356
+ if (parent)
1357
+ this.focusTreeItem(parent);
1358
+ }
1359
+ break;
1360
+ case 'Enter':
1361
+ case ' ':
1362
+ if (current.getAttribute('aria-disabled') !== 'true') {
1363
+ current.click();
1364
+ }
1365
+ break;
1366
+ default:
1367
+ return;
1368
+ }
1369
+ e.preventDefault();
1370
+ }
1371
+ updated(changedProperties) {
1372
+ super.updated(changedProperties);
1373
+ // Handle delayed hide for native mode transition
1374
+ if (changedProperties.has('isNative')) {
1375
+ // A hide still pending from an earlier switch to native mode no longer applies
1376
+ clearTimeout(this.hideTimeout);
1377
+ if (this.isNative && this.isConnected) {
1378
+ // Delay hiding until frame animation completes
1379
+ this.hideTimeout = setTimeout(() => {
1380
+ this.isHidden = true;
1381
+ }, 300);
1382
+ }
1383
+ else {
1384
+ // Show immediately when exiting native mode; a removed sidebar has nothing to wait for
1385
+ this.isHidden = this.isNative;
1386
+ }
1387
+ }
1388
+ // Auto-expand folder when a multi-demo element is selected
1389
+ if (changedProperties.has('selectedItem') && this.selectedItem && this.dashboardRef?.sections) {
1390
+ for (const section of this.dashboardRef.sections) {
1391
+ if (section.type !== 'elements')
1392
+ continue;
1393
+ const found = getSectionItems(section).find(([_, item]) => item === this.selectedItem);
1394
+ if (found) {
1395
+ const [elementName, item] = found;
1396
+ if (hasMultipleDemos(item.demo) && !this.expandedElements.has(elementName)) {
1397
+ const newSet = new Set(this.expandedElements);
1398
+ newSet.add(elementName);
1399
+ this.expandedElements = newSet;
1400
+ }
1401
+ break;
1402
+ }
1403
+ }
1404
+ }
1405
+ this.syncRovingTabindex();
1406
+ }
1407
+ // ============ Resize functionality ============
1408
+ /** Apply a sidebar width to the sidebar, frame and properties panel. */
1409
+ applyWidth(widthArg) {
1410
+ const newWidth = Math.min(SIDEBAR_MAX_WIDTH, Math.max(SIDEBAR_MIN_WIDTH, Math.round(widthArg)));
1411
+ this.sidebarWidth = newWidth;
1412
+ const frame = this.dashboardRef?.shadowRoot?.querySelector('wcc-frame');
1413
+ const properties = this.dashboardRef?.shadowRoot?.querySelector('wcc-properties');
1414
+ if (frame) {
1415
+ frame.sidebarWidth = newWidth;
1416
+ }
1417
+ if (properties) {
1418
+ properties.sidebarWidth = newWidth;
1419
+ }
1420
+ return newWidth;
1421
+ }
1422
+ handleResizeKeydown(e) {
1423
+ const step = e.shiftKey ? 50 : 10;
1424
+ let target;
1425
+ switch (e.key) {
1426
+ case 'ArrowLeft':
1427
+ target = this.sidebarWidth - step;
1428
+ break;
1429
+ case 'ArrowRight':
1430
+ target = this.sidebarWidth + step;
1431
+ break;
1432
+ case 'Home':
1433
+ target = SIDEBAR_MIN_WIDTH;
1434
+ break;
1435
+ case 'End':
1436
+ target = SIDEBAR_MAX_WIDTH;
1437
+ break;
1438
+ default:
1439
+ return;
1440
+ }
1441
+ e.preventDefault();
1442
+ const newWidth = this.applyWidth(target);
1443
+ this.dispatchEvent(new CustomEvent('widthChanged', { detail: newWidth }));
1444
+ }
1445
+ startResize = (e) => {
1446
+ e.preventDefault();
1447
+ this.isResizing = true;
1448
+ const startX = e.clientX;
1449
+ const startWidth = this.sidebarWidth;
1450
+ const frame = this.dashboardRef?.shadowRoot?.querySelector('wcc-frame');
1451
+ // Disable frame transition during resize
1452
+ if (frame) {
1453
+ frame.isResizing = true;
1454
+ }
1455
+ const onMouseMove = (e) => {
1456
+ this.applyWidth(startWidth + (e.clientX - startX));
1457
+ };
1458
+ const onMouseUp = () => {
1459
+ this.isResizing = false;
1460
+ document.removeEventListener('mousemove', onMouseMove);
1461
+ document.removeEventListener('mouseup', onMouseUp);
1462
+ // Re-enable frame transition
1463
+ if (frame) {
1464
+ frame.isResizing = false;
1465
+ }
1466
+ // Dispatch event on release for URL persistence
1467
+ this.dispatchEvent(new CustomEvent('widthChanged', { detail: this.sidebarWidth }));
1468
+ };
1469
+ document.addEventListener('mousemove', onMouseMove);
1470
+ document.addEventListener('mouseup', onMouseUp);
1471
+ };
1472
+ selectItem(typeArg, itemNameArg, itemArg, demoIndex = 0, section) {
1473
+ this.selectedItem = itemArg;
1474
+ this.selectedType = typeArg;
1475
+ this.dashboardRef.selectedDemoIndex = demoIndex;
1476
+ // Set the selected section on dashboard
1477
+ if (section) {
1478
+ this.dashboardRef.selectedSection = section;
1479
+ }
1480
+ this.dispatchEvent(new CustomEvent('selectedType', {
1481
+ detail: typeArg
1482
+ }));
1483
+ this.dispatchEvent(new CustomEvent('selectedItemName', {
1484
+ detail: itemNameArg
1485
+ }));
1486
+ this.dispatchEvent(new CustomEvent('selectedItem', {
1487
+ detail: itemArg
1488
+ }));
1489
+ this.dashboardRef.buildUrl();
1490
+ // Force re-render to update demo child selection indicator
1491
+ this.requestUpdate();
1492
+ }
1493
+ };
1494
+ return WccSidebar = _classThis;
1495
+ })();
1496
+ export { WccSidebar };
1497
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjLXNpZGViYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvd2NjLXNpZGViYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBdUIsS0FBSyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckgsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUvRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFaEgsT0FBTyxFQUFFLGNBQWMsRUFBeUIsTUFBTSxzQkFBc0IsQ0FBQztBQUc3RSxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUM5QixNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUM5QixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUM7SUFHdkIsVUFBVTs0QkFEdEIsYUFBYSxDQUFDLGFBQWEsQ0FBQzs7OztzQkFDRyxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQUFuQixTQUFRLFdBQVc7Ozs7d0NBQ3hDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQzt3Q0FHOUIsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO3dDQUc5QixRQUFRLEVBQUU7b0NBR1YsUUFBUSxFQUFFOzRDQUlWLEtBQUssRUFBRTs2Q0FJUCxLQUFLLEVBQUU7K0NBSVAsS0FBSyxFQUFFO3VDQUlQLFFBQVEsRUFBRTt1Q0FJVixRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUs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