mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-07 01:56:04 +00:00
97 lines
2.6 KiB
TypeScript
97 lines
2.6 KiB
TypeScript
import {
|
|
HF_COLOR_GRADING_EFFECT_APPLY_DEFAULTS,
|
|
type HfColorGradingEffectKey,
|
|
type NormalizedHfColorGrading,
|
|
} from "@hyperframes/core/color-grading";
|
|
import { FlatSelectRow } from "./propertyPanelFlatSelectRow";
|
|
import { FlatSlider } from "./propertyPanelFlatPrimitives";
|
|
import { FlatToggle } from "./propertyPanelFlatToggle";
|
|
import {
|
|
DEFAULT_EFFECTS,
|
|
type EffectControl,
|
|
type EffectSpec,
|
|
} from "./propertyPanelFlatEffectSpecs";
|
|
|
|
type CommitEffect = (key: HfColorGradingEffectKey, value: number) => void;
|
|
|
|
function defaultValueFor(control: EffectControl, effect: EffectSpec): number {
|
|
return (
|
|
HF_COLOR_GRADING_EFFECT_APPLY_DEFAULTS[effect.key][control.key] ?? DEFAULT_EFFECTS[control.key]
|
|
);
|
|
}
|
|
|
|
function EffectSliderControl({
|
|
control,
|
|
value,
|
|
defaultValue,
|
|
onCommit,
|
|
}: {
|
|
control: Extract<EffectControl, { kind: "slider" }>;
|
|
value: number;
|
|
defaultValue: number;
|
|
onCommit: CommitEffect;
|
|
}) {
|
|
const scale = control.scale ?? 100;
|
|
const sliderValue = value * scale;
|
|
const displayValue = control.format
|
|
? control.format(value)
|
|
: `${Number.isInteger(sliderValue) ? sliderValue : sliderValue.toFixed(1)}${control.unit ?? "%"}`;
|
|
return (
|
|
<FlatSlider
|
|
label={control.label}
|
|
value={sliderValue}
|
|
min={control.min ?? 0}
|
|
max={control.max ?? 100}
|
|
step={control.step ?? 1}
|
|
tier={Math.abs(value - defaultValue) > 0.0001 ? "explicitCustom" : "default"}
|
|
displayValue={displayValue}
|
|
onCommit={(next) => onCommit(control.key, next / scale)}
|
|
onReset={() => onCommit(control.key, defaultValue)}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export function FlatEffectControl({
|
|
control,
|
|
effect,
|
|
effects,
|
|
onCommit,
|
|
}: {
|
|
control: EffectControl;
|
|
effect: EffectSpec;
|
|
effects: NormalizedHfColorGrading["effects"];
|
|
onCommit: CommitEffect;
|
|
}) {
|
|
const value = effects[control.key];
|
|
const defaultValue = defaultValueFor(control, effect);
|
|
if (control.kind === "toggle") {
|
|
return (
|
|
<FlatToggle
|
|
label={control.label}
|
|
checked={value >= 0.5}
|
|
onChange={(next) => onCommit(control.key, next ? 1 : 0)}
|
|
/>
|
|
);
|
|
}
|
|
if (control.kind === "select") {
|
|
return (
|
|
<FlatSelectRow
|
|
label={control.label}
|
|
value={String(Math.round(value))}
|
|
options={control.options}
|
|
tier={value === defaultValue ? "default" : "explicitCustom"}
|
|
onChange={(next) => onCommit(control.key, Number.parseInt(next, 10))}
|
|
onReset={() => onCommit(control.key, defaultValue)}
|
|
/>
|
|
);
|
|
}
|
|
return (
|
|
<EffectSliderControl
|
|
control={control}
|
|
value={value}
|
|
defaultValue={defaultValue}
|
|
onCommit={onCommit}
|
|
/>
|
|
);
|
|
}
|