@design.estate/wcctools 5.1.0 → 6.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 (128) hide show
  1. package/.smartconfig.json +7 -3
  2. package/changelog.md +15 -0
  3. package/cli.js +3 -0
  4. package/dist_shell/bundle.js +2970 -0
  5. package/dist_shell/bundle.js.map +1 -0
  6. package/dist_shell/bundle.js.third-party-notices.json +1722 -0
  7. package/dist_shell/bundle.js.third-party-notices.txt +4195 -0
  8. package/dist_shell/index.html +21 -0
  9. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  10. package/dist_ts/00_commitinfo_data.js +9 -0
  11. package/dist_ts/classes.devapi.d.ts +11 -0
  12. package/dist_ts/classes.devapi.js +21 -0
  13. package/dist_ts/classes.devserver.d.ts +49 -0
  14. package/dist_ts/classes.devserver.js +142 -0
  15. package/dist_ts/cli.d.ts +6 -0
  16. package/dist_ts/cli.js +45 -0
  17. package/dist_ts/index.d.ts +3 -0
  18. package/dist_ts/index.js +4 -0
  19. package/dist_ts/paths.d.ts +4 -0
  20. package/dist_ts/paths.js +6 -0
  21. package/dist_ts/plugins.d.ts +15 -0
  22. package/dist_ts/plugins.js +21 -0
  23. package/dist_ts/shellcontent.d.ts +9 -0
  24. package/dist_ts/shellcontent.js +42 -0
  25. package/dist_ts_interfaces/bridge.d.ts +88 -0
  26. package/dist_ts_interfaces/bridge.js +2 -0
  27. package/dist_ts_interfaces/catalog.d.ts +32 -0
  28. package/dist_ts_interfaces/catalog.js +6 -0
  29. package/dist_ts_interfaces/index.d.ts +3 -0
  30. package/dist_ts_interfaces/index.js +4 -0
  31. package/dist_ts_interfaces/plugins.d.ts +2 -0
  32. package/dist_ts_interfaces/plugins.js +3 -0
  33. package/dist_ts_interfaces/requests.d.ts +15 -0
  34. package/dist_ts_interfaces/requests.js +2 -0
  35. package/dist_ts_shared/index.d.ts +1 -0
  36. package/dist_ts_shared/index.js +2 -0
  37. package/dist_ts_shared/plugins.d.ts +2 -0
  38. package/dist_ts_shared/plugins.js +3 -0
  39. package/dist_ts_shared/previewroute.d.ts +18 -0
  40. package/dist_ts_shared/previewroute.js +47 -0
  41. package/{dist_ts_web → dist_ts_shell}/elements/wcc-contextmenu.js +1 -1
  42. package/dist_ts_shell/elements/wcc-preview-frame.d.ts +23 -0
  43. package/dist_ts_shell/elements/wcc-preview-frame.js +197 -0
  44. package/dist_ts_shell/elements/wcc-properties.d.ts +49 -0
  45. package/{dist_ts_web → dist_ts_shell}/elements/wcc-properties.js +149 -216
  46. package/{dist_ts_web → dist_ts_shell}/elements/wcc-record-button.js +1 -1
  47. package/{dist_ts_web → dist_ts_shell}/elements/wcc-recording-panel.d.ts +2 -2
  48. package/{dist_ts_web → dist_ts_shell}/elements/wcc-recording-panel.js +12 -16
  49. package/dist_ts_shell/elements/wcc-shell.d.ts +87 -0
  50. package/dist_ts_shell/elements/wcc-shell.js +524 -0
  51. package/{dist_ts_web → dist_ts_shell}/elements/wcc-sidebar.d.ts +12 -10
  52. package/{dist_ts_web → dist_ts_shell}/elements/wcc-sidebar.js +137 -183
  53. package/dist_ts_shell/index.d.ts +4 -0
  54. package/dist_ts_shell/index.js +5 -0
  55. package/dist_ts_shell/plugins.d.ts +4 -0
  56. package/dist_ts_shell/plugins.js +5 -0
  57. package/dist_ts_shell/previewconnection.d.ts +30 -0
  58. package/dist_ts_shell/previewconnection.js +86 -0
  59. package/dist_ts_shell/services/recorder.service.js +353 -0
  60. package/dist_ts_web/00_commitinfo_data.js +2 -2
  61. package/dist_ts_web/catalog.d.ts +45 -0
  62. package/dist_ts_web/catalog.js +153 -0
  63. package/dist_ts_web/elementproperties.d.ts +15 -0
  64. package/dist_ts_web/elementproperties.js +89 -0
  65. package/dist_ts_web/elements/wcc-preview.d.ts +19 -0
  66. package/dist_ts_web/elements/wcc-preview.js +164 -0
  67. package/dist_ts_web/elements/wcc-standalone-notice.d.ts +14 -0
  68. package/dist_ts_web/elements/wcc-standalone-notice.js +110 -0
  69. package/dist_ts_web/elements/wcctools.helpers.d.ts +2 -6
  70. package/dist_ts_web/elements/wcctools.helpers.js +1 -7
  71. package/dist_ts_web/index.d.ts +2 -5
  72. package/dist_ts_web/index.js +38 -17
  73. package/dist_ts_web/previewbridge.d.ts +39 -0
  74. package/dist_ts_web/previewbridge.js +153 -0
  75. package/dist_ts_web/renderedtree.d.ts +5 -0
  76. package/dist_ts_web/renderedtree.js +37 -0
  77. package/dist_ts_web/wcctools.interfaces.d.ts +3 -6
  78. package/dist_ts_web/wcctools.interfaces.js +1 -1
  79. package/dist_ts_web/wcctools.plugins.d.ts +3 -1
  80. package/dist_ts_web/wcctools.plugins.js +4 -2
  81. package/package.json +16 -8
  82. package/readme.md +60 -28
  83. package/ts/00_commitinfo_data.ts +8 -0
  84. package/ts/classes.devapi.ts +25 -0
  85. package/ts/classes.devserver.ts +161 -0
  86. package/ts/cli.ts +46 -0
  87. package/ts/index.ts +3 -0
  88. package/ts/paths.ts +7 -0
  89. package/ts/plugins.ts +29 -0
  90. package/ts/shellcontent.ts +42 -0
  91. package/ts_web/00_commitinfo_data.ts +1 -1
  92. package/ts_web/catalog.ts +194 -0
  93. package/ts_web/elementproperties.ts +96 -0
  94. package/ts_web/elements/wcc-preview.ts +111 -0
  95. package/ts_web/elements/wcc-standalone-notice.ts +65 -0
  96. package/ts_web/elements/wcctools.helpers.ts +2 -10
  97. package/ts_web/index.ts +38 -19
  98. package/ts_web/previewbridge.ts +189 -0
  99. package/ts_web/readme.md +26 -85
  100. package/ts_web/renderedtree.ts +43 -0
  101. package/ts_web/wcctools.interfaces.ts +4 -7
  102. package/ts_web/wcctools.plugins.ts +6 -1
  103. package/dist_bundle/bundle.js +0 -92419
  104. package/dist_bundle/bundle.js.map +0 -1
  105. package/dist_ts_web/elements/wcc-dashboard.d.ts +0 -119
  106. package/dist_ts_web/elements/wcc-dashboard.js +0 -700
  107. package/dist_ts_web/elements/wcc-frame.d.ts +0 -22
  108. package/dist_ts_web/elements/wcc-frame.js +0 -256
  109. package/dist_ts_web/elements/wcc-properties.d.ts +0 -43
  110. package/dist_ts_web/pages/index.d.ts +0 -1
  111. package/dist_ts_web/pages/index.js +0 -2
  112. package/dist_ts_web/services/recorder.service.js +0 -353
  113. package/ts_web/elements/wcc-contextmenu.ts +0 -291
  114. package/ts_web/elements/wcc-dashboard.ts +0 -672
  115. package/ts_web/elements/wcc-frame.ts +0 -189
  116. package/ts_web/elements/wcc-properties.ts +0 -1089
  117. package/ts_web/elements/wcc-record-button.ts +0 -108
  118. package/ts_web/elements/wcc-recording-panel.ts +0 -1010
  119. package/ts_web/elements/wcc-sidebar.ts +0 -1470
  120. package/ts_web/pages/index.ts +0 -1
  121. package/ts_web/services/recorder.service.ts +0 -451
  122. package/ts_web/types/dom-mediacapture-stub/index.d.ts +0 -12
  123. package/ts_web/types/dom-mediacapture-stub/package.json +0 -6
  124. package/ts_web/types/dom-webcodecs-stub/index.d.ts +0 -2
  125. package/ts_web/types/dom-webcodecs-stub/package.json +0 -6
  126. /package/{dist_ts_web → dist_ts_shell}/elements/wcc-contextmenu.d.ts +0 -0
  127. /package/{dist_ts_web → dist_ts_shell}/elements/wcc-record-button.d.ts +0 -0
  128. /package/{dist_ts_web → dist_ts_shell}/services/recorder.service.d.ts +0 -0
