@norskvideo/norsk-studio-built-ins 1.12.0 → 1.14.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 (78) hide show
  1. package/Readme.adoc +16 -0
  2. package/client/info.js +135 -63
  3. package/client/style.css +125 -1
  4. package/lib/info.js +2 -2
  5. package/lib/info.js.map +1 -1
  6. package/lib/input.rtmp/info.js +1 -0
  7. package/lib/input.rtmp/info.js.map +1 -1
  8. package/lib/input.rtmp/runtime.d.ts +1 -1
  9. package/lib/input.rtmp/runtime.js.map +1 -1
  10. package/lib/input.srt-listener/runtime.d.ts +1 -1
  11. package/lib/input.srt-listener/runtime.js.map +1 -1
  12. package/lib/output.autoCmaf/runtime.d.ts +1 -1
  13. package/lib/output.autoCmaf/runtime.js.map +1 -1
  14. package/lib/output.preview/runtime.d.ts +3 -3
  15. package/lib/output.preview/runtime.js.map +1 -1
  16. package/lib/output.rtmp/runtime.d.ts +2 -2
  17. package/lib/output.rtmp/runtime.js.map +1 -1
  18. package/lib/output.statistics/runtime.d.ts +1 -1
  19. package/lib/output.statistics/runtime.js.map +1 -1
  20. package/lib/processor.browserOverlay/info.js +1 -1
  21. package/lib/processor.browserOverlay/info.js.map +1 -1
  22. package/lib/processor.browserOverlay/runtime.js +6 -7
  23. package/lib/processor.browserOverlay/runtime.js.map +1 -1
  24. package/lib/processor.cascadingSwitch/info.js +1 -1
  25. package/lib/processor.cascadingSwitch/info.js.map +1 -1
  26. package/lib/processor.cascadingSwitch/runtime.d.ts +1 -1
  27. package/lib/processor.cascadingSwitch/runtime.js.map +1 -1
  28. package/lib/processor.dynamicBug/info.js +7 -5
  29. package/lib/processor.dynamicBug/info.js.map +1 -1
  30. package/lib/processor.dynamicBug/runtime.d.ts +18 -15
  31. package/lib/processor.dynamicBug/runtime.js +243 -75
  32. package/lib/processor.dynamicBug/runtime.js.map +1 -1
  33. package/lib/processor.dynamicBug/summary-view.d.ts +1 -1
  34. package/lib/processor.dynamicBug/summary-view.js +114 -46
  35. package/lib/processor.dynamicBug/summary-view.js.map +1 -1
  36. package/lib/processor.dynamicBug/types.d.ts +19 -0
  37. package/lib/processor.dynamicBug/types.js +3 -0
  38. package/lib/processor.dynamicBug/types.js.map +1 -0
  39. package/lib/processor.dynamicBug/types.yaml +25 -0
  40. package/lib/processor.fixedLadder/info.js +1 -1
  41. package/lib/processor.fixedLadder/info.js.map +1 -1
  42. package/lib/test/browser-overlay.js +1 -0
  43. package/lib/test/browser-overlay.js.map +1 -1
  44. package/lib/test/dynamic-bug.js +11 -15
  45. package/lib/test/dynamic-bug.js.map +1 -1
  46. package/lib/test/preview.js +3 -3
  47. package/lib/test/preview.js.map +1 -1
  48. package/lib/{util.latency → util.stats.latency}/info.js +1 -1
  49. package/lib/util.stats.latency/info.js.map +1 -0
  50. package/lib/util.stats.latency/inline-view.js.map +1 -0
  51. package/lib/{util.latency → util.stats.latency}/runtime.d.ts +1 -1
  52. package/lib/util.stats.latency/runtime.js.map +1 -0
  53. package/lib/util.stats.latency/source-node-selection.js.map +1 -0
  54. package/lib/{util.ma35d → util.stats.ma35d}/info.js +1 -1
  55. package/lib/util.stats.ma35d/info.js.map +1 -0
  56. package/lib/util.stats.ma35d/inline-view.js.map +1 -0
  57. package/lib/{util.ma35d → util.stats.ma35d}/runtime.d.ts +1 -1
  58. package/lib/util.stats.ma35d/runtime.js.map +1 -0
  59. package/lib/util.timestamps/runtime.d.ts +1 -1
  60. package/lib/util.timestamps/runtime.js.map +1 -1
  61. package/package.json +8 -5
  62. package/lib/util.latency/info.js.map +0 -1
  63. package/lib/util.latency/inline-view.js.map +0 -1
  64. package/lib/util.latency/runtime.js.map +0 -1
  65. package/lib/util.latency/source-node-selection.js.map +0 -1
  66. package/lib/util.ma35d/info.js.map +0 -1
  67. package/lib/util.ma35d/inline-view.js.map +0 -1
  68. package/lib/util.ma35d/runtime.js.map +0 -1
  69. /package/lib/{util.latency → util.stats.latency}/info.d.ts +0 -0
  70. /package/lib/{util.latency → util.stats.latency}/inline-view.d.ts +0 -0
  71. /package/lib/{util.latency → util.stats.latency}/inline-view.js +0 -0
  72. /package/lib/{util.latency → util.stats.latency}/runtime.js +0 -0
  73. /package/lib/{util.latency → util.stats.latency}/source-node-selection.d.ts +0 -0
  74. /package/lib/{util.latency → util.stats.latency}/source-node-selection.js +0 -0
  75. /package/lib/{util.ma35d → util.stats.ma35d}/info.d.ts +0 -0
  76. /package/lib/{util.ma35d → util.stats.ma35d}/inline-view.d.ts +0 -0
  77. /package/lib/{util.ma35d → util.stats.ma35d}/inline-view.js +0 -0
  78. /package/lib/{util.ma35d → util.stats.ma35d}/runtime.js +0 -0
