[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-navigation":3,"docs-page-theme":166},[4,38,57,65,114,138,157],{"id":5,"group":6,"pages":7},"get-started","Get started",[8,13,18,23,28,33],{"path":9,"title":10,"description":11,"navTitle":10,"group":6,"order":12},"\u002Fdocs\u002Fgetting-started","Getting started","Create your app from the kit, run it locally with no credentials, make yourself superadmin and find where your own code goes.",1,{"path":14,"title":15,"description":16,"navTitle":15,"group":6,"order":17},"\u002Fdocs\u002Flayout","Project structure","Where code lives by where it runs, and which server\u002F directories turn a new file into a route, a job or a provider.",2,{"path":19,"title":20,"description":21,"navTitle":20,"group":6,"order":22},"\u002Fdocs\u002Fconfiguration","Configuration","starter.config.ts switches each part of the kit and its providers, environment variables hold the secrets: every key and what it changes.",3,{"path":24,"title":25,"description":26,"navTitle":25,"group":6,"order":27},"\u002Fdocs\u002Ftemplate","Updating from the kit","Keep the kit as a git remote and take each update as one commit you review, with pnpm template:update, then resolve what conflicts.",4,{"path":29,"title":30,"description":31,"navTitle":30,"group":6,"order":32},"\u002Fdocs\u002Fdeployment","Deployment","Ship the app as one Cloudflare Worker: create the resources, set the secrets, deploy main from GitHub Actions or your machine.",5,{"path":34,"title":35,"description":36,"navTitle":35,"group":6,"order":37},"\u002Fdocs\u002Fmcp","MCP server","Connect Claude Code, Cursor or VS Code to https:\u002F\u002Fnuxter.app\u002Fmcp, so your agent searches and reads these docs and their design notes.",6,{"id":39,"group":40,"pages":41},"accounts","Accounts",[42,47,52],{"path":43,"title":44,"description":45,"navTitle":44,"group":40,"order":46},"\u002Fdocs\u002Fauth","Auth","Pick the sign-in methods, add an OAuth provider, protect a route, and handle sessions, second factors and account deletion.",7,{"path":48,"title":49,"description":50,"navTitle":49,"group":40,"order":51},"\u002Fdocs\u002Ftenancy","Organizations","Scope routes and pages to an organization, and work with its members, roles, seats, invitations and a second level such as branches.",8,{"path":53,"title":54,"description":55,"navTitle":54,"group":40,"order":56},"\u002Fdocs\u002Fpermissions","Roles and permissions","Routes check permissions that an account’s role or its organization’s plan grants: checking one, adding a role, and the staff tools.",9,{"id":58,"group":59,"pages":60},"payments","Payments",[61],{"path":62,"title":59,"description":63,"navTitle":59,"group":59,"order":64},"\u002Fdocs\u002Fpayments","Sell plans through Stripe, Polar, Lemon Squeezy or Creem: define plans, connect a provider, gate features, trials, coupons and refunds.",10,{"id":66,"group":67,"pages":68},"building-blocks","Building blocks",[69,74,79,84,89,94,99,104,109],{"path":70,"title":71,"description":72,"navTitle":71,"group":67,"order":73},"\u002Fdocs\u002Fdatabase","Database","Postgres through Drizzle, on Hyperdrive in production and PGlite locally: add a table, query, transactions, migrations and seed data.",11,{"path":75,"title":76,"description":77,"navTitle":76,"group":67,"order":78},"\u002Fdocs\u002Fbackground-jobs","Background jobs","Run work after the response on Cloudflare Queues with retries: add and enqueue a job, run jobs locally, and schedule cron tasks.",12,{"path":80,"title":81,"description":82,"navTitle":81,"group":67,"order":83},"\u002Fdocs\u002Fevents","Events","React to what the kit does by adding a file to server\u002Flisteners\u002F, fire events of your own, and look up every event’s payload.",13,{"path":85,"title":86,"description":87,"navTitle":86,"group":67,"order":88},"\u002Fdocs\u002Femail","Email","Set up sending, send your own mail with deliverEmail, change the templates and wording, handle unsubscribes and add a provider.",14,{"path":90,"title":91,"description":92,"navTitle":91,"group":67,"order":93},"\u002Fdocs\u002Fcontact","Contact","A \u002Fcontact page that mails you a message or shows your address after a Turnstile check: choose the channels, set the address, know the limits.",15,{"path":95,"title":96,"description":97,"navTitle":96,"group":67,"order":98},"\u002Fdocs\u002Fnotifications","Notifications","The dashboard bell: add a notification type, send one with notify(), and how categories, opt-outs and retention apply.",16,{"path":100,"title":101,"description":102,"navTitle":101,"group":67,"order":103},"\u002Fdocs\u002Fstorage","Storage","Uploads in R2 with one policy per purpose: add a purpose, accept an upload, replace or delete a file, and serve it to its owner.",17,{"path":105,"title":106,"description":107,"navTitle":106,"group":67,"order":108},"\u002Fdocs\u002Ffeature-flags","Feature flags","Declare typed flags in starter.config.ts, read them with flag() or useFlag(), roll them out by rule or percentage, and add a provider.",18,{"path":110,"title":111,"description":112,"navTitle":111,"group":67,"order":113},"\u002Fdocs\u002Fai","AI","Call models from server code by role: text, images, speech, transcription, embeddings and video, with provider fallbacks.",19,{"id":115,"group":116,"pages":117},"web","Web",[118,123,128,133],{"path":119,"title":120,"description":121,"navTitle":120,"group":116,"order":122},"\u002Fdocs\u002Fsecurity-headers","Security headers","The Content-Security-Policy and hardening headers on every response: allow another origin, keep tokens out of Referer, accept cross-site posts.",20,{"path":124,"title":125,"description":126,"navTitle":125,"group":116,"order":127},"\u002Fdocs\u002Frate-limiting","Rate limiting","Cap how often a caller hits a route with requireRateLimit, count only failures, space out sends, and protect the zone.",21,{"path":129,"title":130,"description":131,"navTitle":130,"group":116,"order":132},"\u002Fdocs\u002Fanalytics","Analytics","Product analytics and ad conversions sent from the server with no browser script: add an event, connect a provider, and handle consent.",22,{"path":134,"title":135,"description":136,"navTitle":135,"group":116,"order":137},"\u002Fdocs\u002Fobservability","Observability","Find a failed request by its id, send faults to Sentry or Better Stack, report an error you caught, and change the error page.",23,{"id":139,"group":140,"pages":141},"content-and-look","Content and look",[142,147,152],{"path":143,"title":144,"description":145,"navTitle":144,"group":140,"order":146},"\u002Fdocs\u002Fblog","Blog","Markdown posts with an RSS feed per language, and workflows that draft posts with an AI model and open each one as a pull request.",24,{"path":148,"title":149,"description":150,"navTitle":149,"group":140,"order":151},"\u002Fdocs\u002Flanguages","Languages","Add or remove a language, write copy in the locale files, and write code, refusals and links that follow the reader’s language.",25,{"path":153,"title":154,"description":155,"navTitle":154,"group":140,"order":156},"\u002Fdocs\u002Ftheme","Theme","Change the brand colour and font, and build dashboard sections, list pages, loading placeholders and charts that match the kit.",26,{"id":158,"group":159,"pages":160},"quality","Quality",[161],{"path":162,"title":163,"description":164,"navTitle":163,"group":159,"order":165},"\u002Fdocs\u002Ftesting","Testing","Unit tests in Node, component tests in a real Nuxt app and Playwright end to end: test a route or a component, and what CI runs.",27,{"page":167,"surround":2128,"linksToKit":823},{"path":153,"title":154,"description":155,"navTitle":154,"group":140,"seo":168,"body":170},{"title":169,"description":155},"Theme a Nuxt UI dashboard: colours, fonts, charts",{"type":171,"value":172,"toc":2117},"minimark",[173,177,201,206,228,231,338,366,370,444,461,468,559,563,569,611,644,648,666,947,1012,1030,1081,1085,1111,1537,1551,1563,1567,1570,1670,1702,1706,1720,1852,1858,1869,1887,1890,2062,2066,2113],[174,175,154],"h1",{"id":176},"theme",[178,179,180,181,192,193,200],"p",{},"The kit's look is Nuxt UI, adjusted in\n",[182,183,188],"a",{"href":184,"rel":185,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fapp.config.ts",[186],"nofollow","Licensees only",[189,190,191],"code",{},"app\u002Fapp.config.ts"," and a few tokens in\n",[182,194,197],{"href":195,"rel":196,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fassets\u002Fcss\u002Fmain.css",[186],[189,198,199],{},"app\u002Fassets\u002Fcss\u002Fmain.css",".\nThe dashboard is built from a handful of kit components on top of it. You work\nhere when you change the brand colour or font, or build a dashboard page that\nshould match the kit's.",[202,203,205],"h2",{"id":204},"how-it-works","How it works",[178,207,208,211,212,215,216,219,220,223,224,227],{},[189,209,210],{},"ui.colors"," in ",[189,213,214],{},"app.config.ts"," picks the Nuxt UI palettes. Every override below\nit is written in Nuxt UI's tokens (",[189,217,218],{},"bg-elevated",", ",[189,221,222],{},"bg-inverted\u002F5",",\n",[189,225,226],{},"--ui-border",") rather than fixed shades, so changing a palette re-tints\neverything.",[178,229,230],{},"Surfaces get lighter as they come towards the reader, in both themes:",[232,233,234,250],"table",{},[235,236,237],"thead",{},[238,239,240,244,247],"tr",{},[241,242,243],"th",{},"Surface",[241,245,246],{},"Light",[241,248,249],{},"Dark",[251,252,253,269,283,298,311,325],"tbody",{},[238,254,255,259,264],{},[256,257,258],"td",{},"Dashboard ground",[256,260,261],{},[189,262,263],{},"bg-accented",[256,265,266],{},[189,267,268],{},"bg-default",[238,270,271,274,278],{},[256,272,273],{},"Dashboard panel",[256,275,276],{},[189,277,218],{},[256,279,280],{},[189,281,282],{},"bg-elevated\u002F25",[238,284,285,288,293],{},[256,286,287],{},"Card",[256,289,290],{},[189,291,292],{},"bg-muted",[256,294,295],{},[189,296,297],{},"bg-elevated\u002F50",[238,299,300,303,307],{},[256,301,302],{},"Modal, slideover, drawer",[256,304,305],{},[189,306,292],{},[256,308,309],{},[189,310,218],{},[238,312,313,316,321],{},[256,314,315],{},"Input",[256,317,318,320],{},[189,319,268],{}," (white)",[256,322,323],{},[189,324,222],{},[238,326,327,330,335],{},[256,328,329],{},"Menu, popover, tooltip, toast",[256,331,332,334],{},[189,333,268],{}," + ring",[256,336,337],{},"neutral-800 mixed 70% with neutral-700",[178,339,340,341,343,344,346,347,350,351,353,354,357,358,361,362,365],{},"The rest of ",[189,342,214],{}," follows from that table. Dark inputs, outline\nbuttons and highlighted menu rows use a white wash (",[189,345,222],{}," or ",[189,348,349],{},"\u002F10","),\nso they sit a step above whatever holds them. Rules inside cards, modals,\nslideovers and drawers redefine ",[189,352,226],{}," as white at 10% in the dark\ntheme, where the default border colour matches the surface. Overlays dim with\n",[189,355,356],{},"bg-black\u002F60",". Buttons default to ",[189,359,360],{},"color: 'neutral'"," and ",[189,363,364],{},"size: 'lg'",", and\ndisabled controls sit at 50% opacity.",[202,367,369],{"id":368},"change-the-brand-colour","Change the brand colour",[371,372,377],"pre",{"className":373,"code":374,"language":375,"meta":376,"style":376},"language-ts shiki shiki-themes github-light github-light github-dark","export default defineAppConfig({\n  ui: {\n    colors: {\n      primary: 'indigo',\n      neutral: 'slate',\n    },\n  },\n})\n","ts","",[189,378,379,398,403,408,419,429,434,439],{"__ignoreMap":376},[380,381,383,387,390,394],"span",{"class":382,"line":12},"line",[380,384,386],{"class":385},"s8jYJ","export",[380,388,389],{"class":385}," default",[380,391,393],{"class":392},"snPdu"," defineAppConfig",[380,395,397],{"class":396},"sxrX7","({\n",[380,399,400],{"class":382,"line":17},[380,401,402],{"class":396},"  ui: {\n",[380,404,405],{"class":382,"line":22},[380,406,407],{"class":396},"    colors: {\n",[380,409,410,413,417],{"class":382,"line":27},[380,411,412],{"class":396},"      primary: ",[380,414,416],{"class":415},"sIIMD","'indigo'",[380,418,223],{"class":396},[380,420,421,424,427],{"class":382,"line":32},[380,422,423],{"class":396},"      neutral: ",[380,425,426],{"class":415},"'slate'",[380,428,223],{"class":396},[380,430,431],{"class":382,"line":37},[380,432,433],{"class":396},"    },\n",[380,435,436],{"class":382,"line":46},[380,437,438],{"class":396},"  },\n",[380,440,441],{"class":382,"line":51},[380,442,443],{"class":396},"})\n",[178,445,446,447,361,450,453,454,457,458,460],{},"The kit ships ",[189,448,449],{},"primary: 'zinc'",[189,451,452],{},"neutral: 'neutral'",". Nuxt UI paints active\nlinks, focus rings and anything given ",[189,455,456],{},"color=\"primary\""," in the primary palette.\nSolid buttons default to neutral, black on light and white on dark, so give\n",[189,459,456],{}," to a button that should carry the brand.",[178,462,463,464,467],{},"A light primary such as orange or amber needs dark text on its solid fills.\nAdd it per component under ",[189,465,466],{},"ui",":",[371,469,471],{"className":373,"code":470,"language":375,"meta":376,"style":376},"button: {\n  compoundVariants: [\n    { color: 'primary', variant: 'solid', class: 'text-neutral-900' },\n  ],\n},\nbadge: {\n  compoundVariants: [\n    { color: 'primary', variant: 'solid', class: 'text-neutral-900' },\n  ],\n},\n",[189,472,473,481,489,512,517,522,529,535,551,555],{"__ignoreMap":376},[380,474,475,478],{"class":382,"line":12},[380,476,477],{"class":392},"button",[380,479,480],{"class":396},": {\n",[380,482,483,486],{"class":382,"line":17},[380,484,485],{"class":392},"  compoundVariants",[380,487,488],{"class":396},": [\n",[380,490,491,494,497,500,503,506,509],{"class":382,"line":22},[380,492,493],{"class":396},"    { color: ",[380,495,496],{"class":415},"'primary'",[380,498,499],{"class":396},", variant: ",[380,501,502],{"class":415},"'solid'",[380,504,505],{"class":396},", class: ",[380,507,508],{"class":415},"'text-neutral-900'",[380,510,511],{"class":396}," },\n",[380,513,514],{"class":382,"line":27},[380,515,516],{"class":396},"  ],\n",[380,518,519],{"class":382,"line":32},[380,520,521],{"class":396},"},\n",[380,523,524,527],{"class":382,"line":37},[380,525,526],{"class":392},"badge",[380,528,480],{"class":396},[380,530,531,533],{"class":382,"line":46},[380,532,485],{"class":392},[380,534,488],{"class":396},[380,536,537,539,541,543,545,547,549],{"class":382,"line":51},[380,538,493],{"class":396},[380,540,496],{"class":415},[380,542,499],{"class":396},[380,544,502],{"class":415},[380,546,505],{"class":396},[380,548,508],{"class":415},[380,550,511],{"class":396},[380,552,553],{"class":382,"line":56},[380,554,516],{"class":396},[380,556,557],{"class":382,"line":64},[380,558,521],{"class":396},[202,560,562],{"id":561},"change-the-font","Change the font",[178,564,565,566,467],{},"Rename the family in ",[189,567,568],{},"main.css",[371,570,574],{"className":571,"code":572,"language":573,"meta":376,"style":376},"language-css shiki shiki-themes github-light github-light github-dark","@theme static {\n  --font-sans: 'Geist', ui-sans-serif, system-ui, sans-serif;\n}\n","css",[189,575,576,584,606],{"__ignoreMap":376},[380,577,578,581],{"class":382,"line":12},[380,579,580],{"class":385},"@theme",[380,582,583],{"class":396}," static {\n",[380,585,586,589,593,595,598,600,603],{"class":382,"line":17},[380,587,588],{"class":396},"  --font-sans: 'Geist', ",[380,590,592],{"class":591},"sovSZ","ui-sans-serif",[380,594,219],{"class":396},[380,596,597],{"class":591},"system-ui",[380,599,219],{"class":396},[380,601,602],{"class":591},"sans-serif",[380,604,605],{"class":396},";\n",[380,607,608],{"class":382,"line":22},[380,609,610],{"class":396},"}\n",[178,612,613,614,617,618,625,626,629,630,617,633,640,641,643],{},"@nuxt\u002Ffonts reads that name, then downloads and self-hosts the family. The Open\nGraph image has its own copy: change ",[189,615,616],{},"ogImage.defaults.fonts"," in\n",[182,619,622],{"href":620,"rel":621,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fnuxt.config.ts",[186],[189,623,624],{},"nuxt.config.ts"," (",[189,627,628],{},"['Inter:400', 'Inter:500', 'Inter:600']",")\nand the ",[189,631,632],{},"font-family",[182,634,637],{"href":635,"rel":636,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002FOgImage\u002FDefault.takumi.vue",[186],[189,638,639],{},"app\u002Fcomponents\u002FOgImage\u002FDefault.takumi.vue",".\nThe heading letter-spacing in ",[189,642,568],{}," is tuned for Inter, so check it\nagainst the new face.",[202,645,647],{"id":646},"build-a-dashboard-section","Build a dashboard section",[178,649,650,657,658,665],{},[182,651,654],{"href":652,"rel":653,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002FDashboardSection.vue",[186],[189,655,656],{},"DashboardSection"," is the card every\ndashboard page is made of. The heading sits inside the card, with the action at\nits end. ",[182,659,662],{"href":660,"rel":661,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002FSettingRow.vue",[186],[189,663,664],{},"SettingRow"," puts one setting's\nlabel and help on the left and its control on the right:",[371,667,671],{"className":668,"code":669,"language":670,"meta":376,"style":376},"language-vue shiki shiki-themes github-light github-light github-dark","\u003Ctemplate>\n  \u003CDashboardSection\n    :title=\"$t('reports.title')\"\n    :description=\"$t('reports.description')\"\n  >\n    \u003Ctemplate #actions>\n      \u003CUButton :label=\"$t('reports.export')\" @click=\"exportReports\" \u002F>\n    \u003C\u002Ftemplate>\n\n    \u003CSettingRow\n      :label=\"$t('reports.weekly.label')\"\n      :help=\"$t('reports.weekly.help')\"\n    >\n      \u003CUSwitch v-model=\"weekly\" :aria-label=\"$t('reports.weekly.label')\" \u002F>\n    \u003C\u002FSettingRow>\n  \u003C\u002FDashboardSection>\n\u003C\u002Ftemplate>\n","vue",[189,672,673,684,692,721,743,748,763,810,819,825,832,854,876,881,921,929,938],{"__ignoreMap":376},[380,674,675,678,681],{"class":382,"line":12},[380,676,677],{"class":396},"\u003C",[380,679,680],{"class":591},"template",[380,682,683],{"class":396},">\n",[380,685,686,689],{"class":382,"line":17},[380,687,688],{"class":396},"  \u003C",[380,690,691],{"class":591},"DashboardSection\n",[380,693,694,697,700,703,706,709,712,715,718],{"class":382,"line":22},[380,695,696],{"class":396},"    :",[380,698,699],{"class":392},"title",[380,701,702],{"class":396},"=",[380,704,705],{"class":415},"\"",[380,707,708],{"class":392},"$t",[380,710,711],{"class":396},"(",[380,713,714],{"class":415},"'reports.title'",[380,716,717],{"class":396},")",[380,719,720],{"class":415},"\"\n",[380,722,723,725,728,730,732,734,736,739,741],{"class":382,"line":27},[380,724,696],{"class":396},[380,726,727],{"class":392},"description",[380,729,702],{"class":396},[380,731,705],{"class":415},[380,733,708],{"class":392},[380,735,711],{"class":396},[380,737,738],{"class":415},"'reports.description'",[380,740,717],{"class":396},[380,742,720],{"class":415},[380,744,745],{"class":382,"line":32},[380,746,747],{"class":396},"  >\n",[380,749,750,753,755,758,761],{"class":382,"line":37},[380,751,752],{"class":396},"    \u003C",[380,754,680],{"class":591},[380,756,757],{"class":396}," #",[380,759,760],{"class":392},"actions",[380,762,683],{"class":396},[380,764,765,768,771,774,777,779,781,783,785,788,790,792,795,798,800,802,805,807],{"class":382,"line":46},[380,766,767],{"class":396},"      \u003C",[380,769,770],{"class":591},"UButton",[380,772,773],{"class":396}," :",[380,775,776],{"class":392},"label",[380,778,702],{"class":396},[380,780,705],{"class":415},[380,782,708],{"class":392},[380,784,711],{"class":396},[380,786,787],{"class":415},"'reports.export'",[380,789,717],{"class":396},[380,791,705],{"class":415},[380,793,794],{"class":396}," @",[380,796,797],{"class":392},"click",[380,799,702],{"class":396},[380,801,705],{"class":415},[380,803,804],{"class":396},"exportReports",[380,806,705],{"class":415},[380,808,809],{"class":396}," \u002F>\n",[380,811,812,815,817],{"class":382,"line":51},[380,813,814],{"class":396},"    \u003C\u002F",[380,816,680],{"class":591},[380,818,683],{"class":396},[380,820,821],{"class":382,"line":56},[380,822,824],{"emptyLinePlaceholder":823},true,"\n",[380,826,827,829],{"class":382,"line":64},[380,828,752],{"class":396},[380,830,831],{"class":591},"SettingRow\n",[380,833,834,837,839,841,843,845,847,850,852],{"class":382,"line":73},[380,835,836],{"class":396},"      :",[380,838,776],{"class":392},[380,840,702],{"class":396},[380,842,705],{"class":415},[380,844,708],{"class":392},[380,846,711],{"class":396},[380,848,849],{"class":415},"'reports.weekly.label'",[380,851,717],{"class":396},[380,853,720],{"class":415},[380,855,856,858,861,863,865,867,869,872,874],{"class":382,"line":78},[380,857,836],{"class":396},[380,859,860],{"class":392},"help",[380,862,702],{"class":396},[380,864,705],{"class":415},[380,866,708],{"class":392},[380,868,711],{"class":396},[380,870,871],{"class":415},"'reports.weekly.help'",[380,873,717],{"class":396},[380,875,720],{"class":415},[380,877,878],{"class":382,"line":83},[380,879,880],{"class":396},"    >\n",[380,882,883,885,888,891,893,895,898,900,902,905,907,909,911,913,915,917,919],{"class":382,"line":88},[380,884,767],{"class":396},[380,886,887],{"class":591},"USwitch",[380,889,890],{"class":392}," v-model",[380,892,702],{"class":396},[380,894,705],{"class":415},[380,896,897],{"class":396},"weekly",[380,899,705],{"class":415},[380,901,773],{"class":396},[380,903,904],{"class":392},"aria-label",[380,906,702],{"class":396},[380,908,705],{"class":415},[380,910,708],{"class":392},[380,912,711],{"class":396},[380,914,849],{"class":415},[380,916,717],{"class":396},[380,918,705],{"class":415},[380,920,809],{"class":396},[380,922,923,925,927],{"class":382,"line":93},[380,924,814],{"class":396},[380,926,664],{"class":591},[380,928,683],{"class":396},[380,930,931,934,936],{"class":382,"line":98},[380,932,933],{"class":396},"  \u003C\u002F",[380,935,656],{"class":591},[380,937,683],{"class":396},[380,939,940,943,945],{"class":382,"line":103},[380,941,942],{"class":396},"\u003C\u002F",[380,944,680],{"class":591},[380,946,683],{"class":396},[232,948,949,959],{},[235,950,951],{},[238,952,953,956],{},[241,954,955],{},"Prop",[241,957,958],{},"What it does",[251,960,961,982,992,1002],{},[238,962,963,969],{},[256,964,965,219,967],{},[189,966,699],{},[189,968,727],{},[256,970,971,972,219,975,346,978,981],{},"The heading. With neither, and no ",[189,973,974],{},"#heading",[189,976,977],{},"#actions",[189,979,980],{},"#toolbar",", no header is drawn",[238,983,984,989],{},[256,985,986],{},[189,987,988],{},"fill",[256,990,991],{},"Caps the card at the panel's height and scrolls its body. Only for a page that is one list",[238,993,994,999],{},[256,995,996],{},[189,997,998],{},"bleed",[256,1000,1001],{},"Removes the body's padding, so a table runs edge to edge",[238,1003,1004,1009],{},[256,1005,1006],{},[189,1007,1008],{},"tone=\"danger\"",[256,1010,1011],{},"A red tint and border for actions that can't be undone",[178,1013,1014,1015,1017,1018,1021,1022,219,1024,219,1026,1029],{},"The slots are ",[189,1016,974],{}," (replaces title and description), ",[189,1019,1020],{},"#meta"," (beside the\ntitle, such as a count badge), ",[189,1023,977],{},[189,1025,980],{},[189,1027,1028],{},"#footer"," and the\ndefault body.",[1031,1032,1033,1044,1050,1057,1067],"ul",{},[1034,1035,1036,1037,1039,1040,1043],"li",{},"Put the section's action in ",[189,1038,977],{},", a form's Save included. Call the\nform's ",[189,1041,1042],{},"submit()"," from there rather than posting the state yourself, so the\nschema still runs.",[1034,1045,1046,1047,1049],{},"Pass ",[189,1048,1028],{}," only when there is something in it. A passed slot draws the\nfooter even when it renders nothing.",[1034,1051,1052,1053,1056],{},"A page draws no wrapper of its own. The shell already stacks sections with a\ngap and caps them at ",[189,1054,1055],{},"lg:max-w-3xl",".",[1034,1058,1059,1060,1062,1063,1066],{},"The body is a container, and ",[189,1061,664],{}," goes two-column at ",[189,1064,1065],{},"@2xl",", so rows\nrespond to the card's width when the notifications drawer narrows the panel.",[1034,1068,1069,1070,1073,1074,1077,1078,1056],{},"A destructive action on a list row is ",[189,1071,1072],{},"color=\"error\" variant=\"ghost\"",". An\nempty state inside a card is ",[189,1075,1076],{},"UEmpty"," with ",[189,1079,1080],{},"variant=\"naked\"",[202,1082,1084],{"id":1083},"build-a-page-that-is-one-list","Build a page that is one list",[178,1086,1087,1088,361,1090,1092,1093,1095,1096,1103,1104,467],{},"Give the section ",[189,1089,988],{},[189,1091,998],{},", put the filters in ",[189,1094,980],{},", and page\nwith ",[182,1097,1100],{"href":1098,"rel":1099,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002FDashboardPager.vue",[186],[189,1101,1102],{},"DashboardPager"," in the footer.\nThis is the shape of\n",[182,1105,1108],{"href":1106,"rel":1107,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fpages\u002Fdashboard\u002Fcustomers.vue",[186],[189,1109,1110],{},"app\u002Fpages\u002Fdashboard\u002Fcustomers.vue",[371,1112,1114],{"className":668,"code":1113,"language":670,"meta":376,"style":376},"\u003Ctemplate>\n  \u003CDashboardSection\n    fill\n    bleed\n    :title=\"$t('reports.title')\"\n    :description=\"$t('reports.description')\"\n  >\n    \u003Ctemplate #toolbar>\n      \u003CUInput v-model=\"search\" type=\"search\" icon=\"i-lucide-search\" \u002F>\n    \u003C\u002Ftemplate>\n\n    \u003CSkeletonTable v-if=\"isPending\" :rows=\"perPage\" :columns=\"columns.length\" \u002F>\n\n    \u003CUTable\n      v-else\n      class=\"min-h-0 flex-1\"\n      :data=\"data?.rows ?? []\"\n      :columns=\"columns\"\n      :loading=\"asyncStatus === 'loading'\"\n      :ui=\"{ root: 'scroll-fade-y' }\"\n    \u002F>\n\n    \u003Ctemplate v-if=\"data && data.total > data.perPage\" #footer>\n      \u003CDashboardPager\n        v-model:page=\"page\"\n        :total=\"data.total\"\n        :per-page=\"data.perPage\"\n      \u002F>\n    \u003C\u002Ftemplate>\n  \u003C\u002FDashboardSection>\n\u003C\u002Ftemplate>\n",[189,1115,1116,1124,1130,1135,1140,1160,1180,1184,1197,1233,1241,1245,1298,1302,1309,1314,1324,1346,1360,1380,1401,1406,1410,1446,1453,1471,1488,1504,1510,1519,1528],{"__ignoreMap":376},[380,1117,1118,1120,1122],{"class":382,"line":12},[380,1119,677],{"class":396},[380,1121,680],{"class":591},[380,1123,683],{"class":396},[380,1125,1126,1128],{"class":382,"line":17},[380,1127,688],{"class":396},[380,1129,691],{"class":591},[380,1131,1132],{"class":382,"line":22},[380,1133,1134],{"class":392},"    fill\n",[380,1136,1137],{"class":382,"line":27},[380,1138,1139],{"class":392},"    bleed\n",[380,1141,1142,1144,1146,1148,1150,1152,1154,1156,1158],{"class":382,"line":32},[380,1143,696],{"class":396},[380,1145,699],{"class":392},[380,1147,702],{"class":396},[380,1149,705],{"class":415},[380,1151,708],{"class":392},[380,1153,711],{"class":396},[380,1155,714],{"class":415},[380,1157,717],{"class":396},[380,1159,720],{"class":415},[380,1161,1162,1164,1166,1168,1170,1172,1174,1176,1178],{"class":382,"line":37},[380,1163,696],{"class":396},[380,1165,727],{"class":392},[380,1167,702],{"class":396},[380,1169,705],{"class":415},[380,1171,708],{"class":392},[380,1173,711],{"class":396},[380,1175,738],{"class":415},[380,1177,717],{"class":396},[380,1179,720],{"class":415},[380,1181,1182],{"class":382,"line":46},[380,1183,747],{"class":396},[380,1185,1186,1188,1190,1192,1195],{"class":382,"line":51},[380,1187,752],{"class":396},[380,1189,680],{"class":591},[380,1191,757],{"class":396},[380,1193,1194],{"class":392},"toolbar",[380,1196,683],{"class":396},[380,1198,1199,1201,1204,1206,1208,1210,1213,1215,1218,1220,1223,1226,1228,1231],{"class":382,"line":56},[380,1200,767],{"class":396},[380,1202,1203],{"class":591},"UInput",[380,1205,890],{"class":392},[380,1207,702],{"class":396},[380,1209,705],{"class":415},[380,1211,1212],{"class":396},"search",[380,1214,705],{"class":415},[380,1216,1217],{"class":392}," type",[380,1219,702],{"class":396},[380,1221,1222],{"class":415},"\"search\"",[380,1224,1225],{"class":392}," icon",[380,1227,702],{"class":396},[380,1229,1230],{"class":415},"\"i-lucide-search\"",[380,1232,809],{"class":396},[380,1234,1235,1237,1239],{"class":382,"line":64},[380,1236,814],{"class":396},[380,1238,680],{"class":591},[380,1240,683],{"class":396},[380,1242,1243],{"class":382,"line":73},[380,1244,824],{"emptyLinePlaceholder":823},[380,1246,1247,1249,1252,1255,1257,1259,1262,1264,1266,1269,1271,1273,1276,1278,1280,1283,1285,1287,1290,1294,1296],{"class":382,"line":78},[380,1248,752],{"class":396},[380,1250,1251],{"class":591},"SkeletonTable",[380,1253,1254],{"class":385}," v-if",[380,1256,702],{"class":396},[380,1258,705],{"class":415},[380,1260,1261],{"class":396},"isPending",[380,1263,705],{"class":415},[380,1265,773],{"class":396},[380,1267,1268],{"class":392},"rows",[380,1270,702],{"class":396},[380,1272,705],{"class":415},[380,1274,1275],{"class":396},"perPage",[380,1277,705],{"class":415},[380,1279,773],{"class":396},[380,1281,1282],{"class":392},"columns",[380,1284,702],{"class":396},[380,1286,705],{"class":415},[380,1288,1289],{"class":396},"columns.",[380,1291,1293],{"class":1292},"sBjJW","length",[380,1295,705],{"class":415},[380,1297,809],{"class":396},[380,1299,1300],{"class":382,"line":83},[380,1301,824],{"emptyLinePlaceholder":823},[380,1303,1304,1306],{"class":382,"line":88},[380,1305,752],{"class":396},[380,1307,1308],{"class":591},"UTable\n",[380,1310,1311],{"class":382,"line":93},[380,1312,1313],{"class":385},"      v-else\n",[380,1315,1316,1319,1321],{"class":382,"line":98},[380,1317,1318],{"class":392},"      class",[380,1320,702],{"class":396},[380,1322,1323],{"class":415},"\"min-h-0 flex-1\"\n",[380,1325,1326,1328,1331,1333,1335,1338,1341,1344],{"class":382,"line":103},[380,1327,836],{"class":396},[380,1329,1330],{"class":392},"data",[380,1332,702],{"class":396},[380,1334,705],{"class":415},[380,1336,1337],{"class":396},"data?.rows ",[380,1339,1340],{"class":385},"??",[380,1342,1343],{"class":396}," []",[380,1345,720],{"class":415},[380,1347,1348,1350,1352,1354,1356,1358],{"class":382,"line":108},[380,1349,836],{"class":396},[380,1351,1282],{"class":392},[380,1353,702],{"class":396},[380,1355,705],{"class":415},[380,1357,1282],{"class":396},[380,1359,720],{"class":415},[380,1361,1362,1364,1367,1369,1371,1374,1377],{"class":382,"line":113},[380,1363,836],{"class":396},[380,1365,1366],{"class":392},"loading",[380,1368,702],{"class":396},[380,1370,705],{"class":415},[380,1372,1373],{"class":396},"asyncStatus ",[380,1375,1376],{"class":385},"===",[380,1378,1379],{"class":415}," 'loading'\"\n",[380,1381,1382,1384,1386,1388,1390,1393,1396,1399],{"class":382,"line":122},[380,1383,836],{"class":396},[380,1385,466],{"class":392},[380,1387,702],{"class":396},[380,1389,705],{"class":415},[380,1391,1392],{"class":396},"{ root: ",[380,1394,1395],{"class":415},"'scroll-fade-y'",[380,1397,1398],{"class":396}," }",[380,1400,720],{"class":415},[380,1402,1403],{"class":382,"line":127},[380,1404,1405],{"class":396},"    \u002F>\n",[380,1407,1408],{"class":382,"line":132},[380,1409,824],{"emptyLinePlaceholder":823},[380,1411,1412,1414,1416,1418,1420,1422,1425,1428,1431,1434,1437,1439,1441,1444],{"class":382,"line":137},[380,1413,752],{"class":396},[380,1415,680],{"class":591},[380,1417,1254],{"class":385},[380,1419,702],{"class":396},[380,1421,705],{"class":415},[380,1423,1424],{"class":396},"data ",[380,1426,1427],{"class":385},"&&",[380,1429,1430],{"class":396}," data.total ",[380,1432,1433],{"class":385},">",[380,1435,1436],{"class":396}," data.perPage",[380,1438,705],{"class":415},[380,1440,757],{"class":396},[380,1442,1443],{"class":392},"footer",[380,1445,683],{"class":396},[380,1447,1448,1450],{"class":382,"line":146},[380,1449,767],{"class":396},[380,1451,1452],{"class":591},"DashboardPager\n",[380,1454,1455,1458,1460,1463,1465,1467,1469],{"class":382,"line":151},[380,1456,1457],{"class":392},"        v-model",[380,1459,467],{"class":396},[380,1461,1462],{"class":392},"page",[380,1464,702],{"class":396},[380,1466,705],{"class":415},[380,1468,1462],{"class":396},[380,1470,720],{"class":415},[380,1472,1473,1476,1479,1481,1483,1486],{"class":382,"line":156},[380,1474,1475],{"class":396},"        :",[380,1477,1478],{"class":392},"total",[380,1480,702],{"class":396},[380,1482,705],{"class":415},[380,1484,1485],{"class":396},"data.total",[380,1487,720],{"class":415},[380,1489,1490,1492,1495,1497,1499,1502],{"class":382,"line":165},[380,1491,1475],{"class":396},[380,1493,1494],{"class":392},"per-page",[380,1496,702],{"class":396},[380,1498,705],{"class":415},[380,1500,1501],{"class":396},"data.perPage",[380,1503,720],{"class":415},[380,1505,1507],{"class":382,"line":1506},28,[380,1508,1509],{"class":396},"      \u002F>\n",[380,1511,1513,1515,1517],{"class":382,"line":1512},29,[380,1514,814],{"class":396},[380,1516,680],{"class":591},[380,1518,683],{"class":396},[380,1520,1522,1524,1526],{"class":382,"line":1521},30,[380,1523,933],{"class":396},[380,1525,656],{"class":591},[380,1527,683],{"class":396},[380,1529,1531,1533,1535],{"class":382,"line":1530},31,[380,1532,942],{"class":396},[380,1534,680],{"class":591},[380,1536,683],{"class":396},[178,1538,1539,1540,1543,1544,346,1547,1550],{},"Inside the settings or organization shell, the page also declares\n",[189,1541,1542],{},"definePageMeta({ fill: true })",", so the shell gives it a bounded height to\nfill. The toolbar is a container too: lay filters out with ",[189,1545,1546],{},"@2xl:",[189,1548,1549],{},"@4xl:","\nvariants, not viewport breakpoints.",[178,1552,1553,1556,1557,1559,1560,1562],{},[189,1554,1555],{},"scroll-fade-y"," fades a scroller's top or bottom edge only while there is more\nto scroll that way. The dashboard panel's body and a ",[189,1558,988],{}," card's body already\ncarry it. In a ",[189,1561,988],{}," card the table is what scrolls, so the table's root takes\nthe class.",[202,1564,1566],{"id":1565},"show-a-placeholder-while-loading","Show a placeholder while loading",[178,1568,1569],{},"Use the skeleton components, sized like what they stand in for:",[232,1571,1572,1585],{},[235,1573,1574],{},[238,1575,1576,1579,1582],{},[241,1577,1578],{},"Component",[241,1580,1581],{},"Stands in for",[241,1583,1584],{},"Props",[251,1586,1587,1608,1632,1650],{},[238,1588,1589,1594,1600],{},[256,1590,1591],{},[189,1592,1593],{},"SkeletonCard",[256,1595,1596,1597,1599],{},"A ",[189,1598,656],{}," with rows",[256,1601,1602,1604,1605],{},[189,1603,1268],{}," (2), ",[189,1606,1607],{},"action",[238,1609,1610,1615,1618],{},[256,1611,1612],{},[189,1613,1614],{},"SkeletonRows",[256,1616,1617],{},"List rows, with an icon or switch before and a control after",[256,1619,1620,1622,1623,219,1626,219,1629],{},[189,1621,1268],{}," (3), ",[189,1624,1625],{},"leading",[189,1627,1628],{},"trailing",[189,1630,1631],{},"lines",[238,1633,1634,1639,1642],{},[256,1635,1636],{},[189,1637,1638],{},"SkeletonForm",[256,1640,1641],{},"Form fields",[256,1643,1644,1604,1647],{},[189,1645,1646],{},"fields",[189,1648,1649],{},"hint",[238,1651,1652,1656,1662],{},[256,1653,1654],{},[189,1655,1251],{},[256,1657,1658,1659],{},"The first page of a ",[189,1660,1661],{},"UTable",[256,1663,1664,1666,1667,1669],{},[189,1665,1268],{}," (5), ",[189,1668,1282],{}," (4)",[178,1671,1672,1673,1675,1676,1678,1679,1682,1683,361,1686,1689,1690,1693,1694,1701],{},"Later pages keep their rows and dim them through ",[189,1674,1661],{},"'s ",[189,1677,1366],{},". A single\n",[189,1680,1681],{},"USkeleton"," of your own either stands in for one control, with\n",[189,1684,1685],{},"role=\"status\"",[189,1687,1688],{},":aria-label=\"$t('common.loading')\"",", or carries\n",[189,1691,1692],{},"aria-hidden=\"true\""," inside a labelled wrapper.\n",[182,1695,1698],{"href":1696,"rel":1697,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Ftest\u002Funit\u002Fskeleton-labels.test.ts",[186],[189,1699,1700],{},"test\u002Funit\u002Fskeleton-labels.test.ts","\nfails on one that does neither.",[202,1703,1705],{"id":1704},"add-a-chart","Add a chart",[178,1707,1708,1715,1716,1719],{},[182,1709,1712],{"href":1710,"rel":1711,"title":187},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fapp\u002Fcomponents\u002FDashboardActivityCard.vue",[186],[189,1713,1714],{},"DashboardActivityCard"," wraps\nthe unovis stacked bar chart with its legend, an accessible table, and the\nloading, empty and failed states. Give each series the next\n",[189,1717,1718],{},"--color-chart-\u003Cn>"," slot, in order:",[371,1721,1723],{"className":373,"code":1722,"language":375,"meta":376,"style":376},"const series = computed\u003CDashboardChartSeries[]>(() =>\n  ['signIns', 'failedSignIns', 'sessions'].map((id, index) => ({\n    id,\n    label: t(`reports.series.${id}`),\n    color: `var(--color-chart-${index + 1})`,\n  })),\n)\n",[189,1724,1725,1750,1795,1800,1821,1842,1847],{"__ignoreMap":376},[380,1726,1727,1730,1733,1736,1739,1741,1744,1747],{"class":382,"line":12},[380,1728,1729],{"class":385},"const",[380,1731,1732],{"class":1292}," series",[380,1734,1735],{"class":385}," =",[380,1737,1738],{"class":392}," computed",[380,1740,677],{"class":396},[380,1742,1743],{"class":392},"DashboardChartSeries",[380,1745,1746],{"class":396},"[]>(() ",[380,1748,1749],{"class":385},"=>\n",[380,1751,1752,1755,1758,1760,1763,1765,1768,1771,1774,1777,1781,1783,1786,1789,1792],{"class":382,"line":17},[380,1753,1754],{"class":396},"  [",[380,1756,1757],{"class":415},"'signIns'",[380,1759,219],{"class":396},[380,1761,1762],{"class":415},"'failedSignIns'",[380,1764,219],{"class":396},[380,1766,1767],{"class":415},"'sessions'",[380,1769,1770],{"class":396},"].",[380,1772,1773],{"class":392},"map",[380,1775,1776],{"class":396},"((",[380,1778,1780],{"class":1779},"sP4rz","id",[380,1782,219],{"class":396},[380,1784,1785],{"class":1779},"index",[380,1787,1788],{"class":396},") ",[380,1790,1791],{"class":385},"=>",[380,1793,1794],{"class":396}," ({\n",[380,1796,1797],{"class":382,"line":22},[380,1798,1799],{"class":396},"    id,\n",[380,1801,1802,1805,1808,1810,1813,1815,1818],{"class":382,"line":27},[380,1803,1804],{"class":396},"    label: ",[380,1806,1807],{"class":392},"t",[380,1809,711],{"class":396},[380,1811,1812],{"class":415},"`reports.series.${",[380,1814,1780],{"class":396},[380,1816,1817],{"class":415},"}`",[380,1819,1820],{"class":396},"),\n",[380,1822,1823,1826,1829,1831,1834,1837,1840],{"class":382,"line":32},[380,1824,1825],{"class":396},"    color: ",[380,1827,1828],{"class":415},"`var(--color-chart-${",[380,1830,1785],{"class":396},[380,1832,1833],{"class":385}," +",[380,1835,1836],{"class":1292}," 1",[380,1838,1839],{"class":415},"})`",[380,1841,223],{"class":396},[380,1843,1844],{"class":382,"line":37},[380,1845,1846],{"class":396},"  })),\n",[380,1848,1849],{"class":382,"line":46},[380,1850,1851],{"class":396},")\n",[178,1853,1854,1855,1857],{},"The eight slots in ",[189,1856,568],{}," are ordered so neighbours stay distinguishable\nwith colour blindness, in both themes. Keep a series on its slot when a range\nleaves another series empty. The first three are distinct in any arrangement;\npast three, fold the tail into one series or rely on the legend and table.",[178,1859,1860,1861,1864,1865,1868],{},"The chart renders only in the browser (",[189,1862,1863],{},"DashboardStackedBarChart.client.vue","),\nso unovis never enters the Worker bundle. Its segment gaps are stroked in\n",[189,1866,1867],{},"--color-chart-surface",", the card's colour, so change that token with the\ncard's background.",[178,1870,1871,1874,1875,1878,1879,1882,1883,1886],{},[189,1872,1873],{},"DashboardStatCard"," takes ",[189,1876,1877],{},"better: 'higher' | 'lower' | 'neither'"," to colour\nits trend. Pass ",[189,1880,1881],{},"lower"," for a count that should fall, such as failed sign-ins,\nand ",[189,1884,1885],{},"neither"," for one that is only activity.",[202,1888,20],{"id":1889},"configuration",[232,1891,1892,1907],{},[235,1893,1894],{},[238,1895,1896,1899,1902,1905],{},[241,1897,1898],{},"Key",[241,1900,1901],{},"Where",[241,1903,1904],{},"Default",[241,1906,958],{},[251,1908,1909,1928,1947,1970,1990,2009,2030,2046],{},[238,1910,1911,1916,1920,1925],{},[256,1912,1913],{},[189,1914,1915],{},"ui.colors.primary",[256,1917,1918],{},[189,1919,191],{},[256,1921,1922],{},[189,1923,1924],{},"'zinc'",[256,1926,1927],{},"Brand palette",[238,1929,1930,1935,1939,1944],{},[256,1931,1932],{},[189,1933,1934],{},"ui.colors.neutral",[256,1936,1937],{},[189,1938,191],{},[256,1940,1941],{},[189,1942,1943],{},"'neutral'",[256,1945,1946],{},"Greys every surface and override is built from",[238,1948,1949,1954,1958,1964],{},[256,1950,1951],{},[189,1952,1953],{},"ui.button.defaultVariants",[256,1955,1956],{},[189,1957,191],{},[256,1959,1960,219,1962],{},[189,1961,360],{},[189,1963,364],{},[256,1965,1966,1967,1969],{},"What a bare ",[189,1968,770],{}," looks like",[238,1971,1972,1977,1981,1984],{},[256,1973,1974],{},[189,1975,1976],{},"toaster",[256,1978,1979],{},[189,1980,191],{},[256,1982,1983],{},"bottom right, 3 at most, collapsed, no progress bar",[256,1985,1986,1987],{},"Passed to ",[189,1988,1989],{},"UApp",[238,1991,1992,1997,2001,2006],{},[256,1993,1994],{},[189,1995,1996],{},"--font-sans",[256,1998,1999],{},[189,2000,199],{},[256,2002,2003],{},[189,2004,2005],{},"'Inter'",[256,2007,2008],{},"The app's typeface",[238,2010,2011,2020,2024,2027],{},[256,2012,2013,2016,2017],{},[189,2014,2015],{},"--color-chart-1"," to ",[189,2018,2019],{},"--color-chart-8",[256,2021,2022],{},[189,2023,199],{},[256,2025,2026],{},"blue, orange, aqua, yellow, magenta, green, violet, red",[256,2028,2029],{},"Chart series colours, separate values per theme",[238,2031,2032,2036,2040,2043],{},[256,2033,2034],{},[189,2035,1867],{},[256,2037,2038],{},[189,2039,199],{},[256,2041,2042],{},"the card's colour",[256,2044,2045],{},"Gap between stacked segments",[238,2047,2048,2052,2056,2059],{},[256,2049,2050],{},[189,2051,616],{},[256,2053,2054],{},[189,2055,624],{},[256,2057,2058],{},"Inter 400, 500, 600",[256,2060,2061],{},"Fonts the Open Graph renderer loads",[202,2063,2065],{"id":2064},"good-to-know","Good to know",[1031,2067,2068,2075,2093,2099,2106],{},[1034,2069,2070,2071,2074],{},"Card variants in Nuxt UI's theme are keyed by slot. Give an override an\nobject such as ",[189,2072,2073],{},"{ root: '…' }",". A plain string replaces the variant, and the\ncard loses its ring and the rules between header, body and footer.",[1034,2076,2077,2078,2081,2082,2085,2086,2088,2089,2092],{},"The production build's CSS minifier rewrites an ",[189,2079,2080],{},"animation"," shorthand with a\n",[189,2083,2084],{},"0s"," duration, which breaks scroll-driven animations. Write them in\nlonghands, as ",[189,2087,1555],{}," does, and check the built CSS: ",[189,2090,2091],{},"pnpm dev","\ndoesn't minify.",[1034,2094,2095,2096,2098],{},"A mask hides everything outside an element's border box, the focus outline\nincluded. Put ",[189,2097,1555],{}," on a specific scroller, never on every table.",[1034,2100,2101,2102,2105],{},"The dashboard darkens ",[189,2103,2104],{},"text-muted"," in the light theme so it keeps 4.5:1\ncontrast on the grey grounds. Menus, modals and toasts are teleported outside\nthe dashboard and keep Nuxt UI's value.",[1034,2107,2108,2109,2112],{},"The Open Graph renderer, Takumi, has no ",[189,2110,2111],{},"radial-gradient",". The default\ntemplate draws its glow as a blurred white disc instead.",[2114,2115,2116],"style",{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .sovSZ, html code.shiki .sovSZ{--shiki-light:#22863A;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":376,"searchDepth":17,"depth":17,"links":2118},[2119,2120,2121,2122,2123,2124,2125,2126,2127],{"id":204,"depth":17,"text":205},{"id":368,"depth":17,"text":369},{"id":561,"depth":17,"text":562},{"id":646,"depth":17,"text":647},{"id":1083,"depth":17,"text":1084},{"id":1565,"depth":17,"text":1566},{"id":1704,"depth":17,"text":1705},{"id":1889,"depth":17,"text":20},{"id":2064,"depth":17,"text":2065},[2129,2130],{"path":148,"title":149,"description":150,"navTitle":149,"group":140,"order":151},{"path":162,"title":163,"description":164,"navTitle":163,"group":159,"order":165}]