diff --git a/website/src/components/Udels/Udels.jsx b/website/src/components/Udels/Udels.jsx
index b2d81ea9..72d983e0 100644
--- a/website/src/components/Udels/Udels.jsx
+++ b/website/src/components/Udels/Udels.jsx
@@ -2,6 +2,7 @@ import { code2hash } from '@strudel/core';
import { UdelFrame } from './UdelFrame';
import { useState } from 'react';
+import UdelsHeader from './UdelsHeader';
function NumberInput({ value, onChange, label = '', min, max }) {
const [localState, setLocalState] = useState(value);
@@ -68,7 +69,6 @@ export function Udels() {
return (
*/}
,
+// editorRef: React.MutableRefObject
,
+// error: Error
+// init: () => void
+// }
+
+export default function UdelsEditor(Props) {
+ const { context, containerRef, editorRef, error, init } = Props;
+ const { pending, started, handleTogglePlay } = context;
+ return (
+
+
+
+ {/*
*/}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/website/src/components/Udels/UdelsHeader.tsx b/website/src/components/Udels/UdelsHeader.tsx
new file mode 100644
index 00000000..7555e182
--- /dev/null
+++ b/website/src/components/Udels/UdelsHeader.tsx
@@ -0,0 +1,25 @@
+import NumberInput from '@src/repl/panel/NumberInput';
+
+export default function UdelsHeader(Props) {
+ const { numWindows, setNumWindows } = Props;
+
+ return (
+
+ );
+}
diff --git a/website/src/repl/Repl.jsx b/website/src/repl/Repl.jsx
index a4b7ba73..87ff653c 100644
--- a/website/src/repl/Repl.jsx
+++ b/website/src/repl/Repl.jsx
@@ -39,6 +39,7 @@ import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon';
import './Repl.css';
import { setInterval, clearInterval } from 'worker-timers';
import { getMetadata } from '../metadata_parser';
+import UdelsEditor from '@components/Udels/UdelsEditor';
const { latestCode } = settingsMap.get();
@@ -234,7 +235,14 @@ export function Repl({ embedded = false }) {
handleEvaluate,
};
- const showPanel = !isEmbedded || isUdels();
+ if (isUdels()) {
+ return (
+
+ );
+ }
+
+ const showPanel = !isEmbedded;
+
return (
diff --git a/website/src/repl/components/BigPlayButton.jsx b/website/src/repl/components/BigPlayButton.jsx
new file mode 100644
index 00000000..80a4d345
--- /dev/null
+++ b/website/src/repl/components/BigPlayButton.jsx
@@ -0,0 +1,22 @@
+import PlayCircleIcon from '@heroicons/react/20/solid/PlayCircleIcon';
+
+// type Props = {
+// started: boolean;
+// handleTogglePlay: () => void;
+// };
+export default function BigPlayButton(Props) {
+ const { started, handleTogglePlay } = Props;
+ if (started) {
+ return;
+ }
+
+ return (
+
+ );
+}
diff --git a/website/src/repl/components/Code.jsx b/website/src/repl/components/Code.jsx
new file mode 100644
index 00000000..5afc53eb
--- /dev/null
+++ b/website/src/repl/components/Code.jsx
@@ -0,0 +1,23 @@
+
+
+// type Props = {
+// containerRef: React.MutableRefObject
,
+// editorRef: React.MutableRefObject,
+// init: () => void
+// }
+export function Code(Props) {
+const {editorRef, containerRef, init} = Props;
+
+ return (
+ {
+ containerRef.current = el;
+ if (!editorRef.current) {
+ init();
+ }
+ }}
+ >
+ );
+}
diff --git a/website/src/repl/components/UserFacingErrorMessage.jsx b/website/src/repl/components/UserFacingErrorMessage.jsx
new file mode 100644
index 00000000..ec8d8be3
--- /dev/null
+++ b/website/src/repl/components/UserFacingErrorMessage.jsx
@@ -0,0 +1,8 @@
+// type Props = { error: Error | null };
+export default function UserFacingErrorMessage(Props) {
+ const { error } = Props;
+ if (error == null) {
+ return;
+ }
+ return {error.message || 'Unknown Error :-/'}
;
+}
diff --git a/website/src/repl/panel/NumberInput.jsx b/website/src/repl/panel/NumberInput.jsx
new file mode 100644
index 00000000..d6683587
--- /dev/null
+++ b/website/src/repl/panel/NumberInput.jsx
@@ -0,0 +1,62 @@
+function Button(Props) {
+ const { children, onClick } = Props;
+
+ return (
+
+ );
+}
+export default function NumberInput(Props) {
+ const { value = 0, setValue, max, min} = Props;
+
+ return (
+
+
+
setValue(e.target.value)}
+ />
+
+
+ );
+
+
+}
diff --git a/website/src/settings.mjs b/website/src/settings.mjs
index 3f1ca051..c7958912 100644
--- a/website/src/settings.mjs
+++ b/website/src/settings.mjs
@@ -1,7 +1,7 @@
import { persistentMap } from '@nanostores/persistent';
import { useStore } from '@nanostores/react';
import { register } from '@strudel/core';
-import { isUdels } from './repl/util.mjs';
+import { isUdels, } from './repl/util.mjs';
export const defaultAudioDeviceName = 'System Standard';
@@ -25,7 +25,7 @@ export const defaultSettings = {
isZen: false,
soundsFilter: 'all',
patternFilter: 'community',
- panelPosition: 'right',
+ panelPosition: 'right',
userPatterns: '{}',
audioDeviceName: defaultAudioDeviceName,
};
@@ -61,7 +61,7 @@ export function useSettings() {
isFlashEnabled: parseBoolean(state.isFlashEnabled),
isSyncEnabled: isUdels() ? true : parseBoolean(state.isSyncEnabled),
fontSize: Number(state.fontSize),
- panelPosition: state.activeFooter !== '' ? state.panelPosition : 'bottom', // <-- keep this 'bottom' where it is!
+ panelPosition: state.activeFooter !== '' && !isUdels() ? state.panelPosition : 'bottom', // <-- keep this 'bottom' where it is!
userPatterns: userPatterns,
};
}