   @getter
     cacheable: -> @getHasChildren()
 
-  defaultTo = point "bottomLeft"
+  defaultFrom = new PointLayout()
+  defaultTo = new PointLayout hh: 1
   @drawProperty
-    from:   default: "topLeft", preprocess: (v) -> point v
-    to:     default: null, preprocess: (v) -> v? && point v
+    # from:   default: "topLeft", preprocess: (v) -> point v
+    # to:     default: null, preprocess: (v) -> v? && point v
+    from: preprocess: (v, oldValue) -> !v || if v instanceof PointLayoutBase then v else new PointLayout v, oldValue
+    to:   preprocess: (v, oldValue) -> !v || if v instanceof PointLayoutBase then v else new PointLayout v, oldValue
+
     colors: default: null
     gradientRadius: default: null
     shadow:


      # I don't love this solution to scaling the gradient from/to, but it's acceptable for now.
      # It creates two new objects, which is unfortunate. It also mutates an object which should be immutable.
      drawOptions.from   = _from.mul _currentSize
      drawOptions.to     = _to.mul _currentSize


    if _colors
      {_from, _to, _gradientRadius, _currentSize} = @
      _from ||= defaultFrom

      drawOptions.colors = _colors
      if _gradientRadius?
        _to ||= _from
