Semantic versioning is about the API that the versioned entity exposes. Assuming that there are no incompatible API changes or addition of functionality in a backwards compatible manner, I would expect that shared-component-b would have its patch version incremented by 1 - that is, it would go from 2.1.0 to 2.1.1. This would indicate to consumers (in web-app)...
Validation in the UI is designed to illicit corrections from the user.
Human readable explanations
UI alert indicators
Validation in the backend is designed to prevent nasty security issues.
While they both do "validate" the document:
their intentions are quite different: online vs. offline, ...
Its fairly normal to have your webpages and js served by the same webapplication which also hosts your api code.
This simple approach has some upsides. You dont have to do anything special with cross site scripting controls, code and ui are in the same place etc.
And also some downsides. you can't deploy new versions of the api separately to the UI and ...
I would delay and defer this decision by designing an API for your system to request images be persisted through. Hang a plugin off of that that knows how to work with whatever you decide to use. That can be a local filesystem, ftp server, database, cloud, or whatever. Keep as much of your code as you can from knowing which you do.
I would encourage you to delay and defer making this design decision for as long as you can.
Make this decision early and it can weave it's way into much of your code and become entrenched. Better to push it out to a plugin and let the plugin decide which it's going to use. All the rest of your code cares about is that it can persist. How isn't important. ...