fragment-tools 0.2.8 → 0.2.10

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 (98) hide show
  1. package/README.md +14 -10
  2. package/bin/index.js +4 -0
  3. package/package.json +11 -4
  4. package/src/cli/build.js +1 -3
  5. package/src/cli/create.js +55 -6
  6. package/src/cli/createConfig.js +9 -24
  7. package/src/cli/createFragmentFile.js +44 -46
  8. package/src/cli/getEntries.js +13 -5
  9. package/src/cli/plugins/check-dependencies.js +1 -1
  10. package/src/cli/plugins/save.js +7 -2
  11. package/src/cli/run.js +12 -3
  12. package/src/cli/templates/blank/index.js +4 -4
  13. package/src/cli/templates/blank/index.ts +15 -0
  14. package/src/cli/templates/default/index.js +7 -6
  15. package/src/cli/templates/default/index.ts +20 -0
  16. package/src/cli/templates/fragment-gl/fragment.fs +1 -1
  17. package/src/cli/templates/fragment-gl/index.js +3 -3
  18. package/src/cli/templates/fragment-gl/index.ts +20 -0
  19. package/src/cli/templates/p5/index.js +6 -6
  20. package/src/cli/templates/p5/index.ts +14 -0
  21. package/src/cli/templates/p5-webgl/fragment.fs +2 -4
  22. package/src/cli/templates/p5-webgl/index.js +9 -15
  23. package/src/cli/templates/p5-webgl/index.ts +43 -0
  24. package/src/cli/templates/three-fragment/fragment.fs +1 -1
  25. package/src/cli/templates/three-fragment/index.js +10 -4
  26. package/src/cli/templates/three-fragment/index.ts +68 -0
  27. package/src/cli/templates/three-orthographic/index.js +10 -4
  28. package/src/cli/templates/three-orthographic/index.ts +29 -0
  29. package/src/cli/templates/three-perspective/index.js +10 -4
  30. package/src/cli/templates/three-perspective/index.ts +26 -0
  31. package/src/cli/utils.js +3 -0
  32. package/src/client/app/components/HintRecord.svelte +3 -3
  33. package/src/client/app/hooks.js +5 -5
  34. package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +3 -1
  35. package/src/client/app/lib/canvas-recorder/GIFRecorder.js +11 -1
  36. package/src/client/app/lib/canvas-recorder/MediaBunnyRecorder.js +97 -0
  37. package/src/client/app/lib/gl/Renderer.js +1 -1
  38. package/src/client/app/lib/gl/Texture.js +1 -1
  39. package/src/client/app/lib/gl/index.js +2 -2
  40. package/src/client/app/modules/AudioAnalyser/Range.svelte +2 -2
  41. package/src/client/app/modules/AudioAnalyser/Spectrum.svelte +3 -3
  42. package/src/client/app/modules/Console/ConsoleLine.svelte +13 -13
  43. package/src/client/app/modules/Console.svelte +6 -4
  44. package/src/client/app/modules/Exports.svelte +28 -4
  45. package/src/client/app/renderers/2DRenderer.js +6 -3
  46. package/src/client/app/renderers/FragmentRenderer.js +39 -2
  47. package/src/client/app/renderers/P5GLRenderer.js +28 -26
  48. package/src/client/app/renderers/P5Renderer.js +49 -9
  49. package/src/client/app/renderers/THREERenderer.js +64 -12
  50. package/src/client/app/state/exports.svelte.js +40 -2
  51. package/src/client/app/state/rendering.svelte.js +2 -2
  52. package/src/client/app/state/utils.svelte.js +9 -2
  53. package/src/client/app/stores/sketches.js +2 -1
  54. package/src/client/app/ui/ErrorOverlay.svelte +5 -5
  55. package/src/client/app/ui/Field.svelte +12 -8
  56. package/src/client/app/ui/FieldGroup.svelte +5 -5
  57. package/src/client/app/ui/FieldSection.svelte +8 -8
  58. package/src/client/app/ui/FieldSpace.svelte +2 -2
  59. package/src/client/app/ui/FieldTrigger.svelte +6 -6
  60. package/src/client/app/ui/FloatingParams.svelte +1 -1
  61. package/src/client/app/ui/LayoutBuild.svelte +1 -1
  62. package/src/client/app/ui/LayoutComponent.svelte +7 -7
  63. package/src/client/app/ui/LayoutResizer.svelte +1 -1
  64. package/src/client/app/ui/LayoutToolbar.svelte +6 -6
  65. package/src/client/app/ui/Module.svelte +6 -4
  66. package/src/client/app/ui/ModuleRenderer.svelte +3 -3
  67. package/src/client/app/ui/OutputRenderer.svelte +4 -1
  68. package/src/client/app/ui/SketchRenderer.svelte +9 -2
  69. package/src/client/app/ui/fields/ButtonInput.svelte +11 -11
  70. package/src/client/app/ui/fields/CheckboxInput.svelte +27 -19
  71. package/src/client/app/ui/fields/ColorInput.svelte +9 -7
  72. package/src/client/app/ui/fields/ImageInput.svelte +43 -23
  73. package/src/client/app/ui/fields/Input.svelte +13 -13
  74. package/src/client/app/ui/fields/IntervalInput.svelte +11 -14
  75. package/src/client/app/ui/fields/ListInput.svelte +9 -8
  76. package/src/client/app/ui/fields/ProgressInput.svelte +9 -9
  77. package/src/client/app/ui/fields/Select.svelte +13 -12
  78. package/src/client/app/ui/fields/VectorInput.svelte +1 -1
  79. package/src/client/app/utils/canvas.utils.js +21 -19
  80. package/src/client/public/css/global.css +26 -27
  81. package/src/types/client.d.ts +36 -0
  82. package/src/types/gl.d.ts +130 -0
  83. package/src/types/helpers.d.ts +5 -0
  84. package/src/types/hooks.d.ts +14 -0
  85. package/src/types/index.d.ts +8 -0
  86. package/src/types/midi.d.ts +176 -0
  87. package/src/types/props.d.ts +72 -0
  88. package/src/types/renderers.d.ts +100 -0
  89. package/src/types/sketch.d.ts +45 -0
  90. package/src/types/triggers.d.ts +45 -0
  91. package/src/types/utils.ts +11 -0
  92. package/tsconfig.json +38 -0
  93. package/.prettierignore +0 -4
  94. package/.prettierrc +0 -25
  95. package/src/client/app/lib/canvas-recorder/MP4Recorder.js +0 -44
  96. package/src/client/app/lib/canvas-recorder/WebMRecorder.js +0 -29
  97. package/src/client/app/lib/canvas-recorder/mp4.js +0 -1654
  98. package/src/client/app/lib/canvas-recorder/mp4.wasm +0 -0