package/Readme.adoc ADDED
@@ -0,0 +1,16 @@
1
+ == workspaces/built-ins
2
+
3
+ This built-ins directory contains a collection of the default components available for use within Studio.
4
+ Its package.json builds a manifest for everything found in 'src' in src/index.ts, as well as building a client-side bundle for all of them.
5
+
6
+ === Structure
7
+
8
+ Inside the 'src' folder, we have several subdirectories each containing components in a particular class:
9
+
10
+ - Inputs: Modules that define how media streams are ingested.
11
+ - Outputs: Modules that define how media streams are delivered to their destinations.
12
+ - Processors: Modules that handle the transformation or analysis of media streams.
13
+
14
+ Using Norsk Studio, we can combine these components to easily build even complex live media workflows.
15
+
16
+ The documentation for each of the components can be found within the component's folder Readme.
package/client/info.js CHANGED
@@ -695,56 +695,119 @@ var summary_view_exports3 = {};
695
695
  __export(summary_view_exports3, {
696
696
  default: () => summary_view_default3
697
697
  });
698
- function SummaryView5({ state, sendCommand, httpApi }) {
698
+ function SummaryView5({ state, sendCommand, urls }) {
699
699
  const [bug, setBug] = (0, import_react14.useState)(state.activeBug?.file);
700
700
  const [position, setPosition] = (0, import_react14.useState)(state.activeBug?.position);
701
701
  const [bugs, setBugs] = (0, import_react14.useState)([]);
702
702
  const [fileToUpload, setFileToUpload] = (0, import_react14.useState)(void 0);
703
- async function updateBugs() {
704
- const result2 = await fetch("components/processor.dynamicBug/bugs");
705
- if (result2.ok && result2.body) {
706
- const bugs2 = await result2.json();
707
- setBugs(bugs2);
708
- } else {
709
- const text = await result2.text();
710
- throw new Error(text);
703
+ const [showFileInput, setShowFileInput] = (0, import_react14.useState)(false);
704
+ const [showUploadButton, setShowUploadButton] = (0, import_react14.useState)(false);
705
+ const [uploadStatus, setUploadStatus] = (0, import_react14.useState)({ success: false, message: null });
706
+ const [showDeleteDropdown, setShowDeleteDropdown] = (0, import_react14.useState)(false);
707
+ const [bugToDelete, setBugToDelete] = (0, import_react14.useState)("");
708
+ const updateBugs = (0, import_react14.useCallback)(async () => {
709
+ try {
710
+ const result2 = await fetch(`${urls.componentUrl}/bugs`);
711
+ if (result2.ok) {
712
+ const newBugs = await result2.json();
713
+ setBugs(newBugs);
714
+ } else {
715
+ throw new Error(await result2.text());
716
+ }
717
+ } catch (error) {
718
+ console.error("Failed to update bugs:", error);
719
+ setUploadStatus({
720
+ success: false,
721
+ message: "Failed to update bug list."
722
+ });
711
723
  }
712
- }
724
+ }, [urls.componentUrl]);
713
725
  (0, import_react14.useEffect)(() => {
714
- const fn = async () => {
715
- await updateBugs();
716
- };
717
- fn().catch(console.error);
718
- }, []);
719
- function onFileChange(e) {
720
- if (e.target.files?.[0])
721
- setFileToUpload(e.target.files[0]);
722
- }
723
- return (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [(0, import_jsx_runtime15.jsx)("h2", { children: "Controls" }), (0, import_jsx_runtime15.jsx)("label", { htmlFor: "select-preview", className: "mt-2", children: "Source" }), (0, import_jsx_runtime15.jsxs)("select", { id: "select-bug", className: "mt-2 node-editor-select-input", onChange: (e) => {
724
- setBug(e.currentTarget.value === "" ? void 0 : e.currentTarget.value);
725
- }, children: [(0, import_jsx_runtime15.jsx)("option", { value: "", selected: bug === void 0, children: "---" }), (0, import_jsx_runtime15.jsx)("option", { value: "new", selected: bug === "new", children: "New" }), bugs.map((s, i) => (0, import_jsx_runtime15.jsx)("option", { selected: bug == s, value: s, children: s }, i))] }), (0, import_jsx_runtime15.jsx)("form", { style: { display: bug === "new" ? "block" : "none" }, onSubmit: (e) => e.preventDefault(), children: (0, import_jsx_runtime15.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange }) }), (0, import_jsx_runtime15.jsxs)("select", { style: { display: bug ? "block" : "none" }, id: "select-position", className: "mt-2 node-editor-select-input", onChange: (e) => {
726
- setPosition(e.currentTarget.value);
727
- }, children: [(0, import_jsx_runtime15.jsx)("option", { value: "topleft", selected: position === "topleft", children: "Top Left" }), (0, import_jsx_runtime15.jsx)("option", { value: "topright", selected: position === "topright", children: "Top Right" }), (0, import_jsx_runtime15.jsx)("option", { value: "bottomleft", selected: position === "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime15.jsx)("option", { value: "bottomright", selected: position === "bottomright", children: "Bottom Right" })] }), bug != state.activeBug?.file || position != state.activeBug?.position || fileToUpload ? (0, import_jsx_runtime15.jsx)("button", { type: "button", className: "mt-2 mb-2 text-white w-full justify-center bg-primary-700 hover:bg-primary-800 focus:ring-4 focus:outline-none focus:ring-primary-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800", onClick: async (e) => {
728
- e.preventDefault();
729
- if (fileToUpload && bug === "new") {
726
+ updateBugs().catch(console.error);
727
+ }, [updateBugs]);
728
+ const onFileChange = (e) => {
729
+ const file = e.target.files?.[0];
730
+ setFileToUpload(file);
731
+ setShowUploadButton(!!file);
732
+ setUploadStatus({ success: false, message: null });
733
+ };
734
+ const uploadFile = async () => {
735
+ if (!fileToUpload)
736
+ return;
737
+ try {
730
738
  const form = new FormData();
731
- const url = httpApi.toString() + "/bugs";
732
739
  form.append("file", fileToUpload);
733
- await fetch(url, {
740
+ const response = await fetch(`${urls.componentUrl}/bugs`, {
734
741
  method: "POST",
735
742
  body: form
736
743
  });
737
- setTimeout(async () => {
738
- await updateBugs();
739
- sendCommand({ type: "change-bug", file: fileToUpload.name, position });
740
- setBug(fileToUpload.name);
744
+ if (response.status === 409) {
745
+ const errorData = await response.json();
746
+ setUploadStatus({
747
+ success: false,
748
+ message: `${errorData.error}. Delete the existing bug first if you want to replace it.`
749
+ });
750
+ } else if (!response.ok) {
751
+ throw new Error("Upload failed");
752
+ } else {
741
753
  setFileToUpload(void 0);
742
- return;
743
- }, 500);
744
- } else {
745
- sendCommand({ type: "change-bug", file: bug, position });
754
+ setShowFileInput(false);
755
+ setUploadStatus({
756
+ success: true,
757
+ message: "Bug uploaded successfully!"
758
+ });
759
+ await updateBugs();
760
+ }
761
+ } catch (error) {
762
+ console.error("Failed to upload file:", error);
763
+ setUploadStatus({ success: false, message: "Failed to upload bug." });
764
+ }
765
+ setTimeout(() => setUploadStatus({ success: false, message: null }), 5e3);
766
+ };
767
+ const deleteBug = async () => {
768
+ if (!bugToDelete)
769
+ return;
770
+ try {
771
+ const response = await fetch(`${urls.componentUrl}/bug`, {
772
+ method: "DELETE",
773
+ headers: {
774
+ "Content-Type": "application/json"
775
+ },
776
+ body: JSON.stringify({ filename: bugToDelete })
777
+ });
778
+ if (response.ok) {
779
+ setUploadStatus({
780
+ success: true,
781
+ message: "Bug deleted successfully!"
782
+ });
783
+ await updateBugs();
784
+ if (bug === bugToDelete) {
785
+ setBug(void 0);
786
+ sendCommand({
787
+ type: "change-bug",
788
+ file: void 0,
789
+ position: void 0
790
+ });
791
+ }
792
+ setBugToDelete("");
793
+ setShowDeleteDropdown(false);
794
+ } else {
795
+ const errorData = await response.json();
796
+ setUploadStatus({
797
+ success: false,
798
+ message: errorData.error || "Failed to delete bug"
799
+ });
800
+ }
801
+ } catch (error) {
802
+ console.error("Failed to delete bug:", error);
803
+ setUploadStatus({ success: false, message: "Failed to delete bug" });
746
804
  }
747
- }, children: "Commit" }) : (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, {})] });
805
+ setTimeout(() => setUploadStatus({ success: false, message: null }), 3e3);
806
+ };
807
+ const buttonClass = "mt-2 mb-5 text-white w-full justify-center bg-primary-700 hover:bg-primary-800 focus:ring-4 focus:outline-none focus:ring-primary-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-primary-600 dark:hover:bg-primary-700 dark:focus:ring-primary-800";
808
+ const deleteButtonClass = "mt-2 text-white w-full justify-center bg-red-600 hover:bg-red-700 focus:ring-4 focus:outline-none focus:ring-red-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-red-700 dark:hover:bg-red-800 dark:focus:ring-red-900";
809
+ const fileInputClass = "block w-full text-gray-900 border border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400";
810
+ return (0, import_jsx_runtime15.jsxs)("div", { className: "space-y-3", children: [(0, import_jsx_runtime15.jsx)("h2", { className: "text-xl font-bold text-gray-900 dark:text-white", children: "Controls" }), (0, import_jsx_runtime15.jsxs)("div", { children: [(0, import_jsx_runtime15.jsx)("label", { htmlFor: "select-bug", className: "block text-gray-900 dark:text-white mb-1", children: "Source" }), (0, import_jsx_runtime15.jsxs)("select", { id: "select-bug", className: "w-full node-editor-select-input", value: bug || "", onChange: (e) => setBug(e.target.value || void 0), children: [(0, import_jsx_runtime15.jsx)("option", { value: "", children: "---" }), bugs.map((s) => (0, import_jsx_runtime15.jsx)("option", { value: s, children: s }, s))] })] }), bug && (0, import_jsx_runtime15.jsxs)("div", { children: [(0, import_jsx_runtime15.jsx)("label", { htmlFor: "select-position", className: "block text-gray-900 dark:text-white mb-1", children: "Position" }), (0, import_jsx_runtime15.jsxs)("select", { id: "select-position", className: "w-full node-editor-select-input", value: position, onChange: (e) => setPosition(e.target.value), children: [(0, import_jsx_runtime15.jsx)("option", { value: "topleft", children: "Top Left" }), (0, import_jsx_runtime15.jsx)("option", { value: "topright", children: "Top Right" }), (0, import_jsx_runtime15.jsx)("option", { value: "bottomleft", children: "Bottom Left" }), (0, import_jsx_runtime15.jsx)("option", { value: "bottomright", children: "Bottom Right" })] })] }), (bug !== state.activeBug?.file || position !== state.activeBug?.position) && (0, import_jsx_runtime15.jsx)("button", { type: "button", className: buttonClass, onClick: () => sendCommand({ type: "change-bug", file: bug, position }), children: "Commit" }), !showFileInput && !uploadStatus.success && (0, import_jsx_runtime15.jsx)("button", { type: "button", className: buttonClass, onClick: () => setShowFileInput(true), style: { marginBottom: "1rem" }, children: "Upload Bug" }), showFileInput && (0, import_jsx_runtime15.jsxs)("form", { style: { display: "block", marginBottom: "1rem" }, children: [(0, import_jsx_runtime15.jsx)("input", { type: "file", id: "file", name: "filename", onChange: onFileChange, className: fileInputClass }), showUploadButton && (0, import_jsx_runtime15.jsx)("button", { type: "button", className: buttonClass, onClick: uploadFile, children: "Upload" })] }), (0, import_jsx_runtime15.jsx)("button", { type: "button", className: deleteButtonClass, onClick: () => setShowDeleteDropdown(!showDeleteDropdown), style: { marginBottom: "1rem" }, children: showDeleteDropdown ? "Hide Delete Options" : "Delete Bugs" }), showDeleteDropdown && (0, import_jsx_runtime15.jsxs)("div", { className: "mt-2 p-2 bg-gray-100 dark:bg-gray-800 rounded-lg", children: [(0, import_jsx_runtime15.jsx)("h3", { className: "text-lg font-semibold mb-2 text-gray-900 dark:text-white", children: "Select Bug to Delete" }), (0, import_jsx_runtime15.jsxs)("select", { className: "w-full mb-2 node-editor-select-input", value: bugToDelete, onChange: (e) => setBugToDelete(e.target.value), children: [(0, import_jsx_runtime15.jsx)("option", { value: "", children: " Select a bug" }), bugs.map((bugName) => (0, import_jsx_runtime15.jsx)("option", { value: bugName, children: bugName }, bugName))] }), (0, import_jsx_runtime15.jsx)("button", { onClick: deleteBug, disabled: !bugToDelete, className: `${deleteButtonClass} ${!bugToDelete ? "opacity-50 cursor-not-allowed" : ""}`, children: "Delete Selected Bug" })] }), uploadStatus.message && (0, import_jsx_runtime15.jsx)("div", { className: `mt-2 text-center ${uploadStatus.success ? "text-green-600" : "text-red-600"}`, children: uploadStatus.message })] });
748
811
  }
749
812
  var import_jsx_runtime15, import_react14, summary_view_default3;
750
813
  var init_summary_view3 = __esm({
@@ -4339,7 +4402,7 @@ function getAxisItems(chart, position, axis, intersect, useFinalPosition) {
4339
4402
  const rangeMethod = axis === "x" ? "inXRange" : "inYRange";
4340
4403
  let intersectsItem = false;
4341
4404
  evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index2) => {
4342
- if (element[rangeMethod](position[axis], useFinalPosition)) {
4405
+ if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {
4343
4406
  items.push({
4344
4407
  element,
4345
4408
  datasetIndex,
@@ -8248,8 +8311,10 @@ var init_chart = __esm({
8248
8311
  const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta) => meta.controller.options.grouped);
8249
8312
  const stacked = iScale.options.stacked;
8250
8313
  const stacks = [];
8314
+ const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);
8315
+ const iScaleValue = currentParsed && currentParsed[iScale.axis];
8251
8316
  const skipNull = (meta) => {
8252
- const parsed = meta.controller.getParsed(dataIndex);
8317
+ const parsed = meta._parsed.find((item) => item[iScale.axis] === iScaleValue);
8253
8318
  const val = parsed && parsed[meta.vScale.axis];
8254
8319
  if (isNullOrUndef(val) || isNaN(val)) {
8255
8320
  return true;
@@ -11181,7 +11246,7 @@ var init_chart = __esm({
11181
11246
  }
11182
11247
  };
11183
11248
  hasFunction = (value) => isObject(value) && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));
11184
- version = "4.4.3";
11249
+ version = "4.4.4";
11185
11250
  KNOWN_POSITIONS = [
11186
11251
  "top",
11187
11252
  "bottom",
@@ -11641,8 +11706,8 @@ var init_chart = __esm({
11641
11706
  let i;
11642
11707
  if (this._resizeBeforeDraw) {
11643
11708
  const { width, height } = this._resizeBeforeDraw;
11644
- this._resize(width, height);
11645
11709
  this._resizeBeforeDraw = null;
11710
+ this._resize(width, height);
11646
11711
  }
11647
11712
  this.clear();
11648
11713
  if (this.width <= 0 || this.height <= 0) {
@@ -12082,7 +12147,8 @@ var init_chart = __esm({
12082
12147
  ], useFinalPosition);
12083
12148
  const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;
12084
12149
  const _circumference = valueOrDefault(circumference, endAngle - startAngle);
12085
- const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);
12150
+ const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;
12151
+ const betweenAngles = _circumference >= TAU || nonZeroBetween;
12086
12152
  const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);
12087
12153
  return betweenAngles && withinRadius;
12088
12154
  }
@@ -13316,6 +13382,9 @@ var init_chart = __esm({
13316
13382
  ++count;
13317
13383
  }
13318
13384
  }
13385
+ if (count === 0 || xSet.size === 0) {
13386
+ return false;
13387
+ }
13319
13388
  const xAverage = [
13320
13389
  ...xSet
13321
13390
  ].reduce((a, b) => a + b) / xSet.size;
@@ -14642,7 +14711,7 @@ var init_chart = __esm({
14642
14711
  ctx.strokeStyle = color2;
14643
14712
  ctx.setLineDash(optsAtIndex.borderDash);
14644
14713
  ctx.lineDashOffset = optsAtIndex.borderDashOffset;
14645
- offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);
14714
+ offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);
14646
14715
  position = this.getPointPosition(i, offset);
14647
14716
  ctx.beginPath();
14648
14717
  ctx.moveTo(this.xCenter, this.yCenter);
@@ -15144,7 +15213,7 @@ var init_auto = __esm({
15144
15213
  }
15145
15214
  });
15146
15215
 
15147
- // build/util.latency/inline-view.js
15216
+ // build/util.stats.latency/inline-view.js
15148
15217
  var inline_view_exports7 = {};
15149
15218
  __export(inline_view_exports7, {
15150
15219
  default: () => inline_view_default7
@@ -15215,7 +15284,7 @@ function InlineView10({ state, config: _2 }) {
15215
15284
  }
15216
15285
  var import_jsx_runtime19, import_react18, inline_view_default7;
15217
15286
  var init_inline_view7 = __esm({
15218
- "build/util.latency/inline-view.js"() {
15287
+ "build/util.stats.latency/inline-view.js"() {
15219
15288
  "use strict";
15220
15289
  import_jsx_runtime19 = __toESM(require_jsx_runtime());
15221
15290
  import_react18 = __toESM(require_react());
@@ -15224,7 +15293,7 @@ var init_inline_view7 = __esm({
15224
15293
  }
15225
15294
  });
15226
15295
 
15227
- // build/util.latency/source-node-selection.js
15296
+ // build/util.stats.latency/source-node-selection.js
15228
15297
  var source_node_selection_exports = {};
15229
15298
  __export(source_node_selection_exports, {
15230
15299
  default: () => source_node_selection_default
@@ -15243,14 +15312,14 @@ function SourceNodeSelection(props) {
15243
15312
  }
15244
15313
  var import_jsx_runtime20, source_node_selection_default;
15245
15314
  var init_source_node_selection = __esm({
15246
- "build/util.latency/source-node-selection.js"() {
15315
+ "build/util.stats.latency/source-node-selection.js"() {
15247
15316
  "use strict";
15248
15317
  import_jsx_runtime20 = __toESM(require_jsx_runtime());
15249
15318
  source_node_selection_default = SourceNodeSelection;
15250
15319
  }
15251
15320
  });
15252
15321
 
15253
- // build/util.ma35d/inline-view.js
15322
+ // build/util.stats.ma35d/inline-view.js
15254
15323
  var inline_view_exports8 = {};
15255
15324
  __export(inline_view_exports8, {
15256
15325
  default: () => inline_view_default8
@@ -15325,7 +15394,7 @@ function InlineView11({ state, config: _2 }) {
15325
15394
  }
15326
15395
  var import_jsx_runtime21, import_react20, inline_view_default8;
15327
15396
  var init_inline_view8 = __esm({
15328
- "build/util.ma35d/inline-view.js"() {
15397
+ "build/util.stats.ma35d/inline-view.js"() {
15329
15398
  "use strict";
15330
15399
  import_jsx_runtime21 = __toESM(require_jsx_runtime());
15331
15400
  import_react20 = __toESM(require_react());
@@ -15450,6 +15519,7 @@ function info_default({ defineComponent, Av, validation: { Z, Port, SourceName,
15450
15519
  identifier: "input.rtmp",
15451
15520
  category: "input",
15452
15521
  name: "RTMP Ingest",
15522
+ description: "A component that listens for RTMP input on the address specified.",
15453
15523
  subscription: {
15454
15524
  accepts: void 0,
15455
15525
  produces: {
@@ -16295,7 +16365,7 @@ function info_default13(R) {
16295
16365
  var import_config3 = __toESM(require_config());
16296
16366
  function info_default14({ defineComponent, Video, validation: { Z } }) {
16297
16367
  return defineComponent({
16298
- identifier: "processor.transform.browserOverlay",
16368
+ identifier: "processor.browserOverlay",
16299
16369
  category: "processor",
16300
16370
  name: "Browser Overlay",
16301
16371
  subscription: {
@@ -16333,7 +16403,7 @@ function info_default15({ defineComponent, Av, React: React14, common: { Resolut
16333
16403
  const SourceSelection = React14.lazy(async () => Promise.resolve().then(() => (init_source_selection(), source_selection_exports)));
16334
16404
  const InlineView13 = React14.lazy(async () => Promise.resolve().then(() => (init_inline_view6(), inline_view_exports6)));
16335
16405
  return defineComponent({
16336
- identifier: "processor.control.cascadingSwitch",
16406
+ identifier: "processor.cascadingSwitch",
16337
16407
  category: "processor",
16338
16408
  name: "Cascading Switch",
16339
16409
  subscription: {
@@ -16474,6 +16544,7 @@ function info_default16({ defineComponent, Video }) {
16474
16544
  identifier: "processor.dynamicBug",
16475
16545
  category: "processor",
16476
16546
  name: "Dynamic Bug",
16547
+ description: "",
16477
16548
  subscription: {
16478
16549
  // Only accept a single video stream
16479
16550
  accepts: {
@@ -16490,7 +16561,7 @@ function info_default16({ defineComponent, Video }) {
16490
16561
  },
16491
16562
  display: (desc) => {
16492
16563
  return {
16493
- default: desc.config.defaultBug ?? "none"
16564
+ default: desc.config.initialBug ?? "none"
16494
16565
  };
16495
16566
  },
16496
16567
  runtime: {
@@ -16511,15 +16582,16 @@ function info_default16({ defineComponent, Video }) {
16511
16582
  hardware: (0, import_config4.HardwareSelection)()
16512
16583
  },
16513
16584
  form: {
16514
- defaultBug: {
16515
- help: "The default bug to render on the video (if any)",
16585
+ initialBug: {
16586
+ help: "The initial bug to render on the video (if any)",
16516
16587
  hint: {
16517
16588
  type: "custom",
16589
+ optional: true,
16518
16590
  component: BugSelection2
16519
16591
  }
16520
16592
  },
16521
- defaultPosition: {
16522
- help: "The default location to render the bug in",
16593
+ initialPosition: {
16594
+ help: "The initial location at which to render the bug",
16523
16595
  hint: {
16524
16596
  type: "select",
16525
16597
  optional: true,
@@ -16547,7 +16619,7 @@ function info_default17({ defineComponent, Video }) {
16547
16619
  const CodecEditor3 = import_react17.default.lazy(async () => Promise.resolve().then(() => (init_codec_editor(), codec_editor_exports)));
16548
16620
  const CodecView = import_react17.default.lazy(async () => Promise.resolve().then(() => (init_codec_view(), codec_view_exports)));
16549
16621
  return defineComponent({
16550
- identifier: "processor.transform.fixedLadder",
16622
+ identifier: "processor.fixedLadder",
16551
16623
  category: "processor",
16552
16624
  name: "Encode Ladder",
16553
16625
  subscription: {
@@ -16907,14 +16979,14 @@ function info_default18({ defineComponent, Av, Subtitle, validation: { Z } }) {
16907
16979
  });
16908
16980
  }
16909
16981
 
16910
- // build/util.latency/info.js
16982
+ // build/util.stats.latency/info.js
16911
16983
  var import_react19 = __toESM(require_react());
16912
16984
  function info_default19(R) {
16913
16985
  const { defineComponent } = R;
16914
16986
  const InlineView13 = import_react19.default.lazy(async () => Promise.resolve().then(() => (init_inline_view7(), inline_view_exports7)));
16915
16987
  const SourceNodeSelection2 = import_react19.default.lazy(async () => Promise.resolve().then(() => (init_source_node_selection(), source_node_selection_exports)));
16916
16988
  return defineComponent({
16917
- identifier: "util.latency-stats",
16989
+ identifier: "util.stats.latency",
16918
16990
  category: "output",
16919
16991
  name: "Latency Probe",
16920
16992
  subscription: {
@@ -16997,13 +17069,13 @@ function assertUnreachable10(_) {
16997
17069
  throw new Error("Didn't expect to get here");
16998
17070
  }
16999
17071
 
17000
- // build/util.ma35d/info.js
17072
+ // build/util.stats.ma35d/info.js
17001
17073
  var import_react21 = __toESM(require_react());
17002
17074
  function info_default20(R) {
17003
17075
  const { defineComponent } = R;
17004
17076
  const InlineView13 = import_react21.default.lazy(async () => Promise.resolve().then(() => (init_inline_view8(), inline_view_exports8)));
17005
17077
  return defineComponent({
17006
- identifier: "util.ma35d-stats",
17078
+ identifier: "util.stats.ma35d",
17007
17079
  category: "output",
17008
17080
  name: "MA35D Stats",
17009
17081
  subscription: {
@@ -17153,7 +17225,7 @@ export {
17153
17225
 
17154
17226
  chart.js/dist/chunks/helpers.segment.js:
17155
17227
  (*!
17156
- * Chart.js v4.4.3
17228
+ * Chart.js v4.4.4
17157
17229
  * https://www.chartjs.org
17158
17230
  * (c) 2024 Chart.js Contributors
17159
17231
  * Released under the MIT License
@@ -17161,7 +17233,7 @@ chart.js/dist/chunks/helpers.segment.js:
17161
17233
 
17162
17234
  chart.js/dist/chart.js:
17163
17235
  (*!
17164
- * Chart.js v4.4.3
17236
+ * Chart.js v4.4.4
17165
17237
  * https://www.chartjs.org
17166
17238
  * (c) 2024 Chart.js Contributors
17167
17239
  * Released under the MIT License
package/client/style.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- ! tailwindcss v3.4.7 | MIT License | https://tailwindcss.com
2
+ ! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com
3
3
  */
4
4
 
5
5
  /*
@@ -941,6 +941,10 @@ input[type="range"]::-ms-fill-lower {
941
941
  grid-column: span 2 / span 2;
942
942
  }
943
943
 
944
+ .mb-1 {
945
+ margin-bottom: 0.25rem;
946
+ }
947
+
944
948
  .mb-2 {
945
949
  margin-bottom: 0.5rem;
946
950
  }
@@ -1022,6 +1026,10 @@ input[type="range"]::-ms-fill-lower {
1022
1026
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1023
1027
  }
1024
1028
 
1029
+ .cursor-not-allowed {
1030
+ cursor: not-allowed;
1031
+ }
1032
+
1025
1033
  .cursor-pointer {
1026
1034
  cursor: pointer;
1027
1035
  }
@@ -1046,6 +1054,12 @@ input[type="range"]::-ms-fill-lower {
1046
1054
  justify-content: center;
1047
1055
  }
1048
1056
 
1057
+ .space-y-3 > :not([hidden]) ~ :not([hidden]) {
1058
+ --tw-space-y-reverse: 0;
1059
+ margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
1060
+ margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
1061
+ }
1062
+
1049
1063
  .rounded {
1050
1064
  border-radius: 0.25rem;
1051
1065
  }
@@ -1074,6 +1088,20 @@ input[type="range"]::-ms-fill-lower {
1074
1088
  border-end-start-radius: 0.5rem;
1075
1089
  }
1076
1090
 
1091
+ .border {
1092
+ border-width: 1px;
1093
+ }
1094
+
1095
+ .border-gray-300 {
1096
+ --tw-border-opacity: 1;
1097
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
1098
+ }
1099
+
1100
+ .bg-gray-100 {
1101
+ --tw-bg-opacity: 1;
1102
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
1103
+ }
1104
+
1077
1105
  .bg-gray-200 {
1078
1106
  --tw-bg-opacity: 1;
1079
1107
  background-color: rgb(229 231 235 / var(--tw-bg-opacity));
@@ -1089,10 +1117,19 @@ input[type="range"]::-ms-fill-lower {
1089
1117
  background-color: rgb(29 78 216 / var(--tw-bg-opacity));
1090
1118
  }
1091
1119
 
1120
+ .bg-red-600 {
1121
+ --tw-bg-opacity: 1;
1122
+ background-color: rgb(224 36 36 / var(--tw-bg-opacity));
1123
+ }
1124
+
1092
1125
  .stroke-gray-700 {
1093
1126
  stroke: #374151;
1094
1127
  }
1095
1128
 
1129
+ .p-2 {
1130
+ padding: 0.5rem;
1131
+ }
1132
+
1096
1133
  .px-5 {
1097
1134
  padding-left: 1.25rem;
1098
1135
  padding-right: 1.25rem;
@@ -1107,15 +1144,33 @@ input[type="range"]::-ms-fill-lower {
1107
1144
  text-align: center;
1108
1145
  }
1109
1146
 
1147
+ .text-lg {
1148
+ font-size: 1.125rem;
1149
+ line-height: 1.75rem;
1150
+ }
1151
+
1110
1152
  .text-sm {
1111
1153
  font-size: 0.875rem;
1112
1154
  line-height: 1.25rem;
1113
1155
  }
1114
1156
 
1157
+ .text-xl {
1158
+ font-size: 1.25rem;
1159
+ line-height: 1.75rem;
1160
+ }
1161
+
1162
+ .font-bold {
1163
+ font-weight: 700;
1164
+ }
1165
+
1115
1166
  .font-medium {
1116
1167
  font-weight: 500;
1117
1168
  }
1118
1169
 
1170
+ .font-semibold {
1171
+ font-weight: 600;
1172
+ }
1173
+
1119
1174
  .leading-6 {
1120
1175
  line-height: 1.5rem;
1121
1176
  }
@@ -1129,21 +1184,40 @@ input[type="range"]::-ms-fill-lower {
1129
1184
  color: rgb(0 0 0 / var(--tw-text-opacity));
1130
1185
  }
1131
1186
 
1187
+ .text-gray-900 {
1188
+ --tw-text-opacity: 1;
1189
+ color: rgb(17 24 39 / var(--tw-text-opacity));
1190
+ }
1191
+
1132
1192
  .text-green-300 {
1133
1193
  --tw-text-opacity: 1;
1134
1194
  color: rgb(132 225 188 / var(--tw-text-opacity));
1135
1195
  }
1136
1196
 
1197
+ .text-green-600 {
1198
+ --tw-text-opacity: 1;
1199
+ color: rgb(5 122 85 / var(--tw-text-opacity));
1200
+ }
1201
+
1137
1202
  .text-orange-300 {
1138
1203
  --tw-text-opacity: 1;
1139
1204
  color: rgb(253 186 140 / var(--tw-text-opacity));
1140
1205
  }
1141
1206
 
1207
+ .text-red-600 {
1208
+ --tw-text-opacity: 1;
1209
+ color: rgb(224 36 36 / var(--tw-text-opacity));
1210
+ }
1211
+
1142
1212
  .text-white {
1143
1213
  --tw-text-opacity: 1;
1144
1214
  color: rgb(255 255 255 / var(--tw-text-opacity));
1145
1215
  }
1146
1216
 
1217
+ .opacity-50 {
1218
+ opacity: 0.5;
1219
+ }
1220
+
1147
1221
  .shadow-lg {
1148
1222
  --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
1149
1223
  --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
@@ -1345,6 +1419,11 @@ input[type="range"]::-ms-fill-lower {
1345
1419
  background-color: rgb(30 64 175 / var(--tw-bg-opacity));
1346
1420
  }
1347
1421
 
1422
+ .hover\:bg-red-700:hover {
1423
+ --tw-bg-opacity: 1;
1424
+ background-color: rgb(200 30 30 / var(--tw-bg-opacity));
1425
+ }
1426
+
1348
1427
  .focus\:outline-none:focus {
1349
1428
  outline: 2px solid transparent;
1350
1429
  outline-offset: 2px;
@@ -1361,6 +1440,16 @@ input[type="range"]::-ms-fill-lower {
1361
1440
  --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity));
1362
1441
  }
1363
1442
 
1443
+ .focus\:ring-red-300:focus {
1444
+ --tw-ring-opacity: 1;
1445
+ --tw-ring-color: rgb(248 180 180 / var(--tw-ring-opacity));
1446
+ }
1447
+
1448
+ .dark\:border-gray-600:is(.dark *) {
1449
+ --tw-border-opacity: 1;
1450
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
1451
+ }
1452
+
1364
1453
  .dark\:bg-black:is(.dark *) {
1365
1454
  --tw-bg-opacity: 1;
1366
1455
  background-color: rgb(0 0 0 / var(--tw-bg-opacity));
@@ -1371,15 +1460,30 @@ input[type="range"]::-ms-fill-lower {
1371
1460
  background-color: rgb(55 65 81 / var(--tw-bg-opacity));
1372
1461
  }
1373
1462
 
1463
+ .dark\:bg-gray-800:is(.dark *) {
1464
+ --tw-bg-opacity: 1;
1465
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
1466
+ }
1467
+
1374
1468
  .dark\:bg-primary-600:is(.dark *) {
1375
1469
  --tw-bg-opacity: 1;
1376
1470
  background-color: rgb(37 99 235 / var(--tw-bg-opacity));
1377
1471
  }
1378
1472
 
1473
+ .dark\:bg-red-700:is(.dark *) {
1474
+ --tw-bg-opacity: 1;
1475
+ background-color: rgb(200 30 30 / var(--tw-bg-opacity));
1476
+ }
1477
+
1379
1478
  .dark\:stroke-gray-50:is(.dark *) {
1380
1479
  stroke: #F9FAFB;
1381
1480
  }
1382
1481
 
1482
+ .dark\:text-gray-400:is(.dark *) {
1483
+ --tw-text-opacity: 1;
1484
+ color: rgb(156 163 175 / var(--tw-text-opacity));
1485
+ }
1486
+
1383
1487
  .dark\:text-green-300:is(.dark *) {
1384
1488
  --tw-text-opacity: 1;
1385
1489
  color: rgb(132 225 188 / var(--tw-text-opacity));
@@ -1395,12 +1499,32 @@ input[type="range"]::-ms-fill-lower {
1395
1499
  color: rgb(255 255 255 / var(--tw-text-opacity));
1396
1500
  }
1397
1501
 
1502
+ .dark\:placeholder-gray-400:is(.dark *)::-moz-placeholder {
1503
+ --tw-placeholder-opacity: 1;
1504
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
1505
+ }
1506
+
1507
+ .dark\:placeholder-gray-400:is(.dark *)::placeholder {
1508
+ --tw-placeholder-opacity: 1;
1509
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
1510
+ }
1511
+
1398
1512
  .dark\:hover\:bg-primary-700:hover:is(.dark *) {
1399
1513
  --tw-bg-opacity: 1;
1400
1514
  background-color: rgb(29 78 216 / var(--tw-bg-opacity));
1401
1515
  }
1402
1516
 
1517
+ .dark\:hover\:bg-red-800:hover:is(.dark *) {
1518
+ --tw-bg-opacity: 1;
1519
+ background-color: rgb(155 28 28 / var(--tw-bg-opacity));
1520
+ }
1521
+
1403
1522
  .dark\:focus\:ring-primary-800:focus:is(.dark *) {
1404
1523
  --tw-ring-opacity: 1;
1405
1524
  --tw-ring-color: rgb(30 64 175 / var(--tw-ring-opacity));
1406
1525
  }
1526
+
1527
+ .dark\:focus\:ring-red-900:focus:is(.dark *) {
1528
+ --tw-ring-opacity: 1;
1529
+ --tw-ring-color: rgb(119 29 29 / var(--tw-ring-opacity));
1530
+ }
package/lib/info.js CHANGED
@@ -53,9 +53,9 @@ const info_17 = __importDefault(require("./processor.fixedLadder/info"));
53
53
  AllComponents.push((r) => (0, info_17.default)(r));
54
54
  const info_18 = __importDefault(require("./processor.whisper-transcribe/info"));
55
55
  AllComponents.push((r) => (0, info_18.default)(r));
56
- const info_19 = __importDefault(require("./util.latency/info"));
56
+ const info_19 = __importDefault(require("./util.stats.latency/info"));
57
57
  AllComponents.push((r) => (0, info_19.default)(r));
58
- const info_20 = __importDefault(require("./util.ma35d/info"));
58
+ const info_20 = __importDefault(require("./util.stats.ma35d/info"));
59
59
  AllComponents.push((r) => (0, info_20.default)(r));
60
60
  const info_21 = __importDefault(require("./util.timestamps/info"));
61
61
  AllComponents.push((r) => (0, info_21.default)(r));