@arcanewizards/timecode-toolbox 0.1.0 → 0.1.2

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -0
  3. package/dist/components/frontend/index.js +1035 -442
  4. package/dist/components/frontend/index.mjs +884 -291
  5. package/dist/entrypoint.css +163 -53
  6. package/dist/entrypoint.js +1769 -788
  7. package/dist/entrypoint.js.map +4 -4
  8. package/dist/frontend.js +1769 -788
  9. package/dist/frontend.js.map +4 -4
  10. package/dist/index.d.mts +3 -1
  11. package/dist/index.d.ts +3 -1
  12. package/dist/index.js +346 -76
  13. package/dist/index.mjs +348 -69
  14. package/dist/start.d.mts +1 -2
  15. package/dist/start.d.ts +1 -2
  16. package/dist/start.js +349 -77
  17. package/dist/start.mjs +351 -70
  18. package/package.json +12 -6
  19. package/.turbo/turbo-build.log +0 -58
  20. package/.turbo/turbo-lint.log +0 -4
  21. package/CHANGELOG.md +0 -40
  22. package/eslint.config.mjs +0 -49
  23. package/src/app.tsx +0 -147
  24. package/src/components/backend/index.ts +0 -6
  25. package/src/components/backend/toolbox-root.ts +0 -119
  26. package/src/components/frontend/constants.ts +0 -81
  27. package/src/components/frontend/entrypoint.ts +0 -12
  28. package/src/components/frontend/frontend.css +0 -108
  29. package/src/components/frontend/index.tsx +0 -46
  30. package/src/components/frontend/toolbox/content.tsx +0 -45
  31. package/src/components/frontend/toolbox/context.tsx +0 -63
  32. package/src/components/frontend/toolbox/core/size-aware-div.tsx +0 -51
  33. package/src/components/frontend/toolbox/core/timecode-display.tsx +0 -592
  34. package/src/components/frontend/toolbox/generators.tsx +0 -318
  35. package/src/components/frontend/toolbox/inputs.tsx +0 -484
  36. package/src/components/frontend/toolbox/outputs.tsx +0 -581
  37. package/src/components/frontend/toolbox/preferences.ts +0 -25
  38. package/src/components/frontend/toolbox/root.tsx +0 -335
  39. package/src/components/frontend/toolbox/settings.tsx +0 -54
  40. package/src/components/frontend/toolbox/types.ts +0 -28
  41. package/src/components/frontend/toolbox/util.tsx +0 -61
  42. package/src/components/proto.ts +0 -420
  43. package/src/config.ts +0 -7
  44. package/src/generators/clock.tsx +0 -206
  45. package/src/generators/index.tsx +0 -15
  46. package/src/index.ts +0 -38
  47. package/src/inputs/artnet.tsx +0 -305
  48. package/src/inputs/index.tsx +0 -13
  49. package/src/inputs/tcnet.tsx +0 -272
  50. package/src/outputs/artnet.tsx +0 -170
  51. package/src/outputs/index.tsx +0 -11
  52. package/src/start.ts +0 -47
  53. package/src/tree.ts +0 -133
  54. package/src/types.ts +0 -12
  55. package/src/urls.ts +0 -49
  56. package/src/util.ts +0 -82
  57. package/tailwind.config.cjs +0 -7
  58. package/tsconfig.json +0 -10
  59. package/tsup.config.ts +0 -10
@@ -9880,9 +9880,6 @@ var useLongPressable2 = ({
9880
9880
  );
9881
9881
  };
9882
9882
 
9883
- // ../../packages/sigil/dist/chunk-H4U4Z4GM.js
9884
- import { useEffect as useEffect18 } from "react";
9885
-
9886
9883
  // ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js
9887
9884
  var external_exports = {};
9888
9885
  __export(external_exports, {
@@ -13927,7 +13924,7 @@ var NEVER = INVALID;
13927
13924
  // ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.js
13928
13925
  var zod_default = external_exports;
13929
13926
 
13930
- // ../../packages/sigil/dist/chunk-H4U4Z4GM.js
13927
+ // ../../packages/sigil/dist/chunk-WYUGJOEB.js
13931
13928
  var SIGIL_COLOR = external_exports.enum([
13932
13929
  "purple",
13933
13930
  "blue",
@@ -13968,21 +13965,12 @@ var cssSigilColorUsageVariables = (prefix, usage) => cssVariables({
13968
13965
  [`--${prefix}-gradient-dark`]: usage.gradientDark
13969
13966
  });
13970
13967
  var cssHintColorVariables = (color) => cssSigilColorUsageVariables(`sigil-usage-hint`, sigilColorUsage(color));
13971
- var useRootHintVariables = (color) => {
13972
- useEffect18(() => {
13973
- const root = document.querySelector(".arcane-theme-root");
13974
- if (!root) return;
13975
- Object.entries(cssHintColorVariables(color)).forEach(([key, value]) => {
13976
- root.style.setProperty(key, value);
13977
- });
13978
- }, [color]);
13979
- };
13980
13968
  var cssVariables = (variables) => variables;
13981
13969
  function cnd(condition, truthyClassName, falseyClassName) {
13982
13970
  return condition ? truthyClassName : falseyClassName;
13983
13971
  }
13984
13972
 
13985
- // ../../packages/sigil/dist/chunk-XAK7WC3D.js
13973
+ // ../../packages/sigil/dist/chunk-E3VUC3Q4.js
13986
13974
  import {
13987
13975
  createContext as createContext6,
13988
13976
  forwardRef as forwardRef42,
@@ -14026,7 +14014,7 @@ var TRANSPARENCY_SVG = `
14026
14014
  `;
14027
14015
  var TRANSPARENCY_SVG_URI = `data:image/svg+xml,${encodeURIComponent(TRANSPARENCY_SVG)}`;
14028
14016
 
14029
- // ../../packages/sigil/dist/chunk-XAK7WC3D.js
14017
+ // ../../packages/sigil/dist/chunk-E3VUC3Q4.js
14030
14018
  import {
14031
14019
  forwardRef as forwardRef15
14032
14020
  } from "react";
@@ -14037,7 +14025,7 @@ import { forwardRef as forwardRef32 } from "react";
14037
14025
  import { jsx as jsx32 } from "react/jsx-runtime";
14038
14026
  import {
14039
14027
  useCallback as useCallback10,
14040
- useEffect as useEffect19,
14028
+ useEffect as useEffect18,
14041
14029
  useRef as useRef15
14042
14030
  } from "react";
14043
14031
  import { jsx as jsx42 } from "react/jsx-runtime";
@@ -14098,7 +14086,8 @@ var clsControlButton = ({
14098
14086
  active,
14099
14087
  touching,
14100
14088
  position,
14101
- className
14089
+ className,
14090
+ primary
14102
14091
  }) => cn(
14103
14092
  `sigil-control-button`,
14104
14093
  cnd(variant === "border", `sigil-control-button-variant-border`),
@@ -14110,6 +14099,7 @@ var clsControlButton = ({
14110
14099
  cnd(touching, `sigil-control-button-touching`),
14111
14100
  cnd(active, `sigil-control-button-active`),
14112
14101
  cnd(touching && active, `sigil-control-button-active-touching`),
14102
+ cnd(primary, `sigil-control-button-primary`),
14113
14103
  clsControlPosition(position),
14114
14104
  className
14115
14105
  );
@@ -14126,6 +14116,7 @@ var ControlButtonFrame = forwardRef15(
14126
14116
  title,
14127
14117
  tooltipSide,
14128
14118
  position,
14119
+ primary,
14129
14120
  ...props
14130
14121
  }, ref) => {
14131
14122
  const btn = /* @__PURE__ */ jsx17(
@@ -14140,6 +14131,7 @@ var ControlButtonFrame = forwardRef15(
14140
14131
  active,
14141
14132
  touching,
14142
14133
  position,
14134
+ primary,
14143
14135
  className
14144
14136
  }),
14145
14137
  children: /* @__PURE__ */ jsxs4("span", { children: [
@@ -14329,7 +14321,7 @@ var InputWithDelayedPropagation = ({
14329
14321
  }) => {
14330
14322
  const lastValue = useRef15(value);
14331
14323
  const inputRef = useRef15(null);
14332
- useEffect19(() => {
14324
+ useEffect18(() => {
14333
14325
  if (inputRef.current && inputRef.current.value !== value) {
14334
14326
  inputRef.current.value = value;
14335
14327
  }
@@ -14700,7 +14692,7 @@ import React52, { useMemo as useMemo11, useState as useState22 } from "react";
14700
14692
  import { jsx as jsx72, jsxs as jsxs42 } from "react/jsx-runtime";
14701
14693
  import React62 from "react";
14702
14694
  import { jsx as jsx82, jsxs as jsxs52 } from "react/jsx-runtime";
14703
- import React72, { useEffect as useEffect20 } from "react";
14695
+ import React72, { useEffect as useEffect19 } from "react";
14704
14696
  import { jsx as jsx92 } from "react/jsx-runtime";
14705
14697
  import React82, { useContext as useContext22, useEffect as useEffect23, useState as useState32 } from "react";
14706
14698
  import { jsx as jsx102, jsxs as jsxs6 } from "react/jsx-runtime";
@@ -15399,7 +15391,7 @@ var Tabs = (props) => {
15399
15391
  var TextInput = ({ className, info }) => {
15400
15392
  const { sendMessage } = React72.useContext(StageContext);
15401
15393
  const ref = React72.useRef(null);
15402
- useEffect20(() => {
15394
+ useEffect19(() => {
15403
15395
  if (ref.current && ref.current.value !== info.value) {
15404
15396
  ref.current.value = info.value;
15405
15397
  }
@@ -15532,7 +15524,7 @@ var CORE_FRONTEND_COMPONENT_RENDERER = {
15532
15524
  };
15533
15525
 
15534
15526
  // ../../packages/sigil/dist/frontend.js
15535
- import { useContext as useContext23, useEffect as useEffect21, useMemo as useMemo12, useState as useState21 } from "react";
15527
+ import { useContext as useContext23, useEffect as useEffect20, useMemo as useMemo12, useState as useState21 } from "react";
15536
15528
  import { createContext as createContext8, useContext as useContext7 } from "react";
15537
15529
  import { jsx as jsx19 } from "react/jsx-runtime";
15538
15530
  import { jsx as jsx25 } from "react/jsx-runtime";
@@ -15650,7 +15642,7 @@ var AppRoot = ({
15650
15642
  const { renderComponent, call } = useContext23(StageContext);
15651
15643
  const [logs, setLogs] = useState21({ lastLog: -1, logs: [] });
15652
15644
  const [debugMode, setDebugMode] = useState21(false);
15653
- useEffect21(() => {
15645
+ useEffect20(() => {
15654
15646
  if (!debugMode || !call) return;
15655
15647
  const lastLogId = logs.logs[logs.logs.length - 1]?.index ?? -1;
15656
15648
  call({
@@ -15911,7 +15903,12 @@ var OUTPUT_CONFIG = zod_default.object({
15911
15903
  var TOOLBOX_CONFIG = zod_default.object({
15912
15904
  inputs: zod_default.record(zod_default.string(), INPUT_CONFIG),
15913
15905
  generators: zod_default.record(zod_default.string(), GENERATOR_CONFIG),
15914
- outputs: zod_default.record(zod_default.string(), OUTPUT_CONFIG)
15906
+ outputs: zod_default.record(zod_default.string(), OUTPUT_CONFIG),
15907
+ /**
15908
+ * Hash of the license the user has agreed to.
15909
+ */
15910
+ agreedToLicense: zod_default.string().optional(),
15911
+ checkForUpdates: zod_default.boolean().optional().default(true)
15915
15912
  });
15916
15913
  var isTimecodeInstance = (instance) => instance !== null && "state" in instance && "metadata" in instance;
15917
15914
  var isTimecodeGroup = (instance) => instance !== null && "timecodes" in instance;
@@ -15920,89 +15917,13 @@ var isTimecodeToolboxComponent = (component) => component.namespace === NAMESPAC
15920
15917
 
15921
15918
  // src/components/frontend/toolbox/root.tsx
15922
15919
  import {
15923
- useCallback as useCallback18,
15924
- useContext as useContext13,
15925
- useEffect as useEffect30,
15920
+ useCallback as useCallback20,
15921
+ useContext as useContext16,
15922
+ useEffect as useEffect31,
15926
15923
  useMemo as useMemo15,
15927
- useState as useState29
15924
+ useState as useState31
15928
15925
  } from "react";
15929
15926
 
15930
- // src/components/frontend/toolbox/core/size-aware-div.tsx
15931
- import { useEffect as useEffect25, useState as useState23 } from "react";
15932
- import { jsx as jsx20 } from "react/jsx-runtime";
15933
- var SizeAwareDiv = ({
15934
- children,
15935
- style,
15936
- ...rest
15937
- }) => {
15938
- const [div, setDiv] = useState23(null);
15939
- const [rect, setRect] = useState23(null);
15940
- useEffect25(() => {
15941
- if (!div) {
15942
- return;
15943
- }
15944
- const resizeObserver = new ResizeObserver((entries) => {
15945
- for (const entry of entries) {
15946
- setRect(entry.contentRect);
15947
- }
15948
- });
15949
- resizeObserver.observe(div);
15950
- return () => {
15951
- resizeObserver.disconnect();
15952
- };
15953
- }, [div]);
15954
- return /* @__PURE__ */ jsx20(
15955
- "div",
15956
- {
15957
- ref: setDiv,
15958
- ...rest,
15959
- style: {
15960
- ...style,
15961
- ...rect && cssVariables({
15962
- "--size-aware-div-width": rect.width + "px",
15963
- "--size-aware-div-height": rect.height + "px"
15964
- })
15965
- },
15966
- children
15967
- }
15968
- );
15969
- };
15970
-
15971
- // src/components/frontend/toolbox/content.tsx
15972
- import { jsx as jsx21, jsxs as jsxs8 } from "react/jsx-runtime";
15973
- var ExternalLink = ({
15974
- href,
15975
- children
15976
- }) => {
15977
- const { openExternalLink } = useBrowserContext();
15978
- return /* @__PURE__ */ jsx21(
15979
- "a",
15980
- {
15981
- href,
15982
- target: "_blank",
15983
- rel: "noopener noreferrer",
15984
- onClick: (e) => {
15985
- e.preventDefault();
15986
- openExternalLink(href);
15987
- },
15988
- className: "\n text-sigil-usage-hint-foreground no-underline\n hover:underline\n ",
15989
- children
15990
- }
15991
- );
15992
- };
15993
- var NoToolboxChildren = ({ text }) => {
15994
- return /* @__PURE__ */ jsxs8(
15995
- SizeAwareDiv,
15996
- {
15997
- className: "\n flex grow flex-col items-center justify-center gap-1 bg-sigil-bg-light\n p-1 text-sigil-foreground-muted\n ",
15998
- children: [
15999
- /* @__PURE__ */ jsx21(Icon2, { icon: "handyman", className: "text-block-icon" }),
16000
- /* @__PURE__ */ jsx21("div", { className: "text-center", children: text })
16001
- ]
16002
- }
16003
- );
16004
- };
16005
-
16006
15927
  // ../../packages/artnet/dist/chunk-J2HDMITA.js
16007
15928
  var ARTNET_PORT = 6454;
16008
15929
  var TIMECODE_FPS = {
@@ -16018,6 +15939,7 @@ var MS_FORMAT = new Intl.NumberFormat(void 0, {
16018
15939
  unit: "millisecond",
16019
15940
  maximumFractionDigits: 0
16020
15941
  });
15942
+ var SOURCE_CODE_URL = "https://github.com/ArcaneWizards/open-source/tree/main/apps/timecode-toolbox";
16021
15943
  var STRINGS = {
16022
15944
  title: "Timecode Toolbox",
16023
15945
  debugger: "Debug Tools & Log",
@@ -16026,6 +15948,10 @@ var STRINGS = {
16026
15948
  openInNewWindow: "Open in new window",
16027
15949
  toggle: (text) => `Toggle ${text}`,
16028
15950
  close: (text) => `Close ${text}`,
15951
+ license: "License & About",
15952
+ acceptLicense: "Accept License",
15953
+ licensePrompt: "Please review and accept the license to use Timecode Toolbox",
15954
+ sourceCode: "Source Code",
16029
15955
  protocols: {
16030
15956
  artnet: {
16031
15957
  short: "ArtNet",
@@ -16085,6 +16011,17 @@ var STRINGS = {
16085
16011
  },
16086
16012
  errors: {
16087
16013
  unknownTimecodeID: "Unknown timecode ID, please close the window"
16014
+ },
16015
+ updates: {
16016
+ updateAvailable: (current, latest) => `Version ${latest} is available! You are currently on version ${current}.`,
16017
+ download: "Download",
16018
+ settingsLabel: "Automatically check for updates",
16019
+ settingsDetails: `When enabled, the app will automatically check for updates periodically and display a message when a new version is available.`,
16020
+ lastChecked: (time) => `Last checked: ${time}`
16021
+ },
16022
+ general: {
16023
+ enabled: "Enabled",
16024
+ disabled: "Disabled"
16088
16025
  }
16089
16026
  };
16090
16027
 
@@ -16092,29 +16029,29 @@ var STRINGS = {
16092
16029
  import {
16093
16030
  useCallback as useCallback14,
16094
16031
  useContext as useContext10,
16095
- useEffect as useEffect27,
16032
+ useEffect as useEffect26,
16096
16033
  useMemo as useMemo14,
16097
16034
  useState as useState25
16098
16035
  } from "react";
16099
16036
 
16100
16037
  // src/components/frontend/toolbox/util.tsx
16101
- import { jsx as jsx26, jsxs as jsxs9 } from "react/jsx-runtime";
16038
+ import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
16102
16039
  var PrimaryToolboxSection = ({
16103
16040
  title,
16104
16041
  children,
16105
16042
  buttons
16106
16043
  }) => {
16107
- return /* @__PURE__ */ jsxs9("div", { className: "flex grow gap-px", children: [
16108
- /* @__PURE__ */ jsx26(
16044
+ return /* @__PURE__ */ jsxs8("div", { className: "flex grow gap-px", children: [
16045
+ /* @__PURE__ */ jsx20(
16109
16046
  "div",
16110
16047
  {
16111
16048
  className: "\n flex items-center justify-center bg-sigil-bg-light p-1\n writing-mode-vertical-rl\n ",
16112
16049
  children: title
16113
16050
  }
16114
16051
  ),
16115
- /* @__PURE__ */ jsxs9("div", { className: "flex grow flex-col gap-px", children: [
16116
- /* @__PURE__ */ jsx26("div", { className: "flex grow flex-col gap-px", children }),
16117
- /* @__PURE__ */ jsx26("div", { className: "flex w-full flex-wrap gap-1 bg-sigil-bg-light p-1", children: buttons })
16052
+ /* @__PURE__ */ jsxs8("div", { className: "flex grow flex-col gap-px", children: [
16053
+ /* @__PURE__ */ jsx20("div", { className: "flex grow flex-col gap-px", children }),
16054
+ /* @__PURE__ */ jsx20("div", { className: "flex w-full flex-wrap gap-1 bg-sigil-bg-light p-1", children: buttons })
16118
16055
  ] })
16119
16056
  ] });
16120
16057
  };
@@ -16170,11 +16107,52 @@ var NetworkContext = createContext9(
16170
16107
  import {
16171
16108
  useCallback as useCallback13,
16172
16109
  useContext as useContext9,
16173
- useEffect as useEffect26,
16110
+ useEffect as useEffect25,
16174
16111
  useMemo as useMemo13,
16175
16112
  useState as useState24
16176
16113
  } from "react";
16177
16114
 
16115
+ // src/components/frontend/toolbox/core/size-aware-div.tsx
16116
+ import { useEffect as useEffect21, useState as useState23 } from "react";
16117
+ import { jsx as jsx21 } from "react/jsx-runtime";
16118
+ var SizeAwareDiv = ({
16119
+ children,
16120
+ style,
16121
+ ...rest
16122
+ }) => {
16123
+ const [div, setDiv] = useState23(null);
16124
+ const [rect, setRect] = useState23(null);
16125
+ useEffect21(() => {
16126
+ if (!div) {
16127
+ return;
16128
+ }
16129
+ const resizeObserver = new ResizeObserver((entries) => {
16130
+ for (const entry of entries) {
16131
+ setRect(entry.contentRect);
16132
+ }
16133
+ });
16134
+ resizeObserver.observe(div);
16135
+ return () => {
16136
+ resizeObserver.disconnect();
16137
+ };
16138
+ }, [div]);
16139
+ return /* @__PURE__ */ jsx21(
16140
+ "div",
16141
+ {
16142
+ ref: setDiv,
16143
+ ...rest,
16144
+ style: {
16145
+ ...style,
16146
+ ...rect && cssVariables({
16147
+ "--size-aware-div-width": rect.width + "px",
16148
+ "--size-aware-div-height": rect.height + "px"
16149
+ })
16150
+ },
16151
+ children
16152
+ }
16153
+ );
16154
+ };
16155
+
16178
16156
  // src/tree.ts
16179
16157
  var isTreeNode = (node) => "children" in node && typeof node.children === "object" && node.children !== null;
16180
16158
  var getTreeValue = (current, path) => {
@@ -16280,14 +16258,14 @@ var augmentUpstreamTimecodeWithOutputMetadata = (tc, config) => {
16280
16258
  };
16281
16259
 
16282
16260
  // src/components/frontend/toolbox/core/timecode-display.tsx
16283
- import { Fragment as Fragment8, jsx as jsx27, jsxs as jsxs10 } from "react/jsx-runtime";
16261
+ import { Fragment as Fragment8, jsx as jsx26, jsxs as jsxs9 } from "react/jsx-runtime";
16284
16262
  var ActiveTimecodeText = ({
16285
16263
  effectiveStartTimeMillis,
16286
16264
  speed
16287
16265
  }) => {
16288
16266
  const [millis, setMillis] = useState24(0);
16289
16267
  const { timeDifferenceMs } = useContext9(StageContext);
16290
- useEffect26(() => {
16268
+ useEffect25(() => {
16291
16269
  let animationFrame = null;
16292
16270
  const updateMillis = () => {
16293
16271
  const newMillis = (Date.now() - (timeDifferenceMs ?? 0) - effectiveStartTimeMillis) * speed;
@@ -16306,7 +16284,7 @@ var ActiveTimecodeText = ({
16306
16284
  var Timeline2 = ({ state, totalTime }) => {
16307
16285
  const [millis, setMillis] = useState24(0);
16308
16286
  const { timeDifferenceMs } = useContext9(StageContext);
16309
- useEffect26(() => {
16287
+ useEffect25(() => {
16310
16288
  if (state.state === "none") {
16311
16289
  setMillis(0);
16312
16290
  return;
@@ -16328,7 +16306,7 @@ var Timeline2 = ({ state, totalTime }) => {
16328
16306
  }
16329
16307
  };
16330
16308
  }, [state, timeDifferenceMs]);
16331
- return /* @__PURE__ */ jsx27("div", { className: "w-full border border-timecode-usage-foreground p-px", children: /* @__PURE__ */ jsx27("div", { className: "relative h-1 w-full overflow-hidden", children: /* @__PURE__ */ jsx27(
16309
+ return /* @__PURE__ */ jsx26("div", { className: "w-full border border-timecode-usage-foreground p-px", children: /* @__PURE__ */ jsx26("div", { className: "relative h-1 w-full overflow-hidden", children: /* @__PURE__ */ jsx26(
16332
16310
  "div",
16333
16311
  {
16334
16312
  className: "absolute inset-y-0 left-0 bg-timecode-usage-foreground",
@@ -16380,8 +16358,8 @@ var TimecodeDisplay = ({
16380
16358
  }
16381
16359
  }
16382
16360
  }, [hooks, play, pause, state.state]);
16383
- return /* @__PURE__ */ jsxs10("div", { className: "flex grow flex-col gap-px", children: [
16384
- /* @__PURE__ */ jsxs10(
16361
+ return /* @__PURE__ */ jsxs9("div", { className: "flex grow flex-col gap-px", children: [
16362
+ /* @__PURE__ */ jsxs9(
16385
16363
  "div",
16386
16364
  {
16387
16365
  className: cn(
@@ -16393,8 +16371,8 @@ var TimecodeDisplay = ({
16393
16371
  )
16394
16372
  ),
16395
16373
  children: [
16396
- headerComponents && /* @__PURE__ */ jsx27("div", { className: "flex flex-wrap gap-0.25", children: headerComponents }),
16397
- /* @__PURE__ */ jsx27(
16374
+ headerComponents && /* @__PURE__ */ jsx26("div", { className: "flex flex-wrap gap-0.25", children: headerComponents }),
16375
+ /* @__PURE__ */ jsx26(
16398
16376
  SizeAwareDiv,
16399
16377
  {
16400
16378
  className: cn(
@@ -16409,7 +16387,7 @@ var TimecodeDisplay = ({
16409
16387
  )
16410
16388
  ),
16411
16389
  onClick: toggle,
16412
- children: /* @__PURE__ */ jsx27("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx27("span", { className: cn("font-mono text-timecode-adaptive"), children: state.state === "none" ? "--:--:--:---" : state.state === "stopped" ? displayMillis(state.positionMillis) : /* @__PURE__ */ jsx27(
16390
+ children: /* @__PURE__ */ jsx26("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx26("span", { className: cn("font-mono text-timecode-adaptive"), children: state.state === "none" ? "--:--:--:---" : state.state === "stopped" ? displayMillis(state.positionMillis) : /* @__PURE__ */ jsx26(
16413
16391
  ActiveTimecodeText,
16414
16392
  {
16415
16393
  effectiveStartTimeMillis: state.effectiveStartTimeMillis,
@@ -16418,8 +16396,8 @@ var TimecodeDisplay = ({
16418
16396
  ) }) })
16419
16397
  }
16420
16398
  ),
16421
- hooks?.pause || hooks?.play ? /* @__PURE__ */ jsxs10("div", { className: "flex justify-center gap-px", children: [
16422
- hooks.beginning && /* @__PURE__ */ jsx27(
16399
+ hooks?.pause || hooks?.play ? /* @__PURE__ */ jsxs9("div", { className: "flex justify-center gap-px", children: [
16400
+ hooks.beginning && /* @__PURE__ */ jsx26(
16423
16401
  ControlButton,
16424
16402
  {
16425
16403
  onClick: beginning,
@@ -16430,7 +16408,7 @@ var TimecodeDisplay = ({
16430
16408
  className: "text-timecode-usage-foreground!"
16431
16409
  }
16432
16410
  ),
16433
- hooks.seekRelative && /* @__PURE__ */ jsx27(
16411
+ hooks.seekRelative && /* @__PURE__ */ jsx26(
16434
16412
  ControlButton,
16435
16413
  {
16436
16414
  onClick: back5seconds,
@@ -16441,7 +16419,7 @@ var TimecodeDisplay = ({
16441
16419
  className: "text-timecode-usage-foreground!"
16442
16420
  }
16443
16421
  ),
16444
- state.state === "none" || state.state === "stopped" ? /* @__PURE__ */ jsx27(
16422
+ state.state === "none" || state.state === "stopped" ? /* @__PURE__ */ jsx26(
16445
16423
  ControlButton,
16446
16424
  {
16447
16425
  onClick: play,
@@ -16451,7 +16429,7 @@ var TimecodeDisplay = ({
16451
16429
  title: STRINGS.controls.play,
16452
16430
  className: "text-timecode-usage-foreground!"
16453
16431
  }
16454
- ) : /* @__PURE__ */ jsx27(
16432
+ ) : /* @__PURE__ */ jsx26(
16455
16433
  ControlButton,
16456
16434
  {
16457
16435
  onClick: pause,
@@ -16462,7 +16440,7 @@ var TimecodeDisplay = ({
16462
16440
  className: "text-timecode-usage-foreground!"
16463
16441
  }
16464
16442
  ),
16465
- hooks.seekRelative && /* @__PURE__ */ jsx27(
16443
+ hooks.seekRelative && /* @__PURE__ */ jsx26(
16466
16444
  ControlButton,
16467
16445
  {
16468
16446
  onClick: forward5seconds,
@@ -16474,33 +16452,33 @@ var TimecodeDisplay = ({
16474
16452
  }
16475
16453
  )
16476
16454
  ] }) : null,
16477
- metadata?.totalTime && /* @__PURE__ */ jsx27(Timeline2, { state, totalTime: metadata.totalTime })
16455
+ metadata?.totalTime && /* @__PURE__ */ jsx26(Timeline2, { state, totalTime: metadata.totalTime })
16478
16456
  ]
16479
16457
  }
16480
16458
  ),
16481
- (state.smpteMode !== null || state.accuracyMillis !== null || config.delayMs !== null) && /* @__PURE__ */ jsxs10("div", { className: "flex gap-px", children: [
16482
- config.delayMs !== null && /* @__PURE__ */ jsx27("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.delay(config.delayMs) }),
16483
- state.smpteMode !== null && /* @__PURE__ */ jsx27("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.smtpeModes[state.smpteMode] }),
16484
- state.accuracyMillis !== null && /* @__PURE__ */ jsx27("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.accuracy(state.accuracyMillis) })
16459
+ (state.smpteMode !== null || state.accuracyMillis !== null || config.delayMs !== null) && /* @__PURE__ */ jsxs9("div", { className: "flex gap-px", children: [
16460
+ config.delayMs !== null && /* @__PURE__ */ jsx26("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.delay(config.delayMs) }),
16461
+ state.smpteMode !== null && /* @__PURE__ */ jsx26("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.smtpeModes[state.smpteMode] }),
16462
+ state.accuracyMillis !== null && /* @__PURE__ */ jsx26("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.accuracy(state.accuracyMillis) })
16485
16463
  ] }),
16486
- metadata?.artist || metadata?.title ? /* @__PURE__ */ jsx27(
16464
+ metadata?.artist || metadata?.title ? /* @__PURE__ */ jsx26(
16487
16465
  TooltipWrapper,
16488
16466
  {
16489
- tooltip: /* @__PURE__ */ jsxs10(Fragment8, { children: [
16490
- metadata.title && /* @__PURE__ */ jsxs10("div", { children: [
16491
- /* @__PURE__ */ jsx27("span", { className: "font-bold", children: "Title:" }),
16467
+ tooltip: /* @__PURE__ */ jsxs9(Fragment8, { children: [
16468
+ metadata.title && /* @__PURE__ */ jsxs9("div", { children: [
16469
+ /* @__PURE__ */ jsx26("span", { className: "font-bold", children: "Title:" }),
16492
16470
  " ",
16493
16471
  metadata.title
16494
16472
  ] }),
16495
- metadata.artist && /* @__PURE__ */ jsxs10("div", { children: [
16496
- /* @__PURE__ */ jsx27("span", { className: "font-bold", children: "Artist:" }),
16473
+ metadata.artist && /* @__PURE__ */ jsxs9("div", { children: [
16474
+ /* @__PURE__ */ jsx26("span", { className: "font-bold", children: "Artist:" }),
16497
16475
  " ",
16498
16476
  metadata.artist
16499
16477
  ] })
16500
16478
  ] }),
16501
- children: /* @__PURE__ */ jsxs10("div", { className: "flex gap-px", children: [
16502
- metadata.title && /* @__PURE__ */ jsx27("div", { className: "grow truncate bg-sigil-bg-light p-0.5 font-bold", children: metadata.title }),
16503
- metadata.artist && /* @__PURE__ */ jsx27("div", { className: "grow truncate bg-sigil-bg-light p-0.5", children: metadata.artist })
16479
+ children: /* @__PURE__ */ jsxs9("div", { className: "flex gap-px", children: [
16480
+ metadata.title && /* @__PURE__ */ jsx26("div", { className: "grow truncate bg-sigil-bg-light p-0.5 font-bold", children: metadata.title }),
16481
+ metadata.artist && /* @__PURE__ */ jsx26("div", { className: "grow truncate bg-sigil-bg-light p-0.5", children: metadata.artist })
16504
16482
  ] })
16505
16483
  }
16506
16484
  ) : null
@@ -16541,7 +16519,7 @@ var TimecodeTreeDisplay = ({
16541
16519
  }, [id, openNewWidow]);
16542
16520
  name = timecode?.name ? [...name, timecode.name] : name;
16543
16521
  if (isTimecodeGroup(timecode) && Object.values(timecode.timecodes).length) {
16544
- return Object.entries(timecode.timecodes).map(([key, child]) => /* @__PURE__ */ jsx27(
16522
+ return Object.entries(timecode.timecodes).map(([key, child]) => /* @__PURE__ */ jsx26(
16545
16523
  TimecodeTreeDisplay,
16546
16524
  {
16547
16525
  config,
@@ -16557,28 +16535,28 @@ var TimecodeTreeDisplay = ({
16557
16535
  key
16558
16536
  ));
16559
16537
  }
16560
- return /* @__PURE__ */ jsxs10(
16538
+ return /* @__PURE__ */ jsxs9(
16561
16539
  "div",
16562
16540
  {
16563
16541
  className: "relative flex grow flex-col text-timecode-usage-foreground",
16564
16542
  style: color && cssSigilColorUsageVariables("timecode-usage", sigilColorUsage(color)),
16565
16543
  children: [
16566
- /* @__PURE__ */ jsx27(
16544
+ /* @__PURE__ */ jsx26(
16567
16545
  TimecodeDisplay,
16568
16546
  {
16569
16547
  id,
16570
16548
  timecode: isTimecodeInstance(timecode) ? timecode : EMPTY_TIMECODE,
16571
16549
  config,
16572
- headerComponents: /* @__PURE__ */ jsxs10(Fragment8, { children: [
16573
- /* @__PURE__ */ jsxs10("div", { className: "flex grow items-start gap-0.25", children: [
16574
- /* @__PURE__ */ jsx27(
16550
+ headerComponents: /* @__PURE__ */ jsxs9(Fragment8, { children: [
16551
+ /* @__PURE__ */ jsxs9("div", { className: "flex grow items-start gap-0.25", children: [
16552
+ /* @__PURE__ */ jsx26(
16575
16553
  "div",
16576
16554
  {
16577
16555
  className: "\n m-0.25 rounded-md border border-sigil-bg-light\n bg-timecode-usage-foreground px-1 py-0.25 text-sigil-control\n text-timecode-usage-text\n ",
16578
16556
  children: type
16579
16557
  }
16580
16558
  ),
16581
- /* @__PURE__ */ jsx27(
16559
+ /* @__PURE__ */ jsx26(
16582
16560
  "div",
16583
16561
  {
16584
16562
  className: cn(
@@ -16589,8 +16567,8 @@ var TimecodeTreeDisplay = ({
16589
16567
  }
16590
16568
  )
16591
16569
  ] }),
16592
- /* @__PURE__ */ jsxs10(ControlButtonGroup, { className: "rounded-md bg-sigil-bg-light", children: [
16593
- /* @__PURE__ */ jsx27(
16570
+ /* @__PURE__ */ jsxs9(ControlButtonGroup, { className: "rounded-md bg-sigil-bg-light", children: [
16571
+ /* @__PURE__ */ jsx26(
16594
16572
  ControlButton,
16595
16573
  {
16596
16574
  variant: "toolbar",
@@ -16604,12 +16582,12 @@ var TimecodeTreeDisplay = ({
16604
16582
  ] })
16605
16583
  }
16606
16584
  ),
16607
- assignToOutput && id && !isOutputInstanceId(id) && /* @__PURE__ */ jsx27(
16585
+ assignToOutput && id && !isOutputInstanceId(id) && /* @__PURE__ */ jsx26(
16608
16586
  SizeAwareDiv,
16609
16587
  {
16610
16588
  className: "\n absolute inset-0 flex cursor-pointer items-center justify-center\n bg-timecode-backdrop text-timecode-usage-text\n hover:bg-timecode-backdrop-hover\n ",
16611
16589
  onClick: () => assignToOutput(id),
16612
- children: /* @__PURE__ */ jsx27(Icon2, { icon: "link", className: "text-block-icon" })
16590
+ children: /* @__PURE__ */ jsx26(Icon2, { icon: "link", className: "text-block-icon" })
16613
16591
  }
16614
16592
  )
16615
16593
  ]
@@ -16675,22 +16653,22 @@ var FullscreenTimecodeDisplay = ({
16675
16653
  }
16676
16654
  }, [id, config]);
16677
16655
  if (!instanceConfig) {
16678
- return /* @__PURE__ */ jsxs10(
16656
+ return /* @__PURE__ */ jsxs9(
16679
16657
  SizeAwareDiv,
16680
16658
  {
16681
16659
  className: "\n flex grow flex-col items-center justify-center gap-1 bg-sigil-bg-light\n p-1 text-sigil-foreground-muted\n ",
16682
16660
  children: [
16683
- /* @__PURE__ */ jsx27(Icon2, { icon: "question_mark", className: "text-block-icon" }),
16684
- /* @__PURE__ */ jsx27("div", { className: "text-center", children: STRINGS.errors.unknownTimecodeID })
16661
+ /* @__PURE__ */ jsx26(Icon2, { icon: "question_mark", className: "text-block-icon" }),
16662
+ /* @__PURE__ */ jsx26("div", { className: "text-center", children: STRINGS.errors.unknownTimecodeID })
16685
16663
  ]
16686
16664
  }
16687
16665
  );
16688
16666
  }
16689
- return /* @__PURE__ */ jsx27(
16667
+ return /* @__PURE__ */ jsx26(
16690
16668
  "div",
16691
16669
  {
16692
16670
  className: "\n flex h-0 grow flex-col gap-px overflow-y-auto bg-sigil-border\n scrollbar-sigil\n ",
16693
- children: /* @__PURE__ */ jsx27(
16671
+ children: /* @__PURE__ */ jsx26(
16694
16672
  TimecodeTreeDisplay,
16695
16673
  {
16696
16674
  id,
@@ -16755,6 +16733,54 @@ function v4(options, buf, offset4) {
16755
16733
  }
16756
16734
  var v4_default = v4;
16757
16735
 
16736
+ // src/components/frontend/toolbox/content.tsx
16737
+ import { jsx as jsx27, jsxs as jsxs10 } from "react/jsx-runtime";
16738
+ var ExternalLink = ({
16739
+ href,
16740
+ children
16741
+ }) => {
16742
+ const { openExternalLink } = useBrowserContext();
16743
+ return /* @__PURE__ */ jsx27(
16744
+ "a",
16745
+ {
16746
+ href,
16747
+ target: "_blank",
16748
+ rel: "noopener noreferrer",
16749
+ onClick: (e) => {
16750
+ e.preventDefault();
16751
+ openExternalLink(href);
16752
+ },
16753
+ className: "\n text-sigil-usage-hint-foreground no-underline\n hover:underline\n ",
16754
+ children
16755
+ }
16756
+ );
16757
+ };
16758
+ var TextButton = ({
16759
+ onClick,
16760
+ children
16761
+ }) => {
16762
+ return /* @__PURE__ */ jsx27(
16763
+ "span",
16764
+ {
16765
+ onClick,
16766
+ className: "\n cursor-pointer text-sigil-usage-hint-foreground\n hover:underline\n ",
16767
+ children
16768
+ }
16769
+ );
16770
+ };
16771
+ var NoToolboxChildren = ({ text }) => {
16772
+ return /* @__PURE__ */ jsxs10(
16773
+ SizeAwareDiv,
16774
+ {
16775
+ className: "\n flex grow flex-col items-center justify-center gap-1 bg-sigil-bg-light\n p-1 text-sigil-foreground-muted\n ",
16776
+ children: [
16777
+ /* @__PURE__ */ jsx27(Icon2, { icon: "handyman", className: "text-block-icon" }),
16778
+ /* @__PURE__ */ jsx27("div", { className: "text-center", children: text })
16779
+ ]
16780
+ }
16781
+ );
16782
+ };
16783
+
16758
16784
  // src/components/frontend/toolbox/outputs.tsx
16759
16785
  import { Fragment as Fragment9, jsx as jsx28, jsxs as jsxs11 } from "react/jsx-runtime";
16760
16786
  var DmxConnectionSettings = ({
@@ -16768,7 +16794,7 @@ var DmxConnectionSettings = ({
16768
16794
  setInterfaces(null);
16769
16795
  getNetworkInterfaces().then((ifs) => setInterfaces(ifs));
16770
16796
  }, [getNetworkInterfaces]);
16771
- useEffect27(() => {
16797
+ useEffect26(() => {
16772
16798
  refreshInterfaces();
16773
16799
  }, [refreshInterfaces]);
16774
16800
  if (data.type !== "artnet") {
@@ -17474,7 +17500,7 @@ var GeneratorsSection = ({
17474
17500
  };
17475
17501
 
17476
17502
  // src/components/frontend/toolbox/inputs.tsx
17477
- import { useCallback as useCallback16, useContext as useContext12, useEffect as useEffect28, useState as useState27 } from "react";
17503
+ import { useCallback as useCallback16, useContext as useContext12, useEffect as useEffect27, useState as useState27 } from "react";
17478
17504
  import { Fragment as Fragment11, jsx as jsx30, jsxs as jsxs13 } from "react/jsx-runtime";
17479
17505
  var DmxConnectionSettings2 = ({
17480
17506
  data,
@@ -17487,7 +17513,7 @@ var DmxConnectionSettings2 = ({
17487
17513
  setInterfaces(null);
17488
17514
  getNetworkInterfaces().then((ifs) => setInterfaces(ifs));
17489
17515
  }, [getNetworkInterfaces]);
17490
- useEffect28(() => {
17516
+ useEffect27(() => {
17491
17517
  refreshInterfaces();
17492
17518
  }, [refreshInterfaces]);
17493
17519
  if (data.type !== "artnet") {
@@ -17560,7 +17586,7 @@ var TCNetConnectionSettings = ({
17560
17586
  setInterfaces(null);
17561
17587
  getNetworkInterfaces().then((ifs) => setInterfaces(ifs));
17562
17588
  }, [getNetworkInterfaces]);
17563
- useEffect28(() => {
17589
+ useEffect27(() => {
17564
17590
  refreshInterfaces();
17565
17591
  }, [refreshInterfaces]);
17566
17592
  if (data.type !== "tcnet") {
@@ -17946,6 +17972,9 @@ var diffJson = (a, b) => {
17946
17972
  return { type: "value", after: b };
17947
17973
  };
17948
17974
 
17975
+ // src/components/frontend/toolbox/settings.tsx
17976
+ import { useContext as useContext13 } from "react";
17977
+
17949
17978
  // ../../packages/sigil/dist/frontend/appearance.js
17950
17979
  import { useCallback as useCallback17 } from "react";
17951
17980
  import { jsx as jsx31, jsxs as jsxs14 } from "react/jsx-runtime";
@@ -18023,7 +18052,7 @@ var AppearanceSwitcher = ({
18023
18052
  };
18024
18053
 
18025
18054
  // ../../packages/sigil/dist/frontend/preferences.js
18026
- import { useEffect as useEffect29, useState as useState28 } from "react";
18055
+ import { useEffect as useEffect28, useState as useState28 } from "react";
18027
18056
  var createBrowserPreferencesHook = (def) => () => {
18028
18057
  const [preferences, setPreference] = useState28(() => {
18029
18058
  const stored = window.localStorage.getItem(def.key);
@@ -18046,7 +18075,7 @@ var createBrowserPreferencesHook = (def) => () => {
18046
18075
  })
18047
18076
  );
18048
18077
  };
18049
- useEffect29(() => {
18078
+ useEffect28(() => {
18050
18079
  const onStorageChange = (event) => {
18051
18080
  if (event.key === def.key) {
18052
18081
  const newValue = event.newValue;
@@ -18090,8 +18119,17 @@ var useBrowserPreferences = createBrowserPreferencesHook(TOOLBOX_PREFERENCES);
18090
18119
 
18091
18120
  // src/components/frontend/toolbox/settings.tsx
18092
18121
  import { jsx as jsx35, jsxs as jsxs15 } from "react/jsx-runtime";
18122
+ var ENABLED_DISABLED_OPTIONS = [
18123
+ { value: "enabled", label: STRINGS.general.enabled },
18124
+ { value: "disabled", label: STRINGS.general.disabled }
18125
+ ];
18126
+ var DATE_FORMATTER = new Intl.DateTimeFormat(void 0, {
18127
+ timeStyle: "medium"
18128
+ });
18093
18129
  var Settings = ({ setWindowMode }) => {
18094
18130
  const { preferences, updateBrowserPrefs } = useBrowserPreferences();
18131
+ const { config, updateConfig } = useContext13(ConfigContext);
18132
+ const { updates } = useApplicationState();
18095
18133
  return /* @__PURE__ */ jsxs15("div", { className: "flex grow flex-col", children: [
18096
18134
  /* @__PURE__ */ jsx35(ToolbarWrapper, { children: /* @__PURE__ */ jsxs15(ToolbarRow, { children: [
18097
18135
  /* @__PURE__ */ jsx35("span", { className: "grow p-1", children: STRINGS.settings.title }),
@@ -18118,26 +18156,607 @@ var Settings = ({ setWindowMode }) => {
18118
18156
  color: preferences.color,
18119
18157
  onColorChange: (color) => updateBrowserPrefs((current) => ({ ...current, color }))
18120
18158
  }
18121
- )
18159
+ ),
18160
+ /* @__PURE__ */ jsx35(ControlLabel, { children: STRINGS.updates.settingsLabel }),
18161
+ /* @__PURE__ */ jsx35(
18162
+ ControlSelect,
18163
+ {
18164
+ value: config.checkForUpdates ? "enabled" : "disabled",
18165
+ options: ENABLED_DISABLED_OPTIONS,
18166
+ onChange: (value) => updateConfig((current) => ({
18167
+ ...current,
18168
+ checkForUpdates: value === "enabled"
18169
+ })),
18170
+ variant: "large"
18171
+ }
18172
+ ),
18173
+ /* @__PURE__ */ jsx35(ControlDetails, { children: STRINGS.updates.settingsDetails }),
18174
+ updates && "lastCheckedMillis" in updates && /* @__PURE__ */ jsx35(ControlDetails, { children: STRINGS.updates.lastChecked(
18175
+ DATE_FORMATTER.format(updates.lastCheckedMillis)
18176
+ ) })
18122
18177
  ] })
18123
18178
  }
18124
18179
  )
18125
18180
  ] });
18126
18181
  };
18127
18182
 
18128
- // src/components/frontend/toolbox/root.tsx
18129
- import { Fragment as Fragment12, jsx as jsx36, jsxs as jsxs16 } from "react/jsx-runtime";
18130
- var ToolboxRoot = ({ info }) => {
18131
- const [windowMode, setWindowMode] = useState29(
18132
- null
18183
+ // src/components/frontend/toolbox/license.tsx
18184
+ import { useCallback as useCallback18, useContext as useContext15 } from "react";
18185
+
18186
+ // src/components/frontend/toolbox/logo.tsx
18187
+ import { jsx as jsx36, jsxs as jsxs16 } from "react/jsx-runtime";
18188
+ var TimecodeToolboxLogo = (props) => /* @__PURE__ */ jsxs16(
18189
+ "svg",
18190
+ {
18191
+ xmlns: "http://www.w3.org/2000/svg",
18192
+ viewBox: "0 0 1365.333 1365.333",
18193
+ ...props,
18194
+ children: [
18195
+ /* @__PURE__ */ jsxs16("defs", { children: [
18196
+ /* @__PURE__ */ jsx36("mask", { id: "b", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18197
+ "path",
18198
+ {
18199
+ fill: "#fff",
18200
+ "stroke-linecap": "round",
18201
+ "stroke-linejoin": "round",
18202
+ "stroke-width": "50.12",
18203
+ d: "m347.83 438.376 11.825 188.138-36.885 62.692v411.759h986.987v-411.76l-36.886-62.691 11.825-188.138z"
18204
+ }
18205
+ ) }),
18206
+ /* @__PURE__ */ jsx36("mask", { id: "g", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18207
+ "path",
18208
+ {
18209
+ fill: "#fff",
18210
+ "stroke-linecap": "round",
18211
+ "stroke-linejoin": "round",
18212
+ "stroke-width": "5.581",
18213
+ d: "m523.18 899.13 300.24-394.065s34.365-35.915 46.091-69.549c11.727-33.634.988-72.204-2.46-104.403-5.358-50.016 59.283-109.877 59.283-109.877s69.906-48.692 76.993-40.385-46.397 95.284-39.707 122.272c10.605 42.782 80.61 74.691 115.162 58.516s54.191-119.781 68.45-123.27c14.259-3.49 31.217 85.629 29.104 137.042s-52.322 83.478-83.625 93.094-71.227 10.846-102.507 35.2-361.42 471.203-361.42 471.203z"
18214
+ }
18215
+ ) }),
18216
+ /* @__PURE__ */ jsx36("mask", { id: "f", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18217
+ "path",
18218
+ {
18219
+ fill: "#fff",
18220
+ "stroke-linecap": "round",
18221
+ "stroke-linejoin": "round",
18222
+ "stroke-width": "5.581",
18223
+ d: "m523.18 899.13 300.24-394.065s34.365-35.915 46.091-69.549c11.727-33.634.988-72.204-2.46-104.403-5.358-50.016 59.283-109.877 59.283-109.877s69.906-48.692 76.993-40.385-46.397 95.284-39.707 122.272c10.605 42.782 80.61 74.691 115.162 58.516s54.191-119.781 68.45-123.27c14.259-3.49 31.217 85.629 29.104 137.042s-52.322 83.478-83.625 93.094-71.227 10.846-102.507 35.2-361.42 471.203-361.42 471.203z"
18224
+ }
18225
+ ) }),
18226
+ /* @__PURE__ */ jsx36("mask", { id: "e", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18227
+ "path",
18228
+ {
18229
+ fill: "#fff",
18230
+ "stroke-linecap": "round",
18231
+ "stroke-linejoin": "round",
18232
+ "stroke-width": "5.581",
18233
+ d: "m523.18 899.13 300.24-394.065s34.365-35.915 46.091-69.549c11.727-33.634.988-72.204-2.46-104.403-5.358-50.016 59.283-109.877 59.283-109.877s69.906-48.692 76.993-40.385-46.397 95.284-39.707 122.272c10.605 42.782 80.61 74.691 115.162 58.516s54.191-119.781 68.45-123.27c14.259-3.49 31.217 85.629 29.104 137.042s-52.322 83.478-83.625 93.094-71.227 10.846-102.507 35.2-361.42 471.203-361.42 471.203z"
18234
+ }
18235
+ ) }),
18236
+ /* @__PURE__ */ jsx36("mask", { id: "d", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18237
+ "path",
18238
+ {
18239
+ fill: "#fff",
18240
+ "stroke-linecap": "round",
18241
+ "stroke-linejoin": "round",
18242
+ "stroke-width": "5.581",
18243
+ d: "m523.18 899.13 300.24-394.065s34.365-35.915 46.091-69.549c11.727-33.634.988-72.204-2.46-104.403-5.358-50.016 59.283-109.877 59.283-109.877s69.906-48.692 76.993-40.385-46.397 95.284-39.707 122.272c10.605 42.782 80.61 74.691 115.162 58.516s54.191-119.781 68.45-123.27c14.259-3.49 31.217 85.629 29.104 137.042s-52.322 83.478-83.625 93.094-71.227 10.846-102.507 35.2-361.42 471.203-361.42 471.203z"
18244
+ }
18245
+ ) }),
18246
+ /* @__PURE__ */ jsx36("mask", { id: "c", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18247
+ "path",
18248
+ {
18249
+ fill: "#fff",
18250
+ "stroke-linecap": "round",
18251
+ "stroke-linejoin": "round",
18252
+ "stroke-width": "5.581",
18253
+ d: "m523.18 899.13 300.24-394.065s34.365-35.915 46.091-69.549c11.727-33.634.988-72.204-2.46-104.403-5.358-50.016 59.283-109.877 59.283-109.877s69.906-48.692 76.993-40.385-46.397 95.284-39.707 122.272c10.605 42.782 80.61 74.691 115.162 58.516s54.191-119.781 68.45-123.27c14.259-3.49 31.217 85.629 29.104 137.042s-52.322 83.478-83.625 93.094-71.227 10.846-102.507 35.2-361.42 471.203-361.42 471.203z"
18254
+ }
18255
+ ) }),
18256
+ /* @__PURE__ */ jsx36("mask", { id: "k", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18257
+ "path",
18258
+ {
18259
+ fill: "#fff",
18260
+ "stroke-linecap": "round",
18261
+ "stroke-linejoin": "round",
18262
+ "stroke-width": "7.033",
18263
+ d: "m209.947 266.846 76.909 154.59 31.315-12.212 281.763 384.488 39.973-29.294-281.646-384.327 21.561-26.783-124.246-119.9Z"
18264
+ }
18265
+ ) }),
18266
+ /* @__PURE__ */ jsx36("mask", { id: "j", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18267
+ "path",
18268
+ {
18269
+ fill: "#fff",
18270
+ "stroke-linecap": "round",
18271
+ "stroke-linejoin": "round",
18272
+ "stroke-width": "7.033",
18273
+ d: "m209.947 266.846 76.909 154.59 31.315-12.212 281.763 384.488 39.973-29.294-281.646-384.327 21.561-26.783-124.246-119.9Z"
18274
+ }
18275
+ ) }),
18276
+ /* @__PURE__ */ jsx36("mask", { id: "i", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18277
+ "path",
18278
+ {
18279
+ fill: "#fff",
18280
+ "stroke-linecap": "round",
18281
+ "stroke-linejoin": "round",
18282
+ "stroke-width": "7.033",
18283
+ d: "m209.947 266.846 76.909 154.59 31.315-12.212 281.763 384.488 39.973-29.294-281.646-384.327 21.561-26.783-124.246-119.9Z"
18284
+ }
18285
+ ) }),
18286
+ /* @__PURE__ */ jsx36("mask", { id: "h", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ jsx36(
18287
+ "path",
18288
+ {
18289
+ fill: "#fff",
18290
+ "stroke-linecap": "round",
18291
+ "stroke-linejoin": "round",
18292
+ "stroke-width": "7.033",
18293
+ d: "m209.947 266.846 76.909 154.59 31.315-12.212 281.763 384.488 39.973-29.294-281.646-384.327 21.561-26.783-124.246-119.9Z"
18294
+ }
18295
+ ) }),
18296
+ /* @__PURE__ */ jsx36(
18297
+ "filter",
18298
+ {
18299
+ id: "a",
18300
+ width: "1.201",
18301
+ height: "1.19",
18302
+ x: "-.101",
18303
+ y: "-.074",
18304
+ "color-interpolation-filters": "sRGB",
18305
+ children: /* @__PURE__ */ jsx36("feGaussianBlur", { stdDeviation: "10.298" })
18306
+ }
18307
+ )
18308
+ ] }),
18309
+ /* @__PURE__ */ jsxs16(
18310
+ "g",
18311
+ {
18312
+ stroke: "#000",
18313
+ "stroke-linecap": "round",
18314
+ "stroke-linejoin": "round",
18315
+ filter: "url(#a)",
18316
+ opacity: ".25",
18317
+ transform: "translate(-216.03 -84.295)scale(1.10099)",
18318
+ children: [
18319
+ /* @__PURE__ */ jsx36(
18320
+ "path",
18321
+ {
18322
+ "stroke-width": "153.76517303999998",
18323
+ d: "m337.226 438.886 12.093 192.397-37.72 64.11v421.08h1009.328v-421.08l-37.72-64.11 12.093-192.397z",
18324
+ opacity: "1"
18325
+ }
18326
+ ),
18327
+ /* @__PURE__ */ jsx36(
18328
+ "path",
18329
+ {
18330
+ "stroke-width": "80.096",
18331
+ d: "m671.405 893.22 272.7-357.92s31.213-32.62 41.864-63.169.898-65.581-2.235-94.827c-4.866-45.427 53.846-99.798 53.846-99.798s63.494-44.226 69.93-36.68-42.14 86.544-36.064 111.056c9.632 38.858 73.216 67.84 104.599 53.149 31.382-14.691 49.22-108.795 62.171-111.964s28.353 77.775 26.435 124.473-47.523 75.82-75.955 84.554-64.694 9.851-93.104 31.972c-28.41 22.12-328.269 427.981-328.269 427.981z"
18332
+ }
18333
+ ),
18334
+ /* @__PURE__ */ jsx36(
18335
+ "path",
18336
+ {
18337
+ "stroke-width": "80.096",
18338
+ d: "m386.903 318.933 69.855 140.41 28.443-11.092 255.918 349.22 36.307-26.606L521.614 421.79l19.583-24.326-112.85-108.903z"
18339
+ }
18340
+ )
18341
+ ]
18342
+ }
18343
+ ),
18344
+ /* @__PURE__ */ jsxs16("g", { stroke: "#fff", "stroke-linecap": "round", "stroke-linejoin": "round", children: [
18345
+ /* @__PURE__ */ jsx36(
18346
+ "path",
18347
+ {
18348
+ fill: "#8c63d9",
18349
+ "stroke-width": "165.54595738999998",
18350
+ d: "m166.927 398.352 13.02 207.137-40.611 69.024v453.341h1086.661V674.513l-40.61-69.024 13.02-207.137H424.595Z"
18351
+ }
18352
+ ),
18353
+ /* @__PURE__ */ jsx36(
18354
+ "path",
18355
+ {
18356
+ fill: "none",
18357
+ "stroke-width": "73.48667853999999",
18358
+ d: "m209.947 266.846 76.909 154.59 31.315-12.212 281.763 384.488 39.973-29.294-281.646-384.327 21.561-26.783-124.246-119.9z"
18359
+ }
18360
+ ),
18361
+ /* @__PURE__ */ jsx36(
18362
+ "path",
18363
+ {
18364
+ fill: "none",
18365
+ "stroke-width": "66.746",
18366
+ d: "m671.405 893.22 272.7-357.92s31.213-32.62 41.864-63.169.898-65.581-2.235-94.827c-4.866-45.427 53.846-99.798 53.846-99.798s63.494-44.226 69.93-36.68-42.14 86.544-36.064 111.056c9.632 38.858 73.216 67.84 104.599 53.149 31.382-14.691 49.22-108.795 62.171-111.964s28.353 77.775 26.435 124.473-47.523 75.82-75.955 84.554-64.694 9.851-93.104 31.972c-28.41 22.12-328.269 427.981-328.269 427.981z",
18367
+ transform: "translate(-216.03 -84.295)scale(1.10099)"
18368
+ }
18369
+ )
18370
+ ] }),
18371
+ /* @__PURE__ */ jsx36(
18372
+ "path",
18373
+ {
18374
+ fill: "#8c63d9",
18375
+ stroke: "#263238",
18376
+ "stroke-linecap": "round",
18377
+ "stroke-linejoin": "round",
18378
+ "stroke-width": "55.182",
18379
+ d: "m166.927 398.352 13.02 207.137-40.611 69.023v453.342h1086.661V674.512l-40.61-69.023 13.02-207.137z"
18380
+ }
18381
+ ),
18382
+ /* @__PURE__ */ jsx36(
18383
+ "path",
18384
+ {
18385
+ fill: "#cc7000",
18386
+ stroke: "#ffba66",
18387
+ "stroke-linecap": "round",
18388
+ "stroke-linejoin": "round",
18389
+ "stroke-width": "38.593",
18390
+ d: "M322.77 689.206h986.986l-36.885-62.693H359.655Z",
18391
+ mask: "url(#b)",
18392
+ transform: "translate(-216.03 -84.295)scale(1.10099)"
18393
+ }
18394
+ ),
18395
+ /* @__PURE__ */ jsx36(
18396
+ "path",
18397
+ {
18398
+ fill: "#ff8c00",
18399
+ d: "m1185.387 605.49 13.02-207.138H166.926l13.02 207.137z"
18400
+ }
18401
+ ),
18402
+ /* @__PURE__ */ jsx36(
18403
+ "path",
18404
+ {
18405
+ fill: "none",
18406
+ stroke: "#263238",
18407
+ "stroke-linecap": "round",
18408
+ "stroke-linejoin": "round",
18409
+ "stroke-width": "29.395",
18410
+ d: "m523.18 899.13 300.24-394.065s34.365-35.915 46.091-69.549c11.727-33.634.988-72.204-2.46-104.403-5.358-50.016 59.283-109.877 59.283-109.877s69.906-48.692 76.993-40.385-46.397 95.284-39.707 122.272c10.605 42.782 80.61 74.691 115.162 58.516s54.191-119.781 68.45-123.27c14.259-3.49 31.217 85.629 29.104 137.042s-52.322 83.478-83.625 93.094-71.227 10.846-102.507 35.2-361.42 471.203-361.42 471.203z"
18411
+ }
18412
+ ),
18413
+ /* @__PURE__ */ jsx36(
18414
+ "path",
18415
+ {
18416
+ fill: "#eceff1",
18417
+ d: "m916.084 52.25 420.493 180.531-532.698 916.066-476.546-308.58Z",
18418
+ mask: "url(#c)"
18419
+ }
18420
+ ),
18421
+ /* @__PURE__ */ jsx36(
18422
+ "path",
18423
+ {
18424
+ fill: "#fff",
18425
+ d: "M856.06 362.55s35.273 37.417 44.671 47.481 30.133 23.878 30.133 23.878-19.577-12.395-133.162 132.35c-113.586 144.744-274.29 356.33-274.29 356.33l-74.43-62.208z",
18426
+ mask: "url(#d)"
18427
+ }
18428
+ ),
18429
+ /* @__PURE__ */ jsx36(
18430
+ "path",
18431
+ {
18432
+ fill: "#fff",
18433
+ d: "M1003.804 214.75s-61.324 47.811-85.42 85.1c-24.096 37.29-8.4 134.552-8.4 134.552l-119.375-94.095 193.083-235.652 92.963 84.914z",
18434
+ mask: "url(#e)"
18435
+ }
18436
+ ),
18437
+ /* @__PURE__ */ jsx36(
18438
+ "path",
18439
+ {
18440
+ fill: "#cfd8dc",
18441
+ d: "M1128.958 213.086s18.838 96.946 18.548 125.56c-.29 28.612-8.26 73.801-33.74 89.024s-63.802 38.756-115.38 20.88-172.024-84.115-172.024-84.115S981.864 470.314 1006.22 474.08s112.252 10.05 112.252 10.05l90.662-46.814 21.129-221.796z",
18442
+ mask: "url(#f)"
18443
+ }
18444
+ ),
18445
+ /* @__PURE__ */ jsx36(
18446
+ "path",
18447
+ {
18448
+ fill: "#cfd8dc",
18449
+ d: "M1041.552 459.425s-36.954 8.644-65.379 28.54-170.117 214.54-170.117 214.54L582.36 996.25l52.042 26.094 450.026-523.432z",
18450
+ mask: "url(#g)"
18451
+ }
18452
+ ),
18453
+ /* @__PURE__ */ jsx36(
18454
+ "path",
18455
+ {
18456
+ fill: "none",
18457
+ stroke: "#263238",
18458
+ "stroke-linecap": "round",
18459
+ "stroke-linejoin": "round",
18460
+ "stroke-width": "29.395",
18461
+ d: "m209.947 266.846 76.909 154.59 31.315-12.212 281.763 384.488 39.973-29.294-281.646-384.327 21.561-26.783-124.246-119.9Z"
18462
+ }
18463
+ ),
18464
+ /* @__PURE__ */ jsx36(
18465
+ "path",
18466
+ {
18467
+ fill: "#eceff1",
18468
+ d: "m105.922 257.574 152.745-109.918 438.66 518.005-348.484 67.536Z",
18469
+ mask: "url(#h)"
18470
+ }
18471
+ ),
18472
+ /* @__PURE__ */ jsx36(
18473
+ "path",
18474
+ {
18475
+ fill: "#fff",
18476
+ d: "M326.613 211.828s-59.58 39.097-77.947 64.605C232.303 299.16 204.56 380.52 204.56 380.52l-48.272-119.485 119.003-77.722z",
18477
+ mask: "url(#i)"
18478
+ }
18479
+ ),
18480
+ /* @__PURE__ */ jsx36(
18481
+ "path",
18482
+ {
18483
+ fill: "#cfd8dc",
18484
+ d: "M248.625 369.326s24.346 28.663 44.076 34.332c15.33 4.405 30.118-5.584 30.118-5.584l212.415 286.577-185.65 5.65z",
18485
+ mask: "url(#j)"
18486
+ }
18487
+ ),
18488
+ /* @__PURE__ */ jsx36(
18489
+ "path",
18490
+ {
18491
+ fill: "#cfd8dc",
18492
+ d: "M355.22 375.68s11.46-16.196 12.454-25.01c3.052-27.043-32.344-49.296-32.344-49.296l77.092 54.069-53.634 24.84z",
18493
+ mask: "url(#k)"
18494
+ }
18495
+ ),
18496
+ /* @__PURE__ */ jsx36("path", { fill: "#ffba66", d: "M170.482 652.84h1025.265v453.341H170.482Z" }),
18497
+ /* @__PURE__ */ jsx36("path", { fill: "#ff8c00", d: "M139.336 674.512h1086.662v453.342H139.336Z" }),
18498
+ /* @__PURE__ */ jsx36(
18499
+ "rect",
18500
+ {
18501
+ width: "875.482",
18502
+ height: "332.3",
18503
+ x: "244.926",
18504
+ y: "735.033",
18505
+ fill: "#cc7000",
18506
+ rx: "77.883",
18507
+ ry: "77.883"
18508
+ }
18509
+ ),
18510
+ /* @__PURE__ */ jsx36(
18511
+ "path",
18512
+ {
18513
+ fill: "#fff",
18514
+ d: "M316.789 901.245q0-47.968 15.206-71.828 15.206-23.984 45.743-23.984 30.66 0 45.866 23.86t15.206 71.952q0 47.968-15.206 71.828-15.207 23.86-45.866 23.86-30.537 0-45.743-23.86-15.206-23.984-15.206-71.828m42.528 49.328q5.81 15.453 18.42 15.453 12.734 0 18.545-15.453 5.81-15.454 5.81-49.328 0-12.857-.865-22.995l-43.146 68.737q.618 1.978 1.236 3.586m18.42-114.233q-12.61 0-18.42 15.453-5.81 15.454-5.81 49.452 0 10.508.494 19.162l42.528-67.872-.247-.742q-5.81-15.453-18.544-15.453m91.486 64.905q0-47.968 15.206-71.828 15.206-23.984 45.742-23.984 30.66 0 45.867 23.86t15.206 71.952q0 47.968-15.206 71.828-15.207 23.86-45.867 23.86-30.536 0-45.742-23.86-15.206-23.984-15.206-71.828m42.528 49.328q5.81 15.453 18.42 15.453 12.734 0 18.545-15.453 5.81-15.454 5.81-49.328 0-12.858-.865-22.995l-43.147 68.737q.619 1.978 1.237 3.586m18.42-114.233q-12.61 0-18.42 15.453-5.81 15.454-5.81 49.452 0 10.508.494 19.162l42.528-67.872-.247-.742q-5.81-15.453-18.545-15.453M661.96 861.93h41.169v45.124h-41.169Zm0 86.045h41.169v45.372h-41.169Zm112.131-46.731q0-47.968 15.207-71.828 15.206-23.984 45.742-23.984 30.66 0 45.866 23.86 15.207 23.86 15.207 71.952 0 47.968-15.207 71.828-15.206 23.86-45.866 23.86-30.536 0-45.742-23.86-15.207-23.984-15.207-71.828m42.528 49.328q5.811 15.453 18.421 15.453 12.734 0 18.544-15.453 5.81-15.454 5.81-49.328 0-12.858-.865-22.995l-43.146 68.737q.618 1.978 1.236 3.586M835.04 836.34q-12.61 0-18.42 15.453-5.811 15.454-5.811 49.452 0 10.508.494 19.162l42.529-67.872-.248-.742q-5.81-15.453-18.544-15.453m91.485 64.905q0-47.968 15.206-71.828 15.207-23.984 45.743-23.984 30.66 0 45.866 23.86t15.206 71.952q0 47.968-15.206 71.828t-45.866 23.86q-30.536 0-45.743-23.86-15.206-23.984-15.206-71.828m42.528 49.328q5.81 15.453 18.42 15.453 12.735 0 18.545-15.453 5.81-15.454 5.81-49.328 0-12.858-.865-22.995l-43.146 68.737q.618 1.978 1.236 3.586m18.42-114.233q-12.61 0-18.42 15.453-5.81 15.454-5.81 49.452 0 10.508.494 19.162l42.528-67.872-.247-.742q-5.81-15.453-18.544-15.453",
18515
+ "aria-label": "00:00"
18516
+ }
18517
+ )
18518
+ ]
18519
+ }
18520
+ );
18521
+
18522
+ // src/components/frontend/toolbox/core/layout.tsx
18523
+ import { useContext as useContext14, useState as useState29 } from "react";
18524
+
18525
+ // src/components/frontend/toolbox/core/footer.tsx
18526
+ import { Fragment as Fragment12, jsx as jsx37, jsxs as jsxs17 } from "react/jsx-runtime";
18527
+ var Footer = ({ openLicenseDetails }) => {
18528
+ return /* @__PURE__ */ jsxs17(
18529
+ "div",
18530
+ {
18531
+ className: "\n flex items-center justify-center gap-1 border-t border-sigil-border\n bg-sigil-bg-dark p-1 text-[80%]\n ",
18532
+ children: [
18533
+ /* @__PURE__ */ jsxs17("span", { children: [
18534
+ "Created by",
18535
+ "\xA0",
18536
+ /* @__PURE__ */ jsx37(ExternalLink, { href: "https://arcanewizards.com", children: "Arcane Wizards" })
18537
+ ] }),
18538
+ /* @__PURE__ */ jsx37(ToolbarDivider, {}),
18539
+ /* @__PURE__ */ jsx37(ExternalLink, { href: SOURCE_CODE_URL, children: STRINGS.sourceCode }),
18540
+ openLicenseDetails && /* @__PURE__ */ jsxs17(Fragment12, { children: [
18541
+ /* @__PURE__ */ jsx37(ToolbarDivider, {}),
18542
+ /* @__PURE__ */ jsx37(TextButton, { onClick: openLicenseDetails, children: STRINGS.license })
18543
+ ] })
18544
+ ]
18545
+ }
18133
18546
  );
18134
- const { config } = info;
18135
- const { sendMessage, call, connection, reconnect } = useContext13(StageContext);
18136
- const [dialogMode, setDialogMode] = useState29(null);
18137
- const [assignToOutput, setAssignToOutput] = useState29(null);
18547
+ };
18548
+
18549
+ // ../../packages/sigil/dist/frontend/styling.hooks.js
18550
+ import { useEffect as useEffect29 } from "react";
18551
+ var useRootHintVariables = (color) => {
18552
+ useEffect29(() => {
18553
+ const root = document.querySelector(".arcane-theme-root");
18554
+ if (!root) return;
18555
+ Object.entries(cssHintColorVariables(color)).forEach(([key, value]) => {
18556
+ root.style.setProperty(key, value);
18557
+ });
18558
+ }, [color]);
18559
+ };
18560
+
18561
+ // src/components/frontend/toolbox/core/layout.tsx
18562
+ import { Fragment as Fragment13, jsx as jsx38, jsxs as jsxs18 } from "react/jsx-runtime";
18563
+ var Layout = ({
18564
+ modes,
18565
+ children,
18566
+ licenseMode,
18567
+ footer
18568
+ }) => {
18569
+ const [windowMode, setWindowMode] = useState29(null);
18570
+ const { connection, reconnect } = useContext14(StageContext);
18138
18571
  const { preferences } = useBrowserPreferences();
18139
18572
  useRootHintVariables(preferences.color);
18573
+ return /* @__PURE__ */ jsxs18("div", { className: "flex h-screen flex-col", children: [
18574
+ /* @__PURE__ */ jsx38(ToolbarWrapper, { children: /* @__PURE__ */ jsxs18(ToolbarRow, { children: [
18575
+ /* @__PURE__ */ jsx38(
18576
+ "div",
18577
+ {
18578
+ className: "\n flex h-full min-h-[36px] grow items-center justify-center px-1\n app-title-bar\n ",
18579
+ children: /* @__PURE__ */ jsx38("span", { className: "font-bold text-hint-gradient", children: STRINGS.title })
18580
+ }
18581
+ ),
18582
+ modes && /* @__PURE__ */ jsxs18(Fragment13, { children: [
18583
+ /* @__PURE__ */ jsx38(ToolbarDivider, {}),
18584
+ Object.entries(modes).map(([key, { icon, title }]) => /* @__PURE__ */ jsx38(
18585
+ ControlButton,
18586
+ {
18587
+ onClick: () => setWindowMode((mode) => mode === key ? null : key),
18588
+ variant: "titlebar",
18589
+ icon,
18590
+ active: windowMode === key,
18591
+ title: STRINGS.toggle(title)
18592
+ },
18593
+ key
18594
+ ))
18595
+ ] })
18596
+ ] }) }),
18597
+ /* @__PURE__ */ jsx38("div", { className: "relative flex h-0 grow flex-col", children: connection.state !== "connected" ? /* @__PURE__ */ jsxs18(
18598
+ SizeAwareDiv,
18599
+ {
18600
+ className: "\n flex grow flex-col items-center justify-center gap-1\n bg-sigil-bg-light p-1 text-sigil-foreground-muted\n ",
18601
+ children: [
18602
+ /* @__PURE__ */ jsx38(Icon2, { icon: "signal_disconnected", className: "text-block-icon" }),
18603
+ /* @__PURE__ */ jsx38("div", { className: "text-center", children: STRINGS.connectionError }),
18604
+ /* @__PURE__ */ jsx38(ControlButton, { onClick: reconnect, variant: "large", icon: "replay", children: STRINGS.reconnect })
18605
+ ]
18606
+ }
18607
+ ) : windowMode && modes?.[windowMode] ? modes[windowMode].child(setWindowMode) : children }),
18608
+ footer && /* @__PURE__ */ jsx38(
18609
+ Footer,
18610
+ {
18611
+ openLicenseDetails: licenseMode && (() => setWindowMode(
18612
+ (mode) => mode === licenseMode ? null : licenseMode
18613
+ ))
18614
+ }
18615
+ )
18616
+ ] });
18617
+ };
18618
+
18619
+ // src/components/frontend/toolbox/license.tsx
18620
+ import { jsx as jsx39, jsxs as jsxs19 } from "react/jsx-runtime";
18621
+ var LicenseContent = ({ license }) => {
18622
+ return /* @__PURE__ */ jsx39("div", { className: "flex flex-col gap-2 rounded-md bg-sigil-bg-light p-2", children: license.split("\n\n").map((paragraph, index2) => /* @__PURE__ */ jsx39("p", { className: "m-0", children: paragraph.replace(/\n/g, " ").trim() }, index2)) });
18623
+ };
18624
+ var License = ({ license, setWindowMode }) => {
18625
+ return /* @__PURE__ */ jsx39("div", { className: "flex grow flex-col", children: /* @__PURE__ */ jsxs19(
18626
+ "div",
18627
+ {
18628
+ className: "\n flex grow basis-0 flex-col overflow-y-auto px-2 pb-2 scrollbar-sigil\n ",
18629
+ children: [
18630
+ /* @__PURE__ */ jsx39(TimecodeToolboxLogo, { className: "h-[20%] max-h-[420px] min-h-[110px] w-full" }),
18631
+ /* @__PURE__ */ jsx39(LicenseContent, { license }),
18632
+ /* @__PURE__ */ jsx39("div", { className: "flex justify-center p-2", children: /* @__PURE__ */ jsx39(
18633
+ ControlButton,
18634
+ {
18635
+ onClick: () => setWindowMode(null),
18636
+ variant: "large",
18637
+ icon: "close",
18638
+ children: STRINGS.close(STRINGS.license)
18639
+ }
18640
+ ) })
18641
+ ]
18642
+ }
18643
+ ) });
18644
+ };
18645
+ var LicenseGate = ({ info }) => {
18646
+ const { sendMessage } = useContext15(StageContext);
18647
+ const acceptLicense = useCallback18(() => {
18648
+ sendMessage?.({
18649
+ type: "component-message",
18650
+ namespace: "timecode-toolbox",
18651
+ component: "license-gate",
18652
+ componentKey: info.key,
18653
+ action: "accept-license",
18654
+ hash: info.hash
18655
+ });
18656
+ }, [sendMessage, info.key, info.hash]);
18657
+ return /* @__PURE__ */ jsx39(
18658
+ Layout,
18659
+ {
18660
+ footer: true,
18661
+ modes: {
18662
+ debug: {
18663
+ child: () => /* @__PURE__ */ jsx39(Debugger, { title: STRINGS.debugger, className: "size-full" }),
18664
+ icon: "bug_report",
18665
+ title: STRINGS.debugger
18666
+ }
18667
+ },
18668
+ children: /* @__PURE__ */ jsxs19(
18669
+ "div",
18670
+ {
18671
+ className: "\n flex grow basis-0 flex-col overflow-y-auto px-2 pb-2 scrollbar-sigil\n ",
18672
+ children: [
18673
+ /* @__PURE__ */ jsx39(TimecodeToolboxLogo, { className: "h-[20%] max-h-[420px] min-h-[110px] w-full" }),
18674
+ /* @__PURE__ */ jsx39("h2", { className: "text-center text-sigil-usage-hint-foreground", children: STRINGS.licensePrompt }),
18675
+ /* @__PURE__ */ jsx39(LicenseContent, { license: info.license }),
18676
+ /* @__PURE__ */ jsx39("div", { className: "flex justify-center p-2", children: /* @__PURE__ */ jsx39(
18677
+ ControlButton,
18678
+ {
18679
+ onClick: acceptLicense,
18680
+ variant: "large",
18681
+ icon: "check",
18682
+ primary: true,
18683
+ children: STRINGS.acceptLicense
18684
+ }
18685
+ ) })
18686
+ ]
18687
+ }
18688
+ )
18689
+ }
18690
+ );
18691
+ };
18692
+
18693
+ // src/components/frontend/toolbox/core/updates.tsx
18694
+ import { useCallback as useCallback19, useEffect as useEffect30, useState as useState30 } from "react";
18695
+ import { jsx as jsx40, jsxs as jsxs20 } from "react/jsx-runtime";
18696
+ var UpdateBanner = () => {
18697
+ const { updates } = useApplicationState();
18698
+ const { version } = useSystemInformation();
18699
+ const { openExternalLink } = useBrowserContext();
18700
+ const [displayState, setDisplayState] = useState30();
18140
18701
  useEffect30(() => {
18702
+ if (updates?.type !== "loading") {
18703
+ setDisplayState(updates);
18704
+ }
18705
+ }, [updates]);
18706
+ const openDownloadLink = useCallback19(() => {
18707
+ if (displayState?.type === "updates-available" && displayState.response.downloadUrl) {
18708
+ openExternalLink(displayState.response.downloadUrl);
18709
+ }
18710
+ }, [displayState, openExternalLink]);
18711
+ if (displayState?.type === "error") {
18712
+ return /* @__PURE__ */ jsxs20(
18713
+ "div",
18714
+ {
18715
+ className: "\n flex items-center justify-center gap-2 border-b\n border-sigil-usage-orange-border bg-sigil-usage-orange-background p-1\n text-sigil-usage-orange-text\n ",
18716
+ children: [
18717
+ /* @__PURE__ */ jsx40(Icon2, { icon: "error" }),
18718
+ displayState.error
18719
+ ]
18720
+ }
18721
+ );
18722
+ }
18723
+ if (displayState?.type === "updates-available") {
18724
+ return /* @__PURE__ */ jsxs20(
18725
+ "div",
18726
+ {
18727
+ className: "\n flex items-center justify-center gap-2 border-b\n border-sigil-usage-blue-border bg-sigil-usage-blue-background p-1\n text-sigil-usage-blue-text\n ",
18728
+ children: [
18729
+ /* @__PURE__ */ jsx40(Icon2, { icon: "upgrade" }),
18730
+ STRINGS.updates.updateAvailable(
18731
+ version,
18732
+ displayState.response.latestVersion
18733
+ ),
18734
+ displayState.response.downloadUrl && /* @__PURE__ */ jsxs20(
18735
+ "button",
18736
+ {
18737
+ className: "\n flex cursor-pointer items-center gap-0.5 rounded-md border\n border-sigil-usage-blue-selected-border\n bg-sigil-usage-blue-selected-background px-1 py-0.5\n text-sigil-usage-blue-text\n hover:bg-sigil-usage-blue-selected-border\n ",
18738
+ onClick: openDownloadLink,
18739
+ children: [
18740
+ /* @__PURE__ */ jsx40(Icon2, { icon: "download" }),
18741
+ STRINGS.updates.download
18742
+ ]
18743
+ }
18744
+ )
18745
+ ]
18746
+ }
18747
+ );
18748
+ }
18749
+ return null;
18750
+ };
18751
+
18752
+ // src/components/frontend/toolbox/root.tsx
18753
+ import { Fragment as Fragment14, jsx as jsx41, jsxs as jsxs21 } from "react/jsx-runtime";
18754
+ var ToolboxRoot = ({ info }) => {
18755
+ const { config } = info;
18756
+ const { sendMessage, call } = useContext16(StageContext);
18757
+ const [dialogMode, setDialogMode] = useState31(null);
18758
+ const [assignToOutput, setAssignToOutput] = useState31(null);
18759
+ useEffect31(() => {
18141
18760
  if (assignToOutput) {
18142
18761
  const onEscape = (e) => {
18143
18762
  if (e.key === "Escape") {
@@ -18150,7 +18769,7 @@ var ToolboxRoot = ({ info }) => {
18150
18769
  };
18151
18770
  }
18152
18771
  }, [assignToOutput]);
18153
- const updateConfig = useCallback18(
18772
+ const updateConfig = useCallback20(
18154
18773
  (change) => {
18155
18774
  const diff = diffJson(config, change(config));
18156
18775
  sendMessage?.({
@@ -18171,8 +18790,8 @@ var ToolboxRoot = ({ info }) => {
18171
18790
  }),
18172
18791
  [config, updateConfig]
18173
18792
  );
18174
- const closeDialog = useCallback18(() => setDialogMode(null), []);
18175
- const getNetworkInterfaces = useCallback18(async () => {
18793
+ const closeDialog = useCallback20(() => setDialogMode(null), []);
18794
+ const getNetworkInterfaces = useCallback20(async () => {
18176
18795
  if (!call) {
18177
18796
  throw new Error("No call function available");
18178
18797
  }
@@ -18213,7 +18832,7 @@ var ToolboxRoot = ({ info }) => {
18213
18832
  setAssignToOutput(null);
18214
18833
  };
18215
18834
  }, [assignToOutput, updateConfig]);
18216
- const callHandler = useCallback18(
18835
+ const callHandler = useCallback20(
18217
18836
  async ({ path, handler, args }) => {
18218
18837
  if (!call) {
18219
18838
  throw new Error("No call function available");
@@ -18241,138 +18860,110 @@ var ToolboxRoot = ({ info }) => {
18241
18860
  () => getFragmentValue("tc", TIMECODE_INSTANCE_ID),
18242
18861
  []
18243
18862
  );
18244
- const isMainWindow = windowedTimecodeId === null;
18245
18863
  const root = useMemo15(
18246
- () => /* @__PURE__ */ jsxs16("div", { className: "flex h-screen flex-col", children: [
18247
- /* @__PURE__ */ jsx36(ToolbarWrapper, { children: /* @__PURE__ */ jsxs16(ToolbarRow, { children: [
18248
- /* @__PURE__ */ jsx36(
18249
- "div",
18250
- {
18251
- className: "\n flex h-full min-h-[36px] grow items-center justify-center px-1\n app-title-bar\n ",
18252
- children: /* @__PURE__ */ jsx36("span", { className: "font-bold text-hint-gradient", children: STRINGS.title })
18253
- }
18254
- ),
18255
- isMainWindow && /* @__PURE__ */ jsxs16(Fragment12, { children: [
18256
- /* @__PURE__ */ jsx36(ToolbarDivider, {}),
18257
- /* @__PURE__ */ jsx36(
18258
- ControlButton,
18259
- {
18260
- onClick: () => setWindowMode(
18261
- (mode) => mode === "settings" ? null : "settings"
18864
+ () => windowedTimecodeId ? /* @__PURE__ */ jsx41(Layout, { modes: null, children: /* @__PURE__ */ jsx41(FullscreenTimecodeDisplay, { id: windowedTimecodeId }) }) : /* @__PURE__ */ jsxs21(Fragment14, { children: [
18865
+ /* @__PURE__ */ jsx41(
18866
+ Layout,
18867
+ {
18868
+ footer: true,
18869
+ modes: {
18870
+ license: {
18871
+ child: (setWindowMode) => /* @__PURE__ */ jsx41(
18872
+ License,
18873
+ {
18874
+ license: info.license,
18875
+ setWindowMode
18876
+ }
18262
18877
  ),
18263
- variant: "titlebar",
18878
+ icon: "info",
18879
+ title: STRINGS.license
18880
+ },
18881
+ settings: {
18882
+ child: (setWindowMode) => /* @__PURE__ */ jsx41(Settings, { setWindowMode }),
18264
18883
  icon: "settings",
18265
- active: windowMode === "settings",
18266
- title: STRINGS.toggle(STRINGS.settings.title)
18267
- }
18268
- ),
18269
- /* @__PURE__ */ jsx36(
18270
- ControlButton,
18271
- {
18272
- onClick: () => setWindowMode((mode) => mode === "debug" ? null : "debug"),
18273
- variant: "titlebar",
18884
+ title: STRINGS.settings.title
18885
+ },
18886
+ debug: {
18887
+ child: () => /* @__PURE__ */ jsx41(Debugger, { title: STRINGS.debugger, className: "size-full" }),
18274
18888
  icon: "bug_report",
18275
- active: windowMode === "debug",
18276
- title: STRINGS.toggle(STRINGS.debugger)
18889
+ title: STRINGS.debugger
18277
18890
  }
18278
- )
18279
- ] })
18280
- ] }) }),
18281
- /* @__PURE__ */ jsxs16("div", { className: "relative flex h-0 grow flex-col", children: [
18282
- connection.state !== "connected" ? /* @__PURE__ */ jsxs16(
18283
- SizeAwareDiv,
18284
- {
18285
- className: "\n flex grow flex-col items-center justify-center gap-1\n bg-sigil-bg-light p-1 text-sigil-foreground-muted\n ",
18286
- children: [
18287
- /* @__PURE__ */ jsx36(Icon2, { icon: "signal_disconnected", className: "text-block-icon" }),
18288
- /* @__PURE__ */ jsx36("div", { className: "text-center", children: STRINGS.connectionError }),
18289
- /* @__PURE__ */ jsx36(ControlButton, { onClick: reconnect, variant: "large", icon: "replay", children: STRINGS.reconnect })
18290
- ]
18291
- }
18292
- ) : windowMode === "debug" ? /* @__PURE__ */ jsx36(Debugger, { title: STRINGS.debugger, className: "size-full" }) : windowMode === "settings" ? /* @__PURE__ */ jsx36(Settings, { setWindowMode }) : windowedTimecodeId ? /* @__PURE__ */ jsx36(FullscreenTimecodeDisplay, { id: windowedTimecodeId }) : /* @__PURE__ */ jsxs16(
18293
- "div",
18294
- {
18295
- className: "\n flex h-0 grow flex-col gap-px overflow-y-auto bg-sigil-border\n scrollbar-sigil\n ",
18296
- children: [
18297
- /* @__PURE__ */ jsx36(
18298
- InputsSection,
18299
- {
18300
- setDialogMode,
18301
- assignToOutput: assignToOutputCallback
18302
- }
18303
- ),
18304
- /* @__PURE__ */ jsx36(
18305
- GeneratorsSection,
18306
- {
18307
- setDialogMode,
18308
- assignToOutput: assignToOutputCallback
18309
- }
18310
- ),
18311
- /* @__PURE__ */ jsx36(
18312
- OutputsSection,
18313
- {
18314
- setDialogMode,
18315
- assignToOutput,
18316
- setAssignToOutput
18317
- }
18318
- )
18319
- ]
18320
- }
18321
- ),
18322
- dialogMode?.section.type === "inputs" && /* @__PURE__ */ jsx36(
18323
- InputSettingsDialog,
18324
- {
18325
- close: closeDialog,
18326
- input: dialogMode.section.input,
18327
- target: dialogMode.target
18328
- }
18329
- ),
18330
- dialogMode?.section.type === "generators" && /* @__PURE__ */ jsx36(
18331
- GeneratorSettingsDialog,
18332
- {
18333
- close: closeDialog,
18334
- generator: dialogMode.section.generator,
18335
- target: dialogMode.target
18336
- }
18337
- ),
18338
- dialogMode?.section.type === "outputs" && /* @__PURE__ */ jsx36(
18339
- OutputSettingsDialog,
18340
- {
18341
- close: closeDialog,
18342
- output: dialogMode.section.output,
18343
- target: dialogMode.target
18344
- }
18345
- )
18346
- ] }),
18347
- isMainWindow && /* @__PURE__ */ jsxs16(
18348
- "div",
18891
+ },
18892
+ licenseMode: "license",
18893
+ children: /* @__PURE__ */ jsxs21(Fragment14, { children: [
18894
+ /* @__PURE__ */ jsx41(UpdateBanner, {}),
18895
+ /* @__PURE__ */ jsxs21(
18896
+ "div",
18897
+ {
18898
+ className: "\n flex h-0 grow flex-col gap-px overflow-y-auto bg-sigil-border\n scrollbar-sigil\n ",
18899
+ children: [
18900
+ /* @__PURE__ */ jsx41(
18901
+ InputsSection,
18902
+ {
18903
+ setDialogMode,
18904
+ assignToOutput: assignToOutputCallback
18905
+ }
18906
+ ),
18907
+ /* @__PURE__ */ jsx41(
18908
+ GeneratorsSection,
18909
+ {
18910
+ setDialogMode,
18911
+ assignToOutput: assignToOutputCallback
18912
+ }
18913
+ ),
18914
+ /* @__PURE__ */ jsx41(
18915
+ OutputsSection,
18916
+ {
18917
+ setDialogMode,
18918
+ assignToOutput,
18919
+ setAssignToOutput
18920
+ }
18921
+ )
18922
+ ]
18923
+ }
18924
+ )
18925
+ ] })
18926
+ }
18927
+ ),
18928
+ dialogMode?.section.type === "inputs" && /* @__PURE__ */ jsx41(
18929
+ InputSettingsDialog,
18349
18930
  {
18350
- className: "\n flex justify-center border-t border-sigil-border bg-sigil-bg-dark\n p-1 text-[80%]\n ",
18351
- children: [
18352
- "Created by",
18353
- "\xA0",
18354
- /* @__PURE__ */ jsx36(ExternalLink, { href: "https://arcanewizards.com", children: "Arcane Wizards" })
18355
- ]
18931
+ close: closeDialog,
18932
+ input: dialogMode.section.input,
18933
+ target: dialogMode.target
18934
+ }
18935
+ ),
18936
+ dialogMode?.section.type === "generators" && /* @__PURE__ */ jsx41(
18937
+ GeneratorSettingsDialog,
18938
+ {
18939
+ close: closeDialog,
18940
+ generator: dialogMode.section.generator,
18941
+ target: dialogMode.target
18942
+ }
18943
+ ),
18944
+ dialogMode?.section.type === "outputs" && /* @__PURE__ */ jsx41(
18945
+ OutputSettingsDialog,
18946
+ {
18947
+ close: closeDialog,
18948
+ output: dialogMode.section.output,
18949
+ target: dialogMode.target
18356
18950
  }
18357
18951
  )
18358
18952
  ] }),
18359
18953
  [
18360
- connection,
18361
- reconnect,
18362
18954
  assignToOutput,
18363
18955
  assignToOutputCallback,
18364
18956
  closeDialog,
18365
18957
  dialogMode,
18366
- windowMode,
18367
- isMainWindow,
18368
- windowedTimecodeId
18958
+ windowedTimecodeId,
18959
+ info.license
18369
18960
  ]
18370
18961
  );
18371
- return /* @__PURE__ */ jsx36(ConfigContext.Provider, { value: configContext, children: /* @__PURE__ */ jsx36(NetworkContext.Provider, { value: networkContextValue, children: /* @__PURE__ */ jsx36(ApplicationStateContext.Provider, { value: info.state, children: /* @__PURE__ */ jsx36(ApplicationHandlersContext.Provider, { value: handlers, children: root }) }) }) });
18962
+ return /* @__PURE__ */ jsx41(ConfigContext.Provider, { value: configContext, children: /* @__PURE__ */ jsx41(NetworkContext.Provider, { value: networkContextValue, children: /* @__PURE__ */ jsx41(ApplicationStateContext.Provider, { value: info.state, children: /* @__PURE__ */ jsx41(ApplicationHandlersContext.Provider, { value: handlers, children: root }) }) }) });
18372
18963
  };
18373
18964
 
18374
18965
  // src/components/frontend/index.tsx
18375
- import { jsx as jsx37 } from "react/jsx-runtime";
18966
+ import { jsx as jsx45 } from "react/jsx-runtime";
18376
18967
  var timecodeToolboxFrontendComponents = () => ({
18377
18968
  namespace: NAMESPACE,
18378
18969
  render: (info) => {
@@ -18381,7 +18972,9 @@ var timecodeToolboxFrontendComponents = () => ({
18381
18972
  }
18382
18973
  switch (info.component) {
18383
18974
  case "toolbox-root":
18384
- return /* @__PURE__ */ jsx37(ToolboxRoot, { info });
18975
+ return /* @__PURE__ */ jsx45(ToolboxRoot, { info });
18976
+ case "license-gate":
18977
+ return /* @__PURE__ */ jsx45(LicenseGate, { info });
18385
18978
  }
18386
18979
  }
18387
18980
  });
@@ -18389,7 +18982,7 @@ var startTimecodeToolboxServerFrontend = (browser) => {
18389
18982
  startSigilFrontend({
18390
18983
  browser,
18391
18984
  appRenderers: [timecodeToolboxFrontendComponents()],
18392
- loadingState: () => /* @__PURE__ */ jsx37("div", { style: { width: "100%", textAlign: "center", padding: "2rem" }, children: "Loading Toolbox..." })
18985
+ loadingState: () => /* @__PURE__ */ jsx45("div", { style: { width: "100%", textAlign: "center", padding: "2rem" }, children: "Loading Toolbox..." })
18393
18986
  });
18394
18987
  };
18395
18988
  window.startTimecodeToolboxServerFrontend = startTimecodeToolboxServerFrontend;