[{"data":1,"prerenderedAt":1897},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-auto/auto-admin/permissions-en":444,"/docs/nuxt-auto/auto-admin/permissions-surround-en":1892},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","/docs/landing","0.docs/1.landing/001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","/docs/landing/built-in-features","0.docs/1.landing/002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","/docs/landing/content","0.docs/1.landing/02.content/1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","/docs/landing/content/details","0.docs/1.landing/02.content/2.details",{"title":24,"path":25,"stem":26},"Technical","/docs/landing/content/technical","0.docs/1.landing/02.content/4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","/docs/landing/regional","0.docs/1.landing/03.regional/1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"/docs/landing/regional/details","0.docs/1.landing/03.regional/2.details",{"title":24,"path":38,"stem":39},"/docs/landing/regional/technical","0.docs/1.landing/03.regional/4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","/docs/landing/multilang","0.docs/1.landing/04.multilang/1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"/docs/landing/multilang/details","0.docs/1.landing/04.multilang/2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","/docs/landing/blog","0.docs/1.landing/05.blog/1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"/docs/landing/blog/details","0.docs/1.landing/05.blog/2.details",{"title":24,"path":61,"stem":62},"/docs/landing/blog/technical","0.docs/1.landing/05.blog/4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","/docs/landing/docs","0.docs/1.landing/06.docs/1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"/docs/landing/docs/details","0.docs/1.landing/06.docs/2.details",{"title":24,"path":74,"stem":75},"/docs/landing/docs/technical","0.docs/1.landing/06.docs/4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","/docs/landing/forms","0.docs/1.landing/07.forms/1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"/docs/landing/forms/details","0.docs/1.landing/07.forms/2.details",{"title":87,"path":88,"stem":89},"Admin","/docs/landing/forms/admin","0.docs/1.landing/07.forms/3.admin",{"title":24,"path":91,"stem":92},"/docs/landing/forms/technical","0.docs/1.landing/07.forms/4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","/docs/landing/email","0.docs/1.landing/08.email/1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"/docs/landing/email/details","0.docs/1.landing/08.email/2.details",{"title":87,"path":104,"stem":105},"/docs/landing/email/admin","0.docs/1.landing/08.email/3.admin",{"title":24,"path":107,"stem":108},"/docs/landing/email/technical","0.docs/1.landing/08.email/4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","/docs/landing/feedback","0.docs/1.landing/09.feedback/1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"/docs/landing/feedback/details","0.docs/1.landing/09.feedback/2.details",{"title":87,"path":120,"stem":121},"/docs/landing/feedback/admin","0.docs/1.landing/09.feedback/3.admin",{"title":24,"path":123,"stem":124},"/docs/landing/feedback/technical","0.docs/1.landing/09.feedback/4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","/docs/landing/feedback/compare","0.docs/1.landing/09.feedback/5.compare",{"title":130,"path":131,"stem":132},"FAQ","/docs/landing/feedback/faq","0.docs/1.landing/09.feedback/6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","/docs/landing/storage","0.docs/1.landing/10.storage/1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"/docs/landing/storage/details","0.docs/1.landing/10.storage/2.details",{"title":87,"path":144,"stem":145},"/docs/landing/storage/admin","0.docs/1.landing/10.storage/3.admin",{"title":24,"path":147,"stem":148},"/docs/landing/storage/technical","0.docs/1.landing/10.storage/4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","/docs/landing/offline-first","0.docs/1.landing/11.offline-first/1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","/docs/landing/yjs-sync","0.docs/1.landing/12.yjs-sync/1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"/docs/landing/yjs-sync/details","0.docs/1.landing/12.yjs-sync/2.details",{"title":87,"path":167,"stem":168},"/docs/landing/yjs-sync/admin","0.docs/1.landing/12.yjs-sync/3.admin",{"title":24,"path":170,"stem":171},"/docs/landing/yjs-sync/technical","0.docs/1.landing/12.yjs-sync/4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","/docs/landing/newsletter","0.docs/1.landing/13.newsletter/index",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,298],{"title":5,"path":182,"stem":183},"/docs/nuxt-auto","0.docs/3.nuxt-auto/index",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","/docs/nuxt-auto/getting-started","0.docs/3.nuxt-auto/1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","/docs/nuxt-auto/getting-started/introduction","0.docs/3.nuxt-auto/1.getting-started/1.introduction",{"title":194,"path":195,"stem":196},"Installation","/docs/nuxt-auto/getting-started/installation","0.docs/3.nuxt-auto/1.getting-started/2.installation",{"title":198,"path":199,"stem":200},"Quick Start","/docs/nuxt-auto/getting-started/quick-start","0.docs/3.nuxt-auto/1.getting-started/3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","/docs/nuxt-auto/auto-api","0.docs/3.nuxt-auto/2.auto-api",[207,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294],{"title":185,"path":208,"stem":209},"/docs/nuxt-auto/auto-api/getting-started","0.docs/3.nuxt-auto/2.auto-api/1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","/docs/nuxt-auto/auto-api/aggregations","0.docs/3.nuxt-auto/2.auto-api/10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","/docs/nuxt-auto/auto-api/lifecycle-hooks","0.docs/3.nuxt-auto/2.auto-api/11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","/docs/nuxt-auto/auto-api/m2m-relationships","0.docs/3.nuxt-auto/2.auto-api/12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","/docs/nuxt-auto/auto-api/plugin-system","0.docs/3.nuxt-auto/2.auto-api/13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","/docs/nuxt-auto/auto-api/database-adapters","0.docs/3.nuxt-auto/2.auto-api/14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","/docs/nuxt-auto/auto-api/custom-endpoints","0.docs/3.nuxt-auto/2.auto-api/15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","/docs/nuxt-auto/auto-api/multi-tenancy","0.docs/3.nuxt-auto/2.auto-api/16.multi-tenancy",{"title":239,"path":240,"stem":241},"Validation","/docs/nuxt-auto/auto-api/validation","0.docs/3.nuxt-auto/2.auto-api/2.validation",{"title":243,"path":244,"stem":245},"Rate Limiting","/docs/nuxt-auto/auto-api/rate-limiting","0.docs/3.nuxt-auto/2.auto-api/20.rate-limiting",{"title":247,"path":248,"stem":249},"Request Metadata Plugin","/docs/nuxt-auto/auto-api/request-metadata","0.docs/3.nuxt-auto/2.auto-api/21.request-metadata",{"title":251,"path":252,"stem":253},"Plugin Catalog","/docs/nuxt-auto/auto-api/plugin-catalog","0.docs/3.nuxt-auto/2.auto-api/22.plugin-catalog",{"title":255,"path":256,"stem":257},"Handler Overrides","/docs/nuxt-auto/auto-api/handler-overrides","0.docs/3.nuxt-auto/2.auto-api/3.handler-overrides",{"title":259,"path":260,"stem":261},"Cloudflare D1","/docs/nuxt-auto/auto-api/cloudflare-d1","0.docs/3.nuxt-auto/2.auto-api/30.cloudflare-d1",{"title":263,"path":264,"stem":265},"SQLite to D1 Migration","/docs/nuxt-auto/auto-api/migration-sqlite-d1","0.docs/3.nuxt-auto/2.auto-api/31.migration-sqlite-d1",{"title":267,"path":268,"stem":269},"Frontend Composables","/docs/nuxt-auto/auto-api/frontend-composables","0.docs/3.nuxt-auto/2.auto-api/32.frontend-composables",{"title":271,"path":272,"stem":273},"Testing","/docs/nuxt-auto/auto-api/testing","0.docs/3.nuxt-auto/2.auto-api/33.testing",{"title":275,"path":276,"stem":277},"Pagination","/docs/nuxt-auto/auto-api/pagination","0.docs/3.nuxt-auto/2.auto-api/4.pagination",{"title":279,"path":280,"stem":281},"Soft Deletes","/docs/nuxt-auto/auto-api/soft-deletes","0.docs/3.nuxt-auto/2.auto-api/5.soft-deletes",{"title":283,"path":284,"stem":285},"Authentication & Authorization","/docs/nuxt-auto/auto-api/authentication-authorization","0.docs/3.nuxt-auto/2.auto-api/6.authentication-authorization",{"title":287,"path":288,"stem":289},"Better-Auth Integration","/docs/nuxt-auto/auto-api/better-auth","0.docs/3.nuxt-auto/2.auto-api/7.better-auth",{"title":291,"path":292,"stem":293},"Nested Relations","/docs/nuxt-auto/auto-api/nested-relationships","0.docs/3.nuxt-auto/2.auto-api/8.nested-relationships",{"title":295,"path":296,"stem":297},"Bulk Operations","/docs/nuxt-auto/auto-api/bulk-operations","0.docs/3.nuxt-auto/2.auto-api/9.bulk-operations",{"title":299,"path":300,"stem":301,"children":302,"page":201},"Auto Admin","/docs/nuxt-auto/auto-admin","0.docs/3.nuxt-auto/3.auto-admin",[303,306,310,314,318,322,326,330,334],{"title":185,"path":304,"stem":305},"/docs/nuxt-auto/auto-admin/getting-started","0.docs/3.nuxt-auto/3.auto-admin/1.getting-started",{"title":307,"path":308,"stem":309},"Configuration & Theming","/docs/nuxt-auto/auto-admin/configuration-theming","0.docs/3.nuxt-auto/3.auto-admin/2.configuration-theming",{"title":311,"path":312,"stem":313},"Resource Configuration","/docs/nuxt-auto/auto-admin/resource-configuration","0.docs/3.nuxt-auto/3.auto-admin/3.resource-configuration",{"title":315,"path":316,"stem":317},"Form Fields & Widgets","/docs/nuxt-auto/auto-admin/form-fields-widgets","0.docs/3.nuxt-auto/3.auto-admin/4.form-fields-widgets",{"title":319,"path":320,"stem":321},"Permissions","/docs/nuxt-auto/auto-admin/permissions","0.docs/3.nuxt-auto/3.auto-admin/5.permissions",{"title":323,"path":324,"stem":325},"Custom Pages","/docs/nuxt-auto/auto-admin/custom-pages","0.docs/3.nuxt-auto/3.auto-admin/6.custom-pages",{"title":327,"path":328,"stem":329},"M2M Relationships","/docs/nuxt-auto/auto-admin/m2m-relationships","0.docs/3.nuxt-auto/3.auto-admin/7.m2m-relationships",{"title":331,"path":332,"stem":333},"Custom Actions","/docs/nuxt-auto/auto-admin/custom-actions","0.docs/3.nuxt-auto/3.auto-admin/8.custom-actions",{"title":335,"path":336,"stem":337},"Composables","/docs/nuxt-auto/auto-admin/composables","0.docs/3.nuxt-auto/3.auto-admin/9.composables",[339,342,355,382,400,415,425],{"title":5,"path":340,"stem":341},"/docs/nuxt-protokit","0.docs/4.nuxt-protokit/index",{"title":185,"path":343,"stem":344,"children":345,"icon":354},"/docs/nuxt-protokit/getting-started","0.docs/4.nuxt-protokit/1.getting-started/1.index",[346,347,351],{"title":190,"path":343,"stem":344},{"title":348,"path":349,"stem":350},"Core Concepts","/docs/nuxt-protokit/getting-started/concepts","0.docs/4.nuxt-protokit/1.getting-started/2.concepts",{"title":198,"path":352,"stem":353},"/docs/nuxt-protokit/getting-started/quick-start","0.docs/4.nuxt-protokit/1.getting-started/3.quick-start","i-lucide-rocket",{"title":356,"path":357,"stem":358,"children":359,"icon":381},"Schemas","/docs/nuxt-protokit/schemas","0.docs/4.nuxt-protokit/2.schemas/1.index",[360,361,365,369,373,377],{"title":5,"path":357,"stem":358},{"title":362,"path":363,"stem":364},"Field Types","/docs/nuxt-protokit/schemas/fields","0.docs/4.nuxt-protokit/2.schemas/2.fields",{"title":366,"path":367,"stem":368},"Collections","/docs/nuxt-protokit/schemas/collections","0.docs/4.nuxt-protokit/2.schemas/3.collections",{"title":370,"path":371,"stem":372},"Derived & Computed","/docs/nuxt-protokit/schemas/derived-computed","0.docs/4.nuxt-protokit/2.schemas/4.derived-computed",{"title":374,"path":375,"stem":376},"Connections","/docs/nuxt-protokit/schemas/connections","0.docs/4.nuxt-protokit/2.schemas/5.connections",{"title":378,"path":379,"stem":380},"Visualizations & Layouts","/docs/nuxt-protokit/schemas/visualizations","0.docs/4.nuxt-protokit/2.schemas/6.visualizations","i-lucide-file-code",{"title":335,"path":383,"stem":384,"children":385,"icon":399},"/docs/nuxt-protokit/composables","0.docs/4.nuxt-protokit/3.composables/1.index",[386,387,391,395],{"title":5,"path":383,"stem":384},{"title":388,"path":389,"stem":390},"usePrototype","/docs/nuxt-protokit/composables/use-prototype","0.docs/4.nuxt-protokit/3.composables/2.use-prototype",{"title":392,"path":393,"stem":394},"useProtoDoc","/docs/nuxt-protokit/composables/use-proto-doc","0.docs/4.nuxt-protokit/3.composables/3.use-proto-doc",{"title":396,"path":397,"stem":398},"useProtoCollection","/docs/nuxt-protokit/composables/use-proto-collection","0.docs/4.nuxt-protokit/3.composables/4.use-proto-collection","i-lucide-layers",{"title":401,"path":402,"stem":403,"children":404,"icon":414},"Components","/docs/nuxt-protokit/components","0.docs/4.nuxt-protokit/4.components/1.index",[405,406,410],{"title":5,"path":402,"stem":403},{"title":407,"path":408,"stem":409},"ProtoTool","/docs/nuxt-protokit/components/proto-tool","0.docs/4.nuxt-protokit/4.components/2.proto-tool",{"title":411,"path":412,"stem":413},"ProtoCrudModal","/docs/nuxt-protokit/components/proto-crud-modal","0.docs/4.nuxt-protokit/4.components/3.proto-crud-modal","i-lucide-puzzle",{"title":151,"path":416,"stem":417,"children":418,"icon":424},"/docs/nuxt-protokit/offline-first","0.docs/4.nuxt-protokit/5.offline-first/1.index",[419,420],{"title":151,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Corruption Recovery","/docs/nuxt-protokit/offline-first/corruption-recovery","0.docs/4.nuxt-protokit/5.offline-first/2.corruption-recovery","i-lucide-wifi-off",{"title":426,"icon":427,"path":428,"stem":429,"children":430},"Advanced","i-lucide-graduation-cap","/docs/nuxt-protokit/advanced","0.docs/4.nuxt-protokit/6.advanced/1.index",[431,432,436,440],{"title":5,"path":428,"stem":429},{"title":433,"path":434,"stem":435},"Multi-Tool Apps","/docs/nuxt-protokit/advanced/building-a-toolkit","0.docs/4.nuxt-protokit/6.advanced/1.building-a-toolkit",{"title":437,"path":438,"stem":439},"Schema Patterns","/docs/nuxt-protokit/advanced/custom-schema-patterns","0.docs/4.nuxt-protokit/6.advanced/2.custom-schema-patterns",{"title":441,"path":442,"stem":443},"Custom Fields & Viz","/docs/nuxt-protokit/advanced/extensibility","0.docs/4.nuxt-protokit/6.advanced/3.extensibility",{"page":445,"fallbackPage":1888},{"id":446,"title":319,"body":447,"description":457,"extension":1887,"links":1888,"meta":1889,"navigation":1888,"ogImage":1888,"path":320,"seo":1890,"stem":321,"__hash__":1891},"nuxt_auto/0.docs/3.nuxt-auto/3.auto-admin/5.permissions.md",{"type":448,"value":449,"toc":1862},"minimark",[450,454,458,463,471,628,632,637,644,654,670,677,688,693,707,711,717,723,731,737,756,760,763,935,939,946,960,964,967,972,1091,1096,1262,1266,1274,1295,1299,1302,1307,1321,1325,1329,1361,1364,1428,1432,1458,1462,1469,1541,1545,1549,1609,1612,1626,1630,1685,1687,1701,1705,1760,1762,1773,1777,1824,1828,1831,1858],[451,452,319],"h1",{"id":453},"permissions",[455,456,457],"p",{},"This document explains the comprehensive permission system implemented in Nuxt Auto Admin.",[459,460,462],"h2",{"id":461},"configuration","Configuration",[455,464,465,466,470],{},"Add permission configuration to your ",[467,468,469],"code",{},"nuxt.config.ts",":",[472,473,478],"pre",{"className":474,"code":475,"language":476,"meta":477,"style":477},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  autoAdmin: {\n    permissions: {\n      // How to handle buttons when user lacks permission\n      // 'disable' = show buttons but disable them (default)\n      // 'hide' = completely hide buttons\n      unauthorizedButtons: 'disable',\n\n      // How to handle sidebar items when user lacks permission\n      // 'hide' = completely hide items from sidebar (default)\n      // 'disable' = show items but in disabled state (grayed out, not clickable)\n      unauthorizedSidebarItems: 'hide'\n    }\n  }\n})\n","typescript","",[467,479,480,504,516,526,533,539,545,566,573,579,585,591,607,613,619],{"__ignoreMap":477},[481,482,485,489,492,496,500],"span",{"class":483,"line":484},"line",1,[481,486,488],{"class":487},"s7zQu","export",[481,490,491],{"class":487}," default",[481,493,495],{"class":494},"s2Zo4"," defineNuxtConfig",[481,497,499],{"class":498},"sTEyZ","(",[481,501,503],{"class":502},"sMK4o","{\n",[481,505,507,511,513],{"class":483,"line":506},2,[481,508,510],{"class":509},"swJcz","  autoAdmin",[481,512,470],{"class":502},[481,514,515],{"class":502}," {\n",[481,517,519,522,524],{"class":483,"line":518},3,[481,520,521],{"class":509},"    permissions",[481,523,470],{"class":502},[481,525,515],{"class":502},[481,527,529],{"class":483,"line":528},4,[481,530,532],{"class":531},"sHwdD","      // How to handle buttons when user lacks permission\n",[481,534,536],{"class":483,"line":535},5,[481,537,538],{"class":531},"      // 'disable' = show buttons but disable them (default)\n",[481,540,542],{"class":483,"line":541},6,[481,543,544],{"class":531},"      // 'hide' = completely hide buttons\n",[481,546,548,551,553,556,560,563],{"class":483,"line":547},7,[481,549,550],{"class":509},"      unauthorizedButtons",[481,552,470],{"class":502},[481,554,555],{"class":502}," '",[481,557,559],{"class":558},"sfazB","disable",[481,561,562],{"class":502},"'",[481,564,565],{"class":502},",\n",[481,567,569],{"class":483,"line":568},8,[481,570,572],{"emptyLinePlaceholder":571},true,"\n",[481,574,576],{"class":483,"line":575},9,[481,577,578],{"class":531},"      // How to handle sidebar items when user lacks permission\n",[481,580,582],{"class":483,"line":581},10,[481,583,584],{"class":531},"      // 'hide' = completely hide items from sidebar (default)\n",[481,586,588],{"class":483,"line":587},11,[481,589,590],{"class":531},"      // 'disable' = show items but in disabled state (grayed out, not clickable)\n",[481,592,594,597,599,601,604],{"class":483,"line":593},12,[481,595,596],{"class":509},"      unauthorizedSidebarItems",[481,598,470],{"class":502},[481,600,555],{"class":502},[481,602,603],{"class":558},"hide",[481,605,606],{"class":502},"'\n",[481,608,610],{"class":483,"line":609},13,[481,611,612],{"class":502},"    }\n",[481,614,616],{"class":483,"line":615},14,[481,617,618],{"class":502},"  }\n",[481,620,622,625],{"class":483,"line":621},15,[481,623,624],{"class":502},"}",[481,626,627],{"class":498},")\n",[459,629,631],{"id":630},"features","Features",[633,634,636],"h3",{"id":635},"_1-button-behavior","1. Button Behavior",[455,638,639,640,643],{},"Buttons respect the ",[467,641,642],{},"unauthorizedButtons"," configuration:",[455,645,646,470],{},[647,648,649,650,653],"strong",{},"When set to ",[467,651,652],{},"'disable'"," (default)",[655,656,657,661,664,667],"ul",{},[658,659,660],"li",{},"Buttons are shown but disabled",[658,662,663],{},"Forms show with all fields disabled",[658,665,666],{},"User sees an orange warning banner indicating limited access",[658,668,669],{},"Better UX - user can see what they could do with proper permissions",[455,671,672,470],{},[647,673,649,674],{},[467,675,676],{},"'hide'",[655,678,679,682,685],{},[658,680,681],{},"Buttons are completely hidden from UI",[658,683,684],{},"Forms show a red permission denied message",[658,686,687],{},"Stricter access control",[455,689,690],{},[647,691,692],{},"Affected buttons:",[655,694,695,698,701,704],{},[658,696,697],{},"\"Create New\" button on list pages",[658,699,700],{},"\"Edit\" and \"Delete\" buttons on detail pages",[658,702,703],{},"\"Save\" button on edit/create forms",[658,705,706],{},"Action buttons in table context menus (always shown but disabled)",[633,708,710],{"id":709},"_2-sidebar-menu-items","2. Sidebar Menu Items",[455,712,713,714,643],{},"Sidebar items respect the ",[467,715,716],{},"unauthorizedSidebarItems",[455,718,719,470],{},[647,720,649,721,653],{},[467,722,676],{},[655,724,725,728],{},[658,726,727],{},"Resources without any permissions are removed from sidebar",[658,729,730],{},"Cleaner UI showing only accessible resources",[455,732,733,470],{},[647,734,649,735],{},[467,736,652],{},[655,738,739,742,753],{},[658,740,741],{},"Resources without permissions are shown but grayed out",[658,743,744,745,748,749,752],{},"Not clickable (rendered as ",[467,746,747],{},"\u003Cdiv>"," instead of ",[467,750,751],{},"\u003CNuxtLink>",")",[658,754,755],{},"User can see what resources exist but can't access them",[633,757,759],{"id":758},"_3-table-context-menu","3. Table Context Menu",[455,761,762],{},"The dropdown menu in table rows now shows all actions but disables them based on permissions:",[472,764,766],{"className":474,"code":765,"language":476,"meta":477,"style":477},"// Items are always shown in menu\nitems = [\n  { label: 'View', icon: 'i-heroicons-eye', onSelect: ... },\n  { label: 'Edit', icon: 'i-heroicons-pencil', disabled: !canUpdate, onSelect: ... },\n  { label: 'Delete', icon: 'i-heroicons-trash', disabled: !canDelete, onSelect: ... }\n]\n",[467,767,768,773,784,829,880,930],{"__ignoreMap":477},[481,769,770],{"class":483,"line":484},[481,771,772],{"class":531},"// Items are always shown in menu\n",[481,774,775,778,781],{"class":483,"line":506},[481,776,777],{"class":498},"items ",[481,779,780],{"class":502},"=",[481,782,783],{"class":498}," [\n",[481,785,786,789,792,794,796,799,801,804,807,809,811,814,816,818,821,823,826],{"class":483,"line":518},[481,787,788],{"class":502},"  {",[481,790,791],{"class":509}," label",[481,793,470],{"class":502},[481,795,555],{"class":502},[481,797,798],{"class":558},"View",[481,800,562],{"class":502},[481,802,803],{"class":502},",",[481,805,806],{"class":509}," icon",[481,808,470],{"class":502},[481,810,555],{"class":502},[481,812,813],{"class":558},"i-heroicons-eye",[481,815,562],{"class":502},[481,817,803],{"class":502},[481,819,820],{"class":509}," onSelect",[481,822,470],{"class":502},[481,824,825],{"class":502}," ...",[481,827,828],{"class":502}," },\n",[481,830,831,833,835,837,839,842,844,846,848,850,852,855,857,859,862,864,867,870,872,874,876,878],{"class":483,"line":528},[481,832,788],{"class":502},[481,834,791],{"class":509},[481,836,470],{"class":502},[481,838,555],{"class":502},[481,840,841],{"class":558},"Edit",[481,843,562],{"class":502},[481,845,803],{"class":502},[481,847,806],{"class":509},[481,849,470],{"class":502},[481,851,555],{"class":502},[481,853,854],{"class":558},"i-heroicons-pencil",[481,856,562],{"class":502},[481,858,803],{"class":502},[481,860,861],{"class":509}," disabled",[481,863,470],{"class":502},[481,865,866],{"class":502}," !",[481,868,869],{"class":498},"canUpdate",[481,871,803],{"class":502},[481,873,820],{"class":509},[481,875,470],{"class":502},[481,877,825],{"class":502},[481,879,828],{"class":502},[481,881,882,884,886,888,890,893,895,897,899,901,903,906,908,910,912,914,916,919,921,923,925,927],{"class":483,"line":535},[481,883,788],{"class":502},[481,885,791],{"class":509},[481,887,470],{"class":502},[481,889,555],{"class":502},[481,891,892],{"class":558},"Delete",[481,894,562],{"class":502},[481,896,803],{"class":502},[481,898,806],{"class":509},[481,900,470],{"class":502},[481,902,555],{"class":502},[481,904,905],{"class":558},"i-heroicons-trash",[481,907,562],{"class":502},[481,909,803],{"class":502},[481,911,861],{"class":509},[481,913,470],{"class":502},[481,915,866],{"class":502},[481,917,918],{"class":498},"canDelete",[481,920,803],{"class":502},[481,922,820],{"class":509},[481,924,470],{"class":502},[481,926,825],{"class":502},[481,928,929],{"class":502}," }\n",[481,931,932],{"class":483,"line":541},[481,933,934],{"class":498},"]\n",[633,936,938],{"id":937},"_4-direct-url-access-protection","4. Direct URL Access Protection",[455,940,941,942,945],{},"A global middleware (",[467,943,944],{},"permissions.global.ts",") intercepts all admin routes and checks permissions:",[655,947,948,951,954,957],{},[658,949,950],{},"Checks if user has any permission for the resource",[658,952,953],{},"Returns 403 Forbidden if no permission",[658,955,956],{},"Shows nice error page with \"Go Back\" and \"Go to Dashboard\" buttons",[658,958,959],{},"Works for both resource routes and custom pages",[633,961,963],{"id":962},"_5-custom-pages-permissions","5. Custom Pages Permissions",[455,965,966],{},"Custom pages can define permissions in two ways:",[455,968,969],{},[647,970,971],{},"Using permission strings:",[472,973,975],{"className":474,"code":974,"language":476,"meta":477,"style":477},"customPages: [\n  {\n    name: 'settings',\n    label: 'Settings',\n    path: 'settings',\n    icon: 'i-heroicons-cog-6-tooth',\n    // Single permission\n    permissions: 'admin'\n    // OR multiple permissions (user needs ALL)\n    // permissions: ['admin', 'settings.manage']\n  }\n]\n",[467,976,977,987,992,1008,1024,1039,1055,1060,1073,1078,1083,1087],{"__ignoreMap":477},[481,978,979,983,985],{"class":483,"line":484},[481,980,982],{"class":981},"sBMFI","customPages",[481,984,470],{"class":502},[481,986,783],{"class":498},[481,988,989],{"class":483,"line":506},[481,990,991],{"class":502},"  {\n",[481,993,994,997,999,1001,1004,1006],{"class":483,"line":518},[481,995,996],{"class":509},"    name",[481,998,470],{"class":502},[481,1000,555],{"class":502},[481,1002,1003],{"class":558},"settings",[481,1005,562],{"class":502},[481,1007,565],{"class":502},[481,1009,1010,1013,1015,1017,1020,1022],{"class":483,"line":528},[481,1011,1012],{"class":509},"    label",[481,1014,470],{"class":502},[481,1016,555],{"class":502},[481,1018,1019],{"class":558},"Settings",[481,1021,562],{"class":502},[481,1023,565],{"class":502},[481,1025,1026,1029,1031,1033,1035,1037],{"class":483,"line":535},[481,1027,1028],{"class":509},"    path",[481,1030,470],{"class":502},[481,1032,555],{"class":502},[481,1034,1003],{"class":558},[481,1036,562],{"class":502},[481,1038,565],{"class":502},[481,1040,1041,1044,1046,1048,1051,1053],{"class":483,"line":541},[481,1042,1043],{"class":509},"    icon",[481,1045,470],{"class":502},[481,1047,555],{"class":502},[481,1049,1050],{"class":558},"i-heroicons-cog-6-tooth",[481,1052,562],{"class":502},[481,1054,565],{"class":502},[481,1056,1057],{"class":483,"line":547},[481,1058,1059],{"class":531},"    // Single permission\n",[481,1061,1062,1064,1066,1068,1071],{"class":483,"line":568},[481,1063,521],{"class":509},[481,1065,470],{"class":502},[481,1067,555],{"class":502},[481,1069,1070],{"class":558},"admin",[481,1072,606],{"class":502},[481,1074,1075],{"class":483,"line":575},[481,1076,1077],{"class":531},"    // OR multiple permissions (user needs ALL)\n",[481,1079,1080],{"class":483,"line":581},[481,1081,1082],{"class":531},"    // permissions: ['admin', 'settings.manage']\n",[481,1084,1085],{"class":483,"line":587},[481,1086,618],{"class":502},[481,1088,1089],{"class":483,"line":593},[481,1090,934],{"class":498},[455,1092,1093],{},[647,1094,1095],{},"Using canAccess function:",[472,1097,1099],{"className":474,"code":1098,"language":476,"meta":477,"style":477},"customPages: [\n  {\n    name: 'analytics',\n    label: 'Analytics',\n    path: 'analytics',\n    icon: 'i-heroicons-chart-bar',\n    canAccess: async (user) => {\n      // Custom logic\n      return user?.role === 'admin' || user?.permissions?.includes('analytics.view')\n    }\n  }\n]\n",[467,1100,1101,1109,1113,1128,1143,1157,1172,1197,1202,1250,1254,1258],{"__ignoreMap":477},[481,1102,1103,1105,1107],{"class":483,"line":484},[481,1104,982],{"class":981},[481,1106,470],{"class":502},[481,1108,783],{"class":498},[481,1110,1111],{"class":483,"line":506},[481,1112,991],{"class":502},[481,1114,1115,1117,1119,1121,1124,1126],{"class":483,"line":518},[481,1116,996],{"class":509},[481,1118,470],{"class":502},[481,1120,555],{"class":502},[481,1122,1123],{"class":558},"analytics",[481,1125,562],{"class":502},[481,1127,565],{"class":502},[481,1129,1130,1132,1134,1136,1139,1141],{"class":483,"line":528},[481,1131,1012],{"class":509},[481,1133,470],{"class":502},[481,1135,555],{"class":502},[481,1137,1138],{"class":558},"Analytics",[481,1140,562],{"class":502},[481,1142,565],{"class":502},[481,1144,1145,1147,1149,1151,1153,1155],{"class":483,"line":535},[481,1146,1028],{"class":509},[481,1148,470],{"class":502},[481,1150,555],{"class":502},[481,1152,1123],{"class":558},[481,1154,562],{"class":502},[481,1156,565],{"class":502},[481,1158,1159,1161,1163,1165,1168,1170],{"class":483,"line":541},[481,1160,1043],{"class":509},[481,1162,470],{"class":502},[481,1164,555],{"class":502},[481,1166,1167],{"class":558},"i-heroicons-chart-bar",[481,1169,562],{"class":502},[481,1171,565],{"class":502},[481,1173,1174,1177,1179,1183,1186,1190,1192,1195],{"class":483,"line":547},[481,1175,1176],{"class":494},"    canAccess",[481,1178,470],{"class":502},[481,1180,1182],{"class":1181},"spNyl"," async",[481,1184,1185],{"class":502}," (",[481,1187,1189],{"class":1188},"sHdIc","user",[481,1191,752],{"class":502},[481,1193,1194],{"class":1181}," =>",[481,1196,515],{"class":502},[481,1198,1199],{"class":483,"line":568},[481,1200,1201],{"class":531},"      // Custom logic\n",[481,1203,1204,1207,1210,1213,1216,1219,1221,1223,1225,1228,1230,1232,1234,1236,1239,1241,1243,1246,1248],{"class":483,"line":575},[481,1205,1206],{"class":487},"      return",[481,1208,1209],{"class":498}," user",[481,1211,1212],{"class":502},"?.",[481,1214,1215],{"class":498},"role",[481,1217,1218],{"class":502}," ===",[481,1220,555],{"class":502},[481,1222,1070],{"class":558},[481,1224,562],{"class":502},[481,1226,1227],{"class":502}," ||",[481,1229,1209],{"class":498},[481,1231,1212],{"class":502},[481,1233,453],{"class":498},[481,1235,1212],{"class":502},[481,1237,1238],{"class":494},"includes",[481,1240,499],{"class":509},[481,1242,562],{"class":502},[481,1244,1245],{"class":558},"analytics.view",[481,1247,562],{"class":502},[481,1249,627],{"class":509},[481,1251,1252],{"class":483,"line":581},[481,1253,612],{"class":502},[481,1255,1256],{"class":483,"line":587},[481,1257,618],{"class":502},[481,1259,1260],{"class":483,"line":593},[481,1261,934],{"class":498},[633,1263,1265],{"id":1264},"_6-form-disabled-state","6. Form Disabled State",[455,1267,1268,1269,1271,1272,470],{},"When a user lacks update permission but ",[467,1270,642],{}," is set to ",[467,1273,652],{},[655,1275,1276,1283,1286,1289,1292],{},[658,1277,1278,1279,1282],{},"All form fields are disabled via cascading ",[467,1280,1281],{},"disabled"," prop",[658,1284,1285],{},"Save button is disabled",[658,1287,1288],{},"Reset button is disabled",[658,1290,1291],{},"M2M relation cards are disabled (select + save buttons)",[658,1293,1294],{},"Orange warning banner shows \"Limited Access\" message",[633,1296,1298],{"id":1297},"_7-permission-denied-pages","7. Permission Denied Pages",[455,1300,1301],{},"Users see appropriate error messages when accessing unauthorized pages:",[455,1303,1304],{},[647,1305,1306],{},"403 Forbidden Error:",[655,1308,1309,1312,1315,1318],{},[658,1310,1311],{},"Shows permission denied icon",[658,1313,1314],{},"Clear error message",[658,1316,1317],{},"\"Go Back\" and \"Go to Dashboard\" buttons",[658,1319,1320],{},"Consistent styling with the rest of the admin panel",[459,1322,1324],{"id":1323},"components-updated","Components Updated",[633,1326,1328],{"id":1327},"pages","Pages",[655,1330,1331,1337,1343,1349,1355],{},[658,1332,1333,1336],{},[467,1334,1335],{},"admin/[resource]/index.vue"," - List page with Create button",[658,1338,1339,1342],{},[467,1340,1341],{},"admin/[resource]/[id].vue"," - Detail page with Edit/Delete buttons and read permission check",[658,1344,1345,1348],{},[467,1346,1347],{},"admin/[resource]/[id]/edit.vue"," - Edit page with disabled form option",[658,1350,1351,1354],{},[467,1352,1353],{},"admin/[resource]/new.vue"," - Create page with disabled form option",[658,1356,1357,1360],{},[467,1358,1359],{},"admin/error.vue"," - Error page for permission denied and other errors",[633,1362,401],{"id":1363},"components",[655,1365,1366,1372,1380,1389,1398,1404,1410,1416,1422],{},[658,1367,1368,1371],{},[467,1369,1370],{},"ResourceTable.vue"," - Context menu actions always shown but disabled",[658,1373,1374,1377,1378,1282],{},[467,1375,1376],{},"ResourceForm.vue"," - Accepts ",[467,1379,1281],{},[658,1381,1382,1385,1386,1388],{},[467,1383,1384],{},"AutoForm.vue"," - Cascades ",[467,1387,1281],{}," to all fields and buttons",[658,1390,1391,1394,1395,1397],{},[467,1392,1393],{},"AutoField.vue"," - Passes ",[467,1396,1281],{}," to widgets",[658,1399,1400,1403],{},[467,1401,1402],{},"M2MRelationCard.vue"," - Supports disabled state",[658,1405,1406,1409],{},[467,1407,1408],{},"ResourceNavLink.vue"," - Shows resource links based on permissions",[658,1411,1412,1415],{},[467,1413,1414],{},"CustomPageNavLink.vue"," - Shows custom page links based on permissions",[658,1417,1418,1421],{},[467,1419,1420],{},"AdminSidebar.vue"," - Filters/disables items based on config",[658,1423,1424,1427],{},[467,1425,1426],{},"PermissionDeniedPage.vue"," - Reusable permission denied component",[633,1429,1431],{"id":1430},"new-files","New Files",[655,1433,1434,1440,1446,1452],{},[658,1435,1436,1439],{},[467,1437,1438],{},"composables/useAdminConfig.ts"," - Access admin configuration",[658,1441,1442,1445],{},[467,1443,1444],{},"middleware/permissions.global.ts"," - Global route guard",[658,1447,1448,1451],{},[467,1449,1450],{},"components/PermissionDeniedPage.vue"," - Permission denied UI",[658,1453,1454,1457],{},[467,1455,1456],{},"pages/admin/error.vue"," - Error page handler",[459,1459,1461],{"id":1460},"permission-checks","Permission Checks",[455,1463,1464,1465,1468],{},"The system uses the existing ",[467,1466,1467],{},"useAdminPermissions"," composable which provides:",[472,1470,1472],{"className":474,"code":1471,"language":476,"meta":477,"style":477},"const {\n  canCreate,\n  canRead,\n  canUpdate,\n  canDelete,\n  hasAnyPermission,\n  isLoading,\n  getPermissionDeniedMessage\n} = useAdminPermissions(resourceName)\n",[467,1473,1474,1481,1488,1495,1502,1509,1516,1523,1528],{"__ignoreMap":477},[481,1475,1476,1479],{"class":483,"line":484},[481,1477,1478],{"class":1181},"const",[481,1480,515],{"class":502},[481,1482,1483,1486],{"class":483,"line":506},[481,1484,1485],{"class":498},"  canCreate",[481,1487,565],{"class":502},[481,1489,1490,1493],{"class":483,"line":518},[481,1491,1492],{"class":498},"  canRead",[481,1494,565],{"class":502},[481,1496,1497,1500],{"class":483,"line":528},[481,1498,1499],{"class":498},"  canUpdate",[481,1501,565],{"class":502},[481,1503,1504,1507],{"class":483,"line":535},[481,1505,1506],{"class":498},"  canDelete",[481,1508,565],{"class":502},[481,1510,1511,1514],{"class":483,"line":541},[481,1512,1513],{"class":498},"  hasAnyPermission",[481,1515,565],{"class":502},[481,1517,1518,1521],{"class":483,"line":547},[481,1519,1520],{"class":498},"  isLoading",[481,1522,565],{"class":502},[481,1524,1525],{"class":483,"line":568},[481,1526,1527],{"class":498},"  getPermissionDeniedMessage\n",[481,1529,1530,1532,1535,1538],{"class":483,"line":575},[481,1531,624],{"class":502},[481,1533,1534],{"class":502}," =",[481,1536,1537],{"class":494}," useAdminPermissions",[481,1539,1540],{"class":498},"(resourceName)\n",[459,1542,1544],{"id":1543},"examples","Examples",[633,1546,1548],{"id":1547},"example-1-strict-access-control","Example 1: Strict Access Control",[472,1550,1552],{"className":474,"code":1551,"language":476,"meta":477,"style":477},"autoAdmin: {\n  permissions: {\n    unauthorizedButtons: 'hide',\n    unauthorizedSidebarItems: 'hide'\n  }\n}\n",[467,1553,1554,1563,1572,1587,1600,1604],{"__ignoreMap":477},[481,1555,1556,1559,1561],{"class":483,"line":484},[481,1557,1558],{"class":981},"autoAdmin",[481,1560,470],{"class":502},[481,1562,515],{"class":502},[481,1564,1565,1568,1570],{"class":483,"line":506},[481,1566,1567],{"class":981},"  permissions",[481,1569,470],{"class":502},[481,1571,515],{"class":502},[481,1573,1574,1577,1579,1581,1583,1585],{"class":483,"line":518},[481,1575,1576],{"class":981},"    unauthorizedButtons",[481,1578,470],{"class":502},[481,1580,555],{"class":502},[481,1582,603],{"class":558},[481,1584,562],{"class":502},[481,1586,565],{"class":502},[481,1588,1589,1592,1594,1596,1598],{"class":483,"line":528},[481,1590,1591],{"class":981},"    unauthorizedSidebarItems",[481,1593,470],{"class":502},[481,1595,555],{"class":502},[481,1597,603],{"class":558},[481,1599,606],{"class":502},[481,1601,1602],{"class":483,"line":535},[481,1603,618],{"class":502},[481,1605,1606],{"class":483,"line":541},[481,1607,1608],{"class":502},"}\n",[455,1610,1611],{},"Result:",[655,1613,1614,1617,1620,1623],{},[658,1615,1616],{},"Users only see what they can access",[658,1618,1619],{},"No disabled buttons or grayed out items",[658,1621,1622],{},"Cleaner, simpler UI",[658,1624,1625],{},"Users might not know what they're missing",[633,1627,1629],{"id":1628},"example-2-transparent-access-control","Example 2: Transparent Access Control",[472,1631,1633],{"className":474,"code":1632,"language":476,"meta":477,"style":477},"autoAdmin: {\n  permissions: {\n    unauthorizedButtons: 'disable',\n    unauthorizedSidebarItems: 'disable'\n  }\n}\n",[467,1634,1635,1643,1651,1665,1677,1681],{"__ignoreMap":477},[481,1636,1637,1639,1641],{"class":483,"line":484},[481,1638,1558],{"class":981},[481,1640,470],{"class":502},[481,1642,515],{"class":502},[481,1644,1645,1647,1649],{"class":483,"line":506},[481,1646,1567],{"class":981},[481,1648,470],{"class":502},[481,1650,515],{"class":502},[481,1652,1653,1655,1657,1659,1661,1663],{"class":483,"line":518},[481,1654,1576],{"class":981},[481,1656,470],{"class":502},[481,1658,555],{"class":502},[481,1660,559],{"class":558},[481,1662,562],{"class":502},[481,1664,565],{"class":502},[481,1666,1667,1669,1671,1673,1675],{"class":483,"line":528},[481,1668,1591],{"class":981},[481,1670,470],{"class":502},[481,1672,555],{"class":502},[481,1674,559],{"class":558},[481,1676,606],{"class":502},[481,1678,1679],{"class":483,"line":535},[481,1680,618],{"class":502},[481,1682,1683],{"class":483,"line":541},[481,1684,1608],{"class":502},[455,1686,1611],{},[655,1688,1689,1692,1695,1698],{},[658,1690,1691],{},"Users see all features but can't use unauthorized ones",[658,1693,1694],{},"Clear indication of what exists but is restricted",[658,1696,1697],{},"Better for discovering what permissions they might need",[658,1699,1700],{},"More helpful warning messages",[633,1702,1704],{"id":1703},"example-3-balanced-approach-default","Example 3: Balanced Approach (Default)",[472,1706,1708],{"className":474,"code":1707,"language":476,"meta":477,"style":477},"autoAdmin: {\n  permissions: {\n    unauthorizedButtons: 'disable',\n    unauthorizedSidebarItems: 'hide'\n  }\n}\n",[467,1709,1710,1718,1726,1740,1752,1756],{"__ignoreMap":477},[481,1711,1712,1714,1716],{"class":483,"line":484},[481,1713,1558],{"class":981},[481,1715,470],{"class":502},[481,1717,515],{"class":502},[481,1719,1720,1722,1724],{"class":483,"line":506},[481,1721,1567],{"class":981},[481,1723,470],{"class":502},[481,1725,515],{"class":502},[481,1727,1728,1730,1732,1734,1736,1738],{"class":483,"line":518},[481,1729,1576],{"class":981},[481,1731,470],{"class":502},[481,1733,555],{"class":502},[481,1735,559],{"class":558},[481,1737,562],{"class":502},[481,1739,565],{"class":502},[481,1741,1742,1744,1746,1748,1750],{"class":483,"line":528},[481,1743,1591],{"class":981},[481,1745,470],{"class":502},[481,1747,555],{"class":502},[481,1749,603],{"class":558},[481,1751,606],{"class":502},[481,1753,1754],{"class":483,"line":535},[481,1755,618],{"class":502},[481,1757,1758],{"class":483,"line":541},[481,1759,1608],{"class":502},[455,1761,1611],{},[655,1763,1764,1767,1770],{},[658,1765,1766],{},"Sidebar is clean (only shows accessible resources)",[658,1768,1769],{},"Within accessible resources, users see disabled buttons",[658,1771,1772],{},"Good balance between discoverability and simplicity",[459,1774,1776],{"id":1775},"best-practices","Best Practices",[1778,1779,1780,1793,1802,1808,1814],"ol",{},[658,1781,1782,1785],{},[647,1783,1784],{},"Choose based on your use case:",[655,1786,1787,1790],{},[658,1788,1789],{},"Hide buttons/items for external users or strict security",[658,1791,1792],{},"Disable buttons/items for internal users who might request access",[658,1794,1795,1801],{},[647,1796,1797,1798],{},"Custom pages should always use ",[467,1799,1800],{},"canAccess"," for complex permission logic",[658,1803,1804,1807],{},[647,1805,1806],{},"The middleware protects all routes"," - even if UI shows something, the middleware will block unauthorized access",[658,1809,1810,1813],{},[647,1811,1812],{},"Test both configurations"," to see which provides better UX for your users",[658,1815,1816,1819,1820,1823],{},[647,1817,1818],{},"Permission denied messages are customizable"," via the ",[467,1821,1822],{},"getPermissionDeniedMessage"," function",[459,1825,1827],{"id":1826},"migration","Migration",[455,1829,1830],{},"If you're upgrading from a previous version:",[1778,1832,1833,1842,1845,1852],{},[658,1834,1835,1836,1838,1839,1841],{},"Add the ",[467,1837,453],{}," config to your ",[467,1840,469],{}," (optional, has defaults)",[658,1843,1844],{},"Existing functionality works as before",[658,1846,1847,1848,1851],{},"The default behavior (",[467,1849,1850],{},"unauthorizedButtons: 'disable'",") is more permissive than the old hide-only behavior",[658,1853,1854,1855],{},"If you want the old behavior, set ",[467,1856,1857],{},"unauthorizedButtons: 'hide'",[1859,1860,1861],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}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 .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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":477,"searchDepth":506,"depth":506,"links":1863},[1864,1865,1874,1879,1880,1885,1886],{"id":461,"depth":506,"text":462},{"id":630,"depth":506,"text":631,"children":1866},[1867,1868,1869,1870,1871,1872,1873],{"id":635,"depth":518,"text":636},{"id":709,"depth":518,"text":710},{"id":758,"depth":518,"text":759},{"id":937,"depth":518,"text":938},{"id":962,"depth":518,"text":963},{"id":1264,"depth":518,"text":1265},{"id":1297,"depth":518,"text":1298},{"id":1323,"depth":506,"text":1324,"children":1875},[1876,1877,1878],{"id":1327,"depth":518,"text":1328},{"id":1363,"depth":518,"text":401},{"id":1430,"depth":518,"text":1431},{"id":1460,"depth":506,"text":1461},{"id":1543,"depth":506,"text":1544,"children":1881},[1882,1883,1884],{"id":1547,"depth":518,"text":1548},{"id":1628,"depth":518,"text":1629},{"id":1703,"depth":518,"text":1704},{"id":1775,"depth":506,"text":1776},{"id":1826,"depth":506,"text":1827},"md",null,{},{"title":319,"description":457},"n_AINK2i11dm_3uzoteth7yTI_noNxLTa6tuJbBU8cw",[1893,1895],{"title":315,"path":316,"stem":317,"description":1894,"children":-1},"Customize create and edit forms with various widget types.",{"title":323,"path":324,"stem":325,"description":1896,"children":-1},"Add custom pages to your admin panel for features beyond standard CRUD operations.",1772977479603]