@@ -0,0 +1,100 @@
1
+ import type p5 from 'p5';
2
+ import type * as THREE from 'three';
3
+ import type { Frag } from '@fragment/lib/gl';
4
+
5
+ export type Rendering = '2d' | 'fragment' | 'p5' | 'p5-webgl' | 'three';
6
+
7
+ type Params = Record<string, any>;
8
+
9
+ export type RendererParams = {
10
+ id: number;
11
+ canvas: HTMLCanvasElement;
12
+ container: HTMLElement;
13
+ width: number;
14
+ height: number;
15
+ pixelRatio: number;
16
+ };
17
+
18
+ export type InitParams<P extends Params = Params> = P;
19
+
20
+ type RenderingsMountParams = {
21
+ '2d': { canvas: HTMLCanvasElement; context: CanvasRenderingContext2D };
22
+ fragment: { canvas: HTMLCanvasElement; frag: Frag };
23
+ p5: { canvas: HTMLCanvasElement; p: p5 };
24
+ 'p5-webgl': { canvas: HTMLCanvasElement; p: p5 };
25
+ three: {
26
+ canvas: HTMLCanvasElement;
27
+ scene: THREE['Scene'];
28
+ renderer: THREE['WebGLRenderer'];
29
+ };
30
+ };
31
+
32
+ export type MountParams<R extends Rendering | Params> =
33
+ R extends keyof RenderingsMountParams ? RenderingsMountParams[R] : R;
34
+
35
+ export type MountParams2DRenderer = MountParams<'2d'>;
36
+ export type MountParamsFragmentRenderer = MountParams<'fragment'>;
37
+ export type MountParamsP5Renderer = MountParams<'p5'>;
38
+ export type MountParamsP5GLRenderer = MountParams<'p5-webgl'>;
39
+ export type MountParamsThreeRenderer = MountParams<'three'>;
40
+
41
+ export type RendererInit<P extends Params = InitParams> = (
42
+ params: Pick<RendererParams, 'canvas' | 'width' | 'height' | 'pixelRatio'>,
43
+ ) => InitParams<P>;
44
+
45
+ export type RendererOnMountPreview<
46
+ P extends Params = InitParams,
47
+ R extends Rendering | Params = Params,
48
+ > = (
49
+ params: Pick<
50
+ RendererParams,
51
+ 'id' | 'canvas' | 'container' | 'width' | 'height' | 'pixelRatio'
52
+ > &
53
+ InitParams<P>,
54
+ ) => MountParams<R>;
55
+
56
+ export type RendererOnResizePreview<
57
+ P extends Params = InitParams,
58
+ R extends Rendering | Params = Params,
59
+ > = (
60
+ params: Pick<
61
+ RendererParams,
62
+ 'id' | 'canvas' | 'width' | 'height' | 'pixelRatio'
63
+ > &
64
+ InitParams<P> &
65
+ MountParams<R>,
66
+ ) => void;
67
+
68
+ export type RendererOnBeforeUpdatePreview<
69
+ P extends Params = InitParams,
70
+ R extends Rendering | Params = Params,
71
+ > = (
72
+ params: Pick<RendererParams, 'id' | 'canvas' | 'container'> &
73
+ InitParams<P> &
74
+ MountParams<R>,
75
+ ) => void;
76
+
77
+ export type RendererOnAfterUpdatePreview<
78
+ P extends Params = InitParams,
79
+ R extends Rendering | Params = Params,
80
+ > = (
81
+ params: Pick<RendererParams, 'id' | 'canvas' | 'container'> &
82
+ InitParams<P> &
83
+ MountParams<R>,
84
+ ) => void;
85
+
86
+ export type RendererOnDestroyPreview<
87
+ P extends Params = InitParams,
88
+ R extends Rendering | Params = Params,
89
+ > = (
90
+ params: Pick<RendererParams, 'id'> & InitParams<P> & MountParams<R>,
91
+ ) => void;
92
+
93
+ export type RendererResize<
94
+ P extends Params = InitParams,
95
+ R extends Rendering | Params = Params,
96
+ > = (
97
+ params: Pick<RendererParams, 'width' | 'height' | 'pixelRatio'> &
98
+ InitParams<P> &
99
+ MountParams<R>,
100
+ ) => void;
@@ -0,0 +1,45 @@
1
+ import type { Props } from './props';
2
+ import type { Rendering, MountParams, RendererParams } from './renderers';
3
+ import type { Frag } from './gl';
4
+
5
+ export type Load<R extends Rendering | object> = (
6
+ params: RendererParams &
7
+ MountParams<R> & {
8
+ publicPath: string;
9
+ },
10
+ ) => Promise<void> | void;
11
+
12
+ export type Init<R extends Rendering | object> = (
13
+ params: RendererParams &
14
+ MountParams<R> & {
15
+ publicPath: string;
16
+ },
17
+ ) => Promise<void> | void;
18
+
19
+ export type Update<R extends Rendering | object> = (
20
+ params: RendererParams &
21
+ MountParams<R> & {
22
+ time: number;
23
+ deltaTime: number;
24
+ playhead?: number;
25
+ playcount?: number;
26
+ },
27
+ ) => void;
28
+
29
+ export type Resize<R extends Rendering | object> = (
30
+ params: RendererParams & MountParams<R>,
31
+ ) => void;
32
+
33
+ export type Dispose<R extends Rendering | object> = () => void;
34
+
35
+ export type FilenamePattern = (params: {
36
+ filename: string;
37
+ year: string;
38
+ month: string;
39
+ day: string;
40
+ hours: string;
41
+ minutes: string;
42
+ seconds: string;
43
+ timestamp: string;
44
+ props: Props;
45
+ }) => string;
@@ -0,0 +1,45 @@
1
+ declare module '@fragment/triggers' {
2
+ // Mouse
3
+ function onClick(listener: (event: MouseEvent) => void): void;
4
+ function onMouseDown(listener: (event: MouseEvent) => void): void;
5
+ function onMouseUp(listener: (event: MouseEvent) => void): void;
6
+ function onMouseMove(listener: (event: MouseEvent) => void): void;
7
+
8
+ // Keyboard
9
+ function onKeyPress(
10
+ key?: string | string[],
11
+ listener: (event: KeyboardEvent) => void,
12
+ ): void;
13
+ function onKeyDown(
14
+ key?: string | string[],
15
+ listener: (event: KeyboardEvent) => void,
16
+ ): void;
17
+ function onKeyUp(
18
+ key?: string | string[],
19
+ listener: (event: KeyboardEvent) => void,
20
+ ): void;
21
+
22
+ // MIDI
23
+ function onNoteOn(
24
+ note?: MIDI.MIDINote | MIDI.MIDINote[],
25
+ listener: (event: MIDI.MIDIMessageEvent) => void,
26
+ ): void;
27
+ function onNoteOff(
28
+ note?: MIDI.MIDINote | MIDI.MIDINote[],
29
+ listener: (event: MIDI.MIDIMessageEvent) => void,
30
+ ): void;
31
+
32
+ function onNumberOn(
33
+ noteNumber?: number | number[],
34
+ listener: (event: MIDI.MIDIMessageEvent) => void,
35
+ ): void;
36
+ function onNumberOff(
37
+ noteNumber?: number | number[],
38
+ listener: (event: MIDI.MIDIMessageEvent) => void,
39
+ ): void;
40
+
41
+ function onControlChange(
42
+ control?: number | number[],
43
+ listener: (event: MIDI.MIDIMessageEvent) => void,
44
+ ): void;
45
+ }
@@ -0,0 +1,11 @@
1
+ import { Props } from './props';
2
+
3
+ /**
4
+ * Declare props with full type inference support
5
+ *
6
+ * @param {Props} props
7
+ * @returns {Props}
8
+ */
9
+ export function defineProps<P extends Props>(props: P): P {
10
+ return props;
11
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "compilerOptions": {
3
+ "baseUrl": ".",
4
+
5
+ "target": "ESNext",
6
+ "useDefineForClassFields": true,
7
+ "module": "ESNext",
8
+ "lib": ["ESNext", "DOM", "DOM.Iterable"],
9
+ "skipLibCheck": true,
10
+
11
+ /* Bundler mode */
12
+ "moduleResolution": "bundler",
13
+ "allowImportingTsExtensions": true,
14
+ "isolatedModules": true,
15
+ "esModuleInterop": false,
16
+ "moduleDetection": "force",
17
+ "resolveJsonModule": true,
18
+ "noEmit": true,
19
+
20
+ /* Linting */
21
+ "strict": true,
22
+ "allowJs": true,
23
+ "checkJs": false,
24
+ "noUnusedLocals": true,
25
+ "noUnusedParameters": true,
26
+ "noFallthroughCasesInSwitch": true,
27
+ "noUncheckedSideEffectImports": true,
28
+ "allowSyntheticDefaultImports": true,
29
+ "forceConsistentCasingInFileNames": true,
30
+
31
+ /* Paths */
32
+ "paths": {
33
+ "@fragment/types": ["src/types"],
34
+ "@fragment/types/*": ["src/types/*"],
35
+ "@fragment/*": ["src/client/app/*"]
36
+ }
37
+ }
38
+ }
package/.prettierignore DELETED
@@ -1,4 +0,0 @@
1
- pnpm-lock.yaml
2
- pnpm-workspace.yaml
3
- package-lock.json
4
- /docs
package/.prettierrc DELETED
@@ -1,25 +0,0 @@
1
- {
2
- "semi": true,
3
- "tabWidth": 4,
4
- "useTabs": true,
5
- "singleQuote": true,
6
- "printWidth": 80,
7
- "bracketSpacing": true,
8
- "trailingComma": "all",
9
- "plugins": ["prettier-plugin-svelte"],
10
- "overrides": [
11
- {
12
- "files": ["README.md", "packages/*/README.md", "**/package.json"],
13
- "options": {
14
- "useTabs": false,
15
- "tabWidth": 2
16
- }
17
- },
18
- {
19
- "files": ["docs/**/*.md"],
20
- "options": {
21
- "printWidth": 60
22
- }
23
- }
24
- ]
25
- }
@@ -1,44 +0,0 @@
1
- import loadMP4Module, { isWebCodecsSupported } from './mp4.js';
2
- import CanvasRecorder from './CanvasRecorder';
3
-
4
- let MP4;
5
-
6
- class MP4Recorder extends CanvasRecorder {
7
- static loaded = false;
8
- static isSupported = true;
9
-
10
- constructor(canvas, options) {
11
- super(canvas, options);
12
- }
13
-
14
- async load() {
15
- if (!MP4Recorder.loaded) {
16
- MP4 = await loadMP4Module();
17
-
18
- MP4Recorder.loaded = true;
19
- }
20
-
21
- this.encoder = MP4.createWebCodecsEncoder({
22
- width: this.canvas.width,
23
- height: this.canvas.height,
24
- fps: this.framerate,
25
- });
26
- }
27
-
28
- async tick() {
29
- const bitmap = await window.createImageBitmap(this.canvas);
30
-
31
- // Add bitmap to encoder
32
- await this.encoder.addFrame(bitmap);
33
- }
34
-
35
- async end() {
36
- const buffer = await this.encoder.end();
37
-
38
- this.result = new Blob([buffer], { type: 'video/mp4' });
39
-
40
- super.end();
41
- }
42
- }
43
-
44
- export default MP4Recorder;
@@ -1,29 +0,0 @@
1
- import WebMWriter from 'webm-writer';
2
- import { map } from '../../utils/math.utils';
3
- import CanvasRecorder from './CanvasRecorder';
4
-
5
- class WebMRecorder extends CanvasRecorder {
6
- start() {
7
- const quality = map(this.quality, 1, 100, 0, 0.99999);
8
-
9
- this.writer = new WebMWriter({
10
- quality,
11
- frameRate: this.framerate,
12
- });
13
-
14
- super.start();
15
- }
16
-
17
- tick() {
18
- this.writer.addFrame(this.canvas);
19
- }
20
-
21
- async end() {
22
- this.result = await this.writer.complete();
23
- this.writer = null;
24
-
25
- super.end();
26
- }
27
- }
28
-
29
- export default WebMRecorder;