// packages/components/src/custom-gradient-picker/index.tsx
import { __ } from "@wordpress/i18n";
import AnglePickerControl from "../angle-picker-control/index.js";
import CustomGradientBar from "./gradient-bar/index.js";
import { Flex } from "../flex/index.js";
import SelectControl from "../select-control/index.js";
import { VStack } from "../v-stack/index.js";
import { getGradientAstWithDefault, getLinearGradientRepresentation, getGradientAstWithControlPoints, getStopCssColor } from "./utils.js";
import { serializeGradient } from "./serializer.js";
import { DEFAULT_LINEAR_GRADIENT_ANGLE, HORIZONTAL_GRADIENT_ORIENTATION, GRADIENT_OPTIONS } from "./constants.js";
import { AccessoryWrapper, SelectWrapper } from "./styles/custom-gradient-picker-styles.js";
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
var GradientAnglePicker = ({
  gradientAST,
  hasGradient,
  onChange
}) => {
  var _gradientAST$orientat;
  const angle = (_gradientAST$orientat = gradientAST?.orientation?.value) !== null && _gradientAST$orientat !== void 0 ? _gradientAST$orientat : DEFAULT_LINEAR_GRADIENT_ANGLE;
  const onAngleChange = (newAngle) => {
    onChange(serializeGradient({
      ...gradientAST,
      orientation: {
        type: "angular",
        value: `${newAngle}`
      }
    }));
  };
  return /* @__PURE__ */ _jsx(AnglePickerControl, {
    onChange: onAngleChange,
    value: hasGradient ? angle : ""
  });
};
var GradientTypePicker = ({
  gradientAST,
  hasGradient,
  onChange
}) => {
  const {
    type
  } = gradientAST;
  const onSetLinearGradient = () => {
    onChange(serializeGradient({
      ...gradientAST,
      orientation: gradientAST.orientation ? void 0 : HORIZONTAL_GRADIENT_ORIENTATION,
      type: "linear-gradient"
    }));
  };
  const onSetRadialGradient = () => {
    const {
      orientation,
      ...restGradientAST
    } = gradientAST;
    onChange(serializeGradient({
      ...restGradientAST,
      type: "radial-gradient"
    }));
  };
  const handleOnChange = (next) => {
    if (next === "linear-gradient") {
      onSetLinearGradient();
    }
    if (next === "radial-gradient") {
      onSetRadialGradient();
    }
  };
  return /* @__PURE__ */ _jsx(SelectControl, {
    className: "components-custom-gradient-picker__type-picker",
    label: __("Type"),
    labelPosition: "top",
    onChange: handleOnChange,
    options: GRADIENT_OPTIONS,
    size: "__unstable-large",
    value: hasGradient ? type : void 0
  });
};
function CustomGradientPicker({
  value,
  onChange,
  enableAlpha = true,
  __experimentalIsRenderedInSidebar = false
}) {
  const {
    gradientAST,
    hasGradient
  } = getGradientAstWithDefault(value);
  const background = getLinearGradientRepresentation(gradientAST);
  const controlPoints = gradientAST.colorStops.map((colorStop) => {
    return {
      color: getStopCssColor(colorStop),
      // Although it's already been checked by `hasUnsupportedLength` in `getGradientAstWithDefault`,
      // TypeScript doesn't know that `colorStop.length` is not undefined here.
      // @ts-expect-error
      position: parseInt(colorStop.length.value)
    };
  });
  return /* @__PURE__ */ _jsxs(VStack, {
    spacing: 4,
    className: "components-custom-gradient-picker",
    children: [/* @__PURE__ */ _jsx(CustomGradientBar, {
      __experimentalIsRenderedInSidebar,
      disableAlpha: !enableAlpha,
      background,
      hasGradient,
      value: controlPoints,
      onChange: (newControlPoints) => {
        onChange(serializeGradient(getGradientAstWithControlPoints(gradientAST, newControlPoints)));
      }
    }), /* @__PURE__ */ _jsxs(Flex, {
      gap: 3,
      className: "components-custom-gradient-picker__ui-line",
      children: [/* @__PURE__ */ _jsx(SelectWrapper, {
        children: /* @__PURE__ */ _jsx(GradientTypePicker, {
          gradientAST,
          hasGradient,
          onChange
        })
      }), /* @__PURE__ */ _jsx(AccessoryWrapper, {
        children: gradientAST.type === "linear-gradient" && /* @__PURE__ */ _jsx(GradientAnglePicker, {
          gradientAST,
          hasGradient,
          onChange
        })
      })]
    })]
  });
}
var custom_gradient_picker_default = CustomGradientPicker;
export {
  CustomGradientPicker,
  custom_gradient_picker_default as default
};
//# sourceMappingURL=index.js.map
