// Do not edit. This file is generated.
// MoonBit type: SVGTransform
// Specifications: SVG.idl

///|
/// [SVGTransform](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform)
#external
pub type SVGTransform

///|
pub impl TJsValue for SVGTransform with to_js(self : SVGTransform) -> JsValue = "%identity"

///|
pub impl FromJsAny for SVGTransform with from_js_any(value : JsAny) -> SVGTransform = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// Prefer `try_into()` for checked downcasts.
#deprecated("Use unsafe_into or try_into instead")
pub fn[T : TSVGTransform] SVGTransform::into(self : SVGTransform) -> T = "%identity"

///|
/// Unchecked downcast — no runtime type check is performed.
/// WARNING: If the underlying JS value is not of type T, this will silently
/// produce a value with incorrect type, leading to undefined behavior.
pub fn[T : TSVGTransform] SVGTransform::unsafe_into(self : SVGTransform) -> T = "%identity"

///|
pub impl HasConstructor for SVGTransform with constructor_name() {
  "SVGTransform"
}

///|
/// Checked downcast — returns None if the JS value is not an instance of T.
pub fn[T : TSVGTransform + HasConstructor] SVGTransform::try_into(
  self : SVGTransform,
) -> T? {
  if js_instanceof(TJsValue::to_js(self), T::constructor_name()) {
    Some(self.unsafe_into())
  } else {
    None
  }
}

///|
pub impl TSVGTransform for SVGTransform

///|
pub const SVG_TRANSFORM_SVG_TRANSFORM_UNKNOWN : UInt = 0

///|
pub const SVG_TRANSFORM_SVG_TRANSFORM_MATRIX : UInt = 1

///|
pub const SVG_TRANSFORM_SVG_TRANSFORM_TRANSLATE : UInt = 2

///|
pub const SVG_TRANSFORM_SVG_TRANSFORM_SCALE : UInt = 3

///|
pub const SVG_TRANSFORM_SVG_TRANSFORM_ROTATE : UInt = 4

///|
pub const SVG_TRANSFORM_SVG_TRANSFORM_SKEWX : UInt = 5

///|
pub const SVG_TRANSFORM_SVG_TRANSFORM_SKEWY : UInt = 6

///|
/// [SVGTransform](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform) interface.
pub trait TSVGTransform: TJsValue {
  type_(self : Self) -> UInt = _
  matrix(self : Self) -> DOMMatrix = _
  angle(self : Self) -> Float = _
  set_matrix(self : Self, matrix? : DOMMatrix2DInit) -> Unit = _
  set_translate(self : Self, tx : Float, ty : Float) -> Unit = _
  set_scale(self : Self, sx : Float, sy : Float) -> Unit = _
  set_rotate(self : Self, angle : Float, cx : Float, cy : Float) -> Unit = _
  set_skew_x(self : Self, angle : Float) -> Unit = _
  set_skew_y(self : Self, angle : Float) -> Unit = _
}

///|
/// [SVGTransform.type](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/type)
impl TSVGTransform with type_(self : Self) -> UInt {
  svg_transform_type_ffi(TJsValue::to_js(self))
}

///|
/// [SVGTransform.matrix](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/matrix)
impl TSVGTransform with matrix(self : Self) -> DOMMatrix {
  svg_transform_matrix_ffi(TJsValue::to_js(self))
}

///|
/// [SVGTransform.angle](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/angle)
impl TSVGTransform with angle(self : Self) -> Float {
  svg_transform_angle_ffi(TJsValue::to_js(self))
}

///|
/// [SVGTransform.setMatrix](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/setMatrix)
impl TSVGTransform with set_matrix(self : Self, matrix? : DOMMatrix2DInit) -> Unit {
  svg_transform_set_matrix_ffi(TJsValue::to_js(self), opt_to_js(matrix))
}

///|
/// [SVGTransform.setTranslate](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/setTranslate)
impl TSVGTransform with set_translate(self : Self, tx : Float, ty : Float) -> Unit {
  svg_transform_set_translate_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(tx),
    TJsValue::to_js(ty),
  )
}

///|
/// [SVGTransform.setScale](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/setScale)
impl TSVGTransform with set_scale(self : Self, sx : Float, sy : Float) -> Unit {
  svg_transform_set_scale_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(sx),
    TJsValue::to_js(sy),
  )
}

///|
/// [SVGTransform.setRotate](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/setRotate)
impl TSVGTransform with set_rotate(
  self : Self,
  angle : Float,
  cx : Float,
  cy : Float,
) -> Unit {
  svg_transform_set_rotate_ffi(
    TJsValue::to_js(self),
    TJsValue::to_js(angle),
    TJsValue::to_js(cx),
    TJsValue::to_js(cy),
  )
}

///|
/// [SVGTransform.setSkewX](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/setSkewX)
impl TSVGTransform with set_skew_x(self : Self, angle : Float) -> Unit {
  svg_transform_set_skew_x_ffi(TJsValue::to_js(self), TJsValue::to_js(angle))
}

///|
/// [SVGTransform.setSkewY](https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform/setSkewY)
impl TSVGTransform with set_skew_y(self : Self, angle : Float) -> Unit {
  svg_transform_set_skew_y_ffi(TJsValue::to_js(self), TJsValue::to_js(angle))
}

///|
#cfg(target="js")
extern "js" fn svg_transform_type_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.type"

///|
#cfg(target="js")
fn svg_transform_type_ffi(obj : JsValue) -> UInt {
  svg_transform_type_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn svg_transform_matrix_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.matrix"

///|
#cfg(target="js")
fn svg_transform_matrix_ffi(obj : JsValue) -> DOMMatrix {
  svg_transform_matrix_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn svg_transform_angle_ffi_js(obj : JsValue) -> JsValue = "(obj) => obj.angle"

///|
#cfg(target="js")
fn svg_transform_angle_ffi(obj : JsValue) -> Float {
  svg_transform_angle_ffi_js(obj).unsafe_cast()
}

///|
#cfg(target="js")
extern "js" fn svg_transform_set_matrix_ffi(
  obj : JsValue,
  matrix : JsValue,
) -> Unit = "(obj, matrix) => obj.setMatrix(matrix)"

///|
#cfg(target="js")
extern "js" fn svg_transform_set_translate_ffi(
  obj : JsValue,
  tx : JsValue,
  ty : JsValue,
) -> Unit = "(obj, tx, ty) => obj.setTranslate(tx, ty)"

///|
#cfg(target="js")
extern "js" fn svg_transform_set_scale_ffi(
  obj : JsValue,
  sx : JsValue,
  sy : JsValue,
) -> Unit = "(obj, sx, sy) => obj.setScale(sx, sy)"

///|
#cfg(target="js")
extern "js" fn svg_transform_set_rotate_ffi(
  obj : JsValue,
  angle : JsValue,
  cx : JsValue,
  cy : JsValue,
) -> Unit = "(obj, angle, cx, cy) => obj.setRotate(angle, cx, cy)"

///|
#cfg(target="js")
extern "js" fn svg_transform_set_skew_x_ffi(
  obj : JsValue,
  angle : JsValue,
) -> Unit = "(obj, angle) => obj.setSkewX(angle)"

///|
#cfg(target="js")
extern "js" fn svg_transform_set_skew_y_ffi(
  obj : JsValue,
  angle : JsValue,
) -> Unit = "(obj, angle) => obj.setSkewY(angle)"

///|
#cfg(target="wasm-gc")
fn svg_transform_type_ffi(obj : JsValue) -> UInt = "webapi_SVGTransform" "get_type"

///|
#cfg(target="wasm-gc")
fn svg_transform_matrix_ffi(obj : JsValue) -> DOMMatrix = "webapi_SVGTransform" "get_matrix"

///|
#cfg(target="wasm-gc")
fn svg_transform_angle_ffi(obj : JsValue) -> Float = "webapi_SVGTransform" "get_angle"

///|
#cfg(target="wasm-gc")
fn svg_transform_set_matrix_ffi(obj : JsValue, matrix : JsValue) -> Unit = "webapi_SVGTransform" "setMatrix"

///|
#cfg(target="wasm-gc")
fn svg_transform_set_translate_ffi(
  obj : JsValue,
  tx : JsValue,
  ty : JsValue,
) -> Unit = "webapi_SVGTransform" "setTranslate"

///|
#cfg(target="wasm-gc")
fn svg_transform_set_scale_ffi(
  obj : JsValue,
  sx : JsValue,
  sy : JsValue,
) -> Unit = "webapi_SVGTransform" "setScale"

///|
#cfg(target="wasm-gc")
fn svg_transform_set_rotate_ffi(
  obj : JsValue,
  angle : JsValue,
  cx : JsValue,
  cy : JsValue,
) -> Unit = "webapi_SVGTransform" "setRotate"

///|
#cfg(target="wasm-gc")
fn svg_transform_set_skew_x_ffi(obj : JsValue, angle : JsValue) -> Unit = "webapi_SVGTransform" "setSkewX"

///|
#cfg(target="wasm-gc")
fn svg_transform_set_skew_y_ffi(obj : JsValue, angle : JsValue) -> Unit = "webapi_SVGTransform" "setSkewY"