@arcanewizards/timecode-toolbox 0.0.3 → 0.1.1
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.
- package/LICENSE +21 -0
- package/dist/components/frontend/index.d.mts +13 -0
- package/dist/components/frontend/index.d.ts +13 -0
- package/dist/components/frontend/index.js +18978 -0
- package/dist/components/frontend/index.mjs +19016 -0
- package/dist/entrypoint.css +2788 -0
- package/dist/entrypoint.js +42821 -0
- package/dist/entrypoint.js.map +7 -0
- package/dist/frontend.js +42818 -0
- package/dist/frontend.js.map +7 -0
- package/dist/index.d.mts +59 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.js +14894 -0
- package/dist/index.mjs +14921 -0
- package/dist/start.d.mts +1 -0
- package/dist/start.d.ts +1 -0
- package/dist/start.js +14886 -0
- package/dist/start.mjs +14918 -0
- package/package.json +37 -28
- package/.turbo/turbo-build.log +0 -55
- package/CHANGELOG.md +0 -24
- package/eslint.config.mjs +0 -49
- package/src/app.tsx +0 -147
- package/src/components/backend/index.ts +0 -6
- package/src/components/backend/toolbox-root.ts +0 -119
- package/src/components/frontend/constants.ts +0 -81
- package/src/components/frontend/entrypoint.ts +0 -12
- package/src/components/frontend/frontend.css +0 -108
- package/src/components/frontend/index.tsx +0 -46
- package/src/components/frontend/toolbox/content.tsx +0 -45
- package/src/components/frontend/toolbox/context.tsx +0 -63
- package/src/components/frontend/toolbox/core/size-aware-div.tsx +0 -51
- package/src/components/frontend/toolbox/core/timecode-display.tsx +0 -592
- package/src/components/frontend/toolbox/generators.tsx +0 -318
- package/src/components/frontend/toolbox/inputs.tsx +0 -484
- package/src/components/frontend/toolbox/outputs.tsx +0 -581
- package/src/components/frontend/toolbox/preferences.ts +0 -25
- package/src/components/frontend/toolbox/root.tsx +0 -335
- package/src/components/frontend/toolbox/settings.tsx +0 -54
- package/src/components/frontend/toolbox/types.ts +0 -28
- package/src/components/frontend/toolbox/util.tsx +0 -61
- package/src/components/proto.ts +0 -420
- package/src/config.ts +0 -7
- package/src/generators/clock.tsx +0 -206
- package/src/generators/index.tsx +0 -15
- package/src/index.ts +0 -38
- package/src/inputs/artnet.tsx +0 -305
- package/src/inputs/index.tsx +0 -13
- package/src/inputs/tcnet.tsx +0 -272
- package/src/outputs/artnet.tsx +0 -170
- package/src/outputs/index.tsx +0 -11
- package/src/start.ts +0 -47
- package/src/tree.ts +0 -133
- package/src/types.ts +0 -12
- package/src/urls.ts +0 -49
- package/src/util.ts +0 -82
- package/tailwind.config.cjs +0 -7
- package/tsconfig.json +0 -10
- package/tsup.config.ts +0 -10
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arcanewizards/timecode-toolbox",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"private": false,
|
|
5
|
+
"license": "MIT",
|
|
5
6
|
"repository": {
|
|
6
7
|
"type": "git",
|
|
7
8
|
"url": "https://github.com/ArcaneWizards/open-source.git",
|
|
8
9
|
"directory": "apps/timecode-toolbox"
|
|
9
10
|
},
|
|
11
|
+
"bin": {
|
|
12
|
+
"timecode-toolbox": "./dist/start.js"
|
|
13
|
+
},
|
|
10
14
|
"exports": {
|
|
11
15
|
".": {
|
|
12
16
|
"@arcanewizards/source": "./src/index.ts",
|
|
@@ -23,30 +27,15 @@
|
|
|
23
27
|
"./entrypoint.css": "./dist/entrypoint.css",
|
|
24
28
|
"./package.json": "./package.json"
|
|
25
29
|
},
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
"build:styles": "tailwindcss -i ./src/components/frontend/frontend.css -o ./dist/entrypoint.css",
|
|
31
|
-
"check:types": "tsc --noEmit",
|
|
32
|
-
"format:fix": "cd .. && pnpm format:fix",
|
|
33
|
-
"lint": "eslint . --max-warnings 0",
|
|
34
|
-
"lint:fix": "eslint . --max-warnings 0 --fix",
|
|
35
|
-
"start": "pnpm build:entrypoint && pnpm build:styles && node --import=tsx --conditions=@arcanewizards/source src/start"
|
|
36
|
-
},
|
|
30
|
+
"files": [
|
|
31
|
+
"LICENSE",
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
37
34
|
"devDependencies": {
|
|
38
35
|
"@arcanejs/build-utils": "^0.1.2",
|
|
39
36
|
"@arcanejs/diff": "^0.5.2",
|
|
40
37
|
"@arcanejs/protocol": "^0.8.0",
|
|
41
|
-
"@arcanejs/react-toolkit": "^0.15.1",
|
|
42
|
-
"@arcanejs/toolkit": "^8.0.0",
|
|
43
38
|
"@arcanejs/toolkit-frontend": "^0.11.0",
|
|
44
|
-
"@arcanewizards/artnet": "workspace:^",
|
|
45
|
-
"@arcanewizards/eslint-config": "workspace:^",
|
|
46
|
-
"@arcanewizards/net-utils": "workspace:^",
|
|
47
|
-
"@arcanewizards/sigil": "workspace:^",
|
|
48
|
-
"@arcanewizards/tcnet": "workspace:^",
|
|
49
|
-
"@arcanewizards/typescript-config": "workspace:^",
|
|
50
39
|
"@types/lodash": "^4.17.13",
|
|
51
40
|
"@types/node": "^22.19.3",
|
|
52
41
|
"@types/react": "^19.2.2",
|
|
@@ -55,20 +44,40 @@
|
|
|
55
44
|
"eslint": "^9",
|
|
56
45
|
"eslint-plugin-better-tailwindcss": "^4.2.0",
|
|
57
46
|
"lodash": "^4.17.21",
|
|
58
|
-
"pino": "^9.5.0",
|
|
59
|
-
"pino-pretty": "^11.3.0",
|
|
60
|
-
"react": "^19.2.0",
|
|
61
47
|
"tailwindcss": "^4.1.13",
|
|
62
48
|
"tsup": "^8.3.5",
|
|
63
49
|
"tsx": "^4.19.1",
|
|
64
50
|
"typescript": "^5.7.3",
|
|
65
51
|
"uuid": "^11.0.3",
|
|
66
|
-
"zod": "^3.22.4"
|
|
67
|
-
},
|
|
68
|
-
"dependencies": {
|
|
52
|
+
"zod": "^3.22.4",
|
|
69
53
|
"@tailwindcss/cli": "^4.1.13",
|
|
70
54
|
"music-metadata": "^11.0.0",
|
|
71
55
|
"osc-js": "^2.4.1",
|
|
72
|
-
"radix-ui": "^1.4.3"
|
|
56
|
+
"radix-ui": "^1.4.3",
|
|
57
|
+
"@arcanewizards/apis": "^0.0.1",
|
|
58
|
+
"@arcanewizards/artnet": "^0.1.3",
|
|
59
|
+
"@arcanewizards/eslint-config": "^0.0.0",
|
|
60
|
+
"@arcanewizards/net-utils": "^0.1.3",
|
|
61
|
+
"@arcanewizards/sigil": "^0.1.3",
|
|
62
|
+
"@arcanewizards/tcnet": "^0.1.3",
|
|
63
|
+
"@arcanewizards/typescript-config": "^0.0.0"
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@arcanejs/react-toolkit": "^0.15.1",
|
|
67
|
+
"@arcanejs/toolkit": "^8.0.0",
|
|
68
|
+
"pino": "^9.5.0",
|
|
69
|
+
"pino-pretty": "^11.3.0",
|
|
70
|
+
"react": "^19.2.0"
|
|
71
|
+
},
|
|
72
|
+
"scripts": {
|
|
73
|
+
"build": "pnpm check:types && rm -rf dist && cp ../../LICENSE ./LICENSE && tsup && pnpm build:entrypoint && pnpm build:frontend && pnpm build:styles && check-export-map",
|
|
74
|
+
"build:entrypoint": "arcane-build-frontend --entry src/components/frontend/entrypoint.ts --outfile dist/entrypoint.js --sourcemap",
|
|
75
|
+
"build:frontend": "arcane-build-frontend --entry src/components/frontend/index.tsx --outfile dist/frontend.js --sourcemap",
|
|
76
|
+
"build:styles": "tailwindcss -i ./src/components/frontend/frontend.css -o ./dist/entrypoint.css",
|
|
77
|
+
"check:types": "tsc --noEmit",
|
|
78
|
+
"format:fix": "cd .. && pnpm format:fix",
|
|
79
|
+
"lint": "eslint . --max-warnings 0",
|
|
80
|
+
"lint:fix": "eslint . --max-warnings 0 --fix",
|
|
81
|
+
"start": "pnpm build:entrypoint && pnpm build:styles && node --import=tsx --conditions=@arcanewizards/source src/start"
|
|
73
82
|
}
|
|
74
|
-
}
|
|
83
|
+
}
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
> @arcanewizards/timecode-toolbox@0.0.3 build /Users/sam/repos/arcane/open-source/apps/timecode-toolbox
|
|
4
|
-
> pnpm check:types && rm -rf dist && tsup && pnpm build:entrypoint && pnpm build:frontend && pnpm build:styles && check-export-map
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> @arcanewizards/timecode-toolbox@0.0.3 check:types /Users/sam/repos/arcane/open-source/apps/timecode-toolbox
|
|
8
|
-
> tsc --noEmit
|
|
9
|
-
|
|
10
|
-
[34mCLI[39m Building entry: src/index.ts, src/components/frontend/index.tsx
|
|
11
|
-
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
12
|
-
[34mCLI[39m tsup v8.3.5
|
|
13
|
-
[34mCLI[39m Using tsup config: /Users/sam/repos/arcane/open-source/apps/timecode-toolbox/tsup.config.ts
|
|
14
|
-
[34mCLI[39m Target: es2022
|
|
15
|
-
[34mCJS[39m Build start
|
|
16
|
-
[34mESM[39m Build start
|
|
17
|
-
[32mCJS[39m [1mdist/index.js [22m[32m2.03 MB[39m
|
|
18
|
-
[32mCJS[39m [1mdist/components/frontend/index.js [22m[32m1.96 MB[39m
|
|
19
|
-
[32mCJS[39m ⚡️ Build success in 142ms
|
|
20
|
-
[32mESM[39m [1mdist/components/frontend/index.mjs [22m[32m1.96 MB[39m
|
|
21
|
-
[32mESM[39m [1mdist/index.mjs [22m[32m2.03 MB[39m
|
|
22
|
-
[32mESM[39m ⚡️ Build success in 143ms
|
|
23
|
-
DTS Build start
|
|
24
|
-
DTS ⚡️ Build success in 2650ms
|
|
25
|
-
DTS dist/index.d.ts 2.18 KB
|
|
26
|
-
DTS dist/components/frontend/index.d.ts 649.00 B
|
|
27
|
-
DTS dist/index.d.mts 2.18 KB
|
|
28
|
-
DTS dist/components/frontend/index.d.mts 649.00 B
|
|
29
|
-
|
|
30
|
-
> @arcanewizards/timecode-toolbox@0.0.3 build:entrypoint /Users/sam/repos/arcane/open-source/apps/timecode-toolbox
|
|
31
|
-
> arcane-build-frontend --entry src/components/frontend/entrypoint.ts --outfile dist/entrypoint.js --sourcemap
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
[37mdist/[0m[1mentrypoint.js[0m [33m1.7mb ⚠️[0m
|
|
35
|
-
[37mdist/[0m[1mentrypoint.js.map[0m [36m2.8mb[0m
|
|
36
|
-
|
|
37
|
-
⚡ [32mDone in 869ms[0m
|
|
38
|
-
|
|
39
|
-
> @arcanewizards/timecode-toolbox@0.0.3 build:frontend /Users/sam/repos/arcane/open-source/apps/timecode-toolbox
|
|
40
|
-
> arcane-build-frontend --entry src/components/frontend/index.tsx --outfile dist/frontend.js --sourcemap
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
[37mdist/[0m[1mfrontend.js[0m [33m1.7mb ⚠️[0m
|
|
44
|
-
[37mdist/[0m[1mfrontend.js.map[0m [36m2.8mb[0m
|
|
45
|
-
|
|
46
|
-
⚡ [32mDone in 802ms[0m
|
|
47
|
-
|
|
48
|
-
> @arcanewizards/timecode-toolbox@0.0.3 build:styles /Users/sam/repos/arcane/open-source/apps/timecode-toolbox
|
|
49
|
-
> tailwindcss -i ./src/components/frontend/frontend.css -o ./dist/entrypoint.css
|
|
50
|
-
|
|
51
|
-
[3m[1m[34m≈[39m[22m[23m tailwindcss [34mv4.2.1[39m
|
|
52
|
-
|
|
53
|
-
Done in [32m47ms[39m
|
|
54
|
-
Checking export maps...
|
|
55
|
-
[7m[32m PASS [39m[27m package.json
|
package/CHANGELOG.md
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# @arcanewizards/timecode-toolbox
|
|
2
|
-
|
|
3
|
-
## 0.0.3
|
|
4
|
-
|
|
5
|
-
### Patch Changes
|
|
6
|
-
|
|
7
|
-
- Introduce Appearance Settings
|
|
8
|
-
|
|
9
|
-
Make it possible to choose between light/dark/os mode,
|
|
10
|
-
and to pick a primary interface color.
|
|
11
|
-
|
|
12
|
-
- Introduce new clock generator
|
|
13
|
-
|
|
14
|
-
Introduce a new generator that uses the local time of the system clock,
|
|
15
|
-
and can be started, stopped, reset etc...
|
|
16
|
-
|
|
17
|
-
This can be connected to an output like all the existing inputs.
|
|
18
|
-
|
|
19
|
-
- Allow individual timecodes to be opened in new window
|
|
20
|
-
|
|
21
|
-
For cases where users want to be able to focus on one particular timecode,
|
|
22
|
-
or have complex multi-window / workspace. /monitor setups where they want to be
|
|
23
|
-
able to display specific timecodes in different places,
|
|
24
|
-
it's now possible to open a specific timecode in a new window.
|
package/eslint.config.mjs
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'eslint/config';
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
import { dirname } from 'path';
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
tsParser,
|
|
7
|
-
js,
|
|
8
|
-
FlatCompat,
|
|
9
|
-
} from '@arcanewizards/eslint-config/dependencies.js';
|
|
10
|
-
import eslintPluginBetterTailwindcss from 'eslint-plugin-better-tailwindcss';
|
|
11
|
-
import reactTailwindConfig from '@arcanewizards/eslint-config/react-tailwind.js';
|
|
12
|
-
|
|
13
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
-
const __dirname = dirname(__filename);
|
|
15
|
-
const { REACT_TAILWIND_CALLEES } = reactTailwindConfig;
|
|
16
|
-
|
|
17
|
-
const compat = new FlatCompat({
|
|
18
|
-
baseDirectory: __dirname,
|
|
19
|
-
recommendedConfig: js.configs.recommended,
|
|
20
|
-
allConfig: js.configs.all,
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
export default defineConfig([
|
|
24
|
-
{
|
|
25
|
-
extends: compat.extends('@arcanewizards/eslint-config/library.js'),
|
|
26
|
-
|
|
27
|
-
languageOptions: {
|
|
28
|
-
parser: tsParser,
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
extends: [eslintPluginBetterTailwindcss.configs.recommended],
|
|
33
|
-
settings: {
|
|
34
|
-
'better-tailwindcss': {
|
|
35
|
-
entryPoint: './src/components/frontend/frontend.css',
|
|
36
|
-
tsconfig: './tsconfig.json',
|
|
37
|
-
callees: REACT_TAILWIND_CALLEES,
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
rules: {
|
|
41
|
-
'better-tailwindcss/no-unknown-classes': 'error',
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
rules: {
|
|
46
|
-
'turbo/no-undeclared-env-vars': 'off',
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
]);
|
package/src/app.tsx
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AppShell,
|
|
3
|
-
AppListenerManager,
|
|
4
|
-
SigilRuntimeAppProps,
|
|
5
|
-
} from '@arcanewizards/sigil';
|
|
6
|
-
import {
|
|
7
|
-
JSX,
|
|
8
|
-
ReactNode,
|
|
9
|
-
useCallback,
|
|
10
|
-
useEffect,
|
|
11
|
-
useMemo,
|
|
12
|
-
useState,
|
|
13
|
-
} from 'react';
|
|
14
|
-
import { C } from './components/backend';
|
|
15
|
-
import { ToolboxConfigData } from './config';
|
|
16
|
-
import path from 'node:path';
|
|
17
|
-
import { useDataFileContext } from '@arcanejs/react-toolkit/data';
|
|
18
|
-
import {
|
|
19
|
-
ApplicationState,
|
|
20
|
-
AvailableHandlers,
|
|
21
|
-
DEFAULT_CONFIG,
|
|
22
|
-
TimecodeHandlerMethods,
|
|
23
|
-
ToolboxConfig,
|
|
24
|
-
ToolboxRootCallHandler,
|
|
25
|
-
} from './components/proto';
|
|
26
|
-
import { patchJson, Diff } from '@arcanejs/diff';
|
|
27
|
-
import { InputConnections } from './inputs';
|
|
28
|
-
import { OutputConnections } from './outputs';
|
|
29
|
-
import { Generators } from './generators';
|
|
30
|
-
import { TimecodeHandlers } from './types';
|
|
31
|
-
import { getTreeValue, mapTree, Tree } from './tree';
|
|
32
|
-
|
|
33
|
-
export type AppApi = Record<never, never>;
|
|
34
|
-
|
|
35
|
-
export type TimecodeToolboxAppProps = {
|
|
36
|
-
dataDirectory: string;
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export type AppProps = SigilRuntimeAppProps<AppApi, TimecodeToolboxAppProps>;
|
|
40
|
-
|
|
41
|
-
export const App = ({
|
|
42
|
-
title,
|
|
43
|
-
version,
|
|
44
|
-
toolkit,
|
|
45
|
-
dataDirectory,
|
|
46
|
-
logger,
|
|
47
|
-
logEventEmitter,
|
|
48
|
-
setWindowUrl,
|
|
49
|
-
shutdownContext,
|
|
50
|
-
}: AppProps): ReactNode => {
|
|
51
|
-
const { data, error, updateData, resetData } =
|
|
52
|
-
useDataFileContext(ToolboxConfigData);
|
|
53
|
-
|
|
54
|
-
useEffect(() => {
|
|
55
|
-
if (error) {
|
|
56
|
-
logger.warn('Resetting config to application default');
|
|
57
|
-
resetData();
|
|
58
|
-
}
|
|
59
|
-
}, [logger, error, resetData]);
|
|
60
|
-
|
|
61
|
-
const onUpdateConfig = (diff: Diff<ToolboxConfig>) => {
|
|
62
|
-
updateData((prev) => patchJson(prev, diff) ?? DEFAULT_CONFIG);
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const [state, setState] = useState<Omit<ApplicationState, 'handlers'>>({
|
|
66
|
-
inputs: {},
|
|
67
|
-
outputs: {},
|
|
68
|
-
generators: {},
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
const [handlers, setHandlers] = useState<TimecodeHandlers>({ children: {} });
|
|
72
|
-
|
|
73
|
-
const availableHandlers: Tree<AvailableHandlers> = useMemo(
|
|
74
|
-
() =>
|
|
75
|
-
mapTree(handlers, (node) =>
|
|
76
|
-
Object.fromEntries(
|
|
77
|
-
Object.entries(node)
|
|
78
|
-
.filter(([_, handler]) => handler)
|
|
79
|
-
.map(([key]) => [key, true]),
|
|
80
|
-
),
|
|
81
|
-
),
|
|
82
|
-
[handlers],
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
const callHandler = useCallback(
|
|
86
|
-
async <H extends keyof AvailableHandlers>(
|
|
87
|
-
call: ToolboxRootCallHandler<H>,
|
|
88
|
-
) => {
|
|
89
|
-
const handlerFunc = getTreeValue(handlers, call.path)?.[call.handler];
|
|
90
|
-
if (handlerFunc) {
|
|
91
|
-
return await (
|
|
92
|
-
handlerFunc as (
|
|
93
|
-
...args: Parameters<NonNullable<TimecodeHandlerMethods[H]>>
|
|
94
|
-
) => void
|
|
95
|
-
)(...call.args);
|
|
96
|
-
}
|
|
97
|
-
throw new Error(
|
|
98
|
-
`No handler found for path: ${call.path.join(' -> ')} and handler: ${call.handler}`,
|
|
99
|
-
);
|
|
100
|
-
},
|
|
101
|
-
[handlers],
|
|
102
|
-
);
|
|
103
|
-
|
|
104
|
-
return (
|
|
105
|
-
<AppShell
|
|
106
|
-
title={title}
|
|
107
|
-
version={version}
|
|
108
|
-
dataDirectory={dataDirectory}
|
|
109
|
-
logger={logger}
|
|
110
|
-
logEventEmitter={logEventEmitter}
|
|
111
|
-
shutdownContext={shutdownContext}
|
|
112
|
-
>
|
|
113
|
-
<C.ToolboxRoot
|
|
114
|
-
config={data}
|
|
115
|
-
state={state}
|
|
116
|
-
handlers={availableHandlers}
|
|
117
|
-
onUpdateConfig={onUpdateConfig}
|
|
118
|
-
onCallHandler={callHandler}
|
|
119
|
-
/>
|
|
120
|
-
<InputConnections state={state} setState={setState} />
|
|
121
|
-
<Generators state={state} setState={setState} setHandlers={setHandlers} />
|
|
122
|
-
<OutputConnections state={state} setState={setState} />
|
|
123
|
-
<AppListenerManager
|
|
124
|
-
toolkit={toolkit}
|
|
125
|
-
setWindowUrl={setWindowUrl}
|
|
126
|
-
listenerConfig={{
|
|
127
|
-
default: {
|
|
128
|
-
port: {
|
|
129
|
-
from: 4100,
|
|
130
|
-
to: 4200,
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
}}
|
|
134
|
-
/>
|
|
135
|
-
</AppShell>
|
|
136
|
-
);
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
export const createApp = (props: AppProps): JSX.Element => {
|
|
140
|
-
return (
|
|
141
|
-
<ToolboxConfigData.Provider
|
|
142
|
-
path={path.join(props.dataDirectory, 'config.json')}
|
|
143
|
-
>
|
|
144
|
-
<App {...props} />
|
|
145
|
-
</ToolboxConfigData.Provider>
|
|
146
|
-
);
|
|
147
|
-
};
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { IDMap } from '@arcanejs/toolkit/util';
|
|
2
|
-
import { Diff } from '@arcanejs/diff';
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
Base,
|
|
6
|
-
EventEmitter,
|
|
7
|
-
Listenable,
|
|
8
|
-
} from '@arcanejs/toolkit/components/base';
|
|
9
|
-
import {
|
|
10
|
-
TimecodeToolboxComponentCalls,
|
|
11
|
-
Namespace,
|
|
12
|
-
ToolboxRootComponent,
|
|
13
|
-
ToolboxConfig,
|
|
14
|
-
isTimecodeToolboxComponentMessage,
|
|
15
|
-
DEFAULT_CONFIG,
|
|
16
|
-
isTimecodeToolboxComponentCall,
|
|
17
|
-
ToolboxRootCallHandler,
|
|
18
|
-
} from '../proto';
|
|
19
|
-
import {
|
|
20
|
-
AnyClientComponentCall,
|
|
21
|
-
AnyClientComponentMessage,
|
|
22
|
-
} from '@arcanejs/protocol';
|
|
23
|
-
import { getNetworkInterfaces } from '@arcanewizards/net-utils';
|
|
24
|
-
|
|
25
|
-
export type Events = {
|
|
26
|
-
updateConfig: (diff: Diff<ToolboxConfig>) => void;
|
|
27
|
-
callHandler: (call: ToolboxRootCallHandler) => Promise<void>;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export type AppRootProps = Pick<
|
|
31
|
-
ToolboxRootComponent,
|
|
32
|
-
'config' | 'state' | 'handlers'
|
|
33
|
-
> & {
|
|
34
|
-
onUpdateConfig?: Events['updateConfig'];
|
|
35
|
-
onCallHandler?: Events['callHandler'];
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const DEFAULT_PROPS: AppRootProps = {
|
|
39
|
-
config: DEFAULT_CONFIG,
|
|
40
|
-
state: {
|
|
41
|
-
inputs: {},
|
|
42
|
-
outputs: {},
|
|
43
|
-
generators: {},
|
|
44
|
-
},
|
|
45
|
-
handlers: { children: {} },
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export class ToolboxRoot
|
|
49
|
-
extends Base<
|
|
50
|
-
Namespace,
|
|
51
|
-
ToolboxRootComponent,
|
|
52
|
-
AppRootProps,
|
|
53
|
-
TimecodeToolboxComponentCalls
|
|
54
|
-
>
|
|
55
|
-
implements Listenable<Events>
|
|
56
|
-
{
|
|
57
|
-
/** @hidden */
|
|
58
|
-
private readonly events = new EventEmitter<Events>();
|
|
59
|
-
|
|
60
|
-
public constructor(props: AppRootProps) {
|
|
61
|
-
super(DEFAULT_PROPS, props, {
|
|
62
|
-
onPropsUpdated: (oldProps) =>
|
|
63
|
-
this.events.processPropChanges(
|
|
64
|
-
{
|
|
65
|
-
onUpdateConfig: 'updateConfig',
|
|
66
|
-
onCallHandler: 'callHandler',
|
|
67
|
-
},
|
|
68
|
-
oldProps,
|
|
69
|
-
this.props,
|
|
70
|
-
),
|
|
71
|
-
});
|
|
72
|
-
this.triggerInitialPropsUpdate();
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
addListener = this.events.addListener;
|
|
76
|
-
removeListener = this.events.removeListener;
|
|
77
|
-
|
|
78
|
-
/** @hidden */
|
|
79
|
-
public getProtoInfo(idMap: IDMap): ToolboxRootComponent {
|
|
80
|
-
return {
|
|
81
|
-
namespace: 'timecode-toolbox',
|
|
82
|
-
component: 'toolbox-root',
|
|
83
|
-
key: idMap.getId(this),
|
|
84
|
-
config: this.props.config,
|
|
85
|
-
state: this.props.state,
|
|
86
|
-
handlers: this.props.handlers,
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** @hidden */
|
|
91
|
-
public handleMessage = (message: AnyClientComponentMessage) => {
|
|
92
|
-
if (isTimecodeToolboxComponentMessage(message, 'toolbox-root')) {
|
|
93
|
-
if (message.action === 'update-config') {
|
|
94
|
-
this.events.emit('updateConfig', message.diff);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
/** @hidden */
|
|
100
|
-
public handleCall = async (call: AnyClientComponentCall) => {
|
|
101
|
-
if (
|
|
102
|
-
isTimecodeToolboxComponentCall(
|
|
103
|
-
call,
|
|
104
|
-
'toolbox-root-get-network-interfaces',
|
|
105
|
-
)
|
|
106
|
-
) {
|
|
107
|
-
return getNetworkInterfaces();
|
|
108
|
-
} else if (
|
|
109
|
-
isTimecodeToolboxComponentCall(call, 'toolbox-root-call-handler')
|
|
110
|
-
) {
|
|
111
|
-
const result = await this.events.emit('callHandler', call);
|
|
112
|
-
if (result[0]) {
|
|
113
|
-
return result[0];
|
|
114
|
-
}
|
|
115
|
-
throw new Error(`No handler for callHandler`);
|
|
116
|
-
}
|
|
117
|
-
throw new Error(`Unhandled call action: ${call.action}`);
|
|
118
|
-
};
|
|
119
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { TIMECODE_FPS } from '@arcanewizards/artnet/constants';
|
|
2
|
-
|
|
3
|
-
const MS_FORMAT = new Intl.NumberFormat(undefined, {
|
|
4
|
-
style: 'unit',
|
|
5
|
-
unit: 'millisecond',
|
|
6
|
-
maximumFractionDigits: 0,
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
export const STRINGS = {
|
|
10
|
-
title: 'Timecode Toolbox',
|
|
11
|
-
debugger: 'Debug Tools & Log',
|
|
12
|
-
connectionError: 'Disconnected from Timecode Toolbox Server',
|
|
13
|
-
reconnect: 'Reconnect',
|
|
14
|
-
openInNewWindow: 'Open in new window',
|
|
15
|
-
toggle: (text: string) => `Toggle ${text}`,
|
|
16
|
-
close: (text: string) => `Close ${text}`,
|
|
17
|
-
protocols: {
|
|
18
|
-
artnet: {
|
|
19
|
-
short: 'ArtNet',
|
|
20
|
-
long: 'ArtNet',
|
|
21
|
-
},
|
|
22
|
-
tcnet: {
|
|
23
|
-
short: 'TCNet',
|
|
24
|
-
long: 'TCNet (ShowKontrol / Pioneer)',
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
inputs: {
|
|
28
|
-
title: 'INPUTS',
|
|
29
|
-
noChildren: 'No inputs yet. Please add one using the buttons below.',
|
|
30
|
-
addButton: (protocol: string) => `Add ${protocol}`,
|
|
31
|
-
addDialog: (protocol: string) => `Add ${protocol} Input`,
|
|
32
|
-
editDialog: (protocol: string, name: string) =>
|
|
33
|
-
`Edit ${protocol} Input ${name}`,
|
|
34
|
-
},
|
|
35
|
-
smtpeModes: {
|
|
36
|
-
SMPTE: `SMPTE ${TIMECODE_FPS.SMPTE}FPS`,
|
|
37
|
-
FILM: `FILM ${TIMECODE_FPS.FILM}FPS`,
|
|
38
|
-
EBU: `EBU ${TIMECODE_FPS.EBU}FPS`,
|
|
39
|
-
DF: `DF ${TIMECODE_FPS.DF}FPS`,
|
|
40
|
-
},
|
|
41
|
-
smtpeModeOptions: {
|
|
42
|
-
SMPTE: `SMPTE (${TIMECODE_FPS.SMPTE}FPS) (Recommended)`,
|
|
43
|
-
FILM: `FILM (${TIMECODE_FPS.FILM}FPS)`,
|
|
44
|
-
EBU: `EBU (${TIMECODE_FPS.EBU}FPS)`,
|
|
45
|
-
DF: `DF (${TIMECODE_FPS.DF}FPS)`,
|
|
46
|
-
},
|
|
47
|
-
accuracy: (accuracyMillis: number) =>
|
|
48
|
-
`Accuracy: ${MS_FORMAT.format(accuracyMillis)}`,
|
|
49
|
-
delay: (delayMs: number) => `Delay: ${MS_FORMAT.format(delayMs)}`,
|
|
50
|
-
generators: {
|
|
51
|
-
title: 'GENERATORS',
|
|
52
|
-
noChildren: 'No generators yet. Please add one using the buttons below.',
|
|
53
|
-
type: {
|
|
54
|
-
clock: 'Clock',
|
|
55
|
-
},
|
|
56
|
-
addDialog: (protocol: string) => `Add ${protocol} Generator`,
|
|
57
|
-
editDialog: (protocol: string, name: string) =>
|
|
58
|
-
`Edit ${protocol} Generator ${name}`,
|
|
59
|
-
},
|
|
60
|
-
outputs: {
|
|
61
|
-
title: 'OUTPUTS',
|
|
62
|
-
noChildren: 'No outputs yet. Please add one using the buttons below.',
|
|
63
|
-
addButton: (protocol: string) => `Add ${protocol}`,
|
|
64
|
-
addDialog: (protocol: string) => `Add ${protocol} Output`,
|
|
65
|
-
editDialog: (protocol: string, name: string) =>
|
|
66
|
-
`Edit ${protocol} Output ${name}`,
|
|
67
|
-
},
|
|
68
|
-
settings: {
|
|
69
|
-
title: 'Settings',
|
|
70
|
-
},
|
|
71
|
-
controls: {
|
|
72
|
-
play: 'Play',
|
|
73
|
-
pause: 'Pause',
|
|
74
|
-
beginning: 'Reset timecode to start',
|
|
75
|
-
back5seconds: 'Back 5 Seconds',
|
|
76
|
-
forward5seconds: 'Forward 5 Seconds',
|
|
77
|
-
},
|
|
78
|
-
errors: {
|
|
79
|
-
unknownTimecodeID: 'Unknown timecode ID, please close the window',
|
|
80
|
-
},
|
|
81
|
-
} as const;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
startTimecodeToolboxServerFrontend,
|
|
3
|
-
TimecodeToolboxBrowserContext,
|
|
4
|
-
} from '.';
|
|
5
|
-
|
|
6
|
-
declare global {
|
|
7
|
-
interface Window {
|
|
8
|
-
BROWSER_CONTEXT?: TimecodeToolboxBrowserContext;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
startTimecodeToolboxServerFrontend(window.BROWSER_CONTEXT);
|