jbilcke-hf HF staff commited on
Commit
65b1bdb
β€’
1 Parent(s): a54bba5

working on roadmap features

Browse files
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-0",
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-0",
167
- "resolved": "https://registry.npmjs.org/@aitube/clapper-services/-/clapper-services-0.1.2-0.tgz",
168
- "integrity": "sha512-8rXuys53qBgIcbqCcpUcGFSkSkuNfQRUiZ8Wsw5YJsFtvJo+uqxfZZcfghaImnMNQVPrc72QVRj4o5Ph6e85Og==",
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-cCAPJBjV8x2yh1lGIBAKISNY5eqOqFA2iWrO7u0TvCMNOxgpOIgHsATiQmGih3WjcbQQ8rdHfCGgxFZagLBh3A==",
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-0",
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 justify-between overflow-hidden font-light text-stone-900/90 dark:text-stone-100/90`
62
  )}
63
  style={{
64
  backgroundImage:
@@ -68,35 +70,43 @@ function MainContent() {
68
  <TopBar />
69
  <div
70
  className={cn(
71
- `flex h-[calc(100vh-40px)] w-screen flex-row overflow-hidden`
72
  )}
73
  >
74
  <ReflexContainer orientation="vertical">
75
  <ReflexElement>
76
  <ReflexContainer orientation="horizontal">
77
- <ReflexElement minSize={showTimeline ? 100 : 1}>
 
 
 
 
78
  <ReflexContainer orientation="vertical">
79
  <ReflexElement
80
- size={showTimeline ? 700 : 1}
81
- minSize={showTimeline ? 100 : 1}
82
- maxSize={showTimeline ? 2000 : 1}
83
  >
84
  <Editors />
85
  </ReflexElement>
86
- <ReflexSplitter />
87
- <ReflexElement minSize={showTimeline ? 100 : 1}>
88
- <Monitor />
89
- </ReflexElement>
 
 
 
 
 
90
  </ReflexContainer>
91
  </ReflexElement>
92
  <ReflexSplitter />
93
  <ReflexElement
94
  size={showTimeline ? 400 : 1}
95
- minSize={showTimeline ? 100 : 1}
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 unify / homogeneize
 
 
 
 
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+0155'
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'