diff --git a/website/src/repl/panel/Reference.jsx b/website/src/repl/components/panel/Reference.jsx
similarity index 98%
rename from website/src/repl/panel/Reference.jsx
rename to website/src/repl/components/panel/Reference.jsx
index 9483e9c5..04297c0b 100644
--- a/website/src/repl/panel/Reference.jsx
+++ b/website/src/repl/components/panel/Reference.jsx
@@ -1,4 +1,4 @@
-import jsdocJson from '../../../../doc.json';
+import jsdocJson from '../../../../../doc.json';
const visibleFunctions = jsdocJson.docs
.filter(({ name, description }) => name && !name.startsWith('_') && !!description)
.sort((a, b) => /* a.meta.filename.localeCompare(b.meta.filename) + */ a.name.localeCompare(b.name));
diff --git a/website/src/repl/panel/SelectInput.jsx b/website/src/repl/components/panel/SelectInput.jsx
similarity index 100%
rename from website/src/repl/panel/SelectInput.jsx
rename to website/src/repl/components/panel/SelectInput.jsx
diff --git a/website/src/repl/panel/SettingsTab.jsx b/website/src/repl/components/panel/SettingsTab.jsx
similarity index 95%
rename from website/src/repl/panel/SettingsTab.jsx
rename to website/src/repl/components/panel/SettingsTab.jsx
index ae290189..e1d047ea 100644
--- a/website/src/repl/panel/SettingsTab.jsx
+++ b/website/src/repl/components/panel/SettingsTab.jsx
@@ -1,12 +1,13 @@
-import { defaultSettings, settingsMap, useSettings } from '../../settings.mjs';
+import { defaultSettings, settingsMap, useSettings } from '../../../settings.mjs';
import { themes } from '@strudel/codemirror';
+import { isUdels } from '../../util.mjs';
import { ButtonGroup } from './Forms.jsx';
import { AudioDeviceSelector } from './AudioDeviceSelector.jsx';
-function Checkbox({ label, value, onChange }) {
+function Checkbox({ label, value, onChange, disabled = false }) {
return (
);
@@ -96,7 +97,7 @@ export function SettingsTab({ started }) {
panelPosition,
audioDeviceName,
} = useSettings();
-
+ const shouldAlwaysSync = isUdels();
return (
{AudioContext.prototype.setSinkId != null && (
@@ -197,6 +198,7 @@ export function SettingsTab({ started }) {
window.location.reload();
}
}}
+ disabled={shouldAlwaysSync}
value={isSyncEnabled}
/>
diff --git a/website/src/repl/panel/SoundsTab.jsx b/website/src/repl/components/panel/SoundsTab.jsx
similarity index 98%
rename from website/src/repl/panel/SoundsTab.jsx
rename to website/src/repl/components/panel/SoundsTab.jsx
index 9b35d04b..8b7b36a8 100644
--- a/website/src/repl/panel/SoundsTab.jsx
+++ b/website/src/repl/components/panel/SoundsTab.jsx
@@ -2,7 +2,7 @@ import useEvent from '@src/useEvent.mjs';
import { useStore } from '@nanostores/react';
import { getAudioContext, soundMap, connectToDestination } from '@strudel/webaudio';
import React, { useMemo, useRef } from 'react';
-import { settingsMap, useSettings } from '../../settings.mjs';
+import { settingsMap, useSettings } from '../../../settings.mjs';
import { ButtonGroup } from './Forms.jsx';
import ImportSoundsButton from './ImportSoundsButton.jsx';
diff --git a/website/src/repl/panel/WelcomeTab.jsx b/website/src/repl/components/panel/WelcomeTab.jsx
similarity index 100%
rename from website/src/repl/panel/WelcomeTab.jsx
rename to website/src/repl/components/panel/WelcomeTab.jsx
diff --git a/website/src/repl/util.mjs b/website/src/repl/util.mjs
index 26ac45d3..c43c29e6 100644
--- a/website/src/repl/util.mjs
+++ b/website/src/repl/util.mjs
@@ -134,6 +134,10 @@ export async function shareCode(codeToShare) {
export const ReplContext = createContext(null);
+export const isUdels = () => {
+ return window.parent?.location.pathname.includes('udels');
+};
+
export const getAudioDevices = async () => {
await navigator.mediaDevices.getUserMedia({ audio: true });
let mediaDevices = await navigator.mediaDevices.enumerateDevices();
diff --git a/website/src/settings.mjs b/website/src/settings.mjs
index a70c4202..f9b9e281 100644
--- a/website/src/settings.mjs
+++ b/website/src/settings.mjs
@@ -1,6 +1,7 @@
import { persistentMap } from '@nanostores/persistent';
import { useStore } from '@nanostores/react';
import { register } from '@strudel/core';
+import { isUdels } from './repl/util.mjs';
export const defaultAudioDeviceName = 'System Standard';
@@ -29,7 +30,15 @@ export const defaultSettings = {
audioDeviceName: defaultAudioDeviceName,
};
-export const settingsMap = persistentMap('strudel-settings', defaultSettings);
+let search = null;
+if (typeof window !== 'undefined') {
+ search = new URLSearchParams(window.location.search);
+}
+// if running multiple instance in one window, it will use the settings for that instance. else default to normal
+const instance = parseInt(search?.get('instance') ?? '0');
+const settings_key = `strudel-settings${instance > 0 ? instance : ''}`;
+
+export const settingsMap = persistentMap(settings_key, defaultSettings);
const parseBoolean = (booleanlike) => ([true, 'true'].includes(booleanlike) ? true : false);
@@ -54,9 +63,9 @@ export function useSettings() {
isTooltipEnabled: parseBoolean(state.isTooltipEnabled),
isLineWrappingEnabled: parseBoolean(state.isLineWrappingEnabled),
isFlashEnabled: parseBoolean(state.isFlashEnabled),
- isSyncEnabled: parseBoolean(state.isSyncEnabled),
+ 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,
};
}