[{"data":1,"prerenderedAt":4558},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-ux-patterns":153,"-getting-started-ux-patterns-surround":4553},[4,35,50,59,144],{"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},"Local Development","\u002Fgetting-started\u002Flocal-development","1.getting-started\u002F3.local-development","i-lucide-terminal",{"title":21,"path":22,"stem":23,"icon":24},"Publishing Packages","\u002Fgetting-started\u002Fpublishing","1.getting-started\u002F4.publishing","i-lucide-package-check",{"title":26,"path":27,"stem":28,"icon":29},"Writing a Module","\u002Fgetting-started\u002Fwriting-a-module","1.getting-started\u002F5.writing-a-module","i-lucide-puzzle",{"title":31,"path":32,"stem":33,"icon":34},"UX Patterns","\u002Fgetting-started\u002Fux-patterns","1.getting-started\u002F6.ux-patterns","i-lucide-layout-template",{"title":36,"path":37,"stem":38,"children":39},"Applications","\u002Fapplications","2.applications",[40,45],{"title":41,"path":42,"stem":43,"icon":44},"Website","\u002Fapplications\u002Fwebsite","2.applications\u002F1.website","i-lucide-layout-dashboard",{"title":46,"path":47,"stem":48,"icon":49},"Docs","\u002Fapplications\u002Fdocs","2.applications\u002F2.docs","i-lucide-book-open",{"title":51,"path":52,"stem":53,"children":54},"Layers","\u002Flayers","3.layers",[55],{"title":56,"path":57,"stem":58},"Base Layer","\u002Flayers\u002Fbase","3.layers\u002F1.base",{"title":60,"path":61,"stem":62,"children":63},"Modules","\u002Fmodules","4.modules",[64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140],{"title":65,"path":66,"stem":67},"Account","\u002Fmodules\u002Faccount","4.modules\u002F01.account",{"title":69,"path":70,"stem":71},"Admin","\u002Fmodules\u002Fadmin","4.modules\u002F02.admin",{"title":73,"path":74,"stem":75},"Auth","\u002Fmodules\u002Fauth","4.modules\u002F03.auth",{"title":77,"path":78,"stem":79},"Authorization","\u002Fmodules\u002Fauthorization","4.modules\u002F04.authorization",{"title":81,"path":82,"stem":83},"Cookie Consent","\u002Fmodules\u002Fcookie-consent","4.modules\u002F05.cookie-consent",{"title":85,"path":86,"stem":87},"Events","\u002Fmodules\u002Fevents","4.modules\u002F06.events",{"title":89,"path":90,"stem":91},"Forms","\u002Fmodules\u002Fforms","4.modules\u002F07.forms",{"title":93,"path":94,"stem":95},"MCP","\u002Fmodules\u002Fmcp","4.modules\u002F08.mcp",{"title":97,"path":98,"stem":99},"Menu","\u002Fmodules\u002Fmenu","4.modules\u002F09.menu",{"title":101,"path":102,"stem":103},"Module Kit","\u002Fmodules\u002Fmodule-kit","4.modules\u002F10.module-kit",{"title":105,"path":106,"stem":107},"Notify","\u002Fmodules\u002Fnotify","4.modules\u002F11.notify",{"title":109,"path":110,"stem":111},"OAuth Server","\u002Fmodules\u002Foauth-server","4.modules\u002F12.oauth-server",{"title":113,"path":114,"stem":115},"Payments","\u002Fmodules\u002Fpayments","4.modules\u002F13.payments",{"title":117,"path":118,"stem":119},"Preferences","\u002Fmodules\u002Fpreferences","4.modules\u002F14.preferences",{"title":121,"path":122,"stem":123},"Stripe","\u002Fmodules\u002Fstripe","4.modules\u002F15.stripe",{"title":125,"path":126,"stem":127},"Subscriptions","\u002Fmodules\u002Fsubscriptions","4.modules\u002F16.subscriptions",{"title":129,"path":130,"stem":131},"UI","\u002Fmodules\u002Fui","4.modules\u002F17.ui",{"title":133,"path":134,"stem":135},"Users","\u002Fmodules\u002Fusers","4.modules\u002F18.users",{"title":137,"path":138,"stem":139},"Widget","\u002Fmodules\u002Fwidget","4.modules\u002F19.widget",{"title":141,"path":142,"stem":143},"Email Templates","\u002Fmodules\u002Femail-templates","4.modules\u002F20.email-templates",{"title":145,"path":146,"stem":147,"children":148},"Packages","\u002Fpackages","5.packages",[149],{"title":150,"path":151,"stem":152},"CLI","\u002Fpackages\u002Fcli","5.packages\u002F4.cli",{"id":154,"title":31,"body":155,"description":4545,"extension":4546,"links":4547,"meta":4548,"navigation":4549,"path":32,"seo":4550,"stem":33,"__hash__":4552},"docs\u002F1.getting-started\u002F6.ux-patterns.md",{"type":156,"value":157,"toc":4519},"minimark",[158,182,190,195,198,290,294,301,358,365,368,398,401,422,426,430,433,517,528,531,575,2264,2284,2290,2294,2364,2368,2371,2416,2420,2427,2431,2448,2452,2462,2465,2469,2517,3318,3322,3345,4214,4218,4235,4239,4250,4254,4282,4286,4295,4299,4357,4361,4419,4423,4515],[159,160,161,162,169,170,175,176,181],"p",{},"Every module that ships screens follows the same handful of patterns, so the app feels like one product no matter which\nmodules are installed. The building blocks live in ",[163,164,165],"a",{"href":130},[166,167,168],"code",{},"@frigear-nu\u002Fui","; the admin shell is\n",[163,171,172],{"href":70},[166,173,174],{},"@frigear-nu\u002Fadmin"," and the account shell is ",[163,177,178],{"href":66},[166,179,180],{},"@frigear-nu\u002Faccount",". This page is\nthe rulebook: read it before adding a page, and follow it when reviewing one.",[183,184,185,186,189],"note",{},"These are patterns, not a theme. Colours, fonts and radius stay whatever Nuxt UI (and your app's ",[166,187,188],{},"app.config.ts",") says;\nthe shared components only add structure and spacing.",[191,192,194],"h2",{"id":193},"layout-and-navigation","Layout and navigation",[159,196,197],{},"There are three areas, each with its own layout. A page picks its area by path, not by importing a layout.",[199,200,201,220],"table",{},[202,203,204],"thead",{},[205,206,207,211,214,217],"tr",{},[208,209,210],"th",{},"Area",[208,212,213],{},"Paths",[208,215,216],{},"Layout",[208,218,219],{},"What it is",[221,222,223,248,270],"tbody",{},[205,224,225,229,232,241],{},[226,227,228],"td",{},"Public site",[226,230,231],{},"everything else",[226,233,234,237,238],{},[166,235,236],{},"default"," from the ",[163,239,240],{"href":57},"base layer",[226,242,243,244,247],{},"Header and footer. Public pages use ",[166,245,246],{},"UContainer > UPage",".",[205,249,250,253,258,267],{},[226,251,252],{},"Admin back office",[226,254,255],{},[166,256,257],{},"\u002Fadmin\u002F**",[226,259,260,263,264,266],{},[166,261,262],{},"admin"," (",[163,265,69],{"href":70},")",[226,268,269],{},"Dashboard shell: a collapsible sidebar with grouped navigation, a ⌘K palette and the account menu in the sidebar footer.",[205,271,272,275,280,287],{},[226,273,274],{},"Account area",[226,276,277],{},[166,278,279],{},"\u002Faccount\u002F**",[226,281,282,263,285,266],{},[166,283,284],{},"account",[163,286,65],{"href":66},[226,288,289],{},"Inside the site layout, with a persistent left account navigation.",[291,292,252],"h3",{"id":293},"admin-back-office",[159,295,296,297,300],{},"The sidebar navigation is grouped, and each group reads its own ",[163,298,299],{"href":98},"menu"," path:",[199,302,303,316],{},[202,304,305],{},[205,306,307,310,313],{},[208,308,309],{},"Group",[208,311,312],{},"Menu path",[208,314,315],{},"Put here",[221,317,318,331,345],{},[205,319,320,323,328],{},[226,321,322],{},"Overview",[226,324,325],{},[166,326,327],{},"admin.nav.overview",[226,329,330],{},"The dashboard.",[205,332,333,336,342],{},[226,334,335],{},"Manage",[226,337,338,341],{},[166,339,340],{},"admin.nav"," (root)",[226,343,344],{},"The things staff manage every day: users, events, forms.",[205,346,347,350,355],{},[226,348,349],{},"Settings",[226,351,352],{},[166,353,354],{},"admin.nav.settings",[226,356,357],{},"Configuration: OAuth applications, integrations.",[159,359,360,361,247],{},"New features go into one of these groups. A new group needs a reason, such as a whole new class of screens that\ndoes not read as \"managing\" or \"settings\". The ⌘K palette lists the same groups, so a page that is in the navigation is\nalso searchable. Colour mode is not in the chrome: it lives in the account menu under ",[362,363,364],"strong",{},"Appearance",[291,366,274],{"id":367},"account-area",[159,369,370,372,373,375,376,379,380,382,383,386,387,390,391,394,395,397],{},[166,371,279],{}," renders in the ",[166,374,284],{}," layout: the site header and footer stay, and the page body gets a left\nnavigation (",[166,377,378],{},"UPageAside",") built from the ",[166,381,284],{}," menu. On narrow screens the navigation becomes a tab strip above\nthe content. ",[166,384,385],{},"\u002Faccount"," itself is an overview: a summary card, the ",[166,388,389],{},"account.overview"," ",[163,392,393],{"href":138},"widget"," area\nand shortcuts to the other pages. A module adds a page by registering the route and an item in the ",[166,396,284],{},"\nmenu; it never draws its own account navigation.",[291,399,228],{"id":400},"public-site",[159,402,403,404,406,407,410,411,414,415,418,419,421],{},"Public pages (events, forms, content) use ",[166,405,246],{}," with ",[166,408,409],{},"UPageHeader"," for the title and ",[166,412,413],{},"UPageSection"," for\nbands. App pages, meaning everything in the admin and account areas, use ",[166,416,417],{},"PageHeading"," instead. Do not mix them: the\npublic header is a marketing-sized hero, ",[166,420,417],{}," is a working title with actions.",[191,423,425],{"id":424},"pages","Pages",[291,427,429],{"id":428},"lists","Lists",[159,431,432],{},"A top-level entity gets a list page and a detail page.",[434,435,436,445,451,474,485,492,506],"ul",{},[437,438,439,441,442,247],"li",{},[166,440,417],{}," with the entity's name and the primary action (\"Add user\", \"New event\") in ",[166,443,444],{},"#actions",[437,446,447,450],{},[166,448,449],{},"PageToolbar"," with search and filters once the list is longer than about eight rows; leave it out for short lists.",[437,452,453,454,457,458,461,462,465,466,469,470,473],{},"A ",[166,455,456],{},"UTable"," inside ",[166,459,460],{},"TableCard",", with ",[166,463,464],{},"tableUi()"," for the shared table styling: small muted headers, compact rows on\ndesktop, taller rows on mobile. Rows are clickable and open the detail page. Long lists add ",[166,467,468],{},"sticky"," and\n",[166,471,472],{},"tableUi({}, { sticky: true })"," so the header stays in view while the table scrolls inside its card.",[437,475,453,476,479,480,484],{},[166,477,478],{},"RowMenu"," in the last column for the row's actions (see ",[163,481,483],{"href":482},"#forms-and-actions","Forms and actions",").",[437,486,487,488,491],{},"Sortable columns use ",[166,489,490],{},"useTableSort().header(id, label)",": a ghost button that cycles ascending, descending, unsorted.",[437,493,494,497,498,501,502,505],{},[166,495,496],{},"TablePagination"," goes in the card's ",[166,499,500],{},"#footer"," (\"21–40 of 132\", rows per page, pages). Server-paginated lists keep\npage, page size, search, sort and filters in the URL with ",[166,503,504],{},"useTableQuery",", so a filtered list can be linked and\nsurvives a reload.",[437,507,508,509,263,512,516],{},"An empty list is a ",[166,510,511],{},"UEmpty",[163,513,515],{"href":514},"#empty-states","empty states","), not an empty table.",[159,518,519,520,523,524,527],{},"Loading never blanks a list that is already on screen. ",[166,521,522],{},"TableCard :loading"," shows skeleton rows on the first load\nonly; every load after that (the next page, a new sort, a search) passes ",[166,525,526],{},":refreshing",", which keeps the current rows\nand dims them until the new ones arrive.",[159,529,530],{},"Cells follow the same conventions everywhere:",[434,532,533,544,559,566],{},[437,534,535,536,539,540,543],{},"The first column is a ",[166,537,538],{},"TableIdentity",": the name, with a muted second line (an email, a slug) and an optional avatar\nor icon. Badges that belong to the name go in its ",[166,541,542],{},"#badges"," slot.",[437,545,546,547,550,551,554,555,558],{},"Numbers are right-aligned with tabular figures (",[166,548,549],{},"meta: numericColumn","); dates use ",[166,552,553],{},"useFormat()"," in a\n",[166,556,557],{},"tabular-nums"," span.",[437,560,561,562,565],{},"A missing value is ",[166,563,564],{},"emptyCell()",", a dimmed dash, not an empty cell.",[437,567,568,569,406,572,247],{},"Status badges are ",[166,570,571],{},"variant=\"subtle\"",[166,573,574],{},"statusColor",[576,577,582],"pre",{"className":578,"code":579,"language":580,"meta":581,"style":581},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport type { TableColumn } from '@nuxt\u002Fui'\n\nconst t = useModuleT('events')\nconst format = useFormat()\nconst actions = useEventActions()\n\nconst { page, pageSize, search, sort: sortState, query } = useTableQuery({ sort: { id: 'startsAt', desc: true } })\nconst { header } = useTableSort(null, sortState)\nconst { data, status } = await useFetch('\u002Fapi\u002Fevents', { query, default: () => ({ items: [], total: 0 }) })\nconst pending = computed(() => status.value === 'pending')\n\nconst TableIdentity = resolveComponent('TableIdentity')\nconst RowMenu = resolveComponent('RowMenu')\nconst columns: TableColumn\u003CEventRow>[] = [\n  {\n    accessorKey: 'title',\n    header: header('title', t('admin.title', 'Title')),\n    cell: ({ row }) => h(TableIdentity, { title: row.original.title, description: row.original.location }),\n  },\n  { accessorKey: 'startsAt', header: header('startsAt', t('admin.starts', 'Starts')) },\n  { accessorKey: 'capacity', header: t('admin.capacity', 'Capacity'), meta: numericColumn },\n  { id: 'actions', cell: ({ row }) => h(RowMenu, { items: actions.menu(row.original), subject: row.original.title }) },\n]\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"flex flex-col gap-4\">\n    \u003CPageHeading :title=\"t('admin.events', 'Events')\">\n      \u003Ctemplate #actions>\n        \u003CUButton icon=\"i-lucide-plus\" :label=\"t('admin.create', 'New event')\" @click=\"actions.create()\" \u002F>\n      \u003C\u002Ftemplate>\n    \u003C\u002FPageHeading>\n\n    \u003CPageToolbar>\n      \u003CUInput v-model=\"search\" icon=\"i-lucide-search\" :placeholder=\"t('admin.search', 'Search events')\" \u002F>\n    \u003C\u002FPageToolbar>\n\n    \u003CTableCard :loading=\"pending && !data.items.length\" :refreshing=\"pending && !!data.items.length\">\n      \u003CUTable\n        :data=\"data.items\"\n        :columns=\"columns\"\n        :ui=\"tableUi({}, { sticky: true })\"\n        sticky\n        @select=\"(_, row) => navigateTo(`\u002Fadmin\u002Fevents\u002F${row.original.id}`)\"\n      >\n        \u003Ctemplate #startsAt-cell=\"{ row }\">\n          \u003Cspan class=\"tabular-nums\">{{ format.dateTime(row.original.startsAt) }}\u003C\u002Fspan>\n        \u003C\u002Ftemplate>\n        \u003Ctemplate #empty>\n          \u003CUEmpty variant=\"naked\" icon=\"i-lucide-calendar\" :title=\"t('admin.empty', 'No events yet')\">\n            \u003Ctemplate #actions>\n              \u003CUButton :label=\"t('admin.create', 'New event')\" @click=\"actions.create()\" \u002F>\n            \u003C\u002Ftemplate>\n          \u003C\u002FUEmpty>\n        \u003C\u002Ftemplate>\n      \u003C\u002FUTable>\n      \u003Ctemplate #footer>\n        \u003CTablePagination v-model:page=\"page\" v-model:page-size=\"pageSize\" :total=\"data.total\" \u002F>\n      \u003C\u002Ftemplate>\n    \u003C\u002FTableCard>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","vue","",[166,583,584,619,651,658,687,703,718,723,809,834,920,960,965,988,1010,1039,1045,1063,1110,1180,1186,1247,1303,1386,1392,1402,1407,1417,1440,1484,1499,1577,1587,1597,1602,1611,1677,1686,1691,1755,1763,1784,1800,1830,1836,1896,1902,1929,1958,1968,1982,2046,2060,2118,2128,2138,2147,2156,2170,2227,2236,2245,2255],{"__ignoreMap":581},[585,586,589,593,597,601,604,607,610,614,616],"span",{"class":587,"line":588},"line",1,[585,590,592],{"class":591},"sMK4o","\u003C",[585,594,596],{"class":595},"swJcz","script",[585,598,600],{"class":599},"spNyl"," setup",[585,602,603],{"class":599}," lang",[585,605,606],{"class":591},"=",[585,608,609],{"class":591},"\"",[585,611,613],{"class":612},"sfazB","ts",[585,615,609],{"class":591},[585,617,618],{"class":591},">\n",[585,620,622,626,629,632,636,639,642,645,648],{"class":587,"line":621},2,[585,623,625],{"class":624},"s7zQu","import",[585,627,628],{"class":624}," type",[585,630,631],{"class":591}," {",[585,633,635],{"class":634},"sTEyZ"," TableColumn",[585,637,638],{"class":591}," }",[585,640,641],{"class":624}," from",[585,643,644],{"class":591}," '",[585,646,647],{"class":612},"@nuxt\u002Fui",[585,649,650],{"class":591},"'\n",[585,652,654],{"class":587,"line":653},3,[585,655,657],{"emptyLinePlaceholder":656},true,"\n",[585,659,661,664,667,669,673,676,679,682,684],{"class":587,"line":660},4,[585,662,663],{"class":599},"const",[585,665,666],{"class":634}," t ",[585,668,606],{"class":591},[585,670,672],{"class":671},"s2Zo4"," useModuleT",[585,674,675],{"class":634},"(",[585,677,678],{"class":591},"'",[585,680,681],{"class":612},"events",[585,683,678],{"class":591},[585,685,686],{"class":634},")\n",[585,688,690,692,695,697,700],{"class":587,"line":689},5,[585,691,663],{"class":599},[585,693,694],{"class":634}," format ",[585,696,606],{"class":591},[585,698,699],{"class":671}," useFormat",[585,701,702],{"class":634},"()\n",[585,704,706,708,711,713,716],{"class":587,"line":705},6,[585,707,663],{"class":599},[585,709,710],{"class":634}," actions ",[585,712,606],{"class":591},[585,714,715],{"class":671}," useEventActions",[585,717,702],{"class":634},[585,719,721],{"class":587,"line":720},7,[585,722,657],{"emptyLinePlaceholder":656},[585,724,726,728,730,733,736,739,741,744,746,749,752,755,757,760,763,766,769,771,774,776,778,780,783,785,787,790,792,794,797,799,803,805,807],{"class":587,"line":725},8,[585,727,663],{"class":599},[585,729,631],{"class":591},[585,731,732],{"class":634}," page",[585,734,735],{"class":591},",",[585,737,738],{"class":634}," pageSize",[585,740,735],{"class":591},[585,742,743],{"class":634}," search",[585,745,735],{"class":591},[585,747,748],{"class":595}," sort",[585,750,751],{"class":591},":",[585,753,754],{"class":634}," sortState",[585,756,735],{"class":591},[585,758,759],{"class":634}," query ",[585,761,762],{"class":591},"}",[585,764,765],{"class":591}," =",[585,767,768],{"class":671}," useTableQuery",[585,770,675],{"class":634},[585,772,773],{"class":591},"{",[585,775,748],{"class":595},[585,777,751],{"class":591},[585,779,631],{"class":591},[585,781,782],{"class":595}," id",[585,784,751],{"class":591},[585,786,644],{"class":591},[585,788,789],{"class":612},"startsAt",[585,791,678],{"class":591},[585,793,735],{"class":591},[585,795,796],{"class":595}," desc",[585,798,751],{"class":591},[585,800,802],{"class":801},"sfNiH"," true",[585,804,638],{"class":591},[585,806,638],{"class":591},[585,808,686],{"class":634},[585,810,812,814,816,819,821,823,826,828,831],{"class":587,"line":811},9,[585,813,663],{"class":599},[585,815,631],{"class":591},[585,817,818],{"class":634}," header ",[585,820,762],{"class":591},[585,822,765],{"class":591},[585,824,825],{"class":671}," useTableSort",[585,827,675],{"class":634},[585,829,830],{"class":591},"null,",[585,832,833],{"class":634}," sortState)\n",[585,835,837,839,841,844,846,849,851,853,856,859,861,863,866,868,870,872,875,877,880,882,885,888,890,892,895,897,900,902,905,907,911,913,916,918],{"class":587,"line":836},10,[585,838,663],{"class":599},[585,840,631],{"class":591},[585,842,843],{"class":634}," data",[585,845,735],{"class":591},[585,847,848],{"class":634}," status ",[585,850,762],{"class":591},[585,852,765],{"class":591},[585,854,855],{"class":624}," await",[585,857,858],{"class":671}," useFetch",[585,860,675],{"class":634},[585,862,678],{"class":591},[585,864,865],{"class":612},"\u002Fapi\u002Fevents",[585,867,678],{"class":591},[585,869,735],{"class":591},[585,871,631],{"class":591},[585,873,874],{"class":634}," query",[585,876,735],{"class":591},[585,878,879],{"class":671}," default",[585,881,751],{"class":591},[585,883,884],{"class":591}," ()",[585,886,887],{"class":599}," =>",[585,889,263],{"class":634},[585,891,773],{"class":591},[585,893,894],{"class":595}," items",[585,896,751],{"class":591},[585,898,899],{"class":634}," []",[585,901,735],{"class":591},[585,903,904],{"class":595}," total",[585,906,751],{"class":591},[585,908,910],{"class":909},"sbssI"," 0",[585,912,638],{"class":591},[585,914,915],{"class":634},") ",[585,917,762],{"class":591},[585,919,686],{"class":634},[585,921,923,925,928,930,933,935,938,940,943,945,948,951,953,956,958],{"class":587,"line":922},11,[585,924,663],{"class":599},[585,926,927],{"class":634}," pending ",[585,929,606],{"class":591},[585,931,932],{"class":671}," computed",[585,934,675],{"class":634},[585,936,937],{"class":591},"()",[585,939,887],{"class":599},[585,941,942],{"class":634}," status",[585,944,247],{"class":591},[585,946,947],{"class":634},"value ",[585,949,950],{"class":591},"===",[585,952,644],{"class":591},[585,954,955],{"class":612},"pending",[585,957,678],{"class":591},[585,959,686],{"class":634},[585,961,963],{"class":587,"line":962},12,[585,964,657],{"emptyLinePlaceholder":656},[585,966,968,970,973,975,978,980,982,984,986],{"class":587,"line":967},13,[585,969,663],{"class":599},[585,971,972],{"class":634}," TableIdentity ",[585,974,606],{"class":591},[585,976,977],{"class":671}," resolveComponent",[585,979,675],{"class":634},[585,981,678],{"class":591},[585,983,538],{"class":612},[585,985,678],{"class":591},[585,987,686],{"class":634},[585,989,991,993,996,998,1000,1002,1004,1006,1008],{"class":587,"line":990},14,[585,992,663],{"class":599},[585,994,995],{"class":634}," RowMenu ",[585,997,606],{"class":591},[585,999,977],{"class":671},[585,1001,675],{"class":634},[585,1003,678],{"class":591},[585,1005,478],{"class":612},[585,1007,678],{"class":591},[585,1009,686],{"class":634},[585,1011,1013,1015,1018,1020,1023,1025,1028,1031,1034,1036],{"class":587,"line":1012},15,[585,1014,663],{"class":599},[585,1016,1017],{"class":634}," columns",[585,1019,751],{"class":591},[585,1021,635],{"class":1022},"sBMFI",[585,1024,592],{"class":591},[585,1026,1027],{"class":1022},"EventRow",[585,1029,1030],{"class":591},">",[585,1032,1033],{"class":634},"[] ",[585,1035,606],{"class":591},[585,1037,1038],{"class":634}," [\n",[585,1040,1042],{"class":587,"line":1041},16,[585,1043,1044],{"class":591},"  {\n",[585,1046,1048,1051,1053,1055,1058,1060],{"class":587,"line":1047},17,[585,1049,1050],{"class":595},"    accessorKey",[585,1052,751],{"class":591},[585,1054,644],{"class":591},[585,1056,1057],{"class":612},"title",[585,1059,678],{"class":591},[585,1061,1062],{"class":591},",\n",[585,1064,1066,1069,1071,1074,1076,1078,1080,1082,1084,1087,1089,1091,1094,1096,1098,1100,1103,1105,1108],{"class":587,"line":1065},18,[585,1067,1068],{"class":595},"    header",[585,1070,751],{"class":591},[585,1072,1073],{"class":671}," header",[585,1075,675],{"class":634},[585,1077,678],{"class":591},[585,1079,1057],{"class":612},[585,1081,678],{"class":591},[585,1083,735],{"class":591},[585,1085,1086],{"class":671}," t",[585,1088,675],{"class":634},[585,1090,678],{"class":591},[585,1092,1093],{"class":612},"admin.title",[585,1095,678],{"class":591},[585,1097,735],{"class":591},[585,1099,644],{"class":591},[585,1101,1102],{"class":612},"Title",[585,1104,678],{"class":591},[585,1106,1107],{"class":634},"))",[585,1109,1062],{"class":591},[585,1111,1113,1116,1118,1121,1125,1128,1130,1133,1136,1138,1140,1143,1145,1147,1149,1152,1154,1156,1158,1161,1163,1165,1167,1169,1171,1174,1176,1178],{"class":587,"line":1112},19,[585,1114,1115],{"class":671},"    cell",[585,1117,751],{"class":591},[585,1119,1120],{"class":591}," ({",[585,1122,1124],{"class":1123},"sHdIc"," row",[585,1126,1127],{"class":591}," })",[585,1129,887],{"class":599},[585,1131,1132],{"class":671}," h",[585,1134,1135],{"class":634},"(TableIdentity",[585,1137,735],{"class":591},[585,1139,631],{"class":591},[585,1141,1142],{"class":595}," title",[585,1144,751],{"class":591},[585,1146,1124],{"class":634},[585,1148,247],{"class":591},[585,1150,1151],{"class":634},"original",[585,1153,247],{"class":591},[585,1155,1057],{"class":634},[585,1157,735],{"class":591},[585,1159,1160],{"class":595}," description",[585,1162,751],{"class":591},[585,1164,1124],{"class":634},[585,1166,247],{"class":591},[585,1168,1151],{"class":634},[585,1170,247],{"class":591},[585,1172,1173],{"class":634},"location ",[585,1175,762],{"class":591},[585,1177,266],{"class":634},[585,1179,1062],{"class":591},[585,1181,1183],{"class":587,"line":1182},20,[585,1184,1185],{"class":591},"  },\n",[585,1187,1189,1192,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1230,1232,1234,1236,1239,1241,1244],{"class":587,"line":1188},21,[585,1190,1191],{"class":591},"  {",[585,1193,1194],{"class":595}," accessorKey",[585,1196,751],{"class":591},[585,1198,644],{"class":591},[585,1200,789],{"class":612},[585,1202,678],{"class":591},[585,1204,735],{"class":591},[585,1206,1073],{"class":595},[585,1208,751],{"class":591},[585,1210,1073],{"class":671},[585,1212,675],{"class":634},[585,1214,678],{"class":591},[585,1216,789],{"class":612},[585,1218,678],{"class":591},[585,1220,735],{"class":591},[585,1222,1086],{"class":671},[585,1224,675],{"class":634},[585,1226,678],{"class":591},[585,1228,1229],{"class":612},"admin.starts",[585,1231,678],{"class":591},[585,1233,735],{"class":591},[585,1235,644],{"class":591},[585,1237,1238],{"class":612},"Starts",[585,1240,678],{"class":591},[585,1242,1243],{"class":634},")) ",[585,1245,1246],{"class":591},"},\n",[585,1248,1250,1252,1254,1256,1258,1261,1263,1265,1267,1269,1271,1273,1275,1278,1280,1282,1284,1287,1289,1291,1293,1296,1298,1301],{"class":587,"line":1249},22,[585,1251,1191],{"class":591},[585,1253,1194],{"class":595},[585,1255,751],{"class":591},[585,1257,644],{"class":591},[585,1259,1260],{"class":612},"capacity",[585,1262,678],{"class":591},[585,1264,735],{"class":591},[585,1266,1073],{"class":595},[585,1268,751],{"class":591},[585,1270,1086],{"class":671},[585,1272,675],{"class":634},[585,1274,678],{"class":591},[585,1276,1277],{"class":612},"admin.capacity",[585,1279,678],{"class":591},[585,1281,735],{"class":591},[585,1283,644],{"class":591},[585,1285,1286],{"class":612},"Capacity",[585,1288,678],{"class":591},[585,1290,266],{"class":634},[585,1292,735],{"class":591},[585,1294,1295],{"class":595}," meta",[585,1297,751],{"class":591},[585,1299,1300],{"class":634}," numericColumn ",[585,1302,1246],{"class":591},[585,1304,1306,1308,1310,1312,1314,1317,1319,1321,1324,1326,1328,1330,1332,1334,1336,1339,1341,1343,1345,1347,1350,1352,1354,1357,1359,1362,1364,1367,1369,1371,1373,1375,1377,1380,1382,1384],{"class":587,"line":1305},23,[585,1307,1191],{"class":591},[585,1309,782],{"class":595},[585,1311,751],{"class":591},[585,1313,644],{"class":591},[585,1315,1316],{"class":612},"actions",[585,1318,678],{"class":591},[585,1320,735],{"class":591},[585,1322,1323],{"class":671}," cell",[585,1325,751],{"class":591},[585,1327,1120],{"class":591},[585,1329,1124],{"class":1123},[585,1331,1127],{"class":591},[585,1333,887],{"class":599},[585,1335,1132],{"class":671},[585,1337,1338],{"class":634},"(RowMenu",[585,1340,735],{"class":591},[585,1342,631],{"class":591},[585,1344,894],{"class":595},[585,1346,751],{"class":591},[585,1348,1349],{"class":634}," actions",[585,1351,247],{"class":591},[585,1353,299],{"class":671},[585,1355,1356],{"class":634},"(row",[585,1358,247],{"class":591},[585,1360,1361],{"class":634},"original)",[585,1363,735],{"class":591},[585,1365,1366],{"class":595}," subject",[585,1368,751],{"class":591},[585,1370,1124],{"class":634},[585,1372,247],{"class":591},[585,1374,1151],{"class":634},[585,1376,247],{"class":591},[585,1378,1379],{"class":634},"title ",[585,1381,762],{"class":591},[585,1383,915],{"class":634},[585,1385,1246],{"class":591},[585,1387,1389],{"class":587,"line":1388},24,[585,1390,1391],{"class":634},"]\n",[585,1393,1395,1398,1400],{"class":587,"line":1394},25,[585,1396,1397],{"class":591},"\u003C\u002F",[585,1399,596],{"class":595},[585,1401,618],{"class":591},[585,1403,1405],{"class":587,"line":1404},26,[585,1406,657],{"emptyLinePlaceholder":656},[585,1408,1410,1412,1415],{"class":587,"line":1409},27,[585,1411,592],{"class":591},[585,1413,1414],{"class":595},"template",[585,1416,618],{"class":591},[585,1418,1420,1423,1426,1429,1431,1433,1436,1438],{"class":587,"line":1419},28,[585,1421,1422],{"class":591},"  \u003C",[585,1424,1425],{"class":595},"div",[585,1427,1428],{"class":599}," class",[585,1430,606],{"class":591},[585,1432,609],{"class":591},[585,1434,1435],{"class":612},"flex flex-col gap-4",[585,1437,609],{"class":591},[585,1439,618],{"class":591},[585,1441,1443,1446,1448,1451,1453,1455,1457,1460,1462,1464,1467,1469,1472,1474,1476,1478,1480,1482],{"class":587,"line":1442},29,[585,1444,1445],{"class":591},"    \u003C",[585,1447,417],{"class":595},[585,1449,1450],{"class":591}," :",[585,1452,1057],{"class":599},[585,1454,606],{"class":591},[585,1456,609],{"class":591},[585,1458,1459],{"class":671},"t",[585,1461,675],{"class":591},[585,1463,678],{"class":591},[585,1465,1466],{"class":612},"admin.events",[585,1468,678],{"class":591},[585,1470,1471],{"class":591},", ",[585,1473,678],{"class":591},[585,1475,85],{"class":612},[585,1477,678],{"class":591},[585,1479,266],{"class":591},[585,1481,609],{"class":591},[585,1483,618],{"class":591},[585,1485,1487,1490,1492,1495,1497],{"class":587,"line":1486},30,[585,1488,1489],{"class":591},"      \u003C",[585,1491,1414],{"class":595},[585,1493,1494],{"class":591}," #",[585,1496,1316],{"class":599},[585,1498,618],{"class":591},[585,1500,1502,1505,1508,1511,1513,1515,1518,1520,1522,1525,1527,1529,1531,1533,1535,1538,1540,1542,1544,1547,1549,1551,1553,1556,1559,1561,1563,1565,1567,1570,1572,1574],{"class":587,"line":1501},31,[585,1503,1504],{"class":591},"        \u003C",[585,1506,1507],{"class":595},"UButton",[585,1509,1510],{"class":599}," icon",[585,1512,606],{"class":591},[585,1514,609],{"class":591},[585,1516,1517],{"class":612},"i-lucide-plus",[585,1519,609],{"class":591},[585,1521,1450],{"class":591},[585,1523,1524],{"class":599},"label",[585,1526,606],{"class":591},[585,1528,609],{"class":591},[585,1530,1459],{"class":671},[585,1532,675],{"class":591},[585,1534,678],{"class":591},[585,1536,1537],{"class":612},"admin.create",[585,1539,678],{"class":591},[585,1541,1471],{"class":591},[585,1543,678],{"class":591},[585,1545,1546],{"class":612},"New event",[585,1548,678],{"class":591},[585,1550,266],{"class":591},[585,1552,609],{"class":591},[585,1554,1555],{"class":591}," @",[585,1557,1558],{"class":599},"click",[585,1560,606],{"class":591},[585,1562,609],{"class":591},[585,1564,1316],{"class":634},[585,1566,247],{"class":591},[585,1568,1569],{"class":671},"create",[585,1571,937],{"class":591},[585,1573,609],{"class":591},[585,1575,1576],{"class":591}," \u002F>\n",[585,1578,1580,1583,1585],{"class":587,"line":1579},32,[585,1581,1582],{"class":591},"      \u003C\u002F",[585,1584,1414],{"class":595},[585,1586,618],{"class":591},[585,1588,1590,1593,1595],{"class":587,"line":1589},33,[585,1591,1592],{"class":591},"    \u003C\u002F",[585,1594,417],{"class":595},[585,1596,618],{"class":591},[585,1598,1600],{"class":587,"line":1599},34,[585,1601,657],{"emptyLinePlaceholder":656},[585,1603,1605,1607,1609],{"class":587,"line":1604},35,[585,1606,1445],{"class":591},[585,1608,449],{"class":595},[585,1610,618],{"class":591},[585,1612,1614,1616,1619,1622,1624,1626,1629,1631,1633,1635,1637,1640,1642,1644,1647,1649,1651,1653,1655,1657,1660,1662,1664,1666,1669,1671,1673,1675],{"class":587,"line":1613},36,[585,1615,1489],{"class":591},[585,1617,1618],{"class":595},"UInput",[585,1620,1621],{"class":599}," v-model",[585,1623,606],{"class":591},[585,1625,609],{"class":591},[585,1627,1628],{"class":634},"search",[585,1630,609],{"class":591},[585,1632,1510],{"class":599},[585,1634,606],{"class":591},[585,1636,609],{"class":591},[585,1638,1639],{"class":612},"i-lucide-search",[585,1641,609],{"class":591},[585,1643,1450],{"class":591},[585,1645,1646],{"class":599},"placeholder",[585,1648,606],{"class":591},[585,1650,609],{"class":591},[585,1652,1459],{"class":671},[585,1654,675],{"class":591},[585,1656,678],{"class":591},[585,1658,1659],{"class":612},"admin.search",[585,1661,678],{"class":591},[585,1663,1471],{"class":591},[585,1665,678],{"class":591},[585,1667,1668],{"class":612},"Search events",[585,1670,678],{"class":591},[585,1672,266],{"class":591},[585,1674,609],{"class":591},[585,1676,1576],{"class":591},[585,1678,1680,1682,1684],{"class":587,"line":1679},37,[585,1681,1592],{"class":591},[585,1683,449],{"class":595},[585,1685,618],{"class":591},[585,1687,1689],{"class":587,"line":1688},38,[585,1690,657],{"emptyLinePlaceholder":656},[585,1692,1694,1696,1698,1700,1703,1705,1707,1709,1712,1715,1717,1720,1722,1725,1727,1729,1732,1734,1736,1738,1741,1743,1745,1747,1749,1751,1753],{"class":587,"line":1693},39,[585,1695,1445],{"class":591},[585,1697,460],{"class":595},[585,1699,1450],{"class":591},[585,1701,1702],{"class":599},"loading",[585,1704,606],{"class":591},[585,1706,609],{"class":591},[585,1708,955],{"class":634},[585,1710,1711],{"class":591}," && !",[585,1713,1714],{"class":634},"data",[585,1716,247],{"class":591},[585,1718,1719],{"class":634},"items",[585,1721,247],{"class":591},[585,1723,1724],{"class":634},"length",[585,1726,609],{"class":591},[585,1728,1450],{"class":591},[585,1730,1731],{"class":599},"refreshing",[585,1733,606],{"class":591},[585,1735,609],{"class":591},[585,1737,955],{"class":634},[585,1739,1740],{"class":591}," && !!",[585,1742,1714],{"class":634},[585,1744,247],{"class":591},[585,1746,1719],{"class":634},[585,1748,247],{"class":591},[585,1750,1724],{"class":634},[585,1752,609],{"class":591},[585,1754,618],{"class":591},[585,1756,1758,1760],{"class":587,"line":1757},40,[585,1759,1489],{"class":591},[585,1761,1762],{"class":595},"UTable\n",[585,1764,1766,1769,1771,1773,1775,1777,1779,1781],{"class":587,"line":1765},41,[585,1767,1768],{"class":591},"        :",[585,1770,1714],{"class":599},[585,1772,606],{"class":591},[585,1774,609],{"class":591},[585,1776,1714],{"class":634},[585,1778,247],{"class":591},[585,1780,1719],{"class":634},[585,1782,1783],{"class":591},"\"\n",[585,1785,1787,1789,1792,1794,1796,1798],{"class":587,"line":1786},42,[585,1788,1768],{"class":591},[585,1790,1791],{"class":599},"columns",[585,1793,606],{"class":591},[585,1795,609],{"class":591},[585,1797,1791],{"class":634},[585,1799,1783],{"class":591},[585,1801,1803,1805,1808,1810,1812,1815,1818,1820,1823,1826,1828],{"class":587,"line":1802},43,[585,1804,1768],{"class":591},[585,1806,1807],{"class":599},"ui",[585,1809,606],{"class":591},[585,1811,609],{"class":591},[585,1813,1814],{"class":671},"tableUi",[585,1816,1817],{"class":591},"({}, { ",[585,1819,468],{"class":595},[585,1821,1822],{"class":591},": ",[585,1824,1825],{"class":801},"true",[585,1827,1127],{"class":591},[585,1829,1783],{"class":591},[585,1831,1833],{"class":587,"line":1832},44,[585,1834,1835],{"class":599},"        sticky\n",[585,1837,1839,1842,1845,1847,1849,1851,1854,1856,1859,1861,1864,1867,1869,1872,1875,1878,1880,1882,1884,1886,1889,1892,1894],{"class":587,"line":1838},45,[585,1840,1841],{"class":591},"        @",[585,1843,1844],{"class":599},"select",[585,1846,606],{"class":591},[585,1848,609],{"class":591},[585,1850,675],{"class":591},[585,1852,1853],{"class":1123},"_",[585,1855,1471],{"class":591},[585,1857,1858],{"class":1123},"row",[585,1860,915],{"class":591},[585,1862,1863],{"class":599},"=>",[585,1865,1866],{"class":671}," navigateTo",[585,1868,675],{"class":591},[585,1870,1871],{"class":591},"`",[585,1873,1874],{"class":612},"\u002Fadmin\u002Fevents\u002F",[585,1876,1877],{"class":591},"${",[585,1879,1858],{"class":634},[585,1881,247],{"class":591},[585,1883,1151],{"class":634},[585,1885,247],{"class":591},[585,1887,1888],{"class":634},"id",[585,1890,1891],{"class":591},"}`",[585,1893,266],{"class":591},[585,1895,1783],{"class":591},[585,1897,1899],{"class":587,"line":1898},46,[585,1900,1901],{"class":591},"      >\n",[585,1903,1905,1907,1909,1911,1914,1916,1918,1920,1923,1925,1927],{"class":587,"line":1904},47,[585,1906,1504],{"class":591},[585,1908,1414],{"class":595},[585,1910,1494],{"class":591},[585,1912,1913],{"class":599},"startsAt-cell",[585,1915,606],{"class":591},[585,1917,609],{"class":591},[585,1919,773],{"class":591},[585,1921,1922],{"class":634}," row ",[585,1924,762],{"class":591},[585,1926,609],{"class":591},[585,1928,618],{"class":591},[585,1930,1932,1935,1937,1939,1941,1943,1945,1947,1949,1952,1954,1956],{"class":587,"line":1931},48,[585,1933,1934],{"class":591},"          \u003C",[585,1936,585],{"class":595},[585,1938,1428],{"class":599},[585,1940,606],{"class":591},[585,1942,609],{"class":591},[585,1944,557],{"class":612},[585,1946,609],{"class":591},[585,1948,1030],{"class":591},[585,1950,1951],{"class":634},"{{ format.dateTime(row.original.startsAt) }}",[585,1953,1397],{"class":591},[585,1955,585],{"class":595},[585,1957,618],{"class":591},[585,1959,1961,1964,1966],{"class":587,"line":1960},49,[585,1962,1963],{"class":591},"        \u003C\u002F",[585,1965,1414],{"class":595},[585,1967,618],{"class":591},[585,1969,1971,1973,1975,1977,1980],{"class":587,"line":1970},50,[585,1972,1504],{"class":591},[585,1974,1414],{"class":595},[585,1976,1494],{"class":591},[585,1978,1979],{"class":599},"empty",[585,1981,618],{"class":591},[585,1983,1985,1987,1989,1992,1994,1996,1999,2001,2003,2005,2007,2010,2012,2014,2016,2018,2020,2022,2024,2026,2029,2031,2033,2035,2038,2040,2042,2044],{"class":587,"line":1984},51,[585,1986,1934],{"class":591},[585,1988,511],{"class":595},[585,1990,1991],{"class":599}," variant",[585,1993,606],{"class":591},[585,1995,609],{"class":591},[585,1997,1998],{"class":612},"naked",[585,2000,609],{"class":591},[585,2002,1510],{"class":599},[585,2004,606],{"class":591},[585,2006,609],{"class":591},[585,2008,2009],{"class":612},"i-lucide-calendar",[585,2011,609],{"class":591},[585,2013,1450],{"class":591},[585,2015,1057],{"class":599},[585,2017,606],{"class":591},[585,2019,609],{"class":591},[585,2021,1459],{"class":671},[585,2023,675],{"class":591},[585,2025,678],{"class":591},[585,2027,2028],{"class":612},"admin.empty",[585,2030,678],{"class":591},[585,2032,1471],{"class":591},[585,2034,678],{"class":591},[585,2036,2037],{"class":612},"No events yet",[585,2039,678],{"class":591},[585,2041,266],{"class":591},[585,2043,609],{"class":591},[585,2045,618],{"class":591},[585,2047,2049,2052,2054,2056,2058],{"class":587,"line":2048},52,[585,2050,2051],{"class":591},"            \u003C",[585,2053,1414],{"class":595},[585,2055,1494],{"class":591},[585,2057,1316],{"class":599},[585,2059,618],{"class":591},[585,2061,2063,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116],{"class":587,"line":2062},53,[585,2064,2065],{"class":591},"              \u003C",[585,2067,1507],{"class":595},[585,2069,1450],{"class":591},[585,2071,1524],{"class":599},[585,2073,606],{"class":591},[585,2075,609],{"class":591},[585,2077,1459],{"class":671},[585,2079,675],{"class":591},[585,2081,678],{"class":591},[585,2083,1537],{"class":612},[585,2085,678],{"class":591},[585,2087,1471],{"class":591},[585,2089,678],{"class":591},[585,2091,1546],{"class":612},[585,2093,678],{"class":591},[585,2095,266],{"class":591},[585,2097,609],{"class":591},[585,2099,1555],{"class":591},[585,2101,1558],{"class":599},[585,2103,606],{"class":591},[585,2105,609],{"class":591},[585,2107,1316],{"class":634},[585,2109,247],{"class":591},[585,2111,1569],{"class":671},[585,2113,937],{"class":591},[585,2115,609],{"class":591},[585,2117,1576],{"class":591},[585,2119,2121,2124,2126],{"class":587,"line":2120},54,[585,2122,2123],{"class":591},"            \u003C\u002F",[585,2125,1414],{"class":595},[585,2127,618],{"class":591},[585,2129,2131,2134,2136],{"class":587,"line":2130},55,[585,2132,2133],{"class":591},"          \u003C\u002F",[585,2135,511],{"class":595},[585,2137,618],{"class":591},[585,2139,2141,2143,2145],{"class":587,"line":2140},56,[585,2142,1963],{"class":591},[585,2144,1414],{"class":595},[585,2146,618],{"class":591},[585,2148,2150,2152,2154],{"class":587,"line":2149},57,[585,2151,1582],{"class":591},[585,2153,456],{"class":595},[585,2155,618],{"class":591},[585,2157,2159,2161,2163,2165,2168],{"class":587,"line":2158},58,[585,2160,1489],{"class":591},[585,2162,1414],{"class":595},[585,2164,1494],{"class":591},[585,2166,2167],{"class":599},"footer",[585,2169,618],{"class":591},[585,2171,2173,2175,2177,2179,2181,2184,2186,2188,2190,2192,2194,2196,2199,2201,2203,2206,2208,2210,2213,2215,2217,2219,2221,2223,2225],{"class":587,"line":2172},59,[585,2174,1504],{"class":591},[585,2176,496],{"class":595},[585,2178,1621],{"class":599},[585,2180,751],{"class":591},[585,2182,2183],{"class":599},"page",[585,2185,606],{"class":591},[585,2187,609],{"class":591},[585,2189,2183],{"class":634},[585,2191,609],{"class":591},[585,2193,1621],{"class":599},[585,2195,751],{"class":591},[585,2197,2198],{"class":599},"page-size",[585,2200,606],{"class":591},[585,2202,609],{"class":591},[585,2204,2205],{"class":634},"pageSize",[585,2207,609],{"class":591},[585,2209,1450],{"class":591},[585,2211,2212],{"class":599},"total",[585,2214,606],{"class":591},[585,2216,609],{"class":591},[585,2218,1714],{"class":634},[585,2220,247],{"class":591},[585,2222,2212],{"class":634},[585,2224,609],{"class":591},[585,2226,1576],{"class":591},[585,2228,2230,2232,2234],{"class":587,"line":2229},60,[585,2231,1582],{"class":591},[585,2233,1414],{"class":595},[585,2235,618],{"class":591},[585,2237,2239,2241,2243],{"class":587,"line":2238},61,[585,2240,1592],{"class":591},[585,2242,460],{"class":595},[585,2244,618],{"class":591},[585,2246,2248,2251,2253],{"class":587,"line":2247},62,[585,2249,2250],{"class":591},"  \u003C\u002F",[585,2252,1425],{"class":595},[585,2254,618],{"class":591},[585,2256,2258,2260,2262],{"class":587,"line":2257},63,[585,2259,1397],{"class":591},[585,2261,1414],{"class":595},[585,2263,618],{"class":591},[159,2265,2266,2267,2270,2271,2274,2275,2278,2279,2281,2282,247],{},"A short list that is loaded in one go sorts on the client: bind ",[166,2268,2269],{},"useTableSort()","'s ",[166,2272,2273],{},"sorting"," with\n",[166,2276,2277],{},"v-model:sorting"," and leave out ",[166,2280,504],{}," and ",[166,2283,496],{},[159,2285,2286,2287,247],{},"Pages have no wrapper component: the page root is a plain ",[166,2288,2289],{},"\u003Cdiv class=\"flex flex-col gap-4\">",[291,2291,2293],{"id":2292},"detail-pages","Detail pages",[434,2295,2296,2318,2338,2358],{},[437,2297,2298,2300,2301,2304,2305,2308,2309,2312,2313,2315,2316,247],{},[166,2299,417],{}," with a ",[166,2302,2303],{},"breadcrumb"," back to the list (",[166,2306,2307],{},"[Users, Ada Lovelace]","), a status ",[166,2310,2311],{},"#badge"," when the record has\none, and the primary actions (outline ",[166,2314,478],{}," last) in ",[166,2317,444],{},[437,2319,2320,2321,2324,2325,2327,2328,406,2331,2334,2335,247],{},"Sections are ",[166,2322,2323],{},"SectionCard","s. A form inside a section puts its Save button in the section's ",[166,2326,500],{},"\n(",[166,2329,2330],{},"type=\"submit\"",[166,2332,2333],{},"form=\"\u003Cid>\"","). Key facts are a ",[166,2336,2337],{},"DescriptionList",[437,2339,2340,2341,263,2346,2349,2350,2353,2354,247],{},"Sections other modules can extend are ",[163,2342,2343],{"href":138},[166,2344,2345],{},"WidgetTabs",[166,2347,2348],{},"extendTabs","); sections the page owns are\n",[166,2351,2352],{},"PageTabs",". See ",[163,2355,2357],{"href":2356},"#tabs","which tabs to use",[437,2359,2360,2361,2363],{},"A record that does not exist shows a ",[166,2362,511],{}," with a link back to the list, not a blank page.",[291,2365,2367],{"id":2366},"tabs","Tabs",[159,2369,2370],{},"Both tab components share one look (a bordered strip with an underline highlight), so a page never looks different\nbecause of how it is built.",[199,2372,2373,2383],{},[202,2374,2375],{},[205,2376,2377,2380],{},[208,2378,2379],{},"Use",[208,2381,2382],{},"When",[221,2384,2385,2397],{},[205,2386,2387,2391],{},[226,2388,2389],{},[166,2390,2345],{},[226,2392,2393,2394,247],{},"Other modules should be able to add sections to the page, such as the user detail page, where Payments or Membership appear when those modules are installed. The active tab is in ",[166,2395,2396],{},"?tab=",[205,2398,2399,2403],{},[226,2400,2401],{},[166,2402,2352],{},[226,2404,2405,2406,406,2408,2411,2412,2415],{},"The sections are fixed by the page itself (a form's builder, settings, access). Pass ",[166,2407,1719],{},[166,2409,2410],{},"to"," for link tabs (each tab is a route), or ",[166,2413,2414],{},"v-model"," for state tabs.",[291,2417,2419],{"id":2418},"light-entities","Light entities",[159,2421,2422,2423,2426],{},"An entity with little of its own (a unit, an application) opens in a slideover instead of getting a detail page. The\nopen record lives in the URL query (",[166,2424,2425],{},"?application=\u003Cid>","), so ⌘K and other pages can deep-link to it.",[291,2428,2430],{"id":2429},"overview-pages","Overview pages",[159,2432,2433,2434,2437,2438,2440,2441,2444,2445,2447],{},"An overview shows numbers as ",[166,2435,2436],{},"StatCard","s, each linking (",[166,2439,2410],{},") to the list it summarises, then ",[166,2442,2443],{},"ListCard","s for what\nneeds a decision: recent items, upcoming events. The admin dashboard and the account overview are both built this way\nfrom ",[163,2446,393],{"href":138}," areas.",[291,2449,2451],{"id":2450},"empty-states","Empty states",[159,2453,2454,2455,2457,2458,2461],{},"An empty state is a ",[166,2456,511],{}," that says what the thing is and offers the single action that gets you going: \"No events\nyet\" and a \"New event\" button. Inside a card use ",[166,2459,2460],{},"variant=\"naked\"",". When a prerequisite is missing, point to it instead\nof the action (\"Add a ticket type first\"). There is no separate empty-state component.",[191,2463,483],{"id":2464},"forms-and-actions",[291,2466,2468],{"id":2467},"create-and-edit","Create and edit",[434,2470,2471,2486,2497,2507],{},[437,2472,2473,2474,2477,2478,2481,2482,2485],{},"Create and edit forms open in a ",[166,2475,2476],{},"FormSlideover"," containing a ",[166,2479,2480],{},"UForm"," with a zod schema. Short yes\u002Fno choices are a\nmodal (",[166,2483,2484],{},"UModal","). Never inline a create form next to a table.",[437,2487,2488,2489,2492,2493,2496],{},"Open forms through ",[166,2490,2491],{},"useOverlay()","; the overlay resolves with the saved record (or ",[166,2494,2495],{},"false"," when cancelled), so the\ncaller can navigate to it.",[437,2498,2499,2500,2503,2504,2506],{},"Cancel is ",[166,2501,2502],{},"color=\"neutral\" variant=\"outline\""," and the primary action comes last. ",[166,2505,2476],{}," does this for you.",[437,2508,2509,2510,2270,2513,2516],{},"Hints belong in ",[166,2511,2512],{},"UFormField",[166,2514,2515],{},"description",", not in extra paragraphs.",[576,2518,2520],{"className":578,"code":2519,"language":580,"meta":581,"style":581},"\u003C!-- EventFormSlideover.vue -->\n\u003Cscript setup lang=\"ts\">\nconst props = defineProps\u003C{ event?: EventRow }>()\nconst emit = defineEmits\u003C{ close: [saved: EventRow | false] }>()\n\nconst t = useModuleT('events')\nconst { busy, run } = useAction()\nconst state = reactive({ title: props.event?.title ?? '' })\n\nconst save = () => run(async () => {\n  const saved = await $fetch\u003CEventRow>(props.event ? `\u002Fapi\u002Fevents\u002F${props.event.id}` : '\u002Fapi\u002Fevents', {\n    method: props.event ? 'PATCH' : 'POST',\n    body: state,\n  })\n  emit('close', saved)\n}, { success: t('admin.saved', 'Event saved') })\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CFormSlideover\n    form-id=\"event-form\"\n    :title=\"event ? t('admin.edit', 'Edit event') : t('admin.create', 'New event')\"\n    :submit-label=\"event ? t('admin.save', 'Save event') : t('admin.create', 'New event')\"\n    :loading=\"busy\"\n    @close=\"emit('close', false)\"\n  >\n    \u003CUForm id=\"event-form\" :state=\"state\" class=\"flex flex-col gap-4\" @submit=\"save\">\n      \u003CUFormField name=\"title\" :label=\"t('admin.title', 'Title')\" :description=\"t('admin.titleHint', 'Shown on the public page.')\">\n        \u003CUInput v-model=\"state.title\" \u002F>\n      \u003C\u002FUFormField>\n    \u003C\u002FUForm>\n  \u003C\u002FFormSlideover>\n\u003C\u002Ftemplate>\n",[166,2521,2522,2528,2548,2577,2620,2624,2644,2667,2710,2714,2742,2807,2840,2852,2859,2879,2917,2925,2929,2937,2944,2958,3019,3078,3093,3123,3128,3183,3264,3286,3294,3302,3310],{"__ignoreMap":581},[585,2523,2524],{"class":587,"line":588},[585,2525,2527],{"class":2526},"sHwdD","\u003C!-- EventFormSlideover.vue -->\n",[585,2529,2530,2532,2534,2536,2538,2540,2542,2544,2546],{"class":587,"line":621},[585,2531,592],{"class":591},[585,2533,596],{"class":595},[585,2535,600],{"class":599},[585,2537,603],{"class":599},[585,2539,606],{"class":591},[585,2541,609],{"class":591},[585,2543,613],{"class":612},[585,2545,609],{"class":591},[585,2547,618],{"class":591},[585,2549,2550,2552,2555,2557,2560,2563,2566,2569,2572,2575],{"class":587,"line":653},[585,2551,663],{"class":599},[585,2553,2554],{"class":634}," props ",[585,2556,606],{"class":591},[585,2558,2559],{"class":671}," defineProps",[585,2561,2562],{"class":591},"\u003C{",[585,2564,2565],{"class":595}," event",[585,2567,2568],{"class":591},"?:",[585,2570,2571],{"class":1022}," EventRow",[585,2573,2574],{"class":591}," }>",[585,2576,702],{"class":634},[585,2578,2579,2581,2584,2586,2589,2591,2594,2596,2599,2602,2604,2606,2609,2612,2615,2618],{"class":587,"line":660},[585,2580,663],{"class":599},[585,2582,2583],{"class":634}," emit ",[585,2585,606],{"class":591},[585,2587,2588],{"class":671}," defineEmits",[585,2590,2562],{"class":591},[585,2592,2593],{"class":595}," close",[585,2595,751],{"class":591},[585,2597,2598],{"class":634}," [",[585,2600,2601],{"class":1022},"saved",[585,2603,751],{"class":591},[585,2605,2571],{"class":1022},[585,2607,2608],{"class":591}," |",[585,2610,2611],{"class":1022}," false",[585,2613,2614],{"class":634},"] ",[585,2616,2617],{"class":591},"}>",[585,2619,702],{"class":634},[585,2621,2622],{"class":587,"line":689},[585,2623,657],{"emptyLinePlaceholder":656},[585,2625,2626,2628,2630,2632,2634,2636,2638,2640,2642],{"class":587,"line":705},[585,2627,663],{"class":599},[585,2629,666],{"class":634},[585,2631,606],{"class":591},[585,2633,672],{"class":671},[585,2635,675],{"class":634},[585,2637,678],{"class":591},[585,2639,681],{"class":612},[585,2641,678],{"class":591},[585,2643,686],{"class":634},[585,2645,2646,2648,2650,2653,2655,2658,2660,2662,2665],{"class":587,"line":720},[585,2647,663],{"class":599},[585,2649,631],{"class":591},[585,2651,2652],{"class":634}," busy",[585,2654,735],{"class":591},[585,2656,2657],{"class":634}," run ",[585,2659,762],{"class":591},[585,2661,765],{"class":591},[585,2663,2664],{"class":671}," useAction",[585,2666,702],{"class":634},[585,2668,2669,2671,2674,2676,2679,2681,2683,2685,2687,2690,2692,2695,2698,2700,2703,2706,2708],{"class":587,"line":725},[585,2670,663],{"class":599},[585,2672,2673],{"class":634}," state ",[585,2675,606],{"class":591},[585,2677,2678],{"class":671}," reactive",[585,2680,675],{"class":634},[585,2682,773],{"class":591},[585,2684,1142],{"class":595},[585,2686,751],{"class":591},[585,2688,2689],{"class":634}," props",[585,2691,247],{"class":591},[585,2693,2694],{"class":634},"event",[585,2696,2697],{"class":591},"?.",[585,2699,1379],{"class":634},[585,2701,2702],{"class":591},"??",[585,2704,2705],{"class":591}," ''",[585,2707,638],{"class":591},[585,2709,686],{"class":634},[585,2711,2712],{"class":587,"line":811},[585,2713,657],{"emptyLinePlaceholder":656},[585,2715,2716,2718,2721,2723,2725,2727,2730,2732,2735,2737,2739],{"class":587,"line":836},[585,2717,663],{"class":599},[585,2719,2720],{"class":634}," save ",[585,2722,606],{"class":591},[585,2724,884],{"class":591},[585,2726,887],{"class":599},[585,2728,2729],{"class":671}," run",[585,2731,675],{"class":634},[585,2733,2734],{"class":599},"async",[585,2736,884],{"class":591},[585,2738,887],{"class":599},[585,2740,2741],{"class":591}," {\n",[585,2743,2744,2747,2750,2752,2754,2757,2759,2761,2763,2765,2768,2770,2772,2775,2778,2781,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805],{"class":587,"line":922},[585,2745,2746],{"class":599},"  const",[585,2748,2749],{"class":634}," saved",[585,2751,765],{"class":591},[585,2753,855],{"class":624},[585,2755,2756],{"class":671}," $fetch",[585,2758,592],{"class":591},[585,2760,1027],{"class":1022},[585,2762,1030],{"class":591},[585,2764,675],{"class":595},[585,2766,2767],{"class":634},"props",[585,2769,247],{"class":591},[585,2771,2694],{"class":634},[585,2773,2774],{"class":591}," ?",[585,2776,2777],{"class":591}," `",[585,2779,2780],{"class":612},"\u002Fapi\u002Fevents\u002F",[585,2782,1877],{"class":591},[585,2784,2767],{"class":634},[585,2786,247],{"class":591},[585,2788,2694],{"class":634},[585,2790,247],{"class":591},[585,2792,1888],{"class":634},[585,2794,1891],{"class":591},[585,2796,1450],{"class":591},[585,2798,644],{"class":591},[585,2800,865],{"class":612},[585,2802,678],{"class":591},[585,2804,735],{"class":591},[585,2806,2741],{"class":591},[585,2808,2809,2812,2814,2816,2818,2820,2822,2824,2827,2829,2831,2833,2836,2838],{"class":587,"line":962},[585,2810,2811],{"class":595},"    method",[585,2813,751],{"class":591},[585,2815,2689],{"class":634},[585,2817,247],{"class":591},[585,2819,2694],{"class":634},[585,2821,2774],{"class":591},[585,2823,644],{"class":591},[585,2825,2826],{"class":612},"PATCH",[585,2828,678],{"class":591},[585,2830,1450],{"class":591},[585,2832,644],{"class":591},[585,2834,2835],{"class":612},"POST",[585,2837,678],{"class":591},[585,2839,1062],{"class":591},[585,2841,2842,2845,2847,2850],{"class":587,"line":967},[585,2843,2844],{"class":595},"    body",[585,2846,751],{"class":591},[585,2848,2849],{"class":634}," state",[585,2851,1062],{"class":591},[585,2853,2854,2857],{"class":587,"line":990},[585,2855,2856],{"class":591},"  }",[585,2858,686],{"class":595},[585,2860,2861,2864,2866,2868,2871,2873,2875,2877],{"class":587,"line":1012},[585,2862,2863],{"class":671},"  emit",[585,2865,675],{"class":595},[585,2867,678],{"class":591},[585,2869,2870],{"class":612},"close",[585,2872,678],{"class":591},[585,2874,735],{"class":591},[585,2876,2749],{"class":634},[585,2878,686],{"class":595},[585,2880,2881,2884,2886,2889,2891,2893,2895,2897,2900,2902,2904,2906,2909,2911,2913,2915],{"class":587,"line":1041},[585,2882,2883],{"class":591},"},",[585,2885,631],{"class":591},[585,2887,2888],{"class":595}," success",[585,2890,751],{"class":591},[585,2892,1086],{"class":671},[585,2894,675],{"class":634},[585,2896,678],{"class":591},[585,2898,2899],{"class":612},"admin.saved",[585,2901,678],{"class":591},[585,2903,735],{"class":591},[585,2905,644],{"class":591},[585,2907,2908],{"class":612},"Event saved",[585,2910,678],{"class":591},[585,2912,915],{"class":634},[585,2914,762],{"class":591},[585,2916,686],{"class":634},[585,2918,2919,2921,2923],{"class":587,"line":1047},[585,2920,1397],{"class":591},[585,2922,596],{"class":595},[585,2924,618],{"class":591},[585,2926,2927],{"class":587,"line":1065},[585,2928,657],{"emptyLinePlaceholder":656},[585,2930,2931,2933,2935],{"class":587,"line":1112},[585,2932,592],{"class":591},[585,2934,1414],{"class":595},[585,2936,618],{"class":591},[585,2938,2939,2941],{"class":587,"line":1182},[585,2940,1422],{"class":591},[585,2942,2943],{"class":595},"FormSlideover\n",[585,2945,2946,2949,2951,2953,2956],{"class":587,"line":1188},[585,2947,2948],{"class":599},"    form-id",[585,2950,606],{"class":591},[585,2952,609],{"class":591},[585,2954,2955],{"class":612},"event-form",[585,2957,1783],{"class":591},[585,2959,2960,2963,2965,2967,2969,2971,2974,2976,2978,2980,2983,2985,2987,2989,2992,2994,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017],{"class":587,"line":1249},[585,2961,2962],{"class":591},"    :",[585,2964,1057],{"class":599},[585,2966,606],{"class":591},[585,2968,609],{"class":591},[585,2970,2694],{"class":634},[585,2972,2973],{"class":591}," ? ",[585,2975,1459],{"class":671},[585,2977,675],{"class":591},[585,2979,678],{"class":591},[585,2981,2982],{"class":612},"admin.edit",[585,2984,678],{"class":591},[585,2986,1471],{"class":591},[585,2988,678],{"class":591},[585,2990,2991],{"class":612},"Edit event",[585,2993,678],{"class":591},[585,2995,2996],{"class":591},") : ",[585,2998,1459],{"class":671},[585,3000,675],{"class":591},[585,3002,678],{"class":591},[585,3004,1537],{"class":612},[585,3006,678],{"class":591},[585,3008,1471],{"class":591},[585,3010,678],{"class":591},[585,3012,1546],{"class":612},[585,3014,678],{"class":591},[585,3016,266],{"class":591},[585,3018,1783],{"class":591},[585,3020,3021,3023,3026,3028,3030,3032,3034,3036,3038,3040,3043,3045,3047,3049,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076],{"class":587,"line":1305},[585,3022,2962],{"class":591},[585,3024,3025],{"class":599},"submit-label",[585,3027,606],{"class":591},[585,3029,609],{"class":591},[585,3031,2694],{"class":634},[585,3033,2973],{"class":591},[585,3035,1459],{"class":671},[585,3037,675],{"class":591},[585,3039,678],{"class":591},[585,3041,3042],{"class":612},"admin.save",[585,3044,678],{"class":591},[585,3046,1471],{"class":591},[585,3048,678],{"class":591},[585,3050,3051],{"class":612},"Save event",[585,3053,678],{"class":591},[585,3055,2996],{"class":591},[585,3057,1459],{"class":671},[585,3059,675],{"class":591},[585,3061,678],{"class":591},[585,3063,1537],{"class":612},[585,3065,678],{"class":591},[585,3067,1471],{"class":591},[585,3069,678],{"class":591},[585,3071,1546],{"class":612},[585,3073,678],{"class":591},[585,3075,266],{"class":591},[585,3077,1783],{"class":591},[585,3079,3080,3082,3084,3086,3088,3091],{"class":587,"line":1388},[585,3081,2962],{"class":591},[585,3083,1702],{"class":599},[585,3085,606],{"class":591},[585,3087,609],{"class":591},[585,3089,3090],{"class":634},"busy",[585,3092,1783],{"class":591},[585,3094,3095,3098,3100,3102,3104,3107,3109,3111,3113,3115,3117,3119,3121],{"class":587,"line":1394},[585,3096,3097],{"class":591},"    @",[585,3099,2870],{"class":599},[585,3101,606],{"class":591},[585,3103,609],{"class":591},[585,3105,3106],{"class":671},"emit",[585,3108,675],{"class":591},[585,3110,678],{"class":591},[585,3112,2870],{"class":612},[585,3114,678],{"class":591},[585,3116,1471],{"class":591},[585,3118,2495],{"class":801},[585,3120,266],{"class":591},[585,3122,1783],{"class":591},[585,3124,3125],{"class":587,"line":1404},[585,3126,3127],{"class":591},"  >\n",[585,3129,3130,3132,3134,3136,3138,3140,3142,3144,3146,3149,3151,3153,3155,3157,3159,3161,3163,3165,3167,3169,3172,3174,3176,3179,3181],{"class":587,"line":1409},[585,3131,1445],{"class":591},[585,3133,2480],{"class":595},[585,3135,782],{"class":599},[585,3137,606],{"class":591},[585,3139,609],{"class":591},[585,3141,2955],{"class":612},[585,3143,609],{"class":591},[585,3145,1450],{"class":591},[585,3147,3148],{"class":599},"state",[585,3150,606],{"class":591},[585,3152,609],{"class":591},[585,3154,3148],{"class":634},[585,3156,609],{"class":591},[585,3158,1428],{"class":599},[585,3160,606],{"class":591},[585,3162,609],{"class":591},[585,3164,1435],{"class":612},[585,3166,609],{"class":591},[585,3168,1555],{"class":591},[585,3170,3171],{"class":599},"submit",[585,3173,606],{"class":591},[585,3175,609],{"class":591},[585,3177,3178],{"class":634},"save",[585,3180,609],{"class":591},[585,3182,618],{"class":591},[585,3184,3185,3187,3189,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3247,3249,3251,3253,3256,3258,3260,3262],{"class":587,"line":1419},[585,3186,1489],{"class":591},[585,3188,2512],{"class":595},[585,3190,3191],{"class":599}," name",[585,3193,606],{"class":591},[585,3195,609],{"class":591},[585,3197,1057],{"class":612},[585,3199,609],{"class":591},[585,3201,1450],{"class":591},[585,3203,1524],{"class":599},[585,3205,606],{"class":591},[585,3207,609],{"class":591},[585,3209,1459],{"class":671},[585,3211,675],{"class":591},[585,3213,678],{"class":591},[585,3215,1093],{"class":612},[585,3217,678],{"class":591},[585,3219,1471],{"class":591},[585,3221,678],{"class":591},[585,3223,1102],{"class":612},[585,3225,678],{"class":591},[585,3227,266],{"class":591},[585,3229,609],{"class":591},[585,3231,1450],{"class":591},[585,3233,2515],{"class":599},[585,3235,606],{"class":591},[585,3237,609],{"class":591},[585,3239,1459],{"class":671},[585,3241,675],{"class":591},[585,3243,678],{"class":591},[585,3245,3246],{"class":612},"admin.titleHint",[585,3248,678],{"class":591},[585,3250,1471],{"class":591},[585,3252,678],{"class":591},[585,3254,3255],{"class":612},"Shown on the public page.",[585,3257,678],{"class":591},[585,3259,266],{"class":591},[585,3261,609],{"class":591},[585,3263,618],{"class":591},[585,3265,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284],{"class":587,"line":1442},[585,3267,1504],{"class":591},[585,3269,1618],{"class":595},[585,3271,1621],{"class":599},[585,3273,606],{"class":591},[585,3275,609],{"class":591},[585,3277,3148],{"class":634},[585,3279,247],{"class":591},[585,3281,1057],{"class":634},[585,3283,609],{"class":591},[585,3285,1576],{"class":591},[585,3287,3288,3290,3292],{"class":587,"line":1486},[585,3289,1582],{"class":591},[585,3291,2512],{"class":595},[585,3293,618],{"class":591},[585,3295,3296,3298,3300],{"class":587,"line":1501},[585,3297,1592],{"class":591},[585,3299,2480],{"class":595},[585,3301,618],{"class":591},[585,3303,3304,3306,3308],{"class":587,"line":1579},[585,3305,2250],{"class":591},[585,3307,2476],{"class":595},[585,3309,618],{"class":591},[585,3311,3312,3314,3316],{"class":587,"line":1589},[585,3313,1397],{"class":591},[585,3315,1414],{"class":595},[585,3317,618],{"class":591},[291,3319,3321],{"id":3320},"one-actions-composable-per-entity","One actions composable per entity",[159,3323,3324,3325,3328,3329,1471,3332,1471,3335,3338,3339,3342,3343,247],{},"Every entity has a ",[166,3326,3327],{},"use\u003CEntity>Actions()"," composable (",[166,3330,3331],{},"useUserActions",[166,3333,3334],{},"useEventActions",[166,3336,3337],{},"useFormActions",") that\nowns create, edit and remove, the toasts and the refresh afterwards. It returns ",[166,3340,3341],{},"menu(record)"," for the row menu, so\nevery list and detail page offers the same actions in the same order. Pages stay thin. It lives in the module that owns\nthe entity, not in ",[166,3344,168],{},[576,3346,3349],{"className":3347,"code":3348,"language":613,"meta":581,"style":581},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F composables\u002FuseEventActions.ts\nexport function useEventActions() {\n  const t = useModuleT('events')\n  const overlay = useOverlay()\n  const confirm = useConfirmDialog()\n  const toast = useToast()\n  const { localize } = useLocaleLink()\n\n  async function create() {\n    const saved = await overlay.create(EventFormSlideover).open()\n    if (saved) await navigateTo(localize(`\u002Fadmin\u002Fevents\u002F${saved.id}`))\n  }\n\n  async function remove(event: EventRow) {\n    const confirmed = await confirm({\n      title: t('admin.deleteTitle', 'Delete {name}?', { name: event.title }),\n      description: t('admin.deleteBody', 'Its tickets and attendees are deleted too. This cannot be undone.'),\n      confirmText: t('admin.delete', 'Delete event'),\n      destructive: true,\n    })\n    if (!confirmed) return\n    try {\n      await $fetch(`\u002Fapi\u002Fevents\u002F${event.id}`, { method: 'DELETE' })\n      toast.add({ title: t('admin.deleted', 'Event deleted'), description: event.title })\n      await refreshNuxtData('events')\n    }\n    catch (e) {\n      toast.add(errorToToast(e))\n    }\n  }\n\n  const menu = (event: EventRow) => [\n    [{ label: t('open', 'Open'), icon: 'i-lucide-arrow-right', to: localize(`\u002Fadmin\u002Fevents\u002F${event.id}`) }],\n    [{ label: t('admin.edit', 'Edit event'), icon: 'i-lucide-pencil', onSelect: () => overlay.create(EventFormSlideover).open({ event }) }],\n    [{ label: t('admin.delete', 'Delete event'), icon: 'i-lucide-trash', color: 'error' as const, onSelect: () => remove(event) }],\n  ]\n\n  return { create, remove, menu }\n}\n",[166,3350,3351,3356,3370,3390,3404,3418,3432,3450,3454,3468,3499,3539,3544,3548,3569,3587,3634,3665,3696,3707,3714,3731,3738,3781,3837,3854,3859,3873,3892,3896,3900,3904,3927,4007,4093,4180,4185,4189,4209],{"__ignoreMap":581},[585,3352,3353],{"class":587,"line":588},[585,3354,3355],{"class":2526},"\u002F\u002F composables\u002FuseEventActions.ts\n",[585,3357,3358,3361,3364,3366,3368],{"class":587,"line":621},[585,3359,3360],{"class":624},"export",[585,3362,3363],{"class":599}," function",[585,3365,715],{"class":671},[585,3367,937],{"class":591},[585,3369,2741],{"class":591},[585,3371,3372,3374,3376,3378,3380,3382,3384,3386,3388],{"class":587,"line":653},[585,3373,2746],{"class":599},[585,3375,1086],{"class":634},[585,3377,765],{"class":591},[585,3379,672],{"class":671},[585,3381,675],{"class":595},[585,3383,678],{"class":591},[585,3385,681],{"class":612},[585,3387,678],{"class":591},[585,3389,686],{"class":595},[585,3391,3392,3394,3397,3399,3402],{"class":587,"line":660},[585,3393,2746],{"class":599},[585,3395,3396],{"class":634}," overlay",[585,3398,765],{"class":591},[585,3400,3401],{"class":671}," useOverlay",[585,3403,702],{"class":595},[585,3405,3406,3408,3411,3413,3416],{"class":587,"line":689},[585,3407,2746],{"class":599},[585,3409,3410],{"class":634}," confirm",[585,3412,765],{"class":591},[585,3414,3415],{"class":671}," useConfirmDialog",[585,3417,702],{"class":595},[585,3419,3420,3422,3425,3427,3430],{"class":587,"line":705},[585,3421,2746],{"class":599},[585,3423,3424],{"class":634}," toast",[585,3426,765],{"class":591},[585,3428,3429],{"class":671}," useToast",[585,3431,702],{"class":595},[585,3433,3434,3436,3438,3441,3443,3445,3448],{"class":587,"line":720},[585,3435,2746],{"class":599},[585,3437,631],{"class":591},[585,3439,3440],{"class":634}," localize",[585,3442,638],{"class":591},[585,3444,765],{"class":591},[585,3446,3447],{"class":671}," useLocaleLink",[585,3449,702],{"class":595},[585,3451,3452],{"class":587,"line":725},[585,3453,657],{"emptyLinePlaceholder":656},[585,3455,3456,3459,3461,3464,3466],{"class":587,"line":811},[585,3457,3458],{"class":599},"  async",[585,3460,3363],{"class":599},[585,3462,3463],{"class":671}," create",[585,3465,937],{"class":591},[585,3467,2741],{"class":591},[585,3469,3470,3473,3475,3477,3479,3481,3483,3485,3487,3490,3492,3494,3497],{"class":587,"line":836},[585,3471,3472],{"class":599},"    const",[585,3474,2749],{"class":634},[585,3476,765],{"class":591},[585,3478,855],{"class":624},[585,3480,3396],{"class":634},[585,3482,247],{"class":591},[585,3484,1569],{"class":671},[585,3486,675],{"class":595},[585,3488,3489],{"class":634},"EventFormSlideover",[585,3491,266],{"class":595},[585,3493,247],{"class":591},[585,3495,3496],{"class":671},"open",[585,3498,702],{"class":595},[585,3500,3501,3504,3506,3508,3510,3513,3515,3517,3520,3522,3524,3526,3528,3530,3532,3534,3536],{"class":587,"line":922},[585,3502,3503],{"class":624},"    if",[585,3505,263],{"class":595},[585,3507,2601],{"class":634},[585,3509,915],{"class":595},[585,3511,3512],{"class":624},"await",[585,3514,1866],{"class":671},[585,3516,675],{"class":595},[585,3518,3519],{"class":671},"localize",[585,3521,675],{"class":595},[585,3523,1871],{"class":591},[585,3525,1874],{"class":612},[585,3527,1877],{"class":591},[585,3529,2601],{"class":634},[585,3531,247],{"class":591},[585,3533,1888],{"class":634},[585,3535,1891],{"class":591},[585,3537,3538],{"class":595},"))\n",[585,3540,3541],{"class":587,"line":962},[585,3542,3543],{"class":591},"  }\n",[585,3545,3546],{"class":587,"line":967},[585,3547,657],{"emptyLinePlaceholder":656},[585,3549,3550,3552,3554,3557,3559,3561,3563,3565,3567],{"class":587,"line":990},[585,3551,3458],{"class":599},[585,3553,3363],{"class":599},[585,3555,3556],{"class":671}," remove",[585,3558,675],{"class":591},[585,3560,2694],{"class":1123},[585,3562,751],{"class":591},[585,3564,2571],{"class":1022},[585,3566,266],{"class":591},[585,3568,2741],{"class":591},[585,3570,3571,3573,3576,3578,3580,3582,3584],{"class":587,"line":1012},[585,3572,3472],{"class":599},[585,3574,3575],{"class":634}," confirmed",[585,3577,765],{"class":591},[585,3579,855],{"class":624},[585,3581,3410],{"class":671},[585,3583,675],{"class":595},[585,3585,3586],{"class":591},"{\n",[585,3588,3589,3592,3594,3596,3598,3600,3603,3605,3607,3609,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630,3632],{"class":587,"line":1041},[585,3590,3591],{"class":595},"      title",[585,3593,751],{"class":591},[585,3595,1086],{"class":671},[585,3597,675],{"class":595},[585,3599,678],{"class":591},[585,3601,3602],{"class":612},"admin.deleteTitle",[585,3604,678],{"class":591},[585,3606,735],{"class":591},[585,3608,644],{"class":591},[585,3610,3611],{"class":612},"Delete {name}?",[585,3613,678],{"class":591},[585,3615,735],{"class":591},[585,3617,631],{"class":591},[585,3619,3191],{"class":595},[585,3621,751],{"class":591},[585,3623,2565],{"class":634},[585,3625,247],{"class":591},[585,3627,1057],{"class":634},[585,3629,638],{"class":591},[585,3631,266],{"class":595},[585,3633,1062],{"class":591},[585,3635,3636,3639,3641,3643,3645,3647,3650,3652,3654,3656,3659,3661,3663],{"class":587,"line":1047},[585,3637,3638],{"class":595},"      description",[585,3640,751],{"class":591},[585,3642,1086],{"class":671},[585,3644,675],{"class":595},[585,3646,678],{"class":591},[585,3648,3649],{"class":612},"admin.deleteBody",[585,3651,678],{"class":591},[585,3653,735],{"class":591},[585,3655,644],{"class":591},[585,3657,3658],{"class":612},"Its tickets and attendees are deleted too. This cannot be undone.",[585,3660,678],{"class":591},[585,3662,266],{"class":595},[585,3664,1062],{"class":591},[585,3666,3667,3670,3672,3674,3676,3678,3681,3683,3685,3687,3690,3692,3694],{"class":587,"line":1065},[585,3668,3669],{"class":595},"      confirmText",[585,3671,751],{"class":591},[585,3673,1086],{"class":671},[585,3675,675],{"class":595},[585,3677,678],{"class":591},[585,3679,3680],{"class":612},"admin.delete",[585,3682,678],{"class":591},[585,3684,735],{"class":591},[585,3686,644],{"class":591},[585,3688,3689],{"class":612},"Delete event",[585,3691,678],{"class":591},[585,3693,266],{"class":595},[585,3695,1062],{"class":591},[585,3697,3698,3701,3703,3705],{"class":587,"line":1112},[585,3699,3700],{"class":595},"      destructive",[585,3702,751],{"class":591},[585,3704,802],{"class":801},[585,3706,1062],{"class":591},[585,3708,3709,3712],{"class":587,"line":1182},[585,3710,3711],{"class":591},"    }",[585,3713,686],{"class":595},[585,3715,3716,3718,3720,3723,3726,3728],{"class":587,"line":1188},[585,3717,3503],{"class":624},[585,3719,263],{"class":595},[585,3721,3722],{"class":591},"!",[585,3724,3725],{"class":634},"confirmed",[585,3727,915],{"class":595},[585,3729,3730],{"class":624},"return\n",[585,3732,3733,3736],{"class":587,"line":1249},[585,3734,3735],{"class":624},"    try",[585,3737,2741],{"class":591},[585,3739,3740,3743,3745,3747,3749,3751,3753,3755,3757,3759,3761,3763,3765,3768,3770,3772,3775,3777,3779],{"class":587,"line":1305},[585,3741,3742],{"class":624},"      await",[585,3744,2756],{"class":671},[585,3746,675],{"class":595},[585,3748,1871],{"class":591},[585,3750,2780],{"class":612},[585,3752,1877],{"class":591},[585,3754,2694],{"class":634},[585,3756,247],{"class":591},[585,3758,1888],{"class":634},[585,3760,1891],{"class":591},[585,3762,735],{"class":591},[585,3764,631],{"class":591},[585,3766,3767],{"class":595}," method",[585,3769,751],{"class":591},[585,3771,644],{"class":591},[585,3773,3774],{"class":612},"DELETE",[585,3776,678],{"class":591},[585,3778,638],{"class":591},[585,3780,686],{"class":595},[585,3782,3783,3786,3788,3791,3793,3795,3797,3799,3801,3803,3805,3808,3810,3812,3814,3817,3819,3821,3823,3825,3827,3829,3831,3833,3835],{"class":587,"line":1388},[585,3784,3785],{"class":634},"      toast",[585,3787,247],{"class":591},[585,3789,3790],{"class":671},"add",[585,3792,675],{"class":595},[585,3794,773],{"class":591},[585,3796,1142],{"class":595},[585,3798,751],{"class":591},[585,3800,1086],{"class":671},[585,3802,675],{"class":595},[585,3804,678],{"class":591},[585,3806,3807],{"class":612},"admin.deleted",[585,3809,678],{"class":591},[585,3811,735],{"class":591},[585,3813,644],{"class":591},[585,3815,3816],{"class":612},"Event deleted",[585,3818,678],{"class":591},[585,3820,266],{"class":595},[585,3822,735],{"class":591},[585,3824,1160],{"class":595},[585,3826,751],{"class":591},[585,3828,2565],{"class":634},[585,3830,247],{"class":591},[585,3832,1057],{"class":634},[585,3834,638],{"class":591},[585,3836,686],{"class":595},[585,3838,3839,3841,3844,3846,3848,3850,3852],{"class":587,"line":1394},[585,3840,3742],{"class":624},[585,3842,3843],{"class":671}," refreshNuxtData",[585,3845,675],{"class":595},[585,3847,678],{"class":591},[585,3849,681],{"class":612},[585,3851,678],{"class":591},[585,3853,686],{"class":595},[585,3855,3856],{"class":587,"line":1404},[585,3857,3858],{"class":591},"    }\n",[585,3860,3861,3864,3866,3869,3871],{"class":587,"line":1409},[585,3862,3863],{"class":624},"    catch",[585,3865,263],{"class":595},[585,3867,3868],{"class":634},"e",[585,3870,915],{"class":595},[585,3872,3586],{"class":591},[585,3874,3875,3877,3879,3881,3883,3886,3888,3890],{"class":587,"line":1419},[585,3876,3785],{"class":634},[585,3878,247],{"class":591},[585,3880,3790],{"class":671},[585,3882,675],{"class":595},[585,3884,3885],{"class":671},"errorToToast",[585,3887,675],{"class":595},[585,3889,3868],{"class":634},[585,3891,3538],{"class":595},[585,3893,3894],{"class":587,"line":1442},[585,3895,3858],{"class":591},[585,3897,3898],{"class":587,"line":1486},[585,3899,3543],{"class":591},[585,3901,3902],{"class":587,"line":1501},[585,3903,657],{"emptyLinePlaceholder":656},[585,3905,3906,3908,3911,3913,3915,3917,3919,3921,3923,3925],{"class":587,"line":1579},[585,3907,2746],{"class":599},[585,3909,3910],{"class":634}," menu",[585,3912,765],{"class":591},[585,3914,263],{"class":591},[585,3916,2694],{"class":1123},[585,3918,751],{"class":591},[585,3920,2571],{"class":1022},[585,3922,266],{"class":591},[585,3924,887],{"class":599},[585,3926,1038],{"class":595},[585,3928,3929,3932,3934,3937,3939,3941,3943,3945,3947,3949,3951,3953,3956,3958,3960,3962,3964,3966,3968,3971,3973,3975,3978,3980,3982,3984,3986,3988,3990,3992,3994,3996,3998,4000,4002,4005],{"class":587,"line":1589},[585,3930,3931],{"class":595},"    [",[585,3933,773],{"class":591},[585,3935,3936],{"class":595}," label",[585,3938,751],{"class":591},[585,3940,1086],{"class":671},[585,3942,675],{"class":595},[585,3944,678],{"class":591},[585,3946,3496],{"class":612},[585,3948,678],{"class":591},[585,3950,735],{"class":591},[585,3952,644],{"class":591},[585,3954,3955],{"class":612},"Open",[585,3957,678],{"class":591},[585,3959,266],{"class":595},[585,3961,735],{"class":591},[585,3963,1510],{"class":595},[585,3965,751],{"class":591},[585,3967,644],{"class":591},[585,3969,3970],{"class":612},"i-lucide-arrow-right",[585,3972,678],{"class":591},[585,3974,735],{"class":591},[585,3976,3977],{"class":595}," to",[585,3979,751],{"class":591},[585,3981,3440],{"class":671},[585,3983,675],{"class":595},[585,3985,1871],{"class":591},[585,3987,1874],{"class":612},[585,3989,1877],{"class":591},[585,3991,2694],{"class":634},[585,3993,247],{"class":591},[585,3995,1888],{"class":634},[585,3997,1891],{"class":591},[585,3999,915],{"class":595},[585,4001,762],{"class":591},[585,4003,4004],{"class":595},"]",[585,4006,1062],{"class":591},[585,4008,4009,4011,4013,4015,4017,4019,4021,4023,4025,4027,4029,4031,4033,4035,4037,4039,4041,4043,4045,4048,4050,4052,4055,4057,4059,4061,4063,4065,4067,4069,4071,4073,4075,4077,4079,4081,4083,4085,4087,4089,4091],{"class":587,"line":1599},[585,4010,3931],{"class":595},[585,4012,773],{"class":591},[585,4014,3936],{"class":595},[585,4016,751],{"class":591},[585,4018,1086],{"class":671},[585,4020,675],{"class":595},[585,4022,678],{"class":591},[585,4024,2982],{"class":612},[585,4026,678],{"class":591},[585,4028,735],{"class":591},[585,4030,644],{"class":591},[585,4032,2991],{"class":612},[585,4034,678],{"class":591},[585,4036,266],{"class":595},[585,4038,735],{"class":591},[585,4040,1510],{"class":595},[585,4042,751],{"class":591},[585,4044,644],{"class":591},[585,4046,4047],{"class":612},"i-lucide-pencil",[585,4049,678],{"class":591},[585,4051,735],{"class":591},[585,4053,4054],{"class":671}," onSelect",[585,4056,751],{"class":591},[585,4058,884],{"class":591},[585,4060,887],{"class":599},[585,4062,3396],{"class":634},[585,4064,247],{"class":591},[585,4066,1569],{"class":671},[585,4068,675],{"class":595},[585,4070,3489],{"class":634},[585,4072,266],{"class":595},[585,4074,247],{"class":591},[585,4076,3496],{"class":671},[585,4078,675],{"class":595},[585,4080,773],{"class":591},[585,4082,2565],{"class":634},[585,4084,638],{"class":591},[585,4086,915],{"class":595},[585,4088,762],{"class":591},[585,4090,4004],{"class":595},[585,4092,1062],{"class":591},[585,4094,4095,4097,4099,4101,4103,4105,4107,4109,4111,4113,4115,4117,4119,4121,4123,4125,4127,4129,4131,4134,4136,4138,4141,4143,4145,4148,4150,4153,4156,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178],{"class":587,"line":1604},[585,4096,3931],{"class":595},[585,4098,773],{"class":591},[585,4100,3936],{"class":595},[585,4102,751],{"class":591},[585,4104,1086],{"class":671},[585,4106,675],{"class":595},[585,4108,678],{"class":591},[585,4110,3680],{"class":612},[585,4112,678],{"class":591},[585,4114,735],{"class":591},[585,4116,644],{"class":591},[585,4118,3689],{"class":612},[585,4120,678],{"class":591},[585,4122,266],{"class":595},[585,4124,735],{"class":591},[585,4126,1510],{"class":595},[585,4128,751],{"class":591},[585,4130,644],{"class":591},[585,4132,4133],{"class":612},"i-lucide-trash",[585,4135,678],{"class":591},[585,4137,735],{"class":591},[585,4139,4140],{"class":595}," color",[585,4142,751],{"class":591},[585,4144,644],{"class":591},[585,4146,4147],{"class":612},"error",[585,4149,678],{"class":591},[585,4151,4152],{"class":624}," as",[585,4154,4155],{"class":599}," const",[585,4157,735],{"class":591},[585,4159,4054],{"class":671},[585,4161,751],{"class":591},[585,4163,884],{"class":591},[585,4165,887],{"class":599},[585,4167,3556],{"class":671},[585,4169,675],{"class":595},[585,4171,2694],{"class":634},[585,4173,915],{"class":595},[585,4175,762],{"class":591},[585,4177,4004],{"class":595},[585,4179,1062],{"class":591},[585,4181,4182],{"class":587,"line":1613},[585,4183,4184],{"class":595},"  ]\n",[585,4186,4187],{"class":587,"line":1679},[585,4188,657],{"emptyLinePlaceholder":656},[585,4190,4191,4194,4196,4198,4200,4202,4204,4206],{"class":587,"line":1688},[585,4192,4193],{"class":624},"  return",[585,4195,631],{"class":591},[585,4197,3463],{"class":634},[585,4199,735],{"class":591},[585,4201,3556],{"class":634},[585,4203,735],{"class":591},[585,4205,3910],{"class":634},[585,4207,4208],{"class":591}," }\n",[585,4210,4211],{"class":587,"line":1693},[585,4212,4213],{"class":591},"}\n",[291,4215,4217],{"id":4216},"row-actions","Row actions",[159,4219,4220,4221,4223,4224,4227,4228,4230,4231,4234],{},"Row actions go in a ",[166,4222,478],{}," (the ",[166,4225,4226],{},"⋯"," button) at the end of the row, with groups in this order: ",[362,4229,3955],{}," first, then\nthe edits, then the destructive action in its own group, coloured red. There are no loose icon buttons in rows. Pass\n",[166,4232,4233],{},"subject"," so the button's accessible name reads \"Actions for Ada Lovelace\".",[291,4236,4238],{"id":4237},"destructive-actions","Destructive actions",[159,4240,4241,4242,4245,4246,4249],{},"Destructive actions confirm with ",[166,4243,4244],{},"useConfirmDialog({ destructive: true })",", never ",[166,4247,4248],{},"window.confirm",". The title asks about\nthe record by name (\"Delete Spring Gala?\"), the description says what else is affected (\"Its tickets and attendees are\ndeleted too\"), and the confirm button names the verb and the object (\"Delete event\").",[291,4251,4253],{"id":4252},"feedback-and-errors","Feedback and errors",[434,4255,4256,4259,4270,4276],{},[437,4257,4258],{},"A successful action is a toast with a title and, when useful, the record's name as the description.",[437,4260,4261,4262,4265,4266,4269],{},"A failed action is a toast built with ",[166,4263,4264],{},"errorToToast(e)",", or ",[166,4267,4268],{},"useErrorToast()"," when you want a ready-made function.\nThey read the server's message from the usual places and fall back to a translated generic message.",[437,4271,4272,4273,4275],{},"Page-level problems that block the page (not found, forbidden) use ",[166,4274,511],{},", not a toast.",[437,4277,4278,4281],{},[166,4279,4280],{},"useAction()"," wraps the common \"busy, try, toast on error\" block; do not hand-write it again.",[291,4283,4285],{"id":4284},"deep-links-instead-of-state-hand-offs","Deep links instead of state hand-offs",[159,4287,4288,4289,4291,4292,247],{},"A page that needs context from another page reads it from the URL or opens the right form directly. \"Add ticket type\"\non an event opens the form with the event preselected; a ⌘K entry links to ",[166,4290,2425],{},". Do not pass state\nthrough stores or ",[166,4293,4294],{},"history.state",[191,4296,4298],{"id":4297},"text","Text",[434,4300,4301,4329,4332,4346],{},[437,4302,4303,4304,4307,4308,2281,4311,4314,4315,4318,4319,2270,4321,4324,4325,247],{},"Every string goes through ",[166,4305,4306],{},"useModuleT('\u003Cnamespace>')"," with an English fallback, and the module ships ",[166,4309,4310],{},"da",[166,4312,4313],{},"en","\nJSON (see ",[163,4316,101],{"href":4317},"\u002Fmodules\u002Fmodule-kit#translations-i18n","). Shared strings (Open, Edit, Delete, \"Not set\") come\nfrom ",[166,4320,168],{},[166,4322,4323],{},"patterns.*"," keys; see ",[163,4326,4328],{"href":4327},"\u002Fmodules\u002Fui#the-patterns-strings","overriding them",[437,4330,4331],{},"Buttons and menu items name the object: \"Add unit\", \"Delete application\", \"Revoke token\". Never bare \"Add\",\n\"Delete\" or \"Save\" unless the context is a section that is clearly about one thing.",[437,4333,4334,4335,4337,4338,4341,4342,4345],{},"Format dates and money through ",[166,4336,553],{}," so they follow the active locale; do not call ",[166,4339,4340],{},"toLocaleString"," or\n",[166,4343,4344],{},"Intl"," directly.",[437,4347,4348,4349,4352,4353,4356],{},"Build links with ",[166,4350,4351],{},"useLocaleLink().localize"," so a visitor on ",[166,4354,4355],{},"\u002Fda\u002F..."," stays under their locale.",[191,4358,4360],{"id":4359},"checklist-for-a-new-page","Checklist for a new page",[4362,4363,4364,4369,4378,4396,4405,4416],"ol",{},[437,4365,4366,4367,247],{},"Pick the area (admin, account or public) and register the route; add one item to the matching ",[163,4368,299],{"href":98},[437,4370,4371,4372,4374,4375,4377],{},"Use the heading for the area: ",[166,4373,417],{}," in app areas, ",[166,4376,409],{}," on public pages.",[437,4379,4380,4381,4383,4384,4386,4387,4389,4390,4392,4393,4395],{},"Lists are ",[166,4382,460],{}," plus ",[166,4385,456],{},", with a ",[166,4388,478],{}," and a ",[166,4391,511],{},"; details are ",[166,4394,2323],{},"s with a breadcrumb.",[437,4397,4398,4399,4401,4402,4404],{},"Writes go through a ",[166,4400,3327],{}," composable and a ",[166,4403,2476],{},"; destructive ones confirm.",[437,4406,4407,4408,406,4411,2281,4413,4415],{},"Strings go through ",[166,4409,4410],{},"useModuleT",[166,4412,4310],{},[166,4414,4313],{}," JSON; buttons name the object.",[437,4417,4418],{},"Check it in light and dark, at desktop width and at 375px.",[191,4420,4422],{"id":4421},"where-things-live","Where things live",[199,4424,4425,4435],{},[202,4426,4427],{},[205,4428,4429,4432],{},[208,4430,4431],{},"Need",[208,4433,4434],{},"Where",[221,4436,4437,4461,4472,4483,4495],{},[205,4438,4439,4455],{},[226,4440,4441,4442,1471,4445,1471,4448,1471,4451,1471,4453],{},"Components, ",[166,4443,4444],{},"useConfirmDialog",[166,4446,4447],{},"useErrorToast",[166,4449,4450],{},"useFormat",[166,4452,574],{},[166,4454,1814],{},[226,4456,4457],{},[163,4458,4459],{"href":130},[166,4460,168],{},[205,4462,4463,4466],{},[226,4464,4465],{},"Admin shell, navigation groups, dashboard areas",[226,4467,4468],{},[163,4469,4470],{"href":70},[166,4471,174],{},[205,4473,4474,4477],{},[226,4475,4476],{},"Account shell, account menu, overview widgets",[226,4478,4479],{},[163,4480,4481],{"href":66},[166,4482,180],{},[205,4484,4485,4488],{},[226,4486,4487],{},"Extensible tabs and widget areas",[226,4489,4490],{},[163,4491,4492],{"href":138},[166,4493,4494],{},"@frigear-nu\u002Fwidget",[205,4496,4497,4508],{},[226,4498,4499,4500,1471,4503,1471,4505,266],{},"Navigation menus (",[166,4501,4502],{},"admin.nav.*",[166,4504,284],{},[166,4506,4507],{},"main",[226,4509,4510],{},[163,4511,4512],{"href":98},[166,4513,4514],{},"@frigear-nu\u002Fmenu",[4516,4517,4518],"style",{},"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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":581,"searchDepth":621,"depth":621,"links":4520},[4521,4526,4534,4542,4543,4544],{"id":193,"depth":621,"text":194,"children":4522},[4523,4524,4525],{"id":293,"depth":653,"text":252},{"id":367,"depth":653,"text":274},{"id":400,"depth":653,"text":228},{"id":424,"depth":621,"text":425,"children":4527},[4528,4529,4530,4531,4532,4533],{"id":428,"depth":653,"text":429},{"id":2292,"depth":653,"text":2293},{"id":2366,"depth":653,"text":2367},{"id":2418,"depth":653,"text":2419},{"id":2429,"depth":653,"text":2430},{"id":2450,"depth":653,"text":2451},{"id":2464,"depth":621,"text":483,"children":4535},[4536,4537,4538,4539,4540,4541],{"id":2467,"depth":653,"text":2468},{"id":3320,"depth":653,"text":3321},{"id":4216,"depth":653,"text":4217},{"id":4237,"depth":653,"text":4238},{"id":4252,"depth":653,"text":4253},{"id":4284,"depth":653,"text":4285},{"id":4297,"depth":621,"text":4298},{"id":4359,"depth":621,"text":4360},{"id":4421,"depth":621,"text":4422},"How screens are built so the app stays predictable as modules are added - the layouts, list and detail pages, forms, destructive actions and text conventions.","md",null,{},{"icon":34},{"title":31,"description":4551},"The page, form and text conventions every Frigear module follows, and the shared components that implement them.","VthM-zU1KbKfyX2y6iUSBxkpvn0DpMBMmcFqqkymLKI",[4554,4556],{"title":26,"path":27,"stem":28,"description":4555,"icon":29,"children":-1},"Scaffold a new Frigear Nuxt module, wire it into the workspace with module-kit, give it a database table, test it and release it.",{"title":36,"path":37,"stem":38,"children":-1,"description":4557},"The deployable Nuxt applications in the Frigear workspace.",1792824490108]