SearchText + SearchTypeをBookSearchViewModelが受け取り、RelayCommandでIsLoadingをtrueに更新。
OpenLibraryApiServiceが title / author / isbn ルートを選び、HttpClientでJSONを取得。失敗時は例外→ErrorMessage。
ParseSearchResponseがBookモデルを生成し、ObservableCollection
SelectedBookが決まると、FavoriteService.IsFavorite()で星ボタン状態を判断し、RequestNavigateToDetailsTabを発火。
OpenWebPageCommandが発火するとWebPageUrlをセット→MainWindowがWebView2.Navigate()。IsWebViewLoadingでオーバーレイを制御。
AddFavoriteCommandが押されると、%LocalAppData%\\BookSearchApp\\favorites.json に書き込んでRefreshFavoritesCommandでUIへ反映。