@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
@@ -9873,9 +9873,6 @@ var useLongPressable2 = ({
9873
9873
  );
9874
9874
  };
9875
9875
 
9876
- // ../../packages/sigil/dist/chunk-H4U4Z4GM.js
9877
- var import_react11 = require("react");
9878
-
9879
9876
  // ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js
9880
9877
  var external_exports = {};
9881
9878
  __export(external_exports, {
@@ -13920,7 +13917,7 @@ var NEVER = INVALID;
13920
13917
  // ../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.js
13921
13918
  var zod_default = external_exports;
13922
13919
 
13923
- // ../../packages/sigil/dist/chunk-H4U4Z4GM.js
13920
+ // ../../packages/sigil/dist/chunk-WYUGJOEB.js
13924
13921
  var SIGIL_COLOR = external_exports.enum([
13925
13922
  "purple",
13926
13923
  "blue",
@@ -13961,22 +13958,13 @@ var cssSigilColorUsageVariables = (prefix, usage) => cssVariables({
13961
13958
  [`--${prefix}-gradient-dark`]: usage.gradientDark
13962
13959
  });
13963
13960
  var cssHintColorVariables = (color) => cssSigilColorUsageVariables(`sigil-usage-hint`, sigilColorUsage(color));
13964
- var useRootHintVariables = (color) => {
13965
- (0, import_react11.useEffect)(() => {
13966
- const root = document.querySelector(".arcane-theme-root");
13967
- if (!root) return;
13968
- Object.entries(cssHintColorVariables(color)).forEach(([key, value]) => {
13969
- root.style.setProperty(key, value);
13970
- });
13971
- }, [color]);
13972
- };
13973
13961
  var cssVariables = (variables) => variables;
13974
13962
  function cnd(condition, truthyClassName, falseyClassName) {
13975
13963
  return condition ? truthyClassName : falseyClassName;
13976
13964
  }
13977
13965
 
13978
- // ../../packages/sigil/dist/chunk-XAK7WC3D.js
13979
- var import_react12 = require("react");
13966
+ // ../../packages/sigil/dist/chunk-E3VUC3Q4.js
13967
+ var import_react11 = require("react");
13980
13968
 
13981
13969
  // ../../node_modules/.pnpm/@arcanejs+toolkit-frontend@0.11.0/node_modules/@arcanejs/toolkit-frontend/dist/chunk-DK4BAXVE.mjs
13982
13970
  var import_jsx_runtime17 = require("react/jsx-runtime");
@@ -14014,16 +14002,16 @@ var TRANSPARENCY_SVG = `
14014
14002
  `;
14015
14003
  var TRANSPARENCY_SVG_URI = `data:image/svg+xml,${encodeURIComponent(TRANSPARENCY_SVG)}`;
14016
14004
 
14017
- // ../../packages/sigil/dist/chunk-XAK7WC3D.js
14018
- var import_react13 = require("react");
14005
+ // ../../packages/sigil/dist/chunk-E3VUC3Q4.js
14006
+ var import_react12 = require("react");
14019
14007
  var import_jsx_runtime18 = require("react/jsx-runtime");
14020
- var import_react14 = require("react");
14008
+ var import_react13 = require("react");
14021
14009
  var import_jsx_runtime19 = require("react/jsx-runtime");
14022
- var import_react15 = require("react");
14010
+ var import_react14 = require("react");
14023
14011
  var import_jsx_runtime20 = require("react/jsx-runtime");
14024
- var import_react16 = require("react");
14012
+ var import_react15 = require("react");
14025
14013
  var import_jsx_runtime21 = require("react/jsx-runtime");
14026
- var import_react17 = require("react");
14014
+ var import_react16 = require("react");
14027
14015
  var import_jsx_runtime22 = require("react/jsx-runtime");
14028
14016
  var import_jsx_runtime23 = require("react/jsx-runtime");
14029
14017
  var clsControlPosition = (position) => {
@@ -14080,7 +14068,8 @@ var clsControlButton = ({
14080
14068
  active,
14081
14069
  touching,
14082
14070
  position,
14083
- className
14071
+ className,
14072
+ primary
14084
14073
  }) => cn(
14085
14074
  `sigil-control-button`,
14086
14075
  cnd(variant === "border", `sigil-control-button-variant-border`),
@@ -14092,10 +14081,11 @@ var clsControlButton = ({
14092
14081
  cnd(touching, `sigil-control-button-touching`),
14093
14082
  cnd(active, `sigil-control-button-active`),
14094
14083
  cnd(touching && active, `sigil-control-button-active-touching`),
14084
+ cnd(primary, `sigil-control-button-primary`),
14095
14085
  clsControlPosition(position),
14096
14086
  className
14097
14087
  );
14098
- var ControlButtonFrame = (0, import_react13.forwardRef)(
14088
+ var ControlButtonFrame = (0, import_react12.forwardRef)(
14099
14089
  ({
14100
14090
  children,
14101
14091
  className,
@@ -14108,6 +14098,7 @@ var ControlButtonFrame = (0, import_react13.forwardRef)(
14108
14098
  title,
14109
14099
  tooltipSide,
14110
14100
  position,
14101
+ primary,
14111
14102
  ...props
14112
14103
  }, ref) => {
14113
14104
  const btn = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
@@ -14122,6 +14113,7 @@ var ControlButtonFrame = (0, import_react13.forwardRef)(
14122
14113
  active,
14123
14114
  touching,
14124
14115
  position,
14116
+ primary,
14125
14117
  className
14126
14118
  }),
14127
14119
  children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { children: [
@@ -14141,7 +14133,7 @@ var ControlButtonFrame = (0, import_react13.forwardRef)(
14141
14133
  }
14142
14134
  );
14143
14135
  ControlButtonFrame.displayName = "ControlButtonFrame";
14144
- var ControlButton = (0, import_react13.forwardRef)(
14136
+ var ControlButton = (0, import_react12.forwardRef)(
14145
14137
  ({ onClick, disabled, ...props }, ref) => {
14146
14138
  const { handlers, touching } = usePressable2(onClick);
14147
14139
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
@@ -14157,12 +14149,12 @@ var ControlButton = (0, import_react13.forwardRef)(
14157
14149
  }
14158
14150
  );
14159
14151
  ControlButton.displayName = "ControlButton";
14160
- var CheckboxControlButton = (0, import_react13.forwardRef)(({ active, label, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(ControlButton, { ...props, ref, active, children: [
14152
+ var CheckboxControlButton = (0, import_react12.forwardRef)(({ active, label, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(ControlButton, { ...props, ref, active, children: [
14161
14153
  /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon2, { icon: active ? "check_box" : "check_box_outline_blank" }),
14162
14154
  label
14163
14155
  ] }));
14164
14156
  CheckboxControlButton.displayName = "CheckboxControlButton";
14165
- var LongPressableControlButton = (0, import_react13.forwardRef)(({ active, disabled, onPress, onRelease, ...props }, ref) => {
14157
+ var LongPressableControlButton = (0, import_react12.forwardRef)(({ active, disabled, onPress, onRelease, ...props }, ref) => {
14166
14158
  const { handlers, touching } = useLongPressable2({ onPress, onRelease });
14167
14159
  return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14168
14160
  ControlButtonFrame,
@@ -14176,7 +14168,7 @@ var LongPressableControlButton = (0, import_react13.forwardRef)(({ active, disab
14176
14168
  );
14177
14169
  });
14178
14170
  LongPressableControlButton.displayName = "LongPressableControlButton";
14179
- var ControlButtonGroup = (0, import_react13.forwardRef)(({ children, className, position, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14171
+ var ControlButtonGroup = (0, import_react12.forwardRef)(({ children, className, position, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14180
14172
  "div",
14181
14173
  {
14182
14174
  ...props,
@@ -14193,7 +14185,7 @@ var ControlButtonGroup = (0, import_react13.forwardRef)(({ children, className,
14193
14185
  }
14194
14186
  ));
14195
14187
  ControlButtonGroup.displayName = "ControlButtonGroup";
14196
- var ControlParagraph = (0, import_react14.forwardRef)(({ className, mode, position = "all", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14188
+ var ControlParagraph = (0, import_react13.forwardRef)(({ className, mode, position = "all", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14197
14189
  "p",
14198
14190
  {
14199
14191
  ...props,
@@ -14228,7 +14220,7 @@ var ControlParagraph = (0, import_react14.forwardRef)(({ className, mode, positi
14228
14220
  }
14229
14221
  ));
14230
14222
  ControlParagraph.displayName = "ControlParagraph";
14231
- var ControlLabel = (0, import_react14.forwardRef)(
14223
+ var ControlLabel = (0, import_react13.forwardRef)(
14232
14224
  ({ className, disabled, nonMicro, position = "label", subgrid, ...props }, ref) => {
14233
14225
  return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14234
14226
  "div",
@@ -14248,7 +14240,7 @@ var ControlLabel = (0, import_react14.forwardRef)(
14248
14240
  }
14249
14241
  );
14250
14242
  ControlLabel.displayName = "ControlLabel";
14251
- var ControlDetails = (0, import_react14.forwardRef)(
14243
+ var ControlDetails = (0, import_react13.forwardRef)(
14252
14244
  ({ align, className, position = "all", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14253
14245
  "div",
14254
14246
  {
@@ -14266,7 +14258,7 @@ var ControlDetails = (0, import_react14.forwardRef)(
14266
14258
  )
14267
14259
  );
14268
14260
  ControlDetails.displayName = "ControlDetails";
14269
- var InputSpanningTitle = (0, import_react14.forwardRef)(({ className, position = "row", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14261
+ var InputSpanningTitle = (0, import_react13.forwardRef)(({ className, position = "row", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14270
14262
  "div",
14271
14263
  {
14272
14264
  ...props,
@@ -14279,7 +14271,7 @@ var InputSpanningTitle = (0, import_react14.forwardRef)(({ className, position =
14279
14271
  }
14280
14272
  ));
14281
14273
  InputSpanningTitle.displayName = "InputSpanningTitle";
14282
- var ControlDialogButtons = (0, import_react15.forwardRef)(({ children, className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14274
+ var ControlDialogButtons = (0, import_react14.forwardRef)(({ children, className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14283
14275
  ControlButtonGroup,
14284
14276
  {
14285
14277
  ref,
@@ -14309,15 +14301,15 @@ var InputWithDelayedPropagation = ({
14309
14301
  inputRef: inputRefProp,
14310
14302
  ...props
14311
14303
  }) => {
14312
- const lastValue = (0, import_react16.useRef)(value);
14313
- const inputRef = (0, import_react16.useRef)(null);
14314
- (0, import_react16.useEffect)(() => {
14304
+ const lastValue = (0, import_react15.useRef)(value);
14305
+ const inputRef = (0, import_react15.useRef)(null);
14306
+ (0, import_react15.useEffect)(() => {
14315
14307
  if (inputRef.current && inputRef.current.value !== value) {
14316
14308
  inputRef.current.value = value;
14317
14309
  }
14318
14310
  lastValue.current = value;
14319
14311
  }, [value]);
14320
- const updateRef = (0, import_react16.useCallback)(
14312
+ const updateRef = (0, import_react15.useCallback)(
14321
14313
  (instance) => {
14322
14314
  inputRef.current = instance;
14323
14315
  if (inputRefProp) {
@@ -14327,7 +14319,7 @@ var InputWithDelayedPropagation = ({
14327
14319
  [inputRefProp]
14328
14320
  );
14329
14321
  const onBlurProp = props.onBlur;
14330
- const onBlur = (0, import_react16.useCallback)(
14322
+ const onBlur = (0, import_react15.useCallback)(
14331
14323
  (e) => {
14332
14324
  if (e.currentTarget.value !== lastValue.current) {
14333
14325
  onChange(e.currentTarget.value, false);
@@ -14337,7 +14329,7 @@ var InputWithDelayedPropagation = ({
14337
14329
  [onChange, onBlurProp]
14338
14330
  );
14339
14331
  const onKeyUpProp = props.onKeyUp;
14340
- const onKeyUp = (0, import_react16.useCallback)(
14332
+ const onKeyUp = (0, import_react15.useCallback)(
14341
14333
  (e) => {
14342
14334
  if ((e.key === "Enter" || e.key.startsWith("Arrow")) && e.currentTarget.value !== lastValue.current) {
14343
14335
  onChange(e.currentTarget.value, true);
@@ -14404,7 +14396,7 @@ var ControlSelect = ({
14404
14396
  triggerClassName: className
14405
14397
  }) => {
14406
14398
  const selectedOption = options.find((option2) => option2.value === value);
14407
- const onValueChange = (0, import_react17.useCallback)(
14399
+ const onValueChange = (0, import_react16.useCallback)(
14408
14400
  (val) => {
14409
14401
  const matchingOption = options.find(
14410
14402
  (option2) => (option2.value ?? NULL_VALUE) === val
@@ -14559,7 +14551,7 @@ var ControlColorSelect = ({
14559
14551
  );
14560
14552
  };
14561
14553
  var isDarkDialog = (variant) => variant === "dark" || variant === "dark-compact";
14562
- var DialogContext = (0, import_react12.createContext)({
14554
+ var DialogContext = (0, import_react11.createContext)({
14563
14555
  createDialog: () => {
14564
14556
  throw new Error("DialogContext not provided");
14565
14557
  },
@@ -14570,7 +14562,7 @@ var DialogContext = (0, import_react12.createContext)({
14570
14562
  throw new Error("DialogContext not provided");
14571
14563
  }
14572
14564
  });
14573
- var DialogTitle = (0, import_react12.forwardRef)(
14565
+ var DialogTitle = (0, import_react11.forwardRef)(
14574
14566
  ({ className, variant = "light", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
14575
14567
  "div",
14576
14568
  {
@@ -14588,7 +14580,7 @@ var DialogTitle = (0, import_react12.forwardRef)(
14588
14580
  )
14589
14581
  );
14590
14582
  DialogTitle.displayName = "DialogTitle";
14591
- var DialogButtons = (0, import_react12.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
14583
+ var DialogButtons = (0, import_react11.forwardRef)(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
14592
14584
  "div",
14593
14585
  {
14594
14586
  ...props,
@@ -14604,8 +14596,8 @@ var Dialog = ({
14604
14596
  title,
14605
14597
  variant = "light"
14606
14598
  }) => {
14607
- const [dialogRef, setDialogRef] = (0, import_react12.useState)(null);
14608
- (0, import_react12.useEffect)(() => {
14599
+ const [dialogRef, setDialogRef] = (0, import_react11.useState)(null);
14600
+ (0, import_react11.useEffect)(() => {
14609
14601
  if (!dialogRef) return;
14610
14602
  dialogRef.showModal();
14611
14603
  }, [dialogRef]);
@@ -14664,27 +14656,27 @@ var Dialog = ({
14664
14656
  var isCoreComponent = (component) => component.namespace === "core";
14665
14657
 
14666
14658
  // ../../node_modules/.pnpm/@arcanejs+toolkit-frontend@0.11.0/node_modules/@arcanejs/toolkit-frontend/dist/components/index.mjs
14667
- var import_react18 = __toESM(require("react"), 1);
14668
- var import_react19 = require("react");
14659
+ var import_react17 = __toESM(require("react"), 1);
14660
+ var import_react18 = require("react");
14669
14661
  var import_jsx_runtime24 = require("react/jsx-runtime");
14662
+ var import_react19 = __toESM(require("react"), 1);
14670
14663
  var import_react20 = __toESM(require("react"), 1);
14671
- var import_react21 = __toESM(require("react"), 1);
14672
14664
  var import_jsx_runtime25 = require("react/jsx-runtime");
14673
14665
  var import_jsx_runtime26 = require("react/jsx-runtime");
14674
14666
  var import_jsx_runtime27 = require("react/jsx-runtime");
14675
14667
  var import_jsx_runtime28 = require("react/jsx-runtime");
14676
- var import_react22 = __toESM(require("react"), 1);
14668
+ var import_react21 = __toESM(require("react"), 1);
14677
14669
  var import_jsx_runtime29 = require("react/jsx-runtime");
14678
- var import_react23 = __toESM(require("react"), 1);
14670
+ var import_react22 = __toESM(require("react"), 1);
14679
14671
  var import_jsx_runtime30 = require("react/jsx-runtime");
14680
- var import_react24 = __toESM(require("react"), 1);
14672
+ var import_react23 = __toESM(require("react"), 1);
14681
14673
  var import_jsx_runtime31 = require("react/jsx-runtime");
14682
- var import_react25 = __toESM(require("react"), 1);
14674
+ var import_react24 = __toESM(require("react"), 1);
14683
14675
  var import_jsx_runtime32 = require("react/jsx-runtime");
14684
- var import_react26 = __toESM(require("react"), 1);
14676
+ var import_react25 = __toESM(require("react"), 1);
14685
14677
  var import_jsx_runtime33 = require("react/jsx-runtime");
14686
14678
  var import_jsx_runtime34 = require("react/jsx-runtime");
14687
- var StageContext = (0, import_react19.createContext)(
14679
+ var StageContext = (0, import_react18.createContext)(
14688
14680
  new Proxy({}, {
14689
14681
  get: () => {
14690
14682
  throw new Error("Missing StageContext.Provider");
@@ -14692,8 +14684,8 @@ var StageContext = (0, import_react19.createContext)(
14692
14684
  })
14693
14685
  );
14694
14686
  var Button = (props) => {
14695
- const { call } = import_react18.default.useContext(StageContext);
14696
- const [localState, setLocalState] = import_react18.default.useState(null);
14687
+ const { call } = import_react17.default.useContext(StageContext);
14688
+ const [localState, setLocalState] = import_react17.default.useState(null);
14697
14689
  const state = localState ?? props.info.state;
14698
14690
  const { touching, handlers } = usePressable(async () => {
14699
14691
  try {
@@ -14764,9 +14756,9 @@ function nextColor(currentColor) {
14764
14756
  return "dark";
14765
14757
  }
14766
14758
  }
14767
- var LastNestedColor = import_react21.default.createContext("dark");
14759
+ var LastNestedColor = import_react20.default.createContext("dark");
14768
14760
  var NestedContent = ({ className, children }) => {
14769
- const color = import_react21.default.useContext(LastNestedColor);
14761
+ const color = import_react20.default.useContext(LastNestedColor);
14770
14762
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
14771
14763
  "div",
14772
14764
  {
@@ -14782,7 +14774,7 @@ var NestedContent = ({ className, children }) => {
14782
14774
  );
14783
14775
  };
14784
14776
  NestedContent.displayName = "NestedContent";
14785
- var GroupStateContext = import_react20.default.createContext({
14777
+ var GroupStateContext = import_react19.default.createContext({
14786
14778
  isCollapsed: () => {
14787
14779
  throw new Error("missing GroupStateContext");
14788
14780
  },
@@ -14791,9 +14783,9 @@ var GroupStateContext = import_react20.default.createContext({
14791
14783
  }
14792
14784
  });
14793
14785
  var Group2 = ({ className, info }) => {
14794
- const groupState = (0, import_react20.useContext)(GroupStateContext);
14795
- const { renderComponent, sendMessage } = (0, import_react20.useContext)(StageContext);
14796
- const [editingTitle, setEditingTitle] = (0, import_react20.useState)(false);
14786
+ const groupState = (0, import_react19.useContext)(GroupStateContext);
14787
+ const { renderComponent, sendMessage } = (0, import_react19.useContext)(StageContext);
14788
+ const [editingTitle, setEditingTitle] = (0, import_react19.useState)(false);
14797
14789
  const children = /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
14798
14790
  "div",
14799
14791
  {
@@ -14984,16 +14976,16 @@ var getRelativeCursorPosition = (elem, pageX) => {
14984
14976
  return pageX - rect.left;
14985
14977
  };
14986
14978
  var SliderButton = ({ info, className }) => {
14987
- const { sendMessage } = import_react22.default.useContext(StageContext);
14988
- const [state, setState] = import_react22.default.useState({ state: "closed" });
14989
- const input = import_react22.default.useRef(null);
14979
+ const { sendMessage } = import_react21.default.useContext(StageContext);
14980
+ const [state, setState] = import_react21.default.useState({ state: "closed" });
14981
+ const input = import_react21.default.useRef(null);
14990
14982
  const displayValue = (value2) => {
14991
14983
  if (info.max === 1 && info.min === 0) {
14992
14984
  return `${Math.round(value2 * 100)}%`;
14993
14985
  }
14994
14986
  return NUMBER_FORMATTER.format(value2);
14995
14987
  };
14996
- const sendValue = (0, import_react22.useCallback)(
14988
+ const sendValue = (0, import_react21.useCallback)(
14997
14989
  (value2) => sendMessage?.({
14998
14990
  type: "component-message",
14999
14991
  namespace: "core",
@@ -15003,7 +14995,7 @@ var SliderButton = ({ info, className }) => {
15003
14995
  }),
15004
14996
  [sendMessage, info.key]
15005
14997
  );
15006
- const sanitizeValue = (0, import_react22.useCallback)(
14998
+ const sanitizeValue = (0, import_react21.useCallback)(
15007
14999
  (value2) => {
15008
15000
  const i = Math.round((value2 - info.min) / info.step);
15009
15001
  const v = i * info.step + info.min;
@@ -15011,13 +15003,13 @@ var SliderButton = ({ info, className }) => {
15011
15003
  },
15012
15004
  [info.min, info.max, info.step]
15013
15005
  );
15014
- const getNewValue = (0, import_react22.useCallback)(
15006
+ const getNewValue = (0, import_react21.useCallback)(
15015
15007
  (startValue, diff) => {
15016
15008
  return sanitizeValue((startValue || 0) + diff);
15017
15009
  },
15018
15010
  [sanitizeValue]
15019
15011
  );
15020
- const getCurrentInputValue = (0, import_react22.useCallback)(
15012
+ const getCurrentInputValue = (0, import_react21.useCallback)(
15021
15013
  (e) => {
15022
15014
  const float = parseFloat(e.currentTarget.value);
15023
15015
  return sanitizeValue(isNaN(float) ? info.value || 0 : float);
@@ -15205,9 +15197,9 @@ var SliderButton = ({ info, className }) => {
15205
15197
  );
15206
15198
  };
15207
15199
  var Switch = ({ className, info }) => {
15208
- const { sendMessage } = import_react23.default.useContext(StageContext);
15209
- const [touching, setTouching] = (0, import_react23.useState)(false);
15210
- const onClick = (0, import_react23.useMemo)(
15200
+ const { sendMessage } = import_react22.default.useContext(StageContext);
15201
+ const [touching, setTouching] = (0, import_react22.useState)(false);
15202
+ const onClick = (0, import_react22.useMemo)(
15211
15203
  () => () => {
15212
15204
  sendMessage?.({
15213
15205
  type: "component-message",
@@ -15218,14 +15210,14 @@ var Switch = ({ className, info }) => {
15218
15210
  },
15219
15211
  [sendMessage, info.key]
15220
15212
  );
15221
- const onTouchStart = (0, import_react23.useMemo)(
15213
+ const onTouchStart = (0, import_react22.useMemo)(
15222
15214
  () => (event) => {
15223
15215
  event.preventDefault();
15224
15216
  setTouching(true);
15225
15217
  },
15226
15218
  []
15227
15219
  );
15228
- const onTouchEnd = (0, import_react23.useMemo)(
15220
+ const onTouchEnd = (0, import_react22.useMemo)(
15229
15221
  () => (event) => {
15230
15222
  event.preventDefault();
15231
15223
  setTouching(false);
@@ -15323,9 +15315,9 @@ var Switch = ({ className, info }) => {
15323
15315
  );
15324
15316
  };
15325
15317
  var Tabs = (props) => {
15326
- const { renderComponent } = import_react24.default.useContext(StageContext);
15327
- const [touching, setTouching] = import_react24.default.useState(null);
15328
- const [currentTab, setCurrentTab] = import_react24.default.useState(0);
15318
+ const { renderComponent } = import_react23.default.useContext(StageContext);
15319
+ const [touching, setTouching] = import_react23.default.useState(null);
15320
+ const [currentTab, setCurrentTab] = import_react23.default.useState(0);
15329
15321
  const tab = props.info.tabs[currentTab];
15330
15322
  return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
15331
15323
  "div",
@@ -15376,9 +15368,9 @@ var Tabs = (props) => {
15376
15368
  );
15377
15369
  };
15378
15370
  var TextInput = ({ className, info }) => {
15379
- const { sendMessage } = import_react25.default.useContext(StageContext);
15380
- const ref = import_react25.default.useRef(null);
15381
- (0, import_react25.useEffect)(() => {
15371
+ const { sendMessage } = import_react24.default.useContext(StageContext);
15372
+ const ref = import_react24.default.useRef(null);
15373
+ (0, import_react24.useEffect)(() => {
15382
15374
  if (ref.current && ref.current.value !== info.value) {
15383
15375
  ref.current.value = info.value;
15384
15376
  }
@@ -15408,13 +15400,13 @@ var TextInput = ({ className, info }) => {
15408
15400
  };
15409
15401
  var Timeline = (props) => {
15410
15402
  const { className, info } = props;
15411
- const { timeDifferenceMs } = (0, import_react26.useContext)(StageContext);
15412
- const frameState = import_react26.default.useRef({
15403
+ const { timeDifferenceMs } = (0, import_react25.useContext)(StageContext);
15404
+ const frameState = import_react25.default.useRef({
15413
15405
  animationFrame: -1,
15414
15406
  state: null
15415
15407
  });
15416
- const [currentTimeMillis, setCurrentTimeMillis] = (0, import_react26.useState)(0);
15417
- (0, import_react26.useEffect)(() => {
15408
+ const [currentTimeMillis, setCurrentTimeMillis] = (0, import_react25.useState)(0);
15409
+ (0, import_react25.useEffect)(() => {
15418
15410
  frameState.current.state = info.state;
15419
15411
  const recalculateCurrentTimeMillis = () => {
15420
15412
  if (frameState.current.state !== info.state) {
@@ -15511,11 +15503,11 @@ var CORE_FRONTEND_COMPONENT_RENDERER = {
15511
15503
  };
15512
15504
 
15513
15505
  // ../../packages/sigil/dist/frontend.js
15506
+ var import_react26 = require("react");
15514
15507
  var import_react27 = require("react");
15515
- var import_react28 = require("react");
15516
15508
  var import_jsx_runtime35 = require("react/jsx-runtime");
15517
15509
  var import_jsx_runtime36 = require("react/jsx-runtime");
15518
- var import_react29 = require("react");
15510
+ var import_react28 = require("react");
15519
15511
  var import_jsx_runtime37 = require("react/jsx-runtime");
15520
15512
  var import_frontend = require("@arcanejs/toolkit/frontend");
15521
15513
  var import_jsx_runtime38 = require("react/jsx-runtime");
@@ -15607,7 +15599,7 @@ var createDefaultBrowserContext = (browser) => {
15607
15599
  ...browser
15608
15600
  };
15609
15601
  };
15610
- var BrowserContext = (0, import_react28.createContext)(
15602
+ var BrowserContext = (0, import_react27.createContext)(
15611
15603
  new Proxy({}, {
15612
15604
  get: () => {
15613
15605
  throw new Error("BrowserContext not provided.");
@@ -15620,16 +15612,16 @@ var BrowserContextProvider = ({
15620
15612
  }) => {
15621
15613
  return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(BrowserContext.Provider, { value: browser, children });
15622
15614
  };
15623
- var useBrowserContext = () => (0, import_react28.useContext)(BrowserContext);
15615
+ var useBrowserContext = () => (0, import_react27.useContext)(BrowserContext);
15624
15616
  var AppRoot = ({
15625
15617
  info,
15626
15618
  browser
15627
15619
  }) => {
15628
15620
  const { child, lastLog } = info;
15629
- const { renderComponent, call } = (0, import_react27.useContext)(StageContext);
15630
- const [logs, setLogs] = (0, import_react27.useState)({ lastLog: -1, logs: [] });
15631
- const [debugMode, setDebugMode] = (0, import_react27.useState)(false);
15632
- (0, import_react27.useEffect)(() => {
15621
+ const { renderComponent, call } = (0, import_react26.useContext)(StageContext);
15622
+ const [logs, setLogs] = (0, import_react26.useState)({ lastLog: -1, logs: [] });
15623
+ const [debugMode, setDebugMode] = (0, import_react26.useState)(false);
15624
+ (0, import_react26.useEffect)(() => {
15633
15625
  if (!debugMode || !call) return;
15634
15626
  const lastLogId = logs.logs[logs.logs.length - 1]?.index ?? -1;
15635
15627
  call({
@@ -15646,7 +15638,7 @@ var AppRoot = ({
15646
15638
  });
15647
15639
  });
15648
15640
  }, [call, debugMode, info.key, lastLog, logs]);
15649
- const debuggerContext = (0, import_react27.useMemo)(
15641
+ const debuggerContext = (0, import_react26.useMemo)(
15650
15642
  () => ({
15651
15643
  logs: logs.logs,
15652
15644
  setDebugMode
@@ -15671,12 +15663,12 @@ Caused by: ${unwrapErrorStack(error.cause)}`;
15671
15663
  return stack;
15672
15664
  };
15673
15665
  var Debugger = ({ title, className }) => {
15674
- const scrollRef = (0, import_react29.useRef)(null);
15675
- const shouldScrollToBottom = (0, import_react29.useRef)(true);
15666
+ const scrollRef = (0, import_react28.useRef)(null);
15667
+ const shouldScrollToBottom = (0, import_react28.useRef)(true);
15676
15668
  const { openDevTools } = useBrowserContext();
15677
15669
  const { setDebugMode, logs } = useDebuggerContext();
15678
15670
  const system = useSystemInformation();
15679
- (0, import_react29.useEffect)(() => {
15671
+ (0, import_react28.useEffect)(() => {
15680
15672
  setDebugMode(true);
15681
15673
  return () => {
15682
15674
  setDebugMode(false);
@@ -15687,19 +15679,19 @@ var Debugger = ({ title, className }) => {
15687
15679
  const { scrollTop, scrollHeight, clientHeight } = scrollRef.current;
15688
15680
  shouldScrollToBottom.current = scrollTop + clientHeight >= scrollHeight - 10;
15689
15681
  };
15690
- const scrollToBottomIfRequired = (0, import_react29.useCallback)(() => {
15682
+ const scrollToBottomIfRequired = (0, import_react28.useCallback)(() => {
15691
15683
  if (shouldScrollToBottom.current && scrollRef.current) {
15692
15684
  scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
15693
15685
  }
15694
15686
  }, []);
15695
- (0, import_react29.useEffect)(scrollToBottomIfRequired, [logs, scrollToBottomIfRequired]);
15696
- (0, import_react29.useEffect)(() => {
15687
+ (0, import_react28.useEffect)(scrollToBottomIfRequired, [logs, scrollToBottomIfRequired]);
15688
+ (0, import_react28.useEffect)(() => {
15697
15689
  window.addEventListener("resize", scrollToBottomIfRequired);
15698
15690
  return () => {
15699
15691
  window.removeEventListener("resize", scrollToBottomIfRequired);
15700
15692
  };
15701
15693
  }, [scrollToBottomIfRequired]);
15702
- const exportLogs = (0, import_react29.useCallback)(() => {
15694
+ const exportLogs = (0, import_react28.useCallback)(() => {
15703
15695
  const logText = JSON.stringify({ system, logs }, null, 2);
15704
15696
  const blob = new Blob([logText], { type: "application/json" });
15705
15697
  const url = URL.createObjectURL(blob);
@@ -15709,7 +15701,7 @@ var Debugger = ({ title, className }) => {
15709
15701
  link.click();
15710
15702
  URL.revokeObjectURL(url);
15711
15703
  }, [system, logs]);
15712
- const handleRequestScrollToBottom = (0, import_react29.useCallback)(() => {
15704
+ const handleRequestScrollToBottom = (0, import_react28.useCallback)(() => {
15713
15705
  shouldScrollToBottom.current = true;
15714
15706
  scrollToBottomIfRequired();
15715
15707
  }, [scrollToBottomIfRequired]);
@@ -15890,7 +15882,12 @@ var OUTPUT_CONFIG = zod_default.object({
15890
15882
  var TOOLBOX_CONFIG = zod_default.object({
15891
15883
  inputs: zod_default.record(zod_default.string(), INPUT_CONFIG),
15892
15884
  generators: zod_default.record(zod_default.string(), GENERATOR_CONFIG),
15893
- outputs: zod_default.record(zod_default.string(), OUTPUT_CONFIG)
15885
+ outputs: zod_default.record(zod_default.string(), OUTPUT_CONFIG),
15886
+ /**
15887
+ * Hash of the license the user has agreed to.
15888
+ */
15889
+ agreedToLicense: zod_default.string().optional(),
15890
+ checkForUpdates: zod_default.boolean().optional().default(true)
15894
15891
  });
15895
15892
  var isTimecodeInstance = (instance) => instance !== null && "state" in instance && "metadata" in instance;
15896
15893
  var isTimecodeGroup = (instance) => instance !== null && "timecodes" in instance;
@@ -15898,83 +15895,7 @@ var NAMESPACE = "timecode-toolbox";
15898
15895
  var isTimecodeToolboxComponent = (component) => component.namespace === NAMESPACE;
15899
15896
 
15900
15897
  // src/components/frontend/toolbox/root.tsx
15901
- var import_react38 = require("react");
15902
-
15903
- // src/components/frontend/toolbox/core/size-aware-div.tsx
15904
- var import_react30 = require("react");
15905
- var import_jsx_runtime39 = require("react/jsx-runtime");
15906
- var SizeAwareDiv = ({
15907
- children,
15908
- style,
15909
- ...rest
15910
- }) => {
15911
- const [div, setDiv] = (0, import_react30.useState)(null);
15912
- const [rect, setRect] = (0, import_react30.useState)(null);
15913
- (0, import_react30.useEffect)(() => {
15914
- if (!div) {
15915
- return;
15916
- }
15917
- const resizeObserver = new ResizeObserver((entries) => {
15918
- for (const entry of entries) {
15919
- setRect(entry.contentRect);
15920
- }
15921
- });
15922
- resizeObserver.observe(div);
15923
- return () => {
15924
- resizeObserver.disconnect();
15925
- };
15926
- }, [div]);
15927
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
15928
- "div",
15929
- {
15930
- ref: setDiv,
15931
- ...rest,
15932
- style: {
15933
- ...style,
15934
- ...rect && cssVariables({
15935
- "--size-aware-div-width": rect.width + "px",
15936
- "--size-aware-div-height": rect.height + "px"
15937
- })
15938
- },
15939
- children
15940
- }
15941
- );
15942
- };
15943
-
15944
- // src/components/frontend/toolbox/content.tsx
15945
- var import_jsx_runtime40 = require("react/jsx-runtime");
15946
- var ExternalLink = ({
15947
- href,
15948
- children
15949
- }) => {
15950
- const { openExternalLink } = useBrowserContext();
15951
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
15952
- "a",
15953
- {
15954
- href,
15955
- target: "_blank",
15956
- rel: "noopener noreferrer",
15957
- onClick: (e) => {
15958
- e.preventDefault();
15959
- openExternalLink(href);
15960
- },
15961
- className: "\n text-sigil-usage-hint-foreground no-underline\n hover:underline\n ",
15962
- children
15963
- }
15964
- );
15965
- };
15966
- var NoToolboxChildren = ({ text }) => {
15967
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
15968
- SizeAwareDiv,
15969
- {
15970
- className: "\n flex grow flex-col items-center justify-center gap-1 bg-sigil-bg-light\n p-1 text-sigil-foreground-muted\n ",
15971
- children: [
15972
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Icon2, { icon: "handyman", className: "text-block-icon" }),
15973
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "text-center", children: text })
15974
- ]
15975
- }
15976
- );
15977
- };
15898
+ var import_react42 = require("react");
15978
15899
 
15979
15900
  // ../../packages/artnet/dist/chunk-J2HDMITA.js
15980
15901
  var ARTNET_PORT = 6454;
@@ -15991,6 +15912,7 @@ var MS_FORMAT = new Intl.NumberFormat(void 0, {
15991
15912
  unit: "millisecond",
15992
15913
  maximumFractionDigits: 0
15993
15914
  });
15915
+ var SOURCE_CODE_URL = "https://github.com/ArcaneWizards/open-source/tree/main/apps/timecode-toolbox";
15994
15916
  var STRINGS = {
15995
15917
  title: "Timecode Toolbox",
15996
15918
  debugger: "Debug Tools & Log",
@@ -15999,6 +15921,10 @@ var STRINGS = {
15999
15921
  openInNewWindow: "Open in new window",
16000
15922
  toggle: (text) => `Toggle ${text}`,
16001
15923
  close: (text) => `Close ${text}`,
15924
+ license: "License & About",
15925
+ acceptLicense: "Accept License",
15926
+ licensePrompt: "Please review and accept the license to use Timecode Toolbox",
15927
+ sourceCode: "Source Code",
16002
15928
  protocols: {
16003
15929
  artnet: {
16004
15930
  short: "ArtNet",
@@ -16058,30 +15984,41 @@ var STRINGS = {
16058
15984
  },
16059
15985
  errors: {
16060
15986
  unknownTimecodeID: "Unknown timecode ID, please close the window"
15987
+ },
15988
+ updates: {
15989
+ updateAvailable: (current, latest) => `Version ${latest} is available! You are currently on version ${current}.`,
15990
+ download: "Download",
15991
+ settingsLabel: "Automatically check for updates",
15992
+ settingsDetails: `When enabled, the app will automatically check for updates periodically and display a message when a new version is available.`,
15993
+ lastChecked: (time) => `Last checked: ${time}`
15994
+ },
15995
+ general: {
15996
+ enabled: "Enabled",
15997
+ disabled: "Disabled"
16061
15998
  }
16062
15999
  };
16063
16000
 
16064
16001
  // src/components/frontend/toolbox/outputs.tsx
16065
- var import_react33 = require("react");
16002
+ var import_react32 = require("react");
16066
16003
 
16067
16004
  // src/components/frontend/toolbox/util.tsx
16068
- var import_jsx_runtime41 = require("react/jsx-runtime");
16005
+ var import_jsx_runtime39 = require("react/jsx-runtime");
16069
16006
  var PrimaryToolboxSection = ({
16070
16007
  title,
16071
16008
  children,
16072
16009
  buttons
16073
16010
  }) => {
16074
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex grow gap-px", children: [
16075
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16011
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "flex grow gap-px", children: [
16012
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
16076
16013
  "div",
16077
16014
  {
16078
16015
  className: "\n flex items-center justify-center bg-sigil-bg-light p-1\n writing-mode-vertical-rl\n ",
16079
16016
  children: title
16080
16017
  }
16081
16018
  ),
16082
- /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex grow flex-col gap-px", children: [
16083
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "flex grow flex-col gap-px", children }),
16084
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "flex w-full flex-wrap gap-1 bg-sigil-bg-light p-1", children: buttons })
16019
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: "flex grow flex-col gap-px", children: [
16020
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "flex grow flex-col gap-px", children }),
16021
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "flex w-full flex-wrap gap-1 bg-sigil-bg-light p-1", children: buttons })
16085
16022
  ] })
16086
16023
  ] });
16087
16024
  };
@@ -16101,31 +16038,31 @@ function displayMillis(totalMilliseconds) {
16101
16038
  }
16102
16039
 
16103
16040
  // src/components/frontend/toolbox/context.tsx
16104
- var import_react31 = require("react");
16105
- var ConfigContext = (0, import_react31.createContext)(
16041
+ var import_react29 = require("react");
16042
+ var ConfigContext = (0, import_react29.createContext)(
16106
16043
  new Proxy({}, {
16107
16044
  get() {
16108
16045
  throw new Error("ConfigContext not initialized");
16109
16046
  }
16110
16047
  })
16111
16048
  );
16112
- var ApplicationStateContext = (0, import_react31.createContext)(
16049
+ var ApplicationStateContext = (0, import_react29.createContext)(
16113
16050
  new Proxy({}, {
16114
16051
  get() {
16115
16052
  throw new Error("ApplicationStateContext not initialized");
16116
16053
  }
16117
16054
  })
16118
16055
  );
16119
- var useApplicationState = () => (0, import_react31.useContext)(ApplicationStateContext);
16120
- var ApplicationHandlersContext = (0, import_react31.createContext)(
16056
+ var useApplicationState = () => (0, import_react29.useContext)(ApplicationStateContext);
16057
+ var ApplicationHandlersContext = (0, import_react29.createContext)(
16121
16058
  new Proxy({}, {
16122
16059
  get() {
16123
16060
  throw new Error("ApplicationHandlersContext not initialized");
16124
16061
  }
16125
16062
  })
16126
16063
  );
16127
- var useApplicationHandlers = () => (0, import_react31.useContext)(ApplicationHandlersContext);
16128
- var NetworkContext = (0, import_react31.createContext)(
16064
+ var useApplicationHandlers = () => (0, import_react29.useContext)(ApplicationHandlersContext);
16065
+ var NetworkContext = (0, import_react29.createContext)(
16129
16066
  new Proxy({}, {
16130
16067
  get() {
16131
16068
  throw new Error("NetworkContext not initialized");
@@ -16134,7 +16071,48 @@ var NetworkContext = (0, import_react31.createContext)(
16134
16071
  );
16135
16072
 
16136
16073
  // src/components/frontend/toolbox/core/timecode-display.tsx
16137
- var import_react32 = require("react");
16074
+ var import_react31 = require("react");
16075
+
16076
+ // src/components/frontend/toolbox/core/size-aware-div.tsx
16077
+ var import_react30 = require("react");
16078
+ var import_jsx_runtime40 = require("react/jsx-runtime");
16079
+ var SizeAwareDiv = ({
16080
+ children,
16081
+ style,
16082
+ ...rest
16083
+ }) => {
16084
+ const [div, setDiv] = (0, import_react30.useState)(null);
16085
+ const [rect, setRect] = (0, import_react30.useState)(null);
16086
+ (0, import_react30.useEffect)(() => {
16087
+ if (!div) {
16088
+ return;
16089
+ }
16090
+ const resizeObserver = new ResizeObserver((entries) => {
16091
+ for (const entry of entries) {
16092
+ setRect(entry.contentRect);
16093
+ }
16094
+ });
16095
+ resizeObserver.observe(div);
16096
+ return () => {
16097
+ resizeObserver.disconnect();
16098
+ };
16099
+ }, [div]);
16100
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
16101
+ "div",
16102
+ {
16103
+ ref: setDiv,
16104
+ ...rest,
16105
+ style: {
16106
+ ...style,
16107
+ ...rect && cssVariables({
16108
+ "--size-aware-div-width": rect.width + "px",
16109
+ "--size-aware-div-height": rect.height + "px"
16110
+ })
16111
+ },
16112
+ children
16113
+ }
16114
+ );
16115
+ };
16138
16116
 
16139
16117
  // src/tree.ts
16140
16118
  var isTreeNode = (node) => "children" in node && typeof node.children === "object" && node.children !== null;
@@ -16241,14 +16219,14 @@ var augmentUpstreamTimecodeWithOutputMetadata = (tc, config) => {
16241
16219
  };
16242
16220
 
16243
16221
  // src/components/frontend/toolbox/core/timecode-display.tsx
16244
- var import_jsx_runtime42 = require("react/jsx-runtime");
16222
+ var import_jsx_runtime41 = require("react/jsx-runtime");
16245
16223
  var ActiveTimecodeText = ({
16246
16224
  effectiveStartTimeMillis,
16247
16225
  speed
16248
16226
  }) => {
16249
- const [millis, setMillis] = (0, import_react32.useState)(0);
16250
- const { timeDifferenceMs } = (0, import_react32.useContext)(StageContext);
16251
- (0, import_react32.useEffect)(() => {
16227
+ const [millis, setMillis] = (0, import_react31.useState)(0);
16228
+ const { timeDifferenceMs } = (0, import_react31.useContext)(StageContext);
16229
+ (0, import_react31.useEffect)(() => {
16252
16230
  let animationFrame = null;
16253
16231
  const updateMillis = () => {
16254
16232
  const newMillis = (Date.now() - (timeDifferenceMs ?? 0) - effectiveStartTimeMillis) * speed;
@@ -16265,9 +16243,9 @@ var ActiveTimecodeText = ({
16265
16243
  return displayMillis(millis);
16266
16244
  };
16267
16245
  var Timeline2 = ({ state, totalTime }) => {
16268
- const [millis, setMillis] = (0, import_react32.useState)(0);
16269
- const { timeDifferenceMs } = (0, import_react32.useContext)(StageContext);
16270
- (0, import_react32.useEffect)(() => {
16246
+ const [millis, setMillis] = (0, import_react31.useState)(0);
16247
+ const { timeDifferenceMs } = (0, import_react31.useContext)(StageContext);
16248
+ (0, import_react31.useEffect)(() => {
16271
16249
  if (state.state === "none") {
16272
16250
  setMillis(0);
16273
16251
  return;
@@ -16289,7 +16267,7 @@ var Timeline2 = ({ state, totalTime }) => {
16289
16267
  }
16290
16268
  };
16291
16269
  }, [state, timeDifferenceMs]);
16292
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "w-full border border-timecode-usage-foreground p-px", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "relative h-1 w-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16270
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "w-full border border-timecode-usage-foreground p-px", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "relative h-1 w-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16293
16271
  "div",
16294
16272
  {
16295
16273
  className: "absolute inset-y-0 left-0 bg-timecode-usage-foreground",
@@ -16307,32 +16285,32 @@ var TimecodeDisplay = ({
16307
16285
  }) => {
16308
16286
  const { handlers, callHandler } = useApplicationHandlers();
16309
16287
  const hooks = id && getTreeValue(handlers, id);
16310
- const play = (0, import_react32.useCallback)(() => {
16288
+ const play = (0, import_react31.useCallback)(() => {
16311
16289
  if (id) {
16312
16290
  callHandler({ handler: "play", path: id, args: [] });
16313
16291
  }
16314
16292
  }, [callHandler, id]);
16315
- const pause = (0, import_react32.useCallback)(() => {
16293
+ const pause = (0, import_react31.useCallback)(() => {
16316
16294
  if (id) {
16317
16295
  callHandler({ handler: "pause", path: id, args: [] });
16318
16296
  }
16319
16297
  }, [callHandler, id]);
16320
- const back5seconds = (0, import_react32.useCallback)(() => {
16298
+ const back5seconds = (0, import_react31.useCallback)(() => {
16321
16299
  if (id) {
16322
16300
  callHandler({ handler: "seekRelative", path: id, args: [-5e3] });
16323
16301
  }
16324
16302
  }, [callHandler, id]);
16325
- const forward5seconds = (0, import_react32.useCallback)(() => {
16303
+ const forward5seconds = (0, import_react31.useCallback)(() => {
16326
16304
  if (id) {
16327
16305
  callHandler({ handler: "seekRelative", path: id, args: [5e3] });
16328
16306
  }
16329
16307
  }, [callHandler, id]);
16330
- const beginning = (0, import_react32.useCallback)(() => {
16308
+ const beginning = (0, import_react31.useCallback)(() => {
16331
16309
  if (id) {
16332
16310
  callHandler({ handler: "beginning", path: id, args: [] });
16333
16311
  }
16334
16312
  }, [callHandler, id]);
16335
- const toggle = (0, import_react32.useCallback)(() => {
16313
+ const toggle = (0, import_react31.useCallback)(() => {
16336
16314
  if (hooks?.play && hooks?.pause) {
16337
16315
  if (state.state === "none" || state.state === "stopped") {
16338
16316
  play();
@@ -16341,8 +16319,8 @@ var TimecodeDisplay = ({
16341
16319
  }
16342
16320
  }
16343
16321
  }, [hooks, play, pause, state.state]);
16344
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "flex grow flex-col gap-px", children: [
16345
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
16322
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex grow flex-col gap-px", children: [
16323
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
16346
16324
  "div",
16347
16325
  {
16348
16326
  className: cn(
@@ -16354,8 +16332,8 @@ var TimecodeDisplay = ({
16354
16332
  )
16355
16333
  ),
16356
16334
  children: [
16357
- headerComponents && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "flex flex-wrap gap-0.25", children: headerComponents }),
16358
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16335
+ headerComponents && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "flex flex-wrap gap-0.25", children: headerComponents }),
16336
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16359
16337
  SizeAwareDiv,
16360
16338
  {
16361
16339
  className: cn(
@@ -16370,7 +16348,7 @@ var TimecodeDisplay = ({
16370
16348
  )
16371
16349
  ),
16372
16350
  onClick: toggle,
16373
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: cn("font-mono text-timecode-adaptive"), children: state.state === "none" ? "--:--:--:---" : state.state === "stopped" ? displayMillis(state.positionMillis) : /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16351
+ children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: cn("font-mono text-timecode-adaptive"), children: state.state === "none" ? "--:--:--:---" : state.state === "stopped" ? displayMillis(state.positionMillis) : /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16374
16352
  ActiveTimecodeText,
16375
16353
  {
16376
16354
  effectiveStartTimeMillis: state.effectiveStartTimeMillis,
@@ -16379,8 +16357,8 @@ var TimecodeDisplay = ({
16379
16357
  ) }) })
16380
16358
  }
16381
16359
  ),
16382
- hooks?.pause || hooks?.play ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "flex justify-center gap-px", children: [
16383
- hooks.beginning && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16360
+ hooks?.pause || hooks?.play ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex justify-center gap-px", children: [
16361
+ hooks.beginning && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16384
16362
  ControlButton,
16385
16363
  {
16386
16364
  onClick: beginning,
@@ -16391,7 +16369,7 @@ var TimecodeDisplay = ({
16391
16369
  className: "text-timecode-usage-foreground!"
16392
16370
  }
16393
16371
  ),
16394
- hooks.seekRelative && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16372
+ hooks.seekRelative && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16395
16373
  ControlButton,
16396
16374
  {
16397
16375
  onClick: back5seconds,
@@ -16402,7 +16380,7 @@ var TimecodeDisplay = ({
16402
16380
  className: "text-timecode-usage-foreground!"
16403
16381
  }
16404
16382
  ),
16405
- state.state === "none" || state.state === "stopped" ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16383
+ state.state === "none" || state.state === "stopped" ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16406
16384
  ControlButton,
16407
16385
  {
16408
16386
  onClick: play,
@@ -16412,7 +16390,7 @@ var TimecodeDisplay = ({
16412
16390
  title: STRINGS.controls.play,
16413
16391
  className: "text-timecode-usage-foreground!"
16414
16392
  }
16415
- ) : /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16393
+ ) : /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16416
16394
  ControlButton,
16417
16395
  {
16418
16396
  onClick: pause,
@@ -16423,7 +16401,7 @@ var TimecodeDisplay = ({
16423
16401
  className: "text-timecode-usage-foreground!"
16424
16402
  }
16425
16403
  ),
16426
- hooks.seekRelative && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16404
+ hooks.seekRelative && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16427
16405
  ControlButton,
16428
16406
  {
16429
16407
  onClick: forward5seconds,
@@ -16435,33 +16413,33 @@ var TimecodeDisplay = ({
16435
16413
  }
16436
16414
  )
16437
16415
  ] }) : null,
16438
- metadata?.totalTime && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Timeline2, { state, totalTime: metadata.totalTime })
16416
+ metadata?.totalTime && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Timeline2, { state, totalTime: metadata.totalTime })
16439
16417
  ]
16440
16418
  }
16441
16419
  ),
16442
- (state.smpteMode !== null || state.accuracyMillis !== null || config.delayMs !== null) && /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "flex gap-px", children: [
16443
- config.delayMs !== null && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.delay(config.delayMs) }),
16444
- state.smpteMode !== null && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.smtpeModes[state.smpteMode] }),
16445
- state.accuracyMillis !== null && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.accuracy(state.accuracyMillis) })
16420
+ (state.smpteMode !== null || state.accuracyMillis !== null || config.delayMs !== null) && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex gap-px", children: [
16421
+ config.delayMs !== null && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.delay(config.delayMs) }),
16422
+ state.smpteMode !== null && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.smtpeModes[state.smpteMode] }),
16423
+ state.accuracyMillis !== null && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "grow basis-0 truncate bg-sigil-bg-light p-0.5", children: STRINGS.accuracy(state.accuracyMillis) })
16446
16424
  ] }),
16447
- metadata?.artist || metadata?.title ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16425
+ metadata?.artist || metadata?.title ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16448
16426
  TooltipWrapper,
16449
16427
  {
16450
- tooltip: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
16451
- metadata.title && /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { children: [
16452
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "font-bold", children: "Title:" }),
16428
+ tooltip: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_jsx_runtime41.Fragment, { children: [
16429
+ metadata.title && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { children: [
16430
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "font-bold", children: "Title:" }),
16453
16431
  " ",
16454
16432
  metadata.title
16455
16433
  ] }),
16456
- metadata.artist && /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { children: [
16457
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "font-bold", children: "Artist:" }),
16434
+ metadata.artist && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { children: [
16435
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "font-bold", children: "Artist:" }),
16458
16436
  " ",
16459
16437
  metadata.artist
16460
16438
  ] })
16461
16439
  ] }),
16462
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "flex gap-px", children: [
16463
- metadata.title && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "grow truncate bg-sigil-bg-light p-0.5 font-bold", children: metadata.title }),
16464
- metadata.artist && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "grow truncate bg-sigil-bg-light p-0.5", children: metadata.artist })
16440
+ children: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex gap-px", children: [
16441
+ metadata.title && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "grow truncate bg-sigil-bg-light p-0.5 font-bold", children: metadata.title }),
16442
+ metadata.artist && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "grow truncate bg-sigil-bg-light p-0.5", children: metadata.artist })
16465
16443
  ] })
16466
16444
  }
16467
16445
  ) : null
@@ -16492,7 +16470,7 @@ var TimecodeTreeDisplay = ({
16492
16470
  assignToOutput
16493
16471
  }) => {
16494
16472
  const { openNewWidow } = useBrowserContext();
16495
- const openInNewWindow = (0, import_react32.useCallback)(() => {
16473
+ const openInNewWindow = (0, import_react31.useCallback)(() => {
16496
16474
  if (id) {
16497
16475
  openNewWidow(withUrlFragment({ values: { tc: id } }).href, {
16498
16476
  canUseExisting: false,
@@ -16502,7 +16480,7 @@ var TimecodeTreeDisplay = ({
16502
16480
  }, [id, openNewWidow]);
16503
16481
  name = timecode?.name ? [...name, timecode.name] : name;
16504
16482
  if (isTimecodeGroup(timecode) && Object.values(timecode.timecodes).length) {
16505
- return Object.entries(timecode.timecodes).map(([key, child]) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16483
+ return Object.entries(timecode.timecodes).map(([key, child]) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16506
16484
  TimecodeTreeDisplay,
16507
16485
  {
16508
16486
  config,
@@ -16518,28 +16496,28 @@ var TimecodeTreeDisplay = ({
16518
16496
  key
16519
16497
  ));
16520
16498
  }
16521
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
16499
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
16522
16500
  "div",
16523
16501
  {
16524
16502
  className: "relative flex grow flex-col text-timecode-usage-foreground",
16525
16503
  style: color && cssSigilColorUsageVariables("timecode-usage", sigilColorUsage(color)),
16526
16504
  children: [
16527
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16505
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16528
16506
  TimecodeDisplay,
16529
16507
  {
16530
16508
  id,
16531
16509
  timecode: isTimecodeInstance(timecode) ? timecode : EMPTY_TIMECODE,
16532
16510
  config,
16533
- headerComponents: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
16534
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "flex grow items-start gap-0.25", children: [
16535
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16511
+ headerComponents: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_jsx_runtime41.Fragment, { children: [
16512
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "flex grow items-start gap-0.25", children: [
16513
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16536
16514
  "div",
16537
16515
  {
16538
16516
  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 ",
16539
16517
  children: type
16540
16518
  }
16541
16519
  ),
16542
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16520
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16543
16521
  "div",
16544
16522
  {
16545
16523
  className: cn(
@@ -16550,8 +16528,8 @@ var TimecodeTreeDisplay = ({
16550
16528
  }
16551
16529
  )
16552
16530
  ] }),
16553
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(ControlButtonGroup, { className: "rounded-md bg-sigil-bg-light", children: [
16554
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16531
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(ControlButtonGroup, { className: "rounded-md bg-sigil-bg-light", children: [
16532
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16555
16533
  ControlButton,
16556
16534
  {
16557
16535
  variant: "toolbar",
@@ -16565,12 +16543,12 @@ var TimecodeTreeDisplay = ({
16565
16543
  ] })
16566
16544
  }
16567
16545
  ),
16568
- assignToOutput && id && !isOutputInstanceId(id) && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16546
+ assignToOutput && id && !isOutputInstanceId(id) && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16569
16547
  SizeAwareDiv,
16570
16548
  {
16571
16549
  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 ",
16572
16550
  onClick: () => assignToOutput(id),
16573
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon2, { icon: "link", className: "text-block-icon" })
16551
+ children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Icon2, { icon: "link", className: "text-block-icon" })
16574
16552
  }
16575
16553
  )
16576
16554
  ]
@@ -16580,9 +16558,9 @@ var TimecodeTreeDisplay = ({
16580
16558
  var FullscreenTimecodeDisplay = ({
16581
16559
  id
16582
16560
  }) => {
16583
- const { config } = (0, import_react32.useContext)(ConfigContext);
16584
- const applicationState = (0, import_react32.useContext)(ApplicationStateContext);
16585
- const timecode = (0, import_react32.useMemo)(() => {
16561
+ const { config } = (0, import_react31.useContext)(ConfigContext);
16562
+ const applicationState = (0, import_react31.useContext)(ApplicationStateContext);
16563
+ const timecode = (0, import_react31.useMemo)(() => {
16586
16564
  if (isInputInstanceId(id) || isGeneratorInstanceId(id)) {
16587
16565
  return getTimecodeInstance(applicationState, id);
16588
16566
  } else {
@@ -16596,7 +16574,7 @@ var FullscreenTimecodeDisplay = ({
16596
16574
  );
16597
16575
  }
16598
16576
  }, [applicationState, id, config.outputs]);
16599
- const instanceConfig = (0, import_react32.useMemo)(() => {
16577
+ const instanceConfig = (0, import_react31.useMemo)(() => {
16600
16578
  if (isInputInstanceId(id)) {
16601
16579
  const c = config.inputs[id[1]];
16602
16580
  if (!c) {
@@ -16636,22 +16614,22 @@ var FullscreenTimecodeDisplay = ({
16636
16614
  }
16637
16615
  }, [id, config]);
16638
16616
  if (!instanceConfig) {
16639
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
16617
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
16640
16618
  SizeAwareDiv,
16641
16619
  {
16642
16620
  className: "\n flex grow flex-col items-center justify-center gap-1 bg-sigil-bg-light\n p-1 text-sigil-foreground-muted\n ",
16643
16621
  children: [
16644
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon2, { icon: "question_mark", className: "text-block-icon" }),
16645
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "text-center", children: STRINGS.errors.unknownTimecodeID })
16622
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Icon2, { icon: "question_mark", className: "text-block-icon" }),
16623
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "text-center", children: STRINGS.errors.unknownTimecodeID })
16646
16624
  ]
16647
16625
  }
16648
16626
  );
16649
16627
  }
16650
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16628
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16651
16629
  "div",
16652
16630
  {
16653
16631
  className: "\n flex h-0 grow flex-col gap-px overflow-y-auto bg-sigil-border\n scrollbar-sigil\n ",
16654
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16632
+ children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
16655
16633
  TimecodeTreeDisplay,
16656
16634
  {
16657
16635
  id,
@@ -16716,20 +16694,68 @@ function v4(options, buf, offset4) {
16716
16694
  }
16717
16695
  var v4_default = v4;
16718
16696
 
16697
+ // src/components/frontend/toolbox/content.tsx
16698
+ var import_jsx_runtime42 = require("react/jsx-runtime");
16699
+ var ExternalLink = ({
16700
+ href,
16701
+ children
16702
+ }) => {
16703
+ const { openExternalLink } = useBrowserContext();
16704
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16705
+ "a",
16706
+ {
16707
+ href,
16708
+ target: "_blank",
16709
+ rel: "noopener noreferrer",
16710
+ onClick: (e) => {
16711
+ e.preventDefault();
16712
+ openExternalLink(href);
16713
+ },
16714
+ className: "\n text-sigil-usage-hint-foreground no-underline\n hover:underline\n ",
16715
+ children
16716
+ }
16717
+ );
16718
+ };
16719
+ var TextButton = ({
16720
+ onClick,
16721
+ children
16722
+ }) => {
16723
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
16724
+ "span",
16725
+ {
16726
+ onClick,
16727
+ className: "\n cursor-pointer text-sigil-usage-hint-foreground\n hover:underline\n ",
16728
+ children
16729
+ }
16730
+ );
16731
+ };
16732
+ var NoToolboxChildren = ({ text }) => {
16733
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
16734
+ SizeAwareDiv,
16735
+ {
16736
+ className: "\n flex grow flex-col items-center justify-center gap-1 bg-sigil-bg-light\n p-1 text-sigil-foreground-muted\n ",
16737
+ children: [
16738
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon2, { icon: "handyman", className: "text-block-icon" }),
16739
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "text-center", children: text })
16740
+ ]
16741
+ }
16742
+ );
16743
+ };
16744
+
16719
16745
  // src/components/frontend/toolbox/outputs.tsx
16720
16746
  var import_jsx_runtime43 = require("react/jsx-runtime");
16721
16747
  var DmxConnectionSettings = ({
16722
16748
  data,
16723
16749
  updateSettings
16724
16750
  }) => {
16725
- const { commitChanges } = (0, import_react33.useContext)(ChangeCommitContext);
16726
- const { getNetworkInterfaces } = (0, import_react33.useContext)(NetworkContext);
16727
- const [interfaces, setInterfaces] = (0, import_react33.useState)(null);
16728
- const refreshInterfaces = (0, import_react33.useCallback)(() => {
16751
+ const { commitChanges } = (0, import_react32.useContext)(ChangeCommitContext);
16752
+ const { getNetworkInterfaces } = (0, import_react32.useContext)(NetworkContext);
16753
+ const [interfaces, setInterfaces] = (0, import_react32.useState)(null);
16754
+ const refreshInterfaces = (0, import_react32.useCallback)(() => {
16729
16755
  setInterfaces(null);
16730
16756
  getNetworkInterfaces().then((ifs) => setInterfaces(ifs));
16731
16757
  }, [getNetworkInterfaces]);
16732
- (0, import_react33.useEffect)(() => {
16758
+ (0, import_react32.useEffect)(() => {
16733
16759
  refreshInterfaces();
16734
16760
  }, [refreshInterfaces]);
16735
16761
  if (data.type !== "artnet") {
@@ -16871,8 +16897,8 @@ var OutputSettingsDialog = ({
16871
16897
  output,
16872
16898
  close
16873
16899
  }) => {
16874
- const { config, updateConfig } = (0, import_react33.useContext)(ConfigContext);
16875
- const [newData, setNewData] = (0, import_react33.useState)({
16900
+ const { config, updateConfig } = (0, import_react32.useContext)(ConfigContext);
16901
+ const [newData, setNewData] = (0, import_react32.useState)({
16876
16902
  name: "",
16877
16903
  enabled: true,
16878
16904
  definition: {
@@ -16885,7 +16911,7 @@ var OutputSettingsDialog = ({
16885
16911
  },
16886
16912
  link: null
16887
16913
  });
16888
- const updateSettings = (0, import_react33.useCallback)(
16914
+ const updateSettings = (0, import_react32.useCallback)(
16889
16915
  (change) => {
16890
16916
  if (target.type === "add") {
16891
16917
  setNewData(change);
@@ -16907,7 +16933,7 @@ var OutputSettingsDialog = ({
16907
16933
  },
16908
16934
  [target, updateConfig]
16909
16935
  );
16910
- const updateDefinition = (0, import_react33.useCallback)(
16936
+ const updateDefinition = (0, import_react32.useCallback)(
16911
16937
  (change) => {
16912
16938
  updateSettings((current) => ({
16913
16939
  ...current,
@@ -16916,7 +16942,7 @@ var OutputSettingsDialog = ({
16916
16942
  },
16917
16943
  [updateSettings]
16918
16944
  );
16919
- const addOutput = (0, import_react33.useCallback)(() => {
16945
+ const addOutput = (0, import_react32.useCallback)(() => {
16920
16946
  updateConfig((current) => {
16921
16947
  return {
16922
16948
  ...current,
@@ -16930,7 +16956,7 @@ var OutputSettingsDialog = ({
16930
16956
  }, [newData, close, updateConfig]);
16931
16957
  const resolvedTarget = target.type === "add" ? "add" : config.outputs?.[target.uuid];
16932
16958
  const data = resolvedTarget === "add" ? newData : resolvedTarget;
16933
- const commitChanges = (0, import_react33.useCallback)(() => {
16959
+ const commitChanges = (0, import_react32.useCallback)(() => {
16934
16960
  if (target.type === "add") {
16935
16961
  addOutput();
16936
16962
  } else {
@@ -17031,8 +17057,8 @@ var OutputDisplay = ({
17031
17057
  setAssignToOutput
17032
17058
  }) => {
17033
17059
  const applicationState = useApplicationState();
17034
- const { updateConfig } = (0, import_react33.useContext)(ConfigContext);
17035
- const clearLink = (0, import_react33.useCallback)(() => {
17060
+ const { updateConfig } = (0, import_react32.useContext)(ConfigContext);
17061
+ const clearLink = (0, import_react32.useCallback)(() => {
17036
17062
  updateConfig((current) => {
17037
17063
  const currentOutput = current.outputs?.[uuid];
17038
17064
  if (!currentOutput) {
@@ -17051,15 +17077,15 @@ var OutputDisplay = ({
17051
17077
  });
17052
17078
  setAssignToOutput(null);
17053
17079
  }, [updateConfig, uuid, setAssignToOutput]);
17054
- const linkCallback = (0, import_react33.useCallback)(
17080
+ const linkCallback = (0, import_react32.useCallback)(
17055
17081
  () => setAssignToOutput((current) => current === uuid ? null : uuid),
17056
17082
  [uuid, setAssignToOutput]
17057
17083
  );
17058
- const timecode = (0, import_react33.useMemo)(() => {
17084
+ const timecode = (0, import_react32.useMemo)(() => {
17059
17085
  const tc = config.link && getTimecodeInstance(applicationState, config.link);
17060
17086
  return augmentUpstreamTimecodeWithOutputMetadata(tc, config);
17061
17087
  }, [applicationState, config]);
17062
- const toggleEnabled = (0, import_react33.useCallback)(() => {
17088
+ const toggleEnabled = (0, import_react32.useCallback)(() => {
17063
17089
  updateConfig((current) => {
17064
17090
  const existing = current.outputs?.[uuid];
17065
17091
  if (!existing) {
@@ -17151,7 +17177,7 @@ var OutputsSection = ({
17151
17177
  assignToOutput,
17152
17178
  setAssignToOutput
17153
17179
  }) => {
17154
- const { config } = (0, import_react33.useContext)(ConfigContext);
17180
+ const { config } = (0, import_react32.useContext)(ConfigContext);
17155
17181
  return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
17156
17182
  PrimaryToolboxSection,
17157
17183
  {
@@ -17191,13 +17217,13 @@ var OutputsSection = ({
17191
17217
  };
17192
17218
 
17193
17219
  // src/components/frontend/toolbox/generators.tsx
17194
- var import_react34 = require("react");
17220
+ var import_react33 = require("react");
17195
17221
  var import_jsx_runtime44 = require("react/jsx-runtime");
17196
17222
  var ClockSpecificSettings = ({
17197
17223
  data,
17198
17224
  updateSettings
17199
17225
  }) => {
17200
- const { commitChanges } = (0, import_react34.useContext)(ChangeCommitContext);
17226
+ const { commitChanges } = (0, import_react33.useContext)(ChangeCommitContext);
17201
17227
  if (data.type !== "clock") {
17202
17228
  return null;
17203
17229
  }
@@ -17232,15 +17258,15 @@ var GeneratorSettingsDialog = ({
17232
17258
  generator,
17233
17259
  close
17234
17260
  }) => {
17235
- const { config, updateConfig } = (0, import_react34.useContext)(ConfigContext);
17236
- const [newData, setNewData] = (0, import_react34.useState)({
17261
+ const { config, updateConfig } = (0, import_react33.useContext)(ConfigContext);
17262
+ const [newData, setNewData] = (0, import_react33.useState)({
17237
17263
  name: "",
17238
17264
  definition: {
17239
17265
  type: generator,
17240
17266
  speed: 1
17241
17267
  }
17242
17268
  });
17243
- const updateSettings = (0, import_react34.useCallback)(
17269
+ const updateSettings = (0, import_react33.useCallback)(
17244
17270
  (change) => {
17245
17271
  if (target.type === "add") {
17246
17272
  setNewData(change);
@@ -17262,7 +17288,7 @@ var GeneratorSettingsDialog = ({
17262
17288
  },
17263
17289
  [target, updateConfig]
17264
17290
  );
17265
- const updateDefinition = (0, import_react34.useCallback)(
17291
+ const updateDefinition = (0, import_react33.useCallback)(
17266
17292
  (change) => {
17267
17293
  updateSettings((current) => ({
17268
17294
  ...current,
@@ -17271,7 +17297,7 @@ var GeneratorSettingsDialog = ({
17271
17297
  },
17272
17298
  [updateSettings]
17273
17299
  );
17274
- const addGenerator = (0, import_react34.useCallback)(() => {
17300
+ const addGenerator = (0, import_react33.useCallback)(() => {
17275
17301
  updateConfig((current) => {
17276
17302
  return {
17277
17303
  ...current,
@@ -17285,7 +17311,7 @@ var GeneratorSettingsDialog = ({
17285
17311
  }, [newData, close, updateConfig]);
17286
17312
  const resolvedTarget = target.type === "add" ? "add" : config.generators?.[target.uuid];
17287
17313
  const data = resolvedTarget === "add" ? newData : resolvedTarget;
17288
- const commitChanges = (0, import_react34.useCallback)(() => {
17314
+ const commitChanges = (0, import_react33.useCallback)(() => {
17289
17315
  if (target.type === "add") {
17290
17316
  addGenerator();
17291
17317
  } else {
@@ -17396,7 +17422,7 @@ var GeneratorsSection = ({
17396
17422
  setDialogMode,
17397
17423
  assignToOutput
17398
17424
  }) => {
17399
- const { config } = (0, import_react34.useContext)(ConfigContext);
17425
+ const { config } = (0, import_react33.useContext)(ConfigContext);
17400
17426
  return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
17401
17427
  PrimaryToolboxSection,
17402
17428
  {
@@ -17435,20 +17461,20 @@ var GeneratorsSection = ({
17435
17461
  };
17436
17462
 
17437
17463
  // src/components/frontend/toolbox/inputs.tsx
17438
- var import_react35 = require("react");
17464
+ var import_react34 = require("react");
17439
17465
  var import_jsx_runtime45 = require("react/jsx-runtime");
17440
17466
  var DmxConnectionSettings2 = ({
17441
17467
  data,
17442
17468
  updateSettings
17443
17469
  }) => {
17444
- const { commitChanges } = (0, import_react35.useContext)(ChangeCommitContext);
17445
- const { getNetworkInterfaces } = (0, import_react35.useContext)(NetworkContext);
17446
- const [interfaces, setInterfaces] = (0, import_react35.useState)(null);
17447
- const refreshInterfaces = (0, import_react35.useCallback)(() => {
17470
+ const { commitChanges } = (0, import_react34.useContext)(ChangeCommitContext);
17471
+ const { getNetworkInterfaces } = (0, import_react34.useContext)(NetworkContext);
17472
+ const [interfaces, setInterfaces] = (0, import_react34.useState)(null);
17473
+ const refreshInterfaces = (0, import_react34.useCallback)(() => {
17448
17474
  setInterfaces(null);
17449
17475
  getNetworkInterfaces().then((ifs) => setInterfaces(ifs));
17450
17476
  }, [getNetworkInterfaces]);
17451
- (0, import_react35.useEffect)(() => {
17477
+ (0, import_react34.useEffect)(() => {
17452
17478
  refreshInterfaces();
17453
17479
  }, [refreshInterfaces]);
17454
17480
  if (data.type !== "artnet") {
@@ -17515,13 +17541,13 @@ var TCNetConnectionSettings = ({
17515
17541
  data,
17516
17542
  updateSettings
17517
17543
  }) => {
17518
- const { getNetworkInterfaces } = (0, import_react35.useContext)(NetworkContext);
17519
- const [interfaces, setInterfaces] = (0, import_react35.useState)(null);
17520
- const refreshInterfaces = (0, import_react35.useCallback)(() => {
17544
+ const { getNetworkInterfaces } = (0, import_react34.useContext)(NetworkContext);
17545
+ const [interfaces, setInterfaces] = (0, import_react34.useState)(null);
17546
+ const refreshInterfaces = (0, import_react34.useCallback)(() => {
17521
17547
  setInterfaces(null);
17522
17548
  getNetworkInterfaces().then((ifs) => setInterfaces(ifs));
17523
17549
  }, [getNetworkInterfaces]);
17524
- (0, import_react35.useEffect)(() => {
17550
+ (0, import_react34.useEffect)(() => {
17525
17551
  refreshInterfaces();
17526
17552
  }, [refreshInterfaces]);
17527
17553
  if (data.type !== "tcnet") {
@@ -17566,8 +17592,8 @@ var InputSettingsDialog = ({
17566
17592
  input,
17567
17593
  close
17568
17594
  }) => {
17569
- const { config, updateConfig } = (0, import_react35.useContext)(ConfigContext);
17570
- const [newData, setNewData] = (0, import_react35.useState)({
17595
+ const { config, updateConfig } = (0, import_react34.useContext)(ConfigContext);
17596
+ const [newData, setNewData] = (0, import_react34.useState)({
17571
17597
  name: "",
17572
17598
  enabled: true,
17573
17599
  definition: input === "artnet" ? {
@@ -17579,7 +17605,7 @@ var InputSettingsDialog = ({
17579
17605
  iface: ""
17580
17606
  }
17581
17607
  });
17582
- const updateSettings = (0, import_react35.useCallback)(
17608
+ const updateSettings = (0, import_react34.useCallback)(
17583
17609
  (change) => {
17584
17610
  if (target.type === "add") {
17585
17611
  setNewData(change);
@@ -17601,7 +17627,7 @@ var InputSettingsDialog = ({
17601
17627
  },
17602
17628
  [target, updateConfig]
17603
17629
  );
17604
- const updateDefinition = (0, import_react35.useCallback)(
17630
+ const updateDefinition = (0, import_react34.useCallback)(
17605
17631
  (change) => {
17606
17632
  updateSettings((current) => ({
17607
17633
  ...current,
@@ -17610,7 +17636,7 @@ var InputSettingsDialog = ({
17610
17636
  },
17611
17637
  [updateSettings]
17612
17638
  );
17613
- const addInput = (0, import_react35.useCallback)(() => {
17639
+ const addInput = (0, import_react34.useCallback)(() => {
17614
17640
  updateConfig((current) => {
17615
17641
  return {
17616
17642
  ...current,
@@ -17624,7 +17650,7 @@ var InputSettingsDialog = ({
17624
17650
  }, [newData, close, updateConfig]);
17625
17651
  const resolvedTarget = target.type === "add" ? "add" : config.inputs?.[target.uuid];
17626
17652
  const data = resolvedTarget === "add" ? newData : resolvedTarget;
17627
- const commitChanges = (0, import_react35.useCallback)(() => {
17653
+ const commitChanges = (0, import_react34.useCallback)(() => {
17628
17654
  if (target.type === "add") {
17629
17655
  addInput();
17630
17656
  } else {
@@ -17729,10 +17755,10 @@ var InputDisplay = ({
17729
17755
  setDialogMode,
17730
17756
  assignToOutput
17731
17757
  }) => {
17732
- const { updateConfig } = (0, import_react35.useContext)(ConfigContext);
17758
+ const { updateConfig } = (0, import_react34.useContext)(ConfigContext);
17733
17759
  const { inputs } = useApplicationState();
17734
17760
  const state = inputs[uuid];
17735
- const toggleEnabled = (0, import_react35.useCallback)(() => {
17761
+ const toggleEnabled = (0, import_react34.useCallback)(() => {
17736
17762
  updateConfig((current) => {
17737
17763
  const existing = current.inputs?.[uuid];
17738
17764
  if (!existing) {
@@ -17791,7 +17817,7 @@ var InputsSection = ({
17791
17817
  setDialogMode,
17792
17818
  assignToOutput
17793
17819
  }) => {
17794
- const { config } = (0, import_react35.useContext)(ConfigContext);
17820
+ const { config } = (0, import_react34.useContext)(ConfigContext);
17795
17821
  return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
17796
17822
  PrimaryToolboxSection,
17797
17823
  {
@@ -17907,24 +17933,27 @@ var diffJson = (a, b) => {
17907
17933
  return { type: "value", after: b };
17908
17934
  };
17909
17935
 
17910
- // ../../packages/sigil/dist/frontend/appearance.js
17911
- var import_react36 = require("react");
17936
+ // src/components/frontend/toolbox/settings.tsx
17937
+ var import_react37 = require("react");
17938
+
17939
+ // ../../packages/sigil/dist/frontend/appearance.js
17940
+ var import_react35 = require("react");
17912
17941
  var import_jsx_runtime46 = require("react/jsx-runtime");
17913
17942
  var AppearanceSwitcher = ({
17914
17943
  color,
17915
17944
  onColorChange
17916
17945
  }) => {
17917
17946
  const { colorSchemePreference, setColorSchemePreference } = useColorSchemePreferences();
17918
- const selectDarkMode = (0, import_react36.useCallback)(() => {
17947
+ const selectDarkMode = (0, import_react35.useCallback)(() => {
17919
17948
  setColorSchemePreference("dark");
17920
17949
  }, [setColorSchemePreference]);
17921
- const selectLightMode = (0, import_react36.useCallback)(() => {
17950
+ const selectLightMode = (0, import_react35.useCallback)(() => {
17922
17951
  setColorSchemePreference("light");
17923
17952
  }, [setColorSchemePreference]);
17924
- const selectSystemMode = (0, import_react36.useCallback)(() => {
17953
+ const selectSystemMode = (0, import_react35.useCallback)(() => {
17925
17954
  setColorSchemePreference("auto");
17926
17955
  }, [setColorSchemePreference]);
17927
- const updateHintColor = (0, import_react36.useCallback)(
17956
+ const updateHintColor = (0, import_react35.useCallback)(
17928
17957
  (color2) => {
17929
17958
  if (onColorChange) {
17930
17959
  onColorChange(color2);
@@ -17984,9 +18013,9 @@ var AppearanceSwitcher = ({
17984
18013
  };
17985
18014
 
17986
18015
  // ../../packages/sigil/dist/frontend/preferences.js
17987
- var import_react37 = require("react");
18016
+ var import_react36 = require("react");
17988
18017
  var createBrowserPreferencesHook = (def) => () => {
17989
- const [preferences, setPreference] = (0, import_react37.useState)(() => {
18018
+ const [preferences, setPreference] = (0, import_react36.useState)(() => {
17990
18019
  const stored = window.localStorage.getItem(def.key);
17991
18020
  if (stored) {
17992
18021
  try {
@@ -18007,7 +18036,7 @@ var createBrowserPreferencesHook = (def) => () => {
18007
18036
  })
18008
18037
  );
18009
18038
  };
18010
- (0, import_react37.useEffect)(() => {
18039
+ (0, import_react36.useEffect)(() => {
18011
18040
  const onStorageChange = (event) => {
18012
18041
  if (event.key === def.key) {
18013
18042
  const newValue = event.newValue;
@@ -18051,8 +18080,17 @@ var useBrowserPreferences = createBrowserPreferencesHook(TOOLBOX_PREFERENCES);
18051
18080
 
18052
18081
  // src/components/frontend/toolbox/settings.tsx
18053
18082
  var import_jsx_runtime47 = require("react/jsx-runtime");
18083
+ var ENABLED_DISABLED_OPTIONS = [
18084
+ { value: "enabled", label: STRINGS.general.enabled },
18085
+ { value: "disabled", label: STRINGS.general.disabled }
18086
+ ];
18087
+ var DATE_FORMATTER = new Intl.DateTimeFormat(void 0, {
18088
+ timeStyle: "medium"
18089
+ });
18054
18090
  var Settings = ({ setWindowMode }) => {
18055
18091
  const { preferences, updateBrowserPrefs } = useBrowserPreferences();
18092
+ const { config, updateConfig } = (0, import_react37.useContext)(ConfigContext);
18093
+ const { updates } = useApplicationState();
18056
18094
  return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "flex grow flex-col", children: [
18057
18095
  /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ToolbarWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(ToolbarRow, { children: [
18058
18096
  /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "grow p-1", children: STRINGS.settings.title }),
@@ -18079,26 +18117,607 @@ var Settings = ({ setWindowMode }) => {
18079
18117
  color: preferences.color,
18080
18118
  onColorChange: (color) => updateBrowserPrefs((current) => ({ ...current, color }))
18081
18119
  }
18082
- )
18120
+ ),
18121
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ControlLabel, { children: STRINGS.updates.settingsLabel }),
18122
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
18123
+ ControlSelect,
18124
+ {
18125
+ value: config.checkForUpdates ? "enabled" : "disabled",
18126
+ options: ENABLED_DISABLED_OPTIONS,
18127
+ onChange: (value) => updateConfig((current) => ({
18128
+ ...current,
18129
+ checkForUpdates: value === "enabled"
18130
+ })),
18131
+ variant: "large"
18132
+ }
18133
+ ),
18134
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ControlDetails, { children: STRINGS.updates.settingsDetails }),
18135
+ updates && "lastCheckedMillis" in updates && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ControlDetails, { children: STRINGS.updates.lastChecked(
18136
+ DATE_FORMATTER.format(updates.lastCheckedMillis)
18137
+ ) })
18083
18138
  ] })
18084
18139
  }
18085
18140
  )
18086
18141
  ] });
18087
18142
  };
18088
18143
 
18089
- // src/components/frontend/toolbox/root.tsx
18144
+ // src/components/frontend/toolbox/license.tsx
18145
+ var import_react40 = require("react");
18146
+
18147
+ // src/components/frontend/toolbox/logo.tsx
18090
18148
  var import_jsx_runtime48 = require("react/jsx-runtime");
18091
- var ToolboxRoot = ({ info }) => {
18092
- const [windowMode, setWindowMode] = (0, import_react38.useState)(
18093
- null
18149
+ var TimecodeToolboxLogo = (props) => /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
18150
+ "svg",
18151
+ {
18152
+ xmlns: "http://www.w3.org/2000/svg",
18153
+ viewBox: "0 0 1365.333 1365.333",
18154
+ ...props,
18155
+ children: [
18156
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("defs", { children: [
18157
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "b", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18158
+ "path",
18159
+ {
18160
+ fill: "#fff",
18161
+ "stroke-linecap": "round",
18162
+ "stroke-linejoin": "round",
18163
+ "stroke-width": "50.12",
18164
+ 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"
18165
+ }
18166
+ ) }),
18167
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "g", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18168
+ "path",
18169
+ {
18170
+ fill: "#fff",
18171
+ "stroke-linecap": "round",
18172
+ "stroke-linejoin": "round",
18173
+ "stroke-width": "5.581",
18174
+ 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"
18175
+ }
18176
+ ) }),
18177
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "f", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18178
+ "path",
18179
+ {
18180
+ fill: "#fff",
18181
+ "stroke-linecap": "round",
18182
+ "stroke-linejoin": "round",
18183
+ "stroke-width": "5.581",
18184
+ 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"
18185
+ }
18186
+ ) }),
18187
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "e", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18188
+ "path",
18189
+ {
18190
+ fill: "#fff",
18191
+ "stroke-linecap": "round",
18192
+ "stroke-linejoin": "round",
18193
+ "stroke-width": "5.581",
18194
+ 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"
18195
+ }
18196
+ ) }),
18197
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "d", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18198
+ "path",
18199
+ {
18200
+ fill: "#fff",
18201
+ "stroke-linecap": "round",
18202
+ "stroke-linejoin": "round",
18203
+ "stroke-width": "5.581",
18204
+ 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"
18205
+ }
18206
+ ) }),
18207
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "c", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18208
+ "path",
18209
+ {
18210
+ fill: "#fff",
18211
+ "stroke-linecap": "round",
18212
+ "stroke-linejoin": "round",
18213
+ "stroke-width": "5.581",
18214
+ 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"
18215
+ }
18216
+ ) }),
18217
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "k", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18218
+ "path",
18219
+ {
18220
+ fill: "#fff",
18221
+ "stroke-linecap": "round",
18222
+ "stroke-linejoin": "round",
18223
+ "stroke-width": "7.033",
18224
+ 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"
18225
+ }
18226
+ ) }),
18227
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "j", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18228
+ "path",
18229
+ {
18230
+ fill: "#fff",
18231
+ "stroke-linecap": "round",
18232
+ "stroke-linejoin": "round",
18233
+ "stroke-width": "7.033",
18234
+ 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"
18235
+ }
18236
+ ) }),
18237
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "i", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18238
+ "path",
18239
+ {
18240
+ fill: "#fff",
18241
+ "stroke-linecap": "round",
18242
+ "stroke-linejoin": "round",
18243
+ "stroke-width": "7.033",
18244
+ 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"
18245
+ }
18246
+ ) }),
18247
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("mask", { id: "h", maskUnits: "userSpaceOnUse", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18248
+ "path",
18249
+ {
18250
+ fill: "#fff",
18251
+ "stroke-linecap": "round",
18252
+ "stroke-linejoin": "round",
18253
+ "stroke-width": "7.033",
18254
+ 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"
18255
+ }
18256
+ ) }),
18257
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18258
+ "filter",
18259
+ {
18260
+ id: "a",
18261
+ width: "1.201",
18262
+ height: "1.19",
18263
+ x: "-.101",
18264
+ y: "-.074",
18265
+ "color-interpolation-filters": "sRGB",
18266
+ children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("feGaussianBlur", { stdDeviation: "10.298" })
18267
+ }
18268
+ )
18269
+ ] }),
18270
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
18271
+ "g",
18272
+ {
18273
+ stroke: "#000",
18274
+ "stroke-linecap": "round",
18275
+ "stroke-linejoin": "round",
18276
+ filter: "url(#a)",
18277
+ opacity: ".25",
18278
+ transform: "translate(-216.03 -84.295)scale(1.10099)",
18279
+ children: [
18280
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18281
+ "path",
18282
+ {
18283
+ "stroke-width": "153.76517303999998",
18284
+ 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",
18285
+ opacity: "1"
18286
+ }
18287
+ ),
18288
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18289
+ "path",
18290
+ {
18291
+ "stroke-width": "80.096",
18292
+ 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"
18293
+ }
18294
+ ),
18295
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18296
+ "path",
18297
+ {
18298
+ "stroke-width": "80.096",
18299
+ 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"
18300
+ }
18301
+ )
18302
+ ]
18303
+ }
18304
+ ),
18305
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("g", { stroke: "#fff", "stroke-linecap": "round", "stroke-linejoin": "round", children: [
18306
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18307
+ "path",
18308
+ {
18309
+ fill: "#8c63d9",
18310
+ "stroke-width": "165.54595738999998",
18311
+ 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"
18312
+ }
18313
+ ),
18314
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18315
+ "path",
18316
+ {
18317
+ fill: "none",
18318
+ "stroke-width": "73.48667853999999",
18319
+ 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"
18320
+ }
18321
+ ),
18322
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18323
+ "path",
18324
+ {
18325
+ fill: "none",
18326
+ "stroke-width": "66.746",
18327
+ 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",
18328
+ transform: "translate(-216.03 -84.295)scale(1.10099)"
18329
+ }
18330
+ )
18331
+ ] }),
18332
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18333
+ "path",
18334
+ {
18335
+ fill: "#8c63d9",
18336
+ stroke: "#263238",
18337
+ "stroke-linecap": "round",
18338
+ "stroke-linejoin": "round",
18339
+ "stroke-width": "55.182",
18340
+ d: "m166.927 398.352 13.02 207.137-40.611 69.023v453.342h1086.661V674.512l-40.61-69.023 13.02-207.137z"
18341
+ }
18342
+ ),
18343
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18344
+ "path",
18345
+ {
18346
+ fill: "#cc7000",
18347
+ stroke: "#ffba66",
18348
+ "stroke-linecap": "round",
18349
+ "stroke-linejoin": "round",
18350
+ "stroke-width": "38.593",
18351
+ d: "M322.77 689.206h986.986l-36.885-62.693H359.655Z",
18352
+ mask: "url(#b)",
18353
+ transform: "translate(-216.03 -84.295)scale(1.10099)"
18354
+ }
18355
+ ),
18356
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18357
+ "path",
18358
+ {
18359
+ fill: "#ff8c00",
18360
+ d: "m1185.387 605.49 13.02-207.138H166.926l13.02 207.137z"
18361
+ }
18362
+ ),
18363
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18364
+ "path",
18365
+ {
18366
+ fill: "none",
18367
+ stroke: "#263238",
18368
+ "stroke-linecap": "round",
18369
+ "stroke-linejoin": "round",
18370
+ "stroke-width": "29.395",
18371
+ 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"
18372
+ }
18373
+ ),
18374
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18375
+ "path",
18376
+ {
18377
+ fill: "#eceff1",
18378
+ d: "m916.084 52.25 420.493 180.531-532.698 916.066-476.546-308.58Z",
18379
+ mask: "url(#c)"
18380
+ }
18381
+ ),
18382
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18383
+ "path",
18384
+ {
18385
+ fill: "#fff",
18386
+ 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",
18387
+ mask: "url(#d)"
18388
+ }
18389
+ ),
18390
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18391
+ "path",
18392
+ {
18393
+ fill: "#fff",
18394
+ 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",
18395
+ mask: "url(#e)"
18396
+ }
18397
+ ),
18398
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18399
+ "path",
18400
+ {
18401
+ fill: "#cfd8dc",
18402
+ 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",
18403
+ mask: "url(#f)"
18404
+ }
18405
+ ),
18406
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18407
+ "path",
18408
+ {
18409
+ fill: "#cfd8dc",
18410
+ 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",
18411
+ mask: "url(#g)"
18412
+ }
18413
+ ),
18414
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18415
+ "path",
18416
+ {
18417
+ fill: "none",
18418
+ stroke: "#263238",
18419
+ "stroke-linecap": "round",
18420
+ "stroke-linejoin": "round",
18421
+ "stroke-width": "29.395",
18422
+ 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"
18423
+ }
18424
+ ),
18425
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18426
+ "path",
18427
+ {
18428
+ fill: "#eceff1",
18429
+ d: "m105.922 257.574 152.745-109.918 438.66 518.005-348.484 67.536Z",
18430
+ mask: "url(#h)"
18431
+ }
18432
+ ),
18433
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18434
+ "path",
18435
+ {
18436
+ fill: "#fff",
18437
+ 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",
18438
+ mask: "url(#i)"
18439
+ }
18440
+ ),
18441
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18442
+ "path",
18443
+ {
18444
+ fill: "#cfd8dc",
18445
+ 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",
18446
+ mask: "url(#j)"
18447
+ }
18448
+ ),
18449
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18450
+ "path",
18451
+ {
18452
+ fill: "#cfd8dc",
18453
+ 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",
18454
+ mask: "url(#k)"
18455
+ }
18456
+ ),
18457
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("path", { fill: "#ffba66", d: "M170.482 652.84h1025.265v453.341H170.482Z" }),
18458
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("path", { fill: "#ff8c00", d: "M139.336 674.512h1086.662v453.342H139.336Z" }),
18459
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18460
+ "rect",
18461
+ {
18462
+ width: "875.482",
18463
+ height: "332.3",
18464
+ x: "244.926",
18465
+ y: "735.033",
18466
+ fill: "#cc7000",
18467
+ rx: "77.883",
18468
+ ry: "77.883"
18469
+ }
18470
+ ),
18471
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18472
+ "path",
18473
+ {
18474
+ fill: "#fff",
18475
+ 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",
18476
+ "aria-label": "00:00"
18477
+ }
18478
+ )
18479
+ ]
18480
+ }
18481
+ );
18482
+
18483
+ // src/components/frontend/toolbox/core/layout.tsx
18484
+ var import_react39 = require("react");
18485
+
18486
+ // src/components/frontend/toolbox/core/footer.tsx
18487
+ var import_jsx_runtime49 = require("react/jsx-runtime");
18488
+ var Footer = ({ openLicenseDetails }) => {
18489
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
18490
+ "div",
18491
+ {
18492
+ className: "\n flex items-center justify-center gap-1 border-t border-sigil-border\n bg-sigil-bg-dark p-1 text-[80%]\n ",
18493
+ children: [
18494
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("span", { children: [
18495
+ "Created by",
18496
+ "\xA0",
18497
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ExternalLink, { href: "https://arcanewizards.com", children: "Arcane Wizards" })
18498
+ ] }),
18499
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ToolbarDivider, {}),
18500
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ExternalLink, { href: SOURCE_CODE_URL, children: STRINGS.sourceCode }),
18501
+ openLicenseDetails && /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_jsx_runtime49.Fragment, { children: [
18502
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ToolbarDivider, {}),
18503
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(TextButton, { onClick: openLicenseDetails, children: STRINGS.license })
18504
+ ] })
18505
+ ]
18506
+ }
18094
18507
  );
18095
- const { config } = info;
18096
- const { sendMessage, call, connection, reconnect } = (0, import_react38.useContext)(StageContext);
18097
- const [dialogMode, setDialogMode] = (0, import_react38.useState)(null);
18098
- const [assignToOutput, setAssignToOutput] = (0, import_react38.useState)(null);
18508
+ };
18509
+
18510
+ // ../../packages/sigil/dist/frontend/styling.hooks.js
18511
+ var import_react38 = require("react");
18512
+ var useRootHintVariables = (color) => {
18513
+ (0, import_react38.useEffect)(() => {
18514
+ const root = document.querySelector(".arcane-theme-root");
18515
+ if (!root) return;
18516
+ Object.entries(cssHintColorVariables(color)).forEach(([key, value]) => {
18517
+ root.style.setProperty(key, value);
18518
+ });
18519
+ }, [color]);
18520
+ };
18521
+
18522
+ // src/components/frontend/toolbox/core/layout.tsx
18523
+ var import_jsx_runtime50 = require("react/jsx-runtime");
18524
+ var Layout = ({
18525
+ modes,
18526
+ children,
18527
+ licenseMode,
18528
+ footer
18529
+ }) => {
18530
+ const [windowMode, setWindowMode] = (0, import_react39.useState)(null);
18531
+ const { connection, reconnect } = (0, import_react39.useContext)(StageContext);
18099
18532
  const { preferences } = useBrowserPreferences();
18100
18533
  useRootHintVariables(preferences.color);
18101
- (0, import_react38.useEffect)(() => {
18534
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: "flex h-screen flex-col", children: [
18535
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(ToolbarWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(ToolbarRow, { children: [
18536
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
18537
+ "div",
18538
+ {
18539
+ className: "\n flex h-full min-h-[36px] grow items-center justify-center px-1\n app-title-bar\n ",
18540
+ children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "font-bold text-hint-gradient", children: STRINGS.title })
18541
+ }
18542
+ ),
18543
+ modes && /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_jsx_runtime50.Fragment, { children: [
18544
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(ToolbarDivider, {}),
18545
+ Object.entries(modes).map(([key, { icon, title }]) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
18546
+ ControlButton,
18547
+ {
18548
+ onClick: () => setWindowMode((mode) => mode === key ? null : key),
18549
+ variant: "titlebar",
18550
+ icon,
18551
+ active: windowMode === key,
18552
+ title: STRINGS.toggle(title)
18553
+ },
18554
+ key
18555
+ ))
18556
+ ] })
18557
+ ] }) }),
18558
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "relative flex h-0 grow flex-col", children: connection.state !== "connected" ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
18559
+ SizeAwareDiv,
18560
+ {
18561
+ className: "\n flex grow flex-col items-center justify-center gap-1\n bg-sigil-bg-light p-1 text-sigil-foreground-muted\n ",
18562
+ children: [
18563
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Icon2, { icon: "signal_disconnected", className: "text-block-icon" }),
18564
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "text-center", children: STRINGS.connectionError }),
18565
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(ControlButton, { onClick: reconnect, variant: "large", icon: "replay", children: STRINGS.reconnect })
18566
+ ]
18567
+ }
18568
+ ) : windowMode && modes?.[windowMode] ? modes[windowMode].child(setWindowMode) : children }),
18569
+ footer && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
18570
+ Footer,
18571
+ {
18572
+ openLicenseDetails: licenseMode && (() => setWindowMode(
18573
+ (mode) => mode === licenseMode ? null : licenseMode
18574
+ ))
18575
+ }
18576
+ )
18577
+ ] });
18578
+ };
18579
+
18580
+ // src/components/frontend/toolbox/license.tsx
18581
+ var import_jsx_runtime51 = require("react/jsx-runtime");
18582
+ var LicenseContent = ({ license }) => {
18583
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "flex flex-col gap-2 rounded-md bg-sigil-bg-light p-2", children: license.split("\n\n").map((paragraph, index2) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("p", { className: "m-0", children: paragraph.replace(/\n/g, " ").trim() }, index2)) });
18584
+ };
18585
+ var License = ({ license, setWindowMode }) => {
18586
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "flex grow flex-col", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
18587
+ "div",
18588
+ {
18589
+ className: "\n flex grow basis-0 flex-col overflow-y-auto px-2 pb-2 scrollbar-sigil\n ",
18590
+ children: [
18591
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(TimecodeToolboxLogo, { className: "h-[20%] max-h-[420px] min-h-[110px] w-full" }),
18592
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(LicenseContent, { license }),
18593
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "flex justify-center p-2", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
18594
+ ControlButton,
18595
+ {
18596
+ onClick: () => setWindowMode(null),
18597
+ variant: "large",
18598
+ icon: "close",
18599
+ children: STRINGS.close(STRINGS.license)
18600
+ }
18601
+ ) })
18602
+ ]
18603
+ }
18604
+ ) });
18605
+ };
18606
+ var LicenseGate = ({ info }) => {
18607
+ const { sendMessage } = (0, import_react40.useContext)(StageContext);
18608
+ const acceptLicense = (0, import_react40.useCallback)(() => {
18609
+ sendMessage?.({
18610
+ type: "component-message",
18611
+ namespace: "timecode-toolbox",
18612
+ component: "license-gate",
18613
+ componentKey: info.key,
18614
+ action: "accept-license",
18615
+ hash: info.hash
18616
+ });
18617
+ }, [sendMessage, info.key, info.hash]);
18618
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
18619
+ Layout,
18620
+ {
18621
+ footer: true,
18622
+ modes: {
18623
+ debug: {
18624
+ child: () => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Debugger, { title: STRINGS.debugger, className: "size-full" }),
18625
+ icon: "bug_report",
18626
+ title: STRINGS.debugger
18627
+ }
18628
+ },
18629
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
18630
+ "div",
18631
+ {
18632
+ className: "\n flex grow basis-0 flex-col overflow-y-auto px-2 pb-2 scrollbar-sigil\n ",
18633
+ children: [
18634
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(TimecodeToolboxLogo, { className: "h-[20%] max-h-[420px] min-h-[110px] w-full" }),
18635
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("h2", { className: "text-center text-sigil-usage-hint-foreground", children: STRINGS.licensePrompt }),
18636
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(LicenseContent, { license: info.license }),
18637
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "flex justify-center p-2", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
18638
+ ControlButton,
18639
+ {
18640
+ onClick: acceptLicense,
18641
+ variant: "large",
18642
+ icon: "check",
18643
+ primary: true,
18644
+ children: STRINGS.acceptLicense
18645
+ }
18646
+ ) })
18647
+ ]
18648
+ }
18649
+ )
18650
+ }
18651
+ );
18652
+ };
18653
+
18654
+ // src/components/frontend/toolbox/core/updates.tsx
18655
+ var import_react41 = require("react");
18656
+ var import_jsx_runtime52 = require("react/jsx-runtime");
18657
+ var UpdateBanner = () => {
18658
+ const { updates } = useApplicationState();
18659
+ const { version } = useSystemInformation();
18660
+ const { openExternalLink } = useBrowserContext();
18661
+ const [displayState, setDisplayState] = (0, import_react41.useState)();
18662
+ (0, import_react41.useEffect)(() => {
18663
+ if (updates?.type !== "loading") {
18664
+ setDisplayState(updates);
18665
+ }
18666
+ }, [updates]);
18667
+ const openDownloadLink = (0, import_react41.useCallback)(() => {
18668
+ if (displayState?.type === "updates-available" && displayState.response.downloadUrl) {
18669
+ openExternalLink(displayState.response.downloadUrl);
18670
+ }
18671
+ }, [displayState, openExternalLink]);
18672
+ if (displayState?.type === "error") {
18673
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
18674
+ "div",
18675
+ {
18676
+ 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 ",
18677
+ children: [
18678
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Icon2, { icon: "error" }),
18679
+ displayState.error
18680
+ ]
18681
+ }
18682
+ );
18683
+ }
18684
+ if (displayState?.type === "updates-available") {
18685
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
18686
+ "div",
18687
+ {
18688
+ 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 ",
18689
+ children: [
18690
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Icon2, { icon: "upgrade" }),
18691
+ STRINGS.updates.updateAvailable(
18692
+ version,
18693
+ displayState.response.latestVersion
18694
+ ),
18695
+ displayState.response.downloadUrl && /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
18696
+ "button",
18697
+ {
18698
+ 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 ",
18699
+ onClick: openDownloadLink,
18700
+ children: [
18701
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Icon2, { icon: "download" }),
18702
+ STRINGS.updates.download
18703
+ ]
18704
+ }
18705
+ )
18706
+ ]
18707
+ }
18708
+ );
18709
+ }
18710
+ return null;
18711
+ };
18712
+
18713
+ // src/components/frontend/toolbox/root.tsx
18714
+ var import_jsx_runtime53 = require("react/jsx-runtime");
18715
+ var ToolboxRoot = ({ info }) => {
18716
+ const { config } = info;
18717
+ const { sendMessage, call } = (0, import_react42.useContext)(StageContext);
18718
+ const [dialogMode, setDialogMode] = (0, import_react42.useState)(null);
18719
+ const [assignToOutput, setAssignToOutput] = (0, import_react42.useState)(null);
18720
+ (0, import_react42.useEffect)(() => {
18102
18721
  if (assignToOutput) {
18103
18722
  const onEscape = (e) => {
18104
18723
  if (e.key === "Escape") {
@@ -18111,7 +18730,7 @@ var ToolboxRoot = ({ info }) => {
18111
18730
  };
18112
18731
  }
18113
18732
  }, [assignToOutput]);
18114
- const updateConfig = (0, import_react38.useCallback)(
18733
+ const updateConfig = (0, import_react42.useCallback)(
18115
18734
  (change) => {
18116
18735
  const diff = diffJson(config, change(config));
18117
18736
  sendMessage?.({
@@ -18125,15 +18744,15 @@ var ToolboxRoot = ({ info }) => {
18125
18744
  },
18126
18745
  [sendMessage, info.key, config]
18127
18746
  );
18128
- const configContext = (0, import_react38.useMemo)(
18747
+ const configContext = (0, import_react42.useMemo)(
18129
18748
  () => ({
18130
18749
  config,
18131
18750
  updateConfig
18132
18751
  }),
18133
18752
  [config, updateConfig]
18134
18753
  );
18135
- const closeDialog = (0, import_react38.useCallback)(() => setDialogMode(null), []);
18136
- const getNetworkInterfaces = (0, import_react38.useCallback)(async () => {
18754
+ const closeDialog = (0, import_react42.useCallback)(() => setDialogMode(null), []);
18755
+ const getNetworkInterfaces = (0, import_react42.useCallback)(async () => {
18137
18756
  if (!call) {
18138
18757
  throw new Error("No call function available");
18139
18758
  }
@@ -18144,12 +18763,12 @@ var ToolboxRoot = ({ info }) => {
18144
18763
  action: "toolbox-root-get-network-interfaces"
18145
18764
  });
18146
18765
  }, [call, info.key]);
18147
- const networkContextValue = (0, import_react38.useMemo)(() => {
18766
+ const networkContextValue = (0, import_react42.useMemo)(() => {
18148
18767
  return {
18149
18768
  getNetworkInterfaces
18150
18769
  };
18151
18770
  }, [getNetworkInterfaces]);
18152
- const assignToOutputCallback = (0, import_react38.useMemo)(() => {
18771
+ const assignToOutputCallback = (0, import_react42.useMemo)(() => {
18153
18772
  if (!assignToOutput) {
18154
18773
  return null;
18155
18774
  }
@@ -18174,7 +18793,7 @@ var ToolboxRoot = ({ info }) => {
18174
18793
  setAssignToOutput(null);
18175
18794
  };
18176
18795
  }, [assignToOutput, updateConfig]);
18177
- const callHandler = (0, import_react38.useCallback)(
18796
+ const callHandler = (0, import_react42.useCallback)(
18178
18797
  async ({ path, handler, args }) => {
18179
18798
  if (!call) {
18180
18799
  throw new Error("No call function available");
@@ -18191,149 +18810,121 @@ var ToolboxRoot = ({ info }) => {
18191
18810
  },
18192
18811
  [call, info.key]
18193
18812
  );
18194
- const handlers = (0, import_react38.useMemo)(
18813
+ const handlers = (0, import_react42.useMemo)(
18195
18814
  () => ({
18196
18815
  handlers: info.handlers,
18197
18816
  callHandler
18198
18817
  }),
18199
18818
  [info.handlers, callHandler]
18200
18819
  );
18201
- const windowedTimecodeId = (0, import_react38.useMemo)(
18820
+ const windowedTimecodeId = (0, import_react42.useMemo)(
18202
18821
  () => getFragmentValue("tc", TIMECODE_INSTANCE_ID),
18203
18822
  []
18204
18823
  );
18205
- const isMainWindow = windowedTimecodeId === null;
18206
- const root = (0, import_react38.useMemo)(
18207
- () => /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex h-screen flex-col", children: [
18208
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ToolbarWrapper, { children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(ToolbarRow, { children: [
18209
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18210
- "div",
18211
- {
18212
- className: "\n flex h-full min-h-[36px] grow items-center justify-center px-1\n app-title-bar\n ",
18213
- children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "font-bold text-hint-gradient", children: STRINGS.title })
18214
- }
18215
- ),
18216
- isMainWindow && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_jsx_runtime48.Fragment, { children: [
18217
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ToolbarDivider, {}),
18218
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18219
- ControlButton,
18220
- {
18221
- onClick: () => setWindowMode(
18222
- (mode) => mode === "settings" ? null : "settings"
18824
+ const root = (0, import_react42.useMemo)(
18825
+ () => windowedTimecodeId ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(Layout, { modes: null, children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(FullscreenTimecodeDisplay, { id: windowedTimecodeId }) }) : /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_jsx_runtime53.Fragment, { children: [
18826
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18827
+ Layout,
18828
+ {
18829
+ footer: true,
18830
+ modes: {
18831
+ license: {
18832
+ child: (setWindowMode) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18833
+ License,
18834
+ {
18835
+ license: info.license,
18836
+ setWindowMode
18837
+ }
18223
18838
  ),
18224
- variant: "titlebar",
18839
+ icon: "info",
18840
+ title: STRINGS.license
18841
+ },
18842
+ settings: {
18843
+ child: (setWindowMode) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(Settings, { setWindowMode }),
18225
18844
  icon: "settings",
18226
- active: windowMode === "settings",
18227
- title: STRINGS.toggle(STRINGS.settings.title)
18228
- }
18229
- ),
18230
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18231
- ControlButton,
18232
- {
18233
- onClick: () => setWindowMode((mode) => mode === "debug" ? null : "debug"),
18234
- variant: "titlebar",
18845
+ title: STRINGS.settings.title
18846
+ },
18847
+ debug: {
18848
+ child: () => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(Debugger, { title: STRINGS.debugger, className: "size-full" }),
18235
18849
  icon: "bug_report",
18236
- active: windowMode === "debug",
18237
- title: STRINGS.toggle(STRINGS.debugger)
18850
+ title: STRINGS.debugger
18238
18851
  }
18239
- )
18240
- ] })
18241
- ] }) }),
18242
- /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "relative flex h-0 grow flex-col", children: [
18243
- connection.state !== "connected" ? /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
18244
- SizeAwareDiv,
18245
- {
18246
- className: "\n flex grow flex-col items-center justify-center gap-1\n bg-sigil-bg-light p-1 text-sigil-foreground-muted\n ",
18247
- children: [
18248
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Icon2, { icon: "signal_disconnected", className: "text-block-icon" }),
18249
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "text-center", children: STRINGS.connectionError }),
18250
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ControlButton, { onClick: reconnect, variant: "large", icon: "replay", children: STRINGS.reconnect })
18251
- ]
18252
- }
18253
- ) : windowMode === "debug" ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Debugger, { title: STRINGS.debugger, className: "size-full" }) : windowMode === "settings" ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Settings, { setWindowMode }) : windowedTimecodeId ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(FullscreenTimecodeDisplay, { id: windowedTimecodeId }) : /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
18254
- "div",
18255
- {
18256
- className: "\n flex h-0 grow flex-col gap-px overflow-y-auto bg-sigil-border\n scrollbar-sigil\n ",
18257
- children: [
18258
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18259
- InputsSection,
18260
- {
18261
- setDialogMode,
18262
- assignToOutput: assignToOutputCallback
18263
- }
18264
- ),
18265
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18266
- GeneratorsSection,
18267
- {
18268
- setDialogMode,
18269
- assignToOutput: assignToOutputCallback
18270
- }
18271
- ),
18272
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18273
- OutputsSection,
18274
- {
18275
- setDialogMode,
18276
- assignToOutput,
18277
- setAssignToOutput
18278
- }
18279
- )
18280
- ]
18281
- }
18282
- ),
18283
- dialogMode?.section.type === "inputs" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18284
- InputSettingsDialog,
18285
- {
18286
- close: closeDialog,
18287
- input: dialogMode.section.input,
18288
- target: dialogMode.target
18289
- }
18290
- ),
18291
- dialogMode?.section.type === "generators" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18292
- GeneratorSettingsDialog,
18293
- {
18294
- close: closeDialog,
18295
- generator: dialogMode.section.generator,
18296
- target: dialogMode.target
18297
- }
18298
- ),
18299
- dialogMode?.section.type === "outputs" && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
18300
- OutputSettingsDialog,
18301
- {
18302
- close: closeDialog,
18303
- output: dialogMode.section.output,
18304
- target: dialogMode.target
18305
- }
18306
- )
18307
- ] }),
18308
- isMainWindow && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
18309
- "div",
18852
+ },
18853
+ licenseMode: "license",
18854
+ children: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_jsx_runtime53.Fragment, { children: [
18855
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(UpdateBanner, {}),
18856
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
18857
+ "div",
18858
+ {
18859
+ className: "\n flex h-0 grow flex-col gap-px overflow-y-auto bg-sigil-border\n scrollbar-sigil\n ",
18860
+ children: [
18861
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18862
+ InputsSection,
18863
+ {
18864
+ setDialogMode,
18865
+ assignToOutput: assignToOutputCallback
18866
+ }
18867
+ ),
18868
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18869
+ GeneratorsSection,
18870
+ {
18871
+ setDialogMode,
18872
+ assignToOutput: assignToOutputCallback
18873
+ }
18874
+ ),
18875
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18876
+ OutputsSection,
18877
+ {
18878
+ setDialogMode,
18879
+ assignToOutput,
18880
+ setAssignToOutput
18881
+ }
18882
+ )
18883
+ ]
18884
+ }
18885
+ )
18886
+ ] })
18887
+ }
18888
+ ),
18889
+ dialogMode?.section.type === "inputs" && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18890
+ InputSettingsDialog,
18310
18891
  {
18311
- className: "\n flex justify-center border-t border-sigil-border bg-sigil-bg-dark\n p-1 text-[80%]\n ",
18312
- children: [
18313
- "Created by",
18314
- "\xA0",
18315
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ExternalLink, { href: "https://arcanewizards.com", children: "Arcane Wizards" })
18316
- ]
18892
+ close: closeDialog,
18893
+ input: dialogMode.section.input,
18894
+ target: dialogMode.target
18895
+ }
18896
+ ),
18897
+ dialogMode?.section.type === "generators" && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18898
+ GeneratorSettingsDialog,
18899
+ {
18900
+ close: closeDialog,
18901
+ generator: dialogMode.section.generator,
18902
+ target: dialogMode.target
18903
+ }
18904
+ ),
18905
+ dialogMode?.section.type === "outputs" && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
18906
+ OutputSettingsDialog,
18907
+ {
18908
+ close: closeDialog,
18909
+ output: dialogMode.section.output,
18910
+ target: dialogMode.target
18317
18911
  }
18318
18912
  )
18319
18913
  ] }),
18320
18914
  [
18321
- connection,
18322
- reconnect,
18323
18915
  assignToOutput,
18324
18916
  assignToOutputCallback,
18325
18917
  closeDialog,
18326
18918
  dialogMode,
18327
- windowMode,
18328
- isMainWindow,
18329
- windowedTimecodeId
18919
+ windowedTimecodeId,
18920
+ info.license
18330
18921
  ]
18331
18922
  );
18332
- return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ConfigContext.Provider, { value: configContext, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(NetworkContext.Provider, { value: networkContextValue, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ApplicationStateContext.Provider, { value: info.state, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ApplicationHandlersContext.Provider, { value: handlers, children: root }) }) }) });
18923
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ConfigContext.Provider, { value: configContext, children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(NetworkContext.Provider, { value: networkContextValue, children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ApplicationStateContext.Provider, { value: info.state, children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ApplicationHandlersContext.Provider, { value: handlers, children: root }) }) }) });
18333
18924
  };
18334
18925
 
18335
18926
  // src/components/frontend/index.tsx
18336
- var import_jsx_runtime49 = require("react/jsx-runtime");
18927
+ var import_jsx_runtime54 = require("react/jsx-runtime");
18337
18928
  var timecodeToolboxFrontendComponents = () => ({
18338
18929
  namespace: NAMESPACE,
18339
18930
  render: (info) => {
@@ -18342,7 +18933,9 @@ var timecodeToolboxFrontendComponents = () => ({
18342
18933
  }
18343
18934
  switch (info.component) {
18344
18935
  case "toolbox-root":
18345
- return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ToolboxRoot, { info });
18936
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(ToolboxRoot, { info });
18937
+ case "license-gate":
18938
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(LicenseGate, { info });
18346
18939
  }
18347
18940
  }
18348
18941
  });
@@ -18350,7 +18943,7 @@ var startTimecodeToolboxServerFrontend = (browser) => {
18350
18943
  startSigilFrontend({
18351
18944
  browser,
18352
18945
  appRenderers: [timecodeToolboxFrontendComponents()],
18353
- loadingState: () => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { style: { width: "100%", textAlign: "center", padding: "2rem" }, children: "Loading Toolbox..." })
18946
+ loadingState: () => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { style: { width: "100%", textAlign: "center", padding: "2rem" }, children: "Loading Toolbox..." })
18354
18947
  });
18355
18948
  };
18356
18949
  window.startTimecodeToolboxServerFrontend = startTimecodeToolboxServerFrontend;