Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
Commit
β’
65b1bdb
1
Parent(s):
a54bba5
working on roadmap features
Browse files- package-lock.json +182 -9
- package.json +3 -2
- src/app/main.tsx +23 -12
- src/components/editors/WorkflowEditor/index.tsx +3 -0
- src/components/editors/WorkflowEditor/viewer/Node.tsx +39 -0
- src/components/editors/WorkflowEditor/viewer/README.md +1 -0
- src/components/editors/WorkflowEditor/viewer/WorkflowView.tsx +79 -0
- src/components/toolbars/top-menu/ToggleView/index.tsx +46 -0
- src/components/toolbars/top-menu/index.tsx +43 -1
- src/components/toolbars/top-menu/view/index.tsx +0 -11
- src/experiments/README.md +3 -0
- src/experiments/grading/README.md +4 -1
- src/experiments/moodboard/MoodboardView.tsx +79 -0
- src/experiments/moodboard/Node.tsx +39 -0
- src/lib/core/constants.ts +1 -1
package-lock.json
CHANGED
@@ -11,9 +11,9 @@
|
|
11 |
"dependencies": {
|
12 |
"@aitube/broadway": "0.1.2",
|
13 |
"@aitube/clap": "0.1.2",
|
14 |
-
"@aitube/clapper-services": "0.1.2-
|
15 |
"@aitube/engine": "0.1.2",
|
16 |
-
"@aitube/timeline": "0.1.2",
|
17 |
"@fal-ai/serverless-client": "^0.13.0",
|
18 |
"@ffmpeg/ffmpeg": "^0.12.10",
|
19 |
"@ffmpeg/util": "^0.12.1",
|
@@ -57,6 +57,7 @@
|
|
57 |
"@tailwindcss/container-queries": "^0.1.1",
|
58 |
"@types/dom-speech-recognition": "^0.0.4",
|
59 |
"@xenova/transformers": "github:xenova/transformers.js#v3",
|
|
|
60 |
"autoprefixer": "10.4.19",
|
61 |
"base64-arraybuffer": "^1.0.2",
|
62 |
"class-variance-authority": "^0.7.0",
|
@@ -163,12 +164,12 @@
|
|
163 |
}
|
164 |
},
|
165 |
"node_modules/@aitube/clapper-services": {
|
166 |
-
"version": "0.1.2-
|
167 |
-
"resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.1.2-
|
168 |
-
"integrity": "sha512-
|
169 |
"peerDependencies": {
|
170 |
"@aitube/clap": "0.1.2",
|
171 |
-
"@aitube/timeline": "0.1.2",
|
172 |
"@monaco-editor/react": "4.6.0",
|
173 |
"monaco-editor": "0.50.0",
|
174 |
"react": "*",
|
@@ -194,9 +195,9 @@
|
|
194 |
}
|
195 |
},
|
196 |
"node_modules/@aitube/timeline": {
|
197 |
-
"version": "0.1.2",
|
198 |
-
"resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.1.2.tgz",
|
199 |
-
"integrity": "sha512-
|
200 |
"dependencies": {
|
201 |
"date-fns": "^3.6.0",
|
202 |
"react-virtualized-auto-sizer": "^1.0.24"
|
@@ -6521,6 +6522,49 @@
|
|
6521 |
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
|
6522 |
"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
|
6523 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6524 |
"node_modules/@types/dom-speech-recognition": {
|
6525 |
"version": "0.0.4",
|
6526 |
"resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.4.tgz",
|
@@ -7019,6 +7063,34 @@
|
|
7019 |
"node": ">=10.0.0"
|
7020 |
}
|
7021 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7022 |
"node_modules/abbrev": {
|
7023 |
"version": "2.0.0",
|
7024 |
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
|
@@ -8270,6 +8342,11 @@
|
|
8270 |
"node": ">=6"
|
8271 |
}
|
8272 |
},
|
|
|
|
|
|
|
|
|
|
|
8273 |
"node_modules/classnames": {
|
8274 |
"version": "2.5.1",
|
8275 |
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
|
@@ -9003,6 +9080,102 @@
|
|
9003 |
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
9004 |
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
|
9005 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9006 |
"node_modules/damerau-levenshtein": {
|
9007 |
"version": "1.0.8",
|
9008 |
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
|
|
|
11 |
"dependencies": {
|
12 |
"@aitube/broadway": "0.1.2",
|
13 |
"@aitube/clap": "0.1.2",
|
14 |
+
"@aitube/clapper-services": "0.1.2-1",
|
15 |
"@aitube/engine": "0.1.2",
|
16 |
+
"@aitube/timeline": "0.1.2-0",
|
17 |
"@fal-ai/serverless-client": "^0.13.0",
|
18 |
"@ffmpeg/ffmpeg": "^0.12.10",
|
19 |
"@ffmpeg/util": "^0.12.1",
|
|
|
57 |
"@tailwindcss/container-queries": "^0.1.1",
|
58 |
"@types/dom-speech-recognition": "^0.0.4",
|
59 |
"@xenova/transformers": "github:xenova/transformers.js#v3",
|
60 |
+
"@xyflow/react": "^12.0.3",
|
61 |
"autoprefixer": "10.4.19",
|
62 |
"base64-arraybuffer": "^1.0.2",
|
63 |
"class-variance-authority": "^0.7.0",
|
|
|
164 |
}
|
165 |
},
|
166 |
"node_modules/@aitube/clapper-services": {
|
167 |
+
"version": "0.1.2-1",
|
168 |
+
"resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.1.2-1.tgz",
|
169 |
+
"integrity": "sha512-xLReBwJ+yojRBHbKnjaMBszHGcikLlD5jSOlYaRUIWndiWFIzvZXxhehxjMQdV2mFiEwgLYITSADuihFlq/BzA==",
|
170 |
"peerDependencies": {
|
171 |
"@aitube/clap": "0.1.2",
|
172 |
+
"@aitube/timeline": "0.1.2-0",
|
173 |
"@monaco-editor/react": "4.6.0",
|
174 |
"monaco-editor": "0.50.0",
|
175 |
"react": "*",
|
|
|
195 |
}
|
196 |
},
|
197 |
"node_modules/@aitube/timeline": {
|
198 |
+
"version": "0.1.2-0",
|
199 |
+
"resolved": "https://registry.npmjs.org/@aitube/timeline/-/timeline-0.1.2-0.tgz",
|
200 |
+
"integrity": "sha512-6KuiwBMgEt8U9xQZs+v4SQuy3RgcHOMz2HrLy2V4qERtFzNbyQnRHXx4u0iGn9Z/BbvVTBPbSLiJOhAMteHeeg==",
|
201 |
"dependencies": {
|
202 |
"date-fns": "^3.6.0",
|
203 |
"react-virtualized-auto-sizer": "^1.0.24"
|
|
|
6522 |
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
|
6523 |
"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
|
6524 |
},
|
6525 |
+
"node_modules/@types/d3-color": {
|
6526 |
+
"version": "3.1.3",
|
6527 |
+
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
|
6528 |
+
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
|
6529 |
+
},
|
6530 |
+
"node_modules/@types/d3-drag": {
|
6531 |
+
"version": "3.0.7",
|
6532 |
+
"resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
|
6533 |
+
"integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
|
6534 |
+
"dependencies": {
|
6535 |
+
"@types/d3-selection": "*"
|
6536 |
+
}
|
6537 |
+
},
|
6538 |
+
"node_modules/@types/d3-interpolate": {
|
6539 |
+
"version": "3.0.4",
|
6540 |
+
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
|
6541 |
+
"integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
|
6542 |
+
"dependencies": {
|
6543 |
+
"@types/d3-color": "*"
|
6544 |
+
}
|
6545 |
+
},
|
6546 |
+
"node_modules/@types/d3-selection": {
|
6547 |
+
"version": "3.0.10",
|
6548 |
+
"resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz",
|
6549 |
+
"integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg=="
|
6550 |
+
},
|
6551 |
+
"node_modules/@types/d3-transition": {
|
6552 |
+
"version": "3.0.8",
|
6553 |
+
"resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz",
|
6554 |
+
"integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==",
|
6555 |
+
"dependencies": {
|
6556 |
+
"@types/d3-selection": "*"
|
6557 |
+
}
|
6558 |
+
},
|
6559 |
+
"node_modules/@types/d3-zoom": {
|
6560 |
+
"version": "3.0.8",
|
6561 |
+
"resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
|
6562 |
+
"integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
|
6563 |
+
"dependencies": {
|
6564 |
+
"@types/d3-interpolate": "*",
|
6565 |
+
"@types/d3-selection": "*"
|
6566 |
+
}
|
6567 |
+
},
|
6568 |
"node_modules/@types/dom-speech-recognition": {
|
6569 |
"version": "0.0.4",
|
6570 |
"resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.4.tgz",
|
|
|
7063 |
"node": ">=10.0.0"
|
7064 |
}
|
7065 |
},
|
7066 |
+
"node_modules/@xyflow/react": {
|
7067 |
+
"version": "12.0.3",
|
7068 |
+
"resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.0.3.tgz",
|
7069 |
+
"integrity": "sha512-PJB9ARsyDesjS9fY3b62mm36nHx9aRA8tvUc5y0ubrMkSCvQRECkOamVDyx+u65UgUkZCgcO/KFdXPdbTWwaJQ==",
|
7070 |
+
"dependencies": {
|
7071 |
+
"@xyflow/system": "0.0.37",
|
7072 |
+
"classcat": "^5.0.3",
|
7073 |
+
"zustand": "^4.4.0"
|
7074 |
+
},
|
7075 |
+
"peerDependencies": {
|
7076 |
+
"react": ">=17",
|
7077 |
+
"react-dom": ">=17"
|
7078 |
+
}
|
7079 |
+
},
|
7080 |
+
"node_modules/@xyflow/system": {
|
7081 |
+
"version": "0.0.37",
|
7082 |
+
"resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.37.tgz",
|
7083 |
+
"integrity": "sha512-hSIhezhxgftPUpC+xiQVIorcRILZUOWlLjpYPTyGWRu8s4RJvM4GqvrsFmD5OnMKXLgpU7/PqqUibDVO67oWQQ==",
|
7084 |
+
"dependencies": {
|
7085 |
+
"@types/d3-drag": "^3.0.7",
|
7086 |
+
"@types/d3-selection": "^3.0.10",
|
7087 |
+
"@types/d3-transition": "^3.0.8",
|
7088 |
+
"@types/d3-zoom": "^3.0.8",
|
7089 |
+
"d3-drag": "^3.0.0",
|
7090 |
+
"d3-selection": "^3.0.0",
|
7091 |
+
"d3-zoom": "^3.0.0"
|
7092 |
+
}
|
7093 |
+
},
|
7094 |
"node_modules/abbrev": {
|
7095 |
"version": "2.0.0",
|
7096 |
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
|
|
|
8342 |
"node": ">=6"
|
8343 |
}
|
8344 |
},
|
8345 |
+
"node_modules/classcat": {
|
8346 |
+
"version": "5.0.5",
|
8347 |
+
"resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz",
|
8348 |
+
"integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w=="
|
8349 |
+
},
|
8350 |
"node_modules/classnames": {
|
8351 |
"version": "2.5.1",
|
8352 |
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
|
|
|
9080 |
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
9081 |
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
|
9082 |
},
|
9083 |
+
"node_modules/d3-color": {
|
9084 |
+
"version": "3.1.0",
|
9085 |
+
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
|
9086 |
+
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
|
9087 |
+
"engines": {
|
9088 |
+
"node": ">=12"
|
9089 |
+
}
|
9090 |
+
},
|
9091 |
+
"node_modules/d3-dispatch": {
|
9092 |
+
"version": "3.0.1",
|
9093 |
+
"resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
|
9094 |
+
"integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
|
9095 |
+
"engines": {
|
9096 |
+
"node": ">=12"
|
9097 |
+
}
|
9098 |
+
},
|
9099 |
+
"node_modules/d3-drag": {
|
9100 |
+
"version": "3.0.0",
|
9101 |
+
"resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
|
9102 |
+
"integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
|
9103 |
+
"dependencies": {
|
9104 |
+
"d3-dispatch": "1 - 3",
|
9105 |
+
"d3-selection": "3"
|
9106 |
+
},
|
9107 |
+
"engines": {
|
9108 |
+
"node": ">=12"
|
9109 |
+
}
|
9110 |
+
},
|
9111 |
+
"node_modules/d3-ease": {
|
9112 |
+
"version": "3.0.1",
|
9113 |
+
"resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
|
9114 |
+
"integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
|
9115 |
+
"engines": {
|
9116 |
+
"node": ">=12"
|
9117 |
+
}
|
9118 |
+
},
|
9119 |
+
"node_modules/d3-interpolate": {
|
9120 |
+
"version": "3.0.1",
|
9121 |
+
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
|
9122 |
+
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
|
9123 |
+
"dependencies": {
|
9124 |
+
"d3-color": "1 - 3"
|
9125 |
+
},
|
9126 |
+
"engines": {
|
9127 |
+
"node": ">=12"
|
9128 |
+
}
|
9129 |
+
},
|
9130 |
+
"node_modules/d3-selection": {
|
9131 |
+
"version": "3.0.0",
|
9132 |
+
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
|
9133 |
+
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
|
9134 |
+
"engines": {
|
9135 |
+
"node": ">=12"
|
9136 |
+
}
|
9137 |
+
},
|
9138 |
+
"node_modules/d3-timer": {
|
9139 |
+
"version": "3.0.1",
|
9140 |
+
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
|
9141 |
+
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
|
9142 |
+
"engines": {
|
9143 |
+
"node": ">=12"
|
9144 |
+
}
|
9145 |
+
},
|
9146 |
+
"node_modules/d3-transition": {
|
9147 |
+
"version": "3.0.1",
|
9148 |
+
"resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
|
9149 |
+
"integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
|
9150 |
+
"dependencies": {
|
9151 |
+
"d3-color": "1 - 3",
|
9152 |
+
"d3-dispatch": "1 - 3",
|
9153 |
+
"d3-ease": "1 - 3",
|
9154 |
+
"d3-interpolate": "1 - 3",
|
9155 |
+
"d3-timer": "1 - 3"
|
9156 |
+
},
|
9157 |
+
"engines": {
|
9158 |
+
"node": ">=12"
|
9159 |
+
},
|
9160 |
+
"peerDependencies": {
|
9161 |
+
"d3-selection": "2 - 3"
|
9162 |
+
}
|
9163 |
+
},
|
9164 |
+
"node_modules/d3-zoom": {
|
9165 |
+
"version": "3.0.0",
|
9166 |
+
"resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
|
9167 |
+
"integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
|
9168 |
+
"dependencies": {
|
9169 |
+
"d3-dispatch": "1 - 3",
|
9170 |
+
"d3-drag": "2 - 3",
|
9171 |
+
"d3-interpolate": "1 - 3",
|
9172 |
+
"d3-selection": "2 - 3",
|
9173 |
+
"d3-transition": "2 - 3"
|
9174 |
+
},
|
9175 |
+
"engines": {
|
9176 |
+
"node": ">=12"
|
9177 |
+
}
|
9178 |
+
},
|
9179 |
"node_modules/damerau-levenshtein": {
|
9180 |
"version": "1.0.8",
|
9181 |
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
|
package.json
CHANGED
@@ -38,9 +38,9 @@
|
|
38 |
"dependencies": {
|
39 |
"@aitube/broadway": "0.1.2",
|
40 |
"@aitube/clap": "0.1.2",
|
41 |
-
"@aitube/clapper-services": "0.1.2-
|
42 |
"@aitube/engine": "0.1.2",
|
43 |
-
"@aitube/timeline": "0.1.2",
|
44 |
"@fal-ai/serverless-client": "^0.13.0",
|
45 |
"@ffmpeg/ffmpeg": "^0.12.10",
|
46 |
"@ffmpeg/util": "^0.12.1",
|
@@ -84,6 +84,7 @@
|
|
84 |
"@tailwindcss/container-queries": "^0.1.1",
|
85 |
"@types/dom-speech-recognition": "^0.0.4",
|
86 |
"@xenova/transformers": "github:xenova/transformers.js#v3",
|
|
|
87 |
"autoprefixer": "10.4.19",
|
88 |
"base64-arraybuffer": "^1.0.2",
|
89 |
"class-variance-authority": "^0.7.0",
|
|
|
38 |
"dependencies": {
|
39 |
"@aitube/broadway": "0.1.2",
|
40 |
"@aitube/clap": "0.1.2",
|
41 |
+
"@aitube/clapper-services": "0.1.2-1",
|
42 |
"@aitube/engine": "0.1.2",
|
43 |
+
"@aitube/timeline": "0.1.2-0",
|
44 |
"@fal-ai/serverless-client": "^0.13.0",
|
45 |
"@ffmpeg/ffmpeg": "^0.12.10",
|
46 |
"@ffmpeg/util": "^0.12.1",
|
|
|
84 |
"@tailwindcss/container-queries": "^0.1.1",
|
85 |
"@types/dom-speech-recognition": "^0.0.4",
|
86 |
"@xenova/transformers": "github:xenova/transformers.js#v3",
|
87 |
+
"@xyflow/react": "^12.0.3",
|
88 |
"autoprefixer": "10.4.19",
|
89 |
"base64-arraybuffer": "^1.0.2",
|
90 |
"class-variance-authority": "^0.7.0",
|
src/app/main.tsx
CHANGED
@@ -26,6 +26,8 @@ type DroppableThing = { files: File[] }
|
|
26 |
function MainContent() {
|
27 |
const ref = useRef<HTMLDivElement>(null)
|
28 |
const showWelcomeScreen = useUI((s) => s.showWelcomeScreen)
|
|
|
|
|
29 |
const showTimeline = useUI((s) => s.showTimeline)
|
30 |
const showAssistant = useUI((s) => s.showAssistant)
|
31 |
const theme = useTheme()
|
@@ -58,7 +60,7 @@ function MainContent() {
|
|
58 |
<div
|
59 |
ref={ref}
|
60 |
className={cn(
|
61 |
-
`dark fixed flex h-screen w-screen select-none flex-col
|
62 |
)}
|
63 |
style={{
|
64 |
backgroundImage:
|
@@ -68,35 +70,43 @@ function MainContent() {
|
|
68 |
<TopBar />
|
69 |
<div
|
70 |
className={cn(
|
71 |
-
`flex h-[calc(100vh-
|
72 |
)}
|
73 |
>
|
74 |
<ReflexContainer orientation="vertical">
|
75 |
<ReflexElement>
|
76 |
<ReflexContainer orientation="horizontal">
|
77 |
-
<ReflexElement
|
|
|
|
|
|
|
|
|
78 |
<ReflexContainer orientation="vertical">
|
79 |
<ReflexElement
|
80 |
-
size={
|
81 |
-
minSize={
|
82 |
-
maxSize={
|
83 |
>
|
84 |
<Editors />
|
85 |
</ReflexElement>
|
86 |
-
<ReflexSplitter />
|
87 |
-
|
88 |
-
<
|
89 |
-
|
|
|
|
|
|
|
|
|
|
|
90 |
</ReflexContainer>
|
91 |
</ReflexElement>
|
92 |
<ReflexSplitter />
|
93 |
<ReflexElement
|
94 |
size={showTimeline ? 400 : 1}
|
95 |
-
minSize={showTimeline ?
|
96 |
maxSize={showTimeline ? 1600 : 1}
|
97 |
>
|
98 |
<Timeline />
|
99 |
-
<BottomToolbar />
|
100 |
</ReflexElement>
|
101 |
</ReflexContainer>
|
102 |
</ReflexElement>
|
@@ -167,6 +177,7 @@ function MainContent() {
|
|
167 |
<SettingsDialog />
|
168 |
<LoadingDialog />
|
169 |
<Toaster />
|
|
|
170 |
</div>
|
171 |
)
|
172 |
}
|
|
|
26 |
function MainContent() {
|
27 |
const ref = useRef<HTMLDivElement>(null)
|
28 |
const showWelcomeScreen = useUI((s) => s.showWelcomeScreen)
|
29 |
+
const showExplorer = useUI((s) => s.showExplorer)
|
30 |
+
const showVideoPlayer = useUI((s) => s.showVideoPlayer)
|
31 |
const showTimeline = useUI((s) => s.showTimeline)
|
32 |
const showAssistant = useUI((s) => s.showAssistant)
|
33 |
const theme = useTheme()
|
|
|
60 |
<div
|
61 |
ref={ref}
|
62 |
className={cn(
|
63 |
+
`dark fixed flex h-screen w-screen select-none flex-col overflow-hidden font-light text-stone-900/90 dark:text-stone-100/90`
|
64 |
)}
|
65 |
style={{
|
66 |
backgroundImage:
|
|
|
70 |
<TopBar />
|
71 |
<div
|
72 |
className={cn(
|
73 |
+
`flex h-[calc(100vh-68px)] w-screen flex-row overflow-hidden`
|
74 |
)}
|
75 |
>
|
76 |
<ReflexContainer orientation="vertical">
|
77 |
<ReflexElement>
|
78 |
<ReflexContainer orientation="horizontal">
|
79 |
+
<ReflexElement
|
80 |
+
// minSize={showTimeline ? 1 : 100}
|
81 |
+
// maxSize={2000}
|
82 |
+
size={showTimeline ? 1200 : 400}
|
83 |
+
>
|
84 |
<ReflexContainer orientation="vertical">
|
85 |
<ReflexElement
|
86 |
+
size={showExplorer ? undefined : 1}
|
87 |
+
minSize={showExplorer ? 100 : 1}
|
88 |
+
maxSize={showExplorer ? 2000 : 1}
|
89 |
>
|
90 |
<Editors />
|
91 |
</ReflexElement>
|
92 |
+
{showVideoPlayer && <ReflexSplitter />}
|
93 |
+
{showVideoPlayer && (
|
94 |
+
<ReflexElement
|
95 |
+
minSize={showVideoPlayer ? 200 : 1}
|
96 |
+
size={showVideoPlayer ? undefined : 1}
|
97 |
+
>
|
98 |
+
<Monitor />
|
99 |
+
</ReflexElement>
|
100 |
+
)}
|
101 |
</ReflexContainer>
|
102 |
</ReflexElement>
|
103 |
<ReflexSplitter />
|
104 |
<ReflexElement
|
105 |
size={showTimeline ? 400 : 1}
|
106 |
+
minSize={showTimeline ? 200 : 1}
|
107 |
maxSize={showTimeline ? 1600 : 1}
|
108 |
>
|
109 |
<Timeline />
|
|
|
110 |
</ReflexElement>
|
111 |
</ReflexContainer>
|
112 |
</ReflexElement>
|
|
|
177 |
<SettingsDialog />
|
178 |
<LoadingDialog />
|
179 |
<Toaster />
|
180 |
+
<BottomToolbar />
|
181 |
</div>
|
182 |
)
|
183 |
}
|
src/components/editors/WorkflowEditor/index.tsx
CHANGED
@@ -3,6 +3,7 @@ import { useEffect } from 'react'
|
|
3 |
import { FormInput } from '@/components/forms/FormInput'
|
4 |
import { FormSection } from '@/components/forms/FormSection'
|
5 |
import { useWorkflowEditor } from '@/services/editors'
|
|
|
6 |
|
7 |
export function WorkflowEditor() {
|
8 |
const current = useWorkflowEditor((s) => s.current)
|
@@ -11,6 +12,8 @@ export function WorkflowEditor() {
|
|
11 |
const undo = useWorkflowEditor((s) => s.undo)
|
12 |
const redo = useWorkflowEditor((s) => s.redo)
|
13 |
|
|
|
|
|
14 |
if (!current) {
|
15 |
return (
|
16 |
<FormSection label={'Workflow Editor'} className="p-4">
|
|
|
3 |
import { FormInput } from '@/components/forms/FormInput'
|
4 |
import { FormSection } from '@/components/forms/FormSection'
|
5 |
import { useWorkflowEditor } from '@/services/editors'
|
6 |
+
import { useUI } from '@/services'
|
7 |
|
8 |
export function WorkflowEditor() {
|
9 |
const current = useWorkflowEditor((s) => s.current)
|
|
|
12 |
const undo = useWorkflowEditor((s) => s.undo)
|
13 |
const redo = useWorkflowEditor((s) => s.redo)
|
14 |
|
15 |
+
const hasBetaAccess = useUI((s) => s.hasBetaAccess)
|
16 |
+
|
17 |
if (!current) {
|
18 |
return (
|
19 |
<FormSection label={'Workflow Editor'} className="p-4">
|
src/components/editors/WorkflowEditor/viewer/Node.tsx
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { memo } from 'react'
|
2 |
+
import { Handle, Position } from '@xyflow/react'
|
3 |
+
|
4 |
+
function NodeComponent({
|
5 |
+
data,
|
6 |
+
}: {
|
7 |
+
data: {
|
8 |
+
name: string
|
9 |
+
job: string
|
10 |
+
emoji: string
|
11 |
+
}
|
12 |
+
}) {
|
13 |
+
return (
|
14 |
+
<div className="rounded-md border-2 border-stone-400 bg-white px-4 py-2 shadow-md">
|
15 |
+
<div className="flex">
|
16 |
+
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-gray-100">
|
17 |
+
{data.emoji}
|
18 |
+
</div>
|
19 |
+
<div className="ml-2">
|
20 |
+
<div className="text-lg font-bold">{data.name}</div>
|
21 |
+
<div className="text-gray-500">{data.job}</div>
|
22 |
+
</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
<Handle
|
26 |
+
type="target"
|
27 |
+
position={Position.Top}
|
28 |
+
className="w-16 !bg-teal-500"
|
29 |
+
/>
|
30 |
+
<Handle
|
31 |
+
type="source"
|
32 |
+
position={Position.Bottom}
|
33 |
+
className="w-16 !bg-teal-500"
|
34 |
+
/>
|
35 |
+
</div>
|
36 |
+
)
|
37 |
+
}
|
38 |
+
|
39 |
+
export const Node = memo(NodeComponent)
|
src/components/editors/WorkflowEditor/viewer/README.md
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
# Workflow
|
src/components/editors/WorkflowEditor/viewer/WorkflowView.tsx
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useCallback } from 'react'
|
2 |
+
import {
|
3 |
+
ReactFlow,
|
4 |
+
useNodesState,
|
5 |
+
useEdgesState,
|
6 |
+
addEdge,
|
7 |
+
MiniMap,
|
8 |
+
Controls,
|
9 |
+
OnConnect,
|
10 |
+
} from '@xyflow/react'
|
11 |
+
|
12 |
+
import '@xyflow/react/dist/base.css'
|
13 |
+
|
14 |
+
import { Node } from './Node'
|
15 |
+
|
16 |
+
const nodeTypes = {
|
17 |
+
custom: Node,
|
18 |
+
}
|
19 |
+
|
20 |
+
const initNodes = [
|
21 |
+
{
|
22 |
+
id: '1',
|
23 |
+
type: 'custom',
|
24 |
+
data: { name: 'Jane Doe', job: 'CEO', emoji: 'π' },
|
25 |
+
position: { x: 0, y: 50 },
|
26 |
+
},
|
27 |
+
{
|
28 |
+
id: '2',
|
29 |
+
type: 'custom',
|
30 |
+
data: { name: 'Tyler Weary', job: 'Designer', emoji: 'π€' },
|
31 |
+
|
32 |
+
position: { x: -200, y: 200 },
|
33 |
+
},
|
34 |
+
{
|
35 |
+
id: '3',
|
36 |
+
type: 'custom',
|
37 |
+
data: { name: 'Kristi Price', job: 'Developer', emoji: 'π€©' },
|
38 |
+
position: { x: 200, y: 200 },
|
39 |
+
},
|
40 |
+
]
|
41 |
+
|
42 |
+
const initEdges = [
|
43 |
+
{
|
44 |
+
id: 'e1-2',
|
45 |
+
source: '1',
|
46 |
+
target: '2',
|
47 |
+
},
|
48 |
+
{
|
49 |
+
id: 'e1-3',
|
50 |
+
source: '1',
|
51 |
+
target: '3',
|
52 |
+
},
|
53 |
+
]
|
54 |
+
|
55 |
+
export function WorkflowView() {
|
56 |
+
const [nodes, setNodes, onNodesChange] = useNodesState(initNodes)
|
57 |
+
const [edges, setEdges, onEdgesChange] = useEdgesState(initEdges)
|
58 |
+
|
59 |
+
const onConnect: OnConnect = useCallback(
|
60 |
+
(params) => setEdges((eds) => addEdge(params, eds)),
|
61 |
+
[]
|
62 |
+
)
|
63 |
+
|
64 |
+
return (
|
65 |
+
<ReactFlow
|
66 |
+
nodes={nodes}
|
67 |
+
edges={edges}
|
68 |
+
onNodesChange={onNodesChange}
|
69 |
+
onEdgesChange={onEdgesChange}
|
70 |
+
onConnect={onConnect}
|
71 |
+
nodeTypes={nodeTypes}
|
72 |
+
fitView
|
73 |
+
className="bg-teal-50"
|
74 |
+
>
|
75 |
+
<MiniMap />
|
76 |
+
<Controls />
|
77 |
+
</ReactFlow>
|
78 |
+
)
|
79 |
+
}
|
src/components/toolbars/top-menu/ToggleView/index.tsx
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { ReactNode } from 'react'
|
2 |
+
|
3 |
+
import { cn } from '@/lib/utils'
|
4 |
+
import {
|
5 |
+
Tooltip,
|
6 |
+
TooltipContent,
|
7 |
+
TooltipTrigger,
|
8 |
+
} from '@/components/ui/tooltip'
|
9 |
+
|
10 |
+
export function ToggleView({
|
11 |
+
children,
|
12 |
+
isVisible = false,
|
13 |
+
setVisible,
|
14 |
+
className = '',
|
15 |
+
}: {
|
16 |
+
children?: ReactNode
|
17 |
+
isVisible?: boolean
|
18 |
+
setVisible: (isVisible: boolean) => void
|
19 |
+
className?: string
|
20 |
+
}) {
|
21 |
+
return (
|
22 |
+
<Tooltip>
|
23 |
+
<TooltipTrigger className="">
|
24 |
+
<div
|
25 |
+
className={cn(
|
26 |
+
`group grid h-4 w-5 scale-100 cursor-pointer grid-cols-4 grid-rows-4 overflow-hidden rounded border border-stone-100 opacity-70 transition-all duration-200 ease-in-out hover:scale-110 hover:opacity-100`
|
27 |
+
)}
|
28 |
+
onClick={() => {
|
29 |
+
setVisible(!isVisible)
|
30 |
+
}}
|
31 |
+
>
|
32 |
+
<div
|
33 |
+
className={cn(
|
34 |
+
`flex transition-all duration-200 ease-in-out group-hover:scale-110 group-hover:border-stone-100`,
|
35 |
+
isVisible ? `border-stone-100 bg-stone-400` : `border-stone-400`,
|
36 |
+
className
|
37 |
+
)}
|
38 |
+
></div>
|
39 |
+
</div>
|
40 |
+
</TooltipTrigger>
|
41 |
+
<TooltipContent className={cn(`mr-4 mt-2 flex text-xs font-light`)}>
|
42 |
+
{children}
|
43 |
+
</TooltipContent>
|
44 |
+
</Tooltip>
|
45 |
+
)
|
46 |
+
}
|
src/components/toolbars/top-menu/index.tsx
CHANGED
@@ -21,10 +21,19 @@ import {
|
|
21 |
TooltipContent,
|
22 |
TooltipTrigger,
|
23 |
} from '@/components/ui/tooltip'
|
|
|
24 |
|
25 |
export function TopMenu() {
|
26 |
const isBusyResolving = useResolver((s) => s.isBusyResolving)
|
27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
const setIsTopMenuOpen = useUI((s) => s.setIsTopMenuOpen)
|
29 |
|
30 |
const hasBetaAccess = useUI((s) => s.hasBetaAccess)
|
@@ -55,9 +64,42 @@ export function TopMenu() {
|
|
55 |
{
|
56 |
// clap?.meta?.title || "Untitled"
|
57 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
<Tooltip>
|
59 |
<TooltipTrigger className="">
|
60 |
-
<div className="scale-100 cursor-pointer text-stone-300/70 transition-all duration-200 ease-in-out hover:scale-110 hover:text-stone-100/90">
|
61 |
<a href="https://discord.gg/AEruz9B92B" target='"_blank'>
|
62 |
<TbBrandDiscord className="h-4 w-4" />
|
63 |
</a>
|
|
|
21 |
TooltipContent,
|
22 |
TooltipTrigger,
|
23 |
} from '@/components/ui/tooltip'
|
24 |
+
import { ToggleView } from './ToggleView'
|
25 |
|
26 |
export function TopMenu() {
|
27 |
const isBusyResolving = useResolver((s) => s.isBusyResolving)
|
28 |
|
29 |
+
const showTimeline = useUI((s) => s.showTimeline)
|
30 |
+
const setShowTimeline = useUI((s) => s.setShowTimeline)
|
31 |
+
const showExplorer = useUI((s) => s.showExplorer)
|
32 |
+
const setShowExplorer = useUI((s) => s.setShowExplorer)
|
33 |
+
const showVideoPlayer = useUI((s) => s.showVideoPlayer)
|
34 |
+
const setShowVideoPlayer = useUI((s) => s.setShowVideoPlayer)
|
35 |
+
const showAssistant = useUI((s) => s.showAssistant)
|
36 |
+
const setShowAssistant = useUI((s) => s.setShowAssistant)
|
37 |
const setIsTopMenuOpen = useUI((s) => s.setIsTopMenuOpen)
|
38 |
|
39 |
const hasBetaAccess = useUI((s) => s.hasBetaAccess)
|
|
|
64 |
{
|
65 |
// clap?.meta?.title || "Untitled"
|
66 |
}
|
67 |
+
|
68 |
+
{/*
|
69 |
+
<ToggleView
|
70 |
+
className="row-start-1 col-span-1 row-span-4 border-r"
|
71 |
+
isVisible={}
|
72 |
+
setVisible={}
|
73 |
+
>Toggle Tree browser</ToggleView>
|
74 |
+
*/}
|
75 |
+
{/*
|
76 |
+
<ToggleView
|
77 |
+
className="col-span-4 row-span-1 row-start-4 border-t"
|
78 |
+
isVisible={showTimeline}
|
79 |
+
setVisible={setShowTimeline}
|
80 |
+
>
|
81 |
+
Toggle Timeline
|
82 |
+
</ToggleView>
|
83 |
+
*/}
|
84 |
+
|
85 |
+
<ToggleView
|
86 |
+
className="col-span-1 col-start-3 row-span-2 border-b border-l border-r"
|
87 |
+
isVisible={showVideoPlayer}
|
88 |
+
setVisible={setShowVideoPlayer}
|
89 |
+
>
|
90 |
+
Toggle Monitor
|
91 |
+
</ToggleView>
|
92 |
+
<ToggleView
|
93 |
+
className="col-span-1 col-start-4 row-span-4 border-l"
|
94 |
+
isVisible={showAssistant}
|
95 |
+
setVisible={setShowAssistant}
|
96 |
+
>
|
97 |
+
Toggle Assistant
|
98 |
+
</ToggleView>
|
99 |
+
|
100 |
<Tooltip>
|
101 |
<TooltipTrigger className="">
|
102 |
+
<div className="ml-2 scale-100 cursor-pointer text-stone-300/70 transition-all duration-200 ease-in-out hover:scale-110 hover:text-stone-100/90">
|
103 |
<a href="https://discord.gg/AEruz9B92B" target='"_blank'>
|
104 |
<TbBrandDiscord className="h-4 w-4" />
|
105 |
</a>
|
src/components/toolbars/top-menu/view/index.tsx
CHANGED
@@ -85,17 +85,6 @@ export function TopMenuView() {
|
|
85 |
}}
|
86 |
>Show asset explorer</MenubarCheckboxItem>
|
87 |
*/}
|
88 |
-
<MenubarCheckboxItem
|
89 |
-
checked={showAssistant}
|
90 |
-
onClick={(e) => {
|
91 |
-
setShowAssistant(!showAssistant)
|
92 |
-
e.stopPropagation()
|
93 |
-
e.preventDefault()
|
94 |
-
return false
|
95 |
-
}}
|
96 |
-
>
|
97 |
-
Show assistant
|
98 |
-
</MenubarCheckboxItem>
|
99 |
|
100 |
<MenubarCheckboxItem
|
101 |
checked={followCursor}
|
|
|
85 |
}}
|
86 |
>Show asset explorer</MenubarCheckboxItem>
|
87 |
*/}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
|
89 |
<MenubarCheckboxItem
|
90 |
checked={followCursor}
|
src/experiments/README.md
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
# Experiments
|
2 |
+
|
3 |
+
The is the Clapper Labs, where new ideas are being incubated before integration as real features.
|
src/experiments/grading/README.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1 |
Utilities to apply color grading to an image.
|
2 |
|
3 |
-
The purpose is to be able to
|
|
|
|
|
|
|
|
1 |
Utilities to apply color grading to an image.
|
2 |
|
3 |
+
The purpose is to be able to homogenize the colors of storyboards,
|
4 |
+
as well as providing useful filters.
|
5 |
+
|
6 |
+
I'm going to put this color grading module into its own library, as I would like to use it in other applications and demos.
|
src/experiments/moodboard/MoodboardView.tsx
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useCallback } from 'react'
|
2 |
+
import {
|
3 |
+
ReactFlow,
|
4 |
+
useNodesState,
|
5 |
+
useEdgesState,
|
6 |
+
addEdge,
|
7 |
+
MiniMap,
|
8 |
+
Controls,
|
9 |
+
OnConnect,
|
10 |
+
} from '@xyflow/react'
|
11 |
+
|
12 |
+
import '@xyflow/react/dist/base.css'
|
13 |
+
|
14 |
+
import { Node } from './Node'
|
15 |
+
|
16 |
+
const nodeTypes = {
|
17 |
+
custom: Node,
|
18 |
+
}
|
19 |
+
|
20 |
+
const initNodes = [
|
21 |
+
{
|
22 |
+
id: '1',
|
23 |
+
type: 'custom',
|
24 |
+
data: { name: 'Jane Doe', job: 'CEO', emoji: 'π' },
|
25 |
+
position: { x: 0, y: 50 },
|
26 |
+
},
|
27 |
+
{
|
28 |
+
id: '2',
|
29 |
+
type: 'custom',
|
30 |
+
data: { name: 'Tyler Weary', job: 'Designer', emoji: 'π€' },
|
31 |
+
|
32 |
+
position: { x: -200, y: 200 },
|
33 |
+
},
|
34 |
+
{
|
35 |
+
id: '3',
|
36 |
+
type: 'custom',
|
37 |
+
data: { name: 'Kristi Price', job: 'Developer', emoji: 'π€©' },
|
38 |
+
position: { x: 200, y: 200 },
|
39 |
+
},
|
40 |
+
]
|
41 |
+
|
42 |
+
const initEdges = [
|
43 |
+
{
|
44 |
+
id: 'e1-2',
|
45 |
+
source: '1',
|
46 |
+
target: '2',
|
47 |
+
},
|
48 |
+
{
|
49 |
+
id: 'e1-3',
|
50 |
+
source: '1',
|
51 |
+
target: '3',
|
52 |
+
},
|
53 |
+
]
|
54 |
+
|
55 |
+
export function MoodboardView() {
|
56 |
+
const [nodes, setNodes, onNodesChange] = useNodesState(initNodes)
|
57 |
+
const [edges, setEdges, onEdgesChange] = useEdgesState(initEdges)
|
58 |
+
|
59 |
+
const onConnect: OnConnect = useCallback(
|
60 |
+
(params) => setEdges((eds) => addEdge(params, eds)),
|
61 |
+
[]
|
62 |
+
)
|
63 |
+
|
64 |
+
return (
|
65 |
+
<ReactFlow
|
66 |
+
nodes={nodes}
|
67 |
+
edges={edges}
|
68 |
+
onNodesChange={onNodesChange}
|
69 |
+
onEdgesChange={onEdgesChange}
|
70 |
+
onConnect={onConnect}
|
71 |
+
nodeTypes={nodeTypes}
|
72 |
+
fitView
|
73 |
+
className="bg-teal-50"
|
74 |
+
>
|
75 |
+
<MiniMap />
|
76 |
+
<Controls />
|
77 |
+
</ReactFlow>
|
78 |
+
)
|
79 |
+
}
|
src/experiments/moodboard/Node.tsx
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { memo } from 'react'
|
2 |
+
import { Handle, Position } from '@xyflow/react'
|
3 |
+
|
4 |
+
function NodeComponent({
|
5 |
+
data,
|
6 |
+
}: {
|
7 |
+
data: {
|
8 |
+
name: string
|
9 |
+
job: string
|
10 |
+
emoji: string
|
11 |
+
}
|
12 |
+
}) {
|
13 |
+
return (
|
14 |
+
<div className="rounded-md border-2 border-stone-400 bg-white px-4 py-2 shadow-md">
|
15 |
+
<div className="flex">
|
16 |
+
<div className="flex h-12 w-12 items-center justify-center rounded-full bg-gray-100">
|
17 |
+
{data.emoji}
|
18 |
+
</div>
|
19 |
+
<div className="ml-2">
|
20 |
+
<div className="text-lg font-bold">{data.name}</div>
|
21 |
+
<div className="text-gray-500">{data.job}</div>
|
22 |
+
</div>
|
23 |
+
</div>
|
24 |
+
|
25 |
+
<Handle
|
26 |
+
type="target"
|
27 |
+
position={Position.Top}
|
28 |
+
className="w-16 !bg-teal-500"
|
29 |
+
/>
|
30 |
+
<Handle
|
31 |
+
type="source"
|
32 |
+
position={Position.Bottom}
|
33 |
+
className="w-16 !bg-teal-500"
|
34 |
+
/>
|
35 |
+
</div>
|
36 |
+
)
|
37 |
+
}
|
38 |
+
|
39 |
+
export const Node = memo(NodeComponent)
|
src/lib/core/constants.ts
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
export const HARD_LIMIT_NB_MAX_ASSETS_TO_GENERATE_IN_PARALLEL = 32
|
4 |
|
5 |
export const APP_NAME = 'Clapper.app'
|
6 |
-
export const APP_REVISION = '20240725+
|
7 |
|
8 |
export const APP_DOMAIN = 'Clapper.app'
|
9 |
export const APP_LINK = 'https://clapper.app'
|
|
|
3 |
export const HARD_LIMIT_NB_MAX_ASSETS_TO_GENERATE_IN_PARALLEL = 32
|
4 |
|
5 |
export const APP_NAME = 'Clapper.app'
|
6 |
+
export const APP_REVISION = '20240725+1822'
|
7 |
|
8 |
export const APP_DOMAIN = 'Clapper.app'
|
9 |
export const APP_LINK = 'https://clapper.app'
|