[{"data":1,"prerenderedAt":388},["ShallowReactive",2],{"docs:page:\u002Fen\u002Fdocs\u002Fconcepts\u002Fpublic-web":3,"docs:navigation:en":294,"docs:section-descriptions:\u002Fen\u002Fdocs\u002Fconcepts\u002Fpublic-web":382,"docs:translations:\u002Fen\u002Fdocs\u002Fconcepts\u002Fpublic-web":383,"docs:surroundings:\u002Fen\u002Fdocs\u002Fconcepts\u002Fpublic-web":385},{"id":4,"title":5,"body":6,"description":286,"extension":287,"meta":288,"navigation":289,"path":290,"seo":291,"stem":292,"__hash__":293},"docs\u002Fen\u002Fdocs\u002F2.concepts\u002Fpublic-web.md","Public Web",{"type":7,"value":8,"toc":278},"minimark",[9,13,22,32,39,44,113,117,176,180,187,193,197,218,222,229,261,264,267],[10,11,5],"h1",{"id":12},"public-web",[14,15,16,17,21],"p",{},"The public surface of ",[18,19,20],"code",{},"ecoma.io"," follows one strict URL model:",[23,24,30],"pre",{"className":25,"code":27,"language":28,"meta":29},[26],"language-text","\u002F\u003Clocale>\u002F\u003Cmount>\u002F\u003Cpath>\n","text","",[18,31,27],{"__ignoreMap":29},[14,33,34],{},[35,36],"img",{"alt":37,"src":38},"Anatomy of a public web URL: the three segments \u002Flocale, \u002Fmount and \u002Fpath, with the examples \u002Fen\u002Fdocs\u002Fgetting-started and \u002Fvi\u002Fdocs\u002Fgetting-started","\u002Fen\u002Fdocs\u002Fconcepts\u002Fpublic-web-url.svg",[40,41,43],"h2",{"id":42},"the-three-segments","The three segments",[45,46,47,71,107],"ul",{},[48,49,50,54,55,58,59,62,63,66,67,70],"li",{},[51,52,53],"strong",{},"locale"," — the first segment, always present. Supported locales live in the\nlocale registry (",[18,56,57],{},"PUBLIC_LOCALES"," in ",[18,60,61],{},"app\u002Fi18n","). English is\n",[18,64,65],{},"\u002Fen\u002F...",", Vietnamese is ",[18,68,69],{},"\u002Fvi\u002F...","; there is no unprefixed variant.",[48,72,73,76,77,80,81,84,85,88,89,92,93,96,97,99,100,103,104,106],{},[51,74,75],{},"mount"," — the public application. Currently registered mounts in\n",[18,78,79],{},"app\u002Flayout"," are ",[18,82,83],{},"blog",", ",[18,86,87],{},"docs"," and ",[18,90,91],{},"docs\u002Fapi",". A mount matches on a\nfull segment boundary: ",[18,94,95],{},"\u002Fen\u002Fdocs"," is ",[18,98,87],{},", while ",[18,101,102],{},"\u002Fen\u002Fblogging"," is not\n",[18,105,83],{},".",[48,108,109,112],{},[51,110,111],{},"path"," — everything after the mount. It is opaque to the platform; the\napplication that owns the mount decides whether the resource exists.",[40,114,116],{"id":115},"examples","Examples",[118,119,120,133],"table",{},[121,122,123],"thead",{},[124,125,126,130],"tr",{},[127,128,129],"th",{},"URL",[127,131,132],{},"Meaning",[134,135,136,147,156,166],"tbody",{},[124,137,138,144],{},[139,140,141],"td",{},[18,142,143],{},"\u002Fen",[139,145,146],{},"English locale root",[124,148,149,153],{},[139,150,151],{},[18,152,95],{},[139,154,155],{},"English docs, docs root",[124,157,158,163],{},[139,159,160],{},[18,161,162],{},"\u002Fen\u002Fdocs\u002Fgetting-started",[139,164,165],{},"English docs, Getting Started",[124,167,168,173],{},[139,169,170],{},[18,171,172],{},"\u002Fvi\u002Fdocs\u002Fgetting-started\u002Finstallation",[139,174,175],{},"Vietnamese docs, Installation page",[40,177,179],{"id":178},"parsing-is-strict","Parsing is strict",[14,181,182,183,186],{},"Paths are ",[51,184,185],{},"not"," normalized or repaired. A trailing slash, an empty segment,\nor an unsupported locale are rejected with a typed reason rather than being\nsilently fixed:",[23,188,191],{"className":189,"code":190,"language":28,"meta":29},[26],"\u002Fen        → localized (en)\n\u002FEN\u002Fdocs   → invalid (unsupported_locale)\n\u002Fen\u002Fdocs\u002F  → invalid (trailing_slash)\n\u002Fen\u002F\u002Fdocs  → invalid (empty_segment)\n",[18,192,190],{"__ignoreMap":29},[40,194,196],{"id":195},"boundaries","Boundaries",[45,198,199,205],{},[48,200,201,204],{},[18,202,203],{},"\u002F"," is a locale-resolution entry point. It never serves content and never\nredirects to an unprefixed path on its own; the caller decides the policy.",[48,206,207,209,210,213,214,217],{},[18,208,91],{}," is a nested mount reserved for the ",[18,211,212],{},"api-reference"," surface. The\nhome application does not serve it — a request for ",[18,215,216],{},"\u002Fen\u002Fdocs\u002Fapi"," is rejected\nbefore content lookup.",[40,219,221],{"id":220},"where-the-model-lives","Where the model lives",[14,223,224,225,228],{},"The URL model is not a convention that each page re-follows — it is enforced in\ntwo small modules of ",[18,226,227],{},"apps\u002Fhome"," that every public surface goes through:",[45,230,231,243],{},[48,232,233,235,236,239,240,242],{},[18,234,61],{}," owns the ",[51,237,238],{},"locale dimension",": the ",[18,241,57],{}," registry,\nparsing the first segment and locale switching. It knows nothing about mounts\nor applications.",[48,244,245,235,247,239,250,253,254,84,256,84,258,260],{},[18,246,79],{},[51,248,249],{},"mount topology",[18,251,252],{},"PUBLIC_MOUNTS"," registry\n(",[18,255,83],{},[18,257,87],{},[18,259,91],{},"), matching a pathname to a mount and building\nlinks back.",[14,262,263],{},"Adding a locale or a mount means adding one entry to the corresponding\nregistry; the rest of the platform derives from that data.",[265,266],"hr",{},[14,268,269],{},[270,271,272,273],"em",{},"Next: ",[274,275,277],"a",{"href":276},"\u002Fen\u002Fdocs\u002Fconcepts\u002Fcontent-and-locales","Content and Locales",{"title":29,"searchDepth":279,"depth":279,"links":280},2,[281,282,283,284,285],{"id":42,"depth":279,"text":43},{"id":115,"depth":279,"text":116},{"id":178,"depth":279,"text":179},{"id":195,"depth":279,"text":196},{"id":220,"depth":279,"text":221},"The public URL model — \u002F\u003Clocale>\u002F\u003Cmount>\u002F\u003Cpath> — and how the platform parses and builds it.","md",{},true,"\u002Fen\u002Fdocs\u002Fconcepts\u002Fpublic-web",{"title":5,"description":286},"en\u002Fdocs\u002F2.concepts\u002Fpublic-web","c70rk8j80UEmO6EsrQf-XKQbyZMgKg5eBT61wBmL6uU",[295],{"title":296,"path":143,"stem":297,"children":298,"page":340},"En","en",[299,341],{"title":300,"path":301,"stem":302,"children":303,"page":340},"Blog","\u002Fen\u002Fblog","en\u002Fblog",[304,310,316,322,328,334],{"title":305,"path":306,"stem":307,"children":308},"One URL model for every public page","\u002Fen\u002Fblog\u002Furl-model","en\u002Fblog\u002F1.url-model\u002Findex",[309],{"title":305,"path":306,"stem":307},{"title":311,"path":312,"stem":313,"children":314},"Content is resolved at build time","\u002Fen\u002Fblog\u002Fbuild-time-content","en\u002Fblog\u002F2.build-time-content\u002Findex",[315],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319,"children":320},"Locale switching that never lies","\u002Fen\u002Fblog\u002Flocale-switching","en\u002Fblog\u002F3.locale-switching\u002Findex",[321],{"title":317,"path":318,"stem":319},{"title":323,"path":324,"stem":325,"children":326},"Deploying a blog as static assets","\u002Fen\u002Fblog\u002Fstatic-deployment","en\u002Fblog\u002F4.static-deployment\u002Findex",[327],{"title":323,"path":324,"stem":325},{"title":329,"path":330,"stem":331,"children":332},"A reading page is not a documentation page","\u002Fen\u002Fblog\u002Freading-first-design","en\u002Fblog\u002F5.reading-first-design\u002Findex",[333],{"title":329,"path":330,"stem":331},{"title":335,"path":336,"stem":337,"children":338},"What this blog is (and is not)","\u002Fen\u002Fblog\u002Fdemo-content-note","en\u002Fblog\u002F6.demo-content-note\u002Findex",[339],{"title":335,"path":336,"stem":337},false,{"title":342,"path":95,"stem":343,"children":344},"Overview","en\u002Fdocs\u002Findex",[345,346,359,368],{"title":342,"path":95,"stem":343},{"title":347,"path":162,"stem":348,"children":349},"Getting Started","en\u002Fdocs\u002F1.getting-started\u002Findex",[350,351,355],{"title":347,"path":162,"stem":348},{"title":352,"path":353,"stem":354},"First Steps","\u002Fen\u002Fdocs\u002Fgetting-started\u002Ffirst-steps","en\u002Fdocs\u002F1.getting-started\u002Ffirst-steps",{"title":356,"path":357,"stem":358},"Installation","\u002Fen\u002Fdocs\u002Fgetting-started\u002Finstallation","en\u002Fdocs\u002F1.getting-started\u002Finstallation",{"title":360,"path":361,"stem":362,"children":363},"Concepts","\u002Fen\u002Fdocs\u002Fconcepts","en\u002Fdocs\u002F2.concepts\u002Findex",[364,365,367],{"title":360,"path":361,"stem":362},{"title":277,"path":276,"stem":366},"en\u002Fdocs\u002F2.concepts\u002Fcontent-and-locales",{"title":5,"path":290,"stem":292},{"title":369,"path":370,"stem":371,"children":372},"Guides","\u002Fen\u002Fdocs\u002Fguides","en\u002Fdocs\u002F3.guides\u002Findex",[373,374,378],{"title":369,"path":370,"stem":371},{"title":375,"path":376,"stem":377},"Building a Public Page","\u002Fen\u002Fdocs\u002Fguides\u002Fbuilding-a-public-page","en\u002Fdocs\u002F3.guides\u002Fbuilding-a-public-page",{"title":379,"path":380,"stem":381},"Local Development","\u002Fen\u002Fdocs\u002Fguides\u002Flocal-development","en\u002Fdocs\u002F3.guides\u002Flocal-development",{},[297,384],"vi",[386,387],{"title":277,"path":276,"stem":366,"children":-1},{"title":369,"path":370,"stem":371,"children":-1},1791809693960]