You're correct in observing that Nuxt's file-based routing does not always generate nested routes in the way Vue Router's "active link" logic expects. In Nuxt, if you have a catch-all route like /handbook/[...slug].vue, Nuxt generates a flat route structure rather than a parent-child relationship between /handbook and its subpaths. As a result, the default activeClass behavior of <NuxtLink to="/handbook"> will only be applied when the route is exactly /handbook, not for deeper paths like /handbook/foo/bar—because, from the router's perspective, these are not children of /handbook but separate, parallel routes.
This is a known nuance of Nuxt's routing system. The Vue Router docs describe "active link" behavior in the context of nested routes, but Nuxt's catch-all and dynamic routes do not always create such nesting automatically. This means the "active" class will not be applied to the parent link when visiting a catch-all child route, unless you implement custom logic or use the exact prop and/or custom classes to handle this scenario yourself.
This is not exactly a bug, but rather a limitation of how Nuxt's file-based routing maps to Vue Router's expectations for nested routes and active link detection. If you want the parent link to be "active" for all child routes, you may need to manually check the current route and apply the class yourself, or use the activeClass/exactActiveClass props with custom logic as described in the Nuxt and Vue Router documentation: