@linkdlab/funcnodes_react_flow 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.
- package/dist/frontend/datarenderer/images.d.ts +11 -0
- package/dist/frontend/datarenderer/images.js +13 -0
- package/dist/frontend/datarenderer/images.js.map +1 -0
- package/dist/frontend/datarenderer/index.d.ts +16 -0
- package/dist/frontend/datarenderer/index.js +26 -0
- package/dist/frontend/datarenderer/index.js.map +1 -0
- package/dist/frontend/datarenderer/plotly.d.ts +14 -0
- package/dist/frontend/datarenderer/plotly.js +53 -0
- package/dist/frontend/datarenderer/plotly.js.map +1 -0
- package/dist/frontend/dialog.d.ts +17 -0
- package/dist/frontend/dialog.js +26 -0
- package/dist/frontend/dialog.js.map +1 -0
- package/dist/frontend/edge.d.ts +5 -0
- package/dist/frontend/edge.js +40 -0
- package/dist/frontend/edge.js.map +1 -0
- package/dist/frontend/funcnodesreactflow/index.d.ts +6 -0
- package/dist/frontend/funcnodesreactflow/index.js +94 -0
- package/dist/frontend/funcnodesreactflow/index.js.map +1 -0
- package/dist/frontend/funcnodesreactflow/react_flow_layer.d.ts +5 -0
- package/dist/frontend/funcnodesreactflow/react_flow_layer.js +149 -0
- package/dist/frontend/funcnodesreactflow/react_flow_layer.js.map +1 -0
- package/dist/frontend/header/index.d.ts +4 -0
- package/dist/frontend/header/index.js +227 -0
- package/dist/frontend/header/index.js.map +1 -0
- package/{src/frontend/index.tsx → dist/frontend/index.d.ts} +0 -1
- package/dist/frontend/index.js +4 -0
- package/dist/frontend/index.js.map +1 -0
- package/dist/frontend/lib.d.ts +10 -0
- package/dist/frontend/lib.js +107 -0
- package/dist/frontend/lib.js.map +1 -0
- package/{src/frontend/node/index.tsx → dist/frontend/node/index.d.ts} +0 -1
- package/dist/frontend/node/index.js +3 -0
- package/dist/frontend/node/index.js.map +1 -0
- package/dist/frontend/node/io/default_input_renderer.d.ts +11 -0
- package/dist/frontend/node/io/default_input_renderer.js +235 -0
- package/dist/frontend/node/io/default_input_renderer.js.map +1 -0
- package/dist/frontend/node/io/default_output_render.d.ts +6 -0
- package/dist/frontend/node/io/default_output_render.js +23 -0
- package/dist/frontend/node/io/default_output_render.js.map +1 -0
- package/dist/frontend/node/io/handle_renderer.d.ts +6 -0
- package/dist/frontend/node/io/handle_renderer.js +70 -0
- package/dist/frontend/node/io/handle_renderer.js.map +1 -0
- package/{src/frontend/node/io/index.tsx → dist/frontend/node/io/index.d.ts} +0 -1
- package/dist/frontend/node/io/index.js +4 -0
- package/dist/frontend/node/io/index.js.map +1 -0
- package/dist/frontend/node/io/io.d.ts +16 -0
- package/dist/frontend/node/io/io.js +98 -0
- package/dist/frontend/node/io/io.js.map +1 -0
- package/dist/frontend/node/io/nodeinput.d.ts +6 -0
- package/dist/frontend/node/io/nodeinput.js +74 -0
- package/dist/frontend/node/io/nodeinput.js.map +1 -0
- package/dist/frontend/node/io/nodeoutput.d.ts +6 -0
- package/dist/frontend/node/io/nodeoutput.js +19 -0
- package/dist/frontend/node/io/nodeoutput.js.map +1 -0
- package/dist/frontend/node/node.d.ts +20 -0
- package/dist/frontend/node/node.js +118 -0
- package/dist/frontend/node/node.js.map +1 -0
- package/dist/frontend/utils/colorpicker.d.ts +19 -0
- package/dist/frontend/utils/colorpicker.js +209 -0
- package/dist/frontend/utils/colorpicker.js.map +1 -0
- package/dist/frontend/utils/jsondata.d.ts +6 -0
- package/dist/frontend/utils/jsondata.js +8 -0
- package/dist/frontend/utils/jsondata.js.map +1 -0
- package/dist/frontend/utils/table.d.ts +11 -0
- package/dist/frontend/utils/table.js +108 -0
- package/dist/frontend/utils/table.js.map +1 -0
- package/dist/funcnodes/funcnodesworker.d.ts +72 -0
- package/dist/funcnodes/funcnodesworker.js +532 -0
- package/dist/funcnodes/funcnodesworker.js.map +1 -0
- package/dist/funcnodes/index.js +5 -0
- package/dist/funcnodes/index.js.map +1 -0
- package/dist/funcnodes/websocketworker.d.ts +27 -0
- package/dist/funcnodes/websocketworker.js +224 -0
- package/dist/funcnodes/websocketworker.js.map +1 -0
- package/dist/funcnodes/workermanager.d.ts +32 -0
- package/dist/funcnodes/workermanager.js +241 -0
- package/dist/funcnodes/workermanager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/states/edge.d.ts +7 -0
- package/dist/states/edge.js +6 -0
- package/dist/states/edge.js.map +1 -0
- package/dist/states/edge.t.d.ts +16 -0
- package/dist/states/edge.t.js +2 -0
- package/dist/states/edge.t.js.map +1 -0
- package/dist/states/fnrfzst.d.ts +10 -0
- package/dist/states/fnrfzst.js +378 -0
- package/dist/states/fnrfzst.js.map +1 -0
- package/dist/states/fnrfzst.t.d.ts +100 -0
- package/dist/states/fnrfzst.t.js +2 -0
- package/dist/states/fnrfzst.t.js.map +1 -0
- package/dist/states/index.d.ts +7 -0
- package/dist/states/index.js +6 -0
- package/dist/states/index.js.map +1 -0
- package/dist/states/lib.d.ts +3 -0
- package/dist/states/lib.js +14 -0
- package/dist/states/lib.js.map +1 -0
- package/dist/states/lib.t.d.ts +24 -0
- package/dist/states/lib.t.js +2 -0
- package/dist/states/lib.t.js.map +1 -0
- package/dist/states/node.d.ts +4 -0
- package/dist/states/node.js +43 -0
- package/dist/states/node.js.map +1 -0
- package/dist/states/node.t.d.ts +73 -0
- package/dist/states/node.t.js +2 -0
- package/dist/states/node.t.js.map +1 -0
- package/dist/states/nodeio.t.d.ts +67 -0
- package/dist/states/nodeio.t.js +2 -0
- package/dist/states/nodeio.t.js.map +1 -0
- package/dist/states/nodespace.d.ts +3 -0
- package/dist/states/nodespace.js +77 -0
- package/dist/states/nodespace.js.map +1 -0
- package/dist/states/nodespace.t.d.ts +16 -0
- package/dist/states/nodespace.t.js +2 -0
- package/dist/states/nodespace.t.js.map +1 -0
- package/dist/states/reactflow.d.ts +8 -0
- package/dist/states/reactflow.js +33 -0
- package/dist/states/reactflow.js.map +1 -0
- package/dist/states/reactflow.t.d.ts +11 -0
- package/dist/states/reactflow.t.js +2 -0
- package/dist/states/reactflow.t.js.map +1 -0
- package/dist/types/rendering.t.d.ts +10 -0
- package/dist/types/rendering.t.js +2 -0
- package/dist/types/rendering.t.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/objects.d.ts +19 -0
- package/dist/utils/objects.js +118 -0
- package/dist/utils/objects.js.map +1 -0
- package/package.json +52 -21
- package/package copy.json +0 -63
- package/public/favicon.ico +0 -0
- package/public/index.html +0 -43
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +0 -25
- package/public/robots.txt +0 -3
- package/public/worker_manager +0 -1
- package/src/App.css +0 -38
- package/src/App.test.tsx +0 -9
- package/src/App.tsx +0 -22
- package/src/frontend/datarenderer/images.tsx +0 -28
- package/src/frontend/datarenderer/index.tsx +0 -53
- package/src/frontend/datarenderer/plotly.tsx +0 -82
- package/src/frontend/dialog.scss +0 -88
- package/src/frontend/dialog.tsx +0 -70
- package/src/frontend/edge.scss +0 -15
- package/src/frontend/edge.tsx +0 -31
- package/src/frontend/funcnodesreactflow.scss +0 -63
- package/src/frontend/funcnodesreactflow.tsx +0 -283
- package/src/frontend/header/header.scss +0 -48
- package/src/frontend/header/index.tsx +0 -268
- package/src/frontend/layout/htmlelements.scss +0 -63
- package/src/frontend/lib.scss +0 -157
- package/src/frontend/lib.tsx +0 -198
- package/src/frontend/node/io/default_input_renderer.tsx +0 -327
- package/src/frontend/node/io/default_output_render.tsx +0 -26
- package/src/frontend/node/io/handle_renderer.tsx +0 -89
- package/src/frontend/node/io/io.scss +0 -91
- package/src/frontend/node/io/io.tsx +0 -114
- package/src/frontend/node/io/nodeinput.tsx +0 -125
- package/src/frontend/node/io/nodeoutput.tsx +0 -37
- package/src/frontend/node/node.scss +0 -265
- package/src/frontend/node/node.tsx +0 -208
- package/src/frontend/nodecontextmenu.scss +0 -18
- package/src/frontend/utils/colorpicker.scss +0 -37
- package/src/frontend/utils/colorpicker.tsx +0 -342
- package/src/frontend/utils/jsondata.tsx +0 -19
- package/src/frontend/utils/table.scss +0 -22
- package/src/frontend/utils/table.tsx +0 -159
- package/src/funcnodes/funcnodesworker.ts +0 -455
- package/src/funcnodes/websocketworker.ts +0 -153
- package/src/funcnodes/workermanager.ts +0 -229
- package/src/index.css +0 -13
- package/src/index.tsx +0 -19
- package/src/logo.svg +0 -1
- package/src/react-app-env.d.ts +0 -1
- package/src/reportWebVitals.ts +0 -15
- package/src/setupTests.ts +0 -5
- package/src/state/edge.ts +0 -35
- package/src/state/fnrfzst.ts +0 -440
- package/src/state/index.ts +0 -139
- package/src/state/lib.ts +0 -26
- package/src/state/node.ts +0 -118
- package/src/state/nodespace.ts +0 -151
- package/src/state/reactflow.ts +0 -65
- package/src/types/lib.d.ts +0 -16
- package/src/types/node.d.ts +0 -29
- package/src/types/nodeio.d.ts +0 -82
- package/src/types/worker.d.ts +0 -56
- package/tsconfig.json +0 -20
- /package/{src/funcnodes/index.ts → dist/funcnodes/index.d.ts} +0 -0
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
RefObject,
|
|
3
|
-
useContext,
|
|
4
|
-
useEffect,
|
|
5
|
-
useMemo,
|
|
6
|
-
useRef,
|
|
7
|
-
useState,
|
|
8
|
-
} from "react";
|
|
9
|
-
|
|
10
|
-
import { NodeStore } from "../../state/node";
|
|
11
|
-
import ExpandLessIcon from "@mui/icons-material/ExpandLess";
|
|
12
|
-
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
|
|
13
|
-
import ExpandIcon from "@mui/icons-material/Expand";
|
|
14
|
-
import LanIcon from "@mui/icons-material/Lan";
|
|
15
|
-
import PlayCircleFilledIcon from "@mui/icons-material/PlayCircleFilled";
|
|
16
|
-
import "./node.scss";
|
|
17
|
-
import { FuncNodesReactFlowZustandInterface } from "../../state/fnrfzst";
|
|
18
|
-
import { FuncNodesContext } from "..";
|
|
19
|
-
import get_rendertype from "../datarenderer";
|
|
20
|
-
import CustomColorPicker, { HSLColorPicker } from "../utils/colorpicker";
|
|
21
|
-
import { NodeInput, NodeOutput } from "./io";
|
|
22
|
-
import { PreviewHandleDataRendererForIo } from "./io/handle_renderer";
|
|
23
|
-
import CustomDialog from "../dialog";
|
|
24
|
-
interface NodeHeaderProps {
|
|
25
|
-
node_data: NodeType;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const NodeHeader = ({ node_data }: NodeHeaderProps) => {
|
|
29
|
-
const fnrf_zst: FuncNodesReactFlowZustandInterface =
|
|
30
|
-
useContext(FuncNodesContext);
|
|
31
|
-
|
|
32
|
-
const clicktrigger = () => {
|
|
33
|
-
fnrf_zst.on_node_action({
|
|
34
|
-
type: "trigger",
|
|
35
|
-
from_remote: false,
|
|
36
|
-
id: node_data.id,
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
return (
|
|
41
|
-
<div className="nodeheader">
|
|
42
|
-
<div className="nodeheader_element">
|
|
43
|
-
<PlayCircleFilledIcon
|
|
44
|
-
fontSize="inherit"
|
|
45
|
-
className="triggerbutton"
|
|
46
|
-
onClick={clicktrigger}
|
|
47
|
-
/>
|
|
48
|
-
<LanIcon fontSize="inherit" />
|
|
49
|
-
</div>
|
|
50
|
-
<div className="nodeheader_element nodeheader_title">
|
|
51
|
-
<div className="nodeheader_title_text">{node_data.node_name}</div>
|
|
52
|
-
</div>
|
|
53
|
-
<div className="nodeheader_element">
|
|
54
|
-
<ExpandLessIcon fontSize="inherit" />
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
);
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
interface NodeBodyProps {
|
|
61
|
-
node_data: NodeType;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const NodeDataRenderer = ({ node_data }: { node_data: NodeType }) => {
|
|
65
|
-
const src = node_data.render_options?.data?.src;
|
|
66
|
-
|
|
67
|
-
const io: IOType | undefined = node_data.render_options?.data?.src
|
|
68
|
-
? node_data.io[node_data.render_options?.data?.src]
|
|
69
|
-
: undefined;
|
|
70
|
-
|
|
71
|
-
const pvhandle = io && PreviewHandleDataRendererForIo(io);
|
|
72
|
-
|
|
73
|
-
return (
|
|
74
|
-
<div className="nodrag">
|
|
75
|
-
{pvhandle && (
|
|
76
|
-
<CustomDialog
|
|
77
|
-
trigger={<div>{pvhandle({ io })}</div>}
|
|
78
|
-
onOpenChange={(open: boolean) => {
|
|
79
|
-
if (open) {
|
|
80
|
-
io?.try_get_full_value();
|
|
81
|
-
}
|
|
82
|
-
}}
|
|
83
|
-
>
|
|
84
|
-
{pvhandle({ io })}
|
|
85
|
-
</CustomDialog>
|
|
86
|
-
)}
|
|
87
|
-
</div>
|
|
88
|
-
);
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
const NodeBody = ({ node_data }: NodeBodyProps) => {
|
|
92
|
-
const inputs = Object.values(node_data.io).filter((io) => io.is_input);
|
|
93
|
-
const outputs = Object.values(node_data.io).filter((io) => !io.is_input);
|
|
94
|
-
|
|
95
|
-
if (node_data.render_options?.data?.src) {
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return (
|
|
99
|
-
<div className="nodebody">
|
|
100
|
-
{outputs.map((io) => (
|
|
101
|
-
<NodeOutput key={io.id} io={io} />
|
|
102
|
-
))}
|
|
103
|
-
<NodeDataRenderer node_data={node_data} />
|
|
104
|
-
{inputs.map((io) => (
|
|
105
|
-
<NodeInput key={io.id} io={io} />
|
|
106
|
-
))}
|
|
107
|
-
</div>
|
|
108
|
-
);
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
const NodeName = ({ node_data }: { node_data: NodeType }) => {
|
|
112
|
-
const [name, setName] = useState(node_data.name);
|
|
113
|
-
|
|
114
|
-
useEffect(() => {
|
|
115
|
-
setName(node_data.name);
|
|
116
|
-
}, [node_data]);
|
|
117
|
-
|
|
118
|
-
const fnrf_zst: FuncNodesReactFlowZustandInterface =
|
|
119
|
-
useContext(FuncNodesContext);
|
|
120
|
-
|
|
121
|
-
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
122
|
-
setName(event.target.value);
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
const finalSetName = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
126
|
-
const new_name = e.target.value;
|
|
127
|
-
fnrf_zst.on_node_action({
|
|
128
|
-
type: "update",
|
|
129
|
-
from_remote: false,
|
|
130
|
-
id: node_data.id,
|
|
131
|
-
node: { name: new_name },
|
|
132
|
-
});
|
|
133
|
-
};
|
|
134
|
-
return (
|
|
135
|
-
<input
|
|
136
|
-
className="nodename_input"
|
|
137
|
-
value={name}
|
|
138
|
-
onChange={handleChange}
|
|
139
|
-
onBlur={finalSetName}
|
|
140
|
-
/>
|
|
141
|
-
);
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
const NodeFooter = ({ node_data }: { node_data: NodeType }) => {
|
|
145
|
-
return (
|
|
146
|
-
<div className="nodefooter">
|
|
147
|
-
{node_data.error && <div className="nodeerror">{node_data.error}</div>}
|
|
148
|
-
</div>
|
|
149
|
-
);
|
|
150
|
-
};
|
|
151
|
-
/**
|
|
152
|
-
* A generic function to deeply merge two objects of type T.
|
|
153
|
-
*
|
|
154
|
-
* @param {T} target - The target object to be merged.
|
|
155
|
-
* @param {DeepPartial<T>} source - The source object to merge into the target. All properties of this object are optional.
|
|
156
|
-
*
|
|
157
|
-
* @returns {Object} An object containing the merged object (new_obj) and a boolean indicating if there was a change (change).
|
|
158
|
-
*
|
|
159
|
-
* @throws {Type 'string' cannot be used to index type 'T'} This error is ignored using the @ts-ignore directive because we are dynamically accessing properties of a generic type T.
|
|
160
|
-
*/
|
|
161
|
-
const DefaultNode = ({ data }: { data: { UseNodeStore: NodeStore } }) => {
|
|
162
|
-
// Use the NodeStore to get the data for the node.
|
|
163
|
-
const storedata = data.UseNodeStore();
|
|
164
|
-
|
|
165
|
-
const collapsed = storedata.frontend.collapsed || true;
|
|
166
|
-
|
|
167
|
-
const [visualTrigger, setVisualTrigger] = useState(false);
|
|
168
|
-
|
|
169
|
-
useEffect(() => {
|
|
170
|
-
let timeoutId: NodeJS.Timeout;
|
|
171
|
-
// When in_trigger becomes true, set visualTrigger to true immediately
|
|
172
|
-
if (storedata.in_trigger) {
|
|
173
|
-
setVisualTrigger(true);
|
|
174
|
-
} else if (visualTrigger) {
|
|
175
|
-
// When in_trigger becomes false, wait for a minimum duration before setting visualTrigger to false
|
|
176
|
-
timeoutId = setTimeout(() => setVisualTrigger(false), 200); // 50ms or any other duration you see fit
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
return () => clearTimeout(timeoutId); // Cleanup timeout on component unmount or state changes
|
|
180
|
-
}, [storedata.in_trigger, visualTrigger]);
|
|
181
|
-
|
|
182
|
-
return (
|
|
183
|
-
<>
|
|
184
|
-
{/* <NodeResizeControl
|
|
185
|
-
minWidth={100}
|
|
186
|
-
minHeight={100}
|
|
187
|
-
className="noderesizecontrol"
|
|
188
|
-
>
|
|
189
|
-
<ExpandIcon fontSize="inherit" className="noderesizeicon" />
|
|
190
|
-
</NodeResizeControl> */}
|
|
191
|
-
<div
|
|
192
|
-
className={
|
|
193
|
-
"innernode" +
|
|
194
|
-
(visualTrigger ? " intrigger" : "") +
|
|
195
|
-
(storedata.error ? " error" : "")
|
|
196
|
-
}
|
|
197
|
-
>
|
|
198
|
-
<NodeHeader node_data={storedata} />
|
|
199
|
-
<NodeName node_data={storedata} />
|
|
200
|
-
<NodeBody node_data={storedata} />
|
|
201
|
-
<NodeFooter node_data={storedata} />
|
|
202
|
-
</div>
|
|
203
|
-
</>
|
|
204
|
-
);
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
export default DefaultNode;
|
|
208
|
-
export {};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
.context-menu {
|
|
2
|
-
background: white;
|
|
3
|
-
border-style: solid;
|
|
4
|
-
box-shadow: 10px 19px 20px rgba(0, 0, 0, 10%);
|
|
5
|
-
position: absolute;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
.context-menu button {
|
|
9
|
-
border: none;
|
|
10
|
-
display: block;
|
|
11
|
-
padding: 0.5em;
|
|
12
|
-
text-align: left;
|
|
13
|
-
width: 100%;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.context-menu button:hover {
|
|
17
|
-
background: white;
|
|
18
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
.colorspace {
|
|
2
|
-
margin: 0.2rem;
|
|
3
|
-
&_title {
|
|
4
|
-
font-size: 0.7em;
|
|
5
|
-
font-weight: bold;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
display: grid;
|
|
9
|
-
grid-template-columns: auto minmax(0, 1fr);
|
|
10
|
-
|
|
11
|
-
& label {
|
|
12
|
-
font-size: 0.7rem;
|
|
13
|
-
}
|
|
14
|
-
& input {
|
|
15
|
-
font-size: 0.7rem;
|
|
16
|
-
max-height: 0.7rem;
|
|
17
|
-
}
|
|
18
|
-
& input[type="range"] {
|
|
19
|
-
width: 100%;
|
|
20
|
-
margin: 0;
|
|
21
|
-
padding: 0;
|
|
22
|
-
-webkit-appearance: none;
|
|
23
|
-
background-color: #666;
|
|
24
|
-
height: 0.7rem;
|
|
25
|
-
border-radius: 5px;
|
|
26
|
-
|
|
27
|
-
&::-webkit-slider-thumb,
|
|
28
|
-
&::-webkit-range-thumb,
|
|
29
|
-
&::-moz-range-thumb {
|
|
30
|
-
width: 0.7rem;
|
|
31
|
-
height: 0.7rem;
|
|
32
|
-
background-color: #cc1c1c;
|
|
33
|
-
border-radius: 50%;
|
|
34
|
-
cursor: pointer;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,342 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
-
import * as Popover from "@radix-ui/react-popover";
|
|
3
|
-
import convert from "color-convert";
|
|
4
|
-
import "./colorpicker.scss";
|
|
5
|
-
|
|
6
|
-
const parse_colorstring = (colorstring: string): [string, any[]] => {
|
|
7
|
-
// This is a simplified parser and may need adjustments to handle all CSS color formats robustly
|
|
8
|
-
if (colorstring.startsWith("#")) {
|
|
9
|
-
return ["hex", [colorstring]];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
let matches = colorstring.match(/^(\w+)\(([^)]+)\)$/);
|
|
13
|
-
if (!matches) return ["keyword", [colorstring]];
|
|
14
|
-
|
|
15
|
-
const colortype = matches[1];
|
|
16
|
-
const colordata = matches[2].split(",").map((n) => parseInt(n.trim()));
|
|
17
|
-
|
|
18
|
-
return [colortype, colordata];
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const create_color_converter = (
|
|
22
|
-
type: string,
|
|
23
|
-
data: any[]
|
|
24
|
-
): { [key: string]: () => number[] | string } => {
|
|
25
|
-
if (!Array.isArray(data)) data = [data];
|
|
26
|
-
if (data[0] === undefined || data[0] === null)
|
|
27
|
-
return create_color_converter("rgb", [0, 0, 0]);
|
|
28
|
-
// @ts-ignore
|
|
29
|
-
const source = convert[type];
|
|
30
|
-
if (!source) throw new Error("Unsupported color type: " + type);
|
|
31
|
-
|
|
32
|
-
source[type] = () => data;
|
|
33
|
-
|
|
34
|
-
const checkrgb = source.rgb(data);
|
|
35
|
-
if (!Array.isArray(checkrgb)) return create_color_converter("rgb", [0, 0, 0]);
|
|
36
|
-
if (checkrgb[0] === undefined || checkrgb[0] === null)
|
|
37
|
-
return create_color_converter("rgb", [0, 0, 0]);
|
|
38
|
-
|
|
39
|
-
const checkhsl = source.hsl(data);
|
|
40
|
-
if (!Array.isArray(checkhsl)) return create_color_converter("rgb", [0, 0, 0]);
|
|
41
|
-
if (checkhsl[0] === undefined || checkhsl[0] === null)
|
|
42
|
-
return create_color_converter("rgb", [0, 0, 0]);
|
|
43
|
-
|
|
44
|
-
const converter: { [key: string]: () => number[] | string } = {};
|
|
45
|
-
|
|
46
|
-
Object.keys(source).forEach((key) => {
|
|
47
|
-
const entry = source[key];
|
|
48
|
-
//check if entry is a function
|
|
49
|
-
if (typeof entry === "function") {
|
|
50
|
-
converter[key] = () => entry.apply(null, data);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
return converter;
|
|
55
|
-
};
|
|
56
|
-
const create_color_converter_from_string = (
|
|
57
|
-
colorstring: string
|
|
58
|
-
): { [key: string]: () => number[] | string } => {
|
|
59
|
-
const [colortype, colordata] = parse_colorstring(colorstring);
|
|
60
|
-
// @ts-ignore
|
|
61
|
-
if (!colortype || !convert[colortype]) {
|
|
62
|
-
console.error("Unsupported color type or invalid color string");
|
|
63
|
-
return {};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return create_color_converter(colortype, colordata);
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
const HSLColorPicker = ({
|
|
70
|
-
onChange,
|
|
71
|
-
colorconverter,
|
|
72
|
-
}: {
|
|
73
|
-
onChange: (colorconverter: {
|
|
74
|
-
[key: string]: () => number[] | string;
|
|
75
|
-
}) => void;
|
|
76
|
-
colorconverter: { [key: string]: () => number[] | string };
|
|
77
|
-
}) => {
|
|
78
|
-
const [converter, setConverter] = useState(colorconverter);
|
|
79
|
-
const hsl = converter.hsl() as number[];
|
|
80
|
-
const rgb = converter.rgb() as number[];
|
|
81
|
-
const hsv = converter.hsv() as number[];
|
|
82
|
-
const hex = converter.hex() as string;
|
|
83
|
-
|
|
84
|
-
const colorStyle = {
|
|
85
|
-
backgroundColor: `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`,
|
|
86
|
-
padding: "10px",
|
|
87
|
-
margin: "10px 0",
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
let g = "linear-gradient(to right";
|
|
91
|
-
for (let i = 0; i <= 360; i += 10) {
|
|
92
|
-
g += `, hsl(${i}, 100%, 50%)`;
|
|
93
|
-
}
|
|
94
|
-
g += ")";
|
|
95
|
-
const hueStyle = {
|
|
96
|
-
backgroundImage: "unset",
|
|
97
|
-
WebkitAppearance: "none" as any,
|
|
98
|
-
background: g,
|
|
99
|
-
height: 10,
|
|
100
|
-
borderRadius: 5,
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
return (
|
|
104
|
-
<div style={{ backgroundColor: "white" }}>
|
|
105
|
-
<div style={colorStyle}>Color Preview</div>
|
|
106
|
-
<div className="colorspace">
|
|
107
|
-
<div className="colorspace_title">RGB</div>
|
|
108
|
-
<div></div>
|
|
109
|
-
|
|
110
|
-
<label>Red</label>
|
|
111
|
-
<input
|
|
112
|
-
type="range"
|
|
113
|
-
min="0"
|
|
114
|
-
max="255"
|
|
115
|
-
value={rgb[0]}
|
|
116
|
-
onChange={(e) => {
|
|
117
|
-
const newrgb = [parseInt(e.target.value), rgb[1], rgb[2]];
|
|
118
|
-
const newconverter = create_color_converter("rgb", newrgb);
|
|
119
|
-
setConverter(newconverter);
|
|
120
|
-
onChange(newconverter);
|
|
121
|
-
}}
|
|
122
|
-
style={{ background: `linear-gradient(to right, #000, #f00)` }}
|
|
123
|
-
/>
|
|
124
|
-
|
|
125
|
-
<label>Green</label>
|
|
126
|
-
<input
|
|
127
|
-
type="range"
|
|
128
|
-
min="0"
|
|
129
|
-
max="255"
|
|
130
|
-
value={rgb[1]}
|
|
131
|
-
onChange={(e) => {
|
|
132
|
-
const newrgb = [rgb[0], parseInt(e.target.value), rgb[2]];
|
|
133
|
-
const newconverter = create_color_converter("rgb", newrgb);
|
|
134
|
-
setConverter(newconverter);
|
|
135
|
-
onChange(newconverter);
|
|
136
|
-
}}
|
|
137
|
-
style={{ background: `linear-gradient(to right, #000, #0f0)` }}
|
|
138
|
-
/>
|
|
139
|
-
|
|
140
|
-
<label>Blue</label>
|
|
141
|
-
<input
|
|
142
|
-
type="range"
|
|
143
|
-
min="0"
|
|
144
|
-
max="255"
|
|
145
|
-
value={rgb[2]}
|
|
146
|
-
onChange={(e) => {
|
|
147
|
-
const newrgb = [rgb[0], rgb[1], parseInt(e.target.value)];
|
|
148
|
-
const newconverter = create_color_converter("rgb", newrgb);
|
|
149
|
-
setConverter(newconverter);
|
|
150
|
-
onChange(newconverter);
|
|
151
|
-
}}
|
|
152
|
-
style={{ background: `linear-gradient(to right, #000, #00f)` }}
|
|
153
|
-
/>
|
|
154
|
-
</div>
|
|
155
|
-
<div className="colorspace">
|
|
156
|
-
<div className="colorspace_title">HSL</div>
|
|
157
|
-
<div></div>
|
|
158
|
-
|
|
159
|
-
<label>Hue</label>
|
|
160
|
-
<input
|
|
161
|
-
type="range"
|
|
162
|
-
min="0"
|
|
163
|
-
max="360"
|
|
164
|
-
value={hsl[0]}
|
|
165
|
-
onChange={(e) => {
|
|
166
|
-
const newhsl = [parseInt(e.target.value), hsl[1], hsl[2]];
|
|
167
|
-
const newconverter = create_color_converter("hsl", newhsl);
|
|
168
|
-
setConverter(newconverter);
|
|
169
|
-
onChange(newconverter);
|
|
170
|
-
}}
|
|
171
|
-
style={{
|
|
172
|
-
background: `linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00)`,
|
|
173
|
-
}}
|
|
174
|
-
/>
|
|
175
|
-
|
|
176
|
-
<label>Saturation</label>
|
|
177
|
-
<input
|
|
178
|
-
type="range"
|
|
179
|
-
min="0"
|
|
180
|
-
max="100"
|
|
181
|
-
value={hsl[1]}
|
|
182
|
-
onChange={(e) => {
|
|
183
|
-
const newhsl = [hsl[0], parseInt(e.target.value), hsl[2]];
|
|
184
|
-
const newconverter = create_color_converter("hsl", newhsl);
|
|
185
|
-
setConverter(newconverter);
|
|
186
|
-
onChange(newconverter);
|
|
187
|
-
}}
|
|
188
|
-
style={{
|
|
189
|
-
background: `linear-gradient(to right, #fff, hsl(${hsl[0]}, 100%, 50%))`,
|
|
190
|
-
}}
|
|
191
|
-
/>
|
|
192
|
-
|
|
193
|
-
<label>Lightness</label>
|
|
194
|
-
|
|
195
|
-
<input
|
|
196
|
-
type="range"
|
|
197
|
-
min="0"
|
|
198
|
-
max="100"
|
|
199
|
-
value={hsl[2]}
|
|
200
|
-
onChange={(e) => {
|
|
201
|
-
const newhsl = [hsl[0], hsl[1], parseInt(e.target.value)];
|
|
202
|
-
const newconverter = create_color_converter("hsl", newhsl);
|
|
203
|
-
setConverter(newconverter);
|
|
204
|
-
onChange(newconverter);
|
|
205
|
-
}}
|
|
206
|
-
style={{
|
|
207
|
-
background: `linear-gradient(to right, #000, hsl(${hsl[0]}, 100%, 50%), #fff)`,
|
|
208
|
-
}}
|
|
209
|
-
/>
|
|
210
|
-
</div>
|
|
211
|
-
|
|
212
|
-
<div className="colorspace">
|
|
213
|
-
<div className="colorspace_title">HSV</div>
|
|
214
|
-
<div></div>
|
|
215
|
-
|
|
216
|
-
<label>Hue</label>
|
|
217
|
-
<input
|
|
218
|
-
type="range"
|
|
219
|
-
min="0"
|
|
220
|
-
max="360"
|
|
221
|
-
value={hsv[0]}
|
|
222
|
-
onChange={(e) => {
|
|
223
|
-
const newhsv = [parseInt(e.target.value), hsv[1], hsv[2]];
|
|
224
|
-
const newconverter = create_color_converter("hsv", newhsv);
|
|
225
|
-
setConverter(newconverter);
|
|
226
|
-
onChange(newconverter);
|
|
227
|
-
}}
|
|
228
|
-
style={{
|
|
229
|
-
background: `linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00)`,
|
|
230
|
-
}}
|
|
231
|
-
/>
|
|
232
|
-
|
|
233
|
-
<label>Saturation</label>
|
|
234
|
-
<input
|
|
235
|
-
type="range"
|
|
236
|
-
min="0"
|
|
237
|
-
max="100"
|
|
238
|
-
value={hsv[1]}
|
|
239
|
-
onChange={(e) => {
|
|
240
|
-
const newhsv = [hsv[0], parseInt(e.target.value), hsv[2]];
|
|
241
|
-
const newconverter = create_color_converter("hsv", newhsv);
|
|
242
|
-
setConverter(newconverter);
|
|
243
|
-
onChange(newconverter);
|
|
244
|
-
}}
|
|
245
|
-
style={{
|
|
246
|
-
background: `linear-gradient(to right, #fff, hsl(${hsl[0]}, 100%, 50%))`,
|
|
247
|
-
}}
|
|
248
|
-
/>
|
|
249
|
-
|
|
250
|
-
<label>Value</label>
|
|
251
|
-
<input
|
|
252
|
-
type="range"
|
|
253
|
-
min="0"
|
|
254
|
-
max="100"
|
|
255
|
-
value={hsv[2]}
|
|
256
|
-
onChange={(e) => {
|
|
257
|
-
const newhsv = [hsv[0], hsv[1], parseInt(e.target.value)];
|
|
258
|
-
const newconverter = create_color_converter("hsv", newhsv);
|
|
259
|
-
setConverter(newconverter);
|
|
260
|
-
onChange(newconverter);
|
|
261
|
-
}}
|
|
262
|
-
style={{
|
|
263
|
-
background: `linear-gradient(to right, #000, hsl(${hsl[0]}, 100%, 50%))`,
|
|
264
|
-
}}
|
|
265
|
-
/>
|
|
266
|
-
</div>
|
|
267
|
-
|
|
268
|
-
<div className="colorspace">
|
|
269
|
-
<div className="colorspace_title">HEX</div>
|
|
270
|
-
<div></div>
|
|
271
|
-
|
|
272
|
-
<input
|
|
273
|
-
type="text"
|
|
274
|
-
value={hex}
|
|
275
|
-
onChange={(e) => {
|
|
276
|
-
const newconverter = create_color_converter("hex", [
|
|
277
|
-
e.target.value,
|
|
278
|
-
]);
|
|
279
|
-
setConverter(newconverter);
|
|
280
|
-
onChange(newconverter);
|
|
281
|
-
}}
|
|
282
|
-
/>
|
|
283
|
-
</div>
|
|
284
|
-
</div>
|
|
285
|
-
);
|
|
286
|
-
};
|
|
287
|
-
|
|
288
|
-
const CustomColorPicker = ({
|
|
289
|
-
inicolordata,
|
|
290
|
-
inicolorspace = "hex",
|
|
291
|
-
onChange,
|
|
292
|
-
}: {
|
|
293
|
-
inicolordata?: number[] | string | string[];
|
|
294
|
-
inicolorspace?: string;
|
|
295
|
-
onChange?: (colorconverter: {
|
|
296
|
-
[key: string]: () => number[] | string;
|
|
297
|
-
}) => void;
|
|
298
|
-
}) => {
|
|
299
|
-
if (inicolordata === undefined) {
|
|
300
|
-
inicolordata = [0, 0, 0];
|
|
301
|
-
inicolorspace = "rgb";
|
|
302
|
-
}
|
|
303
|
-
if (!Array.isArray(inicolordata)) inicolordata = [inicolordata];
|
|
304
|
-
|
|
305
|
-
let iniconverter = create_color_converter(inicolorspace, inicolordata);
|
|
306
|
-
|
|
307
|
-
if (iniconverter.rgb() === undefined)
|
|
308
|
-
iniconverter = create_color_converter("rgb", [0, 0, 0]);
|
|
309
|
-
const [color, setColor] = useState(iniconverter);
|
|
310
|
-
|
|
311
|
-
const innerSetColor = (colorconverter: {
|
|
312
|
-
[key: string]: () => number[] | string;
|
|
313
|
-
}) => {
|
|
314
|
-
setColor(colorconverter);
|
|
315
|
-
if (onChange) onChange(colorconverter);
|
|
316
|
-
};
|
|
317
|
-
|
|
318
|
-
const style = {
|
|
319
|
-
background: "#" + color.hex(),
|
|
320
|
-
borderRadius: "0.3rem",
|
|
321
|
-
width: "2rem",
|
|
322
|
-
height: "1rem",
|
|
323
|
-
};
|
|
324
|
-
return (
|
|
325
|
-
<Popover.Root>
|
|
326
|
-
<Popover.Trigger asChild>
|
|
327
|
-
<button style={style}></button>
|
|
328
|
-
</Popover.Trigger>
|
|
329
|
-
<Popover.Portal>
|
|
330
|
-
<Popover.Content side="left">
|
|
331
|
-
<HSLColorPicker
|
|
332
|
-
onChange={innerSetColor}
|
|
333
|
-
colorconverter={color}
|
|
334
|
-
></HSLColorPicker>
|
|
335
|
-
</Popover.Content>
|
|
336
|
-
</Popover.Portal>
|
|
337
|
-
</Popover.Root>
|
|
338
|
-
);
|
|
339
|
-
};
|
|
340
|
-
|
|
341
|
-
export default CustomColorPicker;
|
|
342
|
-
export { HSLColorPicker };
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
JsonView,
|
|
3
|
-
allExpanded,
|
|
4
|
-
darkStyles,
|
|
5
|
-
defaultStyles,
|
|
6
|
-
collapseAllNested,
|
|
7
|
-
} from "react-json-view-lite";
|
|
8
|
-
import "react-json-view-lite/dist/index.css";
|
|
9
|
-
const JSONDataDisplay = ({ data }: { data: any }) => {
|
|
10
|
-
return (
|
|
11
|
-
<JsonView
|
|
12
|
-
data={data}
|
|
13
|
-
style={darkStyles}
|
|
14
|
-
shouldExpandNode={collapseAllNested}
|
|
15
|
-
/>
|
|
16
|
-
);
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export default JSONDataDisplay;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
.tablecontainer {
|
|
2
|
-
overflow: auto;
|
|
3
|
-
background-color: white;
|
|
4
|
-
}
|
|
5
|
-
.tableHead {
|
|
6
|
-
color: var(--funheadercolor) !important;
|
|
7
|
-
background-color: var(--funcnodesbackground1);
|
|
8
|
-
font-weight: bold !important;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
.tableheadercolor {
|
|
12
|
-
color: inherit !important;
|
|
13
|
-
font-family: inherit !important;
|
|
14
|
-
font-weight: inherit !important;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.indexcol {
|
|
18
|
-
background-color: var(--funcnodesbackground2);
|
|
19
|
-
color: var(--funheadercolor) !important;
|
|
20
|
-
font-family: inherit !important;
|
|
21
|
-
font-weight: inherit !important;
|
|
22
|
-
}
|