dnf repoquery --whatdepends gtk4-0:4.1.2-1.fc35.x86_64
breeze-gtk-gtk4-0:5.21.3-1.fc35.noarch fcitx5-gtk4-0:5.0.4-1.fc35.x86_64 gnome-chess-0:40~alpha-1.fc35.x86_64 gnome-extensions-app-0:40.0~rc-1.fc35.x86_64 gnome-shell-0:40.0-1.fc35.x86_64 gtk4-devel-0:4.1.2-1.fc35.x86_64 ibus-gtk4-0:1.5.24-3.fc35.x86_64
dnf repoquery --whatdepends gtk3-0:3.24.27-1.fc35.x86_64
... everything else (100's of packages)
Software/package version numbers are just a marketing name. It's the ABI version number on the library (e.g. libgtk4.so.1 vs libgtk4.so.0) that needs to be changed if functions or parameters to functions in the original ABI in the older libgtk4.so.0 library are modified or deleted. It's very common to have two libraries of the same name being used side-by-side with some applications compiled against a newer ABI, and other applications compiled against an older ABI.
The problem with Gnome development is that library ABIs are just one of many interfaces used. There are also GSettings/dconf interfaces, D-Bus interfaces, file formats, etc on top of the usual conflicts in package dependencies (e.g. two packages wanting to write two different unversioned files to disk).
This is so frustrating! They never stop! I don't care for any of the new features, I just want things to continue working!
And they definitely did break from 3.0 to 4.0 as I experienced by simply trying to get a sample application from the docs running, and failed to.