@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.
Files changed (42) hide show
  1. package/dist_bundle/bundle.js +1764 -218
  2. package/dist_bundle/bundle.js.map +4 -4
  3. package/dist_ts_demotools/demotools.d.ts +1 -1
  4. package/dist_ts_demotools/demotools.js +86 -38
  5. package/dist_ts_web/00_commitinfo_data.js +1 -1
  6. package/dist_ts_web/elements/wcc-dashboard.d.ts +11 -10
  7. package/dist_ts_web/elements/wcc-dashboard.js +370 -246
  8. package/dist_ts_web/elements/wcc-frame.d.ts +3 -3
  9. package/dist_ts_web/elements/wcc-frame.js +108 -57
  10. package/dist_ts_web/elements/wcc-properties.d.ts +14 -8
  11. package/dist_ts_web/elements/wcc-properties.js +442 -323
  12. package/dist_ts_web/elements/wcc-record-button.d.ts +12 -0
  13. package/dist_ts_web/elements/wcc-record-button.js +165 -0
  14. package/dist_ts_web/elements/wcc-recording-panel.d.ts +42 -0
  15. package/dist_ts_web/elements/wcc-recording-panel.js +1067 -0
  16. package/dist_ts_web/elements/wcc-sidebar.d.ts +7 -5
  17. package/dist_ts_web/elements/wcc-sidebar.js +250 -81
  18. package/dist_ts_web/elements/wcctools.helpers.d.ts +13 -0
  19. package/dist_ts_web/elements/wcctools.helpers.js +26 -1
  20. package/dist_ts_web/index.d.ts +3 -0
  21. package/dist_ts_web/index.js +5 -1
  22. package/dist_ts_web/services/ffmpeg.service.d.ts +42 -0
  23. package/dist_ts_web/services/ffmpeg.service.js +276 -0
  24. package/dist_ts_web/services/mp4.service.d.ts +32 -0
  25. package/dist_ts_web/services/mp4.service.js +139 -0
  26. package/dist_ts_web/services/recorder.service.d.ts +44 -0
  27. package/dist_ts_web/services/recorder.service.js +307 -0
  28. package/dist_watch/bundle.js +2126 -541
  29. package/dist_watch/bundle.js.map +4 -4
  30. package/package.json +8 -8
  31. package/readme.md +133 -141
  32. package/ts_web/00_commitinfo_data.ts +1 -1
  33. package/ts_web/elements/wcc-dashboard.ts +86 -26
  34. package/ts_web/elements/wcc-frame.ts +3 -3
  35. package/ts_web/elements/wcc-properties.ts +53 -9
  36. package/ts_web/elements/wcc-record-button.ts +108 -0
  37. package/ts_web/elements/wcc-recording-panel.ts +978 -0
  38. package/ts_web/elements/wcc-sidebar.ts +133 -22
  39. package/ts_web/elements/wcctools.helpers.ts +31 -0
  40. package/ts_web/index.ts +5 -0
  41. package/ts_web/readme.md +123 -0
  42. 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
- selectItem(typeArg: TElementType, itemNameArg: string, itemArg: TTemplateFactory | DeesElement): void;
12
+ private toggleExpanded;
13
+ selectItem(typeArg: TElementType, itemNameArg: string, itemArg: TTemplateFactory | DeesElement, demoIndex?: number): void;
12
14
  }
@@ -1,22 +1,99 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
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 __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
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
- let WccSidebar = class WccSidebar extends DeesElement {
14
- constructor() {
15
- super(...arguments);
16
- this.isFullscreen = false;
17
- }
18
- render() {
19
- return html `
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
- const pages = Object.keys(this.dashboardRef.pages);
163
- return pages.map(pageName => {
164
- const item = this.dashboardRef.pages[pageName];
165
- return html `
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
- const domtools = await plugins.deesDomtools.DomTools.setupDomTools();
170
- this.selectItem('page', pageName, item);
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
- const elements = Object.keys(this.dashboardRef.elements);
182
- return elements.map(elementName => {
183
- const item = this.dashboardRef.elements[elementName];
184
- return html `
185
- <div
186
- class="selectOption ${this.selectedItem === item ? 'selected' : null}"
187
- @click=${async () => {
188
- const domtools = await plugins.deesDomtools.DomTools.setupDomTools();
189
- this.selectItem('element', elementName, item);
190
- }}
191
- >
192
- <i class="material-symbols-outlined">featured_video</i>
193
- <div class="text">${elementName}</div>
194
- </div>
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
- selectItem(typeArg, itemNameArg, itemArg) {
202
- console.log('selected item');
203
- console.log(itemNameArg);
204
- console.log(itemArg);
205
- this.selectedItem = itemArg;
206
- this.selectedType = typeArg;
207
- this.dispatchEvent(new CustomEvent('selectedType', {
208
- detail: typeArg
209
- }));
210
- this.dispatchEvent(new CustomEvent('selectedItemName', {
211
- detail: itemNameArg
212
- }));
213
- this.dispatchEvent(new CustomEvent('selectedItem', {
214
- detail: itemArg
215
- }));
216
- this.dashboardRef.buildUrl();
217
- }
218
- };
219
- __decorate([
220
- property({ attribute: false }),
221
- __metadata("design:type", Object)
222
- ], WccSidebar.prototype, "selectedItem", void 0);
223
- __decorate([
224
- property({ attribute: false }),
225
- __metadata("design:type", String)
226
- ], WccSidebar.prototype, "selectedType", void 0);
227
- __decorate([
228
- property(),
229
- __metadata("design:type", WccDashboard)
230
- ], WccSidebar.prototype, "dashboardRef", void 0);
231
- __decorate([
232
- property(),
233
- __metadata("design:type", Boolean)
234
- ], WccSidebar.prototype, "isFullscreen", void 0);
235
- WccSidebar = __decorate([
236
- customElement('wcc-sidebar')
237
- ], WccSidebar);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjLXNpZGViYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvd2NjLXNpZGViYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQzlHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU0zQyxJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFXLFNBQVEsV0FBVztJQUFwQzs7UUFXRSxpQkFBWSxHQUFZLEtBQUssQ0FBQztJQWtOdkMsQ0FBQztJQWhOUSxNQUFNO1FBQ1gsT0FBTyxJQUFJLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3FCQW9CTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBMEgvQyxDQUFDLEdBQUcsRUFBRTtZQUNOLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxPQUFPLElBQUksQ0FBQTs7c0NBRWUsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxD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
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjdG9vbHMuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy93Y2N0b29scy5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssRUFDekMsVUFBNEIsRUFDSCxFQUFFO0lBQzNCLE9BQU8sTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDIn0=
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==
@@ -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;
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c193ZWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFHakMsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsV0FBMkMsRUFDM0MsUUFBMkMsRUFDM0MsRUFBRTtJQUNGLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNuQixNQUFNLGdCQUFnQixHQUFHLEtBQUssSUFBSSxFQUFFO1FBQ2xDLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsV0FBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRSxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDaEUsZ0JBQWdCLEVBQUUsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixPQUFPLEVBQ0wsYUFBYSxFQUNkLENBQUMifQ==
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;