[{"data":1,"prerenderedAt":937},["ShallowReactive",2],{"navigation_docs":3,"-layers-base":69,"-layers-base-surround":932},[4,20,30,39,60],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Overview",false,"\u002Fgetting-started","1.getting-started",[10,15],{"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,"children":24,"page":6},"Applications","\u002Fapplications","2.applications",[25],{"title":26,"path":27,"stem":28,"icon":29},"Website","\u002Fapplications\u002Fwebsite","2.applications\u002F1.website","i-lucide-layout-dashboard",{"title":31,"path":32,"stem":33,"children":34},"Layers","\u002Flayers","3.layers",[35],{"title":36,"path":37,"stem":38},"Base Layer","\u002Flayers\u002Fbase","3.layers\u002F1.base",{"title":40,"path":41,"stem":42,"children":43},"Modules","\u002Fmodules","4.modules",[44,48,52,56],{"title":45,"path":46,"stem":47},"Users Module","\u002Fmodules\u002Fusers","4.modules\u002F1.users",{"title":49,"path":50,"stem":51},"OAuth Server Module","\u002Fmodules\u002Foauth-server","4.modules\u002F2.oauth-server",{"title":53,"path":54,"stem":55},"UI Module","\u002Fmodules\u002Fui","4.modules\u002F3.ui",{"title":57,"path":58,"stem":59},"Module Kit","\u002Fmodules\u002Fmodule-kit","4.modules\u002Fmodule-kit",{"title":61,"path":62,"stem":63,"children":64},"Packages","\u002Fpackages","5.packages",[65],{"title":66,"path":67,"stem":68},"CLI","\u002Fpackages\u002Fcli","5.packages\u002F4.cli",{"id":70,"title":36,"body":71,"description":925,"extension":926,"links":927,"meta":928,"navigation":929,"path":37,"seo":930,"stem":38,"__hash__":931},"docs\u002F3.layers\u002F1.base.md",{"type":72,"value":73,"toc":905},"minimark",[74,82,89,93,100,168,172,179,213,228,232,235,241,250,283,289,294,301,340,455,460,466,493,499,505,564,598,602,621,627,651,657,668,674,685,691,709,715,726,732,739,743,746,781,789,894,901],[75,76,78],"h2",{"id":77},"frigear-nubase",[79,80,81],"code",{},"@frigear-nu\u002Fbase",[83,84,85,86,88],"p",{},"The ",[79,87,81],{}," package provides a reusable Nuxt layer for Frigear websites. It centralizes common module wiring,\nstyling, UI defaults, and content-driven page conventions so applications can avoid duplicating the same setup.",[75,90,92],{"id":91},"installation","Installation",[83,94,95,96,99],{},"In a workspace app, add the package as a dependency and extend it from the app's ",[79,97,98],{},"nuxt.config.ts",":",[101,102,107],"pre",{"className":103,"code":104,"language":105,"meta":106,"style":106},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  extends: ['@frigear-nu\u002Fbase'],\n})\n","ts","",[79,108,109,133,159],{"__ignoreMap":106},[110,111,114,118,121,125,129],"span",{"class":112,"line":113},"line",1,[110,115,117],{"class":116},"s7zQu","export",[110,119,120],{"class":116}," default",[110,122,124],{"class":123},"s2Zo4"," defineNuxtConfig",[110,126,128],{"class":127},"sTEyZ","(",[110,130,132],{"class":131},"sMK4o","{\n",[110,134,136,140,142,145,148,151,153,156],{"class":112,"line":135},2,[110,137,139],{"class":138},"swJcz","  extends",[110,141,99],{"class":131},[110,143,144],{"class":127}," [",[110,146,147],{"class":131},"'",[110,149,81],{"class":150},"sfazB",[110,152,147],{"class":131},[110,154,155],{"class":127},"]",[110,157,158],{"class":131},",\n",[110,160,162,165],{"class":112,"line":161},3,[110,163,164],{"class":131},"}",[110,166,167],{"class":127},")\n",[75,169,171],{"id":170},"content-collections","Content collections",[83,173,174,175,178],{},"The layer defines collections relative to the consuming app's ",[79,176,177],{},"content\u002F"," directory:",[180,181,182,193,203],"ul",{},[183,184,185,188,189,192],"li",{},[79,186,187],{},"config"," — ",[79,190,191],{},"content\u002Fconfig.yaml",", containing site-wide configuration such as title, description, and navigation.",[183,194,195,198,199,202],{},[79,196,197],{},"pages"," — Markdown pages under ",[79,200,201],{},"content\u002Fpages\u002F**",".",[183,204,205,208,209,212],{},[79,206,207],{},"config_\u003Clocale>"," and ",[79,210,211],{},"pages_\u003Clocale>"," — locale-specific equivalents when the consuming app configures locales.",[83,214,215,216,219,220,223,224,227],{},"Use ",[79,217,218],{},"useConfig()",", ",[79,221,222],{},"useCurrentPage()",", and ",[79,225,226],{},"useContentLocale()"," to access configuration, the current page, and the\ncurrent content locale. The layer also provides helpers for working with content and localized collections.",[75,229,231],{"id":230},"composables","Composables",[83,233,234],{},"These composables are auto-imported in apps that extend the layer.",[236,237,239],"h3",{"id":238},"useconfig",[79,240,218],{},[83,242,243,244,246,247,202],{},"Returns the site-wide ",[79,245,187],{}," document (or its locale-suffixed equivalent), wrapped in ",[79,248,249],{},"useAsyncData",[101,251,253],{"className":103,"code":252,"language":105,"meta":106,"style":106},"const { data: config } = useConfig()\n",[79,254,255],{"__ignoreMap":106},[110,256,257,261,264,267,269,272,274,277,280],{"class":112,"line":113},[110,258,260],{"class":259},"spNyl","const",[110,262,263],{"class":131}," {",[110,265,266],{"class":138}," data",[110,268,99],{"class":131},[110,270,271],{"class":127}," config ",[110,273,164],{"class":131},[110,275,276],{"class":131}," =",[110,278,279],{"class":123}," useConfig",[110,281,282],{"class":127},"()\n",[83,284,285,286,288],{},"The returned ",[79,287,249],{}," key and query are re-evaluated whenever the active content locale changes.",[236,290,292],{"id":291},"usecontentlocale",[79,293,226],{},[83,295,296,297,300],{},"Resolves the active content locale from ",[79,298,299],{},"@nuxtjs\u002Fi18n"," (when configured) and exposes helpers for working with\nlocale-prefixed routes.",[101,302,304],{"className":103,"code":303,"language":105,"meta":106,"style":106},"const { locale, defaultLocale, stripLocalePrefix, localizePath } = useContentLocale()\n",[79,305,306],{"__ignoreMap":106},[110,307,308,310,312,315,318,321,323,326,328,331,333,335,338],{"class":112,"line":113},[110,309,260],{"class":259},[110,311,263],{"class":131},[110,313,314],{"class":127}," locale",[110,316,317],{"class":131},",",[110,319,320],{"class":127}," defaultLocale",[110,322,317],{"class":131},[110,324,325],{"class":127}," stripLocalePrefix",[110,327,317],{"class":131},[110,329,330],{"class":127}," localizePath ",[110,332,164],{"class":131},[110,334,276],{"class":131},[110,336,337],{"class":123}," useContentLocale",[110,339,282],{"class":127},[341,342,343,359],"table",{},[344,345,346],"thead",{},[347,348,349,353,356],"tr",{},[350,351,352],"th",{},"Property",[350,354,355],{},"Type",[350,357,358],{},"Description",[360,361,362,382,399,426],"tbody",{},[347,363,364,370,375],{},[365,366,367],"td",{},[79,368,369],{},"locale",[365,371,372],{},[79,373,374],{},"ComputedRef\u003Cstring | undefined>",[365,376,377,378,381],{},"The current locale, limited to the app's configured locale codes; ",[79,379,380],{},"undefined"," when locales aren't configured or the detected locale isn't one of them.",[347,383,384,389,393],{},[365,385,386],{},[79,387,388],{},"defaultLocale",[365,390,391],{},[79,392,374],{},[365,394,395,396,202],{},"The app's default locale, as reported by ",[79,397,398],{},"$i18n",[347,400,401,406,411],{},[365,402,403],{},[79,404,405],{},"stripLocalePrefix",[365,407,408],{},[79,409,410],{},"(path: string) => string",[365,412,413,414,417,418,421,422,425],{},"Removes the current locale's route prefix from ",[79,415,416],{},"path"," (e.g. ",[79,419,420],{},"\u002Fen\u002Fservices"," → ",[79,423,424],{},"\u002Fservices",").",[347,427,428,433,438],{},[365,429,430],{},[79,431,432],{},"localizePath",[365,434,435],{},[79,436,437],{},"(path: string, targetLocale: string) => string",[365,439,440,441,443,444,447,448,450,451,454],{},"Builds the equivalent of ",[79,442,416],{}," for ",[79,445,446],{},"targetLocale",", without relying on ",[79,449,299],{},"'s ",[79,452,453],{},"switchLocalePath"," (which can't resolve the layer's landing\u002Fcatch-all routes).",[236,456,458],{"id":457},"usecurrentpage",[79,459,222],{},[83,461,462,463,465],{},"Returns the ",[79,464,197],{}," collection document (or its locale-suffixed equivalent) matching the current route.",[101,467,469],{"className":103,"code":468,"language":105,"meta":106,"style":106},"const { data: page } = useCurrentPage()\n",[79,470,471],{"__ignoreMap":106},[110,472,473,475,477,479,481,484,486,488,491],{"class":112,"line":113},[110,474,260],{"class":259},[110,476,263],{"class":131},[110,478,266],{"class":138},[110,480,99],{"class":131},[110,482,483],{"class":127}," page ",[110,485,164],{"class":131},[110,487,276],{"class":131},[110,489,490],{"class":123}," useCurrentPage",[110,492,282],{"class":127},[236,494,496],{"id":495},"usenavigationtags",[79,497,498],{},"useNavigation(tags?)",[83,500,501,502,504],{},"Returns the navigation entries from ",[79,503,218],{},", optionally filtered by tag.",[101,506,508],{"className":103,"code":507,"language":105,"meta":106,"style":106},"const { data: navigation } = useNavigation()\nconst { data: footerNavigation } = useNavigation(['footer'])\n",[79,509,510,532],{"__ignoreMap":106},[110,511,512,514,516,518,520,523,525,527,530],{"class":112,"line":113},[110,513,260],{"class":259},[110,515,263],{"class":131},[110,517,266],{"class":138},[110,519,99],{"class":131},[110,521,522],{"class":127}," navigation ",[110,524,164],{"class":131},[110,526,276],{"class":131},[110,528,529],{"class":123}," useNavigation",[110,531,282],{"class":127},[110,533,534,536,538,540,542,545,547,549,551,554,556,559,561],{"class":112,"line":135},[110,535,260],{"class":259},[110,537,263],{"class":131},[110,539,266],{"class":138},[110,541,99],{"class":131},[110,543,544],{"class":127}," footerNavigation ",[110,546,164],{"class":131},[110,548,276],{"class":131},[110,550,529],{"class":123},[110,552,553],{"class":127},"([",[110,555,147],{"class":131},[110,557,558],{"class":150},"footer",[110,560,147],{"class":131},[110,562,563],{"class":127},"])\n",[341,565,566,577],{},[344,567,568],{},[347,569,570,573,575],{},[350,571,572],{},"Parameter",[350,574,355],{},[350,576,358],{},[360,578,579],{},[347,580,581,586,592],{},[365,582,583],{},[79,584,585],{},"tags",[365,587,588,591],{},[79,589,590],{},"string[]"," (optional)",[365,593,594,595,597],{},"When provided, only entries whose ",[79,596,585],{}," include at least one of the given values are returned. Omit to return every navigation entry.",[75,599,601],{"id":600},"utils","Utils",[83,603,604,605,608,609,612,613,616,617,620],{},"The content utilities below are defined in ",[79,606,607],{},"app\u002Futils.ts"," and, like the composables, are auto-imported in apps\nthat extend the layer. ",[79,610,611],{},"landingPageExists"," lives outside ",[79,614,615],{},"app\u002F"," and is a build-time helper used internally by the\nlayer's ",[79,618,619],{},"routing"," module rather than something consuming apps call directly.",[236,622,624],{"id":623},"localizedcollectionnamename-locale",[79,625,626],{},"localizedCollectionName(name, locale?)",[83,628,629,630,417,633,636,637,421,640,643,644,647,648,650],{},"Builds the locale-suffixed collection name used by ",[79,631,632],{},"content.config.ts",[79,634,635],{},"'pages'"," + ",[79,638,639],{},"'no'",[79,641,642],{},"'pages_no'",").\nReturns ",[79,645,646],{},"name"," unchanged when ",[79,649,369],{}," is omitted.",[236,652,654],{"id":653},"stringorpropvalueprop-key",[79,655,656],{},"stringOrPropValue(prop, key)",[83,658,659,660,663,664,667],{},"Resolves a value that may be provided either as a plain string or as an object: returns ",[79,661,662],{},"prop"," itself when it's a\nstring, or ",[79,665,666],{},"prop[key]"," otherwise.",[236,669,671],{"id":670},"getavailablelocalesconfig",[79,672,673],{},"getAvailableLocales(config)",[83,675,676,677,680,681,684],{},"Extracts the list of locale codes from an ",[79,678,679],{},"i18n.locales"," config, normalizing entries that are either plain strings\nor ",[79,682,683],{},"{ code }"," objects.",[236,686,688],{"id":687},"getcollectionstoquerylocale-availablelocales",[79,689,690],{},"getCollectionsToQuery(locale, availableLocales)",[83,692,462,693,695,696,698,699,702,703,705,706,708],{},[79,694,197],{}," collection name(s) to query: the collection for the given ",[79,697,369],{}," when it's one of\n",[79,700,701],{},"availableLocales",", every configured locale's collection when ",[79,704,369],{}," doesn't match, or the flat ",[79,707,635],{},"\ncollection when no locales are configured.",[236,710,712],{"id":711},"getcollectionfrompathpath-availablelocales",[79,713,714],{},"getCollectionFromPath(path, availableLocales)",[83,716,717,718,720,721,723,724,202],{},"Infers the ",[79,719,197],{}," collection for a route ",[79,722,416],{}," by checking whether its first path segment matches one of\n",[79,725,701],{},[236,727,729],{"id":728},"landingpageexistsrootdir",[79,730,731],{},"landingPageExists(rootDir)",[83,733,734,735,738],{},"Build-time helper used by the layer's routing module. Checks whether the consuming app defines its own\n",[79,736,737],{},"app\u002Fpages\u002Findex.vue","; when it does, the layer leaves the index route to the app instead of taking it over.",[75,740,742],{"id":741},"optional-localization","Optional localization",[83,744,745],{},"Localization is opt-in and controlled by the consuming app:",[180,747,748,756,771],{},[183,749,750,751,208,753,755],{},"Without configured locales, use the flat ",[79,752,191],{},[79,754,201],{}," structure.",[183,757,758,759,219,762,219,765,223,768,202],{},"To localize content, configure locales and nest files under locale folders, for example\n",[79,760,761],{},"content\u002Fen\u002Fconfig.yaml",[79,763,764],{},"content\u002Fen\u002Fpages\u002F**",[79,766,767],{},"content\u002Fda\u002Fconfig.yaml",[79,769,770],{},"content\u002Fda\u002Fpages\u002F**",[183,772,773,774,208,777,780],{},"When locales are configured, the layer defines collections such as ",[79,775,776],{},"config_en",[79,778,779],{},"pages_en","; its content\ncomposables select the collection for the active locale.",[83,782,783,784,786,787,99],{},"For example, an app using ",[79,785,299],{}," can configure locales in ",[79,788,98],{},[101,790,792],{"className":103,"code":791,"language":105,"meta":106,"style":106},"export default defineNuxtConfig({\n  extends: ['@frigear-nu\u002Fbase'],\n  i18n: {\n    locales: ['en', 'da'],\n    defaultLocale: 'en',\n  },\n})\n",[79,793,794,806,824,834,865,881,887],{"__ignoreMap":106},[110,795,796,798,800,802,804],{"class":112,"line":113},[110,797,117],{"class":116},[110,799,120],{"class":116},[110,801,124],{"class":123},[110,803,128],{"class":127},[110,805,132],{"class":131},[110,807,808,810,812,814,816,818,820,822],{"class":112,"line":135},[110,809,139],{"class":138},[110,811,99],{"class":131},[110,813,144],{"class":127},[110,815,147],{"class":131},[110,817,81],{"class":150},[110,819,147],{"class":131},[110,821,155],{"class":127},[110,823,158],{"class":131},[110,825,826,829,831],{"class":112,"line":161},[110,827,828],{"class":138},"  i18n",[110,830,99],{"class":131},[110,832,833],{"class":131}," {\n",[110,835,837,840,842,844,846,849,851,853,856,859,861,863],{"class":112,"line":836},4,[110,838,839],{"class":138},"    locales",[110,841,99],{"class":131},[110,843,144],{"class":127},[110,845,147],{"class":131},[110,847,848],{"class":150},"en",[110,850,147],{"class":131},[110,852,317],{"class":131},[110,854,855],{"class":131}," '",[110,857,858],{"class":150},"da",[110,860,147],{"class":131},[110,862,155],{"class":127},[110,864,158],{"class":131},[110,866,868,871,873,875,877,879],{"class":112,"line":867},5,[110,869,870],{"class":138},"    defaultLocale",[110,872,99],{"class":131},[110,874,855],{"class":131},[110,876,848],{"class":150},[110,878,147],{"class":131},[110,880,158],{"class":131},[110,882,884],{"class":112,"line":883},6,[110,885,886],{"class":131},"  },\n",[110,888,890,892],{"class":112,"line":889},7,[110,891,164],{"class":131},[110,893,167],{"class":127},[83,895,85,896,900],{},[897,898,899],"a",{"href":17},"local development guide"," explains how to run the consuming website.",[902,903,904],"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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":106,"searchDepth":135,"depth":135,"links":906},[907,908,909,910,916,924],{"id":77,"depth":135,"text":81},{"id":91,"depth":135,"text":92},{"id":170,"depth":135,"text":171},{"id":230,"depth":135,"text":231,"children":911},[912,913,914,915],{"id":238,"depth":161,"text":218},{"id":291,"depth":161,"text":226},{"id":457,"depth":161,"text":222},{"id":495,"depth":161,"text":498},{"id":600,"depth":135,"text":601,"children":917},[918,919,920,921,922,923],{"id":623,"depth":161,"text":626},{"id":653,"depth":161,"text":656},{"id":670,"depth":161,"text":673},{"id":687,"depth":161,"text":690},{"id":711,"depth":161,"text":714},{"id":728,"depth":161,"text":731},{"id":741,"depth":135,"text":742},"Shared Nuxt layer for Frigear websites.","md",null,{},true,{"title":36,"description":925},"VGqFpUN3vNPlccuS3vriguKzDwbHFGQSDP2sZnQchwo",[933,935],{"title":31,"path":32,"stem":33,"children":-1,"description":934},"Shared Nuxt layers used to compose Frigear applications.",{"title":40,"path":41,"stem":42,"children":-1,"description":936},"Nuxt modules that add features and shared behavior to Frigear applications.",1791115849669]