@@ -0,0 +1,4 @@
1
+ /**
2
+ * The wcctools shell bundle: the catalog UI that `wcctools dev` serves on `/wcctools/`.
3
+ */
4
+ export { WccShell } from './elements/wcc-shell.js';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * The wcctools shell bundle: the catalog UI that `wcctools dev` serves on `/wcctools/`.
3
+ */
4
+ export { WccShell } from './elements/wcc-shell.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19zaGVsbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ import * as deesDomtools from '@design.estate/dees-domtools';
2
+ import * as interfaces from '../dist_ts_interfaces/index.js';
3
+ import * as shared from '../dist_ts_shared/index.js';
4
+ export { deesDomtools, interfaces, shared, };
@@ -0,0 +1,5 @@
1
+ import * as deesDomtools from '@design.estate/dees-domtools';
2
+ import * as interfaces from '../dist_ts_interfaces/index.js';
3
+ import * as shared from '../dist_ts_shared/index.js';
4
+ export { deesDomtools, interfaces, shared, };
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3NoZWxsL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFlBQVksTUFBTSw4QkFBOEIsQ0FBQztBQUU3RCxPQUFPLEtBQUssVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sS0FBSyxNQUFNLE1BQU0sdUJBQXVCLENBQUM7QUFFaEQsT0FBTyxFQUNMLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxHQUNQLENBQUMifQ==
@@ -0,0 +1,30 @@
1
+ import * as plugins from './plugins.js';
2
+ export interface IWccPreviewConnectionHandlers {
3
+ /** A preview document installed its bridge; called again after every reload of the frame. */
4
+ onReady: (bridgeArg: plugins.interfaces.IWccPreviewBridge) => void;
5
+ /** The connected preview document is going away (reload or navigation). */
6
+ onDisconnect: () => void;
7
+ onEscape: () => void;
8
+ onScroll: (scrollYArg: number) => void;
9
+ }
10
+ /**
11
+ * The shell's connection to the preview document in its preview iframe. Each preview document posts
12
+ * a ready message once its bridge is installed; the connection then binds that document's
13
+ * bridge and listeners, and releases them when the document is hidden, so nothing of a
14
+ * replaced document stays referenced.
15
+ */
16
+ export declare class WccPreviewConnection {
17
+ private readonly getIframe;
18
+ private readonly handlers;
19
+ private bridgeValue;
20
+ private documentDisposers;
21
+ private started;
22
+ constructor(getIframe: () => HTMLIFrameElement | null, handlers: IWccPreviewConnectionHandlers);
23
+ get bridge(): plugins.interfaces.IWccPreviewBridge | null;
24
+ start(): void;
25
+ dispose(): void;
26
+ scrollPreviewTo(scrollYArg: number): void;
27
+ private handleMessage;
28
+ private bindDocument;
29
+ private releaseDocument;
30
+ }
@@ -0,0 +1,86 @@
1
+ import * as plugins from './plugins.js';
2
+ /**
3
+ * The shell's connection to the preview document in its preview iframe. Each preview document posts
4
+ * a ready message once its bridge is installed; the connection then binds that document's
5
+ * bridge and listeners, and releases them when the document is hidden, so nothing of a
6
+ * replaced document stays referenced.
7
+ */
8
+ export class WccPreviewConnection {
9
+ getIframe;
10
+ handlers;
11
+ bridgeValue = null;
12
+ documentDisposers = [];
13
+ started = false;
14
+ constructor(getIframe, handlers) {
15
+ this.getIframe = getIframe;
16
+ this.handlers = handlers;
17
+ }
18
+ get bridge() {
19
+ return this.bridgeValue;
20
+ }
21
+ start() {
22
+ if (this.started) {
23
+ return;
24
+ }
25
+ this.started = true;
26
+ window.addEventListener('message', this.handleMessage);
27
+ }
28
+ dispose() {
29
+ window.removeEventListener('message', this.handleMessage);
30
+ this.started = false;
31
+ this.releaseDocument();
32
+ }
33
+ scrollPreviewTo(scrollYArg) {
34
+ if (this.bridgeValue) {
35
+ this.getIframe()?.contentWindow?.scrollTo(0, scrollYArg);
36
+ }
37
+ }
38
+ handleMessage = (eventArg) => {
39
+ const previewWindow = this.getIframe()?.contentWindow;
40
+ if (!previewWindow
41
+ || eventArg.source !== previewWindow
42
+ || eventArg.origin !== window.location.origin
43
+ || !plugins.shared.isPreviewReadyMessage(eventArg.data)) {
44
+ return;
45
+ }
46
+ // A document that reloaded again since it posted installs its own bridge and posts again
47
+ const bridge = previewWindow.wccPreview;
48
+ if (!bridge) {
49
+ return;
50
+ }
51
+ this.releaseDocument();
52
+ this.bindDocument(previewWindow, bridge);
53
+ this.handlers.onReady(bridge);
54
+ };
55
+ bindDocument(previewWindowArg, bridgeArg) {
56
+ this.bridgeValue = bridgeArg;
57
+ const onKeydown = (eventArg) => {
58
+ if (eventArg.key === 'Escape') {
59
+ this.handlers.onEscape();
60
+ }
61
+ };
62
+ const onScroll = () => {
63
+ this.handlers.onScroll(previewWindowArg.scrollY);
64
+ };
65
+ const onPagehide = () => {
66
+ this.releaseDocument();
67
+ this.handlers.onDisconnect();
68
+ };
69
+ previewWindowArg.addEventListener('keydown', onKeydown);
70
+ previewWindowArg.addEventListener('scroll', onScroll, { passive: true });
71
+ previewWindowArg.addEventListener('pagehide', onPagehide);
72
+ this.documentDisposers = [
73
+ () => previewWindowArg.removeEventListener('keydown', onKeydown),
74
+ () => previewWindowArg.removeEventListener('scroll', onScroll),
75
+ () => previewWindowArg.removeEventListener('pagehide', onPagehide),
76
+ ];
77
+ }
78
+ releaseDocument() {
79
+ for (const dispose of this.documentDisposers) {
80
+ dispose();
81
+ }
82
+ this.documentDisposers = [];
83
+ this.bridgeValue = null;
84
+ }
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlld2Nvbm5lY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19zaGVsbC9wcmV2aWV3Y29ubmVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQVd4Qzs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFNWjtJQUNBO0lBTlgsV0FBVyxHQUFnRCxJQUFJLENBQUM7SUFDaEUsaUJBQWlCLEdBQXNCLEVBQUUsQ0FBQztJQUMxQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRXhCLFlBQ21CLFNBQXlDLEVBQ3pDLFFBQXVDO1FBRHZDLGNBQVMsR0FBVCxTQUFTLENBQWdDO1FBQ3pDLGFBQVEsR0FBUixRQUFRLENBQStCO0lBQ3ZELENBQUM7SUFFSixJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSxPQUFPO1FBQ1osTUFBTSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxlQUFlLENBQUMsVUFBa0I7UUFDdkMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxHQUFHLENBQUMsUUFBc0IsRUFBRSxFQUFFO1FBQ2pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxhQUFhLENBQUM7UUFDdEQsSUFDRSxDQUFDLGFBQWE7ZUFDWCxRQUFRLENBQUMsTUFBTSxLQUFLLGFBQWE7ZUFDakMsUUFBUSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU07ZUFDMUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFDdkQsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQ0QseUZBQXlGO1FBQ3pGLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDO0lBRU0sWUFBWSxDQUFDLGdCQUF3QixFQUFFLFNBQStDO1FBQzVGLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLE1BQU0sU0FBUyxHQUFHLENBQUMsUUFBdUIsRUFBRSxFQUFFO1lBQzVDLElBQUksUUFBUSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtZQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsaUJBQWlCLEdBQUc7WUFDdkIsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztZQUNoRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO1lBQzlELEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7U0FDbkUsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlO1FBQ3JCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDN0MsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,353 @@
1
+ /**
2
+ * RecorderService - Handles all MediaRecorder, audio monitoring, and video export logic.
3
+ * Recording always uses MediaRecorder → WebM (the reliable browser path).
4
+ * MP4 output is produced by converting WebM → MP4 via mediabunny at export time.
5
+ */
6
+ export class RecorderService {
7
+ // Recording state
8
+ mediaRecorder = null;
9
+ recordedChunks = [];
10
+ durationInterval = null;
11
+ _duration = 0;
12
+ _recordedBlob = null;
13
+ _isRecording = false;
14
+ _outputFormat = 'webm';
15
+ // Audio monitoring state
16
+ audioContext = null;
17
+ audioAnalyser = null;
18
+ audioMonitoringInterval = null;
19
+ monitoringStream = null;
20
+ // Current recording stream
21
+ currentStream = null;
22
+ // Event callbacks
23
+ events = {};
24
+ constructor(events) {
25
+ if (events) {
26
+ this.events = events;
27
+ }
28
+ }
29
+ // Public getters
30
+ get isRecording() {
31
+ return this._isRecording;
32
+ }
33
+ get duration() {
34
+ return this._duration;
35
+ }
36
+ get recordedBlob() {
37
+ return this._recordedBlob;
38
+ }
39
+ get outputFormat() {
40
+ return this._outputFormat;
41
+ }
42
+ // Update event callbacks
43
+ setEvents(events) {
44
+ this.events = { ...this.events, ...events };
45
+ }
46
+ // ==================== Microphone Management ====================
47
+ async loadMicrophones(requestPermission = false) {
48
+ try {
49
+ if (requestPermission) {
50
+ // Request permission by getting a temporary stream
51
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
52
+ stream.getTracks().forEach(track => track.stop());
53
+ }
54
+ const devices = await navigator.mediaDevices.enumerateDevices();
55
+ return devices.filter(d => d.kind === 'audioinput');
56
+ }
57
+ catch (error) {
58
+ console.error('Error loading microphones:', error);
59
+ return [];
60
+ }
61
+ }
62
+ async startAudioMonitoring(deviceId) {
63
+ this.stopAudioMonitoring();
64
+ if (!deviceId)
65
+ return;
66
+ try {
67
+ const stream = await navigator.mediaDevices.getUserMedia({
68
+ audio: { deviceId: { exact: deviceId } }
69
+ });
70
+ this.monitoringStream = stream;
71
+ this.audioContext = new AudioContext();
72
+ const source = this.audioContext.createMediaStreamSource(stream);
73
+ this.audioAnalyser = this.audioContext.createAnalyser();
74
+ this.audioAnalyser.fftSize = 256;
75
+ source.connect(this.audioAnalyser);
76
+ const dataArray = new Uint8Array(this.audioAnalyser.frequencyBinCount);
77
+ this.audioMonitoringInterval = window.setInterval(() => {
78
+ if (this.audioAnalyser) {
79
+ this.audioAnalyser.getByteFrequencyData(dataArray);
80
+ const average = dataArray.reduce((a, b) => a + b) / dataArray.length;
81
+ const level = Math.min(100, (average / 128) * 100);
82
+ this.events.onAudioLevelUpdate?.(level);
83
+ }
84
+ }, 50);
85
+ }
86
+ catch (error) {
87
+ console.error('Error starting audio monitoring:', error);
88
+ this.events.onAudioLevelUpdate?.(0);
89
+ }
90
+ }
91
+ stopAudioMonitoring() {
92
+ if (this.audioMonitoringInterval) {
93
+ clearInterval(this.audioMonitoringInterval);
94
+ this.audioMonitoringInterval = null;
95
+ }
96
+ if (this.audioContext) {
97
+ this.audioContext.close();
98
+ this.audioContext = null;
99
+ }
100
+ if (this.monitoringStream) {
101
+ this.monitoringStream.getTracks().forEach(track => track.stop());
102
+ this.monitoringStream = null;
103
+ }
104
+ this.audioAnalyser = null;
105
+ }
106
+ // ==================== Recording Control ====================
107
+ async startRecording(options) {
108
+ try {
109
+ this._outputFormat = options.outputFormat || 'webm';
110
+ // Stop audio monitoring before recording
111
+ this.stopAudioMonitoring();
112
+ // Get video stream based on mode
113
+ const displayMediaOptions = {
114
+ video: {
115
+ displaySurface: options.mode === 'viewport' ? 'browser' : 'monitor',
116
+ frameRate: { ideal: 60 },
117
+ },
118
+ audio: false
119
+ };
120
+ // Add preferCurrentTab hint for viewport mode
121
+ if (options.mode === 'viewport') {
122
+ displayMediaOptions.preferCurrentTab = true;
123
+ }
124
+ const videoStream = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);
125
+ // If viewport mode, try to crop to viewport element using Element Capture API
126
+ if (options.mode === 'viewport' && options.viewportElement) {
127
+ try {
128
+ if ('CropTarget' in window) {
129
+ const cropTarget = await window.CropTarget.fromElement(options.viewportElement);
130
+ const [videoTrack] = videoStream.getVideoTracks();
131
+ await videoTrack.cropTo(cropTarget);
132
+ }
133
+ }
134
+ catch (e) {
135
+ console.warn('Element Capture not supported, recording full tab:', e);
136
+ }
137
+ }
138
+ // Combine video with audio if enabled
139
+ let combinedStream = videoStream;
140
+ if (options.audioDeviceId) {
141
+ try {
142
+ const audioStream = await navigator.mediaDevices.getUserMedia({
143
+ audio: { deviceId: { exact: options.audioDeviceId } }
144
+ });
145
+ combinedStream = new MediaStream([
146
+ ...videoStream.getVideoTracks(),
147
+ ...audioStream.getAudioTracks()
148
+ ]);
149
+ }
150
+ catch (audioError) {
151
+ console.warn('Could not add audio:', audioError);
152
+ }
153
+ }
154
+ // Store stream for cleanup
155
+ this.currentStream = combinedStream;
156
+ // Handle stream ending (user clicks "Stop sharing")
157
+ videoStream.getVideoTracks()[0].onended = () => {
158
+ if (this._isRecording) {
159
+ this.stopRecording();
160
+ this.events.onStreamEnded?.();
161
+ }
162
+ };
163
+ // Always record as WebM — conversion to MP4 happens at export time
164
+ const mimeType = MediaRecorder.isTypeSupported('video/webm;codecs=vp9')
165
+ ? 'video/webm;codecs=vp9'
166
+ : 'video/webm';
167
+ this.mediaRecorder = new MediaRecorder(combinedStream, {
168
+ mimeType,
169
+ videoBitsPerSecond: 8_000_000, // 8 Mbps for smooth, high-quality capture
170
+ });
171
+ this.recordedChunks = [];
172
+ this.mediaRecorder.ondataavailable = (e) => {
173
+ if (e.data.size > 0) {
174
+ this.recordedChunks.push(e.data);
175
+ }
176
+ };
177
+ this.mediaRecorder.onstop = () => this.handleRecordingComplete();
178
+ this.mediaRecorder.start(1000); // Capture in 1-second chunks
179
+ // Start duration timer
180
+ this._duration = 0;
181
+ this.durationInterval = window.setInterval(() => {
182
+ this._duration++;
183
+ this.events.onDurationUpdate?.(this._duration);
184
+ }, 1000);
185
+ this._isRecording = true;
186
+ }
187
+ catch (error) {
188
+ console.error('Error starting recording:', error);
189
+ this._isRecording = false;
190
+ this.events.onError?.(error);
191
+ throw error;
192
+ }
193
+ }
194
+ stopRecording() {
195
+ if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') {
196
+ this.mediaRecorder.stop();
197
+ }
198
+ if (this.durationInterval) {
199
+ clearInterval(this.durationInterval);
200
+ this.durationInterval = null;
201
+ }
202
+ }
203
+ async handleRecordingComplete() {
204
+ const blob = new Blob(this.recordedChunks, { type: 'video/webm' });
205
+ this._recordedBlob = blob;
206
+ // Stop all tracks
207
+ if (this.currentStream) {
208
+ this.currentStream.getTracks().forEach(track => track.stop());
209
+ this.currentStream = null;
210
+ }
211
+ this._isRecording = false;
212
+ this.events.onRecordingComplete?.(this._recordedBlob);
213
+ }
214
+ // ==================== Conversion & Export ====================
215
+ /**
216
+ * Converts a WebM blob to MP4 using mediabunny's Conversion API.
217
+ * Uses WebCodecs for hardware-accelerated H.264 encoding.
218
+ */
219
+ async convertToMp4(webmBlob) {
220
+ const { Input, Output, Conversion, BlobSource, BufferTarget, Mp4OutputFormat, WEBM, QUALITY_HIGH, } = await import('mediabunny');
221
+ const input = new Input({
222
+ source: new BlobSource(webmBlob),
223
+ formats: [WEBM],
224
+ });
225
+ const target = new BufferTarget();
226
+ const output = new Output({
227
+ format: new Mp4OutputFormat({ fastStart: 'in-memory' }),
228
+ target,
229
+ });
230
+ const conversion = await Conversion.init({
231
+ input,
232
+ output,
233
+ // Force transcoding from VP9 → H.264 and Opus → AAC
234
+ video: {
235
+ codec: 'avc',
236
+ bitrate: QUALITY_HIGH,
237
+ fit: 'contain',
238
+ },
239
+ audio: {
240
+ codec: 'aac',
241
+ bitrate: QUALITY_HIGH,
242
+ },
243
+ });
244
+ await conversion.execute();
245
+ const buffer = target.buffer;
246
+ if (!buffer || buffer.byteLength === 0) {
247
+ throw new Error('MP4 conversion produced empty output');
248
+ }
249
+ return new Blob([buffer], { type: 'video/mp4' });
250
+ }
251
+ async exportTrimmedVideo(videoElement, trimStart, trimEnd) {
252
+ return new Promise((resolve, reject) => {
253
+ // Create a canvas for capturing frames
254
+ const canvas = document.createElement('canvas');
255
+ canvas.width = videoElement.videoWidth || 1280;
256
+ canvas.height = videoElement.videoHeight || 720;
257
+ const ctx = canvas.getContext('2d');
258
+ if (!ctx) {
259
+ reject(new Error('Could not get canvas context'));
260
+ return;
261
+ }
262
+ // Create canvas stream for video
263
+ const canvasStream = canvas.captureStream(30);
264
+ // Try to capture audio from video element
265
+ let combinedStream;
266
+ try {
267
+ // Create audio context to capture video's audio
268
+ const audioCtx = new AudioContext();
269
+ const source = audioCtx.createMediaElementSource(videoElement);
270
+ const destination = audioCtx.createMediaStreamDestination();
271
+ source.connect(destination);
272
+ source.connect(audioCtx.destination); // Also play through speakers
273
+ // Combine video (from canvas) and audio (from video element)
274
+ combinedStream = new MediaStream([
275
+ ...canvasStream.getVideoTracks(),
276
+ ...destination.stream.getAudioTracks()
277
+ ]);
278
+ // Store audioCtx for cleanup
279
+ const cleanup = () => {
280
+ audioCtx.close();
281
+ };
282
+ this.recordTrimmedStream(videoElement, canvas, ctx, combinedStream, trimStart, trimEnd, cleanup, resolve, reject);
283
+ }
284
+ catch (audioError) {
285
+ console.warn('Could not capture audio, recording video only:', audioError);
286
+ combinedStream = canvasStream;
287
+ this.recordTrimmedStream(videoElement, canvas, ctx, combinedStream, trimStart, trimEnd, () => { }, resolve, reject);
288
+ }
289
+ });
290
+ }
291
+ recordTrimmedStream(video, canvas, ctx, stream, trimStart, trimEnd, cleanup, resolve, reject) {
292
+ const mimeType = MediaRecorder.isTypeSupported('video/webm;codecs=vp9')
293
+ ? 'video/webm;codecs=vp9'
294
+ : 'video/webm';
295
+ const recorder = new MediaRecorder(stream, { mimeType });
296
+ const chunks = [];
297
+ recorder.ondataavailable = (e) => {
298
+ if (e.data.size > 0) {
299
+ chunks.push(e.data);
300
+ }
301
+ };
302
+ recorder.onstop = () => {
303
+ cleanup();
304
+ resolve(new Blob(chunks, { type: 'video/webm' }));
305
+ };
306
+ recorder.onerror = (e) => {
307
+ cleanup();
308
+ reject(new Error('Recording error: ' + e));
309
+ };
310
+ // Seek to trim start
311
+ video.currentTime = trimStart;
312
+ video.onseeked = () => {
313
+ // Start recording
314
+ recorder.start(100);
315
+ // Start playing
316
+ video.play();
317
+ // Draw frames to canvas
318
+ const drawFrame = () => {
319
+ if (video.currentTime >= trimEnd || video.paused || video.ended) {
320
+ video.pause();
321
+ video.onseeked = null;
322
+ // Give a small delay before stopping to ensure last frame is captured
323
+ setTimeout(() => {
324
+ if (recorder.state === 'recording') {
325
+ recorder.stop();
326
+ }
327
+ }, 100);
328
+ return;
329
+ }
330
+ ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
331
+ requestAnimationFrame(drawFrame);
332
+ };
333
+ drawFrame();
334
+ };
335
+ }
336
+ // ==================== Cleanup ====================
337
+ reset() {
338
+ this._recordedBlob = null;
339
+ this.recordedChunks = [];
340
+ this._duration = 0;
341
+ this._isRecording = false;
342
+ }
343
+ dispose() {
344
+ this.stopRecording();
345
+ this.stopAudioMonitoring();
346
+ this.reset();
347
+ if (this.currentStream) {
348
+ this.currentStream.getTracks().forEach(track => track.stop());
349
+ this.currentStream = null;
350
+ }
351
+ }
352
+ }
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3NoZWxsL3NlcnZpY2VzL3JlY29yZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQW1CSCxNQUFNLE9BQU8sZUFBZTtJQUMxQixrQkFBa0I7SUFDVixhQUFhLEdBQXlCLElBQUksQ0FBQztJQUMzQyxjQUFjLEdBQVcsRUFBRSxDQUFDO0lBQzVCLGdCQUFnQixHQUFrQixJQUFJLENBQUM7SUFDdkMsU0FBUyxHQUFXLENBQUMsQ0FBQztJQUN0QixhQUFhLEdBQWdCLElBQUksQ0FBQztJQUNsQyxZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLGFBQWEsR0FBa0IsTUFBTSxDQUFDO0lBRTlDLHlCQUF5QjtJQUNqQixZQUFZLEdBQXdCLElBQUksQ0FBQztJQUN6QyxhQUFhLEdBQXdCLElBQUksQ0FBQztJQUMxQyx1QkFBdUIsR0FBa0IsSUFBSSxDQUFDO0lBQzlDLGdCQUFnQixHQUF1QixJQUFJLENBQUM7SUFFcEQsMkJBQTJCO0lBQ25CLGFBQWEsR0FBdUIsSUFBSSxDQUFDO0lBRWpELGtCQUFrQjtJQUNWLE1BQU0sR0FBb0IsRUFBRSxDQUFDO0lBRXJDLFlBQVksTUFBd0I7UUFDbEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEs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
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/wcctools',
6
- version: '5.1.0',
6
+ version: '6.0.0',
7
7
  description: 'A set of web component tools for creating element catalogues, enabling the structured development and documentation of custom elements and pages.'
