@web-noise/core 0.0.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.
@@ -0,0 +1,277 @@
1
+ import { AudioNodeState, Patch } from "@web-noise/patch";
2
+ import { JSX } from "react/jsx-runtime";
3
+ import { HandleProps, NodeProps, Edge, Node, Viewport, OnConnect, OnEdgesChange, OnNodesChange, NodeTypes, EdgeProps } from "reactflow";
4
+ import { Theme as _Theme1 } from "@emotion/react";
5
+ import { ClassAttributes, HTMLAttributes, DetailedHTMLProps, ReactNode } from "react";
6
+ import { StyledComponent } from "@emotion/styled";
7
+ import { StateCreator, StoreApi, UseBoundStore } from "zustand";
8
+ import { Delta } from "jsondiffpatch";
9
+ export const useAudioNode: <T = WNAudioNode>(id: string) => AudioNodeState<T> | undefined;
10
+ export const useNode: (id: string) => {
11
+ updateNodeValues: (values: WNNodeData["values"]) => void;
12
+ updateNodeConfig: (config: WNNodeData["config"]) => void;
13
+ updateNodeLabel: (label: string) => void;
14
+ };
15
+ export const theme: {
16
+ colors: {
17
+ readonly elevation1: "#292d39";
18
+ readonly elevation2: "#181c20";
19
+ readonly elevation3: "#373c4b";
20
+ readonly accent1: "#0066dc";
21
+ readonly accent2: "#007bff";
22
+ readonly accent3: "#3c93ff";
23
+ readonly highlight1: "#535760";
24
+ readonly highlight2: "#8c92a4";
25
+ readonly highlight3: "#fefefe";
26
+ readonly vivid1: "#14df42";
27
+ readonly whitePrimary: "#ffffff";
28
+ readonly error: "#db5353";
29
+ };
30
+ zIndex: {
31
+ readonly modal: 9998;
32
+ readonly controlPanel: 9999;
33
+ readonly resumeContextLayout: 10003;
34
+ };
35
+ };
36
+ export type Theme = typeof theme;
37
+ export const useTheme: () => Theme;
38
+ interface EditableLabelProps {
39
+ onChange: (value: string) => void;
40
+ value?: string;
41
+ className?: string;
42
+ }
43
+ export const EditableLabel: ({ onChange, value, className, }: EditableLabelProps) => JSX.Element;
44
+ export const PortsPanel: StyledComponent<{
45
+ theme?: _Theme1;
46
+ as?: React.ElementType;
47
+ } & ClassAttributes<HTMLDivElement> & HTMLAttributes<HTMLDivElement> & {
48
+ theme?: _Theme1;
49
+ } & {
50
+ theme: Theme;
51
+ }, {}, {}>;
52
+ export const InputPorts: StyledComponent<{
53
+ theme?: _Theme1;
54
+ as?: React.ElementType;
55
+ }, DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
56
+ export const OutputPorts: StyledComponent<{
57
+ theme?: _Theme1;
58
+ as?: React.ElementType;
59
+ }, DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
60
+ export const Port: StyledComponent<{
61
+ theme?: _Theme1;
62
+ as?: React.ElementType;
63
+ }, DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
64
+ export const InputHandle: (props: Partial<HandleProps>) => JSX.Element;
65
+ export const OutputHandle: (props: Partial<HandleProps>) => JSX.Element;
66
+ export type WNNodeProps<T = Record<string, unknown>> = NodeProps<T & WNNodeData>;
67
+ interface TitleBarProps {
68
+ className?: string;
69
+ [key: string]: unknown;
70
+ }
71
+ export const TitleBar: ({ className, ...props }: TitleBarProps) => JSX.Element;
72
+ interface WNNodeParameters extends NodeProps {
73
+ children?: any;
74
+ }
75
+ export const WNNode: (props: WNNodeParameters) => JSX.Element;
76
+ type AudioNodeChannel = [AudioNode, number];
77
+ export interface InputPort {
78
+ port: AudioNode | AudioNodeChannel | AudioParam;
79
+ }
80
+ export interface OutputPort {
81
+ port: AudioNode | AudioNodeChannel;
82
+ }
83
+ export interface WNAudioNode extends Record<string, any> {
84
+ inputs?: Record<string, InputPort | never>;
85
+ outputs?: Record<string, OutputPort | never>;
86
+ destroy?: () => void;
87
+ setValues?: (values?: any) => void;
88
+ }
89
+ export type CreateWNAudioNode<T = WNAudioNode> = (audioContext: AudioContext, data?: WNNodeData) => T | Promise<T>;
90
+ type NodeDefaultConfig = {
91
+ size?: {
92
+ width: number;
93
+ height: number;
94
+ };
95
+ };
96
+ export interface WNNodeData<Values = Record<string, unknown>, Config = Record<string, unknown>> {
97
+ label: string;
98
+ values?: Values;
99
+ config?: Config & NodeDefaultConfig;
100
+ }
101
+ export type TWNNode = Node<WNNodeData>;
102
+ export type TWNEdge = Edge;
103
+ interface GraphState {
104
+ nodes: TWNNode[];
105
+ edges: TWNEdge[];
106
+ }
107
+ type ControlPanelNodes = Array<{
108
+ id: TWNNode["id"];
109
+ width?: number;
110
+ height?: number;
111
+ x?: number;
112
+ y?: number;
113
+ }>;
114
+ interface ControlPanelState {
115
+ show: boolean;
116
+ nodes: ControlPanelNodes;
117
+ size: {
118
+ width: number;
119
+ height: number;
120
+ };
121
+ }
122
+ export interface EditorStoreState extends GraphState {
123
+ controlPanel: ControlPanelState;
124
+ }
125
+ export interface EditorState extends EditorStoreState {
126
+ viewport: Viewport;
127
+ }
128
+ type ProjectFile = {
129
+ id: string;
130
+ name?: string;
131
+ type?: "patch" | "blob";
132
+ file: EditorState;
133
+ };
134
+ export interface Project {
135
+ files: Array<ProjectFile>;
136
+ }
137
+ export interface ControlPanelNodeProps {
138
+ node: TWNNode;
139
+ audioNode?: WNAudioNode | null;
140
+ updateNodeValues?: (param: any) => void;
141
+ }
142
+ export type ControlPanelNode = any;
143
+ type ConfigNode = (props: WNNodeProps<WNNodeData>) => any;
144
+ export interface PluginComponent {
145
+ id?: string;
146
+ type: string;
147
+ node: any;
148
+ audioNode: CreateWNAudioNode | false;
149
+ controlPanelNode?: ControlPanelNode;
150
+ configNode?: ConfigNode;
151
+ defaultConfig?: any;
152
+ resizable?: boolean;
153
+ description?: string;
154
+ name?: string;
155
+ }
156
+ export interface PluginConfig {
157
+ id?: string;
158
+ components: Array<PluginComponent>;
159
+ name?: string;
160
+ description?: string;
161
+ }
162
+ interface NodesState {
163
+ nodes: TWNNode[];
164
+ edges: TWNEdge[];
165
+ onNodesChange: OnNodesChange;
166
+ onEdgesChange: OnEdgesChange;
167
+ onConnect: OnConnect;
168
+ addNode: (node: TWNNode) => void;
169
+ setNodes: (nodes: TWNNode[]) => void;
170
+ setEdges: (edges: TWNEdge[]) => void;
171
+ setNodesAndEdges: (elements: GraphState) => void;
172
+ getNodesAndEdges: () => GraphState;
173
+ clearElements: () => void;
174
+ getNode: (id: string) => TWNNode | null;
175
+ updateNodeData: (id: string, data: Partial<WNNodeData>) => void;
176
+ nodeTypes: NodeTypes;
177
+ setNodeTypes: (nodeTypes: NodeTypes) => void;
178
+ }
179
+ interface HistoryState {
180
+ history: {
181
+ maxHistoryLength: number;
182
+ buffer: Array<Delta>;
183
+ pointer: number;
184
+ skipCollect: boolean;
185
+ push: (changes: Delta) => void;
186
+ back: () => void;
187
+ forward: () => void;
188
+ clear: () => void;
189
+ };
190
+ }
191
+ type StoreStateCreator = StateCreator<StoreState>;
192
+ declare const history: (config: StoreStateCreator) => StoreStateCreator;
193
+ interface AudioPatchState {
194
+ patch: Patch;
195
+ nodesState: Record<string, any>;
196
+ }
197
+ interface ProjectState {
198
+ project: Project;
199
+ setProject: (project: Project) => void;
200
+ getProject: () => Project;
201
+ pullEditorChanges: () => void;
202
+ currentFileIndex: number;
203
+ setCurrentFileIndex: (index: number) => void;
204
+ updateFileContent: (fileIndex: number, file: ProjectFile) => void;
205
+ updateFileName: (fileIndex: number, fileName: string) => void;
206
+ addFile: (file: ProjectFile, name?: string) => void;
207
+ deleteFile: (fileIndex: number) => void;
208
+ }
209
+ interface EditorConfig {
210
+ showMinimap: boolean;
211
+ }
212
+ type NodesConfiguration = Record<string, PluginComponent>;
213
+ type StoreState = NodesState & HistoryState & ProjectState & AudioPatchState & {
214
+ setGraph: (elements: {
215
+ nodes: TWNNode[];
216
+ edges: TWNEdge[];
217
+ }) => Promise<void>;
218
+ clearGraph: () => void;
219
+ createNode: (node: TWNNode) => void;
220
+ createNodes: (node: TWNNode[]) => Promise<void>;
221
+ removeNode: (node: TWNNode) => void;
222
+ removeNodes: (nodes: TWNNode[]) => void;
223
+ removeEdges: (nodes: TWNEdge[]) => void;
224
+ onConnect: OnConnect;
225
+ createEdges: (edge: TWNEdge[]) => void;
226
+ onEdgesDelete: (edges: TWNEdge[]) => void;
227
+ onNodesDelete: (nodes: TWNNode[]) => Promise<void>;
228
+ plugins: Array<PluginConfig>;
229
+ setPlugins: (plugins: Array<PluginConfig>) => void;
230
+ nodesConfiguration: NodesConfiguration;
231
+ config: EditorConfig;
232
+ setConfig: (config: Partial<EditorConfig>) => void;
233
+ getEditorState: () => EditorState;
234
+ setEditorState: (state: EditorState) => Promise<void>;
235
+ isHelpShown: boolean;
236
+ toggleHelp: () => void;
237
+ copyBuffer: {
238
+ nodes: TWNNode[];
239
+ edges: TWNEdge[];
240
+ };
241
+ copy: (elements: {
242
+ nodes: TWNNode[];
243
+ edges: TWNEdge[];
244
+ }) => void;
245
+ copySelectedItems: () => void;
246
+ pasteBuffer: (x: number, y: number) => void;
247
+ getControlPanelNode: (node: TWNNode) => ControlPanelNode | null;
248
+ controlPanel: ControlPanelState;
249
+ setControlPanelNodes: (nodes: ControlPanelNodes) => void;
250
+ showControlPanel: () => void;
251
+ hideControlPanel: () => void;
252
+ setControlPanelSize: (width: {
253
+ width: number;
254
+ height: number;
255
+ }) => void;
256
+ addNodeToControlPanel: (node: TWNNode) => void;
257
+ removeNodeFromControlPanel: (node: TWNNode) => void;
258
+ removeNodesFromControlPanel: (nodes: TWNNode[]) => void;
259
+ viewport: Viewport;
260
+ setViewport: (viewport: Viewport) => void;
261
+ };
262
+ export const useStore: UseBoundStore<StoreApi<StoreState>>;
263
+ interface ModalProps {
264
+ onClose?: () => void;
265
+ children: ReactNode;
266
+ }
267
+ export const Modal: ({ children, onClose, ...props }: ModalProps) => JSX.Element;
268
+ export const Wire: ({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, style, data, markerStart, markerEnd, source, target, sourceHandleId, targetHandleId, selected, }: EdgeProps) => JSX.Element;
269
+ export const Editor: ({ ...props }: {
270
+ projectState?: Project;
271
+ plugins?: Array<PluginConfig>;
272
+ editorContextMenu?: Array<ReactNode>;
273
+ onChange?: ({ nodes, edges, controlPanel }: EditorState) => void;
274
+ theme?: Theme;
275
+ }) => JSX.Element;
276
+
277
+ //# sourceMappingURL=types.d.ts.map
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@web-noise/core",
3
+ "version": "0.0.1",
4
+ "source": "index.ts",
5
+ "main": "dist/main.js",
6
+ "module": "dist/module.js",
7
+ "types": "dist/types.d.ts",
8
+ "files": [
9
+ "dist/main.js",
10
+ "dist/module.js",
11
+ "dist/types.d.ts"
12
+ ],
13
+ "targets": {
14
+ "main": {
15
+ "isLibrary": true,
16
+ "includeNodeModules": [
17
+ "@web-noise/fetch",
18
+ "@web-noise/patch"
19
+ ],
20
+ "optimize": true
21
+ },
22
+ "module": {
23
+ "isLibrary": true,
24
+ "includeNodeModules": [
25
+ "@web-noise/fetch",
26
+ "@web-noise/patch"
27
+ ],
28
+ "optimize": true
29
+ }
30
+ },
31
+ "dependencies": {
32
+ "hotkeys-js": "^3.13.1",
33
+ "js-file-download": "^0.4.12",
34
+ "jsondiffpatch": "^0.5.0",
35
+ "marked": "^4.1.1",
36
+ "nanoid": "^3.3.7",
37
+ "re-resizable": "^6.9.9",
38
+ "react-contexify": "^5.0.0",
39
+ "react-draggable": "^4.4.5",
40
+ "react-file-drop": "^3.1.6",
41
+ "react-grid-layout": "^1.3.4",
42
+ "react-icons": "^4.10.1",
43
+ "react-modern-drawer": "^1.2.0",
44
+ "reactflow": "^11.10.3",
45
+ "zustand": "^4.4.1",
46
+ "@emotion/css": "^11.11.2",
47
+ "@emotion/react": "^11.11.1",
48
+ "@emotion/styled": "^11.11.0"
49
+ },
50
+ "scripts": {
51
+ "test": "jest",
52
+ "build": "parcel build --no-scope-hoist"
53
+ },
54
+ "devDependencies": {
55
+ "@types/jest": "^29.2.4",
56
+ "@types/react-grid-layout": "^1.3.2",
57
+ "@types/react-modal": "^3.13.1",
58
+ "@types/react-copy-to-clipboard": "^5.0.4",
59
+ "jest": "^29.3.1",
60
+ "ts-jest": "^29.0.3",
61
+ "web-audio-engine": "^0.13.4",
62
+ "typescript": "^5.6.3",
63
+ "@types/react": "^19.1.12",
64
+ "@types/react-dom": "^19.1.9"
65
+ },
66
+ "peerDependencies": {
67
+ "@web-noise/fetch": "*",
68
+ "@web-noise/patch": "*",
69
+ "react": "^19.1.1",
70
+ "react-dom": "^19.1.1"
71
+ }
72
+ }