@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.
- package/.smartconfig.json +65 -0
- package/changelog.md +414 -0
- package/dist_bundle/bundle.js +92419 -0
- package/dist_bundle/bundle.js.map +1 -0
- package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_web/00_commitinfo_data.js +9 -0
- package/dist_ts_web/elements/wcc-contextmenu.d.ts +41 -0
- package/dist_ts_web/elements/wcc-contextmenu.js +329 -0
- package/dist_ts_web/elements/wcc-dashboard.d.ts +119 -0
- package/dist_ts_web/elements/wcc-dashboard.js +700 -0
- package/dist_ts_web/elements/wcc-frame.d.ts +22 -0
- package/dist_ts_web/elements/wcc-frame.js +256 -0
- package/dist_ts_web/elements/wcc-properties.d.ts +43 -0
- package/dist_ts_web/elements/wcc-properties.js +1147 -0
- package/dist_ts_web/elements/wcc-record-button.d.ts +12 -0
- package/dist_ts_web/elements/wcc-record-button.js +165 -0
- package/dist_ts_web/elements/wcc-recording-panel.d.ts +44 -0
- package/dist_ts_web/elements/wcc-recording-panel.js +1103 -0
- package/dist_ts_web/elements/wcc-sidebar.d.ts +91 -0
- package/dist_ts_web/elements/wcc-sidebar.js +1497 -0
- package/dist_ts_web/elements/wcctools.helpers.d.ts +46 -0
- package/dist_ts_web/elements/wcctools.helpers.js +106 -0
- package/dist_ts_web/index.d.ts +18 -0
- package/dist_ts_web/index.js +30 -0
- package/dist_ts_web/pages/index.d.ts +1 -0
- package/dist_ts_web/pages/index.js +2 -0
- package/dist_ts_web/services/recorder.service.d.ts +55 -0
- package/dist_ts_web/services/recorder.service.js +353 -0
- package/dist_ts_web/wcctools.interfaces.d.ts +29 -0
- package/dist_ts_web/wcctools.interfaces.js +2 -0
- package/dist_ts_web/wcctools.plugins.d.ts +2 -0
- package/dist_ts_web/wcctools.plugins.js +3 -0
- package/license.md +19 -0
- package/package.json +64 -0
- package/readme.md +568 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/elements/wcc-contextmenu.ts +291 -0
- package/ts_web/elements/wcc-dashboard.ts +672 -0
- package/ts_web/elements/wcc-frame.ts +189 -0
- package/ts_web/elements/wcc-properties.ts +1089 -0
- package/ts_web/elements/wcc-record-button.ts +108 -0
- package/ts_web/elements/wcc-recording-panel.ts +1010 -0
- package/ts_web/elements/wcc-sidebar.ts +1470 -0
- package/ts_web/elements/wcctools.helpers.ts +153 -0
- package/ts_web/index.ts +38 -0
- package/ts_web/pages/index.ts +1 -0
- package/ts_web/readme.md +177 -0
- package/ts_web/services/recorder.service.ts +451 -0
- package/ts_web/tspublish.json +3 -0
- package/ts_web/types/dom-mediacapture-stub/index.d.ts +12 -0
- package/ts_web/types/dom-mediacapture-stub/package.json +6 -0
- package/ts_web/types/dom-webcodecs-stub/index.d.ts +2 -0
- package/ts_web/types/dom-webcodecs-stub/package.json +6 -0
- package/ts_web/wcctools.interfaces.ts +31 -0
- package/ts_web/wcctools.plugins.ts +5 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autocreated commitinfo by @push.rocks/commitinfo
|
|
3
|
+
*/
|
|
4
|
+
export const commitinfo = {
|
|
5
|
+
name: '@design.estate/wcctools',
|
|
6
|
+
version: '5.1.0',
|
|
7
|
+
description: 'A set of web component tools for creating element catalogues, enabling the structured development and documentation of custom elements and pages.'
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUseUJBQXlCO0lBQy9CLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxtSkFBbUo7Q0FDakssQ0FBQSJ9
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
export interface IContextMenuItem {
|
|
3
|
+
name: string;
|
|
4
|
+
iconName?: string;
|
|
5
|
+
action: () => void | Promise<void>;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface IContextMenuOptions {
|
|
9
|
+
/** The element the menu belongs to: focus returns to it when the menu closes */
|
|
10
|
+
ownerElement?: HTMLElement;
|
|
11
|
+
}
|
|
12
|
+
export declare class WccContextmenu extends DeesElement {
|
|
13
|
+
/**
|
|
14
|
+
* Show a context menu at the event's position. The menu takes focus (its first item),
|
|
15
|
+
* is operated with the arrow keys, Home/End, Enter/Space and Escape/Tab, and returns
|
|
16
|
+
* focus to `ownerElement` when it closes from the keyboard or after an action.
|
|
17
|
+
*/
|
|
18
|
+
static show(event: MouseEvent, menuItems: IContextMenuItem[], options?: IContextMenuOptions): Promise<void>;
|
|
19
|
+
/** Focus returns here when the menu closes from the keyboard or after an action */
|
|
20
|
+
private ownerElement;
|
|
21
|
+
private closing;
|
|
22
|
+
accessor menuItems: IContextMenuItem[];
|
|
23
|
+
accessor x: number;
|
|
24
|
+
accessor y: number;
|
|
25
|
+
accessor visible: boolean;
|
|
26
|
+
private boundHandleOutsideClick;
|
|
27
|
+
private boundHandleKeydown;
|
|
28
|
+
static styles: import("@design.estate/dees-element").CSSResult[];
|
|
29
|
+
render(): TemplateResult;
|
|
30
|
+
connectedCallback(): Promise<void>;
|
|
31
|
+
disconnectedCallback(): Promise<void>;
|
|
32
|
+
private adjustPosition;
|
|
33
|
+
private handleOutsideClick;
|
|
34
|
+
private handleKeydown;
|
|
35
|
+
private getEnabledItems;
|
|
36
|
+
/** Focus an enabled item by index (wrapping); the menu itself if there is none */
|
|
37
|
+
private focusItem;
|
|
38
|
+
private handleMenuKeydown;
|
|
39
|
+
private handleItemClick;
|
|
40
|
+
private close;
|
|
41
|
+
}
|
|
@@ -0,0 +1,329 @@
|
|
|
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, html, customElement, state, css, cssManager } from '@design.estate/dees-element';
|
|
36
|
+
let WccContextmenu = (() => {
|
|
37
|
+
let _classDecorators = [customElement('wcc-contextmenu')];
|
|
38
|
+
let _classDescriptor;
|
|
39
|
+
let _classExtraInitializers = [];
|
|
40
|
+
let _classThis;
|
|
41
|
+
let _classSuper = DeesElement;
|
|
42
|
+
let _menuItems_decorators;
|
|
43
|
+
let _menuItems_initializers = [];
|
|
44
|
+
let _menuItems_extraInitializers = [];
|
|
45
|
+
let _x_decorators;
|
|
46
|
+
let _x_initializers = [];
|
|
47
|
+
let _x_extraInitializers = [];
|
|
48
|
+
let _y_decorators;
|
|
49
|
+
let _y_initializers = [];
|
|
50
|
+
let _y_extraInitializers = [];
|
|
51
|
+
let _visible_decorators;
|
|
52
|
+
let _visible_initializers = [];
|
|
53
|
+
let _visible_extraInitializers = [];
|
|
54
|
+
var WccContextmenu = class extends _classSuper {
|
|
55
|
+
static { _classThis = this; }
|
|
56
|
+
static {
|
|
57
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
58
|
+
_menuItems_decorators = [property({ type: Array })];
|
|
59
|
+
_x_decorators = [property({ type: Number })];
|
|
60
|
+
_y_decorators = [property({ type: Number })];
|
|
61
|
+
_visible_decorators = [state()];
|
|
62
|
+
__esDecorate(this, null, _menuItems_decorators, { kind: "accessor", name: "menuItems", static: false, private: false, access: { has: obj => "menuItems" in obj, get: obj => obj.menuItems, set: (obj, value) => { obj.menuItems = value; } }, metadata: _metadata }, _menuItems_initializers, _menuItems_extraInitializers);
|
|
63
|
+
__esDecorate(this, null, _x_decorators, { kind: "accessor", name: "x", static: false, private: false, access: { has: obj => "x" in obj, get: obj => obj.x, set: (obj, value) => { obj.x = value; } }, metadata: _metadata }, _x_initializers, _x_extraInitializers);
|
|
64
|
+
__esDecorate(this, null, _y_decorators, { kind: "accessor", name: "y", static: false, private: false, access: { has: obj => "y" in obj, get: obj => obj.y, set: (obj, value) => { obj.y = value; } }, metadata: _metadata }, _y_initializers, _y_extraInitializers);
|
|
65
|
+
__esDecorate(this, null, _visible_decorators, { kind: "accessor", name: "visible", static: false, private: false, access: { has: obj => "visible" in obj, get: obj => obj.visible, set: (obj, value) => { obj.visible = value; } }, metadata: _metadata }, _visible_initializers, _visible_extraInitializers);
|
|
66
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
67
|
+
WccContextmenu = _classThis = _classDescriptor.value;
|
|
68
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Show a context menu at the event's position. The menu takes focus (its first item),
|
|
72
|
+
* is operated with the arrow keys, Home/End, Enter/Space and Escape/Tab, and returns
|
|
73
|
+
* focus to `ownerElement` when it closes from the keyboard or after an action.
|
|
74
|
+
*/
|
|
75
|
+
static async show(event, menuItems, options = {}) {
|
|
76
|
+
event.preventDefault();
|
|
77
|
+
event.stopPropagation();
|
|
78
|
+
// Remove any existing context menu
|
|
79
|
+
const existing = document.querySelector('wcc-contextmenu');
|
|
80
|
+
if (existing) {
|
|
81
|
+
existing.remove();
|
|
82
|
+
}
|
|
83
|
+
const menu = new WccContextmenu();
|
|
84
|
+
menu.menuItems = menuItems;
|
|
85
|
+
menu.x = event.clientX;
|
|
86
|
+
menu.y = event.clientY;
|
|
87
|
+
menu.ownerElement = options.ownerElement ?? null;
|
|
88
|
+
document.body.appendChild(menu);
|
|
89
|
+
// Wait for render then adjust position if needed
|
|
90
|
+
await menu.updateComplete;
|
|
91
|
+
menu.adjustPosition();
|
|
92
|
+
menu.focusItem(0);
|
|
93
|
+
}
|
|
94
|
+
/** Focus returns here when the menu closes from the keyboard or after an action */
|
|
95
|
+
ownerElement = null;
|
|
96
|
+
closing = false;
|
|
97
|
+
#menuItems_accessor_storage = __runInitializers(this, _menuItems_initializers, []);
|
|
98
|
+
get menuItems() { return this.#menuItems_accessor_storage; }
|
|
99
|
+
set menuItems(value) { this.#menuItems_accessor_storage = value; }
|
|
100
|
+
#x_accessor_storage = (__runInitializers(this, _menuItems_extraInitializers), __runInitializers(this, _x_initializers, 0));
|
|
101
|
+
get x() { return this.#x_accessor_storage; }
|
|
102
|
+
set x(value) { this.#x_accessor_storage = value; }
|
|
103
|
+
#y_accessor_storage = (__runInitializers(this, _x_extraInitializers), __runInitializers(this, _y_initializers, 0));
|
|
104
|
+
get y() { return this.#y_accessor_storage; }
|
|
105
|
+
set y(value) { this.#y_accessor_storage = value; }
|
|
106
|
+
#visible_accessor_storage = (__runInitializers(this, _y_extraInitializers), __runInitializers(this, _visible_initializers, false));
|
|
107
|
+
get visible() { return this.#visible_accessor_storage; }
|
|
108
|
+
set visible(value) { this.#visible_accessor_storage = value; }
|
|
109
|
+
boundHandleOutsideClick = (__runInitializers(this, _visible_extraInitializers), this.handleOutsideClick.bind(this));
|
|
110
|
+
boundHandleKeydown = this.handleKeydown.bind(this);
|
|
111
|
+
static styles = [
|
|
112
|
+
css `
|
|
113
|
+
:host {
|
|
114
|
+
position: fixed;
|
|
115
|
+
z-index: 10000;
|
|
116
|
+
opacity: 0;
|
|
117
|
+
transform: scale(0.95) translateY(-5px);
|
|
118
|
+
transition: opacity 0.15s ease, transform 0.15s ease;
|
|
119
|
+
pointer-events: none;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
:host(.visible) {
|
|
123
|
+
opacity: 1;
|
|
124
|
+
transform: scale(1) translateY(0);
|
|
125
|
+
pointer-events: auto;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.menu {
|
|
129
|
+
min-width: 160px;
|
|
130
|
+
background: #0f0f0f;
|
|
131
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
132
|
+
border-radius: 6px;
|
|
133
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
|
|
134
|
+
padding: 4px 0;
|
|
135
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
|
|
136
|
+
font-size: 12px;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.menu-item {
|
|
140
|
+
display: flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
gap: 8px;
|
|
143
|
+
padding: 8px 12px;
|
|
144
|
+
color: #ccc;
|
|
145
|
+
cursor: pointer;
|
|
146
|
+
transition: background 0.1s ease;
|
|
147
|
+
user-select: none;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.menu {
|
|
151
|
+
outline: none;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.menu-item:hover,
|
|
155
|
+
.menu-item:focus {
|
|
156
|
+
background: rgba(59, 130, 246, 0.15);
|
|
157
|
+
color: #fff;
|
|
158
|
+
outline: none;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.menu-item:focus-visible {
|
|
162
|
+
box-shadow: inset 0 0 0 2px #3b82f6;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.menu-item.disabled {
|
|
166
|
+
opacity: 0.4;
|
|
167
|
+
cursor: not-allowed;
|
|
168
|
+
pointer-events: none;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.menu-item .icon {
|
|
172
|
+
font-family: 'Material Symbols Outlined';
|
|
173
|
+
font-size: 16px;
|
|
174
|
+
font-weight: normal;
|
|
175
|
+
font-style: normal;
|
|
176
|
+
line-height: 1;
|
|
177
|
+
letter-spacing: normal;
|
|
178
|
+
text-transform: none;
|
|
179
|
+
white-space: nowrap;
|
|
180
|
+
word-wrap: normal;
|
|
181
|
+
direction: ltr;
|
|
182
|
+
font-variation-settings: 'FILL' 0, 'wght' 300, 'GRAD' 0, 'opsz' 24;
|
|
183
|
+
opacity: 0.7;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.menu-item:hover .icon {
|
|
187
|
+
opacity: 1;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.menu-item .label {
|
|
191
|
+
flex: 1;
|
|
192
|
+
}
|
|
193
|
+
`
|
|
194
|
+
];
|
|
195
|
+
render() {
|
|
196
|
+
return html `
|
|
197
|
+
<div class="menu" role="menu" tabindex="-1" @keydown=${this.handleMenuKeydown}>
|
|
198
|
+
${this.menuItems.map(item => html `
|
|
199
|
+
<div
|
|
200
|
+
class="menu-item ${item.disabled ? 'disabled' : ''}"
|
|
201
|
+
role="menuitem"
|
|
202
|
+
tabindex="-1"
|
|
203
|
+
aria-disabled=${item.disabled ? 'true' : 'false'}
|
|
204
|
+
@click=${() => this.handleItemClick(item)}
|
|
205
|
+
>
|
|
206
|
+
${item.iconName ? html `<span class="icon" aria-hidden="true">${item.iconName}</span>` : null}
|
|
207
|
+
<span class="label">${item.name}</span>
|
|
208
|
+
</div>
|
|
209
|
+
`)}
|
|
210
|
+
</div>
|
|
211
|
+
`;
|
|
212
|
+
}
|
|
213
|
+
async connectedCallback() {
|
|
214
|
+
await super.connectedCallback();
|
|
215
|
+
// Delay adding listeners to avoid immediate close
|
|
216
|
+
requestAnimationFrame(() => {
|
|
217
|
+
document.addEventListener('click', this.boundHandleOutsideClick);
|
|
218
|
+
document.addEventListener('contextmenu', this.boundHandleOutsideClick);
|
|
219
|
+
document.addEventListener('keydown', this.boundHandleKeydown);
|
|
220
|
+
this.classList.add('visible');
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
async disconnectedCallback() {
|
|
224
|
+
await super.disconnectedCallback();
|
|
225
|
+
document.removeEventListener('click', this.boundHandleOutsideClick);
|
|
226
|
+
document.removeEventListener('contextmenu', this.boundHandleOutsideClick);
|
|
227
|
+
document.removeEventListener('keydown', this.boundHandleKeydown);
|
|
228
|
+
}
|
|
229
|
+
adjustPosition() {
|
|
230
|
+
const rect = this.getBoundingClientRect();
|
|
231
|
+
const windowWidth = window.innerWidth;
|
|
232
|
+
const windowHeight = window.innerHeight;
|
|
233
|
+
let x = this.x;
|
|
234
|
+
let y = this.y;
|
|
235
|
+
// Adjust if menu goes off right edge
|
|
236
|
+
if (x + rect.width > windowWidth - 10) {
|
|
237
|
+
x = windowWidth - rect.width - 10;
|
|
238
|
+
}
|
|
239
|
+
// Adjust if menu goes off bottom edge
|
|
240
|
+
if (y + rect.height > windowHeight - 10) {
|
|
241
|
+
y = windowHeight - rect.height - 10;
|
|
242
|
+
}
|
|
243
|
+
// Ensure not off left or top
|
|
244
|
+
if (x < 10)
|
|
245
|
+
x = 10;
|
|
246
|
+
if (y < 10)
|
|
247
|
+
y = 10;
|
|
248
|
+
this.style.left = `${x}px`;
|
|
249
|
+
this.style.top = `${y}px`;
|
|
250
|
+
}
|
|
251
|
+
handleOutsideClick(e) {
|
|
252
|
+
const path = e.composedPath();
|
|
253
|
+
if (!path.includes(this)) {
|
|
254
|
+
this.close();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
handleKeydown(e) {
|
|
258
|
+
if (e.key === 'Escape') {
|
|
259
|
+
this.close(true);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
getEnabledItems() {
|
|
263
|
+
return Array.from(this.shadowRoot?.querySelectorAll('.menu-item:not(.disabled)') ?? []);
|
|
264
|
+
}
|
|
265
|
+
/** Focus an enabled item by index (wrapping); the menu itself if there is none */
|
|
266
|
+
focusItem(indexArg) {
|
|
267
|
+
const items = this.getEnabledItems();
|
|
268
|
+
if (items.length === 0) {
|
|
269
|
+
this.shadowRoot?.querySelector('.menu')?.focus({ preventScroll: true });
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const index = ((indexArg % items.length) + items.length) % items.length;
|
|
273
|
+
items[index].focus({ preventScroll: true });
|
|
274
|
+
}
|
|
275
|
+
handleMenuKeydown = (e) => {
|
|
276
|
+
const items = this.getEnabledItems();
|
|
277
|
+
const current = items.indexOf(this.shadowRoot?.activeElement);
|
|
278
|
+
switch (e.key) {
|
|
279
|
+
case 'ArrowDown':
|
|
280
|
+
this.focusItem(current + 1);
|
|
281
|
+
break;
|
|
282
|
+
case 'ArrowUp':
|
|
283
|
+
this.focusItem(current < 0 ? -1 : current - 1);
|
|
284
|
+
break;
|
|
285
|
+
case 'Home':
|
|
286
|
+
this.focusItem(0);
|
|
287
|
+
break;
|
|
288
|
+
case 'End':
|
|
289
|
+
this.focusItem(-1);
|
|
290
|
+
break;
|
|
291
|
+
case 'Enter':
|
|
292
|
+
case ' ':
|
|
293
|
+
if (current >= 0)
|
|
294
|
+
items[current].click();
|
|
295
|
+
break;
|
|
296
|
+
case 'Escape':
|
|
297
|
+
case 'Tab':
|
|
298
|
+
this.close(true);
|
|
299
|
+
break;
|
|
300
|
+
default:
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
e.preventDefault();
|
|
304
|
+
e.stopPropagation();
|
|
305
|
+
};
|
|
306
|
+
async handleItemClick(item) {
|
|
307
|
+
if (item.disabled)
|
|
308
|
+
return;
|
|
309
|
+
await item.action();
|
|
310
|
+
this.close(true);
|
|
311
|
+
}
|
|
312
|
+
close(returnFocus = false) {
|
|
313
|
+
if (this.closing)
|
|
314
|
+
return;
|
|
315
|
+
this.closing = true;
|
|
316
|
+
if (returnFocus && this.ownerElement?.isConnected) {
|
|
317
|
+
this.ownerElement.focus({ preventScroll: true });
|
|
318
|
+
}
|
|
319
|
+
this.classList.remove('visible');
|
|
320
|
+
setTimeout(() => this.remove(), 150);
|
|
321
|
+
}
|
|
322
|
+
static {
|
|
323
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
return WccContextmenu = _classThis;
|
|
327
|
+
})();
|
|
328
|
+
export { WccContextmenu };
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjLWNvbnRleHRtZW51LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL3djYy1jb250ZXh0bWVudS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBdUIsS0FBSyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztJQWV6SCxjQUFjOzRCQUQxQixhQUFhLENBQUMsaUJBQWlCLENBQUM7Ozs7c0JBQ0csV0FBVzs7Ozs7Ozs7Ozs7Ozs4QkFBbkIsU0FBUSxXQUFXOzs7O3FDQXNDNUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOzZCQUd6QixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7NkJBRzFCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzttQ0FHMUIsS0FBSyxFQUFFO1lBUlIsZ0xBQVMsU0FBUyw2QkFBVCxTQUFTLDZGQUEwQjtZQUc1Qyx3SkFBUyxDQUFDLDZCQUFELENBQUMsNkVBQWE7WUFHdkIsd0pBQVMsQ0FBQyw2QkFBRCxDQUFDLDZFQUFhO1lBR3ZCLDBLQUFTLE9BQU8sNkJBQVAsT0FBTyx5RkFBa0I7WUFoRHBDLDZLQW1SQzs7OztRQWxSQzs7OztXQUlHO1FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ3RCLEtBQWlCLEVBQ2pCLFNBQTZCLEVBQzdCLFVBQStCLEVBQUU7WUFFakMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV4QixtQ0FBbUM7WUFDbkMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzNELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN2QixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQztZQUVqRCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVoQyxpREFBaUQ7WUFDakQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFFRCxtRkFBbUY7UUFDM0UsWUFBWSxHQUF1QixJQUFJLENBQUM7UUFDeEMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUd4QiwrRUFBeUMsRUFBRSxFQUFDO1FBQTVDLElBQVMsU0FBUywrQ0FBMEI7UUFBNUMsSUFBUyxTQUFTLHFEQUEwQjtRQUc1Qyx1SEFBcUIsQ0FBQyxHQUFDO1FBQXZCLElBQVMsQ0FBQyx1Q0FBYTtRQUF2QixJQUFTLENBQUMsNkNBQWE7UUFHdkIsK0dBQXFCLENBQUMsR0FBQztRQUF2QixJQUFTLENBQUMsdUNBQWE7UUFBdkIsSUFBUyxDQUFDLDZDQUFhO1FBR3ZCLDJIQUE0QixLQUFLLEdBQUM7UUFBbEMsSUFBUyxPQUFPLDZDQUFrQjtRQUFsQyxJQUFTLE9BQU8sbURBQWtCO1FBRTFCLHVCQUF1Qix5REFBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDO1FBQzdELGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBELE1BQU0sQ0FBQyxNQUFNLEdBQUc7WUFDckIsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FpRkY7U0FDRixDQUFDO1FBRUssTUFBTTtZQUNYLE9BQU8sSUFBSSxDQUFBOzZEQUM4QyxJQUFJLENBQUMsaUJBQWlCO1VBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFBOzsrQkFFVixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7Ozs0QkFHbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPO3FCQUN2QyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQzs7Y0FFdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLHlDQUF5QyxJQUFJLENBQUMsUUFBUSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUk7a0NBQ3RFLElBQUksQ0FBQyxJQUFJOztTQUVsQyxDQUFDOztLQUVMLENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxDQUFDLGlCQUFpQjtZQUNyQixNQUFNLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2hDLGtEQUFrRDtZQUNsRCxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3pCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQ2pFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQ3ZFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELEtBQUssQ0FBQyxvQkFBb0I7WUFDeEIsTUFBTSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNuQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3BFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDMUUsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRU8sY0FBYztZQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQ3RDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFFeEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFZixxQ0FBcUM7WUFDckMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLENBQUMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDcEMsQ0FBQztZQUVELHNDQUFzQztZQUN0QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDeEMsQ0FBQyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUN0QyxDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFFTyxrQkFBa0IsQ0FBQyxDQUFRO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVPLGFBQWEsQ0FBQyxDQUFnQjtZQUNwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFTyxlQUFlO1lBQ3JCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFjLDJCQUEyQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkcsQ0FBQztRQUVELGtGQUFrRjtRQUMxRSxTQUFTLENBQUMsUUFBZ0I7WUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUF3QixFQUFFLEtBQUssQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRyxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3hFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRU8saUJBQWlCLEdBQUcsQ0FBQyxDQUFnQixFQUFFLEVBQUU7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUE0QixDQUFDLENBQUM7WUFDN0UsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2QsS0FBSyxXQUFXO29CQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUM1QixNQUFNO2dCQUNSLEtBQUssU0FBUztvQkFDWixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQy9DLE1BQU07Z0JBQ1IsS0FBSyxNQUFNO29CQUNULElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xCLE1BQU07Z0JBQ1IsS0FBSyxLQUFLO29CQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbkIsTUFBTTtnQkFDUixLQUFLLE9BQU8sQ0FBQztnQkFDYixLQUFLLEdBQUc7b0JBQ04sSUFBSSxPQUFPLElBQUksQ0FBQzt3QkFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3pDLE1BQU07Z0JBQ1IsS0FBSyxRQUFRLENBQUM7Z0JBQ2QsS0FBSyxLQUFLO29CQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2pCLE1BQU07Z0JBQ1I7b0JBQ0UsT0FBTztZQUNYLENBQUM7WUFDRCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQztRQUVNLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBc0I7WUFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPO1lBQzFCLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVPLEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSztZQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU87WUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDOztZQWxSVSx1REFBYzs7Ozs7U0FBZCxjQUFjIn0=
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
import type { TTemplateFactory } from './wcctools.helpers.js';
|
|
3
|
+
import type { IWccConfig, IWccSection, TElementType } from '../wcctools.interfaces.js';
|
|
4
|
+
import * as plugins from '../wcctools.plugins.js';
|
|
5
|
+
import './wcc-frame.js';
|
|
6
|
+
import './wcc-sidebar.js';
|
|
7
|
+
import './wcc-properties.js';
|
|
8
|
+
import { type TTheme } from './wcc-properties.js';
|
|
9
|
+
import { WccFrame, type IWccEmptyState } from './wcc-frame.js';
|
|
10
|
+
type TSectionEntry = [string, any];
|
|
11
|
+
/**
|
|
12
|
+
* The navigable entries of a section, after classification and the section's own filter and sort.
|
|
13
|
+
* Elements sections keep only custom element classes with a usable static `demo`;
|
|
14
|
+
* pages sections keep only template factories.
|
|
15
|
+
*/
|
|
16
|
+
export declare const getSectionItems: (section: IWccSection) => TSectionEntry[];
|
|
17
|
+
/**
|
|
18
|
+
* Registered custom elements of an elements section that have no usable demo.
|
|
19
|
+
* They are listed (not navigable) in the sidebar's "Without demo" group.
|
|
20
|
+
*/
|
|
21
|
+
export declare const getSectionItemsWithoutDemo: (section: IWccSection) => TSectionEntry[];
|
|
22
|
+
/** An addressed entry the dashboard cannot preview. */
|
|
23
|
+
export interface IWccUnavailableEntry {
|
|
24
|
+
kind: 'no-demo' | 'ignored' | 'missing';
|
|
25
|
+
sectionName: string;
|
|
26
|
+
itemName: string;
|
|
27
|
+
}
|
|
28
|
+
/** Parameters of a `/wcctools-route/...` URL. */
|
|
29
|
+
export interface IWccRouteParams {
|
|
30
|
+
sectionName: string;
|
|
31
|
+
itemName: string;
|
|
32
|
+
demoIndex?: string;
|
|
33
|
+
viewport: string;
|
|
34
|
+
theme: string;
|
|
35
|
+
}
|
|
36
|
+
type TResolvedEntry = {
|
|
37
|
+
kind: 'listed';
|
|
38
|
+
section: IWccSection;
|
|
39
|
+
item: unknown;
|
|
40
|
+
} | {
|
|
41
|
+
kind: IWccUnavailableEntry['kind'];
|
|
42
|
+
section: IWccSection | null;
|
|
43
|
+
};
|
|
44
|
+
export declare class WccDashboard extends DeesElement {
|
|
45
|
+
accessor sections: IWccSection[];
|
|
46
|
+
accessor selectedSection: IWccSection | null;
|
|
47
|
+
accessor selectedType: TElementType;
|
|
48
|
+
accessor selectedItemName: string;
|
|
49
|
+
accessor selectedItem: TTemplateFactory | DeesElement | null;
|
|
50
|
+
accessor selectedDemoIndex: number;
|
|
51
|
+
accessor selectedViewport: plugins.deesDomtools.breakpoints.TViewport;
|
|
52
|
+
accessor selectedTheme: TTheme;
|
|
53
|
+
accessor searchQuery: string;
|
|
54
|
+
accessor pinnedItems: Set<string>;
|
|
55
|
+
accessor sidebarWidth: number;
|
|
56
|
+
/** Set when the route addresses an entry that cannot be previewed. */
|
|
57
|
+
accessor unavailableEntry: IWccUnavailableEntry | null;
|
|
58
|
+
/** What the frame shows instead of a demo, if anything. */
|
|
59
|
+
accessor emptyState: IWccEmptyState | null;
|
|
60
|
+
get isNative(): boolean;
|
|
61
|
+
private frameScrollY;
|
|
62
|
+
private sidebarScrollY;
|
|
63
|
+
private scrollPositionsApplied;
|
|
64
|
+
private renderedSelection;
|
|
65
|
+
private renderGeneration;
|
|
66
|
+
private routeDisposers;
|
|
67
|
+
private scrollDisposers;
|
|
68
|
+
private scrollSetupTimeout;
|
|
69
|
+
private routeSettleTimeout;
|
|
70
|
+
private scrollUpdateTimeout;
|
|
71
|
+
accessor wccFrame: Promise<WccFrame>;
|
|
72
|
+
constructor(config?: IWccConfig);
|
|
73
|
+
/**
|
|
74
|
+
* Find a listed item by name across all sections, returns the item and its section
|
|
75
|
+
*/
|
|
76
|
+
findItemByName(name: string): {
|
|
77
|
+
item: any;
|
|
78
|
+
section: IWccSection;
|
|
79
|
+
} | null;
|
|
80
|
+
/**
|
|
81
|
+
* Find a section by name (URL-decoded)
|
|
82
|
+
*/
|
|
83
|
+
findSectionByName(name: string): IWccSection | null;
|
|
84
|
+
render(): TemplateResult;
|
|
85
|
+
toggleNative(): void;
|
|
86
|
+
private handleDocumentKeydown;
|
|
87
|
+
connectedCallback(): Promise<void>;
|
|
88
|
+
disconnectedCallback(): Promise<void>;
|
|
89
|
+
private connectRoutes;
|
|
90
|
+
firstUpdated(): Promise<void>;
|
|
91
|
+
private scheduleScrollListeners;
|
|
92
|
+
/**
|
|
93
|
+
* Resolve a section/item pair to a listed entry, or to the reason it cannot be previewed.
|
|
94
|
+
* The legacy section names `element` and `page` search every section.
|
|
95
|
+
*/
|
|
96
|
+
resolveEntry(sectionNameArg: string, itemNameArg: string): TResolvedEntry;
|
|
97
|
+
/**
|
|
98
|
+
* Apply a `/wcctools-route/...` location to the dashboard state.
|
|
99
|
+
*/
|
|
100
|
+
applyRoute(routeArg: IWccRouteParams, queryParamsArg?: Record<string, string>): Promise<void>;
|
|
101
|
+
updated(changedPropertiesArg: Map<string, any>): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Render the selected demo or page into the frame. Only a change of the selected item,
|
|
104
|
+
* demo index, type or unavailable entry re-renders; theme, viewport, search, pins and
|
|
105
|
+
* sidebar width leave the rendered demo (and its internal state) untouched.
|
|
106
|
+
*/
|
|
107
|
+
private renderSelection;
|
|
108
|
+
private resolveRenderTarget;
|
|
109
|
+
private getUnavailableEmptyState;
|
|
110
|
+
private getRouteUrl;
|
|
111
|
+
buildUrl(): void;
|
|
112
|
+
private handleFrameScroll;
|
|
113
|
+
private handleSidebarScroll;
|
|
114
|
+
setupScrollListeners(): Promise<void>;
|
|
115
|
+
private debouncedScrollUpdate;
|
|
116
|
+
private updateUrlWithScrollState;
|
|
117
|
+
applyScrollPositions(): Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
export {};
|