[{"data":1,"prerenderedAt":963},["ShallowReactive",2],{"docs-nav:en":3,"docs:\u002Fdocs\u002Finfra\u002Fhosts":134},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,42,63,92,113],{"title":10,"path":6,"stem":11},"What is Fougere","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":17,"path":18,"stem":19},"Existing Nuxt app","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":21,"path":22,"stem":23},"The CLI","\u002Fdocs\u002Fcli","docs\u002F03.cli",{"title":25,"path":26,"stem":27,"children":28,"page":41},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[29,33,37],{"title":30,"path":31,"stem":32},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":34,"path":35,"stem":36},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":38,"path":39,"stem":40},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",false,{"title":43,"path":44,"stem":45,"children":46,"page":41},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[47,51,55,59],{"title":48,"path":49,"stem":50},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":52,"path":53,"stem":54},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":56,"path":57,"stem":58},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":60,"path":61,"stem":62},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":64,"path":65,"stem":66,"children":67,"page":41},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[68,72,76,80,84,88],{"title":69,"path":70,"stem":71},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":73,"path":74,"stem":75},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":77,"path":78,"stem":79},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":81,"path":82,"stem":83},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":85,"path":86,"stem":87},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":89,"path":90,"stem":91},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":93,"path":94,"stem":95,"children":96,"page":41},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[97,101,105,109],{"title":98,"path":99,"stem":100},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":102,"path":103,"stem":104},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":106,"path":107,"stem":108},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":110,"path":111,"stem":112},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":114,"path":115,"stem":116,"children":117,"page":41},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[118,122,126,130],{"title":119,"path":120,"stem":121},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":123,"path":124,"stem":125},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":127,"path":128,"stem":129},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":131,"path":132,"stem":133},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"id":135,"title":131,"body":136,"description":958,"extension":959,"meta":960,"navigation":638,"path":132,"seo":961,"stem":133,"__hash__":962},"docs_en\u002Fdocs\u002F6.infra\u002F4.hosts.md",{"type":137,"value":138,"toc":950},"minimark",[139,143,160,167,172,283,304,308,327,435,451,458,461,465,472,478,564,586,598,710,717,722,726,741,762,765,769,776,784,800,845,915,918,924,928,946],[140,141,131],"h1",{"id":142},"hosts",[144,145,146,147,151,152,156,157,159],"p",{},"A ",[148,149,150],"strong",{},"host"," is whatever serves HTTP: Nuxt, Next, TanStack Start, React Router, SvelteKit,\nExpress. A Frond does not know which one it runs under, and nothing in ",[153,154,155],"code",{},"fronds\u002F"," imports\none — the six demos in this repository share a ",[153,158,155],{}," directory that is identical byte\nfor byte.",[144,161,162,163,166],{},"What a host does is mount three doors and, if it renders pages, offer the four client\nprimitives. Everything else — the boot, the judge, the REST table, the form contract —\nlives in ",[153,164,165],{},"@fougere\u002Fapp"," and is the same everywhere.",[168,169,171],"h2",{"id":170},"what-each-host-costs","What each host costs",[173,174,175,191],"table",{},[176,177,178],"thead",{},[179,180,181,185,188],"tr",{},[182,183,184],"th",{},"Host",[182,186,187],{},"Package",[182,189,190],{},"What you write",[192,193,194,211,227,241,253,269],"tbody",{},[179,195,196,200,205],{},[197,198,199],"td",{},"Nuxt",[197,201,202],{},[153,203,204],{},"@fougere\u002Fnuxt",[197,206,207,208],{},"one line in ",[153,209,210],{},"nuxt.config",[179,212,213,216,221],{},[197,214,215],{},"Next",[197,217,218],{},[153,219,220],{},"@fougere\u002Fnext",[197,222,223,224],{},"three one-line route files + ",[153,225,226],{},"withFougere()",[179,228,229,232,238],{},[197,230,231],{},"TanStack Start",[197,233,234],{},[235,236,237],"em",{},"none",[197,239,240],{},"three route files + the Vite plugin",[179,242,243,246,250],{},[197,244,245],{},"React Router",[197,247,248],{},[235,249,237],{},[197,251,252],{},"three resource routes + the Vite plugin",[179,254,255,258,262],{},[197,256,257],{},"SvelteKit",[197,259,260],{},[235,261,237],{},[197,263,264,265,268],{},"three ",[153,266,267],{},"+server.ts"," + the Vite plugin",[179,270,271,274,278],{},[197,272,273],{},"Express",[197,275,276],{},[235,277,237],{},[197,279,280],{},[153,281,282],{},"app.use(fougere())",[144,284,285,286,289,290,293,294,296,297,300,301,303],{},"Three hosts need no package of their own, and that is not an accident: they serve\nWeb-standard ",[153,287,288],{},"Request","\u002F",[153,291,292],{},"Response",", so the doors go in unchanged. ",[153,295,220],{}," exists\nbecause Next has ",[153,298,299],{},"next\u002Fheaders"," — one import — and Nuxt's module is larger because an h3\nevent is not a ",[153,302,288],{},".",[168,305,307],{"id":306},"what-an-app-publishes","What an app publishes",[144,309,310,311,314,315,318,319,322,323,326],{},"Which protocol adapters are served is a fact about the ",[148,312,313],{},"app",", declared once beside\n",[153,316,317],{},"db",", ",[153,320,321],{},"remotes"," and ",[153,324,325],{},"auth",":",[328,329,334],"pre",{"className":330,"code":331,"language":332,"meta":333,"style":333},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F fougere.config.ts\nexport default defineFougere({\n  db: 'sqlite',\n  adapters: { rest: true, graphql: true },\n});\n","ts","",[153,335,336,345,367,390,423],{"__ignoreMap":333},[337,338,341],"span",{"class":339,"line":340},"line",1,[337,342,344],{"class":343},"sutJx","\u002F\u002F fougere.config.ts\n",[337,346,348,352,355,359,363],{"class":339,"line":347},2,[337,349,351],{"class":350},"sVHd0","export",[337,353,354],{"class":350}," default",[337,356,358],{"class":357},"sGLFI"," defineFougere",[337,360,362],{"class":361},"su5hD","(",[337,364,366],{"class":365},"sP7_E","{\n",[337,368,370,374,376,380,384,387],{"class":339,"line":369},3,[337,371,373],{"class":372},"skxfh","  db",[337,375,326],{"class":365},[337,377,379],{"class":378},"sjJ54"," '",[337,381,383],{"class":382},"s_sjI","sqlite",[337,385,386],{"class":378},"'",[337,388,389],{"class":365},",\n",[337,391,393,396,398,401,404,406,410,413,416,418,420],{"class":339,"line":392},4,[337,394,395],{"class":372},"  adapters",[337,397,326],{"class":365},[337,399,400],{"class":365}," {",[337,402,403],{"class":372}," rest",[337,405,326],{"class":365},[337,407,409],{"class":408},"syTEX"," true",[337,411,412],{"class":365},",",[337,414,415],{"class":372}," graphql",[337,417,326],{"class":365},[337,419,409],{"class":408},[337,421,422],{"class":365}," },\n",[337,424,426,429,432],{"class":339,"line":425},5,[337,427,428],{"class":365},"}",[337,430,431],{"class":361},")",[337,433,434],{"class":365},";\n",[144,436,437,440,441,318,444,322,447,450],{},[153,438,439],{},"graphql: true"," is the whole GraphQL setup: the schema is built from the entities the\napp already scanned, so there is no builder to construct and no types to register.\n",[153,442,443],{},"@fougere\u002Fadapter-graphql",[153,445,446],{},"@pothos\u002Fcore",[153,448,449],{},"graphql"," are imported only when you\ndeclare it — an app that serves none does not carry a schema builder to find that out.",[144,452,453,454,457],{},"Absent means not served. The door may be mounted — the route file exists, the\nmiddleware is installed — and it will still decline, because the host does not get to\nmake this decision. ",[153,455,456],{},"serveRest"," reads the declaration itself, so all six hosts inherit\none answer instead of each spelling it their own way.",[144,459,460],{},"The call envelope is not listed there: it is the wire the client primitives use, not a\nprojection an app chooses to publish.",[168,462,464],{"id":463},"mounting-the-doors","Mounting the doors",[144,466,467,468,471],{},"Mounting a door is not the same as publishing an adapter: what you write below puts\nthe door in place, and ",[153,469,470],{},"adapters:"," decides whether it serves anything.",[144,473,474,477],{},[148,475,476],{},"A Web-standard host"," — Next, TanStack Start, React Router, SvelteKit — mounts the\nhandlers directly:",[328,479,481],{"className":330,"code":480,"language":332,"meta":333,"style":333},"\u002F\u002F SvelteKit — src\u002Froutes\u002F_fougere\u002Fcall\u002F+server.ts\nimport { fougereCall } from '@fougere\u002Fapp\u002Fweb';\nexport const POST = ({ request }: { request: Request }) => fougereCall(request);\n",[153,482,483,488,513],{"__ignoreMap":333},[337,484,485],{"class":339,"line":340},[337,486,487],{"class":343},"\u002F\u002F SvelteKit — src\u002Froutes\u002F_fougere\u002Fcall\u002F+server.ts\n",[337,489,490,493,495,498,501,504,506,509,511],{"class":339,"line":347},[337,491,492],{"class":350},"import",[337,494,400],{"class":365},[337,496,497],{"class":361}," fougereCall",[337,499,500],{"class":365}," }",[337,502,503],{"class":350}," from",[337,505,379],{"class":378},[337,507,508],{"class":382},"@fougere\u002Fapp\u002Fweb",[337,510,386],{"class":378},[337,512,434],{"class":365},[337,514,515,517,521,525,529,532,536,538,540,542,545,547,551,554,557,559,562],{"class":339,"line":369},[337,516,351],{"class":350},[337,518,520],{"class":519},"sbsja"," const",[337,522,524],{"class":523},"sfCm-"," POST",[337,526,528],{"class":527},"smGrS"," =",[337,530,531],{"class":365}," ({",[337,533,535],{"class":534},"s99_P"," request",[337,537,500],{"class":365},[337,539,326],{"class":527},[337,541,400],{"class":365},[337,543,535],{"class":544},"sucvu",[337,546,326],{"class":527},[337,548,550],{"class":549},"sbgvK"," Request",[337,552,553],{"class":365}," })",[337,555,556],{"class":519}," =>",[337,558,497],{"class":357},[337,560,561],{"class":361},"(request)",[337,563,434],{"class":365},[144,565,566,318,569,322,572,575,576,578,579,581,582,585],{},[153,567,568],{},"fougereCall",[153,570,571],{},"fougereRest",[153,573,574],{},"fougereSession"," take a ",[153,577,288],{}," and return a\n",[153,580,292],{},". The file you create ",[235,583,584],{},"is"," the consent: no file, no door.",[144,587,588,590,591,594,595,326],{},[148,589,273],{}," adds them as middlewares, like ",[153,592,593],{},"express.json()"," or ",[153,596,597],{},"cors()",[328,599,601],{"className":330,"code":600,"language":332,"meta":333,"style":333},"import { fougere, fougereCall, fougereRest } from '@fougere\u002Fapp\u002Fexpress';\n\napp.use(fougere());                 \u002F\u002F the three doors\napp.use(fougereCall());             \u002F\u002F or one at a time — the envelope serves your\napp.use('\u002Fadmin', fougereRest());   \u002F\u002F pages, REST is public. Not one decision.\n",[153,602,603,634,640,663,682],{"__ignoreMap":333},[337,604,605,607,609,612,614,616,618,621,623,625,627,630,632],{"class":339,"line":340},[337,606,492],{"class":350},[337,608,400],{"class":365},[337,610,611],{"class":361}," fougere",[337,613,412],{"class":365},[337,615,497],{"class":361},[337,617,412],{"class":365},[337,619,620],{"class":361}," fougereRest",[337,622,500],{"class":365},[337,624,503],{"class":350},[337,626,379],{"class":378},[337,628,629],{"class":382},"@fougere\u002Fapp\u002Fexpress",[337,631,386],{"class":378},[337,633,434],{"class":365},[337,635,636],{"class":339,"line":347},[337,637,639],{"emptyLinePlaceholder":638},true,"\n",[337,641,642,644,646,649,651,654,657,660],{"class":339,"line":369},[337,643,313],{"class":361},[337,645,303],{"class":365},[337,647,648],{"class":357},"use",[337,650,362],{"class":361},[337,652,653],{"class":357},"fougere",[337,655,656],{"class":361},"())",[337,658,659],{"class":365},";",[337,661,662],{"class":343},"                 \u002F\u002F the three doors\n",[337,664,665,667,669,671,673,675,677,679],{"class":339,"line":392},[337,666,313],{"class":361},[337,668,303],{"class":365},[337,670,648],{"class":357},[337,672,362],{"class":361},[337,674,568],{"class":357},[337,676,656],{"class":361},[337,678,659],{"class":365},[337,680,681],{"class":343},"             \u002F\u002F or one at a time — the envelope serves your\n",[337,683,684,686,688,690,692,694,697,699,701,703,705,707],{"class":339,"line":425},[337,685,313],{"class":361},[337,687,303],{"class":365},[337,689,648],{"class":357},[337,691,362],{"class":361},[337,693,386],{"class":378},[337,695,696],{"class":382},"\u002Fadmin",[337,698,386],{"class":378},[337,700,412],{"class":365},[337,702,620],{"class":357},[337,704,656],{"class":361},[337,706,659],{"class":365},[337,708,709],{"class":343},"   \u002F\u002F pages, REST is public. Not one decision.\n",[144,711,712,713,716],{},"A path Fougere does not serve calls ",[153,714,715],{},"next()",", so an app's own routes keep answering\nwhether they were registered before or after.",[144,718,719,721],{},[148,720,199],{}," mounts them itself — its module has an API for that, and adds the composables\nat the same time.",[168,723,725],{"id":724},"the-client-primitives","The client primitives",[144,727,728,318,731,318,734,322,737,740],{},[153,729,730],{},"useQuery",[153,732,733],{},"useCommand",[153,735,736],{},"useFormFor",[153,738,739],{},"useCurrentUser"," exist per UI framework, not\nper host:",[742,743,744,751,757],"ul",{},[745,746,747,750],"li",{},[153,748,749],{},"@fougere\u002Freact"," — React, whatever renders it",[745,752,753,756],{},[153,754,755],{},"@fougere\u002Fsvelte"," — Svelte, as stores",[745,758,759,761],{},[153,760,204],{}," — Vue, through Nuxt's own data layer",[144,763,764],{},"The rules they obey are shared: designation is class + verb, and a command on an entity\nrevalidates every mounted query on that entity. Only the state model differs.",[168,766,768],{"id":767},"the-one-thing-every-bundler-must-be-told","The one thing every bundler must be told",[144,770,771,772,775],{},"Designation reads the entity's class name, and that name travels — it is the JSON-RPC\nmethod (",[153,773,774],{},"post.list",") and the REST path. A minifier renames classes, so a production build\nwould designate an entity nobody hosts:",[328,777,782],{"className":778,"code":780,"language":781},[779],"language-text","Entity 'j' is not hosted here. Hosted here: post.\n","text",[153,783,780],{"__ignoreMap":333},[144,785,786,787,322,789,792,793,796,797,799],{},"You do not have to declare anything for this. ",[153,788,204],{},[153,790,791],{},"@fougere\u002Fvite"," reserve\nthe entity names for you — the first from the scan it just ran, the second by reading\n",[153,794,795],{},"fronds\u002F\u003Cfrond>\u002Fentities\u002F",". On Next, ",[153,798,226],{}," does the same through webpack:",[328,801,803],{"className":330,"code":802,"language":332,"meta":333,"style":333},"\u002F\u002F next.config.mjs\nimport { withFougere } from '@fougere\u002Fnext\u002Fconfig';\nexport default withFougere();\n",[153,804,805,810,832],{"__ignoreMap":333},[337,806,807],{"class":339,"line":340},[337,808,809],{"class":343},"\u002F\u002F next.config.mjs\n",[337,811,812,814,816,819,821,823,825,828,830],{"class":339,"line":347},[337,813,492],{"class":350},[337,815,400],{"class":365},[337,817,818],{"class":361}," withFougere",[337,820,500],{"class":365},[337,822,503],{"class":350},[337,824,379],{"class":378},[337,826,827],{"class":382},"@fougere\u002Fnext\u002Fconfig",[337,829,386],{"class":378},[337,831,434],{"class":365},[337,833,834,836,838,840,843],{"class":339,"line":369},[337,835,351],{"class":350},[337,837,354],{"class":350},[337,839,818],{"class":357},[337,841,842],{"class":361},"()",[337,844,434],{"class":365},[328,846,848],{"className":330,"code":847,"language":332,"meta":333,"style":333},"\u002F\u002F vite.config.ts — TanStack Start, React Router, SvelteKit\nimport { fougere } from '@fougere\u002Fvite';\nexport default defineConfig({ plugins: [fougere(), sveltekit()] });\n",[153,849,850,855,875],{"__ignoreMap":333},[337,851,852],{"class":339,"line":340},[337,853,854],{"class":343},"\u002F\u002F vite.config.ts — TanStack Start, React Router, SvelteKit\n",[337,856,857,859,861,863,865,867,869,871,873],{"class":339,"line":347},[337,858,492],{"class":350},[337,860,400],{"class":365},[337,862,611],{"class":361},[337,864,500],{"class":365},[337,866,503],{"class":350},[337,868,379],{"class":378},[337,870,791],{"class":382},[337,872,386],{"class":378},[337,874,434],{"class":365},[337,876,877,879,881,884,886,889,892,894,897,899,901,903,906,909,911,913],{"class":339,"line":369},[337,878,351],{"class":350},[337,880,354],{"class":350},[337,882,883],{"class":357}," defineConfig",[337,885,362],{"class":361},[337,887,888],{"class":365},"{",[337,890,891],{"class":372}," plugins",[337,893,326],{"class":365},[337,895,896],{"class":361}," [",[337,898,653],{"class":357},[337,900,842],{"class":361},[337,902,412],{"class":365},[337,904,905],{"class":357}," sveltekit",[337,907,908],{"class":361},"()] ",[337,910,428],{"class":365},[337,912,431],{"class":361},[337,914,434],{"class":365},[144,916,917],{},"Express needs none of this: it runs your sources, nothing is minified.",[919,920,921],"callout",{},[144,922,923],{},"An app that minifies without one of these will build cleanly and fail on the first call.\nThe failure is loud — the server says which entity it does host — but it happens in\nproduction, not at build time.",[168,925,927],{"id":926},"two-hosts-at-once","Two hosts at once",[144,929,930,931,934,935,938,939,945],{},"Nothing stops a Frond from being served by more than one host: run it in its own process\nwith ",[153,932,933],{},"serve()"," and let the others reach it through ",[153,936,937],{},"remotes:",". That is the\n",[235,940,941],{},[942,943,944],"a",{"href":120},"gradient",", and the host is not part of the decision.",[947,948,949],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":333,"searchDepth":347,"depth":347,"links":951},[952,953,954,955,956,957],{"id":170,"depth":347,"text":171},{"id":306,"depth":347,"text":307},{"id":463,"depth":347,"text":464},{"id":724,"depth":347,"text":725},{"id":767,"depth":347,"text":768},{"id":926,"depth":347,"text":927},"Run the same Frond under Nuxt, Next, TanStack Start, React Router, SvelteKit or Express.","md",{},{"title":131,"description":958},"jJ3Gx_k1jPrLIChxS8wxwsk99RoxfAK7A8OS5gtrgRw",1786637819537]