[{"data":1,"prerenderedAt":724},["ShallowReactive",2],{"navigation":3,"/docs/recipes/protected-dashboard":186,"/docs/recipes/protected-dashboard-surround":719},[4],{"title":5,"path":6,"stem":7,"children":8,"page":39},"Docs","/docs","docs",[9,40,60,78,100,114,158],{"title":10,"path":11,"stem":12,"children":13,"page":39},"Guide","/docs/guide","docs/1.guide",[14,19,24,29,34],{"title":15,"path":16,"stem":17,"icon":18},"Getting Started","/docs/guide/get-started","docs/1.guide/1.get-started","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Basics","/docs/guide/basics","docs/1.guide/2.basics","i-lucide-book-open",{"title":25,"path":26,"stem":27,"icon":28},"Authentication","/docs/guide/auth","docs/1.guide/3.auth","i-lucide-shield-check",{"title":30,"path":31,"stem":32,"icon":33},"Permissions","/docs/guide/permissions","docs/1.guide/4.permissions","i-lucide-shield",{"title":35,"path":36,"stem":37,"icon":38},"Core Concepts","/docs/guide/concepts","docs/1.guide/5.concepts","i-lucide-lightbulb",false,{"title":41,"path":42,"stem":43,"children":44,"page":39},"Data Fetching","/docs/data-fetching","docs/2.data-fetching",[45,50,55],{"title":46,"path":47,"stem":48,"icon":49},"Fetching Data","/docs/data-fetching/queries","docs/2.data-fetching/1.queries","i-lucide-database",{"title":51,"path":52,"stem":53,"icon":54},"Pagination","/docs/data-fetching/pagination","docs/2.data-fetching/2.pagination","i-lucide-list",{"title":56,"path":57,"stem":58,"icon":59},"Caching & Data Reuse","/docs/data-fetching/caching-reuse","docs/2.data-fetching/3.caching-reuse","i-lucide-database-zap",{"title":61,"path":62,"stem":63,"children":64,"page":39},"Mutations","/docs/mutations","docs/3.mutations",[65,69,74],{"title":61,"path":66,"stem":67,"icon":68},"/docs/mutations/mutations","docs/3.mutations/1.mutations","i-lucide-pen-tool",{"title":70,"path":71,"stem":72,"icon":73},"Actions","/docs/mutations/actions","docs/3.mutations/2.actions","i-lucide-zap",{"title":75,"path":76,"stem":77,"icon":73},"Optimistic Updates","/docs/mutations/optimistic-updates","docs/3.mutations/3.optimistic-updates",{"title":79,"path":80,"stem":81,"children":82,"page":39},"Auth Security","/docs/auth-security","docs/4.auth-security",[83,87,91,95],{"title":84,"path":85,"stem":86,"icon":28},"Permissions Setup","/docs/auth-security/permissions-setup","docs/4.auth-security/0.permissions-setup",{"title":25,"path":88,"stem":89,"icon":90},"/docs/auth-security/authentication","docs/4.auth-security/1.authentication","i-lucide-lock",{"title":92,"path":93,"stem":94,"icon":33},"Permissions Reference","/docs/auth-security/permissions","docs/4.auth-security/2.permissions",{"title":96,"path":97,"stem":98,"icon":99},"Standard Role Template","/docs/auth-security/standard-role-template","docs/4.auth-security/3.standard-role-template","i-lucide-file-check",{"title":101,"path":102,"stem":103,"children":104,"page":39},"Server Side","/docs/server-side","docs/5.server-side",[105,110],{"title":106,"path":107,"stem":108,"icon":109},"Server Routes","/docs/server-side/server-routes","docs/5.server-side/1.server-routes","i-lucide-server",{"title":111,"path":112,"stem":113,"icon":109},"SSR & Hydration","/docs/server-side/ssr-hydration","docs/5.server-side/2.ssr-hydration",{"title":115,"path":116,"stem":117,"children":118,"page":39},"Advanced","/docs/advanced","docs/6.advanced",[119,124,129,134,139,144,149,154],{"title":120,"path":121,"stem":122,"icon":123},"Connection State","/docs/advanced/connection-state","docs/6.advanced/1.connection-state","i-lucide-wifi",{"title":125,"path":126,"stem":127,"icon":128},"Client Access","/docs/advanced/client-access","docs/6.advanced/2.client-access","i-lucide-box",{"title":130,"path":131,"stem":132,"icon":133},"Performance","/docs/advanced/performance","docs/6.advanced/3.performance","i-lucide-gauge",{"title":135,"path":136,"stem":137,"icon":138},"Error Handling","/docs/advanced/error-handling","docs/6.advanced/4.error-handling","i-lucide-alert-circle",{"title":140,"path":141,"stem":142,"icon":143},"File Storage","/docs/advanced/file-storage","docs/6.advanced/5.file-storage","i-lucide-upload",{"title":145,"path":146,"stem":147,"icon":148},"Logging","/docs/advanced/logging","docs/6.advanced/6.logging","i-lucide-scroll-text",{"title":150,"path":151,"stem":152,"icon":153},"Module Configuration","/docs/advanced/module-config","docs/6.advanced/7.module-config","i-lucide-settings",{"title":155,"path":156,"stem":157,"icon":54},"API Surface","/docs/advanced/api-surface","docs/6.advanced/8.api-surface",{"title":159,"path":160,"stem":161,"children":162,"page":39},"Recipes","/docs/recipes","docs/7.recipes",[163,168,173,178,182],{"title":164,"path":165,"stem":166,"icon":167},"Protected Dashboard","/docs/recipes/protected-dashboard","docs/7.recipes/1.protected-dashboard","i-lucide-layout-dashboard",{"title":169,"path":170,"stem":171,"icon":172},"Real-Time Feed","/docs/recipes/realtime-feed","docs/7.recipes/2.realtime-feed","i-lucide-messages-square",{"title":174,"path":175,"stem":176,"icon":177},"User Augmentation","/docs/recipes/user-augmentation","docs/7.recipes/3.user-augmentation","i-lucide-user-round-cog",{"title":179,"path":180,"stem":181,"icon":28},"Auth Guards and Permissions","/docs/recipes/auth-guards-and-permissions","docs/7.recipes/4.auth-guards-and-permissions",{"title":183,"path":184,"stem":185,"icon":73},"Instant List → Detail Navigation","/docs/recipes/instant-list-detail-cache-reuse","docs/7.recipes/5.instant-list-detail-cache-reuse",{"id":187,"title":164,"body":188,"description":711,"extension":712,"links":713,"meta":714,"navigation":715,"path":165,"seo":716,"sitemap":717,"stem":166,"__hash__":718},"docs/docs/7.recipes/1.protected-dashboard.md",{"type":189,"value":190,"toc":705},"minimark",[191,196,200,204,413,417,653,657,701],[192,193,195],"h2",{"id":194},"goal","Goal",[197,198,199],"p",{},"Protect a page with zero custom middleware and layer permissions on top.",[192,201,203],{"id":202},"page-guard-auth","Page Guard (Auth)",[205,206,212],"pre",{"className":207,"code":208,"filename":209,"language":210,"meta":211,"style":211},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\ndefinePageMeta({\n  convexAuth: true,\n})\n\nconst { user } = useConvexAuth()\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>Admin Dashboard\u003C/h1>\n    \u003Cp>Signed in as {{ user?.email || user?.name }}\u003C/p>\n  \u003C/div>\n\u003C/template>\n","app/pages/admin/dashboard.vue","vue","",[213,214,215,250,264,280,289,296,319,329,334,344,355,376,394,404],"code",{"__ignoreMap":211},[216,217,220,224,228,232,235,238,241,245,247],"span",{"class":218,"line":219},"line",1,[216,221,223],{"class":222},"sMK4o","\u003C",[216,225,227],{"class":226},"swJcz","script",[216,229,231],{"class":230},"spNyl"," setup",[216,233,234],{"class":230}," lang",[216,236,237],{"class":222},"=",[216,239,240],{"class":222},"\"",[216,242,244],{"class":243},"sfazB","ts",[216,246,240],{"class":222},[216,248,249],{"class":222},">\n",[216,251,253,257,261],{"class":218,"line":252},2,[216,254,256],{"class":255},"s2Zo4","definePageMeta",[216,258,260],{"class":259},"sTEyZ","(",[216,262,263],{"class":222},"{\n",[216,265,267,270,273,277],{"class":218,"line":266},3,[216,268,269],{"class":226},"  convexAuth",[216,271,272],{"class":222},":",[216,274,276],{"class":275},"sfNiH"," true",[216,278,279],{"class":222},",\n",[216,281,283,286],{"class":218,"line":282},4,[216,284,285],{"class":222},"}",[216,287,288],{"class":259},")\n",[216,290,292],{"class":218,"line":291},5,[216,293,295],{"emptyLinePlaceholder":294},true,"\n",[216,297,299,302,305,308,310,313,316],{"class":218,"line":298},6,[216,300,301],{"class":230},"const",[216,303,304],{"class":222}," {",[216,306,307],{"class":259}," user ",[216,309,285],{"class":222},[216,311,312],{"class":222}," =",[216,314,315],{"class":255}," useConvexAuth",[216,317,318],{"class":259},"()\n",[216,320,322,325,327],{"class":218,"line":321},7,[216,323,324],{"class":222},"\u003C/",[216,326,227],{"class":226},[216,328,249],{"class":222},[216,330,332],{"class":218,"line":331},8,[216,333,295],{"emptyLinePlaceholder":294},[216,335,337,339,342],{"class":218,"line":336},9,[216,338,223],{"class":222},[216,340,341],{"class":226},"template",[216,343,249],{"class":222},[216,345,347,350,353],{"class":218,"line":346},10,[216,348,349],{"class":222},"  \u003C",[216,351,352],{"class":226},"div",[216,354,249],{"class":222},[216,356,358,361,364,367,370,372,374],{"class":218,"line":357},11,[216,359,360],{"class":222},"    \u003C",[216,362,363],{"class":226},"h1",[216,365,366],{"class":222},">",[216,368,369],{"class":259},"Admin Dashboard",[216,371,324],{"class":222},[216,373,363],{"class":226},[216,375,249],{"class":222},[216,377,379,381,383,385,388,390,392],{"class":218,"line":378},12,[216,380,360],{"class":222},[216,382,197],{"class":226},[216,384,366],{"class":222},[216,386,387],{"class":259},"Signed in as {{ user?.email || user?.name }}",[216,389,324],{"class":222},[216,391,197],{"class":226},[216,393,249],{"class":222},[216,395,397,400,402],{"class":218,"line":396},13,[216,398,399],{"class":222},"  \u003C/",[216,401,352],{"class":226},[216,403,249],{"class":222},[216,405,407,409,411],{"class":218,"line":406},14,[216,408,324],{"class":222},[216,410,341],{"class":226},[216,412,249],{"class":222},[192,414,416],{"id":415},"add-permission-checks","Add Permission Checks",[205,418,420],{"className":207,"code":419,"filename":209,"language":210,"meta":211,"style":211},"\u003Cscript setup lang=\"ts\">\ndefinePageMeta({ convexAuth: true })\n\nconst { can, pending } = usePermissions()\nconst canViewAdmin = can('admin.view')\n\u003C/script>\n\n\u003Ctemplate>\n  \u003Cdiv v-if=\"pending\">Loading permissions...\u003C/div>\n  \u003Cdiv v-else-if=\"canViewAdmin\">\n    \u003Ch1>Admin Dashboard\u003C/h1>\n  \u003C/div>\n  \u003Cdiv v-else>\n    \u003Cp>You do not have access.\u003C/p>\n  \u003C/div>\n\u003C/template>\n",[213,421,422,442,463,467,491,514,522,526,534,563,583,599,607,618,635,644],{"__ignoreMap":211},[216,423,424,426,428,430,432,434,436,438,440],{"class":218,"line":219},[216,425,223],{"class":222},[216,427,227],{"class":226},[216,429,231],{"class":230},[216,431,234],{"class":230},[216,433,237],{"class":222},[216,435,240],{"class":222},[216,437,244],{"class":243},[216,439,240],{"class":222},[216,441,249],{"class":222},[216,443,444,446,448,451,454,456,458,461],{"class":218,"line":252},[216,445,256],{"class":255},[216,447,260],{"class":259},[216,449,450],{"class":222},"{",[216,452,453],{"class":226}," convexAuth",[216,455,272],{"class":222},[216,457,276],{"class":275},[216,459,460],{"class":222}," }",[216,462,288],{"class":259},[216,464,465],{"class":218,"line":266},[216,466,295],{"emptyLinePlaceholder":294},[216,468,469,471,473,476,479,482,484,486,489],{"class":218,"line":282},[216,470,301],{"class":230},[216,472,304],{"class":222},[216,474,475],{"class":259}," can",[216,477,478],{"class":222},",",[216,480,481],{"class":259}," pending ",[216,483,285],{"class":222},[216,485,312],{"class":222},[216,487,488],{"class":255}," usePermissions",[216,490,318],{"class":259},[216,492,493,495,498,500,502,504,507,510,512],{"class":218,"line":291},[216,494,301],{"class":230},[216,496,497],{"class":259}," canViewAdmin ",[216,499,237],{"class":222},[216,501,475],{"class":255},[216,503,260],{"class":259},[216,505,506],{"class":222},"'",[216,508,509],{"class":243},"admin.view",[216,511,506],{"class":222},[216,513,288],{"class":259},[216,515,516,518,520],{"class":218,"line":298},[216,517,324],{"class":222},[216,519,227],{"class":226},[216,521,249],{"class":222},[216,523,524],{"class":218,"line":321},[216,525,295],{"emptyLinePlaceholder":294},[216,527,528,530,532],{"class":218,"line":331},[216,529,223],{"class":222},[216,531,341],{"class":226},[216,533,249],{"class":222},[216,535,536,538,540,543,545,547,550,552,554,557,559,561],{"class":218,"line":336},[216,537,349],{"class":222},[216,539,352],{"class":226},[216,541,542],{"class":230}," v-if",[216,544,237],{"class":222},[216,546,240],{"class":222},[216,548,549],{"class":243},"pending",[216,551,240],{"class":222},[216,553,366],{"class":222},[216,555,556],{"class":259},"Loading permissions...",[216,558,324],{"class":222},[216,560,352],{"class":226},[216,562,249],{"class":222},[216,564,565,567,569,572,574,576,579,581],{"class":218,"line":346},[216,566,349],{"class":222},[216,568,352],{"class":226},[216,570,571],{"class":230}," v-else-if",[216,573,237],{"class":222},[216,575,240],{"class":222},[216,577,578],{"class":243},"canViewAdmin",[216,580,240],{"class":222},[216,582,249],{"class":222},[216,584,585,587,589,591,593,595,597],{"class":218,"line":357},[216,586,360],{"class":222},[216,588,363],{"class":226},[216,590,366],{"class":222},[216,592,369],{"class":259},[216,594,324],{"class":222},[216,596,363],{"class":226},[216,598,249],{"class":222},[216,600,601,603,605],{"class":218,"line":378},[216,602,399],{"class":222},[216,604,352],{"class":226},[216,606,249],{"class":222},[216,608,609,611,613,616],{"class":218,"line":396},[216,610,349],{"class":222},[216,612,352],{"class":226},[216,614,615],{"class":230}," v-else",[216,617,249],{"class":222},[216,619,620,622,624,626,629,631,633],{"class":218,"line":406},[216,621,360],{"class":222},[216,623,197],{"class":226},[216,625,366],{"class":222},[216,627,628],{"class":259},"You do not have access.",[216,630,324],{"class":222},[216,632,197],{"class":226},[216,634,249],{"class":222},[216,636,638,640,642],{"class":218,"line":637},15,[216,639,399],{"class":222},[216,641,352],{"class":226},[216,643,249],{"class":222},[216,645,647,649,651],{"class":218,"line":646},16,[216,648,324],{"class":222},[216,650,341],{"class":226},[216,652,249],{"class":222},[192,654,656],{"id":655},"optional-per-page-redirect","Optional Per-Page Redirect",[205,658,661],{"className":659,"code":660,"language":244,"meta":211,"style":211},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","definePageMeta({\n  convexAuth: { redirectTo: '/login' },\n})\n",[213,662,663,671,695],{"__ignoreMap":211},[216,664,665,667,669],{"class":218,"line":219},[216,666,256],{"class":255},[216,668,260],{"class":259},[216,670,263],{"class":222},[216,672,673,675,677,679,682,684,687,690,692],{"class":218,"line":252},[216,674,269],{"class":226},[216,676,272],{"class":222},[216,678,304],{"class":222},[216,680,681],{"class":226}," redirectTo",[216,683,272],{"class":222},[216,685,686],{"class":222}," '",[216,688,689],{"class":243},"/login",[216,691,506],{"class":222},[216,693,694],{"class":222}," },\n",[216,696,697,699],{"class":218,"line":266},[216,698,285],{"class":222},[216,700,288],{"class":259},[702,703,704],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":211,"searchDepth":219,"depth":252,"links":706},[707,708,709,710],{"id":194,"depth":252,"text":195},{"id":202,"depth":252,"text":203},{"id":415,"depth":252,"text":416},{"id":655,"depth":252,"text":656},"Protect a dashboard page with definePageMeta and role checks.","md",null,{},{"icon":167},{"title":164,"description":711},{"loc":165},"OM3h7pf-3re6YnrHyxzBm03FZdX0l1pYIFspRvr_A8g",[720,722],{"title":155,"path":156,"stem":157,"description":721,"icon":54,"children":-1},"Generated reference of auto-imported composables, server helpers, and global auth components.",{"title":169,"path":170,"stem":171,"description":723,"icon":172,"children":-1},"Build a feed/chat UI with paginated queries and optimistic inserts.",1772891787201]