DragDetector Constraint Question

I currently have a DragDetector on a part within a model. After looking at the DragDetector documentation and somewhat translating this tutorial, this block of code seems complete.

My goal is to have the limits be the canvas below it (the gray part). I’ve gotten the math down on clamping the proposed motion’s position. What would I put to return the CFrame value?

In this video, I show the proposed motion printed aside the clamped values, which shows that the math works, and the “Allowed Motion” stops at the bounds of the canvas.
https://i.gyazo.com/9f801afc0eba88563229c974a844c026.mp4

local function constraint(proposedMotion: CFrame, canvas: BasePart, gridPart: BasePart, startPartPosition)
	if startPartPosition == nil then
		return proposedMotion
	end
	-- GET CANVAS SIZE --
	local canvasSize = canvas.Size
	
	-- BUILD CFRAME --
	local back = Vector3.new(0, -1, 0)
	local top = Vector3.new(0, 0, -1)
	local right = Vector3.new(-1, 0, 0)
	
	-- CONVERT TO WORLD SPACE --
	local cf = canvas.CFrame * CFrame.fromMatrix(-back*canvasSize/2,right,top,back)
	local size = Vector2.new((canvasSize * right).Magnitude, (canvasSize * top).Magnitude)
	
	-- GET MODEL SIZE --
	local modelSize = CFrame.fromEulerAnglesYXZ(0,0,0) * gridPart.Size
	modelSize = Vector3.new(math.abs(modelSize.X), math.abs(modelSize.Y), math.abs(modelSize.Z))
	
	-- GET THE MODEL'S BOUNDS --
	local objectPosition = cf:PointToObjectSpace(gridPart.Position)
	local size2 = (size - Vector2.new(modelSize.X, modelSize.Z))/2
	
	-- CONSTRAIN USING CLAMP --
	local x = math.clamp(objectPosition.X, -size2.X, size2.X)
	local z = math.clamp(objectPosition.Y, -size2.Y, size2.Y)
	
	local worldPosition = cf * CFrame.new(x,z,-modelSize.y/2) * CFrame.Angles(-math.pi/2,0,0)
	local newRefTranslation = worldPosition.Position - startPartPosition
	
	print("Proposed Motion: "..tostring(proposedMotion.Position))
	print("--------")
	print("Allowed Motion: "..tostring(newRefTranslation))
	print("--------")
	
	return proposedMotion -- What should I return here? <-
end

Some return values I’ve tried.

return CFrame.new(newRefTranslation) * proposedMotion.Rotation -- Doesn't move

return proposedMotion.Rotation + newRefTranslation -- Doesn't move

Thank you :pray:t6: