@stevejtrettel/shader-sandbox 0.1.2 → 0.1.4
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/README.md +259 -235
- package/bin/cli.js +106 -14
- package/dist-lib/app/App.d.ts +143 -15
- package/dist-lib/app/App.d.ts.map +1 -1
- package/dist-lib/app/App.js +1343 -108
- package/dist-lib/app/app.css +349 -24
- package/dist-lib/app/types.d.ts +48 -5
- package/dist-lib/app/types.d.ts.map +1 -1
- package/dist-lib/editor/EditorPanel.d.ts +2 -2
- package/dist-lib/editor/EditorPanel.d.ts.map +1 -1
- package/dist-lib/editor/EditorPanel.js +1 -1
- package/dist-lib/editor/editor-panel.css +55 -32
- package/dist-lib/editor/prism-editor.css +16 -16
- package/dist-lib/embed.js +1 -1
- package/dist-lib/engine/{ShadertoyEngine.d.ts → ShaderEngine.d.ts} +134 -10
- package/dist-lib/engine/ShaderEngine.d.ts.map +1 -0
- package/dist-lib/engine/ShaderEngine.js +1523 -0
- package/dist-lib/engine/glHelpers.d.ts +24 -0
- package/dist-lib/engine/glHelpers.d.ts.map +1 -1
- package/dist-lib/engine/glHelpers.js +88 -0
- package/dist-lib/engine/std140.d.ts +47 -0
- package/dist-lib/engine/std140.d.ts.map +1 -0
- package/dist-lib/engine/std140.js +119 -0
- package/dist-lib/engine/types.d.ts +55 -5
- package/dist-lib/engine/types.d.ts.map +1 -1
- package/dist-lib/engine/types.js +1 -1
- package/dist-lib/index.d.ts +4 -3
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +2 -1
- package/dist-lib/layouts/SplitLayout.d.ts +2 -1
- package/dist-lib/layouts/SplitLayout.d.ts.map +1 -1
- package/dist-lib/layouts/SplitLayout.js +3 -0
- package/dist-lib/layouts/TabbedLayout.d.ts.map +1 -1
- package/dist-lib/layouts/UILayout.d.ts +55 -0
- package/dist-lib/layouts/UILayout.d.ts.map +1 -0
- package/dist-lib/layouts/UILayout.js +147 -0
- package/dist-lib/layouts/default.css +2 -2
- package/dist-lib/layouts/index.d.ts +11 -1
- package/dist-lib/layouts/index.d.ts.map +1 -1
- package/dist-lib/layouts/index.js +17 -1
- package/dist-lib/layouts/split.css +33 -31
- package/dist-lib/layouts/tabbed.css +127 -74
- package/dist-lib/layouts/types.d.ts +14 -3
- package/dist-lib/layouts/types.d.ts.map +1 -1
- package/dist-lib/main.js +33 -0
- package/dist-lib/project/configHelpers.d.ts +45 -0
- package/dist-lib/project/configHelpers.d.ts.map +1 -0
- package/dist-lib/project/configHelpers.js +196 -0
- package/dist-lib/project/generatedLoader.d.ts +2 -2
- package/dist-lib/project/generatedLoader.d.ts.map +1 -1
- package/dist-lib/project/generatedLoader.js +23 -5
- package/dist-lib/project/loadProject.d.ts +6 -6
- package/dist-lib/project/loadProject.d.ts.map +1 -1
- package/dist-lib/project/loadProject.js +396 -144
- package/dist-lib/project/loaderHelper.d.ts +4 -4
- package/dist-lib/project/loaderHelper.d.ts.map +1 -1
- package/dist-lib/project/loaderHelper.js +278 -116
- package/dist-lib/project/types.d.ts +292 -13
- package/dist-lib/project/types.d.ts.map +1 -1
- package/dist-lib/project/types.js +13 -1
- package/dist-lib/styles/base.css +5 -1
- package/dist-lib/uniforms/UniformControls.d.ts +60 -0
- package/dist-lib/uniforms/UniformControls.d.ts.map +1 -0
- package/dist-lib/uniforms/UniformControls.js +518 -0
- package/dist-lib/uniforms/UniformStore.d.ts +74 -0
- package/dist-lib/uniforms/UniformStore.d.ts.map +1 -0
- package/dist-lib/uniforms/UniformStore.js +145 -0
- package/dist-lib/uniforms/UniformsPanel.d.ts +53 -0
- package/dist-lib/uniforms/UniformsPanel.d.ts.map +1 -0
- package/dist-lib/uniforms/UniformsPanel.js +124 -0
- package/dist-lib/uniforms/index.d.ts +11 -0
- package/dist-lib/uniforms/index.d.ts.map +1 -0
- package/dist-lib/uniforms/index.js +8 -0
- package/package.json +16 -1
- package/src/app/App.ts +1469 -126
- package/src/app/app.css +349 -24
- package/src/app/types.ts +53 -5
- package/src/editor/EditorPanel.ts +5 -5
- package/src/editor/editor-panel.css +55 -32
- package/src/editor/prism-editor.css +16 -16
- package/src/embed.ts +1 -1
- package/src/engine/ShaderEngine.ts +1934 -0
- package/src/engine/glHelpers.ts +117 -0
- package/src/engine/std140.ts +136 -0
- package/src/engine/types.ts +69 -5
- package/src/index.ts +4 -3
- package/src/layouts/SplitLayout.ts +8 -3
- package/src/layouts/TabbedLayout.ts +3 -3
- package/src/layouts/UILayout.ts +185 -0
- package/src/layouts/default.css +2 -2
- package/src/layouts/index.ts +20 -1
- package/src/layouts/split.css +33 -31
- package/src/layouts/tabbed.css +127 -74
- package/src/layouts/types.ts +19 -3
- package/src/layouts/ui.css +289 -0
- package/src/main.ts +39 -1
- package/src/project/configHelpers.ts +225 -0
- package/src/project/generatedLoader.ts +27 -6
- package/src/project/loadProject.ts +459 -173
- package/src/project/loaderHelper.ts +377 -130
- package/src/project/types.ts +360 -14
- package/src/styles/base.css +5 -1
- package/src/styles/theme.css +292 -0
- package/src/uniforms/UniformControls.ts +660 -0
- package/src/uniforms/UniformStore.ts +166 -0
- package/src/uniforms/UniformsPanel.ts +163 -0
- package/src/uniforms/index.ts +13 -0
- package/src/uniforms/uniform-controls.css +342 -0
- package/src/uniforms/uniforms-panel.css +277 -0
- package/templates/shaders/example-buffer/config.json +1 -0
- package/dist-lib/engine/ShadertoyEngine.d.ts.map +0 -1
- package/dist-lib/engine/ShadertoyEngine.js +0 -704
- package/src/engine/ShadertoyEngine.ts +0 -929
package/dist-lib/app/app.css
CHANGED
|
@@ -1,45 +1,190 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* App Styles -
|
|
2
|
+
* App Styles - Floating overlays on shader canvas
|
|
3
|
+
*
|
|
4
|
+
* All floating elements use consistent "liquid glass" styling:
|
|
5
|
+
* - Semi-transparent background with blur
|
|
6
|
+
* - Subtle border and shadow
|
|
7
|
+
* - 6px corner radius (smaller than canvas container's 8px per concentric radius rule)
|
|
3
8
|
*/
|
|
4
9
|
|
|
5
|
-
/* =====
|
|
6
|
-
|
|
10
|
+
/* ===== Shared Glass Overlay Variables ===== */
|
|
11
|
+
:root {
|
|
12
|
+
--glass-bg: rgba(30, 30, 35, 0.65);
|
|
13
|
+
--glass-bg-hover: rgba(30, 30, 35, 0.8);
|
|
14
|
+
--glass-border: 1px solid rgba(255, 255, 255, 0.1);
|
|
15
|
+
--glass-shadow:
|
|
16
|
+
0 4px 16px rgba(0, 0, 0, 0.25),
|
|
17
|
+
0 2px 4px rgba(0, 0, 0, 0.15),
|
|
18
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
|
19
|
+
--glass-shadow-sm:
|
|
20
|
+
0 2px 8px rgba(0, 0, 0, 0.25),
|
|
21
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.08);
|
|
22
|
+
--glass-blur: blur(20px);
|
|
23
|
+
--glass-radius: 6px; /* all overlays use same radius, smaller than canvas (8px) */
|
|
24
|
+
--glass-radius-sm: 6px; /* same as above for consistency */
|
|
25
|
+
--glass-text: rgba(255, 255, 255, 0.9);
|
|
26
|
+
--glass-text-muted: rgba(255, 255, 255, 0.6);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* ===== Stats Container (FPS + expandable stats) ===== */
|
|
30
|
+
.stats-container {
|
|
7
31
|
position: absolute;
|
|
8
|
-
bottom:
|
|
9
|
-
left:
|
|
32
|
+
bottom: 12px;
|
|
33
|
+
left: 12px;
|
|
34
|
+
z-index: 1000;
|
|
35
|
+
display: flex;
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
align-items: flex-start;
|
|
38
|
+
gap: 6px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* FPS Counter (clickable button) */
|
|
42
|
+
.fps-counter {
|
|
10
43
|
padding: 6px 10px;
|
|
11
|
-
background:
|
|
12
|
-
color:
|
|
44
|
+
background: var(--glass-bg);
|
|
45
|
+
color: var(--glass-text);
|
|
13
46
|
font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
|
|
14
|
-
font-size:
|
|
47
|
+
font-size: 11px;
|
|
15
48
|
font-weight: 500;
|
|
16
|
-
border-radius:
|
|
17
|
-
|
|
49
|
+
border-radius: var(--glass-radius-sm);
|
|
50
|
+
border: var(--glass-border);
|
|
51
|
+
cursor: pointer;
|
|
18
52
|
user-select: none;
|
|
19
|
-
|
|
20
|
-
backdrop-filter: blur
|
|
21
|
-
box-shadow:
|
|
53
|
+
backdrop-filter: var(--glass-blur);
|
|
54
|
+
-webkit-backdrop-filter: var(--glass-blur);
|
|
55
|
+
box-shadow: var(--glass-shadow-sm);
|
|
56
|
+
transition: all 0.2s ease;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.fps-counter:hover {
|
|
60
|
+
background: var(--glass-bg-hover);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Stats Grid (expandable) */
|
|
64
|
+
.stats-grid {
|
|
65
|
+
display: flex;
|
|
66
|
+
flex-direction: row;
|
|
67
|
+
gap: 6px;
|
|
68
|
+
opacity: 0;
|
|
69
|
+
visibility: hidden;
|
|
70
|
+
transform: translateY(8px);
|
|
71
|
+
transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
|
|
72
|
+
pointer-events: none;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.stats-grid.open {
|
|
76
|
+
opacity: 1;
|
|
77
|
+
visibility: visible;
|
|
78
|
+
transform: translateY(0);
|
|
79
|
+
pointer-events: auto;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Individual stat item */
|
|
83
|
+
.stat-item {
|
|
84
|
+
padding: 6px 10px;
|
|
85
|
+
background: var(--glass-bg);
|
|
86
|
+
border-radius: var(--glass-radius-sm);
|
|
87
|
+
border: var(--glass-border);
|
|
88
|
+
backdrop-filter: var(--glass-blur);
|
|
89
|
+
-webkit-backdrop-filter: var(--glass-blur);
|
|
90
|
+
box-shadow: var(--glass-shadow-sm);
|
|
91
|
+
display: flex;
|
|
92
|
+
flex-direction: column;
|
|
93
|
+
align-items: center;
|
|
94
|
+
gap: 2px;
|
|
95
|
+
min-width: 48px;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.stat-value {
|
|
99
|
+
color: var(--glass-text);
|
|
100
|
+
font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
|
|
101
|
+
font-size: 11px;
|
|
102
|
+
font-weight: 600;
|
|
103
|
+
white-space: nowrap;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.stat-label {
|
|
107
|
+
color: var(--glass-text-muted);
|
|
108
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
109
|
+
font-size: 9px;
|
|
110
|
+
font-weight: 500;
|
|
111
|
+
text-transform: uppercase;
|
|
112
|
+
letter-spacing: 0.5px;
|
|
22
113
|
}
|
|
23
114
|
|
|
24
115
|
/* ===== Playback Controls ===== */
|
|
25
116
|
.playback-controls {
|
|
26
117
|
position: absolute;
|
|
27
|
-
bottom:
|
|
28
|
-
right:
|
|
29
|
-
display: flex;
|
|
30
|
-
gap: 8px;
|
|
118
|
+
bottom: 12px;
|
|
119
|
+
right: 12px;
|
|
31
120
|
z-index: 1000;
|
|
32
121
|
}
|
|
33
122
|
|
|
123
|
+
/* Menu toggle button (+ / -) */
|
|
124
|
+
.controls-menu-button {
|
|
125
|
+
padding: 6px 8px;
|
|
126
|
+
background: var(--glass-bg);
|
|
127
|
+
color: var(--glass-text);
|
|
128
|
+
border: var(--glass-border);
|
|
129
|
+
border-radius: var(--glass-radius-sm);
|
|
130
|
+
cursor: pointer;
|
|
131
|
+
backdrop-filter: var(--glass-blur);
|
|
132
|
+
-webkit-backdrop-filter: var(--glass-blur);
|
|
133
|
+
box-shadow: var(--glass-shadow-sm);
|
|
134
|
+
transition: all 0.2s ease;
|
|
135
|
+
display: flex;
|
|
136
|
+
align-items: center;
|
|
137
|
+
justify-content: center;
|
|
138
|
+
width: 32px;
|
|
139
|
+
height: 32px;
|
|
140
|
+
font-size: 20px;
|
|
141
|
+
font-weight: 300;
|
|
142
|
+
line-height: 1;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.controls-menu-button:hover {
|
|
146
|
+
background: var(--glass-bg-hover);
|
|
147
|
+
transform: scale(1.05);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.controls-menu-button:active {
|
|
151
|
+
transform: scale(0.95);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* Control buttons grid - 2x3 with menu button as last cell */
|
|
155
|
+
.controls-grid {
|
|
156
|
+
position: absolute;
|
|
157
|
+
bottom: 0;
|
|
158
|
+
right: 0;
|
|
159
|
+
display: grid;
|
|
160
|
+
grid-template-columns: 32px 32px 32px;
|
|
161
|
+
grid-template-rows: 32px 32px;
|
|
162
|
+
gap: 6px;
|
|
163
|
+
opacity: 0;
|
|
164
|
+
visibility: hidden;
|
|
165
|
+
transform: scale(0.8);
|
|
166
|
+
transform-origin: bottom right;
|
|
167
|
+
transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
|
|
168
|
+
pointer-events: none;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.controls-grid.open {
|
|
172
|
+
opacity: 1;
|
|
173
|
+
visibility: visible;
|
|
174
|
+
transform: scale(1);
|
|
175
|
+
pointer-events: auto;
|
|
176
|
+
}
|
|
177
|
+
|
|
34
178
|
.control-button {
|
|
35
179
|
padding: 6px 8px;
|
|
36
|
-
background:
|
|
37
|
-
color:
|
|
38
|
-
border:
|
|
39
|
-
border-radius:
|
|
180
|
+
background: var(--glass-bg);
|
|
181
|
+
color: var(--glass-text);
|
|
182
|
+
border: var(--glass-border);
|
|
183
|
+
border-radius: var(--glass-radius-sm);
|
|
40
184
|
cursor: pointer;
|
|
41
|
-
backdrop-filter: blur
|
|
42
|
-
|
|
185
|
+
backdrop-filter: var(--glass-blur);
|
|
186
|
+
-webkit-backdrop-filter: var(--glass-blur);
|
|
187
|
+
box-shadow: var(--glass-shadow-sm);
|
|
43
188
|
transition: all 0.2s ease;
|
|
44
189
|
display: flex;
|
|
45
190
|
align-items: center;
|
|
@@ -49,7 +194,7 @@
|
|
|
49
194
|
}
|
|
50
195
|
|
|
51
196
|
.control-button:hover {
|
|
52
|
-
background:
|
|
197
|
+
background: var(--glass-bg-hover);
|
|
53
198
|
transform: scale(1.05);
|
|
54
199
|
}
|
|
55
200
|
|
|
@@ -63,6 +208,18 @@
|
|
|
63
208
|
fill: currentColor;
|
|
64
209
|
}
|
|
65
210
|
|
|
211
|
+
/* Menu button - standalone when closed, part of grid when open */
|
|
212
|
+
.playback-controls .controls-menu-button {
|
|
213
|
+
position: relative;
|
|
214
|
+
z-index: 1;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/* When open, hide standalone button (it's now in the grid) */
|
|
218
|
+
.playback-controls.open > .controls-menu-button {
|
|
219
|
+
opacity: 0;
|
|
220
|
+
pointer-events: none;
|
|
221
|
+
}
|
|
222
|
+
|
|
66
223
|
/* ===== Shader Error Overlay ===== */
|
|
67
224
|
.shader-error-overlay {
|
|
68
225
|
position: absolute;
|
|
@@ -206,3 +363,171 @@
|
|
|
206
363
|
margin-left: -16px;
|
|
207
364
|
padding-left: 13px;
|
|
208
365
|
}
|
|
366
|
+
|
|
367
|
+
/* ===== WebGL Context Lost Overlay ===== */
|
|
368
|
+
.context-lost-overlay {
|
|
369
|
+
position: absolute;
|
|
370
|
+
top: 0;
|
|
371
|
+
left: 0;
|
|
372
|
+
right: 0;
|
|
373
|
+
bottom: 0;
|
|
374
|
+
background: rgba(0, 0, 0, 0.9);
|
|
375
|
+
backdrop-filter: blur(8px);
|
|
376
|
+
display: flex;
|
|
377
|
+
align-items: center;
|
|
378
|
+
justify-content: center;
|
|
379
|
+
z-index: 3000;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.context-lost-content {
|
|
383
|
+
text-align: center;
|
|
384
|
+
color: white;
|
|
385
|
+
padding: 40px;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
.context-lost-icon {
|
|
389
|
+
margin-bottom: 16px;
|
|
390
|
+
opacity: 0.8;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
.context-lost-spinner {
|
|
394
|
+
width: 48px;
|
|
395
|
+
height: 48px;
|
|
396
|
+
border: 3px solid rgba(255, 255, 255, 0.2);
|
|
397
|
+
border-top-color: white;
|
|
398
|
+
border-radius: 50%;
|
|
399
|
+
margin: 0 auto 16px;
|
|
400
|
+
animation: context-lost-spin 1s linear infinite;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
@keyframes context-lost-spin {
|
|
404
|
+
to { transform: rotate(360deg); }
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.context-lost-title {
|
|
408
|
+
font-size: 18px;
|
|
409
|
+
font-weight: 600;
|
|
410
|
+
margin-bottom: 8px;
|
|
411
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
.context-lost-message {
|
|
415
|
+
font-size: 14px;
|
|
416
|
+
opacity: 0.7;
|
|
417
|
+
margin-bottom: 20px;
|
|
418
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
.context-lost-reload {
|
|
422
|
+
background: white;
|
|
423
|
+
color: #000;
|
|
424
|
+
border: none;
|
|
425
|
+
padding: 10px 24px;
|
|
426
|
+
border-radius: 6px;
|
|
427
|
+
font-size: 14px;
|
|
428
|
+
font-weight: 500;
|
|
429
|
+
cursor: pointer;
|
|
430
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
431
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.context-lost-reload:hover {
|
|
435
|
+
transform: scale(1.02);
|
|
436
|
+
box-shadow: 0 4px 12px rgba(255, 255, 255, 0.2);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.context-lost-reload:active {
|
|
440
|
+
transform: scale(0.98);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/* ===== Recording Indicator ===== */
|
|
444
|
+
.recording-indicator {
|
|
445
|
+
position: absolute;
|
|
446
|
+
top: 12px;
|
|
447
|
+
right: 12px;
|
|
448
|
+
z-index: 1000;
|
|
449
|
+
display: flex;
|
|
450
|
+
align-items: center;
|
|
451
|
+
gap: 6px;
|
|
452
|
+
padding: 6px 10px;
|
|
453
|
+
background: rgba(220, 38, 38, 0.85);
|
|
454
|
+
border-radius: var(--glass-radius-sm);
|
|
455
|
+
border: 1px solid rgba(255, 100, 100, 0.3);
|
|
456
|
+
backdrop-filter: var(--glass-blur);
|
|
457
|
+
-webkit-backdrop-filter: var(--glass-blur);
|
|
458
|
+
box-shadow: var(--glass-shadow-sm);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
.recording-dot {
|
|
462
|
+
width: 8px;
|
|
463
|
+
height: 8px;
|
|
464
|
+
background: white;
|
|
465
|
+
border-radius: 50%;
|
|
466
|
+
animation: recording-pulse 1s ease-in-out infinite;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
@keyframes recording-pulse {
|
|
470
|
+
0%, 100% { opacity: 1; }
|
|
471
|
+
50% { opacity: 0.4; }
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.recording-text {
|
|
475
|
+
color: white;
|
|
476
|
+
font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
|
|
477
|
+
font-size: 11px;
|
|
478
|
+
font-weight: 600;
|
|
479
|
+
letter-spacing: 0.5px;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/* Record button recording state */
|
|
483
|
+
.control-button.recording {
|
|
484
|
+
background: rgba(220, 38, 38, 0.7);
|
|
485
|
+
border-color: rgba(255, 100, 100, 0.3);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
.control-button.recording:hover {
|
|
489
|
+
background: rgba(220, 38, 38, 0.85);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.control-button.recording svg {
|
|
493
|
+
fill: white;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/* ===== Media Permission Banner ===== */
|
|
497
|
+
|
|
498
|
+
.media-permission-banner {
|
|
499
|
+
position: absolute;
|
|
500
|
+
bottom: 48px;
|
|
501
|
+
left: 50%;
|
|
502
|
+
transform: translateX(-50%);
|
|
503
|
+
background: var(--glass-bg);
|
|
504
|
+
backdrop-filter: blur(12px);
|
|
505
|
+
-webkit-backdrop-filter: blur(12px);
|
|
506
|
+
border: var(--glass-border);
|
|
507
|
+
box-shadow: var(--glass-shadow);
|
|
508
|
+
color: rgba(255, 255, 255, 0.9);
|
|
509
|
+
padding: 8px 16px;
|
|
510
|
+
border-radius: 6px;
|
|
511
|
+
font-size: 13px;
|
|
512
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
513
|
+
display: flex;
|
|
514
|
+
align-items: center;
|
|
515
|
+
gap: 12px;
|
|
516
|
+
z-index: 100;
|
|
517
|
+
white-space: nowrap;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
.media-banner-button {
|
|
521
|
+
background: rgba(74, 158, 255, 0.8);
|
|
522
|
+
color: #fff;
|
|
523
|
+
border: none;
|
|
524
|
+
padding: 4px 12px;
|
|
525
|
+
border-radius: 4px;
|
|
526
|
+
cursor: pointer;
|
|
527
|
+
font-size: 13px;
|
|
528
|
+
font-family: inherit;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
.media-banner-button:hover {
|
|
532
|
+
background: rgba(74, 158, 255, 1);
|
|
533
|
+
}
|
package/dist-lib/app/types.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Types for the browser runtime coordinator.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
6
|
+
import type { ShaderProject } from '../project/types';
|
|
7
7
|
/**
|
|
8
8
|
* Options for creating the App.
|
|
9
9
|
*/
|
|
@@ -15,18 +15,61 @@ export interface AppOptions {
|
|
|
15
15
|
/**
|
|
16
16
|
* Loaded Shadertoy project.
|
|
17
17
|
*/
|
|
18
|
-
project:
|
|
18
|
+
project: ShaderProject;
|
|
19
19
|
/**
|
|
20
20
|
* Canvas pixel ratio (default: window.devicePixelRatio).
|
|
21
21
|
* Set to 1 for performance, or higher for retina displays.
|
|
22
22
|
*/
|
|
23
23
|
pixelRatio?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Skip creating the floating uniforms panel.
|
|
26
|
+
* Used by 'ui' layout which has its own uniforms panel.
|
|
27
|
+
*/
|
|
28
|
+
skipUniformsPanel?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Skip creating the playback controls overlay.
|
|
31
|
+
* Used by 'ui' layout which has its own playback controls.
|
|
32
|
+
*/
|
|
33
|
+
skipPlaybackControls?: boolean;
|
|
24
34
|
}
|
|
25
35
|
/**
|
|
26
|
-
* Mouse state for iMouse uniform.
|
|
36
|
+
* Mouse state for iMouse uniform (Shadertoy spec).
|
|
27
37
|
* Format: [x, y, clickX, clickY]
|
|
28
|
-
* - x, y:
|
|
29
|
-
* - clickX, clickY:
|
|
38
|
+
* - x, y: mouse position while button is held (freezes on release)
|
|
39
|
+
* - clickX, clickY: click origin position (positive while held, negated on release)
|
|
40
|
+
* The sign of clickX serves as a "mouse is down" signal (z > 0.0 = pressed).
|
|
30
41
|
*/
|
|
31
42
|
export type MouseState = [number, number, number, number];
|
|
43
|
+
/**
|
|
44
|
+
* Single touch point state.
|
|
45
|
+
* Format: [x, y, startX, startY]
|
|
46
|
+
* - x, y: current touch position in pixels
|
|
47
|
+
* - startX, startY: position where touch started
|
|
48
|
+
*/
|
|
49
|
+
export type TouchPoint = [number, number, number, number];
|
|
50
|
+
/**
|
|
51
|
+
* Touch state for touch uniforms.
|
|
52
|
+
*/
|
|
53
|
+
export interface TouchState {
|
|
54
|
+
/** Number of active touches (0-10) */
|
|
55
|
+
count: number;
|
|
56
|
+
/** Up to 3 tracked touches for shader uniforms */
|
|
57
|
+
touches: [TouchPoint, TouchPoint, TouchPoint];
|
|
58
|
+
/** Pinch scale factor (1.0 = no pinch, >1 = zoom in, <1 = zoom out) */
|
|
59
|
+
pinch: number;
|
|
60
|
+
/** Pinch change since last frame */
|
|
61
|
+
pinchDelta: number;
|
|
62
|
+
/** Center point of pinch gesture [x, y] */
|
|
63
|
+
pinchCenter: [number, number];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Internal pointer tracking for gesture recognition.
|
|
67
|
+
*/
|
|
68
|
+
export interface PointerData {
|
|
69
|
+
id: number;
|
|
70
|
+
x: number;
|
|
71
|
+
y: number;
|
|
72
|
+
startX: number;
|
|
73
|
+
startY: number;
|
|
74
|
+
}
|
|
32
75
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,SAAS,EAAE,WAAW,CAAC;IAEvB;;OAEG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC9C,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - Error display
|
|
8
8
|
* - Tab management for multiple passes
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { ShaderProject } from '../project/types';
|
|
11
11
|
import { RecompileHandler } from '../layouts/types';
|
|
12
12
|
import './editor-panel.css';
|
|
13
13
|
export declare class EditorPanel {
|
|
@@ -23,7 +23,7 @@ export declare class EditorPanel {
|
|
|
23
23
|
private activeTabIndex;
|
|
24
24
|
private editorInstance;
|
|
25
25
|
private modifiedSources;
|
|
26
|
-
constructor(container: HTMLElement, project:
|
|
26
|
+
constructor(container: HTMLElement, project: ShaderProject);
|
|
27
27
|
setRecompileHandler(handler: RecompileHandler): void;
|
|
28
28
|
dispose(): void;
|
|
29
29
|
private buildTabs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorPanel.d.ts","sourceRoot":"","sources":["../../src/editor/EditorPanel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"EditorPanel.d.ts","sourceRoot":"","sources":["../../src/editor/EditorPanel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAY,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,oBAAoB,CAAC;AAY5B,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,gBAAgB,CAAiC;IAEzD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,YAAY,CAAc;IAElC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,cAAc,CAAa;IAGnC,OAAO,CAAC,cAAc,CAA+B;IAGrD,OAAO,CAAC,eAAe,CAAkC;gBAE7C,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa;IA+D1D,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAIpD,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,SAAS;IAgDjB,OAAO,CAAC,WAAW;YAmBL,OAAO;IAsErB,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;YAIH,eAAe;IA4B7B,OAAO,CAAC,qBAAqB;CAS9B"}
|