8
8
  };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUseUJBQXlCO0lBQy9CLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxtSkFBbUo7Q0FDakssQ0FBQSJ9
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUseUJBQXlCO0lBQy9CLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxtSkFBbUo7Q0FDakssQ0FBQSJ9
@@ -0,0 +1,45 @@
1
+ import * as plugins from './wcctools.plugins.js';
2
+ import { type ICatalogElementConstructor, type TTemplateFactory } from './elements/wcctools.helpers.js';
3
+ import type { IWccConfig, IWccSection } from './wcctools.interfaces.js';
4
+ type TSectionEntry = [string, any];
5
+ /**
6
+ * The navigable entries of a section, after classification and the section's own filter and sort.
7
+ * Elements sections keep only custom element classes with a usable static `demo`;
8
+ * pages sections keep only template factories.
9
+ */
10
+ export declare const getSectionItems: (section: IWccSection) => TSectionEntry[];
11
+ /**
12
+ * Registered custom elements of an elements section that have no usable demo.
13
+ * They are listed (not navigable) in the sidebar's "Without demo" group.
14
+ */
15
+ export declare const getSectionItemsWithoutDemo: (section: IWccSection) => TSectionEntry[];
16
+ /** What a selection resolves to: something to render, or the reason there is nothing. */
17
+ export type TWccCatalogTarget = {
18
+ kind: 'element';
19
+ factory: TTemplateFactory;
20
+ elementClass: ICatalogElementConstructor;
21
+ } | {
22
+ kind: 'page';
23
+ factory: TTemplateFactory;
24
+ } | {
25
+ kind: 'empty';
26
+ reason: plugins.interfaces.TWccEmptyReason;
27
+ emptyState: plugins.interfaces.IWccEmptyState;
28
+ };
29
+ /**
30
+ * The catalog of one `setupWccTools` call: classifies its sections, describes them as a
31
+ * data-only manifest and resolves selections to template factories.
32
+ */
33
+ export declare class WccCatalog {
34
+ private readonly sections;
35
+ constructor(configArg: IWccConfig);
36
+ getManifest(): plugins.interfaces.IWccCatalogManifest;
37
+ resolve(selectionArg: plugins.interfaces.IWccSelection | null): TWccCatalogTarget;
38
+ /**
39
+ * Resolve a section/item pair to a listed entry, or to the reason it cannot be previewed.
40
+ * The section names `element` and `page` of links from before sections existed search every section.
41
+ */
42
+ private resolveEntry;
43
+ private getUnavailableEmptyState;
44
+ }
45
+ export {};