[{"data":1,"prerenderedAt":577},["ShallowReactive",2],{"navigation_docs":3,"-frontend-components":100,"-frontend-components-surround":572},[4,35,80,90],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Project Structure","\u002Fgetting-started\u002Fproject-structure","1.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Backend Server","\u002Fgetting-started\u002Fbackend","1.getting-started\u002F6.backend","i-lucide-server",{"title":31,"path":32,"stem":33,"icon":34},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F8.troubleshooting","i-lucide-wrench",{"title":36,"icon":6,"path":37,"stem":38,"children":39,"page":6},"API","\u002Fapi","2.api",[40,45,50,55,60,65,70,75],{"title":41,"path":42,"stem":43,"icon":44},"API Overview","\u002Fapi\u002Foverview","2.api\u002F1.overview","i-lucide-zap",{"title":46,"path":47,"stem":48,"icon":49},"TMDB Integration","\u002Fapi\u002Ftmdb-proxy","2.api\u002F2.tmdb-proxy","i-si-movie-line",{"title":51,"path":52,"stem":53,"icon":54},"Watched and My List APIs","\u002Fapi\u002Fwatched-movies","2.api\u002F3.watched-movies","i-lucide-eye",{"title":56,"path":57,"stem":58,"icon":59},"Recommendation Generation","\u002Fapi\u002Fgemini-recommendations","2.api\u002F4.gemini-recommendations","i-lucide-sparkles",{"title":61,"path":62,"stem":63,"icon":64},"Movie Search API","\u002Fapi\u002Fmovie-search","2.api\u002F5.movie-search","i-lucide-search",{"title":66,"path":67,"stem":68,"icon":69},"TMDB Import","\u002Fapi\u002Ftmdb-import","2.api\u002F6.tmdb-import","i-lucide-database",{"title":71,"path":72,"stem":73,"icon":74},"Movie Details & Caching","\u002Fapi\u002Fmovie-details","2.api\u002F7.movie-details","i-lucide-film",{"title":76,"path":77,"stem":78,"icon":79},"Recommendations (Cached)","\u002Fapi\u002Frecommendations-cache","2.api\u002F8.recommendations-cache","i-lucide-brain",{"title":81,"icon":6,"path":82,"stem":83,"children":84,"page":6},"Frontend","\u002Ffrontend","4.frontend",[85],{"title":86,"path":87,"stem":88,"icon":89},"Components","\u002Ffrontend\u002Fcomponents","4.frontend\u002F1.components","i-lucide-layout",{"title":91,"icon":6,"path":92,"stem":93,"children":94,"page":6},"Reference","\u002Freference","5.reference",[95],{"title":96,"path":97,"stem":98,"icon":99},"Rate Limiting","\u002Freference\u002Frate-limiting","5.reference\u002F2.rate-limiting","i-lucide-shield",{"id":101,"title":86,"body":102,"description":565,"extension":566,"links":567,"meta":568,"navigation":569,"path":87,"seo":570,"stem":88,"__hash__":571},"docs\u002F4.frontend\u002F1.components.md",{"type":103,"value":104,"toc":537},"minimark",[105,110,119,124,127,162,166,169,186,190,193,211,215,218,235,239,242,262,266,269,272,278,344,348,354,358,361,384,388,391,408,412,415,428,432,435,446,450,453,470,474,477,485,489,492,496,500,503,507,513,527,531],[106,107,109],"h2",{"id":108},"pages","Pages",[111,112,113,114,118],"p",{},"Vue pages in ",[115,116,117],"code",{},"app\u002Fpages\u002F",":",[120,121,123],"h3",{"id":122},"indexvue","index.vue",[111,125,126],{},"Home recommendation feed. Features:",[128,129,130,137,143,153,159],"ul",{},[131,132,133,134],"li",{},"Recommendation cards from ",[115,135,136],{},"GET \u002Fapi\u002Frecommend",[131,138,139,140],{},"Recommendation quota reads from ",[115,141,142],{},"GET \u002Fapi\u002Frecommend\u002Fquota",[131,144,145,148,149,152],{},[115,146,147],{},"refresh"," and ",[115,150,151],{},"getNew"," recommendation modes",[131,154,155,156],{},"Detail hydration through ",[115,157,158],{},"GET \u002Fapi\u002Fmovies\u002F:id",[131,160,161],{},"Auth-gated watched and My List actions",[120,163,165],{"id":164},"searchvue","search.vue",[111,167,168],{},"Search and browse page. Features:",[128,170,171,177,180,183],{},[131,172,173,174],{},"Debounced title search via ",[115,175,176],{},"GET \u002Fapi\u002Fmovies\u002Fsearch",[131,178,179],{},"Client-side genre, rating, sort, watched, and My List filters",[131,181,182],{},"Movie details modal",[131,184,185],{},"Add\u002Fremove watched and My List actions with auth prompt fallback",[120,187,189],{"id":188},"watchedvue","watched.vue",[111,191,192],{},"Watched history with filtering tools. Features:",[128,194,195,198,201,208],{},[131,196,197],{},"Search, genre, and runtime filters",[131,199,200],{},"Multiple sort modes",[131,202,203,204,207],{},"Remove watched movies (",[115,205,206],{},"DELETE \u002Fapi\u002Fwatched",")",[131,209,210],{},"Metadata backfill for old entries missing genres\u002Fruntime",[120,212,214],{"id":213},"mylistvue","mylist.vue",[111,216,217],{},"Saved movie list page. Features:",[128,219,220,226,232],{},[131,221,222,223],{},"Reads from ",[115,224,225],{},"GET \u002Fapi\u002Fmylist",[131,227,228,229],{},"Removes items through ",[115,230,231],{},"DELETE \u002Fapi\u002Fmylist",[131,233,234],{},"Opens cached movie details",[120,236,238],{"id":237},"profilevue","profile.vue",[111,240,241],{},"Profile\u002Fauth page. Displays:",[128,243,244,250,256],{},[131,245,246,249],{},[115,247,248],{},"AuthForm"," for unauthenticated users",[131,251,252,255],{},[115,253,254],{},"UserProfileHeader"," for authenticated users",[131,257,258,261],{},[115,259,260],{},"WatchedMoviesGrid"," with modal details",[120,263,265],{"id":264},"reset-passwordvue","reset-password.vue",[111,267,268],{},"Password reset flow page for Supabase password recovery links.",[106,270,86],{"id":271},"components",[111,273,274,275,118],{},"Reusable Vue components in ",[115,276,277],{},"app\u002Fcomponents\u002F",[128,279,280,289,295,301,307,313,319,325,331],{},[131,281,282,285,286],{},[115,283,284],{},"AuthForm.vue"," - Login\u002Fsignup\u002Freset entry UI with hCaptcha and server-backed signup through ",[115,287,288],{},"\u002Fapi\u002Fauth\u002Fsignup",[131,290,291,294],{},[115,292,293],{},"MovieCard.vue"," - Swipe-style recommendation card",[131,296,297,300],{},[115,298,299],{},"MovieSearchCard.vue"," - Search result card",[131,302,303,306],{},[115,304,305],{},"MovieDetails.vue"," - Modal with enriched movie metadata",[131,308,309,312],{},[115,310,311],{},"WatchedMoviesGrid.vue"," - Profile watched grid",[131,314,315,318],{},[115,316,317],{},"LoginPromptModal.vue"," - Auth-required prompt when trying to save while logged out",[131,320,321,324],{},[115,322,323],{},"BottomNav.vue"," - Main bottom navigation",[131,326,327,330],{},[115,328,329],{},"UserProfileHeader.vue"," - Profile header summary",[131,332,333,334,337,338,337,341,207],{},"Skeleton components for loading states (",[115,335,336],{},"SkeletonMovieCard",", ",[115,339,340],{},"SkeletonSearchCard",[115,342,343],{},"SkeletonWatchedGrid",[106,345,347],{"id":346},"composables","Composables",[111,349,350,351,118],{},"Shared logic in ",[115,352,353],{},"app\u002Fcomposables\u002F",[120,355,357],{"id":356},"useauthts","useAuth.ts",[111,359,360],{},"Session and authentication lifecycle:",[128,362,363,366,372,375,378,381],{},[131,364,365],{},"login\u002Fsignup\u002Flogout",[131,367,368,369,371],{},"signup posts to ",[115,370,288],{}," instead of calling Supabase signup directly from the browser",[131,373,374],{},"Google OAuth sign-in",[131,376,377],{},"reset\u002Fupdate password",[131,379,380],{},"existing-email signup responses switch the UI back to login while preserving the email field",[131,382,383],{},"watched-state sync after auth state changes",[120,385,387],{"id":386},"usewatchedmoviests","useWatchedMovies.ts",[111,389,390],{},"Watched movie state management:",[128,392,393,396,402],{},[131,394,395],{},"local watched state",[131,397,398,399],{},"pending watched queue in ",[115,400,401],{},"localStorage",[131,403,404,405],{},"sync\u002Fadd\u002Fremove through ",[115,406,407],{},"\u002Fapi\u002Fwatched",[120,409,411],{"id":410},"usemylistts","useMyList.ts",[111,413,414],{},"My List state management:",[128,416,417,423],{},[131,418,419,420],{},"load current saved list from ",[115,421,422],{},"\u002Fapi\u002Fmylist",[131,424,425,426],{},"add and remove TMDB IDs through ",[115,427,422],{},[120,429,431],{"id":430},"userecommendationquotats","useRecommendationQuota.ts",[111,433,434],{},"Recommendation quota helper:",[128,436,437,443],{},[131,438,439,440],{},"load the current per-user daily quota from ",[115,441,442],{},"\u002Fapi\u002Frecommend\u002Fquota",[131,444,445],{},"reset to the default limit while signed out",[120,447,449],{"id":448},"usewatchedfiltersts","useWatchedFilters.ts",[111,451,452],{},"Filtering and sorting logic for the watched page:",[128,454,455,458,461,464,467],{},[131,456,457],{},"title search",[131,459,460],{},"genre filters",[131,462,463],{},"runtime buckets",[131,465,466],{},"sort options",[131,468,469],{},"metadata enrichment for missing genres\u002Fruntime",[120,471,473],{"id":472},"usemoviedetailsts","useMovieDetails.ts",[111,475,476],{},"Movie data helper:",[128,478,479],{},[131,480,481,482,207],{},"cached movie detail fetch (",[115,483,484],{},"\u002Fapi\u002Fmovies\u002F:id",[120,486,488],{"id":487},"usesupabasets","useSupabase.ts",[111,490,491],{},"Typed accessor for the Supabase client injected by the Nuxt plugin.",[106,493,495],{"id":494},"layout","Layout",[120,497,499],{"id":498},"defaultvue","default.vue",[111,501,502],{},"Main app shell with bottom navigation and page slot.",[106,504,506],{"id":505},"types","Types",[111,508,509,510,118],{},"TypeScript definitions in ",[115,511,512],{},"app\u002Ftypes\u002F",[128,514,515,521],{},[131,516,517,520],{},[115,518,519],{},"movie.ts"," - TMDB response models, app movie models, watched\u002Fpending movie types",[131,522,523,526],{},[115,524,525],{},"youtube.ts"," - YouTube-related response typing used by the UI",[106,528,530],{"id":529},"app-entry","App Entry",[111,532,533,536],{},[115,534,535],{},"app.vue"," initializes auth and watched synchronization at application startup.",{"title":538,"searchDepth":539,"depth":539,"links":540},"",2,[541,550,551,560,563,564],{"id":108,"depth":539,"text":109,"children":542},[543,545,546,547,548,549],{"id":122,"depth":544,"text":123},3,{"id":164,"depth":544,"text":165},{"id":188,"depth":544,"text":189},{"id":213,"depth":544,"text":214},{"id":237,"depth":544,"text":238},{"id":264,"depth":544,"text":265},{"id":271,"depth":539,"text":86},{"id":346,"depth":539,"text":347,"children":552},[553,554,555,556,557,558,559],{"id":356,"depth":544,"text":357},{"id":386,"depth":544,"text":387},{"id":410,"depth":544,"text":411},{"id":430,"depth":544,"text":431},{"id":448,"depth":544,"text":449},{"id":472,"depth":544,"text":473},{"id":487,"depth":544,"text":488},{"id":494,"depth":539,"text":495,"children":561},[562],{"id":498,"depth":544,"text":499},{"id":505,"depth":539,"text":506},{"id":529,"depth":539,"text":530},"Vue components and pages structure","md",null,{},{"icon":89},{"title":86,"description":565},"EhknZhAyGzApzcQLFDe7cnSt1VGGGgIWyY2SQr5t0W0",[573,575],{"title":76,"path":77,"stem":78,"description":574,"icon":79,"children":-1},"Main recommendation endpoint with per-user Supabase caching",{"title":96,"path":97,"stem":98,"description":576,"icon":99,"children":-1},"Rate limiting for TMDB-backed requests and recommendation generation",1782138811119]