They are integers representing the area of the picture which is cropped. Most of the complexity for handling those values is found on the client side, where the main thing I have to take care is applying a resize ratio for the cropped area (since the original image may be 5000x5000 for instance and I have to present it in a decently-sized canvas) => values are floats on client-side which are then translated into ints when submitting the form.

I wouldn't put the client-side logic in the ImageCrop model, since it has nothing to do with the current widget I'm using; if I had to create another widget, then that logic will be useless.