[{"data":1,"prerenderedAt":846},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Ftheme":3},{"id":4,"title":5,"body":6,"description":15,"extension":840,"meta":841,"navigation":92,"path":842,"seo":843,"stem":844,"__hash__":845},"docs\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Ftheme.md","theme",{"type":7,"value":8,"toc":834},"minimark",[9,12,16,366,369,374,496,514,525,529,624,633,637,796,803,807,830],[10,11,5],"h1",{"id":5},[13,14,15],"p",{},"Colours. Seven tokens, closed on purpose — every surface derives from these, which is what\nmakes a theme portable.",[17,18,23],"pre",{"className":19,"code":20,"language":21,"meta":22,"style":22},"language-ts shiki shiki-themes dark-plus","interface ThemeApi {\n    \u002F\u002F Register a theme. Throws if the name is taken.\n    create(name: string, tokens: ThemeTokens): Disposer\n\n    \u002F\u002F Paint one and keep it (persisted). Throws on an unknown name.\n    set(name: string): void\n\n    \u002F\u002F Every registered theme, built-ins first.\n    list(): readonly Theme[]\n\n    \u002F\u002F The theme currently painted.\n    readonly active: Theme\n}\n\ntype ThemeTokens = {\n    primary: ThemeColor      \u002F\u002F accent: selection, input rule, focused rows, links\n    background: ThemeColor   \u002F\u002F the terminal's ground\n    text: ThemeColor         \u002F\u002F ordinary foreground\n    dim: ThemeColor          \u002F\u002F paths, descriptions, timestamps\n    warn: ThemeColor         \u002F\u002F needs attention, nothing failed\n    error: ThemeColor        \u002F\u002F something failed\n    syntax: BundledSyntax | Record\u003Cstring, unknown>\n}\n\ntype Theme = ThemeTokens & { name: string }\ntype ThemeColor = ColorName | \"transparent\" | (string & {})\n","ts","",[24,25,26,43,50,87,94,100,119,124,130,148,153,159,173,179,184,196,210,223,236,249,262,275,305,310,315,339],"code",{"__ignoreMap":22},[27,28,31,35,39],"span",{"class":29,"line":30},"line",1,[27,32,34],{"class":33},"scz_3","interface",[27,36,38],{"class":37},"sNl3T"," ThemeApi",[27,40,42],{"class":41},"sTNBD"," {\n",[27,44,46],{"class":29,"line":45},2,[27,47,49],{"class":48},"sOLPB","    \u002F\u002F Register a theme. Throws if the name is taken.\n",[27,51,53,57,60,64,67,70,73,76,78,81,84],{"class":29,"line":52},3,[27,54,56],{"class":55},"sCudf","    create",[27,58,59],{"class":41},"(",[27,61,63],{"class":62},"s3F5K","name",[27,65,66],{"class":41},": ",[27,68,69],{"class":37},"string",[27,71,72],{"class":41},", ",[27,74,75],{"class":62},"tokens",[27,77,66],{"class":41},[27,79,80],{"class":37},"ThemeTokens",[27,82,83],{"class":41},"): ",[27,85,86],{"class":37},"Disposer\n",[27,88,90],{"class":29,"line":89},4,[27,91,93],{"emptyLinePlaceholder":92},true,"\n",[27,95,97],{"class":29,"line":96},5,[27,98,99],{"class":48},"    \u002F\u002F Paint one and keep it (persisted). Throws on an unknown name.\n",[27,101,103,106,108,110,112,114,116],{"class":29,"line":102},6,[27,104,105],{"class":55},"    set",[27,107,59],{"class":41},[27,109,63],{"class":62},[27,111,66],{"class":41},[27,113,69],{"class":37},[27,115,83],{"class":41},[27,117,118],{"class":37},"void\n",[27,120,122],{"class":29,"line":121},7,[27,123,93],{"emptyLinePlaceholder":92},[27,125,127],{"class":29,"line":126},8,[27,128,129],{"class":48},"    \u002F\u002F Every registered theme, built-ins first.\n",[27,131,133,136,139,142,145],{"class":29,"line":132},9,[27,134,135],{"class":55},"    list",[27,137,138],{"class":41},"(): ",[27,140,141],{"class":33},"readonly",[27,143,144],{"class":37}," Theme",[27,146,147],{"class":41},"[]\n",[27,149,151],{"class":29,"line":150},10,[27,152,93],{"emptyLinePlaceholder":92},[27,154,156],{"class":29,"line":155},11,[27,157,158],{"class":48},"    \u002F\u002F The theme currently painted.\n",[27,160,162,165,168,170],{"class":29,"line":161},12,[27,163,164],{"class":33},"    readonly",[27,166,167],{"class":62}," active",[27,169,66],{"class":41},[27,171,172],{"class":37},"Theme\n",[27,174,176],{"class":29,"line":175},13,[27,177,178],{"class":41},"}\n",[27,180,182],{"class":29,"line":181},14,[27,183,93],{"emptyLinePlaceholder":92},[27,185,187,190,193],{"class":29,"line":186},15,[27,188,189],{"class":33},"type",[27,191,192],{"class":37}," ThemeTokens",[27,194,195],{"class":41}," = {\n",[27,197,199,202,204,207],{"class":29,"line":198},16,[27,200,201],{"class":62},"    primary",[27,203,66],{"class":41},[27,205,206],{"class":37},"ThemeColor",[27,208,209],{"class":48},"      \u002F\u002F accent: selection, input rule, focused rows, links\n",[27,211,213,216,218,220],{"class":29,"line":212},17,[27,214,215],{"class":62},"    background",[27,217,66],{"class":41},[27,219,206],{"class":37},[27,221,222],{"class":48},"   \u002F\u002F the terminal's ground\n",[27,224,226,229,231,233],{"class":29,"line":225},18,[27,227,228],{"class":62},"    text",[27,230,66],{"class":41},[27,232,206],{"class":37},[27,234,235],{"class":48},"         \u002F\u002F ordinary foreground\n",[27,237,239,242,244,246],{"class":29,"line":238},19,[27,240,241],{"class":62},"    dim",[27,243,66],{"class":41},[27,245,206],{"class":37},[27,247,248],{"class":48},"          \u002F\u002F paths, descriptions, timestamps\n",[27,250,252,255,257,259],{"class":29,"line":251},20,[27,253,254],{"class":62},"    warn",[27,256,66],{"class":41},[27,258,206],{"class":37},[27,260,261],{"class":48},"         \u002F\u002F needs attention, nothing failed\n",[27,263,265,268,270,272],{"class":29,"line":264},21,[27,266,267],{"class":62},"    error",[27,269,66],{"class":41},[27,271,206],{"class":37},[27,273,274],{"class":48},"        \u002F\u002F something failed\n",[27,276,278,281,283,286,289,292,295,297,299,302],{"class":29,"line":277},22,[27,279,280],{"class":62},"    syntax",[27,282,66],{"class":41},[27,284,285],{"class":37},"BundledSyntax",[27,287,288],{"class":41}," | ",[27,290,291],{"class":37},"Record",[27,293,294],{"class":41},"\u003C",[27,296,69],{"class":37},[27,298,72],{"class":41},[27,300,301],{"class":37},"unknown",[27,303,304],{"class":41},">\n",[27,306,308],{"class":29,"line":307},23,[27,309,178],{"class":41},[27,311,313],{"class":29,"line":312},24,[27,314,93],{"emptyLinePlaceholder":92},[27,316,318,320,322,325,327,330,332,334,336],{"class":29,"line":317},25,[27,319,189],{"class":33},[27,321,144],{"class":37},[27,323,324],{"class":41}," = ",[27,326,80],{"class":37},[27,328,329],{"class":41}," & { ",[27,331,63],{"class":62},[27,333,66],{"class":41},[27,335,69],{"class":37},[27,337,338],{"class":41}," }\n",[27,340,342,344,347,349,352,354,358,361,363],{"class":29,"line":341},26,[27,343,189],{"class":33},[27,345,346],{"class":37}," ThemeColor",[27,348,324],{"class":41},[27,350,351],{"class":37},"ColorName",[27,353,288],{"class":41},[27,355,357],{"class":356},"sKc5r","\"transparent\"",[27,359,360],{"class":41}," | (",[27,362,69],{"class":37},[27,364,365],{"class":41}," & {})\n",[13,367,368],{},"Before this existed the TUI had reached ~30 hard-coded colours — four greys nobody chose\ndeliberately, five reds. A theme API with a field per call site would have preserved that\nforever.",[370,371,373],"h2",{"id":372},"registering","Registering",[17,375,377],{"className":19,"code":376,"language":21,"meta":22,"style":22},"theme.create(\"midnight\", {\n    primary: \"#7aa2f7\",\n    background: \"transparent\",\n    text: \"#c0caf5\",\n    dim: \"#565f89\",\n    warn: \"#e0af68\",\n    error: \"#f7768e\",\n    syntax: \"tokyo-night\",\n})\n\ntheme.set(\"midnight\")   \u002F\u002F create does not paint\n",[24,378,379,397,408,418,428,438,448,458,468,473,477],{"__ignoreMap":22},[27,380,381,383,386,389,391,394],{"class":29,"line":30},[27,382,5],{"class":62},[27,384,385],{"class":41},".",[27,387,388],{"class":55},"create",[27,390,59],{"class":41},[27,392,393],{"class":356},"\"midnight\"",[27,395,396],{"class":41},", {\n",[27,398,399,402,405],{"class":29,"line":45},[27,400,401],{"class":62},"    primary:",[27,403,404],{"class":356}," \"#7aa2f7\"",[27,406,407],{"class":41},",\n",[27,409,410,413,416],{"class":29,"line":52},[27,411,412],{"class":62},"    background:",[27,414,415],{"class":356}," \"transparent\"",[27,417,407],{"class":41},[27,419,420,423,426],{"class":29,"line":89},[27,421,422],{"class":62},"    text:",[27,424,425],{"class":356}," \"#c0caf5\"",[27,427,407],{"class":41},[27,429,430,433,436],{"class":29,"line":96},[27,431,432],{"class":62},"    dim:",[27,434,435],{"class":356}," \"#565f89\"",[27,437,407],{"class":41},[27,439,440,443,446],{"class":29,"line":102},[27,441,442],{"class":62},"    warn:",[27,444,445],{"class":356}," \"#e0af68\"",[27,447,407],{"class":41},[27,449,450,453,456],{"class":29,"line":121},[27,451,452],{"class":62},"    error:",[27,454,455],{"class":356}," \"#f7768e\"",[27,457,407],{"class":41},[27,459,460,463,466],{"class":29,"line":126},[27,461,462],{"class":62},"    syntax:",[27,464,465],{"class":356}," \"tokyo-night\"",[27,467,407],{"class":41},[27,469,470],{"class":29,"line":132},[27,471,472],{"class":41},"})\n",[27,474,475],{"class":29,"line":150},[27,476,93],{"emptyLinePlaceholder":92},[27,478,479,481,483,486,488,490,493],{"class":29,"line":155},[27,480,5],{"class":62},[27,482,385],{"class":41},[27,484,485],{"class":55},"set",[27,487,59],{"class":41},[27,489,393],{"class":356},[27,491,492],{"class":41},")   ",[27,494,495],{"class":48},"\u002F\u002F create does not paint\n",[13,497,498,499,502,503,506,507,510,511,385],{},"Colours take a name, hex, ",[24,500,501],{},"rgb()","\u002F",[24,504,505],{},"rgba()",", or ",[24,508,509],{},"transparent"," — which means \"paint nothing\nand let the real terminal show through\", usually right for ",[24,512,513],{},"background",[13,515,516,519,520,524],{},[24,517,518],{},"syntax"," takes a bundled theme name or a TextMate object. Unlike colours that union is\n",[521,522,523],"strong",{},"closed",": an unrecognised colour still renders, but an unrecognised syntax name loads\nnothing, so it is always a typo.",[370,526,528],{"id":527},"deriving-from-an-existing-theme","Deriving from an existing theme",[17,530,532],{"className":19,"code":531,"language":21,"meta":22,"style":22},"const base = theme.list().find(t => t.name === \"gruvbox\")\nif (base) theme.create(\"gruvbox-dim\", { ...base, dim: \"#665c54\" })\n",[24,533,534,582],{"__ignoreMap":22},[27,535,536,539,543,545,547,549,552,555,558,560,563,566,569,571,573,576,579],{"class":29,"line":30},[27,537,538],{"class":33},"const",[27,540,542],{"class":541},"s9McN"," base",[27,544,324],{"class":41},[27,546,5],{"class":62},[27,548,385],{"class":41},[27,550,551],{"class":55},"list",[27,553,554],{"class":41},"().",[27,556,557],{"class":55},"find",[27,559,59],{"class":41},[27,561,562],{"class":62},"t",[27,564,565],{"class":33}," =>",[27,567,568],{"class":62}," t",[27,570,385],{"class":41},[27,572,63],{"class":62},[27,574,575],{"class":41}," === ",[27,577,578],{"class":356},"\"gruvbox\"",[27,580,581],{"class":41},")\n",[27,583,584,588,591,594,597,599,601,603,605,608,611,613,615,618,621],{"class":29,"line":45},[27,585,587],{"class":586},"sYbnZ","if",[27,589,590],{"class":41}," (",[27,592,593],{"class":62},"base",[27,595,596],{"class":41},") ",[27,598,5],{"class":62},[27,600,385],{"class":41},[27,602,388],{"class":55},[27,604,59],{"class":41},[27,606,607],{"class":356},"\"gruvbox-dim\"",[27,609,610],{"class":41},", { ...",[27,612,593],{"class":62},[27,614,72],{"class":41},[27,616,617],{"class":62},"dim:",[27,619,620],{"class":356}," \"#665c54\"",[27,622,623],{"class":41}," })\n",[13,625,626,629,630,385],{},[24,627,628],{},"list()"," entries carry their full token set, not just the name — as does ",[24,631,632],{},"theme.active",[370,634,636],{"id":635},"live-preview","Live preview",[17,638,640],{"className":19,"code":639,"language":21,"meta":22,"style":22},"palette.create(\"themes\", {\n    key: \"T\",\n    list: () => theme.list().map(t => ({\n        id: t.name,\n        label: t.name,\n        preview: () => theme.set(t.name),   \u002F\u002F paints as the cursor moves\n        action: () => theme.set(t.name),\n    })),\n})\n",[24,641,642,658,668,702,715,728,759,787,792],{"__ignoreMap":22},[27,643,644,647,649,651,653,656],{"class":29,"line":30},[27,645,646],{"class":62},"palette",[27,648,385],{"class":41},[27,650,388],{"class":55},[27,652,59],{"class":41},[27,654,655],{"class":356},"\"themes\"",[27,657,396],{"class":41},[27,659,660,663,666],{"class":29,"line":45},[27,661,662],{"class":62},"    key:",[27,664,665],{"class":356}," \"T\"",[27,667,407],{"class":41},[27,669,670,672,675,678,681,684,686,688,690,693,695,697,699],{"class":29,"line":52},[27,671,135],{"class":55},[27,673,674],{"class":62},":",[27,676,677],{"class":41}," () ",[27,679,680],{"class":33},"=>",[27,682,683],{"class":62}," theme",[27,685,385],{"class":41},[27,687,551],{"class":55},[27,689,554],{"class":41},[27,691,692],{"class":55},"map",[27,694,59],{"class":41},[27,696,562],{"class":62},[27,698,565],{"class":33},[27,700,701],{"class":41}," ({\n",[27,703,704,707,709,711,713],{"class":29,"line":89},[27,705,706],{"class":62},"        id:",[27,708,568],{"class":62},[27,710,385],{"class":41},[27,712,63],{"class":62},[27,714,407],{"class":41},[27,716,717,720,722,724,726],{"class":29,"line":96},[27,718,719],{"class":62},"        label:",[27,721,568],{"class":62},[27,723,385],{"class":41},[27,725,63],{"class":62},[27,727,407],{"class":41},[27,729,730,733,735,737,739,741,743,745,747,749,751,753,756],{"class":29,"line":102},[27,731,732],{"class":55},"        preview",[27,734,674],{"class":62},[27,736,677],{"class":41},[27,738,680],{"class":33},[27,740,683],{"class":62},[27,742,385],{"class":41},[27,744,485],{"class":55},[27,746,59],{"class":41},[27,748,562],{"class":62},[27,750,385],{"class":41},[27,752,63],{"class":62},[27,754,755],{"class":41},"),   ",[27,757,758],{"class":48},"\u002F\u002F paints as the cursor moves\n",[27,760,761,764,766,768,770,772,774,776,778,780,782,784],{"class":29,"line":121},[27,762,763],{"class":55},"        action",[27,765,674],{"class":62},[27,767,677],{"class":41},[27,769,680],{"class":33},[27,771,683],{"class":62},[27,773,385],{"class":41},[27,775,485],{"class":55},[27,777,59],{"class":41},[27,779,562],{"class":62},[27,781,385],{"class":41},[27,783,63],{"class":62},[27,785,786],{"class":41},"),\n",[27,788,789],{"class":29,"line":126},[27,790,791],{"class":41},"    })),\n",[27,793,794],{"class":29,"line":132},[27,795,472],{"class":41},[13,797,798,799,802],{},"That is what ",[24,800,801],{},"\""," does.",[370,804,806],{"id":805},"shipping-one","Shipping one",[13,808,809,810,813,814,817,818,821,822,829],{},"A theme is an ordinary extension — ",[24,811,812],{},"theme.create"," in its ",[24,815,816],{},"main.ts",", published to the\nregistry, installed with ",[24,819,820],{},"axon install",". It loads from\n",[823,824,826],"a",{"href":825},"\u002Fdocs\u002Fv2\u002Ftui\u002Fstructure\u002Fconfig",[24,827,828],{},"profile.config.ts"," like any other.",[831,832,833],"style",{},"html pre.shiki code .scz_3, html code.shiki .scz_3{--shiki-default:#569CD6}html pre.shiki code .sNl3T, html code.shiki .sNl3T{--shiki-default:#4EC9B0}html pre.shiki code .sTNBD, html code.shiki .sTNBD{--shiki-default:#D4D4D4}html pre.shiki code .sOLPB, html code.shiki .sOLPB{--shiki-default:#6A9955}html pre.shiki code .sCudf, html code.shiki .sCudf{--shiki-default:#DCDCAA}html pre.shiki code .s3F5K, html code.shiki .s3F5K{--shiki-default:#9CDCFE}html pre.shiki code .sKc5r, html code.shiki .sKc5r{--shiki-default:#CE9178}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 .s9McN, html code.shiki .s9McN{--shiki-default:#4FC1FF}html pre.shiki code .sYbnZ, html code.shiki .sYbnZ{--shiki-default:#C586C0}",{"title":22,"searchDepth":45,"depth":45,"links":835},[836,837,838,839],{"id":372,"depth":45,"text":373},{"id":527,"depth":45,"text":528},{"id":635,"depth":45,"text":636},{"id":805,"depth":45,"text":806},"md",{},"\u002Fdocs\u002Fv2\u002Ftui\u002Fapi\u002Ftheme",{"title":5,"description":15},"docs\u002Fv2\u002Ftui\u002Fapi\u002Ftheme","x6qTIQ2zNP2YHteECYFftkJ5E0U3lIynkipA8_hVPRg",1786791207945]