diff --git a/.yarn/versions/bbd33299.yml b/.yarn/versions/bbd33299.yml
new file mode 100644
index 00000000..5b878624
--- /dev/null
+++ b/.yarn/versions/bbd33299.yml
@@ -0,0 +1,2 @@
+releases:
+ beatmapper: minor
diff --git a/src/components/app/forms/settings/controls.tsx b/src/components/app/forms/settings/controls.tsx
index ebdee8f2..c1a11ba0 100644
--- a/src/components/app/forms/settings/controls.tsx
+++ b/src/components/app/forms/settings/controls.tsx
@@ -1,9 +1,29 @@
+import { createListCollection } from "@ark-ui/react/collection";
+import { toPascalCase } from "@std/text/to-pascal-case";
+
+import { Field, RadioGroup } from "$/components/ui/compositions";
+import { updateObstaclePlacementMode } from "$/store/actions";
+import { useAppDispatch, useAppSelector } from "$/store/hooks";
+import { selectUserObstaclePlacementMode } from "$/store/selectors";
+import { ObstaclePlacementMode } from "$/types";
import { Stack, Wrap } from "$:styled-system/jsx";
+const OBSTACLE_PLACEMENT_MODE_COLLECTION = createListCollection({
+ items: [ObstaclePlacementMode.LEGACY, ObstaclePlacementMode.MODERN, ObstaclePlacementMode.VISUAL],
+ itemToString: toPascalCase,
+});
+
function AppControlsSettings() {
+ const dispatch = useAppDispatch();
+ const obstaclePlacementMode = useAppSelector(selectUserObstaclePlacementMode);
+
return (
- Soon™
+
+
+ dispatch(updateObstaclePlacementMode({ value: x.value as ObstaclePlacementMode }))} />
+
+
);
}
diff --git a/src/components/app/forms/settings/index.tsx b/src/components/app/forms/settings/index.tsx
index 3cb653b6..9ec7d2eb 100644
--- a/src/components/app/forms/settings/index.tsx
+++ b/src/components/app/forms/settings/index.tsx
@@ -17,7 +17,6 @@ const collection = createListCollection({
{ value: "advanced", label: "Advanced", render: () => },
//
],
- isItemDisabled: (item) => !["user", "graphics", "audio", "advanced"].includes(item.value),
});
function AppSettings() {
diff --git a/src/components/app/templates/editor/action-panel-groups/grid.tsx b/src/components/app/templates/editor/action-panel-groups/grid.tsx
index 45b3f366..6d253ed1 100644
--- a/src/components/app/templates/editor/action-panel-groups/grid.tsx
+++ b/src/components/app/templates/editor/action-panel-groups/grid.tsx
@@ -16,7 +16,7 @@ function GridActionPanelGroup({ finishTweakingGrid }: Props) {
const { sid } = useParams({ from: "/_/edit/$sid/$bid/_" });
const dispatch = useAppDispatch();
- const { numRows, numCols, colWidth, rowHeight } = useAppSelector((state) => selectGridSize(state, sid));
+ const { numRows, numCols, colWidth, rowHeight, colOffset, rowOffset } = useAppSelector((state) => selectGridSize(state, sid));
const { trigger: triggerSaveGridPreset } = usePrompt({
title: "Save Grid Preset",
@@ -45,6 +45,12 @@ function GridActionPanelGroup({ finishTweakingGrid }: Props) {
ev.stopPropagation()} onValueChange={(details) => sid && dispatch(updateGridSize({ songId: sid, changes: { rowHeight: details.valueAsNumber } }))} />
+
+ ev.stopPropagation()} onValueChange={(details) => sid && dispatch(updateGridSize({ songId: sid, changes: { colOffset: details.valueAsNumber } }))} />
+
+
+ ev.stopPropagation()} onValueChange={(details) => sid && dispatch(updateGridSize({ songId: sid, changes: { rowOffset: details.valueAsNumber } }))} />
+