import { ControlsPanelEditableSlider } from "./controls-panel-editable-slider";
import * as React from "react";
import {
AnchorGrid,
Checkbox,
CodeTextarea,
RangeInput,
RangeSlider,
Segmented,
Select,
Slider,
Switch,
TabsControl,
TextInput,
Vector,
type ControlChangeMeta,
} from "@repo/ui";
import { CanvasAspectRatioControl } from "./controls-panel-aspect-ratio";
import type { ToolcraftControlSchema } from "../../../schema/types";
import { isToolcraftBuiltInControlSchema } from "../../../schema/control-schema";
import {
getControlMarkerCount,
shouldCommitTextControlOnBlur,
} from "../layout/controls-panel-layout";
import {
asBoolean,
asNumber,
asNumberArray,
asRangeInputValue,
asString,
asVectorPadCoordinateMode,
asVectorPadVariant,
asVectorValue,
} from "../values/controls-panel-values";
export type BasicControlCommit = (
nextValue: unknown,
meta?: ControlChangeMeta,
) => void;
export type BasicControlKeyframeWrap = (args: {
children: React.ReactNode;
control: ToolcraftControlSchema;
disableAction: boolean;
name: string;
providerKey: string;
value: unknown;
}) => React.ReactNode;
export type BasicControlRenderArgs = {
commit: BasicControlCommit;
control: ToolcraftControlSchema;
id: string;
name: string;
usesHeaderKeyframeAction: boolean;
value: unknown;
vectorPadShape: "compact" | "square";
withKeyframeLabelAction: BasicControlKeyframeWrap;
};
export function renderBasicControl({
commit,
control,
id,
name,
usesHeaderKeyframeAction,
value,
vectorPadShape,
withKeyframeLabelAction,
}: BasicControlRenderArgs): React.ReactNode | null {
if (!isToolcraftBuiltInControlSchema(control)) return null;
switch (control.type) {
case "aspectRatio":
return (
);
case "anchorGrid":
return withKeyframeLabelAction({
children: (
["value"]
}
/>
),
control,
disableAction: usesHeaderKeyframeAction,
name,
providerKey: id,
value,
});
case "checkbox":
return (
);
case "code":
return withKeyframeLabelAction({
children: (
),
control,
disableAction: usesHeaderKeyframeAction,
name,
providerKey: id,
value,
});
case "rangeInput": {
const rangeValue = asRangeInputValue(value);
return withKeyframeLabelAction({
children: (
),
control,
disableAction: usesHeaderKeyframeAction,
name,
providerKey: id,
value,
});
}
case "rangeSlider":
return withKeyframeLabelAction({
children: (
control.editableRange ? : (
)
),
control,
disableAction: usesHeaderKeyframeAction,
name,
providerKey: id,
value,
});
case "segmented":
return withKeyframeLabelAction({
children: (
),
control,
disableAction: usesHeaderKeyframeAction,
name,
providerKey: id,
value,
});
case "select":
return (
);
case "tabs":
return (
);
case "slider":
return withKeyframeLabelAction({
children: (
control.editableRange ? : (
)
),
control,
disableAction: usesHeaderKeyframeAction,
name,
providerKey: id,
value,
});
case "switch":
return (
);
case "text":
return withKeyframeLabelAction({
children: (
),
control,
disableAction: usesHeaderKeyframeAction,
name,
providerKey: id,
value,
});
case "vector": {
const vectorValue = asVectorValue(value);
const padVariant = asVectorPadVariant(control.variant);
return withKeyframeLabelAction({
children: (
),
control,
disableAction: usesHeaderKeyframeAction,
name,
providerKey: id,
value,
});
}
default:
return null;
}
}