@design.estate/dees-wcctools 1.2.1 → 2.0.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/dist_bundle/bundle.js +1764 -218
- package/dist_bundle/bundle.js.map +4 -4
- package/dist_ts_demotools/demotools.d.ts +1 -1
- package/dist_ts_demotools/demotools.js +86 -38
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/wcc-dashboard.d.ts +11 -10
- package/dist_ts_web/elements/wcc-dashboard.js +370 -246
- package/dist_ts_web/elements/wcc-frame.d.ts +3 -3
- package/dist_ts_web/elements/wcc-frame.js +108 -57
- package/dist_ts_web/elements/wcc-properties.d.ts +14 -8
- package/dist_ts_web/elements/wcc-properties.js +442 -323
- 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 +42 -0
- package/dist_ts_web/elements/wcc-recording-panel.js +1067 -0
- package/dist_ts_web/elements/wcc-sidebar.d.ts +7 -5
- package/dist_ts_web/elements/wcc-sidebar.js +250 -81
- package/dist_ts_web/elements/wcctools.helpers.d.ts +13 -0
- package/dist_ts_web/elements/wcctools.helpers.js +26 -1
- package/dist_ts_web/index.d.ts +3 -0
- package/dist_ts_web/index.js +5 -1
- package/dist_ts_web/services/ffmpeg.service.d.ts +42 -0
- package/dist_ts_web/services/ffmpeg.service.js +276 -0
- package/dist_ts_web/services/mp4.service.d.ts +32 -0
- package/dist_ts_web/services/mp4.service.js +139 -0
- package/dist_ts_web/services/recorder.service.d.ts +44 -0
- package/dist_ts_web/services/recorder.service.js +307 -0
- package/dist_watch/bundle.js +2126 -541
- package/dist_watch/bundle.js.map +4 -4
- package/package.json +8 -8
- package/readme.md +133 -141
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/wcc-dashboard.ts +86 -26
- package/ts_web/elements/wcc-frame.ts +3 -3
- package/ts_web/elements/wcc-properties.ts +53 -9
- package/ts_web/elements/wcc-record-button.ts +108 -0
- package/ts_web/elements/wcc-recording-panel.ts +978 -0
- package/ts_web/elements/wcc-sidebar.ts +133 -22
- package/ts_web/elements/wcctools.helpers.ts +31 -0
- package/ts_web/index.ts +5 -0
- package/ts_web/readme.md +123 -0
- package/ts_web/services/recorder.service.ts +393 -0
|
@@ -3,10 +3,12 @@ import { WccDashboard } from './wcc-dashboard.js';
|
|
|
3
3
|
import type { TTemplateFactory } from './wcctools.helpers.js';
|
|
4
4
|
export type TElementType = 'element' | 'page';
|
|
5
5
|
export declare class WccSidebar extends DeesElement {
|
|
6
|
-
selectedItem: DeesElement | TTemplateFactory;
|
|
7
|
-
selectedType: TElementType;
|
|
8
|
-
dashboardRef: WccDashboard;
|
|
9
|
-
isFullscreen: boolean;
|
|
6
|
+
accessor selectedItem: DeesElement | TTemplateFactory;
|
|
7
|
+
accessor selectedType: TElementType;
|
|
8
|
+
accessor dashboardRef: WccDashboard;
|
|
9
|
+
accessor isFullscreen: boolean;
|
|
10
|
+
accessor expandedElements: Set<string>;
|
|
10
11
|
render(): TemplateResult;
|
|
11
|
-
|
|
12
|
+
private toggleExpanded;
|
|
13
|
+
selectItem(typeArg: TElementType, itemNameArg: string, itemArg: TTemplateFactory | DeesElement, demoIndex?: number): void;
|
|
12
14
|
}
|
|
@@ -1,22 +1,99 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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;
|
|
6
27
|
};
|
|
7
|
-
var
|
|
8
|
-
|
|
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;
|
|
9
34
|
};
|
|
10
35
|
import * as plugins from '../wcctools.plugins.js';
|
|
11
|
-
import { DeesElement, property, html, customElement } from '@design.estate/dees-element';
|
|
36
|
+
import { DeesElement, property, html, customElement, state } from '@design.estate/dees-element';
|
|
12
37
|
import { WccDashboard } from './wcc-dashboard.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
38
|
+
import { getDemoCount, hasMultipleDemos } from './wcctools.helpers.js';
|
|
39
|
+
let WccSidebar = (() => {
|
|
40
|
+
let _classDecorators = [customElement('wcc-sidebar')];
|
|
41
|
+
let _classDescriptor;
|
|
42
|
+
let _classExtraInitializers = [];
|
|
43
|
+
let _classThis;
|
|
44
|
+
let _classSuper = DeesElement;
|
|
45
|
+
let _selectedItem_decorators;
|
|
46
|
+
let _selectedItem_initializers = [];
|
|
47
|
+
let _selectedItem_extraInitializers = [];
|
|
48
|
+
let _selectedType_decorators;
|
|
49
|
+
let _selectedType_initializers = [];
|
|
50
|
+
let _selectedType_extraInitializers = [];
|
|
51
|
+
let _dashboardRef_decorators;
|
|
52
|
+
let _dashboardRef_initializers = [];
|
|
53
|
+
let _dashboardRef_extraInitializers = [];
|
|
54
|
+
let _isFullscreen_decorators;
|
|
55
|
+
let _isFullscreen_initializers = [];
|
|
56
|
+
let _isFullscreen_extraInitializers = [];
|
|
57
|
+
let _expandedElements_decorators;
|
|
58
|
+
let _expandedElements_initializers = [];
|
|
59
|
+
let _expandedElements_extraInitializers = [];
|
|
60
|
+
var WccSidebar = class extends _classSuper {
|
|
61
|
+
static { _classThis = this; }
|
|
62
|
+
static {
|
|
63
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
64
|
+
_selectedItem_decorators = [property({ attribute: false })];
|
|
65
|
+
_selectedType_decorators = [property({ attribute: false })];
|
|
66
|
+
_dashboardRef_decorators = [property()];
|
|
67
|
+
_isFullscreen_decorators = [property()];
|
|
68
|
+
_expandedElements_decorators = [state()];
|
|
69
|
+
__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);
|
|
70
|
+
__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);
|
|
71
|
+
__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);
|
|
72
|
+
__esDecorate(this, null, _isFullscreen_decorators, { kind: "accessor", name: "isFullscreen", static: false, private: false, access: { has: obj => "isFullscreen" in obj, get: obj => obj.isFullscreen, set: (obj, value) => { obj.isFullscreen = value; } }, metadata: _metadata }, _isFullscreen_initializers, _isFullscreen_extraInitializers);
|
|
73
|
+
__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);
|
|
74
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
75
|
+
WccSidebar = _classThis = _classDescriptor.value;
|
|
76
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
77
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
78
|
+
}
|
|
79
|
+
#selectedItem_accessor_storage = __runInitializers(this, _selectedItem_initializers, void 0);
|
|
80
|
+
get selectedItem() { return this.#selectedItem_accessor_storage; }
|
|
81
|
+
set selectedItem(value) { this.#selectedItem_accessor_storage = value; }
|
|
82
|
+
#selectedType_accessor_storage = (__runInitializers(this, _selectedItem_extraInitializers), __runInitializers(this, _selectedType_initializers, void 0));
|
|
83
|
+
get selectedType() { return this.#selectedType_accessor_storage; }
|
|
84
|
+
set selectedType(value) { this.#selectedType_accessor_storage = value; }
|
|
85
|
+
#dashboardRef_accessor_storage = (__runInitializers(this, _selectedType_extraInitializers), __runInitializers(this, _dashboardRef_initializers, void 0));
|
|
86
|
+
get dashboardRef() { return this.#dashboardRef_accessor_storage; }
|
|
87
|
+
set dashboardRef(value) { this.#dashboardRef_accessor_storage = value; }
|
|
88
|
+
#isFullscreen_accessor_storage = (__runInitializers(this, _dashboardRef_extraInitializers), __runInitializers(this, _isFullscreen_initializers, false));
|
|
89
|
+
get isFullscreen() { return this.#isFullscreen_accessor_storage; }
|
|
90
|
+
set isFullscreen(value) { this.#isFullscreen_accessor_storage = value; }
|
|
91
|
+
#expandedElements_accessor_storage = (__runInitializers(this, _isFullscreen_extraInitializers), __runInitializers(this, _expandedElements_initializers, new Set()));
|
|
92
|
+
// Track which elements are expanded (for multi-demo elements)
|
|
93
|
+
get expandedElements() { return this.#expandedElements_accessor_storage; }
|
|
94
|
+
set expandedElements(value) { this.#expandedElements_accessor_storage = value; }
|
|
95
|
+
render() {
|
|
96
|
+
return html `
|
|
20
97
|
<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" />
|
|
21
98
|
<style>
|
|
22
99
|
:host {
|
|
@@ -106,7 +183,21 @@ let WccSidebar = class WccSidebar extends DeesElement {
|
|
|
106
183
|
color: #999;
|
|
107
184
|
background: transparent;
|
|
108
185
|
}
|
|
109
|
-
|
|
186
|
+
|
|
187
|
+
.selectOption.folder {
|
|
188
|
+
grid-template-columns: 16px 20px 1fr;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.selectOption .expand-icon {
|
|
192
|
+
font-size: 14px;
|
|
193
|
+
opacity: 0.5;
|
|
194
|
+
transition: transform 0.2s ease;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.selectOption.expanded .expand-icon {
|
|
198
|
+
transform: rotate(90deg);
|
|
199
|
+
}
|
|
200
|
+
|
|
110
201
|
.selectOption:hover {
|
|
111
202
|
background: rgba(59, 130, 246, 0.05);
|
|
112
203
|
color: #bbb;
|
|
@@ -139,6 +230,42 @@ let WccSidebar = class WccSidebar extends DeesElement {
|
|
|
139
230
|
font-weight: 400;
|
|
140
231
|
}
|
|
141
232
|
|
|
233
|
+
.demo-children {
|
|
234
|
+
margin-left: 1rem;
|
|
235
|
+
overflow: hidden;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.demo-child {
|
|
239
|
+
user-select: none;
|
|
240
|
+
position: relative;
|
|
241
|
+
margin: 0.125rem 0.5rem;
|
|
242
|
+
padding: 0.35rem 0.75rem;
|
|
243
|
+
transition: all 0.15s ease;
|
|
244
|
+
display: grid;
|
|
245
|
+
grid-template-columns: 16px 1fr;
|
|
246
|
+
align-items: center;
|
|
247
|
+
gap: 0.5rem;
|
|
248
|
+
border-radius: var(--radius);
|
|
249
|
+
cursor: pointer;
|
|
250
|
+
font-size: 0.7rem;
|
|
251
|
+
color: #777;
|
|
252
|
+
background: transparent;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.demo-child:hover {
|
|
256
|
+
background: rgba(59, 130, 246, 0.05);
|
|
257
|
+
color: #bbb;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.demo-child.selected {
|
|
261
|
+
background: rgba(59, 130, 246, 0.15);
|
|
262
|
+
color: var(--primary);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.demo-child .material-symbols-outlined {
|
|
266
|
+
font-size: 14px;
|
|
267
|
+
}
|
|
268
|
+
|
|
142
269
|
::-webkit-scrollbar {
|
|
143
270
|
width: 8px;
|
|
144
271
|
}
|
|
@@ -159,81 +286,123 @@ let WccSidebar = class WccSidebar extends DeesElement {
|
|
|
159
286
|
<div class="menu">
|
|
160
287
|
<h3>Pages</h3>
|
|
161
288
|
${(() => {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
289
|
+
const pages = Object.keys(this.dashboardRef.pages);
|
|
290
|
+
return pages.map(pageName => {
|
|
291
|
+
const item = this.dashboardRef.pages[pageName];
|
|
292
|
+
return html `
|
|
166
293
|
<div
|
|
167
294
|
class="selectOption ${this.selectedItem === item ? 'selected' : null}"
|
|
168
295
|
@click=${async () => {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
296
|
+
const domtools = await plugins.deesDomtools.DomTools.setupDomTools();
|
|
297
|
+
this.selectItem('page', pageName, item, 0);
|
|
298
|
+
}}
|
|
172
299
|
>
|
|
173
300
|
<i class="material-symbols-outlined">insert_drive_file</i>
|
|
174
301
|
<div class="text">${pageName}</div>
|
|
175
302
|
</div>
|
|
176
303
|
`;
|
|
177
|
-
|
|
178
|
-
|
|
304
|
+
});
|
|
305
|
+
})()}
|
|
179
306
|
<h3>Elements</h3>
|
|
180
307
|
${(() => {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
308
|
+
const elements = Object.keys(this.dashboardRef.elements);
|
|
309
|
+
return elements.map(elementName => {
|
|
310
|
+
const item = this.dashboardRef.elements[elementName];
|
|
311
|
+
const demoCount = item.demo ? getDemoCount(item.demo) : 0;
|
|
312
|
+
const isMultiDemo = item.demo && hasMultipleDemos(item.demo);
|
|
313
|
+
const isExpanded = this.expandedElements.has(elementName);
|
|
314
|
+
const isSelected = this.selectedItem === item;
|
|
315
|
+
if (isMultiDemo) {
|
|
316
|
+
// Multi-demo element - render as expandable folder
|
|
317
|
+
return html `
|
|
318
|
+
<div
|
|
319
|
+
class="selectOption folder ${isExpanded ? 'expanded' : ''} ${isSelected ? 'selected' : ''}"
|
|
320
|
+
@click=${() => this.toggleExpanded(elementName)}
|
|
321
|
+
>
|
|
322
|
+
<i class="material-symbols-outlined expand-icon">chevron_right</i>
|
|
323
|
+
<i class="material-symbols-outlined">folder</i>
|
|
324
|
+
<div class="text">${elementName}</div>
|
|
325
|
+
</div>
|
|
326
|
+
${isExpanded ? html `
|
|
327
|
+
<div class="demo-children">
|
|
328
|
+
${Array.from({ length: demoCount }, (_, i) => {
|
|
329
|
+
const demoIndex = i;
|
|
330
|
+
const isThisDemoSelected = isSelected && this.dashboardRef.selectedDemoIndex === demoIndex;
|
|
331
|
+
return html `
|
|
332
|
+
<div
|
|
333
|
+
class="demo-child ${isThisDemoSelected ? 'selected' : ''}"
|
|
334
|
+
@click=${async () => {
|
|
335
|
+
await plugins.deesDomtools.DomTools.setupDomTools();
|
|
336
|
+
this.selectItem('element', elementName, item, demoIndex);
|
|
337
|
+
}}
|
|
338
|
+
>
|
|
339
|
+
<i class="material-symbols-outlined">play_circle</i>
|
|
340
|
+
<div class="text">demo${demoIndex + 1}</div>
|
|
341
|
+
</div>
|
|
342
|
+
`;
|
|
343
|
+
})}
|
|
344
|
+
</div>
|
|
345
|
+
` : null}
|
|
346
|
+
`;
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
// Single demo element - render as normal
|
|
350
|
+
return html `
|
|
351
|
+
<div
|
|
352
|
+
class="selectOption ${isSelected ? 'selected' : null}"
|
|
353
|
+
@click=${async () => {
|
|
354
|
+
await plugins.deesDomtools.DomTools.setupDomTools();
|
|
355
|
+
this.selectItem('element', elementName, item, 0);
|
|
356
|
+
}}
|
|
357
|
+
>
|
|
358
|
+
<i class="material-symbols-outlined">featured_video</i>
|
|
359
|
+
<div class="text">${elementName}</div>
|
|
360
|
+
</div>
|
|
361
|
+
`;
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
})()}
|
|
198
365
|
</div>
|
|
199
366
|
`;
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
367
|
+
}
|
|
368
|
+
toggleExpanded(elementName) {
|
|
369
|
+
const newSet = new Set(this.expandedElements);
|
|
370
|
+
if (newSet.has(elementName)) {
|
|
371
|
+
newSet.delete(elementName);
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
newSet.add(elementName);
|
|
375
|
+
}
|
|
376
|
+
this.expandedElements = newSet;
|
|
377
|
+
}
|
|
378
|
+
selectItem(typeArg, itemNameArg, itemArg, demoIndex = 0) {
|
|
379
|
+
console.log('selected item');
|
|
380
|
+
console.log(itemNameArg);
|
|
381
|
+
console.log(itemArg);
|
|
382
|
+
console.log('demo index:', demoIndex);
|
|
383
|
+
this.selectedItem = itemArg;
|
|
384
|
+
this.selectedType = typeArg;
|
|
385
|
+
this.dashboardRef.selectedDemoIndex = demoIndex;
|
|
386
|
+
this.dispatchEvent(new CustomEvent('selectedType', {
|
|
387
|
+
detail: typeArg
|
|
388
|
+
}));
|
|
389
|
+
this.dispatchEvent(new CustomEvent('selectedItemName', {
|
|
390
|
+
detail: itemNameArg
|
|
391
|
+
}));
|
|
392
|
+
this.dispatchEvent(new CustomEvent('selectedItem', {
|
|
393
|
+
detail: itemArg
|
|
394
|
+
}));
|
|
395
|
+
this.dashboardRef.buildUrl();
|
|
396
|
+
// Force re-render to update demo child selection indicator
|
|
397
|
+
// (needed when switching between demos of the same element)
|
|
398
|
+
this.requestUpdate();
|
|
399
|
+
}
|
|
400
|
+
constructor() {
|
|
401
|
+
super(...arguments);
|
|
402
|
+
__runInitializers(this, _expandedElements_extraInitializers);
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
return WccSidebar = _classThis;
|
|
406
|
+
})();
|
|
238
407
|
export { WccSidebar };
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
408
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjLXNpZGViYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvd2NjLXNpZGViYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBdUIsS0FBSyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztJQUsxRCxVQUFVOzRCQUR0QixhQUFhLENBQUMsYUFBYSxDQUFDOzs7O3NCQUNHLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBQW5CLFNBQVEsV0FBVzs7Ozt3Q0FDeEMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO3dDQUc5QixRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7d0NBRzlCLFFBQVEsRUFBRTt3Q0FHVixRQUFRLEVBQUU7NENBSVYsS0FBSyxFQUFFO1lBWlIseUxBQVMsWUFBWSw2QkFBWixZQUFZLG1HQUFpQztZQUd0RCx5TEFBUyxZQUFZLDZCQUFaLFlBQVksbUdBQWU7WUFHcEMseUxBQVMsWUFBWSw2QkFBWixZQUFZLG1HQUFlO1lBR3BDLHlMQUFTLFlBQVksNkJBQVosWUFBWSxtR0FBa0I7WUFJdkMscU1BQVMsZ0JBQWdCLDZCQUFoQixnQkFBZ0IsMkdBQTBCO1lBZnJELDZLQTJVQzs7O1lBM1VZLHVEQUFVOztRQUVyQiw2RkFBc0Q7UUFBdEQsSUFBUyxZQUFZLGtEQUFpQztRQUF0RCxJQUFTLFlBQVksd0RBQWlDO1FBR3RELHlKQUFvQztRQUFwQyxJQUFTLFlB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
|
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import type { TemplateResult } from 'lit';
|
|
2
2
|
export type TTemplateFactory = () => TemplateResult | Promise<TemplateResult>;
|
|
3
|
+
export type TDemoDefinition = TTemplateFactory | TTemplateFactory[];
|
|
3
4
|
export declare const resolveTemplateFactory: (factoryArg: TTemplateFactory) => Promise<TemplateResult>;
|
|
5
|
+
/**
|
|
6
|
+
* Get the number of demos for an element
|
|
7
|
+
*/
|
|
8
|
+
export declare const getDemoCount: (demo: TDemoDefinition) => number;
|
|
9
|
+
/**
|
|
10
|
+
* Get a specific demo by index (0-based internally, displayed as 1-based)
|
|
11
|
+
*/
|
|
12
|
+
export declare const getDemoAtIndex: (demo: TDemoDefinition, index: number) => TTemplateFactory | null;
|
|
13
|
+
/**
|
|
14
|
+
* Check if an element has multiple demos
|
|
15
|
+
*/
|
|
16
|
+
export declare const hasMultipleDemos: (demo: TDemoDefinition) => boolean;
|
|
@@ -1,4 +1,29 @@
|
|
|
1
1
|
export const resolveTemplateFactory = async (factoryArg) => {
|
|
2
2
|
return await Promise.resolve(factoryArg());
|
|
3
3
|
};
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Get the number of demos for an element
|
|
6
|
+
*/
|
|
7
|
+
export const getDemoCount = (demo) => {
|
|
8
|
+
if (Array.isArray(demo)) {
|
|
9
|
+
return demo.length;
|
|
10
|
+
}
|
|
11
|
+
return 1;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Get a specific demo by index (0-based internally, displayed as 1-based)
|
|
15
|
+
*/
|
|
16
|
+
export const getDemoAtIndex = (demo, index) => {
|
|
17
|
+
if (Array.isArray(demo)) {
|
|
18
|
+
return demo[index] ?? null;
|
|
19
|
+
}
|
|
20
|
+
// Single demo - only index 0 is valid
|
|
21
|
+
return index === 0 ? demo : null;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Check if an element has multiple demos
|
|
25
|
+
*/
|
|
26
|
+
export const hasMultipleDemos = (demo) => {
|
|
27
|
+
return Array.isArray(demo) && demo.length > 1;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjdG9vbHMuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy93Y2N0b29scy5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssRUFDekMsVUFBNEIsRUFDSCxFQUFFO0lBQzNCLE9BQU8sTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFxQixFQUFVLEVBQUU7SUFDNUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBcUIsRUFBRSxLQUFhLEVBQTJCLEVBQUU7SUFDOUYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFDRCxzQ0FBc0M7SUFDdEMsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNuQyxDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsSUFBcUIsRUFBVyxFQUFFO0lBQ2pFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUMifQ==
|
package/dist_ts_web/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
2
|
import type { TTemplateFactory } from './elements/wcctools.helpers.js';
|
|
3
|
+
export { RecorderService, type IRecorderEvents, type IRecordingOptions } from './services/recorder.service.js';
|
|
4
|
+
export { WccRecordButton } from './elements/wcc-record-button.js';
|
|
5
|
+
export { WccRecordingPanel } from './elements/wcc-recording-panel.js';
|
|
3
6
|
declare const setupWccTools: (elementsArg?: {
|
|
4
7
|
[key: string]: LitElement;
|
|
5
8
|
}, pagesArg?: Record<string, TTemplateFactory>) => void;
|
package/dist_ts_web/index.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { WccDashboard } from './elements/wcc-dashboard.js';
|
|
2
2
|
import { LitElement } from 'lit';
|
|
3
|
+
// Export recording components and service
|
|
4
|
+
export { RecorderService } from './services/recorder.service.js';
|
|
5
|
+
export { WccRecordButton } from './elements/wcc-record-button.js';
|
|
6
|
+
export { WccRecordingPanel } from './elements/wcc-recording-panel.js';
|
|
3
7
|
const setupWccTools = (elementsArg, pagesArg) => {
|
|
4
8
|
let hasRun = false;
|
|
5
9
|
const runWccToolsSetup = async () => {
|
|
@@ -13,4 +17,4 @@ const setupWccTools = (elementsArg, pagesArg) => {
|
|
|
13
17
|
runWccToolsSetup();
|
|
14
18
|
};
|
|
15
19
|
export { setupWccTools };
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c193ZWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHakMsMENBQTBDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQWdELE1BQU0sZ0NBQWdDLENBQUM7QUFDL0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXRFLE1BQU0sYUFBYSxHQUFHLENBQ3BCLFdBQTJDLEVBQzNDLFFBQTJDLEVBQzNDLEVBQUU7SUFDRixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDbkIsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLElBQUksRUFBRTtRQUNsQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEQsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNkLE1BQU0sUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLFdBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2hFLGdCQUFnQixFQUFFLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUNMLGFBQWEsRUFDZCxDQUFDIn0=
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FFmpegService - Handles client-side video format conversion using FFmpeg.wasm
|
|
3
|
+
* Uses a custom worker implementation to bypass COEP/CORS issues with the standard library
|
|
4
|
+
*/
|
|
5
|
+
export interface IConversionProgress {
|
|
6
|
+
stage: 'loading' | 'converting' | 'finalizing';
|
|
7
|
+
progress: number;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
export interface IConversionOptions {
|
|
11
|
+
inputBlob: Blob;
|
|
12
|
+
outputFormat: 'mp4' | 'webm';
|
|
13
|
+
onProgress?: (progress: IConversionProgress) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare class FFmpegService {
|
|
16
|
+
private worker;
|
|
17
|
+
private core;
|
|
18
|
+
private loadPromise;
|
|
19
|
+
private messageId;
|
|
20
|
+
private pendingMessages;
|
|
21
|
+
private onLog?;
|
|
22
|
+
private onProgress?;
|
|
23
|
+
/**
|
|
24
|
+
* Lazy load FFmpeg.wasm from CDN using custom worker
|
|
25
|
+
*/
|
|
26
|
+
ensureLoaded(onProgress?: (progress: IConversionProgress) => void): Promise<void>;
|
|
27
|
+
private loadFFmpeg;
|
|
28
|
+
private sendMessage;
|
|
29
|
+
/**
|
|
30
|
+
* Convert WebM blob to MP4
|
|
31
|
+
*/
|
|
32
|
+
convertToMp4(options: IConversionOptions): Promise<Blob>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if FFmpeg is currently loaded
|
|
35
|
+
*/
|
|
36
|
+
get isLoaded(): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Terminate FFmpeg worker to free resources
|
|
39
|
+
*/
|
|
40
|
+
terminate(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export declare function getFFmpegService(): FFmpegService;
|