[{"data":1,"prerenderedAt":639},["ShallowReactive",2],{"docs:doc:\u002Fen\u002Fdocs\u002Freference\u002Fcode-highlighting":3,"docs:pages:docs_en":568},{"id":4,"title":5,"alt":6,"body":7,"description":559,"extension":560,"key":561,"meta":562,"navigation":211,"order":563,"path":564,"placeholder":211,"seo":565,"stem":566,"__hash__":567},"docs_en\u002Fen\u002Fdocs\u002Freference\u002Fcode-highlighting.md","Code highlighting","\u002Fpl\u002Fdocs\u002Freferencje\u002Fpodswietlanie",{"type":8,"value":9,"toc":547},"minimark",[10,23,26,31,94,98,143,147,183,187,261,265,314,318,337,341,364,368,396,400,501,505,543],[11,12,13,14,18,19,22],"p",{},"This page is a fixture. It carries exactly one fence per language listed in\n",[15,16,17],"code",{},"shiki-languages.json",", and ",[15,20,21],{},"scripts\u002Fcheck-generated-docs.mjs"," asserts that each\none came out of the build with colour spans in it.",[11,24,25],{},"That assertion is the point. A grammar Shiki has not preloaded does not fail the\nbuild, does not warn, and does not throw: the fence renders as plain, unstyled\ntext. Nothing but an assertion over the generated HTML catches it.",[27,28,30],"h2",{"id":29},"typescript","TypeScript",[32,33,38],"pre",{"className":34,"code":35,"language":36,"meta":37,"style":37},"language-ts shiki shiki-themes github-light","export interface Session {\n  readonly id: string\n  expiresAt: Date\n}\n","ts","",[15,39,40,60,77,88],{"__ignoreMap":37},[41,42,45,49,52,56],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sD7c4","export",[41,50,51],{"class":47}," interface",[41,53,55],{"class":54},"s7eDp"," Session",[41,57,59],{"class":58},"sgsFI"," {\n",[41,61,63,66,70,73],{"class":43,"line":62},2,[41,64,65],{"class":47},"  readonly",[41,67,69],{"class":68},"sqxcx"," id",[41,71,72],{"class":47},":",[41,74,76],{"class":75},"sYu0t"," string\n",[41,78,80,83,85],{"class":43,"line":79},3,[41,81,82],{"class":68},"  expiresAt",[41,84,72],{"class":47},[41,86,87],{"class":54}," Date\n",[41,89,91],{"class":43,"line":90},4,[41,92,93],{"class":58},"}\n",[27,95,97],{"id":96},"tsx","TSX",[32,99,102],{"className":100,"code":101,"language":96,"meta":37,"style":37},"language-tsx shiki shiki-themes github-light","export default function Callback() {\n  return \u003Cp>Signing you in…\u003C\u002Fp>\n}\n",[15,103,104,120,139],{"__ignoreMap":37},[41,105,106,108,111,114,117],{"class":43,"line":44},[41,107,48],{"class":47},[41,109,110],{"class":47}," default",[41,112,113],{"class":47}," function",[41,115,116],{"class":54}," Callback",[41,118,119],{"class":58},"() {\n",[41,121,122,125,128,131,134,136],{"class":43,"line":62},[41,123,124],{"class":47},"  return",[41,126,127],{"class":58}," \u003C",[41,129,11],{"class":130},"shJU0",[41,132,133],{"class":58},">Signing you in…\u003C\u002F",[41,135,11],{"class":130},[41,137,138],{"class":58},">\n",[41,140,141],{"class":43,"line":79},[41,142,93],{"class":58},[27,144,146],{"id":145},"javascript","JavaScript",[32,148,152],{"className":149,"code":150,"language":151,"meta":37,"style":37},"language-js shiki shiki-themes github-light","export const issuer = new URL('https:\u002F\u002Fid.example.com')\n","js",[15,153,154],{"__ignoreMap":37},[41,155,156,158,161,164,167,170,173,176,180],{"class":43,"line":44},[41,157,48],{"class":47},[41,159,160],{"class":47}," const",[41,162,163],{"class":75}," issuer",[41,165,166],{"class":47}," =",[41,168,169],{"class":47}," new",[41,171,172],{"class":54}," URL",[41,174,175],{"class":58},"(",[41,177,179],{"class":178},"sYBdl","'https:\u002F\u002Fid.example.com'",[41,181,182],{"class":58},")\n",[27,184,186],{"id":185},"python","Python",[32,188,191],{"className":189,"code":190,"language":185,"meta":37,"style":37},"language-python shiki shiki-themes github-light","from datetime import datetime\n\n\ndef expired(session: dict) -> bool:\n    return session[\"expires_at\"] \u003C datetime.now()\n",[15,192,193,207,213,217,240],{"__ignoreMap":37},[41,194,195,198,201,204],{"class":43,"line":44},[41,196,197],{"class":47},"from",[41,199,200],{"class":58}," datetime ",[41,202,203],{"class":47},"import",[41,205,206],{"class":58}," datetime\n",[41,208,209],{"class":43,"line":62},[41,210,212],{"emptyLinePlaceholder":211},true,"\n",[41,214,215],{"class":43,"line":79},[41,216,212],{"emptyLinePlaceholder":211},[41,218,219,222,225,228,231,234,237],{"class":43,"line":90},[41,220,221],{"class":47},"def",[41,223,224],{"class":54}," expired",[41,226,227],{"class":58},"(session: ",[41,229,230],{"class":75},"dict",[41,232,233],{"class":58},") -> ",[41,235,236],{"class":75},"bool",[41,238,239],{"class":58},":\n",[41,241,243,246,249,252,255,258],{"class":43,"line":242},5,[41,244,245],{"class":47},"    return",[41,247,248],{"class":58}," session[",[41,250,251],{"class":178},"\"expires_at\"",[41,253,254],{"class":58},"] ",[41,256,257],{"class":47},"\u003C",[41,259,260],{"class":58}," datetime.now()\n",[27,262,264],{"id":263},"json","JSON",[32,266,269],{"className":267,"code":268,"language":263,"meta":37,"style":37},"language-json shiki shiki-themes github-light","{\n  \"issuer\": \"https:\u002F\u002Fid.example.com\",\n  \"scopes_supported\": [\"openid\", \"profile\"]\n}\n",[15,270,271,276,290,310],{"__ignoreMap":37},[41,272,273],{"class":43,"line":44},[41,274,275],{"class":58},"{\n",[41,277,278,281,284,287],{"class":43,"line":62},[41,279,280],{"class":75},"  \"issuer\"",[41,282,283],{"class":58},": ",[41,285,286],{"class":178},"\"https:\u002F\u002Fid.example.com\"",[41,288,289],{"class":58},",\n",[41,291,292,295,298,301,304,307],{"class":43,"line":79},[41,293,294],{"class":75},"  \"scopes_supported\"",[41,296,297],{"class":58},": [",[41,299,300],{"class":178},"\"openid\"",[41,302,303],{"class":58},", ",[41,305,306],{"class":178},"\"profile\"",[41,308,309],{"class":58},"]\n",[41,311,312],{"class":43,"line":90},[41,313,93],{"class":58},[27,315,317],{"id":316},"bash","Bash",[32,319,322],{"className":320,"code":321,"language":316,"meta":37,"style":37},"language-bash shiki shiki-themes github-light","export KLEORA_ISSUER=\"https:\u002F\u002Fid.example.com\"\n",[15,323,324],{"__ignoreMap":37},[41,325,326,328,331,334],{"class":43,"line":44},[41,327,48],{"class":47},[41,329,330],{"class":58}," KLEORA_ISSUER",[41,332,333],{"class":47},"=",[41,335,336],{"class":178},"\"https:\u002F\u002Fid.example.com\"\n",[27,338,340],{"id":339},"shell","Shell",[32,342,345],{"className":343,"code":344,"language":339,"meta":37,"style":37},"language-shell shiki shiki-themes github-light","curl -fsS \"$KLEORA_ISSUER\u002F.well-known\u002Fopenid-configuration\"\n",[15,346,347],{"__ignoreMap":37},[41,348,349,352,355,358,361],{"class":43,"line":44},[41,350,351],{"class":54},"curl",[41,353,354],{"class":75}," -fsS",[41,356,357],{"class":178}," \"",[41,359,360],{"class":58},"$KLEORA_ISSUER",[41,362,363],{"class":178},"\u002F.well-known\u002Fopenid-configuration\"\n",[27,365,367],{"id":366},"html","HTML",[32,369,372],{"className":370,"code":371,"language":366,"meta":37,"style":37},"language-html shiki shiki-themes github-light","\u003Ca href=\"\u002Fen\u002Fdocs\">Documentation\u003C\u002Fa>\n",[15,373,374],{"__ignoreMap":37},[41,375,376,378,381,384,386,389,392,394],{"class":43,"line":44},[41,377,257],{"class":58},[41,379,380],{"class":130},"a",[41,382,383],{"class":54}," href",[41,385,333],{"class":58},[41,387,388],{"class":178},"\"\u002Fen\u002Fdocs\"",[41,390,391],{"class":58},">Documentation\u003C\u002F",[41,393,380],{"class":130},[41,395,138],{"class":58},[27,397,399],{"id":398},"vue","Vue",[32,401,404],{"className":402,"code":403,"language":398,"meta":37,"style":37},"language-vue shiki shiki-themes github-light","\u003Cscript setup lang=\"ts\">\nconst { data } = await useFetch('\u002Fapi\u002Fsession')\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cp>{{ data?.id }}\u003C\u002Fp>\n\u003C\u002Ftemplate>\n",[15,405,406,426,455,464,468,477,492],{"__ignoreMap":37},[41,407,408,410,413,416,419,421,424],{"class":43,"line":44},[41,409,257],{"class":58},[41,411,412],{"class":130},"script",[41,414,415],{"class":54}," setup",[41,417,418],{"class":54}," lang",[41,420,333],{"class":58},[41,422,423],{"class":178},"\"ts\"",[41,425,138],{"class":58},[41,427,428,431,434,437,440,442,445,448,450,453],{"class":43,"line":62},[41,429,430],{"class":47},"const",[41,432,433],{"class":58}," { ",[41,435,436],{"class":75},"data",[41,438,439],{"class":58}," } ",[41,441,333],{"class":47},[41,443,444],{"class":47}," await",[41,446,447],{"class":54}," useFetch",[41,449,175],{"class":58},[41,451,452],{"class":178},"'\u002Fapi\u002Fsession'",[41,454,182],{"class":58},[41,456,457,460,462],{"class":43,"line":79},[41,458,459],{"class":58},"\u003C\u002F",[41,461,412],{"class":130},[41,463,138],{"class":58},[41,465,466],{"class":43,"line":90},[41,467,212],{"emptyLinePlaceholder":211},[41,469,470,472,475],{"class":43,"line":242},[41,471,257],{"class":58},[41,473,474],{"class":130},"template",[41,476,138],{"class":58},[41,478,480,483,485,488,490],{"class":43,"line":479},6,[41,481,482],{"class":58},"  \u003C",[41,484,11],{"class":130},[41,486,487],{"class":58},">{{ data?.id }}\u003C\u002F",[41,489,11],{"class":130},[41,491,138],{"class":58},[41,493,495,497,499],{"class":43,"line":494},7,[41,496,459],{"class":58},[41,498,474],{"class":130},[41,500,138],{"class":58},[27,502,504],{"id":503},"yaml","YAML",[32,506,509],{"className":507,"code":508,"language":503,"meta":37,"style":37},"language-yaml shiki shiki-themes github-light","issuer: https:\u002F\u002Fid.example.com\nscopes:\n  - openid\n  - profile\n",[15,510,511,521,528,536],{"__ignoreMap":37},[41,512,513,516,518],{"class":43,"line":44},[41,514,515],{"class":130},"issuer",[41,517,283],{"class":58},[41,519,520],{"class":178},"https:\u002F\u002Fid.example.com\n",[41,522,523,526],{"class":43,"line":62},[41,524,525],{"class":130},"scopes",[41,527,239],{"class":58},[41,529,530,533],{"class":43,"line":79},[41,531,532],{"class":58},"  - ",[41,534,535],{"class":178},"openid\n",[41,537,538,540],{"class":43,"line":90},[41,539,532],{"class":58},[41,541,542],{"class":178},"profile\n",[544,545,546],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":37,"searchDepth":79,"depth":79,"links":548},[549,550,551,552,553,554,555,556,557,558],{"id":29,"depth":62,"text":30},{"id":96,"depth":62,"text":97},{"id":145,"depth":62,"text":146},{"id":185,"depth":62,"text":186},{"id":263,"depth":62,"text":264},{"id":316,"depth":62,"text":317},{"id":339,"depth":62,"text":340},{"id":366,"depth":62,"text":367},{"id":398,"depth":62,"text":399},{"id":503,"depth":62,"text":504},"One fence per preloaded Shiki grammar — a fixture, not a reference page.","md","reference\u002Fcode-highlighting",{},10,"\u002Fen\u002Fdocs\u002Freference\u002Fcode-highlighting",{"title":5,"description":559},"en\u002Fdocs\u002Freference\u002Fcode-highlighting","WUClPfmA1-Gq2WUIVYWM29l7nq-YYu-YXKd2Hdg7gUI",[569,574,580,585,591,596,601,606,612,617,622,627,633,634],{"path":570,"title":571,"description":572,"order":563,"key":573},"\u002Fen\u002Fdocs\u002Fgetting-started","Getting started","From an empty project to a working sign-in, and the packages that get you there.","getting-started\u002Findex",{"path":575,"title":576,"description":577,"order":578,"key":579},"\u002Fen\u002Fdocs\u002Fgetting-started\u002Finstallation","Installing an SDK","The five packages we publish, what each one is for, and the configuration each one takes.",20,"getting-started\u002Finstallation",{"path":581,"title":582,"description":583,"order":563,"key":584},"\u002Fen\u002Fdocs\u002Fgetting-started\u002Fquickstart","Quickstart","Create an App, wire up the browser SDK, and sign in for the first time — entirely in sandbox.","getting-started\u002Fquickstart",{"path":586,"title":587,"description":588,"order":589,"key":590},"\u002Fen\u002Fdocs\u002Fguides\u002Farchitecture","How Kleora is put together","The shape of the hosted service — one address per environment, two API surfaces, and where state lives. And why self-hosting is not something we support today.",30,"guides\u002Farchitecture",{"path":592,"title":593,"description":594,"order":578,"key":595},"\u002Fen\u002Fdocs\u002Fguides\u002Fconcepts","Workspaces, roles and environments","The five words the product is built from, which of them your tokens carry, and how a change to a role reaches a running application.","guides\u002Fconcepts",{"path":597,"title":598,"description":599,"order":578,"key":600},"\u002Fen\u002Fdocs\u002Fguides","Guides","Wiring Kleora into your stack, the words the product uses, and how the hosted service is put together.","guides\u002Findex",{"path":602,"title":603,"description":604,"order":563,"key":605},"\u002Fen\u002Fdocs\u002Fguides\u002Fquickstarts\u002Fbrowser","Plain browser","One client instance, one callback route, and an access token for every request your application makes.","guides\u002Fquickstarts\u002Fbrowser",{"path":607,"title":608,"description":609,"order":610,"key":611},"\u002Fen\u002Fdocs\u002Fguides\u002Fquickstarts\u002Fexpress","Express","Verifying the access token on your own API — middleware, permissions, and the three answers a refusal can have.",40,"guides\u002Fquickstarts\u002Fexpress",{"path":613,"title":614,"description":615,"order":563,"key":616},"\u002Fen\u002Fdocs\u002Fguides\u002Fquickstarts","Framework quickstarts","One page per stack — Next.js, Nuxt, Express and the plain browser — and the two redirect URIs all of them share.","guides\u002Fquickstarts\u002Findex",{"path":618,"title":619,"description":620,"order":578,"key":621},"\u002Fen\u002Fdocs\u002Fguides\u002Fquickstarts\u002Fnextjs","Next.js","The browser SDK in an App Router application — a lazy client, a callback route, and token verification in a route handler.","guides\u002Fquickstarts\u002Fnextjs",{"path":623,"title":624,"description":625,"order":589,"key":626},"\u002Fen\u002Fdocs\u002Fguides\u002Fquickstarts\u002Fnuxt","Nuxt","The Nuxt module — two lines of config, a callback page you do not write, and a route middleware that protects a page from its own meta.","guides\u002Fquickstarts\u002Fnuxt",{"path":628,"title":629,"description":630,"order":631,"key":632},"\u002Fen\u002Fdocs","Kleora documentation","Add hosted sign-in to your application, verify the token on your API, and manage users, workspaces and roles from one console.",0,"index",{"path":564,"title":5,"description":559,"order":563,"key":561},{"path":635,"title":636,"description":637,"order":589,"key":638},"\u002Fen\u002Fdocs\u002Freference","Reference","Reference material for the HTTP APIs and the SDK packages.","reference\u002Findex",1790698197586]