I call it a camera because I use a 2.5D perspective with a variable angle to the horizon. But it's just zoom and scroll.
Create a global variable zoomLayout (for example) and every tick use the Set scroll layout system action. Assign it the value of your zoomLayot variable. Now the scaling is equal to your variable and you can conditionally use Set scroll layout clamp(zoomLayout, minZoom, maxZoom) to limit the zoom as you wish to the minZoom and maxZoom variables.
Next, create a Camera sprite with the Tween behavior, use Tween(Value) to change the value of the zoomLayout variable with clamp. Voila, you have a camera for cutscenes based on system expressions and behavior. The Sinusoidal curve will give a natural softness of the start and stop, and the Elastic - the shaking of an important event.
To use custom scrolling, you should not have objects with the Scroll To behavior (there are tutorials on how to do this via Lerp). Roughly speaking, the camera sprite is followed by the vievport system action Scroll to position. And the camera follows the hero via lerp buffering. For zoom, lerp can be disabled and Camera Tween X, Y can be used to move the camera.
I remember in C2 there was a plugin called "Magic camera". C3 allows you to reproduce this plugin with more pleasant camera movement using built-in tools.
Controller restrictions are needed if you zoom with the mouse wheel (for example), and scroll after the cursor or the hero.