[{"data":1,"prerenderedAt":13073},["ShallowReactive",2],{"alldocs":3},[4,252,285,793,1316,2882,3080,5285,6133,7009,11183,12918],{"id":5,"title":6,"body":7,"description":245,"extension":246,"meta":247,"navigation":67,"path":248,"seo":249,"stem":250,"__hash__":251},"docs\u002F01-what-is-iridis.md","1. What is Iridis",{"type":8,"value":9,"toc":240},"minimark",[10,14,22,27,30,111,119,125,225,236],[11,12,13],"p",{},"iridis is a chromatic pipeline for dynamic palette derivation. You give it seed colors (hex, RGB, OKLCH, etc.). It runs them through a registered sequence of tasks—intake, role resolution, contrast enforcement, variant derivation, and emission—and returns a role-resolved palette plus any consumer-shaped outputs you requested (CSS variables, Tailwind, Shadcn, MUI, Capacitor, etc.).",[11,15,16,17,21],{},"The core (",[18,19,20],"code",{},"@studnicky\u002Firidis",") ships with zero runtime dependencies. Each output target is a separate plugin package.",[23,24,26],"h2",{"id":25},"installation","Installation",[11,28,29],{},"Install the core package, plus any output plugins you need.",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Core only\nnpm install @studnicky\u002Firidis\n\n# W3C contrast checking + Stylesheet + Shadcn UI outputs\nnpm install @studnicky\u002Firidis \\\n  @studnicky\u002Firidis-contrast \\\n  @studnicky\u002Firidis-stylesheet \\\n  @studnicky\u002Firidis-shadcn\n","bash","",[18,38,39,48,62,69,75,89,97,105],{"__ignoreMap":36},[40,41,44],"span",{"class":42,"line":43},"line",1,[40,45,47],{"class":46},"sHwdD","# Core only\n",[40,49,51,55,59],{"class":42,"line":50},2,[40,52,54],{"class":53},"sBMFI","npm",[40,56,58],{"class":57},"sfazB"," install",[40,60,61],{"class":57}," @studnicky\u002Firidis\n",[40,63,65],{"class":42,"line":64},3,[40,66,68],{"emptyLinePlaceholder":67},true,"\n",[40,70,72],{"class":42,"line":71},4,[40,73,74],{"class":46},"# W3C contrast checking + Stylesheet + Shadcn UI outputs\n",[40,76,78,80,82,85],{"class":42,"line":77},5,[40,79,54],{"class":53},[40,81,58],{"class":57},[40,83,84],{"class":57}," @studnicky\u002Firidis",[40,86,88],{"class":87},"sTEyZ"," \\\n",[40,90,92,95],{"class":42,"line":91},6,[40,93,94],{"class":57},"  @studnicky\u002Firidis-contrast",[40,96,88],{"class":87},[40,98,100,103],{"class":42,"line":99},7,[40,101,102],{"class":57},"  @studnicky\u002Firidis-stylesheet",[40,104,88],{"class":87},[40,106,108],{"class":42,"line":107},8,[40,109,110],{"class":57},"  @studnicky\u002Firidis-shadcn\n",[23,112,114,115,118],{"id":113},"the-simplest-call-quickpalette","The simplest call (",[18,116,117],{},"quickPalette",")",[11,120,121,122,124],{},"For basic use cases, you don't even need to configure an engine. Use the ",[18,123,117],{}," helper:",[31,126,130],{"className":127,"code":128,"language":129,"meta":36,"style":36},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { quickPalette } from '@studnicky\u002Firidis';\n\nconst palette = await quickPalette(['#7c3aed', '#06b6d4'], 'dark');\n\u002F\u002F → { background: '#07061a', foreground: '#f0f0ff', accent: '#7c3aed', muted: '#7e7e9a' }\n","ts",[18,131,132,162,166,220],{"__ignoreMap":36},[40,133,134,138,142,145,148,151,154,156,159],{"class":42,"line":43},[40,135,137],{"class":136},"s7zQu","import",[40,139,141],{"class":140},"sMK4o"," {",[40,143,144],{"class":87}," quickPalette",[40,146,147],{"class":140}," }",[40,149,150],{"class":136}," from",[40,152,153],{"class":140}," '",[40,155,20],{"class":57},[40,157,158],{"class":140},"'",[40,160,161],{"class":140},";\n",[40,163,164],{"class":42,"line":50},[40,165,68],{"emptyLinePlaceholder":67},[40,167,168,172,175,178,181,184,187,189,192,194,197,199,202,204,207,209,211,214,216,218],{"class":42,"line":64},[40,169,171],{"class":170},"spNyl","const",[40,173,174],{"class":87}," palette ",[40,176,177],{"class":140},"=",[40,179,180],{"class":136}," await",[40,182,144],{"class":183},"s2Zo4",[40,185,186],{"class":87},"([",[40,188,158],{"class":140},[40,190,191],{"class":57},"#7c3aed",[40,193,158],{"class":140},[40,195,196],{"class":140},",",[40,198,153],{"class":140},[40,200,201],{"class":57},"#06b6d4",[40,203,158],{"class":140},[40,205,206],{"class":87},"]",[40,208,196],{"class":140},[40,210,153],{"class":140},[40,212,213],{"class":57},"dark",[40,215,158],{"class":140},[40,217,118],{"class":87},[40,219,161],{"class":140},[40,221,222],{"class":42,"line":71},[40,223,224],{"class":46},"\u002F\u002F → { background: '#07061a', foreground: '#f0f0ff', accent: '#7c3aed', muted: '#7e7e9a' }\n",[11,226,227,228,231,232,235],{},"One import, one call. No schema to define, no pipeline to declare. The framing argument (",[18,229,230],{},"'dark'"," or ",[18,233,234],{},"'light'",") picks the clamp envelopes, and everything else uses sensible defaults.",[237,238,239],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":36,"searchDepth":50,"depth":50,"links":241},[242,243],{"id":25,"depth":50,"text":26},{"id":113,"depth":50,"text":244},"The simplest call (quickPalette)","A chromatic pipeline that turns seed colors into a contrast-enforced palette in one line.","md",{},"\u002F01-what-is-iridis",{"title":6,"description":245},"01-what-is-iridis","kIN1OPnb7zPjTR6I42LDCfR6xpB4SDfhxisjg5J1YOw",{"id":253,"title":254,"body":255,"description":279,"extension":246,"meta":280,"navigation":67,"path":281,"seo":282,"stem":283,"__hash__":284},"docs\u002F02-the-four-stages.md","2. The Four Stages",{"type":8,"value":256,"toc":276},[257,260,268,272],[11,258,259],{},"Every iridis pipeline passes through four conceptual stages, even though the task names and execution order are fully controlled by you:",[31,261,266],{"className":262,"code":264,"language":265},[263],"language-text","intake → resolve → enforce → emit\n","text",[18,267,264],{"__ignoreMap":36},[23,269,271],{"id":270},"the-data-flow","The Data Flow",[273,274],"mermaid-diagram",{"code":275},"flowchart TD\n    A[\"input.colors\\n(raw strings \u002F objects)\"]\n    B[\"state.colors\\n(ColorRecord[])\"]\n    C[\"state.roles\\n(Record\u003Cstring, ColorRecord>)\"]\n    D[\"state.roles\\n(contrast-adjusted)\"]\n    E[\"state.variants\\n(light \u002F dark)\"]\n    F[\"state.outputs\\n(cssVars, tailwind, shadcn ...)\"]\n\n    A -->|intake tasks| B\n    B -->|resolve:roles| C\n    C -->|enforce:contrast| D\n    D -->|derive:variant| E\n    D -->|emit tasks| F\n    E -->|emit tasks| F\n",{"title":36,"searchDepth":50,"depth":50,"links":277},[278],{"id":270,"depth":50,"text":271},"The four conceptual stages of iridis and how data flows through the pipeline.",{},"\u002F02-the-four-stages",{"title":254,"description":279},"02-the-four-stages","6pWXskkhqd9SjyYVKe38un5_dwbbp4Ss0IX9QlQ_N-4",{"id":286,"title":287,"body":288,"description":787,"extension":246,"meta":788,"navigation":67,"path":789,"seo":790,"stem":791,"__hash__":792},"docs\u002F03-adopting-existing-apps.md","3. Adopting Iridis In An Existing App",{"type":8,"value":289,"toc":780},[290,293,296,300,317,329,332,337,360,623,630,638,650,653,774,777],[11,291,292],{},"Integrating Iridis into an existing application shouldn't require rewriting all of your CSS or switching out your Tailwind classes. Consumers can adopt Iridis effortlessly by presenting their existing color tokens and mapping them directly to the variables Iridis outputs.",[11,294,295],{},"Your goal is to configure Iridis to target the CSS Custom Properties (variables) your app already uses.",[23,297,299],{"id":298},"the-strategy-css-variable-mapping","The Strategy: CSS Variable Mapping",[11,301,302,303,231,306,309,310,231,313,316],{},"Most modern UI frameworks (like Tailwind CSS, Nuxt UI, Shadcn, MUI, or Bootstrap) rely on CSS variables under the hood. If your app already uses classes like ",[18,304,305],{},"text-primary",[18,307,308],{},"bg-surface",", those are typically backed by a variable like ",[18,311,312],{},"--color-primary",[18,314,315],{},"--surface",".",[11,318,319,320,322,323,316],{},"Instead of replacing ",[18,321,305],{}," with something else, you simply ",[324,325,326,327],"strong",{},"tell Iridis to overwrite ",[18,328,312],{},[11,330,331],{},"There are two primary ways to do this:",[333,334,336],"h3",{"id":335},"_1-direct-alignment-emit-custom-keys","1. Direct Alignment (Emit Custom Keys)",[11,338,339,340,343,344,347,348,351,352,355,356,359],{},"If your existing application expects variables named ",[18,341,342],{},"--brand-main",", ",[18,345,346],{},"--bg-base",", and ",[18,349,350],{},"--text-body",", you can define an Iridis Role Schema that exactly matches those names. Iridis's ",[18,353,354],{},"emit:cssVars"," (from ",[18,357,358],{},"@studnicky\u002Firidis-stylesheet",") will generate the CSS using those exact keys.",[31,361,363],{"className":127,"code":362,"language":129,"meta":36,"style":36},"import { Engine } from '@studnicky\u002Firidis';\n\nconst schema = {\n  roles: [\n    { name: 'brand-main', \u002F* ... *\u002F },\n    { name: 'bg-base', \u002F* ... *\u002F },\n    { name: 'text-body', \u002F* ... *\u002F }\n  ]\n};\n\n\u002F\u002F ... engine setup ...\nconst state = await engine.run({\n  colors: ['#00FF00', '#FF0000'],\n  roles: schema\n});\n\n\u002F\u002F Outputs:\n\u002F\u002F :root {\n\u002F\u002F   --brand-main: #...;\n\u002F\u002F   --bg-base: #...;\n\u002F\u002F   --text-body: #...;\n\u002F\u002F }\n",[18,364,365,386,390,402,414,439,460,482,487,493,498,504,530,562,572,582,587,593,599,605,611,617],{"__ignoreMap":36},[40,366,367,369,371,374,376,378,380,382,384],{"class":42,"line":43},[40,368,137],{"class":136},[40,370,141],{"class":140},[40,372,373],{"class":87}," Engine",[40,375,147],{"class":140},[40,377,150],{"class":136},[40,379,153],{"class":140},[40,381,20],{"class":57},[40,383,158],{"class":140},[40,385,161],{"class":140},[40,387,388],{"class":42,"line":50},[40,389,68],{"emptyLinePlaceholder":67},[40,391,392,394,397,399],{"class":42,"line":64},[40,393,171],{"class":170},[40,395,396],{"class":87}," schema ",[40,398,177],{"class":140},[40,400,401],{"class":140}," {\n",[40,403,404,408,411],{"class":42,"line":71},[40,405,407],{"class":406},"swJcz","  roles",[40,409,410],{"class":140},":",[40,412,413],{"class":87}," [\n",[40,415,416,419,422,424,426,429,431,433,436],{"class":42,"line":77},[40,417,418],{"class":140},"    {",[40,420,421],{"class":406}," name",[40,423,410],{"class":140},[40,425,153],{"class":140},[40,427,428],{"class":57},"brand-main",[40,430,158],{"class":140},[40,432,196],{"class":140},[40,434,435],{"class":46}," \u002F* ... *\u002F",[40,437,438],{"class":140}," },\n",[40,440,441,443,445,447,449,452,454,456,458],{"class":42,"line":91},[40,442,418],{"class":140},[40,444,421],{"class":406},[40,446,410],{"class":140},[40,448,153],{"class":140},[40,450,451],{"class":57},"bg-base",[40,453,158],{"class":140},[40,455,196],{"class":140},[40,457,435],{"class":46},[40,459,438],{"class":140},[40,461,462,464,466,468,470,473,475,477,479],{"class":42,"line":99},[40,463,418],{"class":140},[40,465,421],{"class":406},[40,467,410],{"class":140},[40,469,153],{"class":140},[40,471,472],{"class":57},"text-body",[40,474,158],{"class":140},[40,476,196],{"class":140},[40,478,435],{"class":46},[40,480,481],{"class":140}," }\n",[40,483,484],{"class":42,"line":107},[40,485,486],{"class":87},"  ]\n",[40,488,490],{"class":42,"line":489},9,[40,491,492],{"class":140},"};\n",[40,494,496],{"class":42,"line":495},10,[40,497,68],{"emptyLinePlaceholder":67},[40,499,501],{"class":42,"line":500},11,[40,502,503],{"class":46},"\u002F\u002F ... engine setup ...\n",[40,505,507,509,512,514,516,519,521,524,527],{"class":42,"line":506},12,[40,508,171],{"class":170},[40,510,511],{"class":87}," state ",[40,513,177],{"class":140},[40,515,180],{"class":136},[40,517,518],{"class":87}," engine",[40,520,316],{"class":140},[40,522,523],{"class":183},"run",[40,525,526],{"class":87},"(",[40,528,529],{"class":140},"{\n",[40,531,533,536,538,541,543,546,548,550,552,555,557,559],{"class":42,"line":532},13,[40,534,535],{"class":406},"  colors",[40,537,410],{"class":140},[40,539,540],{"class":87}," [",[40,542,158],{"class":140},[40,544,545],{"class":57},"#00FF00",[40,547,158],{"class":140},[40,549,196],{"class":140},[40,551,153],{"class":140},[40,553,554],{"class":57},"#FF0000",[40,556,158],{"class":140},[40,558,206],{"class":87},[40,560,561],{"class":140},",\n",[40,563,565,567,569],{"class":42,"line":564},14,[40,566,407],{"class":406},[40,568,410],{"class":140},[40,570,571],{"class":87}," schema\n",[40,573,575,578,580],{"class":42,"line":574},15,[40,576,577],{"class":140},"}",[40,579,118],{"class":87},[40,581,161],{"class":140},[40,583,585],{"class":42,"line":584},16,[40,586,68],{"emptyLinePlaceholder":67},[40,588,590],{"class":42,"line":589},17,[40,591,592],{"class":46},"\u002F\u002F Outputs:\n",[40,594,596],{"class":42,"line":595},18,[40,597,598],{"class":46},"\u002F\u002F :root {\n",[40,600,602],{"class":42,"line":601},19,[40,603,604],{"class":46},"\u002F\u002F   --brand-main: #...;\n",[40,606,608],{"class":42,"line":607},20,[40,609,610],{"class":46},"\u002F\u002F   --bg-base: #...;\n",[40,612,614],{"class":42,"line":613},21,[40,615,616],{"class":46},"\u002F\u002F   --text-body: #...;\n",[40,618,620],{"class":42,"line":619},22,[40,621,622],{"class":46},"\u002F\u002F }\n",[11,624,625,626,629],{},"When you inject this generated CSS into your ",[18,627,628],{},"\u003Chead>",", your existing CSS and components will instantly react to the new scheme without a single code change.",[333,631,633,634,637],{"id":632},"_2-the-key-val-alias-map","2. The ",[18,635,636],{},"{ key: val }"," Alias Map",[11,639,640,641,343,644,343,647,649],{},"If you prefer to use the standard Iridis schema (which handles complex contrast logic seamlessly for roles like ",[18,642,643],{},"background",[18,645,646],{},"brand",[18,648,265],{},", etc.) but need it to interface with your existing variables, you can simply write a CSS mapping block.",[11,651,652],{},"Generate the standard Iridis CSS variables, and then map your app's variables to point to them:",[31,654,658],{"className":655,"code":656,"language":657,"meta":36,"style":36},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F* Your app's existing theme file *\u002F\n:root {\n  \u002F* Map your existing tokens to Iridis's outputs *\u002F\n  --color-primary: var(--iridis-brand);\n  --color-primary-hover: var(--iridis-brand-600);\n\n  --bg-surface: var(--iridis-background);\n  --text-main: var(--iridis-text);\n\n  --border-color: var(--iridis-muted);\n}\n","css",[18,659,660,665,674,679,697,713,717,733,749,753,769],{"__ignoreMap":36},[40,661,662],{"class":42,"line":43},[40,663,664],{"class":46},"\u002F* Your app's existing theme file *\u002F\n",[40,666,667,669,672],{"class":42,"line":50},[40,668,410],{"class":140},[40,670,671],{"class":170},"root",[40,673,401],{"class":140},[40,675,676],{"class":42,"line":64},[40,677,678],{"class":46},"  \u002F* Map your existing tokens to Iridis's outputs *\u002F\n",[40,680,681,684,686,689,691,694],{"class":42,"line":71},[40,682,683],{"class":87},"  --color-primary",[40,685,410],{"class":140},[40,687,688],{"class":183}," var",[40,690,526],{"class":140},[40,692,693],{"class":87},"--iridis-brand",[40,695,696],{"class":140},");\n",[40,698,699,702,704,706,708,711],{"class":42,"line":77},[40,700,701],{"class":87},"  --color-primary-hover",[40,703,410],{"class":140},[40,705,688],{"class":183},[40,707,526],{"class":140},[40,709,710],{"class":87},"--iridis-brand-600",[40,712,696],{"class":140},[40,714,715],{"class":42,"line":91},[40,716,68],{"emptyLinePlaceholder":67},[40,718,719,722,724,726,728,731],{"class":42,"line":99},[40,720,721],{"class":87},"  --bg-surface",[40,723,410],{"class":140},[40,725,688],{"class":183},[40,727,526],{"class":140},[40,729,730],{"class":87},"--iridis-background",[40,732,696],{"class":140},[40,734,735,738,740,742,744,747],{"class":42,"line":107},[40,736,737],{"class":87},"  --text-main",[40,739,410],{"class":140},[40,741,688],{"class":183},[40,743,526],{"class":140},[40,745,746],{"class":87},"--iridis-text",[40,748,696],{"class":140},[40,750,751],{"class":42,"line":489},[40,752,68],{"emptyLinePlaceholder":67},[40,754,755,758,760,762,764,767],{"class":42,"line":495},[40,756,757],{"class":87},"  --border-color",[40,759,410],{"class":140},[40,761,688],{"class":183},[40,763,526],{"class":140},[40,765,766],{"class":87},"--iridis-muted",[40,768,696],{"class":140},[40,770,771],{"class":42,"line":500},[40,772,773],{"class":140},"}\n",[11,775,776],{},"With this single mapping block, the entire Iridis pipeline (including contrast checking and synthesis) powers your existing UI, guaranteeing that your application remains fully responsive to any palette change.",[237,778,779],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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);}",{"title":36,"searchDepth":50,"depth":50,"links":781},[782],{"id":298,"depth":50,"text":299,"children":783},[784,785],{"id":335,"depth":64,"text":336},{"id":632,"depth":64,"text":786},"2. The { key: val } Alias Map","Adopt Iridis into an existing codebase without changing your existing utility classes or CSS component styles.",{},"\u002F03-adopting-existing-apps",{"title":287,"description":787},"03-adopting-existing-apps","Jgxzrqbjb54PU9I1k75CR1phIxsMneAN38vMbcN07gQ",{"id":794,"title":795,"body":796,"description":1310,"extension":246,"meta":1311,"navigation":67,"path":1312,"seo":1313,"stem":1314,"__hash__":1315},"docs\u002F04-engine-api.md","4. Long-form Engine API",{"type":8,"value":797,"toc":1304},[798,807,1224,1228,1231,1235,1261,1265,1276,1289,1301],[11,799,800,802,803,806],{},[18,801,117],{}," covers the simple case. When you need custom schemas, explicit contrast checking, or plugin emitters, construct the ",[18,804,805],{},"Engine"," directly.",[31,808,810],{"className":127,"code":809,"language":129,"meta":36,"style":36},"import { Engine, coreTasks }  from '@studnicky\u002Firidis';\nimport { stylesheetPlugin }   from '@studnicky\u002Firidis-stylesheet';\nimport { shadcnPlugin }       from '@studnicky\u002Firidis-shadcn';\n\nconst engine = new Engine();\n\u002F\u002F Register core tasks\nfor (const task of coreTasks) engine.tasks.register(task);\n\n\u002F\u002F Adopt output plugins\nengine.adopt(stylesheetPlugin);\nengine.adopt(shadcnPlugin);\n\n\u002F\u002F Declare the execution sequence\nengine.pipeline([\n  'intake:any',\n  'expand:family',\n  'resolve:roles',\n  'enforce:contrast',\n  'derive:variant',\n  'emit:cssVars',\n  'emit:shadcnVars'\n]);\n\n\u002F\u002F Run the pipeline\nconst state = await engine.run({\n  colors: ['#8B5CF6'],\n  roles: yourRoleSchema,\n  contrast: { level: 'AA' },\n});\n\n\u002F\u002F The results are available in state.outputs\nconsole.log(state.outputs['stylesheet:cssVars']);\n",[18,811,812,838,860,883,887,906,911,945,949,954,969,982,986,991,1003,1015,1026,1037,1048,1059,1069,1079,1086,1091,1097,1118,1138,1150,1174,1183,1188,1194],{"__ignoreMap":36},[40,813,814,816,818,820,822,825,827,830,832,834,836],{"class":42,"line":43},[40,815,137],{"class":136},[40,817,141],{"class":140},[40,819,373],{"class":87},[40,821,196],{"class":140},[40,823,824],{"class":87}," coreTasks",[40,826,147],{"class":140},[40,828,829],{"class":136},"  from",[40,831,153],{"class":140},[40,833,20],{"class":57},[40,835,158],{"class":140},[40,837,161],{"class":140},[40,839,840,842,844,847,849,852,854,856,858],{"class":42,"line":50},[40,841,137],{"class":136},[40,843,141],{"class":140},[40,845,846],{"class":87}," stylesheetPlugin",[40,848,147],{"class":140},[40,850,851],{"class":136},"   from",[40,853,153],{"class":140},[40,855,358],{"class":57},[40,857,158],{"class":140},[40,859,161],{"class":140},[40,861,862,864,866,869,871,874,876,879,881],{"class":42,"line":64},[40,863,137],{"class":136},[40,865,141],{"class":140},[40,867,868],{"class":87}," shadcnPlugin",[40,870,147],{"class":140},[40,872,873],{"class":136},"       from",[40,875,153],{"class":140},[40,877,878],{"class":57},"@studnicky\u002Firidis-shadcn",[40,880,158],{"class":140},[40,882,161],{"class":140},[40,884,885],{"class":42,"line":71},[40,886,68],{"emptyLinePlaceholder":67},[40,888,889,891,894,896,899,901,904],{"class":42,"line":77},[40,890,171],{"class":170},[40,892,893],{"class":87}," engine ",[40,895,177],{"class":140},[40,897,898],{"class":140}," new",[40,900,373],{"class":183},[40,902,903],{"class":87},"()",[40,905,161],{"class":140},[40,907,908],{"class":42,"line":91},[40,909,910],{"class":46},"\u002F\u002F Register core tasks\n",[40,912,913,916,919,921,924,927,930,932,935,937,940,943],{"class":42,"line":99},[40,914,915],{"class":136},"for",[40,917,918],{"class":87}," (",[40,920,171],{"class":170},[40,922,923],{"class":87}," task ",[40,925,926],{"class":140},"of",[40,928,929],{"class":87}," coreTasks) engine",[40,931,316],{"class":140},[40,933,934],{"class":87},"tasks",[40,936,316],{"class":140},[40,938,939],{"class":183},"register",[40,941,942],{"class":87},"(task)",[40,944,161],{"class":140},[40,946,947],{"class":42,"line":107},[40,948,68],{"emptyLinePlaceholder":67},[40,950,951],{"class":42,"line":489},[40,952,953],{"class":46},"\u002F\u002F Adopt output plugins\n",[40,955,956,959,961,964,967],{"class":42,"line":495},[40,957,958],{"class":87},"engine",[40,960,316],{"class":140},[40,962,963],{"class":183},"adopt",[40,965,966],{"class":87},"(stylesheetPlugin)",[40,968,161],{"class":140},[40,970,971,973,975,977,980],{"class":42,"line":500},[40,972,958],{"class":87},[40,974,316],{"class":140},[40,976,963],{"class":183},[40,978,979],{"class":87},"(shadcnPlugin)",[40,981,161],{"class":140},[40,983,984],{"class":42,"line":506},[40,985,68],{"emptyLinePlaceholder":67},[40,987,988],{"class":42,"line":532},[40,989,990],{"class":46},"\u002F\u002F Declare the execution sequence\n",[40,992,993,995,997,1000],{"class":42,"line":564},[40,994,958],{"class":87},[40,996,316],{"class":140},[40,998,999],{"class":183},"pipeline",[40,1001,1002],{"class":87},"([\n",[40,1004,1005,1008,1011,1013],{"class":42,"line":574},[40,1006,1007],{"class":140},"  '",[40,1009,1010],{"class":57},"intake:any",[40,1012,158],{"class":140},[40,1014,561],{"class":140},[40,1016,1017,1019,1022,1024],{"class":42,"line":584},[40,1018,1007],{"class":140},[40,1020,1021],{"class":57},"expand:family",[40,1023,158],{"class":140},[40,1025,561],{"class":140},[40,1027,1028,1030,1033,1035],{"class":42,"line":589},[40,1029,1007],{"class":140},[40,1031,1032],{"class":57},"resolve:roles",[40,1034,158],{"class":140},[40,1036,561],{"class":140},[40,1038,1039,1041,1044,1046],{"class":42,"line":595},[40,1040,1007],{"class":140},[40,1042,1043],{"class":57},"enforce:contrast",[40,1045,158],{"class":140},[40,1047,561],{"class":140},[40,1049,1050,1052,1055,1057],{"class":42,"line":601},[40,1051,1007],{"class":140},[40,1053,1054],{"class":57},"derive:variant",[40,1056,158],{"class":140},[40,1058,561],{"class":140},[40,1060,1061,1063,1065,1067],{"class":42,"line":607},[40,1062,1007],{"class":140},[40,1064,354],{"class":57},[40,1066,158],{"class":140},[40,1068,561],{"class":140},[40,1070,1071,1073,1076],{"class":42,"line":613},[40,1072,1007],{"class":140},[40,1074,1075],{"class":57},"emit:shadcnVars",[40,1077,1078],{"class":140},"'\n",[40,1080,1081,1084],{"class":42,"line":619},[40,1082,1083],{"class":87},"])",[40,1085,161],{"class":140},[40,1087,1089],{"class":42,"line":1088},23,[40,1090,68],{"emptyLinePlaceholder":67},[40,1092,1094],{"class":42,"line":1093},24,[40,1095,1096],{"class":46},"\u002F\u002F Run the pipeline\n",[40,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116],{"class":42,"line":1099},25,[40,1101,171],{"class":170},[40,1103,511],{"class":87},[40,1105,177],{"class":140},[40,1107,180],{"class":136},[40,1109,518],{"class":87},[40,1111,316],{"class":140},[40,1113,523],{"class":183},[40,1115,526],{"class":87},[40,1117,529],{"class":140},[40,1119,1121,1123,1125,1127,1129,1132,1134,1136],{"class":42,"line":1120},26,[40,1122,535],{"class":406},[40,1124,410],{"class":140},[40,1126,540],{"class":87},[40,1128,158],{"class":140},[40,1130,1131],{"class":57},"#8B5CF6",[40,1133,158],{"class":140},[40,1135,206],{"class":87},[40,1137,561],{"class":140},[40,1139,1141,1143,1145,1148],{"class":42,"line":1140},27,[40,1142,407],{"class":406},[40,1144,410],{"class":140},[40,1146,1147],{"class":87}," yourRoleSchema",[40,1149,561],{"class":140},[40,1151,1153,1156,1158,1160,1163,1165,1167,1170,1172],{"class":42,"line":1152},28,[40,1154,1155],{"class":406},"  contrast",[40,1157,410],{"class":140},[40,1159,141],{"class":140},[40,1161,1162],{"class":406}," level",[40,1164,410],{"class":140},[40,1166,153],{"class":140},[40,1168,1169],{"class":57},"AA",[40,1171,158],{"class":140},[40,1173,438],{"class":140},[40,1175,1177,1179,1181],{"class":42,"line":1176},29,[40,1178,577],{"class":140},[40,1180,118],{"class":87},[40,1182,161],{"class":140},[40,1184,1186],{"class":42,"line":1185},30,[40,1187,68],{"emptyLinePlaceholder":67},[40,1189,1191],{"class":42,"line":1190},31,[40,1192,1193],{"class":46},"\u002F\u002F The results are available in state.outputs\n",[40,1195,1197,1200,1202,1205,1208,1210,1213,1215,1218,1220,1222],{"class":42,"line":1196},32,[40,1198,1199],{"class":87},"console",[40,1201,316],{"class":140},[40,1203,1204],{"class":183},"log",[40,1206,1207],{"class":87},"(state",[40,1209,316],{"class":140},[40,1211,1212],{"class":87},"outputs[",[40,1214,158],{"class":140},[40,1216,1217],{"class":57},"stylesheet:cssVars",[40,1219,158],{"class":140},[40,1221,1083],{"class":87},[40,1223,161],{"class":140},[23,1225,1227],{"id":1226},"two-ways-to-run","Two ways to run",[11,1229,1230],{},"iridis works as an NPM library AND as a CLI tool.",[333,1232,1234],{"id":1233},"as-a-library","As a library",[11,1236,1237,1238,1241,1242,1245,1246,1249,1250,1253,1254,1257,1258,1260],{},"Construct ",[18,1239,1240],{},"new Engine()",", register the core tasks (",[18,1243,1244],{},"coreTasks","), ",[18,1247,1248],{},"adopt()"," the plugins you want, declare your ",[18,1251,1252],{},"pipeline()"," order, and call ",[18,1255,1256],{},"run(input)",". Math primitives are independent singletons; import any of them directly from ",[18,1259,20],{}," when you need to call colour math outside the pipeline.",[333,1262,1264],{"id":1263},"as-a-cli","As a CLI",[11,1266,1267,1268,1271,1272,1275],{},"Install ",[18,1269,1270],{},"@studnicky\u002Firidis-cli",", write a JSON config with ",[18,1273,1274],{},"enable*"," flags, and run:",[31,1277,1279],{"className":33,"code":1278,"language":35,"meta":36,"style":36},"iridis .\u002Fpalette.config.json\n",[18,1280,1281],{"__ignoreMap":36},[40,1282,1283,1286],{"class":42,"line":43},[40,1284,1285],{"class":53},"iridis",[40,1287,1288],{"class":57}," .\u002Fpalette.config.json\n",[11,1290,1291,1292,1294,1295,1300],{},"Same engine, same plugins. The CLI dynamically imports only the plugins whose ",[18,1293,1274],{}," flag is true. Use it in build scripts, CI, or one-off generation jobs. See ",[1296,1297,1299],"a",{"href":1298},"#07-cli-usage","CLI Usage"," for the full config shape.",[237,1302,1303],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":36,"searchDepth":50,"depth":50,"links":1305},[1306],{"id":1226,"depth":50,"text":1227,"children":1307},[1308,1309],{"id":1233,"depth":64,"text":1234},{"id":1263,"depth":64,"text":1264},"Construct the Engine directly for custom schemas, explicit contrast checking, or plugin emitters.",{},"\u002F04-engine-api",{"title":795,"description":1310},"04-engine-api","tO6dXbjRdul8M4NzCAEBglAgbtWKlrnpIYZPOsYL-nk",{"id":1317,"title":1318,"body":1319,"description":2876,"extension":246,"meta":2877,"navigation":67,"path":2878,"seo":2879,"stem":2880,"__hash__":2881},"docs\u002F05-recipe-vue-capacitor.md","5. Recipe: Vue + Capacitor Per-Category Palettes",{"type":8,"value":1320,"toc":2871},[1321,1332,1349,1658,1676,1680,1719,1758,1762,2417,2424,2428,2648,2824,2853,2868],[11,1322,1323,1324,1327,1328,1331],{},"A worked example of the mapping strategy: ",[18,1325,1326],{},"examples\u002Fvue-capacitor\u002FcategoryColorService.ts"," is a service that takes a category name and a seed hex color, runs the Iridis pipeline, writes scoped CSS custom properties to the document, and returns Capacitor ",[18,1329,1330],{},"StatusBar"," parameters for native chrome.",[11,1333,1334,1337,1338,1340,1341,1344,1345,1348],{},[18,1335,1336],{},"CategoryColorService"," is a singleton that owns a single ",[18,1339,805],{}," instance configured at construction time. The engine is set up once; individual calls to ",[18,1342,1343],{},"apply(category, seed)"," just invoke ",[18,1346,1347],{},"engine.run()"," with a new input.",[31,1350,1352],{"className":127,"code":1351,"language":129,"meta":36,"style":36},"private constructor() {\n  this.engine = new Engine();\n  for (const task of coreTasks) {\n    this.engine.tasks.register(task);\n  }\n  this.engine.adopt(contrastPlugin);\n  this.engine.adopt(stylesheetPlugin);\n  this.engine.adopt(capacitorPlugin);\n  \u002F* Example wires every compliance check the engine exposes:\n     WCAG 2.1 AA + AAA, APCA Lc targets, and CVD simulation against\n     protanopia + deuteranopia + tritanopia + achromatopsia. Real\n     consumers opt in\u002Fout via their own pipeline; the example\n     demonstrates the maximal-correctness configuration. *\u002F\n  this.engine.pipeline([\n    'intake:any',\n    'resolve:roles',\n    'expand:family',\n    'enforce:wcagAA',\n    'enforce:wcagAAA',\n    'enforce:apca',\n    'enforce:cvdSimulate',\n    'derive:variant',\n    'emit:cssVars',\n    'emit:capacitorStatusBar',\n    'emit:capacitorTheme',\n  ]);\n}\n",[18,1353,1354,1367,1385,1407,1431,1436,1455,1474,1493,1498,1503,1508,1513,1518,1530,1541,1551,1561,1572,1583,1594,1605,1615,1625,1636,1647,1654],{"__ignoreMap":36},[40,1355,1356,1359,1362,1365],{"class":42,"line":43},[40,1357,1358],{"class":87},"private ",[40,1360,1361],{"class":183},"constructor",[40,1363,1364],{"class":87},"() ",[40,1366,529],{"class":140},[40,1368,1369,1372,1374,1377,1379,1381,1383],{"class":42,"line":50},[40,1370,1371],{"class":140},"  this.",[40,1373,958],{"class":87},[40,1375,1376],{"class":140}," =",[40,1378,898],{"class":140},[40,1380,373],{"class":183},[40,1382,903],{"class":406},[40,1384,161],{"class":140},[40,1386,1387,1390,1392,1394,1397,1400,1402,1405],{"class":42,"line":64},[40,1388,1389],{"class":136},"  for",[40,1391,918],{"class":406},[40,1393,171],{"class":170},[40,1395,1396],{"class":87}," task",[40,1398,1399],{"class":140}," of",[40,1401,824],{"class":87},[40,1403,1404],{"class":406},") ",[40,1406,529],{"class":140},[40,1408,1409,1412,1414,1416,1418,1420,1422,1424,1427,1429],{"class":42,"line":71},[40,1410,1411],{"class":140},"    this.",[40,1413,958],{"class":87},[40,1415,316],{"class":140},[40,1417,934],{"class":87},[40,1419,316],{"class":140},[40,1421,939],{"class":183},[40,1423,526],{"class":406},[40,1425,1426],{"class":87},"task",[40,1428,118],{"class":406},[40,1430,161],{"class":140},[40,1432,1433],{"class":42,"line":77},[40,1434,1435],{"class":140},"  }\n",[40,1437,1438,1440,1442,1444,1446,1448,1451,1453],{"class":42,"line":91},[40,1439,1371],{"class":140},[40,1441,958],{"class":87},[40,1443,316],{"class":140},[40,1445,963],{"class":183},[40,1447,526],{"class":406},[40,1449,1450],{"class":87},"contrastPlugin",[40,1452,118],{"class":406},[40,1454,161],{"class":140},[40,1456,1457,1459,1461,1463,1465,1467,1470,1472],{"class":42,"line":99},[40,1458,1371],{"class":140},[40,1460,958],{"class":87},[40,1462,316],{"class":140},[40,1464,963],{"class":183},[40,1466,526],{"class":406},[40,1468,1469],{"class":87},"stylesheetPlugin",[40,1471,118],{"class":406},[40,1473,161],{"class":140},[40,1475,1476,1478,1480,1482,1484,1486,1489,1491],{"class":42,"line":107},[40,1477,1371],{"class":140},[40,1479,958],{"class":87},[40,1481,316],{"class":140},[40,1483,963],{"class":183},[40,1485,526],{"class":406},[40,1487,1488],{"class":87},"capacitorPlugin",[40,1490,118],{"class":406},[40,1492,161],{"class":140},[40,1494,1495],{"class":42,"line":489},[40,1496,1497],{"class":46},"  \u002F* Example wires every compliance check the engine exposes:\n",[40,1499,1500],{"class":42,"line":495},[40,1501,1502],{"class":46},"     WCAG 2.1 AA + AAA, APCA Lc targets, and CVD simulation against\n",[40,1504,1505],{"class":42,"line":500},[40,1506,1507],{"class":46},"     protanopia + deuteranopia + tritanopia + achromatopsia. Real\n",[40,1509,1510],{"class":42,"line":506},[40,1511,1512],{"class":46},"     consumers opt in\u002Fout via their own pipeline; the example\n",[40,1514,1515],{"class":42,"line":532},[40,1516,1517],{"class":46},"     demonstrates the maximal-correctness configuration. *\u002F\n",[40,1519,1520,1522,1524,1526,1528],{"class":42,"line":564},[40,1521,1371],{"class":140},[40,1523,958],{"class":87},[40,1525,316],{"class":140},[40,1527,999],{"class":183},[40,1529,1002],{"class":406},[40,1531,1532,1535,1537,1539],{"class":42,"line":574},[40,1533,1534],{"class":140},"    '",[40,1536,1010],{"class":57},[40,1538,158],{"class":140},[40,1540,561],{"class":140},[40,1542,1543,1545,1547,1549],{"class":42,"line":584},[40,1544,1534],{"class":140},[40,1546,1032],{"class":57},[40,1548,158],{"class":140},[40,1550,561],{"class":140},[40,1552,1553,1555,1557,1559],{"class":42,"line":589},[40,1554,1534],{"class":140},[40,1556,1021],{"class":57},[40,1558,158],{"class":140},[40,1560,561],{"class":140},[40,1562,1563,1565,1568,1570],{"class":42,"line":595},[40,1564,1534],{"class":140},[40,1566,1567],{"class":57},"enforce:wcagAA",[40,1569,158],{"class":140},[40,1571,561],{"class":140},[40,1573,1574,1576,1579,1581],{"class":42,"line":601},[40,1575,1534],{"class":140},[40,1577,1578],{"class":57},"enforce:wcagAAA",[40,1580,158],{"class":140},[40,1582,561],{"class":140},[40,1584,1585,1587,1590,1592],{"class":42,"line":607},[40,1586,1534],{"class":140},[40,1588,1589],{"class":57},"enforce:apca",[40,1591,158],{"class":140},[40,1593,561],{"class":140},[40,1595,1596,1598,1601,1603],{"class":42,"line":613},[40,1597,1534],{"class":140},[40,1599,1600],{"class":57},"enforce:cvdSimulate",[40,1602,158],{"class":140},[40,1604,561],{"class":140},[40,1606,1607,1609,1611,1613],{"class":42,"line":619},[40,1608,1534],{"class":140},[40,1610,1054],{"class":57},[40,1612,158],{"class":140},[40,1614,561],{"class":140},[40,1616,1617,1619,1621,1623],{"class":42,"line":1088},[40,1618,1534],{"class":140},[40,1620,354],{"class":57},[40,1622,158],{"class":140},[40,1624,561],{"class":140},[40,1626,1627,1629,1632,1634],{"class":42,"line":1093},[40,1628,1534],{"class":140},[40,1630,1631],{"class":57},"emit:capacitorStatusBar",[40,1633,158],{"class":140},[40,1635,561],{"class":140},[40,1637,1638,1640,1643,1645],{"class":42,"line":1099},[40,1639,1534],{"class":140},[40,1641,1642],{"class":57},"emit:capacitorTheme",[40,1644,158],{"class":140},[40,1646,561],{"class":140},[40,1648,1649,1652],{"class":42,"line":1120},[40,1650,1651],{"class":406},"  ])",[40,1653,161],{"class":140},[40,1655,1656],{"class":42,"line":1140},[40,1657,773],{"class":140},[11,1659,1660,1661,1664,1665,1668,1669,1671,1672,1675],{},"The ",[18,1662,1663],{},"private constructor"," + ",[18,1666,1667],{},"static shared()"," pattern wires the engine once. Each service owns its own ",[18,1670,805],{}," instance and therefore its own isolated ",[18,1673,1674],{},"TaskRegistry",", which matters when multiple services in the same application need different pipeline configurations.",[23,1677,1679],{"id":1678},"from-seed-to-palette","From seed to palette",[11,1681,1682,1683,1685,1686,1689,1690,1692,1693,1695,1696,1699,1700,343,1703,347,1706,1708,1709,1712,1713,1715,1716,1718],{},"Using seed ",[18,1684,1131],{}," (a mid-purple, high chroma) against ",[18,1687,1688],{},"categoryW3cRoleSchema",": ",[18,1691,1010],{}," parses the hex and converts it to OKLCH (approximately L=0.62, C=0.27, H=293). ",[18,1694,1032],{}," assigns it to the ",[18,1697,1698],{},"accent"," role; ",[18,1701,1702],{},"canvas",[18,1704,1705],{},"surface",[18,1707,265],{}," receive the same seed as their only candidate, but their ",[18,1710,1711],{},"lightnessRange"," constraints push them to their range centers during ",[18,1714,1021],{},"'s second pass. ",[18,1717,1567],{}," then checks all four contrast pairs in the schema and nudges foreground roles until each pair meets 4.5:1 (text) or 3.0:1 (border).",[11,1720,1721,1723,1724,1727,1728,1731,1732,1735,1736,1739,1740,1743,1744,1747,1748,1723,1750,347,1753,1723,1755,316],{},[18,1722,354],{}," writes ",[18,1725,1726],{},"state.outputs['stylesheet:cssVars']"," with three shapes: ",[18,1729,1730],{},"full"," (a single CSS string with all custom properties), ",[18,1733,1734],{},"scopedBlock"," (a scoped ",[18,1737,1738],{},"[data-category=\"music\"] { ... }"," block), and ",[18,1741,1742],{},"map"," (a ",[18,1745,1746],{},"Record\u003Cstring, string>"," of property name to value). ",[18,1749,1631],{},[18,1751,1752],{},"state.outputs['capacitor:statusBar']",[18,1754,1642],{},[18,1756,1757],{},"state.outputs['capacitor:theme']",[23,1759,1761],{"id":1760},"applying-css-variables-dynamically","Applying CSS variables dynamically",[31,1763,1765],{"className":127,"code":1764,"language":129,"meta":36,"style":36},"async apply(category: string, seed: string): Promise\u003C{\n  readonly cssVars:   CssVarsOutputInterfaceType;\n  readonly statusBar: StatusBarOutputInterface;\n}> {\n  const state = await this.engine.run({\n    'colors':   [seed],\n    'roles':    categoryW3cRoleSchema,\n    'contrast': { 'level': 'AA', 'algorithm': 'wcag21' },\n    'metadata': {\n      'category':     category,\n      'cssVarPrefix': '--c-',\n      'scopeAttr':    'data-category',\n      'scopePrefix':  'category',\n      'themeName':    category,\n    },\n  });\n  const cssVars   = state.outputs['stylesheet:cssVars'] as CssVarsOutputInterfaceType;\n  const capacitor = state.outputs['capacitor:statusBar'] as StatusBarOutputInterface;\n  const sheetId   = `ce-${category}-styles`;\n  let   sheet     = document.getElementById(sheetId) as HTMLStyleElement | null;\n\n  if (!sheet) {\n    sheet = document.createElement('style');\n    sheet.id = sheetId;\n    document.head.appendChild(sheet);\n  }\n  sheet.textContent = `[data-category=\"${category}\"] {\\n${\n    Object.entries(cssVars.map).map(([k, v]) => `  ${k}: ${v};`).join('\\n')\n  }\\n}`;\n\n  return { 'cssVars': cssVars, 'statusBar': capacitor };\n}\n",[18,1766,1767,1789,1804,1818,1825,1847,1863,1879,1927,1940,1957,1977,1997,2016,2032,2037,2044,2075,2103,2131,2162,2166,2184,2210,2226,2249,2253,2280,2360,2372,2376,2413],{"__ignoreMap":36},[40,1768,1769,1772,1775,1778,1780,1783,1786],{"class":42,"line":43},[40,1770,1771],{"class":87},"async ",[40,1773,1774],{"class":183},"apply",[40,1776,1777],{"class":87},"(category: string",[40,1779,196],{"class":140},[40,1781,1782],{"class":87}," seed: string): ",[40,1784,1785],{"class":53},"Promise",[40,1787,1788],{"class":140},"\u003C{\n",[40,1790,1791,1794,1797,1799,1802],{"class":42,"line":50},[40,1792,1793],{"class":170},"  readonly",[40,1795,1796],{"class":406}," cssVars",[40,1798,410],{"class":140},[40,1800,1801],{"class":53},"   CssVarsOutputInterfaceType",[40,1803,161],{"class":140},[40,1805,1806,1808,1811,1813,1816],{"class":42,"line":64},[40,1807,1793],{"class":170},[40,1809,1810],{"class":406}," statusBar",[40,1812,410],{"class":140},[40,1814,1815],{"class":53}," StatusBarOutputInterface",[40,1817,161],{"class":140},[40,1819,1820,1823],{"class":42,"line":71},[40,1821,1822],{"class":140},"}>",[40,1824,401],{"class":140},[40,1826,1827,1830,1832,1834,1837,1839,1841,1843,1845],{"class":42,"line":77},[40,1828,1829],{"class":87},"  const state ",[40,1831,177],{"class":140},[40,1833,180],{"class":136},[40,1835,1836],{"class":140}," this.",[40,1838,958],{"class":87},[40,1840,316],{"class":140},[40,1842,523],{"class":183},[40,1844,526],{"class":87},[40,1846,529],{"class":140},[40,1848,1849,1851,1854,1856,1858,1861],{"class":42,"line":91},[40,1850,1534],{"class":140},[40,1852,1853],{"class":406},"colors",[40,1855,158],{"class":140},[40,1857,410],{"class":140},[40,1859,1860],{"class":87},"   [seed]",[40,1862,561],{"class":140},[40,1864,1865,1867,1870,1872,1874,1877],{"class":42,"line":99},[40,1866,1534],{"class":140},[40,1868,1869],{"class":406},"roles",[40,1871,158],{"class":140},[40,1873,410],{"class":140},[40,1875,1876],{"class":87},"    categoryW3cRoleSchema",[40,1878,561],{"class":140},[40,1880,1881,1883,1886,1888,1890,1892,1894,1897,1899,1901,1903,1905,1907,1909,1911,1914,1916,1918,1920,1923,1925],{"class":42,"line":107},[40,1882,1534],{"class":140},[40,1884,1885],{"class":406},"contrast",[40,1887,158],{"class":140},[40,1889,410],{"class":140},[40,1891,141],{"class":140},[40,1893,153],{"class":140},[40,1895,1896],{"class":406},"level",[40,1898,158],{"class":140},[40,1900,410],{"class":140},[40,1902,153],{"class":140},[40,1904,1169],{"class":57},[40,1906,158],{"class":140},[40,1908,196],{"class":140},[40,1910,153],{"class":140},[40,1912,1913],{"class":406},"algorithm",[40,1915,158],{"class":140},[40,1917,410],{"class":140},[40,1919,153],{"class":140},[40,1921,1922],{"class":57},"wcag21",[40,1924,158],{"class":140},[40,1926,438],{"class":140},[40,1928,1929,1931,1934,1936,1938],{"class":42,"line":489},[40,1930,1534],{"class":140},[40,1932,1933],{"class":406},"metadata",[40,1935,158],{"class":140},[40,1937,410],{"class":140},[40,1939,401],{"class":140},[40,1941,1942,1945,1948,1950,1952,1955],{"class":42,"line":495},[40,1943,1944],{"class":140},"      '",[40,1946,1947],{"class":406},"category",[40,1949,158],{"class":140},[40,1951,410],{"class":140},[40,1953,1954],{"class":87},"     category",[40,1956,561],{"class":140},[40,1958,1959,1961,1964,1966,1968,1970,1973,1975],{"class":42,"line":500},[40,1960,1944],{"class":140},[40,1962,1963],{"class":406},"cssVarPrefix",[40,1965,158],{"class":140},[40,1967,410],{"class":140},[40,1969,153],{"class":140},[40,1971,1972],{"class":57},"--c-",[40,1974,158],{"class":140},[40,1976,561],{"class":140},[40,1978,1979,1981,1984,1986,1988,1990,1993,1995],{"class":42,"line":506},[40,1980,1944],{"class":140},[40,1982,1983],{"class":406},"scopeAttr",[40,1985,158],{"class":140},[40,1987,410],{"class":140},[40,1989,1534],{"class":140},[40,1991,1992],{"class":57},"data-category",[40,1994,158],{"class":140},[40,1996,561],{"class":140},[40,1998,1999,2001,2004,2006,2008,2010,2012,2014],{"class":42,"line":532},[40,2000,1944],{"class":140},[40,2002,2003],{"class":406},"scopePrefix",[40,2005,158],{"class":140},[40,2007,410],{"class":140},[40,2009,1007],{"class":140},[40,2011,1947],{"class":57},[40,2013,158],{"class":140},[40,2015,561],{"class":140},[40,2017,2018,2020,2023,2025,2027,2030],{"class":42,"line":564},[40,2019,1944],{"class":140},[40,2021,2022],{"class":406},"themeName",[40,2024,158],{"class":140},[40,2026,410],{"class":140},[40,2028,2029],{"class":87},"    category",[40,2031,561],{"class":140},[40,2033,2034],{"class":42,"line":574},[40,2035,2036],{"class":140},"    },\n",[40,2038,2039,2042],{"class":42,"line":584},[40,2040,2041],{"class":140},"  }",[40,2043,696],{"class":87},[40,2045,2046,2049,2051,2054,2056,2058,2060,2062,2064,2067,2070,2073],{"class":42,"line":589},[40,2047,2048],{"class":87},"  const cssVars   ",[40,2050,177],{"class":140},[40,2052,2053],{"class":87}," state",[40,2055,316],{"class":140},[40,2057,1212],{"class":87},[40,2059,158],{"class":140},[40,2061,1217],{"class":57},[40,2063,158],{"class":140},[40,2065,2066],{"class":87},"] ",[40,2068,2069],{"class":136},"as",[40,2071,2072],{"class":53}," CssVarsOutputInterfaceType",[40,2074,161],{"class":87},[40,2076,2077,2080,2082,2084,2086,2088,2090,2093,2095,2097,2099,2101],{"class":42,"line":595},[40,2078,2079],{"class":87},"  const capacitor ",[40,2081,177],{"class":140},[40,2083,2053],{"class":87},[40,2085,316],{"class":140},[40,2087,1212],{"class":87},[40,2089,158],{"class":140},[40,2091,2092],{"class":57},"capacitor:statusBar",[40,2094,158],{"class":140},[40,2096,2066],{"class":87},[40,2098,2069],{"class":136},[40,2100,1815],{"class":53},[40,2102,161],{"class":87},[40,2104,2105,2108,2110,2113,2116,2119,2121,2123,2126,2129],{"class":42,"line":601},[40,2106,2107],{"class":87},"  const sheetId   ",[40,2109,177],{"class":140},[40,2111,2112],{"class":140}," `",[40,2114,2115],{"class":57},"ce-",[40,2117,2118],{"class":140},"${",[40,2120,1947],{"class":87},[40,2122,577],{"class":140},[40,2124,2125],{"class":57},"-styles",[40,2127,2128],{"class":140},"`",[40,2130,161],{"class":87},[40,2132,2133,2136,2138,2141,2143,2146,2149,2151,2154,2157,2160],{"class":42,"line":607},[40,2134,2135],{"class":87},"  let   sheet     ",[40,2137,177],{"class":140},[40,2139,2140],{"class":87}," document",[40,2142,316],{"class":140},[40,2144,2145],{"class":183},"getElementById",[40,2147,2148],{"class":87},"(sheetId) ",[40,2150,2069],{"class":136},[40,2152,2153],{"class":53}," HTMLStyleElement",[40,2155,2156],{"class":140}," |",[40,2158,2159],{"class":53}," null",[40,2161,161],{"class":87},[40,2163,2164],{"class":42,"line":613},[40,2165,68],{"emptyLinePlaceholder":67},[40,2167,2168,2171,2173,2176,2180,2182],{"class":42,"line":619},[40,2169,2170],{"class":406},"  if",[40,2172,918],{"class":140},[40,2174,2175],{"class":87},"!",[40,2177,2179],{"class":2178},"sHdIc","sheet",[40,2181,118],{"class":140},[40,2183,401],{"class":140},[40,2185,2186,2189,2191,2193,2195,2198,2200,2202,2204,2206,2208],{"class":42,"line":1088},[40,2187,2188],{"class":87},"    sheet",[40,2190,1376],{"class":140},[40,2192,2140],{"class":87},[40,2194,316],{"class":140},[40,2196,2197],{"class":183},"createElement",[40,2199,526],{"class":406},[40,2201,158],{"class":140},[40,2203,237],{"class":57},[40,2205,158],{"class":140},[40,2207,118],{"class":406},[40,2209,161],{"class":140},[40,2211,2212,2214,2216,2219,2221,2224],{"class":42,"line":1093},[40,2213,2188],{"class":87},[40,2215,316],{"class":140},[40,2217,2218],{"class":87},"id",[40,2220,1376],{"class":140},[40,2222,2223],{"class":87}," sheetId",[40,2225,161],{"class":140},[40,2227,2228,2231,2233,2236,2238,2241,2243,2245,2247],{"class":42,"line":1099},[40,2229,2230],{"class":87},"    document",[40,2232,316],{"class":140},[40,2234,2235],{"class":87},"head",[40,2237,316],{"class":140},[40,2239,2240],{"class":183},"appendChild",[40,2242,526],{"class":406},[40,2244,2179],{"class":87},[40,2246,118],{"class":406},[40,2248,161],{"class":140},[40,2250,2251],{"class":42,"line":1120},[40,2252,1435],{"class":140},[40,2254,2255,2258,2260,2262,2265,2267,2269,2271,2274,2277],{"class":42,"line":1140},[40,2256,2257],{"class":87},"  sheet.textContent ",[40,2259,177],{"class":140},[40,2261,2112],{"class":140},[40,2263,2264],{"class":57},"[data-category=\"",[40,2266,2118],{"class":140},[40,2268,1947],{"class":87},[40,2270,577],{"class":140},[40,2272,2273],{"class":57},"\"] {",[40,2275,2276],{"class":87},"\\n",[40,2278,2279],{"class":140},"${\n",[40,2281,2282,2285,2287,2290,2293,2295,2298,2300,2302,2304,2306,2309,2311,2314,2316,2319,2321,2324,2326,2328,2330,2332,2335,2337,2340,2342,2344,2346,2349,2351,2353,2355,2357],{"class":42,"line":1152},[40,2283,2284],{"class":87},"    Object",[40,2286,316],{"class":140},[40,2288,2289],{"class":183},"entries",[40,2291,2292],{"class":87},"(cssVars",[40,2294,316],{"class":140},[40,2296,2297],{"class":87},"map)",[40,2299,316],{"class":140},[40,2301,1742],{"class":183},[40,2303,526],{"class":87},[40,2305,186],{"class":140},[40,2307,2308],{"class":2178},"k",[40,2310,196],{"class":140},[40,2312,2313],{"class":2178}," v",[40,2315,1083],{"class":140},[40,2317,2318],{"class":170}," =>",[40,2320,2112],{"class":140},[40,2322,2323],{"class":140},"  ${",[40,2325,2308],{"class":87},[40,2327,577],{"class":140},[40,2329,1689],{"class":57},[40,2331,2118],{"class":140},[40,2333,2334],{"class":87},"v",[40,2336,577],{"class":140},[40,2338,2339],{"class":57},";",[40,2341,2128],{"class":140},[40,2343,118],{"class":87},[40,2345,316],{"class":140},[40,2347,2348],{"class":183},"join",[40,2350,526],{"class":87},[40,2352,158],{"class":140},[40,2354,2276],{"class":87},[40,2356,158],{"class":140},[40,2358,2359],{"class":87},")\n",[40,2361,2362,2364,2366,2368,2370],{"class":42,"line":1176},[40,2363,2041],{"class":140},[40,2365,2276],{"class":87},[40,2367,577],{"class":57},[40,2369,2128],{"class":140},[40,2371,161],{"class":87},[40,2373,2374],{"class":42,"line":1185},[40,2375,68],{"emptyLinePlaceholder":67},[40,2377,2378,2381,2384,2386,2389,2391,2393,2395,2397,2399,2402,2404,2406,2409,2411],{"class":42,"line":1190},[40,2379,2380],{"class":87},"  return ",[40,2382,2383],{"class":140},"{",[40,2385,153],{"class":140},[40,2387,2388],{"class":57},"cssVars",[40,2390,158],{"class":140},[40,2392,1689],{"class":406},[40,2394,2388],{"class":87},[40,2396,196],{"class":140},[40,2398,153],{"class":140},[40,2400,2401],{"class":57},"statusBar",[40,2403,158],{"class":140},[40,2405,1689],{"class":406},[40,2407,2408],{"class":87},"capacitor",[40,2410,147],{"class":140},[40,2412,161],{"class":87},[40,2414,2415],{"class":42,"line":1196},[40,2416,773],{"class":140},[11,2418,2419,2420,2423],{},"Any component that sets ",[18,2421,2422],{},"data-category=\"music\""," on its root element automatically picks up the derived palette via CSS custom property inheritance.",[23,2425,2427],{"id":2426},"vue-3-sfc-integration","Vue 3 SFC integration",[31,2429,2433],{"className":2430,"code":2431,"language":2432,"meta":36,"style":36},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003Cdiv data-category=\"music\" class=\"music-category-view\">\n    \u003Cslot \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup lang=\"ts\">\nimport { onMounted } from 'vue';\nimport { categoryColorService } from '.\u002FcategoryColorService.ts';\n\nonMounted(async () => {\n  await categoryColorService.apply('music', '#8B5CF6');\n});\n\u003C\u002Fscript>\n","vue",[18,2434,2435,2446,2481,2492,2501,2510,2514,2537,2558,2580,2584,2601,2632,2640],{"__ignoreMap":36},[40,2436,2437,2440,2443],{"class":42,"line":43},[40,2438,2439],{"class":140},"\u003C",[40,2441,2442],{"class":406},"template",[40,2444,2445],{"class":140},">\n",[40,2447,2448,2451,2454,2457,2459,2462,2465,2467,2470,2472,2474,2477,2479],{"class":42,"line":50},[40,2449,2450],{"class":140},"  \u003C",[40,2452,2453],{"class":406},"div",[40,2455,2456],{"class":170}," data-category",[40,2458,177],{"class":140},[40,2460,2461],{"class":140},"\"",[40,2463,2464],{"class":57},"music",[40,2466,2461],{"class":140},[40,2468,2469],{"class":170}," class",[40,2471,177],{"class":140},[40,2473,2461],{"class":140},[40,2475,2476],{"class":57},"music-category-view",[40,2478,2461],{"class":140},[40,2480,2445],{"class":140},[40,2482,2483,2486,2489],{"class":42,"line":64},[40,2484,2485],{"class":140},"    \u003C",[40,2487,2488],{"class":406},"slot",[40,2490,2491],{"class":140}," \u002F>\n",[40,2493,2494,2497,2499],{"class":42,"line":71},[40,2495,2496],{"class":140},"  \u003C\u002F",[40,2498,2453],{"class":406},[40,2500,2445],{"class":140},[40,2502,2503,2506,2508],{"class":42,"line":77},[40,2504,2505],{"class":140},"\u003C\u002F",[40,2507,2442],{"class":406},[40,2509,2445],{"class":140},[40,2511,2512],{"class":42,"line":91},[40,2513,68],{"emptyLinePlaceholder":67},[40,2515,2516,2518,2521,2524,2527,2529,2531,2533,2535],{"class":42,"line":99},[40,2517,2439],{"class":140},[40,2519,2520],{"class":406},"script",[40,2522,2523],{"class":170}," setup",[40,2525,2526],{"class":170}," lang",[40,2528,177],{"class":140},[40,2530,2461],{"class":140},[40,2532,129],{"class":57},[40,2534,2461],{"class":140},[40,2536,2445],{"class":140},[40,2538,2539,2541,2543,2546,2548,2550,2552,2554,2556],{"class":42,"line":107},[40,2540,137],{"class":136},[40,2542,141],{"class":140},[40,2544,2545],{"class":87}," onMounted",[40,2547,147],{"class":140},[40,2549,150],{"class":136},[40,2551,153],{"class":140},[40,2553,2432],{"class":57},[40,2555,158],{"class":140},[40,2557,161],{"class":140},[40,2559,2560,2562,2564,2567,2569,2571,2573,2576,2578],{"class":42,"line":489},[40,2561,137],{"class":136},[40,2563,141],{"class":140},[40,2565,2566],{"class":87}," categoryColorService",[40,2568,147],{"class":140},[40,2570,150],{"class":136},[40,2572,153],{"class":140},[40,2574,2575],{"class":57},".\u002FcategoryColorService.ts",[40,2577,158],{"class":140},[40,2579,161],{"class":140},[40,2581,2582],{"class":42,"line":495},[40,2583,68],{"emptyLinePlaceholder":67},[40,2585,2586,2589,2591,2594,2597,2599],{"class":42,"line":500},[40,2587,2588],{"class":183},"onMounted",[40,2590,526],{"class":87},[40,2592,2593],{"class":170},"async",[40,2595,2596],{"class":140}," ()",[40,2598,2318],{"class":170},[40,2600,401],{"class":140},[40,2602,2603,2606,2608,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630],{"class":42,"line":506},[40,2604,2605],{"class":136},"  await",[40,2607,2566],{"class":87},[40,2609,316],{"class":140},[40,2611,1774],{"class":183},[40,2613,526],{"class":406},[40,2615,158],{"class":140},[40,2617,2464],{"class":57},[40,2619,158],{"class":140},[40,2621,196],{"class":140},[40,2623,153],{"class":140},[40,2625,1131],{"class":57},[40,2627,158],{"class":140},[40,2629,118],{"class":406},[40,2631,161],{"class":140},[40,2633,2634,2636,2638],{"class":42,"line":532},[40,2635,577],{"class":140},[40,2637,118],{"class":87},[40,2639,161],{"class":140},[40,2641,2642,2644,2646],{"class":42,"line":564},[40,2643,2505],{"class":140},[40,2645,2520],{"class":406},[40,2647,2445],{"class":140},[31,2649,2651],{"className":127,"code":2650,"language":129,"meta":36,"style":36},"\u002F\u002F Re-skin when the user switches category\nasync function onCategoryChange(category: string, seed: string) {\n  const { statusBar } = await categoryColorService.apply(category, seed);\n  await StatusBar.setBackgroundColor({ color: statusBar.backgroundColor });\n  await StatusBar.setStyle({ style: statusBar.style === 'DARK' ? Style.Dark : Style.Light });\n}\n",[18,2652,2653,2658,2690,2723,2757,2820],{"__ignoreMap":36},[40,2654,2655],{"class":42,"line":43},[40,2656,2657],{"class":46},"\u002F\u002F Re-skin when the user switches category\n",[40,2659,2660,2662,2665,2668,2670,2672,2674,2677,2679,2682,2684,2686,2688],{"class":42,"line":50},[40,2661,2593],{"class":170},[40,2663,2664],{"class":170}," function",[40,2666,2667],{"class":183}," onCategoryChange",[40,2669,526],{"class":140},[40,2671,1947],{"class":2178},[40,2673,410],{"class":140},[40,2675,2676],{"class":53}," string",[40,2678,196],{"class":140},[40,2680,2681],{"class":2178}," seed",[40,2683,410],{"class":140},[40,2685,2676],{"class":53},[40,2687,118],{"class":140},[40,2689,401],{"class":140},[40,2691,2692,2695,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721],{"class":42,"line":64},[40,2693,2694],{"class":170},"  const",[40,2696,141],{"class":140},[40,2698,1810],{"class":87},[40,2700,147],{"class":140},[40,2702,1376],{"class":140},[40,2704,180],{"class":136},[40,2706,2566],{"class":87},[40,2708,316],{"class":140},[40,2710,1774],{"class":183},[40,2712,526],{"class":406},[40,2714,1947],{"class":87},[40,2716,196],{"class":140},[40,2718,2681],{"class":87},[40,2720,118],{"class":406},[40,2722,161],{"class":140},[40,2724,2725,2727,2730,2732,2735,2737,2739,2742,2744,2746,2748,2751,2753,2755],{"class":42,"line":71},[40,2726,2605],{"class":136},[40,2728,2729],{"class":87}," StatusBar",[40,2731,316],{"class":140},[40,2733,2734],{"class":183},"setBackgroundColor",[40,2736,526],{"class":406},[40,2738,2383],{"class":140},[40,2740,2741],{"class":406}," color",[40,2743,410],{"class":140},[40,2745,1810],{"class":87},[40,2747,316],{"class":140},[40,2749,2750],{"class":87},"backgroundColor",[40,2752,147],{"class":140},[40,2754,118],{"class":406},[40,2756,161],{"class":140},[40,2758,2759,2761,2763,2765,2768,2770,2772,2775,2777,2779,2781,2783,2786,2788,2791,2793,2796,2799,2801,2804,2807,2809,2811,2814,2816,2818],{"class":42,"line":77},[40,2760,2605],{"class":136},[40,2762,2729],{"class":87},[40,2764,316],{"class":140},[40,2766,2767],{"class":183},"setStyle",[40,2769,526],{"class":406},[40,2771,2383],{"class":140},[40,2773,2774],{"class":406}," style",[40,2776,410],{"class":140},[40,2778,1810],{"class":87},[40,2780,316],{"class":140},[40,2782,237],{"class":87},[40,2784,2785],{"class":140}," ===",[40,2787,153],{"class":140},[40,2789,2790],{"class":57},"DARK",[40,2792,158],{"class":140},[40,2794,2795],{"class":140}," ?",[40,2797,2798],{"class":87}," Style",[40,2800,316],{"class":140},[40,2802,2803],{"class":87},"Dark",[40,2805,2806],{"class":140}," :",[40,2808,2798],{"class":87},[40,2810,316],{"class":140},[40,2812,2813],{"class":87},"Light",[40,2815,147],{"class":140},[40,2817,118],{"class":406},[40,2819,161],{"class":140},[40,2821,2822],{"class":42,"line":91},[40,2823,773],{"class":140},[11,2825,1660,2826,2828,2829,2832,2833,2835,2836,2839,2840,918,2843,231,2846,2849,2850,2852],{},[18,2827,1631],{}," task writes ",[18,2830,2831],{},"state.outputs['capacitor:statusBar'].backgroundColor"," (the resolved ",[18,2834,1705],{},"\u002F",[18,2837,2838],{},"topBar"," role hex) and ",[18,2841,2842],{},".style",[18,2844,2845],{},"'DARK'",[18,2847,2848],{},"'LIGHT'"," depending on background luminance) — pass these directly to the Capacitor ",[18,2851,1330],{}," plugin.",[11,2854,2855,2856,2859,2860,2862,2863,2867],{},"In v1, iridis re-derives one category palette per call; calling ",[18,2857,2858],{},"apply()"," for different categories in sequence is supported, and multiple categories can coexist in the DOM simultaneously as long as they use distinct ",[18,2861,1992],{}," values. Full living-color animation (smooth palette morphing between categories) is a v2 concern — see the ",[1296,2864,2866],{"href":2865},"#roadmap-living-color","Roadmap section"," of the architecture page.",[237,2869,2870],{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":36,"searchDepth":50,"depth":50,"links":2872},[2873,2874,2875],{"id":1678,"depth":50,"text":1679},{"id":1760,"depth":50,"text":1761},{"id":2426,"depth":50,"text":2427},"A worked example wiring Iridis into a Vue 3 + Capacitor app for per-category dynamic palettes.",{},"\u002F05-recipe-vue-capacitor",{"title":1318,"description":2876},"05-recipe-vue-capacitor","t0tR9uSXJZQFZC3ATQo1-sbikzeOS1XmE0CZHJAygJI",{"id":2883,"title":2884,"body":2885,"description":3074,"extension":246,"meta":3075,"navigation":67,"path":3076,"seo":3077,"stem":3078,"__hash__":3079},"docs\u002F06-plugin-ecosystem.md","6. Plugin Ecosystem",{"type":8,"value":2886,"toc":3071},[2887,2894,2958,2968,2972,2979,3068],[11,2888,2889,2890,2893],{},"A plugin is any object that satisfies ",[18,2891,2892],{},"PluginInterface"," by providing a collection of tasks.",[31,2895,2897],{"className":127,"code":2896,"language":129,"meta":36,"style":36},"interface PluginInterface {\n  readonly name:    string;\n  readonly version: string;\n  tasks(): readonly TaskInterface[];\n}\n",[18,2898,2899,2909,2922,2935,2954],{"__ignoreMap":36},[40,2900,2901,2904,2907],{"class":42,"line":43},[40,2902,2903],{"class":170},"interface",[40,2905,2906],{"class":53}," PluginInterface",[40,2908,401],{"class":140},[40,2910,2911,2913,2915,2917,2920],{"class":42,"line":50},[40,2912,1793],{"class":170},[40,2914,421],{"class":406},[40,2916,410],{"class":140},[40,2918,2919],{"class":53},"    string",[40,2921,161],{"class":140},[40,2923,2924,2926,2929,2931,2933],{"class":42,"line":64},[40,2925,1793],{"class":170},[40,2927,2928],{"class":406}," version",[40,2930,410],{"class":140},[40,2932,2676],{"class":53},[40,2934,161],{"class":140},[40,2936,2937,2940,2943,2946,2949,2952],{"class":42,"line":71},[40,2938,2939],{"class":406},"  tasks",[40,2941,2942],{"class":140},"():",[40,2944,2945],{"class":170}," readonly",[40,2947,2948],{"class":53}," TaskInterface",[40,2950,2951],{"class":87},"[]",[40,2953,161],{"class":140},[40,2955,2956],{"class":42,"line":77},[40,2957,773],{"class":140},[11,2959,2960,2961,2964,2965,2967],{},"When you call ",[18,2962,2963],{},"engine.adopt(plugin)",", iridis registers all of the plugin's tasks into the engine's ",[18,2966,1674],{}," in one call.",[23,2969,2971],{"id":2970},"official-plugins","Official Plugins",[11,2973,2974,2975,2978],{},"iridis ships with an ecosystem of plugins designed to format the resolved palette into consumer-ready code. Each is published as a separate ",[18,2976,2977],{},"@studnicky\u002Firidis-*"," package:",[2980,2981,2982,2992,3005,3014,3024,3033,3039,3052,3062],"ul",{},[2983,2984,2985,2987,2988,2991],"li",{},[18,2986,358],{},": Emits generic CSS custom properties (",[18,2989,2990],{},"--c-primary: #...",").",[2983,2993,2994,2997,2998,231,3001,3004],{},[18,2995,2996],{},"@studnicky\u002Firidis-tailwind",": Emits a Tailwind CSS ",[18,2999,3000],{},"tailwind.config.js",[18,3002,3003],{},"theme()"," compatible object.",[2983,3006,3007,3009,3010,3013],{},[18,3008,878],{},": Emits CSS variables specifically structured for ",[18,3011,3012],{},"shadcn\u002Fui"," integration.",[2983,3015,3016,3019,3020,3023],{},[18,3017,3018],{},"@studnicky\u002Firidis-mui",": Emits a Material UI ",[18,3021,3022],{},"createTheme()"," compatible palette object.",[2983,3025,3026,3029,3030,316],{},[18,3027,3028],{},"@studnicky\u002Firidis-chakra",": Emits Chakra UI color tokens for ",[18,3031,3032],{},"extendTheme()",[2983,3034,3035,3038],{},[18,3036,3037],{},"@studnicky\u002Firidis-panda",": Emits Panda CSS token configuration.",[2983,3040,3041,3044,3045,343,3048,3051],{},[18,3042,3043],{},"@studnicky\u002Firidis-vscode",": Derives a full VS Code theme JSON (",[18,3046,3047],{},"tokenColors",[18,3049,3050],{},"semanticTokenColors",", and workbench UI elements).",[2983,3053,3054,3057,3058,3061],{},[18,3055,3056],{},"@studnicky\u002Firidis-capacitor",": Emits native status bar colors, splash screen config, and Android ",[18,3059,3060],{},"theme.xml"," for Capacitor mobile apps.",[2983,3063,3064,3067],{},[18,3065,3066],{},"@studnicky\u002Firidis-rdf",": Emits the palette as an RDF\u002FOWL semantic graph.",[237,3069,3070],{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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);}",{"title":36,"searchDepth":50,"depth":50,"links":3072},[3073],{"id":2970,"depth":50,"text":2971},"Extend iridis with framework-specific output formats.",{},"\u002F06-plugin-ecosystem",{"title":2884,"description":3074},"06-plugin-ecosystem","um4oL3ddZ5tyYEIPzMAtQO8-0F0G8uJsdVe_KLRBWpU",{"id":3081,"title":3082,"body":3083,"description":5279,"extension":246,"meta":5280,"navigation":67,"path":5281,"seo":5282,"stem":5283,"__hash__":5284},"docs\u002F07-cli-usage.md","7. CLI Usage",{"type":8,"value":3084,"toc":5274},[3085,3091,3118,3121,3125,3141,3147,3162,3166,3184,3577,3593,3596,5110,5114,5182,5264,5271],[11,3086,3087,3088,3090],{},"You don't have to write Node.js scripts to use iridis. The ",[18,3089,1270],{}," package allows you to run the engine directly from your terminal using a JSON configuration file.",[31,3092,3094],{"className":33,"code":3093,"language":35,"meta":36,"style":36},"npm install -g @studnicky\u002Firidis-cli\n\niridis .\u002Fpalette.config.json\n",[18,3095,3096,3108,3112],{"__ignoreMap":36},[40,3097,3098,3100,3102,3105],{"class":42,"line":43},[40,3099,54],{"class":53},[40,3101,58],{"class":57},[40,3103,3104],{"class":57}," -g",[40,3106,3107],{"class":57}," @studnicky\u002Firidis-cli\n",[40,3109,3110],{"class":42,"line":50},[40,3111,68],{"emptyLinePlaceholder":67},[40,3113,3114,3116],{"class":42,"line":64},[40,3115,1285],{"class":53},[40,3117,1288],{"class":57},[11,3119,3120],{},"The CLI dynamically imports and runs the plugins defined in your configuration file. This makes it perfect for integrating into CI\u002FCD pipelines, build scripts, or code generation workflows.",[23,3122,3124],{"id":3123},"install","Install",[31,3126,3128],{"className":33,"code":3127,"language":35,"meta":36,"style":36},"npm install --save-dev @studnicky\u002Firidis-cli\n",[18,3129,3130],{"__ignoreMap":36},[40,3131,3132,3134,3136,3139],{"class":42,"line":43},[40,3133,54],{"class":53},[40,3135,58],{"class":57},[40,3137,3138],{"class":57}," --save-dev",[40,3140,3107],{"class":57},[11,3142,3143,3144,3146],{},"The CLI package declares the core engine as a peer dependency; install the plugins you need alongside it. Once installed, the ",[18,3145,1285],{}," binary is available as an npm script command:",[31,3148,3150],{"className":33,"code":3149,"language":35,"meta":36,"style":36},"npx iridis .\u002Fpalette.config.json\n",[18,3151,3152],{"__ignoreMap":36},[40,3153,3154,3157,3160],{"class":42,"line":43},[40,3155,3156],{"class":53},"npx",[40,3158,3159],{"class":57}," iridis",[40,3161,1288],{"class":57},[23,3163,3165],{"id":3164},"config-file-shape","Config file shape",[11,3167,3168,3169,918,3172,3175,3176,343,3179,347,3181,316],{},"The config is a plain JSON file validated against ",[18,3170,3171],{},"CliConfigSchema",[18,3173,3174],{},"packages\u002Fcli\u002Fsrc\u002FCliConfigSchema.ts","). Three top-level fields are required: ",[18,3177,3178],{},"input",[18,3180,999],{},[18,3182,3183],{},"output",[31,3185,3189],{"className":3186,"code":3187,"language":3188,"meta":36,"style":36},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"input\": {\n    \"colors\":   [\"#8B5CF6\"],\n    \"contrast\": { \"level\": \"AA\", \"algorithm\": \"wcag21\" },\n    \"roles\":    { \u002F* RoleSchemaInterface inline *\u002F },\n    \"metadata\": { \"cssVarPrefix\": \"--c-\" }\n  },\n  \"enableContrast\":   true,\n  \"enableStylesheet\": true,\n  \"enableCapacitor\":  false,\n  \"enableVscode\":     false,\n  \"enableTailwind\":   false,\n  \"enableImage\":      false,\n  \"enableRdf\":        false,\n  \"pipeline\": [\n    \"intake:any\",\n    \"resolve:roles\",\n    \"expand:family\",\n    \"enforce:wcagAA\",\n    \"derive:variant\",\n    \"emit:cssVars\"\n  ],\n  \"output\": {\n    \"directory\": \".\u002Fout\",\n    \"files\": {\n      \"stylesheet:cssVars\": \"palette.css\"\n    }\n  }\n}\n","json",[18,3190,3191,3195,3208,3231,3277,3294,3322,3327,3341,3355,3369,3383,3397,3411,3425,3437,3447,3457,3467,3477,3487,3496,3501,3513,3533,3546,3564,3569,3573],{"__ignoreMap":36},[40,3192,3193],{"class":42,"line":43},[40,3194,529],{"class":140},[40,3196,3197,3200,3202,3204,3206],{"class":42,"line":50},[40,3198,3199],{"class":140},"  \"",[40,3201,3178],{"class":170},[40,3203,2461],{"class":140},[40,3205,410],{"class":140},[40,3207,401],{"class":140},[40,3209,3210,3213,3215,3217,3219,3222,3224,3226,3228],{"class":42,"line":64},[40,3211,3212],{"class":140},"    \"",[40,3214,1853],{"class":53},[40,3216,2461],{"class":140},[40,3218,410],{"class":140},[40,3220,3221],{"class":140},"   [",[40,3223,2461],{"class":140},[40,3225,1131],{"class":57},[40,3227,2461],{"class":140},[40,3229,3230],{"class":140},"],\n",[40,3232,3233,3235,3237,3239,3241,3243,3246,3249,3251,3253,3255,3257,3259,3261,3263,3265,3267,3269,3271,3273,3275],{"class":42,"line":71},[40,3234,3212],{"class":140},[40,3236,1885],{"class":53},[40,3238,2461],{"class":140},[40,3240,410],{"class":140},[40,3242,141],{"class":140},[40,3244,3245],{"class":140}," \"",[40,3247,1896],{"class":3248},"sbssI",[40,3250,2461],{"class":140},[40,3252,410],{"class":140},[40,3254,3245],{"class":140},[40,3256,1169],{"class":57},[40,3258,2461],{"class":140},[40,3260,196],{"class":140},[40,3262,3245],{"class":140},[40,3264,1913],{"class":3248},[40,3266,2461],{"class":140},[40,3268,410],{"class":140},[40,3270,3245],{"class":140},[40,3272,1922],{"class":57},[40,3274,2461],{"class":140},[40,3276,438],{"class":140},[40,3278,3279,3281,3283,3285,3287,3289,3292],{"class":42,"line":77},[40,3280,3212],{"class":140},[40,3282,1869],{"class":53},[40,3284,2461],{"class":140},[40,3286,410],{"class":140},[40,3288,418],{"class":140},[40,3290,3291],{"class":46}," \u002F* RoleSchemaInterface inline *\u002F",[40,3293,438],{"class":140},[40,3295,3296,3298,3300,3302,3304,3306,3308,3310,3312,3314,3316,3318,3320],{"class":42,"line":91},[40,3297,3212],{"class":140},[40,3299,1933],{"class":53},[40,3301,2461],{"class":140},[40,3303,410],{"class":140},[40,3305,141],{"class":140},[40,3307,3245],{"class":140},[40,3309,1963],{"class":3248},[40,3311,2461],{"class":140},[40,3313,410],{"class":140},[40,3315,3245],{"class":140},[40,3317,1972],{"class":57},[40,3319,2461],{"class":140},[40,3321,481],{"class":140},[40,3323,3324],{"class":42,"line":99},[40,3325,3326],{"class":140},"  },\n",[40,3328,3329,3331,3334,3336,3338],{"class":42,"line":107},[40,3330,3199],{"class":140},[40,3332,3333],{"class":170},"enableContrast",[40,3335,2461],{"class":140},[40,3337,410],{"class":140},[40,3339,3340],{"class":140},"   true,\n",[40,3342,3343,3345,3348,3350,3352],{"class":42,"line":489},[40,3344,3199],{"class":140},[40,3346,3347],{"class":170},"enableStylesheet",[40,3349,2461],{"class":140},[40,3351,410],{"class":140},[40,3353,3354],{"class":140}," true,\n",[40,3356,3357,3359,3362,3364,3366],{"class":42,"line":495},[40,3358,3199],{"class":140},[40,3360,3361],{"class":170},"enableCapacitor",[40,3363,2461],{"class":140},[40,3365,410],{"class":140},[40,3367,3368],{"class":140},"  false,\n",[40,3370,3371,3373,3376,3378,3380],{"class":42,"line":500},[40,3372,3199],{"class":140},[40,3374,3375],{"class":170},"enableVscode",[40,3377,2461],{"class":140},[40,3379,410],{"class":140},[40,3381,3382],{"class":140},"     false,\n",[40,3384,3385,3387,3390,3392,3394],{"class":42,"line":506},[40,3386,3199],{"class":140},[40,3388,3389],{"class":170},"enableTailwind",[40,3391,2461],{"class":140},[40,3393,410],{"class":140},[40,3395,3396],{"class":140},"   false,\n",[40,3398,3399,3401,3404,3406,3408],{"class":42,"line":532},[40,3400,3199],{"class":140},[40,3402,3403],{"class":170},"enableImage",[40,3405,2461],{"class":140},[40,3407,410],{"class":140},[40,3409,3410],{"class":140},"      false,\n",[40,3412,3413,3415,3418,3420,3422],{"class":42,"line":564},[40,3414,3199],{"class":140},[40,3416,3417],{"class":170},"enableRdf",[40,3419,2461],{"class":140},[40,3421,410],{"class":140},[40,3423,3424],{"class":140},"        false,\n",[40,3426,3427,3429,3431,3433,3435],{"class":42,"line":574},[40,3428,3199],{"class":140},[40,3430,999],{"class":170},[40,3432,2461],{"class":140},[40,3434,410],{"class":140},[40,3436,413],{"class":140},[40,3438,3439,3441,3443,3445],{"class":42,"line":584},[40,3440,3212],{"class":140},[40,3442,1010],{"class":57},[40,3444,2461],{"class":140},[40,3446,561],{"class":140},[40,3448,3449,3451,3453,3455],{"class":42,"line":589},[40,3450,3212],{"class":140},[40,3452,1032],{"class":57},[40,3454,2461],{"class":140},[40,3456,561],{"class":140},[40,3458,3459,3461,3463,3465],{"class":42,"line":595},[40,3460,3212],{"class":140},[40,3462,1021],{"class":57},[40,3464,2461],{"class":140},[40,3466,561],{"class":140},[40,3468,3469,3471,3473,3475],{"class":42,"line":601},[40,3470,3212],{"class":140},[40,3472,1567],{"class":57},[40,3474,2461],{"class":140},[40,3476,561],{"class":140},[40,3478,3479,3481,3483,3485],{"class":42,"line":607},[40,3480,3212],{"class":140},[40,3482,1054],{"class":57},[40,3484,2461],{"class":140},[40,3486,561],{"class":140},[40,3488,3489,3491,3493],{"class":42,"line":613},[40,3490,3212],{"class":140},[40,3492,354],{"class":57},[40,3494,3495],{"class":140},"\"\n",[40,3497,3498],{"class":42,"line":619},[40,3499,3500],{"class":140},"  ],\n",[40,3502,3503,3505,3507,3509,3511],{"class":42,"line":1088},[40,3504,3199],{"class":140},[40,3506,3183],{"class":170},[40,3508,2461],{"class":140},[40,3510,410],{"class":140},[40,3512,401],{"class":140},[40,3514,3515,3517,3520,3522,3524,3526,3529,3531],{"class":42,"line":1093},[40,3516,3212],{"class":140},[40,3518,3519],{"class":53},"directory",[40,3521,2461],{"class":140},[40,3523,410],{"class":140},[40,3525,3245],{"class":140},[40,3527,3528],{"class":57},".\u002Fout",[40,3530,2461],{"class":140},[40,3532,561],{"class":140},[40,3534,3535,3537,3540,3542,3544],{"class":42,"line":1099},[40,3536,3212],{"class":140},[40,3538,3539],{"class":53},"files",[40,3541,2461],{"class":140},[40,3543,410],{"class":140},[40,3545,401],{"class":140},[40,3547,3548,3551,3553,3555,3557,3559,3562],{"class":42,"line":1120},[40,3549,3550],{"class":140},"      \"",[40,3552,1217],{"class":3248},[40,3554,2461],{"class":140},[40,3556,410],{"class":140},[40,3558,3245],{"class":140},[40,3560,3561],{"class":57},"palette.css",[40,3563,3495],{"class":140},[40,3565,3566],{"class":42,"line":1140},[40,3567,3568],{"class":140},"    }\n",[40,3570,3571],{"class":42,"line":1152},[40,3572,1435],{"class":140},[40,3574,3575],{"class":42,"line":1176},[40,3576,773],{"class":140},[11,3578,1660,3579,3581,3582,3585,3586,3588,3589,3592],{},[18,3580,1274],{}," flags control which plugin packages are dynamically imported. Only flags set to ",[18,3583,3584],{},"true"," trigger an import, and the corresponding package must already be installed, the CLI does not install dependencies on your behalf. The ",[18,3587,999],{}," array maps directly to ",[18,3590,3591],{},"engine.pipeline()"," in the library API; task names must be registered by either the core task set or one of the adopted plugins.",[11,3594,3595],{},"A full worked config that enables the Contrast and Capacitor plugins together:",[31,3597,3599],{"className":3186,"code":3598,"language":3188,"meta":36,"style":36},"{\n  \"input\": {\n    \"colors\": [\"#8B5CF6\"],\n    \"contrast\": { \"level\": \"AA\", \"algorithm\": \"wcag21\" },\n    \"metadata\": {\n      \"category\":     \"music\",\n      \"cssVarPrefix\": \"--c-\",\n      \"scopeAttr\":    \"data-category\",\n      \"scopePrefix\":  \"category\",\n      \"themeName\":    \"music\"\n    },\n    \"roles\": {\n      \"name\": \"category-w3c\",\n      \"description\": \"WCAG 2.1 AA role schema for category colour palettes\",\n      \"roles\": [\n        {\n          \"name\":           \"canvas\",\n          \"description\":    \"Page \u002F card background\",\n          \"intent\":         \"background\",\n          \"required\":       true,\n          \"lightnessRange\": [0.92, 1.0]\n        },\n        {\n          \"name\":           \"surface\",\n          \"description\":    \"Elevated surface (modal, sheet)\",\n          \"intent\":         \"background\",\n          \"required\":       true,\n          \"lightnessRange\": [0.86, 0.96]\n        },\n        {\n          \"name\":           \"accent\",\n          \"description\":    \"Primary interactive \u002F brand colour\",\n          \"intent\":         \"accent\",\n          \"required\":       true\n        },\n        {\n          \"name\":           \"onAccent\",\n          \"description\":    \"Text \u002F icons placed on accent\",\n          \"intent\":         \"text\",\n          \"required\":       true,\n          \"derivedFrom\":    \"accent\",\n          \"lightnessRange\": [0.98, 1.0]\n        },\n        {\n          \"name\":           \"border\",\n          \"description\":    \"Dividers and focus rings\",\n          \"intent\":         \"muted\",\n          \"lightnessRange\": [0.60, 0.80]\n        },\n        {\n          \"name\":           \"muted\",\n          \"description\":    \"Secondary \u002F de-emphasised text\",\n          \"intent\":         \"muted\",\n          \"lightnessRange\": [0.45, 0.65]\n        },\n        {\n          \"name\":           \"text\",\n          \"description\":    \"Primary body text\",\n          \"intent\":         \"text\",\n          \"required\":       true,\n          \"lightnessRange\": [0.10, 0.25]\n        }\n      ],\n      \"contrastPairs\": [\n        { \"foreground\": \"text\",     \"background\": \"canvas\",  \"minRatio\": 4.5, \"algorithm\": \"wcag21\" },\n        { \"foreground\": \"text\",     \"background\": \"surface\", \"minRatio\": 4.5, \"algorithm\": \"wcag21\" },\n        { \"foreground\": \"onAccent\", \"background\": \"accent\",  \"minRatio\": 4.5, \"algorithm\": \"wcag21\" },\n        { \"foreground\": \"border\",   \"background\": \"canvas\",  \"minRatio\": 3.0, \"algorithm\": \"wcag21\" }\n      ]\n    }\n  },\n  \"enableContrast\":   true,\n  \"enableStylesheet\": true,\n  \"enableCapacitor\":  true,\n  \"pipeline\": [\n    \"intake:any\",\n    \"resolve:roles\",\n    \"expand:family\",\n    \"enforce:wcagAA\",\n    \"derive:variant\",\n    \"emit:cssVars\",\n    \"emit:capacitorStatusBar\",\n    \"emit:capacitorTheme\"\n  ],\n  \"output\": {\n    \"directory\": \".\u002Fout\",\n    \"files\": {\n      \"stylesheet:cssVars\":  \"music.css\",\n      \"capacitor:statusBar\": \"music-statusbar.json\",\n      \"capacitor:theme\":     \"music-theme.json\"\n    }\n  }\n}\n",[18,3600,3601,3605,3617,3637,3681,3693,3712,3730,3748,3766,3782,3786,3798,3818,3838,3850,3855,3875,3894,3914,3928,3951,3956,3960,3978,3997,4015,4027,4049,4053,4057,4075,4094,4113,4127,4132,4137,4157,4177,4196,4209,4229,4251,4256,4261,4281,4301,4321,4344,4349,4354,4373,4393,4412,4435,4440,4445,4464,4484,4503,4516,4539,4545,4551,4565,4634,4699,4764,4831,4837,4842,4847,4860,4873,4887,4900,4911,4922,4933,4944,4955,4966,4977,4986,4991,5004,5023,5036,5056,5076,5095,5100,5105],{"__ignoreMap":36},[40,3602,3603],{"class":42,"line":43},[40,3604,529],{"class":140},[40,3606,3607,3609,3611,3613,3615],{"class":42,"line":50},[40,3608,3199],{"class":140},[40,3610,3178],{"class":170},[40,3612,2461],{"class":140},[40,3614,410],{"class":140},[40,3616,401],{"class":140},[40,3618,3619,3621,3623,3625,3627,3629,3631,3633,3635],{"class":42,"line":64},[40,3620,3212],{"class":140},[40,3622,1853],{"class":53},[40,3624,2461],{"class":140},[40,3626,410],{"class":140},[40,3628,540],{"class":140},[40,3630,2461],{"class":140},[40,3632,1131],{"class":57},[40,3634,2461],{"class":140},[40,3636,3230],{"class":140},[40,3638,3639,3641,3643,3645,3647,3649,3651,3653,3655,3657,3659,3661,3663,3665,3667,3669,3671,3673,3675,3677,3679],{"class":42,"line":71},[40,3640,3212],{"class":140},[40,3642,1885],{"class":53},[40,3644,2461],{"class":140},[40,3646,410],{"class":140},[40,3648,141],{"class":140},[40,3650,3245],{"class":140},[40,3652,1896],{"class":3248},[40,3654,2461],{"class":140},[40,3656,410],{"class":140},[40,3658,3245],{"class":140},[40,3660,1169],{"class":57},[40,3662,2461],{"class":140},[40,3664,196],{"class":140},[40,3666,3245],{"class":140},[40,3668,1913],{"class":3248},[40,3670,2461],{"class":140},[40,3672,410],{"class":140},[40,3674,3245],{"class":140},[40,3676,1922],{"class":57},[40,3678,2461],{"class":140},[40,3680,438],{"class":140},[40,3682,3683,3685,3687,3689,3691],{"class":42,"line":77},[40,3684,3212],{"class":140},[40,3686,1933],{"class":53},[40,3688,2461],{"class":140},[40,3690,410],{"class":140},[40,3692,401],{"class":140},[40,3694,3695,3697,3699,3701,3703,3706,3708,3710],{"class":42,"line":91},[40,3696,3550],{"class":140},[40,3698,1947],{"class":3248},[40,3700,2461],{"class":140},[40,3702,410],{"class":140},[40,3704,3705],{"class":140},"     \"",[40,3707,2464],{"class":57},[40,3709,2461],{"class":140},[40,3711,561],{"class":140},[40,3713,3714,3716,3718,3720,3722,3724,3726,3728],{"class":42,"line":99},[40,3715,3550],{"class":140},[40,3717,1963],{"class":3248},[40,3719,2461],{"class":140},[40,3721,410],{"class":140},[40,3723,3245],{"class":140},[40,3725,1972],{"class":57},[40,3727,2461],{"class":140},[40,3729,561],{"class":140},[40,3731,3732,3734,3736,3738,3740,3742,3744,3746],{"class":42,"line":107},[40,3733,3550],{"class":140},[40,3735,1983],{"class":3248},[40,3737,2461],{"class":140},[40,3739,410],{"class":140},[40,3741,3212],{"class":140},[40,3743,1992],{"class":57},[40,3745,2461],{"class":140},[40,3747,561],{"class":140},[40,3749,3750,3752,3754,3756,3758,3760,3762,3764],{"class":42,"line":489},[40,3751,3550],{"class":140},[40,3753,2003],{"class":3248},[40,3755,2461],{"class":140},[40,3757,410],{"class":140},[40,3759,3199],{"class":140},[40,3761,1947],{"class":57},[40,3763,2461],{"class":140},[40,3765,561],{"class":140},[40,3767,3768,3770,3772,3774,3776,3778,3780],{"class":42,"line":495},[40,3769,3550],{"class":140},[40,3771,2022],{"class":3248},[40,3773,2461],{"class":140},[40,3775,410],{"class":140},[40,3777,3212],{"class":140},[40,3779,2464],{"class":57},[40,3781,3495],{"class":140},[40,3783,3784],{"class":42,"line":500},[40,3785,2036],{"class":140},[40,3787,3788,3790,3792,3794,3796],{"class":42,"line":506},[40,3789,3212],{"class":140},[40,3791,1869],{"class":53},[40,3793,2461],{"class":140},[40,3795,410],{"class":140},[40,3797,401],{"class":140},[40,3799,3800,3802,3805,3807,3809,3811,3814,3816],{"class":42,"line":532},[40,3801,3550],{"class":140},[40,3803,3804],{"class":3248},"name",[40,3806,2461],{"class":140},[40,3808,410],{"class":140},[40,3810,3245],{"class":140},[40,3812,3813],{"class":57},"category-w3c",[40,3815,2461],{"class":140},[40,3817,561],{"class":140},[40,3819,3820,3822,3825,3827,3829,3831,3834,3836],{"class":42,"line":564},[40,3821,3550],{"class":140},[40,3823,3824],{"class":3248},"description",[40,3826,2461],{"class":140},[40,3828,410],{"class":140},[40,3830,3245],{"class":140},[40,3832,3833],{"class":57},"WCAG 2.1 AA role schema for category colour palettes",[40,3835,2461],{"class":140},[40,3837,561],{"class":140},[40,3839,3840,3842,3844,3846,3848],{"class":42,"line":574},[40,3841,3550],{"class":140},[40,3843,1869],{"class":3248},[40,3845,2461],{"class":140},[40,3847,410],{"class":140},[40,3849,413],{"class":140},[40,3851,3852],{"class":42,"line":584},[40,3853,3854],{"class":140},"        {\n",[40,3856,3857,3860,3862,3864,3866,3869,3871,3873],{"class":42,"line":589},[40,3858,3859],{"class":140},"          \"",[40,3861,3804],{"class":406},[40,3863,2461],{"class":140},[40,3865,410],{"class":140},[40,3867,3868],{"class":140},"           \"",[40,3870,1702],{"class":57},[40,3872,2461],{"class":140},[40,3874,561],{"class":140},[40,3876,3877,3879,3881,3883,3885,3887,3890,3892],{"class":42,"line":595},[40,3878,3859],{"class":140},[40,3880,3824],{"class":406},[40,3882,2461],{"class":140},[40,3884,410],{"class":140},[40,3886,3212],{"class":140},[40,3888,3889],{"class":57},"Page \u002F card background",[40,3891,2461],{"class":140},[40,3893,561],{"class":140},[40,3895,3896,3898,3901,3903,3905,3908,3910,3912],{"class":42,"line":601},[40,3897,3859],{"class":140},[40,3899,3900],{"class":406},"intent",[40,3902,2461],{"class":140},[40,3904,410],{"class":140},[40,3906,3907],{"class":140},"         \"",[40,3909,643],{"class":57},[40,3911,2461],{"class":140},[40,3913,561],{"class":140},[40,3915,3916,3918,3921,3923,3925],{"class":42,"line":607},[40,3917,3859],{"class":140},[40,3919,3920],{"class":406},"required",[40,3922,2461],{"class":140},[40,3924,410],{"class":140},[40,3926,3927],{"class":140},"       true,\n",[40,3929,3930,3932,3934,3936,3938,3940,3943,3945,3948],{"class":42,"line":613},[40,3931,3859],{"class":140},[40,3933,1711],{"class":406},[40,3935,2461],{"class":140},[40,3937,410],{"class":140},[40,3939,540],{"class":140},[40,3941,3942],{"class":3248},"0.92",[40,3944,196],{"class":140},[40,3946,3947],{"class":3248}," 1.0",[40,3949,3950],{"class":140},"]\n",[40,3952,3953],{"class":42,"line":619},[40,3954,3955],{"class":140},"        },\n",[40,3957,3958],{"class":42,"line":1088},[40,3959,3854],{"class":140},[40,3961,3962,3964,3966,3968,3970,3972,3974,3976],{"class":42,"line":1093},[40,3963,3859],{"class":140},[40,3965,3804],{"class":406},[40,3967,2461],{"class":140},[40,3969,410],{"class":140},[40,3971,3868],{"class":140},[40,3973,1705],{"class":57},[40,3975,2461],{"class":140},[40,3977,561],{"class":140},[40,3979,3980,3982,3984,3986,3988,3990,3993,3995],{"class":42,"line":1099},[40,3981,3859],{"class":140},[40,3983,3824],{"class":406},[40,3985,2461],{"class":140},[40,3987,410],{"class":140},[40,3989,3212],{"class":140},[40,3991,3992],{"class":57},"Elevated surface (modal, sheet)",[40,3994,2461],{"class":140},[40,3996,561],{"class":140},[40,3998,3999,4001,4003,4005,4007,4009,4011,4013],{"class":42,"line":1120},[40,4000,3859],{"class":140},[40,4002,3900],{"class":406},[40,4004,2461],{"class":140},[40,4006,410],{"class":140},[40,4008,3907],{"class":140},[40,4010,643],{"class":57},[40,4012,2461],{"class":140},[40,4014,561],{"class":140},[40,4016,4017,4019,4021,4023,4025],{"class":42,"line":1140},[40,4018,3859],{"class":140},[40,4020,3920],{"class":406},[40,4022,2461],{"class":140},[40,4024,410],{"class":140},[40,4026,3927],{"class":140},[40,4028,4029,4031,4033,4035,4037,4039,4042,4044,4047],{"class":42,"line":1152},[40,4030,3859],{"class":140},[40,4032,1711],{"class":406},[40,4034,2461],{"class":140},[40,4036,410],{"class":140},[40,4038,540],{"class":140},[40,4040,4041],{"class":3248},"0.86",[40,4043,196],{"class":140},[40,4045,4046],{"class":3248}," 0.96",[40,4048,3950],{"class":140},[40,4050,4051],{"class":42,"line":1176},[40,4052,3955],{"class":140},[40,4054,4055],{"class":42,"line":1185},[40,4056,3854],{"class":140},[40,4058,4059,4061,4063,4065,4067,4069,4071,4073],{"class":42,"line":1190},[40,4060,3859],{"class":140},[40,4062,3804],{"class":406},[40,4064,2461],{"class":140},[40,4066,410],{"class":140},[40,4068,3868],{"class":140},[40,4070,1698],{"class":57},[40,4072,2461],{"class":140},[40,4074,561],{"class":140},[40,4076,4077,4079,4081,4083,4085,4087,4090,4092],{"class":42,"line":1196},[40,4078,3859],{"class":140},[40,4080,3824],{"class":406},[40,4082,2461],{"class":140},[40,4084,410],{"class":140},[40,4086,3212],{"class":140},[40,4088,4089],{"class":57},"Primary interactive \u002F brand colour",[40,4091,2461],{"class":140},[40,4093,561],{"class":140},[40,4095,4097,4099,4101,4103,4105,4107,4109,4111],{"class":42,"line":4096},33,[40,4098,3859],{"class":140},[40,4100,3900],{"class":406},[40,4102,2461],{"class":140},[40,4104,410],{"class":140},[40,4106,3907],{"class":140},[40,4108,1698],{"class":57},[40,4110,2461],{"class":140},[40,4112,561],{"class":140},[40,4114,4116,4118,4120,4122,4124],{"class":42,"line":4115},34,[40,4117,3859],{"class":140},[40,4119,3920],{"class":406},[40,4121,2461],{"class":140},[40,4123,410],{"class":140},[40,4125,4126],{"class":140},"       true\n",[40,4128,4130],{"class":42,"line":4129},35,[40,4131,3955],{"class":140},[40,4133,4135],{"class":42,"line":4134},36,[40,4136,3854],{"class":140},[40,4138,4140,4142,4144,4146,4148,4150,4153,4155],{"class":42,"line":4139},37,[40,4141,3859],{"class":140},[40,4143,3804],{"class":406},[40,4145,2461],{"class":140},[40,4147,410],{"class":140},[40,4149,3868],{"class":140},[40,4151,4152],{"class":57},"onAccent",[40,4154,2461],{"class":140},[40,4156,561],{"class":140},[40,4158,4160,4162,4164,4166,4168,4170,4173,4175],{"class":42,"line":4159},38,[40,4161,3859],{"class":140},[40,4163,3824],{"class":406},[40,4165,2461],{"class":140},[40,4167,410],{"class":140},[40,4169,3212],{"class":140},[40,4171,4172],{"class":57},"Text \u002F icons placed on accent",[40,4174,2461],{"class":140},[40,4176,561],{"class":140},[40,4178,4180,4182,4184,4186,4188,4190,4192,4194],{"class":42,"line":4179},39,[40,4181,3859],{"class":140},[40,4183,3900],{"class":406},[40,4185,2461],{"class":140},[40,4187,410],{"class":140},[40,4189,3907],{"class":140},[40,4191,265],{"class":57},[40,4193,2461],{"class":140},[40,4195,561],{"class":140},[40,4197,4199,4201,4203,4205,4207],{"class":42,"line":4198},40,[40,4200,3859],{"class":140},[40,4202,3920],{"class":406},[40,4204,2461],{"class":140},[40,4206,410],{"class":140},[40,4208,3927],{"class":140},[40,4210,4212,4214,4217,4219,4221,4223,4225,4227],{"class":42,"line":4211},41,[40,4213,3859],{"class":140},[40,4215,4216],{"class":406},"derivedFrom",[40,4218,2461],{"class":140},[40,4220,410],{"class":140},[40,4222,3212],{"class":140},[40,4224,1698],{"class":57},[40,4226,2461],{"class":140},[40,4228,561],{"class":140},[40,4230,4232,4234,4236,4238,4240,4242,4245,4247,4249],{"class":42,"line":4231},42,[40,4233,3859],{"class":140},[40,4235,1711],{"class":406},[40,4237,2461],{"class":140},[40,4239,410],{"class":140},[40,4241,540],{"class":140},[40,4243,4244],{"class":3248},"0.98",[40,4246,196],{"class":140},[40,4248,3947],{"class":3248},[40,4250,3950],{"class":140},[40,4252,4254],{"class":42,"line":4253},43,[40,4255,3955],{"class":140},[40,4257,4259],{"class":42,"line":4258},44,[40,4260,3854],{"class":140},[40,4262,4264,4266,4268,4270,4272,4274,4277,4279],{"class":42,"line":4263},45,[40,4265,3859],{"class":140},[40,4267,3804],{"class":406},[40,4269,2461],{"class":140},[40,4271,410],{"class":140},[40,4273,3868],{"class":140},[40,4275,4276],{"class":57},"border",[40,4278,2461],{"class":140},[40,4280,561],{"class":140},[40,4282,4284,4286,4288,4290,4292,4294,4297,4299],{"class":42,"line":4283},46,[40,4285,3859],{"class":140},[40,4287,3824],{"class":406},[40,4289,2461],{"class":140},[40,4291,410],{"class":140},[40,4293,3212],{"class":140},[40,4295,4296],{"class":57},"Dividers and focus rings",[40,4298,2461],{"class":140},[40,4300,561],{"class":140},[40,4302,4304,4306,4308,4310,4312,4314,4317,4319],{"class":42,"line":4303},47,[40,4305,3859],{"class":140},[40,4307,3900],{"class":406},[40,4309,2461],{"class":140},[40,4311,410],{"class":140},[40,4313,3907],{"class":140},[40,4315,4316],{"class":57},"muted",[40,4318,2461],{"class":140},[40,4320,561],{"class":140},[40,4322,4324,4326,4328,4330,4332,4334,4337,4339,4342],{"class":42,"line":4323},48,[40,4325,3859],{"class":140},[40,4327,1711],{"class":406},[40,4329,2461],{"class":140},[40,4331,410],{"class":140},[40,4333,540],{"class":140},[40,4335,4336],{"class":3248},"0.60",[40,4338,196],{"class":140},[40,4340,4341],{"class":3248}," 0.80",[40,4343,3950],{"class":140},[40,4345,4347],{"class":42,"line":4346},49,[40,4348,3955],{"class":140},[40,4350,4352],{"class":42,"line":4351},50,[40,4353,3854],{"class":140},[40,4355,4357,4359,4361,4363,4365,4367,4369,4371],{"class":42,"line":4356},51,[40,4358,3859],{"class":140},[40,4360,3804],{"class":406},[40,4362,2461],{"class":140},[40,4364,410],{"class":140},[40,4366,3868],{"class":140},[40,4368,4316],{"class":57},[40,4370,2461],{"class":140},[40,4372,561],{"class":140},[40,4374,4376,4378,4380,4382,4384,4386,4389,4391],{"class":42,"line":4375},52,[40,4377,3859],{"class":140},[40,4379,3824],{"class":406},[40,4381,2461],{"class":140},[40,4383,410],{"class":140},[40,4385,3212],{"class":140},[40,4387,4388],{"class":57},"Secondary \u002F de-emphasised text",[40,4390,2461],{"class":140},[40,4392,561],{"class":140},[40,4394,4396,4398,4400,4402,4404,4406,4408,4410],{"class":42,"line":4395},53,[40,4397,3859],{"class":140},[40,4399,3900],{"class":406},[40,4401,2461],{"class":140},[40,4403,410],{"class":140},[40,4405,3907],{"class":140},[40,4407,4316],{"class":57},[40,4409,2461],{"class":140},[40,4411,561],{"class":140},[40,4413,4415,4417,4419,4421,4423,4425,4428,4430,4433],{"class":42,"line":4414},54,[40,4416,3859],{"class":140},[40,4418,1711],{"class":406},[40,4420,2461],{"class":140},[40,4422,410],{"class":140},[40,4424,540],{"class":140},[40,4426,4427],{"class":3248},"0.45",[40,4429,196],{"class":140},[40,4431,4432],{"class":3248}," 0.65",[40,4434,3950],{"class":140},[40,4436,4438],{"class":42,"line":4437},55,[40,4439,3955],{"class":140},[40,4441,4443],{"class":42,"line":4442},56,[40,4444,3854],{"class":140},[40,4446,4448,4450,4452,4454,4456,4458,4460,4462],{"class":42,"line":4447},57,[40,4449,3859],{"class":140},[40,4451,3804],{"class":406},[40,4453,2461],{"class":140},[40,4455,410],{"class":140},[40,4457,3868],{"class":140},[40,4459,265],{"class":57},[40,4461,2461],{"class":140},[40,4463,561],{"class":140},[40,4465,4467,4469,4471,4473,4475,4477,4480,4482],{"class":42,"line":4466},58,[40,4468,3859],{"class":140},[40,4470,3824],{"class":406},[40,4472,2461],{"class":140},[40,4474,410],{"class":140},[40,4476,3212],{"class":140},[40,4478,4479],{"class":57},"Primary body text",[40,4481,2461],{"class":140},[40,4483,561],{"class":140},[40,4485,4487,4489,4491,4493,4495,4497,4499,4501],{"class":42,"line":4486},59,[40,4488,3859],{"class":140},[40,4490,3900],{"class":406},[40,4492,2461],{"class":140},[40,4494,410],{"class":140},[40,4496,3907],{"class":140},[40,4498,265],{"class":57},[40,4500,2461],{"class":140},[40,4502,561],{"class":140},[40,4504,4506,4508,4510,4512,4514],{"class":42,"line":4505},60,[40,4507,3859],{"class":140},[40,4509,3920],{"class":406},[40,4511,2461],{"class":140},[40,4513,410],{"class":140},[40,4515,3927],{"class":140},[40,4517,4519,4521,4523,4525,4527,4529,4532,4534,4537],{"class":42,"line":4518},61,[40,4520,3859],{"class":140},[40,4522,1711],{"class":406},[40,4524,2461],{"class":140},[40,4526,410],{"class":140},[40,4528,540],{"class":140},[40,4530,4531],{"class":3248},"0.10",[40,4533,196],{"class":140},[40,4535,4536],{"class":3248}," 0.25",[40,4538,3950],{"class":140},[40,4540,4542],{"class":42,"line":4541},62,[40,4543,4544],{"class":140},"        }\n",[40,4546,4548],{"class":42,"line":4547},63,[40,4549,4550],{"class":140},"      ],\n",[40,4552,4554,4556,4559,4561,4563],{"class":42,"line":4553},64,[40,4555,3550],{"class":140},[40,4557,4558],{"class":3248},"contrastPairs",[40,4560,2461],{"class":140},[40,4562,410],{"class":140},[40,4564,413],{"class":140},[40,4566,4568,4571,4573,4576,4578,4580,4582,4584,4586,4588,4590,4592,4594,4596,4598,4600,4602,4604,4606,4609,4611,4613,4616,4618,4620,4622,4624,4626,4628,4630,4632],{"class":42,"line":4567},65,[40,4569,4570],{"class":140},"        {",[40,4572,3245],{"class":140},[40,4574,4575],{"class":406},"foreground",[40,4577,2461],{"class":140},[40,4579,410],{"class":140},[40,4581,3245],{"class":140},[40,4583,265],{"class":57},[40,4585,2461],{"class":140},[40,4587,196],{"class":140},[40,4589,3705],{"class":140},[40,4591,643],{"class":406},[40,4593,2461],{"class":140},[40,4595,410],{"class":140},[40,4597,3245],{"class":140},[40,4599,1702],{"class":57},[40,4601,2461],{"class":140},[40,4603,196],{"class":140},[40,4605,3199],{"class":140},[40,4607,4608],{"class":406},"minRatio",[40,4610,2461],{"class":140},[40,4612,410],{"class":140},[40,4614,4615],{"class":3248}," 4.5",[40,4617,196],{"class":140},[40,4619,3245],{"class":140},[40,4621,1913],{"class":406},[40,4623,2461],{"class":140},[40,4625,410],{"class":140},[40,4627,3245],{"class":140},[40,4629,1922],{"class":57},[40,4631,2461],{"class":140},[40,4633,438],{"class":140},[40,4635,4637,4639,4641,4643,4645,4647,4649,4651,4653,4655,4657,4659,4661,4663,4665,4667,4669,4671,4673,4675,4677,4679,4681,4683,4685,4687,4689,4691,4693,4695,4697],{"class":42,"line":4636},66,[40,4638,4570],{"class":140},[40,4640,3245],{"class":140},[40,4642,4575],{"class":406},[40,4644,2461],{"class":140},[40,4646,410],{"class":140},[40,4648,3245],{"class":140},[40,4650,265],{"class":57},[40,4652,2461],{"class":140},[40,4654,196],{"class":140},[40,4656,3705],{"class":140},[40,4658,643],{"class":406},[40,4660,2461],{"class":140},[40,4662,410],{"class":140},[40,4664,3245],{"class":140},[40,4666,1705],{"class":57},[40,4668,2461],{"class":140},[40,4670,196],{"class":140},[40,4672,3245],{"class":140},[40,4674,4608],{"class":406},[40,4676,2461],{"class":140},[40,4678,410],{"class":140},[40,4680,4615],{"class":3248},[40,4682,196],{"class":140},[40,4684,3245],{"class":140},[40,4686,1913],{"class":406},[40,4688,2461],{"class":140},[40,4690,410],{"class":140},[40,4692,3245],{"class":140},[40,4694,1922],{"class":57},[40,4696,2461],{"class":140},[40,4698,438],{"class":140},[40,4700,4702,4704,4706,4708,4710,4712,4714,4716,4718,4720,4722,4724,4726,4728,4730,4732,4734,4736,4738,4740,4742,4744,4746,4748,4750,4752,4754,4756,4758,4760,4762],{"class":42,"line":4701},67,[40,4703,4570],{"class":140},[40,4705,3245],{"class":140},[40,4707,4575],{"class":406},[40,4709,2461],{"class":140},[40,4711,410],{"class":140},[40,4713,3245],{"class":140},[40,4715,4152],{"class":57},[40,4717,2461],{"class":140},[40,4719,196],{"class":140},[40,4721,3245],{"class":140},[40,4723,643],{"class":406},[40,4725,2461],{"class":140},[40,4727,410],{"class":140},[40,4729,3245],{"class":140},[40,4731,1698],{"class":57},[40,4733,2461],{"class":140},[40,4735,196],{"class":140},[40,4737,3199],{"class":140},[40,4739,4608],{"class":406},[40,4741,2461],{"class":140},[40,4743,410],{"class":140},[40,4745,4615],{"class":3248},[40,4747,196],{"class":140},[40,4749,3245],{"class":140},[40,4751,1913],{"class":406},[40,4753,2461],{"class":140},[40,4755,410],{"class":140},[40,4757,3245],{"class":140},[40,4759,1922],{"class":57},[40,4761,2461],{"class":140},[40,4763,438],{"class":140},[40,4765,4767,4769,4771,4773,4775,4777,4779,4781,4783,4785,4788,4790,4792,4794,4796,4798,4800,4802,4804,4806,4808,4810,4813,4815,4817,4819,4821,4823,4825,4827,4829],{"class":42,"line":4766},68,[40,4768,4570],{"class":140},[40,4770,3245],{"class":140},[40,4772,4575],{"class":406},[40,4774,2461],{"class":140},[40,4776,410],{"class":140},[40,4778,3245],{"class":140},[40,4780,4276],{"class":57},[40,4782,2461],{"class":140},[40,4784,196],{"class":140},[40,4786,4787],{"class":140},"   \"",[40,4789,643],{"class":406},[40,4791,2461],{"class":140},[40,4793,410],{"class":140},[40,4795,3245],{"class":140},[40,4797,1702],{"class":57},[40,4799,2461],{"class":140},[40,4801,196],{"class":140},[40,4803,3199],{"class":140},[40,4805,4608],{"class":406},[40,4807,2461],{"class":140},[40,4809,410],{"class":140},[40,4811,4812],{"class":3248}," 3.0",[40,4814,196],{"class":140},[40,4816,3245],{"class":140},[40,4818,1913],{"class":406},[40,4820,2461],{"class":140},[40,4822,410],{"class":140},[40,4824,3245],{"class":140},[40,4826,1922],{"class":57},[40,4828,2461],{"class":140},[40,4830,481],{"class":140},[40,4832,4834],{"class":42,"line":4833},69,[40,4835,4836],{"class":140},"      ]\n",[40,4838,4840],{"class":42,"line":4839},70,[40,4841,3568],{"class":140},[40,4843,4845],{"class":42,"line":4844},71,[40,4846,3326],{"class":140},[40,4848,4850,4852,4854,4856,4858],{"class":42,"line":4849},72,[40,4851,3199],{"class":140},[40,4853,3333],{"class":170},[40,4855,2461],{"class":140},[40,4857,410],{"class":140},[40,4859,3340],{"class":140},[40,4861,4863,4865,4867,4869,4871],{"class":42,"line":4862},73,[40,4864,3199],{"class":140},[40,4866,3347],{"class":170},[40,4868,2461],{"class":140},[40,4870,410],{"class":140},[40,4872,3354],{"class":140},[40,4874,4876,4878,4880,4882,4884],{"class":42,"line":4875},74,[40,4877,3199],{"class":140},[40,4879,3361],{"class":170},[40,4881,2461],{"class":140},[40,4883,410],{"class":140},[40,4885,4886],{"class":140},"  true,\n",[40,4888,4890,4892,4894,4896,4898],{"class":42,"line":4889},75,[40,4891,3199],{"class":140},[40,4893,999],{"class":170},[40,4895,2461],{"class":140},[40,4897,410],{"class":140},[40,4899,413],{"class":140},[40,4901,4903,4905,4907,4909],{"class":42,"line":4902},76,[40,4904,3212],{"class":140},[40,4906,1010],{"class":57},[40,4908,2461],{"class":140},[40,4910,561],{"class":140},[40,4912,4914,4916,4918,4920],{"class":42,"line":4913},77,[40,4915,3212],{"class":140},[40,4917,1032],{"class":57},[40,4919,2461],{"class":140},[40,4921,561],{"class":140},[40,4923,4925,4927,4929,4931],{"class":42,"line":4924},78,[40,4926,3212],{"class":140},[40,4928,1021],{"class":57},[40,4930,2461],{"class":140},[40,4932,561],{"class":140},[40,4934,4936,4938,4940,4942],{"class":42,"line":4935},79,[40,4937,3212],{"class":140},[40,4939,1567],{"class":57},[40,4941,2461],{"class":140},[40,4943,561],{"class":140},[40,4945,4947,4949,4951,4953],{"class":42,"line":4946},80,[40,4948,3212],{"class":140},[40,4950,1054],{"class":57},[40,4952,2461],{"class":140},[40,4954,561],{"class":140},[40,4956,4958,4960,4962,4964],{"class":42,"line":4957},81,[40,4959,3212],{"class":140},[40,4961,354],{"class":57},[40,4963,2461],{"class":140},[40,4965,561],{"class":140},[40,4967,4969,4971,4973,4975],{"class":42,"line":4968},82,[40,4970,3212],{"class":140},[40,4972,1631],{"class":57},[40,4974,2461],{"class":140},[40,4976,561],{"class":140},[40,4978,4980,4982,4984],{"class":42,"line":4979},83,[40,4981,3212],{"class":140},[40,4983,1642],{"class":57},[40,4985,3495],{"class":140},[40,4987,4989],{"class":42,"line":4988},84,[40,4990,3500],{"class":140},[40,4992,4994,4996,4998,5000,5002],{"class":42,"line":4993},85,[40,4995,3199],{"class":140},[40,4997,3183],{"class":170},[40,4999,2461],{"class":140},[40,5001,410],{"class":140},[40,5003,401],{"class":140},[40,5005,5007,5009,5011,5013,5015,5017,5019,5021],{"class":42,"line":5006},86,[40,5008,3212],{"class":140},[40,5010,3519],{"class":53},[40,5012,2461],{"class":140},[40,5014,410],{"class":140},[40,5016,3245],{"class":140},[40,5018,3528],{"class":57},[40,5020,2461],{"class":140},[40,5022,561],{"class":140},[40,5024,5026,5028,5030,5032,5034],{"class":42,"line":5025},87,[40,5027,3212],{"class":140},[40,5029,3539],{"class":53},[40,5031,2461],{"class":140},[40,5033,410],{"class":140},[40,5035,401],{"class":140},[40,5037,5039,5041,5043,5045,5047,5049,5052,5054],{"class":42,"line":5038},88,[40,5040,3550],{"class":140},[40,5042,1217],{"class":3248},[40,5044,2461],{"class":140},[40,5046,410],{"class":140},[40,5048,3199],{"class":140},[40,5050,5051],{"class":57},"music.css",[40,5053,2461],{"class":140},[40,5055,561],{"class":140},[40,5057,5059,5061,5063,5065,5067,5069,5072,5074],{"class":42,"line":5058},89,[40,5060,3550],{"class":140},[40,5062,2092],{"class":3248},[40,5064,2461],{"class":140},[40,5066,410],{"class":140},[40,5068,3245],{"class":140},[40,5070,5071],{"class":57},"music-statusbar.json",[40,5073,2461],{"class":140},[40,5075,561],{"class":140},[40,5077,5079,5081,5084,5086,5088,5090,5093],{"class":42,"line":5078},90,[40,5080,3550],{"class":140},[40,5082,5083],{"class":3248},"capacitor:theme",[40,5085,2461],{"class":140},[40,5087,410],{"class":140},[40,5089,3705],{"class":140},[40,5091,5092],{"class":57},"music-theme.json",[40,5094,3495],{"class":140},[40,5096,5098],{"class":42,"line":5097},91,[40,5099,3568],{"class":140},[40,5101,5103],{"class":42,"line":5102},92,[40,5104,1435],{"class":140},[40,5106,5108],{"class":42,"line":5107},93,[40,5109,773],{"class":140},[23,5111,5113],{"id":5112},"wiring-into-a-build-pipeline","Wiring into a build pipeline",[31,5115,5117],{"className":3186,"code":5116,"language":3188,"meta":36,"style":36},"{\n  \"scripts\": {\n    \"palette\": \"iridis .\u002Fpalette.config.json\",\n    \"build\": \"npm run palette && vite build\"\n  }\n}\n",[18,5118,5119,5123,5136,5156,5174,5178],{"__ignoreMap":36},[40,5120,5121],{"class":42,"line":43},[40,5122,529],{"class":140},[40,5124,5125,5127,5130,5132,5134],{"class":42,"line":50},[40,5126,3199],{"class":140},[40,5128,5129],{"class":170},"scripts",[40,5131,2461],{"class":140},[40,5133,410],{"class":140},[40,5135,401],{"class":140},[40,5137,5138,5140,5143,5145,5147,5149,5152,5154],{"class":42,"line":64},[40,5139,3212],{"class":140},[40,5141,5142],{"class":53},"palette",[40,5144,2461],{"class":140},[40,5146,410],{"class":140},[40,5148,3245],{"class":140},[40,5150,5151],{"class":57},"iridis .\u002Fpalette.config.json",[40,5153,2461],{"class":140},[40,5155,561],{"class":140},[40,5157,5158,5160,5163,5165,5167,5169,5172],{"class":42,"line":71},[40,5159,3212],{"class":140},[40,5161,5162],{"class":53},"build",[40,5164,2461],{"class":140},[40,5166,410],{"class":140},[40,5168,3245],{"class":140},[40,5170,5171],{"class":57},"npm run palette && vite build",[40,5173,3495],{"class":140},[40,5175,5176],{"class":42,"line":77},[40,5177,1435],{"class":140},[40,5179,5180],{"class":42,"line":91},[40,5181,773],{"class":140},[31,5183,5187],{"className":5184,"code":5185,"language":5186,"meta":36,"style":36},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- name: Generate palette\n  run: npx iridis .\u002Fpalette.config.json\n\n- name: Upload palette artifact\n  uses: actions\u002Fupload-artifact@v4\n  with:\n    name: palette\n    path: out\u002F\n","yaml",[18,5188,5189,5201,5211,5215,5226,5236,5244,5254],{"__ignoreMap":36},[40,5190,5191,5194,5196,5198],{"class":42,"line":43},[40,5192,5193],{"class":140},"-",[40,5195,421],{"class":406},[40,5197,410],{"class":140},[40,5199,5200],{"class":57}," Generate palette\n",[40,5202,5203,5206,5208],{"class":42,"line":50},[40,5204,5205],{"class":406},"  run",[40,5207,410],{"class":140},[40,5209,5210],{"class":57}," npx iridis .\u002Fpalette.config.json\n",[40,5212,5213],{"class":42,"line":64},[40,5214,68],{"emptyLinePlaceholder":67},[40,5216,5217,5219,5221,5223],{"class":42,"line":71},[40,5218,5193],{"class":140},[40,5220,421],{"class":406},[40,5222,410],{"class":140},[40,5224,5225],{"class":57}," Upload palette artifact\n",[40,5227,5228,5231,5233],{"class":42,"line":77},[40,5229,5230],{"class":406},"  uses",[40,5232,410],{"class":140},[40,5234,5235],{"class":57}," actions\u002Fupload-artifact@v4\n",[40,5237,5238,5241],{"class":42,"line":91},[40,5239,5240],{"class":406},"  with",[40,5242,5243],{"class":140},":\n",[40,5245,5246,5249,5251],{"class":42,"line":99},[40,5247,5248],{"class":406},"    name",[40,5250,410],{"class":140},[40,5252,5253],{"class":57}," palette\n",[40,5255,5256,5259,5261],{"class":42,"line":107},[40,5257,5258],{"class":406},"    path",[40,5260,410],{"class":140},[40,5262,5263],{"class":57}," out\u002F\n",[11,5265,5266,5267,5270],{},"The CLI exits with code ",[18,5268,5269],{},"0"," on success and non-zero on validation or pipeline errors. Standard output carries progress logs; standard error carries fatal messages, both are machine-readable in CI.",[237,5272,5273],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":36,"searchDepth":50,"depth":50,"links":5275},[5276,5277,5278],{"id":3123,"depth":50,"text":3124},{"id":3164,"depth":50,"text":3165},{"id":5112,"depth":50,"text":5113},"Run iridis directly from your terminal using a JSON configuration file.",{},"\u002F07-cli-usage",{"title":3082,"description":5279},"07-cli-usage","IpIIVkarUjnfZDwK3oswPle41PyklNECEG6v_4qGs50",{"id":5286,"title":5287,"body":5288,"description":6127,"extension":246,"meta":6128,"navigation":67,"path":6129,"seo":6130,"stem":6131,"__hash__":6132},"docs\u002F08-vscode-theme-recipe.md","8. VS Code Theme Recipe",{"type":8,"value":5289,"toc":6121},[5290,5306,5310,5342,5346,5487,5490,5505,5509,5950,5956,5960,5966,6101,6118],[11,5291,5292,5294,5295,5298,5299,343,5301,347,5303,5305],{},[18,5293,3043],{}," derives a complete VS Code ",[18,5296,5297],{},"theme.json"," — workbench ",[18,5300,1853],{},[18,5302,3050],{},[18,5304,3047],{}," — from a 16-role palette. It's a five-task pipeline extension, not a single emit task, because a VS Code theme has more surface area than a CSS variable block: workbench chrome, editor syntax highlighting, and the newer semantic-token layer all need independently-derived color sets that then get assembled together.",[23,5307,5309],{"id":5308},"why-a-second-engine-pass","Why a second engine pass",[11,5311,5312,5313,5317,5318,5321,5322,5325,5326,5329,5330,343,5333,343,5336,5339,5340,316],{},"The plugin's tasks run ",[5314,5315,5316],"em",{},"after"," the core pipeline resolves roles and enforces contrast — ",[18,5319,5320],{},"vscode:expandTokens"," and ",[18,5323,5324],{},"vscode:applyModifiers"," are their own mini-pipeline stage that takes the resolved 16-role palette and expands it into VS Code's much larger color vocabulary (23 base tokens, then 253 semantic-token rules), re-checking contrast against the background role as it goes. This is the \"second engine pass\" referenced in ",[18,5327,5328],{},"MultiOutput.vue",": the core pipeline produces a role palette sized for UI theming; the VS Code plugin then derives an editor-theme-sized palette from that role palette using its own derivation tables (",[18,5331,5332],{},"DERIVATION_PARAMS",[18,5334,5335],{},"MODIFIER_TRANSFORMS",[18,5337,5338],{},"SCOPE_MAPPINGS",") rather than reusing ",[18,5341,1054],{},[23,5343,5345],{"id":5344},"pipeline-stages","Pipeline stages",[5347,5348,5349,5365],"table",{},[5350,5351,5352],"thead",{},[5353,5354,5355,5359,5362],"tr",{},[5356,5357,5358],"th",{},"Stage",[5356,5360,5361],{},"Task",[5356,5363,5364],{},"What it does",[5366,5367,5368,5387,5408,5433,5459],"tbody",{},[5353,5369,5370,5374,5378],{},[5371,5372,5373],"td",{},"1",[5371,5375,5376],{},[18,5377,5320],{},[5371,5379,5380,5381,5383,5384,316],{},"Derives 23 VS Code base token colors from the 16 resolved roles, using ",[18,5382,5332],{},". Writes ",[18,5385,5386],{},"metadata['vscode:baseTokens']",[5353,5388,5389,5392,5396],{},[5371,5390,5391],{},"2",[5371,5393,5394],{},[18,5395,5324],{},[5371,5397,5398,5399,5401,5402,5404,5405,316],{},"Applies 10 color modifiers (from ",[18,5400,5335],{},") to the base tokens, producing 253 semantic-token rules, and re-enforces contrast against the ",[18,5403,643],{}," role for each. Writes ",[18,5406,5407],{},"metadata['vscode:semanticTokenRules']",[5353,5409,5410,5413,5418],{},[5371,5411,5412],{},"3a",[5371,5414,5415],{},[18,5416,5417],{},"emit:vscodeSemanticRules",[5371,5419,5420,5421,5424,5425,5321,5427,5383,5430,316],{},"Shapes the semantic-token rule map for ",[18,5422,5423],{},"editor.semanticTokenColorCustomizations.rules",", using ",[18,5426,5338],{},[18,5428,5429],{},"FONT_STYLES",[18,5431,5432],{},"outputs['vscode:semanticTokenRules']",[5353,5434,5435,5438,5443],{},[5371,5436,5437],{},"3b",[5371,5439,5440],{},[18,5441,5442],{},"emit:vscodeUiPalette",[5371,5444,5445,5446,343,5449,5452,5453,5455,5456,316],{},"Derives 100+ workbench UI colors (",[18,5447,5448],{},"editor.background",[18,5450,5451],{},"sideBar.foreground",", etc.) from the 16-role palette, selecting light\u002Fdark variants by the resolved ",[18,5454,643],{}," luminance. Writes ",[18,5457,5458],{},"outputs['vscode:workbenchColors']",[5353,5460,5461,5464,5469],{},[5371,5462,5463],{},"4",[5371,5465,5466],{},[18,5467,5468],{},"emit:vscodeThemeJson",[5371,5470,5471,5472,5474,5475,5478,5479,5321,5481,5483,5484,316],{},"Combines the semantic rules and workbench colors into one ",[18,5473,5297],{}," shape (",[18,5476,5477],{},"{ name, type, colors, semanticTokenColors, tokenColors }","). Requires both ",[18,5480,5417],{},[18,5482,5442],{}," to have already run. Writes ",[18,5485,5486],{},"outputs['vscode:themeJson']",[11,5488,5489],{},"Stages 3a and 3b are independent of each other and can run in either order (both depend only on stage 2's output), but stage 4 fails fast if either hasn't run yet.",[11,5491,5492,5493,5496,5497,5500,5501,5504],{},"Wide-gamut roles (records with ",[18,5494,5495],{},"displayP3"," populated) serialize to the CSS Color 4 ",[18,5498,5499],{},"color(display-p3 r g b)"," form in every emitted theme slot; sRGB-only roles stay as ",[18,5502,5503],{},"#rrggbb",". VS Code 1.85+ accepts either form in any color slot.",[23,5506,5508],{"id":5507},"producing-a-theme-file","Producing a theme file",[31,5510,5512],{"className":127,"code":5511,"language":129,"meta":36,"style":36},"import { Engine, coreTasks } from '@studnicky\u002Firidis';\nimport { vscodePlugin, vscodeRoleSchema16 } from '@studnicky\u002Firidis-vscode';\nimport { writeFileSync } from 'node:fs';\n\nconst engine = new Engine();\nfor (const task of coreTasks) engine.tasks.register(task);\nengine.adopt(vscodePlugin);\n\nengine.pipeline([\n  'intake:hex',\n  'resolve:roles',\n  'expand:family',\n  'enforce:contrast',\n  'derive:variant',\n  'vscode:expandTokens',\n  'vscode:applyModifiers',\n  'emit:vscodeSemanticRules',\n  'emit:vscodeUiPalette',\n  'emit:vscodeThemeJson',\n]);\n\nconst state = await engine.run({\n  colors: ['#8B5CF6', '#EC4899', '#0d1117', '#e6edf3' \u002F* ...16 seeds, one per vscodeRoleSchema16 role *\u002F],\n  roles: vscodeRoleSchema16,\n  metadata: { themeName: 'Iridis Dark' },\n});\n\nconst themeJson = state.outputs['vscode:themeJson']!;\nwriteFileSync('themes\u002Firidis-dark-color-theme.json', JSON.stringify(themeJson, null, 2));\n",[18,5513,5514,5538,5564,5586,5590,5606,5632,5645,5649,5659,5670,5680,5690,5700,5710,5720,5730,5740,5750,5760,5766,5770,5790,5838,5848,5871,5879,5883,5910],{"__ignoreMap":36},[40,5515,5516,5518,5520,5522,5524,5526,5528,5530,5532,5534,5536],{"class":42,"line":43},[40,5517,137],{"class":136},[40,5519,141],{"class":140},[40,5521,373],{"class":87},[40,5523,196],{"class":140},[40,5525,824],{"class":87},[40,5527,147],{"class":140},[40,5529,150],{"class":136},[40,5531,153],{"class":140},[40,5533,20],{"class":57},[40,5535,158],{"class":140},[40,5537,161],{"class":140},[40,5539,5540,5542,5544,5547,5549,5552,5554,5556,5558,5560,5562],{"class":42,"line":50},[40,5541,137],{"class":136},[40,5543,141],{"class":140},[40,5545,5546],{"class":87}," vscodePlugin",[40,5548,196],{"class":140},[40,5550,5551],{"class":87}," vscodeRoleSchema16",[40,5553,147],{"class":140},[40,5555,150],{"class":136},[40,5557,153],{"class":140},[40,5559,3043],{"class":57},[40,5561,158],{"class":140},[40,5563,161],{"class":140},[40,5565,5566,5568,5570,5573,5575,5577,5579,5582,5584],{"class":42,"line":64},[40,5567,137],{"class":136},[40,5569,141],{"class":140},[40,5571,5572],{"class":87}," writeFileSync",[40,5574,147],{"class":140},[40,5576,150],{"class":136},[40,5578,153],{"class":140},[40,5580,5581],{"class":57},"node:fs",[40,5583,158],{"class":140},[40,5585,161],{"class":140},[40,5587,5588],{"class":42,"line":71},[40,5589,68],{"emptyLinePlaceholder":67},[40,5591,5592,5594,5596,5598,5600,5602,5604],{"class":42,"line":77},[40,5593,171],{"class":170},[40,5595,893],{"class":87},[40,5597,177],{"class":140},[40,5599,898],{"class":140},[40,5601,373],{"class":183},[40,5603,903],{"class":87},[40,5605,161],{"class":140},[40,5607,5608,5610,5612,5614,5616,5618,5620,5622,5624,5626,5628,5630],{"class":42,"line":91},[40,5609,915],{"class":136},[40,5611,918],{"class":87},[40,5613,171],{"class":170},[40,5615,923],{"class":87},[40,5617,926],{"class":140},[40,5619,929],{"class":87},[40,5621,316],{"class":140},[40,5623,934],{"class":87},[40,5625,316],{"class":140},[40,5627,939],{"class":183},[40,5629,942],{"class":87},[40,5631,161],{"class":140},[40,5633,5634,5636,5638,5640,5643],{"class":42,"line":99},[40,5635,958],{"class":87},[40,5637,316],{"class":140},[40,5639,963],{"class":183},[40,5641,5642],{"class":87},"(vscodePlugin)",[40,5644,161],{"class":140},[40,5646,5647],{"class":42,"line":107},[40,5648,68],{"emptyLinePlaceholder":67},[40,5650,5651,5653,5655,5657],{"class":42,"line":489},[40,5652,958],{"class":87},[40,5654,316],{"class":140},[40,5656,999],{"class":183},[40,5658,1002],{"class":87},[40,5660,5661,5663,5666,5668],{"class":42,"line":495},[40,5662,1007],{"class":140},[40,5664,5665],{"class":57},"intake:hex",[40,5667,158],{"class":140},[40,5669,561],{"class":140},[40,5671,5672,5674,5676,5678],{"class":42,"line":500},[40,5673,1007],{"class":140},[40,5675,1032],{"class":57},[40,5677,158],{"class":140},[40,5679,561],{"class":140},[40,5681,5682,5684,5686,5688],{"class":42,"line":506},[40,5683,1007],{"class":140},[40,5685,1021],{"class":57},[40,5687,158],{"class":140},[40,5689,561],{"class":140},[40,5691,5692,5694,5696,5698],{"class":42,"line":532},[40,5693,1007],{"class":140},[40,5695,1043],{"class":57},[40,5697,158],{"class":140},[40,5699,561],{"class":140},[40,5701,5702,5704,5706,5708],{"class":42,"line":564},[40,5703,1007],{"class":140},[40,5705,1054],{"class":57},[40,5707,158],{"class":140},[40,5709,561],{"class":140},[40,5711,5712,5714,5716,5718],{"class":42,"line":574},[40,5713,1007],{"class":140},[40,5715,5320],{"class":57},[40,5717,158],{"class":140},[40,5719,561],{"class":140},[40,5721,5722,5724,5726,5728],{"class":42,"line":584},[40,5723,1007],{"class":140},[40,5725,5324],{"class":57},[40,5727,158],{"class":140},[40,5729,561],{"class":140},[40,5731,5732,5734,5736,5738],{"class":42,"line":589},[40,5733,1007],{"class":140},[40,5735,5417],{"class":57},[40,5737,158],{"class":140},[40,5739,561],{"class":140},[40,5741,5742,5744,5746,5748],{"class":42,"line":595},[40,5743,1007],{"class":140},[40,5745,5442],{"class":57},[40,5747,158],{"class":140},[40,5749,561],{"class":140},[40,5751,5752,5754,5756,5758],{"class":42,"line":601},[40,5753,1007],{"class":140},[40,5755,5468],{"class":57},[40,5757,158],{"class":140},[40,5759,561],{"class":140},[40,5761,5762,5764],{"class":42,"line":607},[40,5763,1083],{"class":87},[40,5765,161],{"class":140},[40,5767,5768],{"class":42,"line":613},[40,5769,68],{"emptyLinePlaceholder":67},[40,5771,5772,5774,5776,5778,5780,5782,5784,5786,5788],{"class":42,"line":619},[40,5773,171],{"class":170},[40,5775,511],{"class":87},[40,5777,177],{"class":140},[40,5779,180],{"class":136},[40,5781,518],{"class":87},[40,5783,316],{"class":140},[40,5785,523],{"class":183},[40,5787,526],{"class":87},[40,5789,529],{"class":140},[40,5791,5792,5794,5796,5798,5800,5802,5804,5806,5808,5811,5813,5815,5817,5820,5822,5824,5826,5829,5831,5834,5836],{"class":42,"line":1088},[40,5793,535],{"class":406},[40,5795,410],{"class":140},[40,5797,540],{"class":87},[40,5799,158],{"class":140},[40,5801,1131],{"class":57},[40,5803,158],{"class":140},[40,5805,196],{"class":140},[40,5807,153],{"class":140},[40,5809,5810],{"class":57},"#EC4899",[40,5812,158],{"class":140},[40,5814,196],{"class":140},[40,5816,153],{"class":140},[40,5818,5819],{"class":57},"#0d1117",[40,5821,158],{"class":140},[40,5823,196],{"class":140},[40,5825,153],{"class":140},[40,5827,5828],{"class":57},"#e6edf3",[40,5830,158],{"class":140},[40,5832,5833],{"class":46}," \u002F* ...16 seeds, one per vscodeRoleSchema16 role *\u002F",[40,5835,206],{"class":87},[40,5837,561],{"class":140},[40,5839,5840,5842,5844,5846],{"class":42,"line":1093},[40,5841,407],{"class":406},[40,5843,410],{"class":140},[40,5845,5551],{"class":87},[40,5847,561],{"class":140},[40,5849,5850,5853,5855,5857,5860,5862,5864,5867,5869],{"class":42,"line":1099},[40,5851,5852],{"class":406},"  metadata",[40,5854,410],{"class":140},[40,5856,141],{"class":140},[40,5858,5859],{"class":406}," themeName",[40,5861,410],{"class":140},[40,5863,153],{"class":140},[40,5865,5866],{"class":57},"Iridis Dark",[40,5868,158],{"class":140},[40,5870,438],{"class":140},[40,5872,5873,5875,5877],{"class":42,"line":1120},[40,5874,577],{"class":140},[40,5876,118],{"class":87},[40,5878,161],{"class":140},[40,5880,5881],{"class":42,"line":1140},[40,5882,68],{"emptyLinePlaceholder":67},[40,5884,5885,5887,5890,5892,5894,5896,5898,5900,5903,5905,5907],{"class":42,"line":1152},[40,5886,171],{"class":170},[40,5888,5889],{"class":87}," themeJson ",[40,5891,177],{"class":140},[40,5893,2053],{"class":87},[40,5895,316],{"class":140},[40,5897,1212],{"class":87},[40,5899,158],{"class":140},[40,5901,5902],{"class":57},"vscode:themeJson",[40,5904,158],{"class":140},[40,5906,206],{"class":87},[40,5908,5909],{"class":140},"!;\n",[40,5911,5912,5915,5917,5919,5922,5924,5926,5929,5931,5934,5937,5939,5942,5945,5948],{"class":42,"line":1176},[40,5913,5914],{"class":183},"writeFileSync",[40,5916,526],{"class":87},[40,5918,158],{"class":140},[40,5920,5921],{"class":57},"themes\u002Firidis-dark-color-theme.json",[40,5923,158],{"class":140},[40,5925,196],{"class":140},[40,5927,5928],{"class":87}," JSON",[40,5930,316],{"class":140},[40,5932,5933],{"class":183},"stringify",[40,5935,5936],{"class":87},"(themeJson",[40,5938,196],{"class":140},[40,5940,5941],{"class":140}," null,",[40,5943,5944],{"class":3248}," 2",[40,5946,5947],{"class":87},"))",[40,5949,161],{"class":140},[11,5951,5952,5955],{},[18,5953,5954],{},"vscodeRoleSchema16"," is the canonical 16-role schema the plugin expects — pass 16 seed colors matching its roles, in order.",[23,5957,5959],{"id":5958},"loading-it-as-a-vs-code-extension-theme","Loading it as a VS Code extension theme",[11,5961,5962,5963,410],{},"The written file is a standard VS Code color theme contribution. Reference it from an extension's ",[18,5964,5965],{},"package.json",[31,5967,5969],{"className":3186,"code":5968,"language":3188,"meta":36,"style":36},"{\n  \"name\": \"iridis-dark-theme\",\n  \"contributes\": {\n    \"themes\": [\n      {\n        \"label\": \"Iridis Dark\",\n        \"uiTheme\": \"vs-dark\",\n        \"path\": \".\u002Fthemes\u002Firidis-dark-color-theme.json\"\n      }\n    ]\n  }\n}\n",[18,5970,5971,5975,5994,6007,6020,6025,6045,6065,6083,6088,6093,6097],{"__ignoreMap":36},[40,5972,5973],{"class":42,"line":43},[40,5974,529],{"class":140},[40,5976,5977,5979,5981,5983,5985,5987,5990,5992],{"class":42,"line":50},[40,5978,3199],{"class":140},[40,5980,3804],{"class":170},[40,5982,2461],{"class":140},[40,5984,410],{"class":140},[40,5986,3245],{"class":140},[40,5988,5989],{"class":57},"iridis-dark-theme",[40,5991,2461],{"class":140},[40,5993,561],{"class":140},[40,5995,5996,5998,6001,6003,6005],{"class":42,"line":64},[40,5997,3199],{"class":140},[40,5999,6000],{"class":170},"contributes",[40,6002,2461],{"class":140},[40,6004,410],{"class":140},[40,6006,401],{"class":140},[40,6008,6009,6011,6014,6016,6018],{"class":42,"line":71},[40,6010,3212],{"class":140},[40,6012,6013],{"class":53},"themes",[40,6015,2461],{"class":140},[40,6017,410],{"class":140},[40,6019,413],{"class":140},[40,6021,6022],{"class":42,"line":77},[40,6023,6024],{"class":140},"      {\n",[40,6026,6027,6030,6033,6035,6037,6039,6041,6043],{"class":42,"line":91},[40,6028,6029],{"class":140},"        \"",[40,6031,6032],{"class":3248},"label",[40,6034,2461],{"class":140},[40,6036,410],{"class":140},[40,6038,3245],{"class":140},[40,6040,5866],{"class":57},[40,6042,2461],{"class":140},[40,6044,561],{"class":140},[40,6046,6047,6049,6052,6054,6056,6058,6061,6063],{"class":42,"line":99},[40,6048,6029],{"class":140},[40,6050,6051],{"class":3248},"uiTheme",[40,6053,2461],{"class":140},[40,6055,410],{"class":140},[40,6057,3245],{"class":140},[40,6059,6060],{"class":57},"vs-dark",[40,6062,2461],{"class":140},[40,6064,561],{"class":140},[40,6066,6067,6069,6072,6074,6076,6078,6081],{"class":42,"line":107},[40,6068,6029],{"class":140},[40,6070,6071],{"class":3248},"path",[40,6073,2461],{"class":140},[40,6075,410],{"class":140},[40,6077,3245],{"class":140},[40,6079,6080],{"class":57},".\u002Fthemes\u002Firidis-dark-color-theme.json",[40,6082,3495],{"class":140},[40,6084,6085],{"class":42,"line":489},[40,6086,6087],{"class":140},"      }\n",[40,6089,6090],{"class":42,"line":495},[40,6091,6092],{"class":140},"    ]\n",[40,6094,6095],{"class":42,"line":500},[40,6096,1435],{"class":140},[40,6098,6099],{"class":42,"line":506},[40,6100,773],{"class":140},[11,6102,6103,6104,6106,6107,6110,6111,6114,6115,6117],{},"For local testing without publishing an extension, symlink or copy the generated ",[18,6105,5297],{}," into an existing theme extension's ",[18,6108,6109],{},"themes\u002F"," directory, or load the workspace folder in VS Code's Extension Development Host (",[18,6112,6113],{},"F5",") with the ",[18,6116,5965],{}," above.",[237,6119,6120],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":36,"searchDepth":50,"depth":50,"links":6122},[6123,6124,6125,6126],{"id":5308,"depth":50,"text":5309},{"id":5344,"depth":50,"text":5345},{"id":5507,"depth":50,"text":5508},{"id":5958,"depth":50,"text":5959},"How the VS Code plugin runs a second engine pass to derive a full editor theme from a 16-role palette.",{},"\u002F08-vscode-theme-recipe",{"title":5287,"description":6127},"08-vscode-theme-recipe","-_D3Z_911mk1uHCBk_K8TrNT29PMJvpv9ICUwq3ioZ0",{"id":6134,"title":6135,"body":6136,"description":7003,"extension":246,"meta":7004,"navigation":67,"path":7005,"seo":7006,"stem":7007,"__hash__":7008},"docs\u002F09-task-registry-reference.md","9. Task Registry Reference",{"type":8,"value":6137,"toc":6988},[6138,6152,6158,6409,6415,6477,6483,6560,6565,6647,6652,6689,6694,6724,6729,6755,6760,6789,6794,6823,6828,6854,6859,6937,6942],[11,6139,6140,6141,6143,6144,6147,6148,6151],{},"Every task registered by the core engine and by each official plugin, grouped by plugin. ",[18,6142,3804],{}," is the pipeline identifier passed to ",[18,6145,6146],{},"engine.pipeline([...])","; ",[18,6149,6150],{},"requires"," (where present) lists tasks that must already have run in the same pipeline.",[23,6153,6155,6156,118],{"id":6154},"core-studnickyiridis","Core (",[18,6157,20],{},[5347,6159,6160,6172],{},[5350,6161,6162],{},[5353,6163,6164,6166,6169],{},[5356,6165,5361],{},[5356,6167,6168],{},"Requires",[5356,6170,6171],{},"Description",[5366,6173,6174,6186,6204,6219,6233,6248,6263,6278,6293,6311,6323,6339,6350,6364,6378,6389],{},[5353,6175,6176,6180,6183],{},[5371,6177,6178],{},[18,6179,1010],{},[5371,6181,6182],{},"—",[5371,6184,6185],{},"Recommended default intake task. Dispatches each entry to the first matching format delegate.",[5353,6187,6188,6192,6194],{},[5371,6189,6190],{},[18,6191,5665],{},[5371,6193,6182],{},[5371,6195,6196,6197,343,6200,6203],{},"Parses ",[18,6198,6199],{},"#RRGGBB",[18,6201,6202],{},"#RGB",", and 8-digit hex strings.",[5353,6205,6206,6211,6213],{},[5371,6207,6208],{},[18,6209,6210],{},"intake:rgb",[5371,6212,6182],{},[5371,6214,6196,6215,6218],{},[18,6216,6217],{},"{r,g,b,a?}"," in 0..1 or 0..255 (auto-detected).",[5353,6220,6221,6226,6228],{},[5371,6222,6223],{},[18,6224,6225],{},"intake:hsl",[5371,6227,6182],{},[5371,6229,6196,6230,316],{},[18,6231,6232],{},"{h,s,l,a?}",[5353,6234,6235,6240,6242],{},[5371,6236,6237],{},[18,6238,6239],{},"intake:oklch",[5371,6241,6182],{},[5371,6243,6196,6244,6247],{},[18,6245,6246],{},"{l,c,h,a?}"," OKLCH.",[5353,6249,6250,6255,6257],{},[5371,6251,6252],{},[18,6253,6254],{},"intake:lab",[5371,6256,6182],{},[5371,6258,6196,6259,6262],{},[18,6260,6261],{},"{l,a,b}"," CIE Lab D65.",[5353,6264,6265,6270,6272],{},[5371,6266,6267],{},[18,6268,6269],{},"intake:p3",[5371,6271,6182],{},[5371,6273,6196,6274,6277],{},[18,6275,6276],{},"color(display-p3 r g b [\u002F alpha])"," strings.",[5353,6279,6280,6285,6287],{},[5371,6281,6282],{},[18,6283,6284],{},"intake:named",[5371,6286,6182],{},[5371,6288,6289,6290,2991],{},"Parses CSS named color strings (e.g. ",[18,6291,6292],{},"rebeccapurple",[5353,6294,6295,6300,6302],{},[5371,6296,6297],{},[18,6298,6299],{},"intake:imagePixels",[5371,6301,6182],{},[5371,6303,6196,6304,231,6307,6310],{},[18,6305,6306],{},"ImageData",[18,6308,6309],{},"{data, width, height}",", pushing non-transparent pixels.",[5353,6312,6313,6318,6320],{},[5371,6314,6315],{},[18,6316,6317],{},"clamp:oklch",[5371,6319,6182],{},[5371,6321,6322],{},"Clamps each color's OKLCH lightness and chroma into role-defined (or default) ranges.",[5353,6324,6325,6330,6332],{},[5371,6326,6327],{},[18,6328,6329],{},"clamp:count",[5371,6331,6182],{},[5371,6333,6334,6335,6338],{},"Reduces colors to ",[18,6336,6337],{},"maxColors"," (default 64) via weighted median-cut clustering when exceeded.",[5353,6340,6341,6345,6347],{},[5371,6342,6343],{},[18,6344,1032],{},[5371,6346,6182],{},[5371,6348,6349],{},"Assigns colors to schema roles by hint match then OKLCH distance, then nudges into declared ranges.",[5353,6351,6352,6356,6358],{},[5371,6353,6354],{},[18,6355,1021],{},[5371,6357,6182],{},[5371,6359,6360,6361,6363],{},"Derives missing roles with ",[18,6362,4216],{}," set, applying OKLCH deltas from the source role.",[5353,6365,6366,6370,6372],{},[5371,6367,6368],{},[18,6369,1043],{},[5371,6371,6182],{},[5371,6373,6374,6375,6377],{},"Checks and nudges foreground role colors to meet ",[18,6376,4608],{}," for each contrast pair.",[5353,6379,6380,6384,6386],{},[5371,6381,6382],{},[18,6383,1054],{},[5371,6385,6182],{},[5371,6387,6388],{},"Produces light\u002Fdark variants by transforming all roles.",[5353,6390,6391,6396,6398],{},[5371,6392,6393],{},[18,6394,6395],{},"emit:json",[5371,6397,6182],{},[5371,6399,6400,6401,6404,6405,6408],{},"Writes ",[18,6402,6403],{},"outputs['core:json']"," with ",[18,6406,6407],{},"{colors, roles, variants}"," flattened to hex strings.",[23,6410,6412],{"id":6411},"studnickyiridis-contrast",[18,6413,6414],{},"@studnicky\u002Firidis-contrast",[5347,6416,6417,6427],{},[5350,6418,6419],{},[5353,6420,6421,6423,6425],{},[5356,6422,5361],{},[5356,6424,6168],{},[5356,6426,6171],{},[5366,6428,6429,6440,6451,6462],{},[5353,6430,6431,6435,6437],{},[5371,6432,6433],{},[18,6434,1567],{},[5371,6436,6182],{},[5371,6438,6439],{},"Enforces WCAG 2.1 AA contrast (4.5:1 normal text, 3:1 large\u002FUI) on all role pairs.",[5353,6441,6442,6446,6448],{},[5371,6443,6444],{},[18,6445,1578],{},[5371,6447,6182],{},[5371,6449,6450],{},"Enforces WCAG 2.1 AAA contrast (7:1 normal text, 4.5:1 large\u002FUI).",[5353,6452,6453,6457,6459],{},[5371,6454,6455],{},[18,6456,1589],{},[5371,6458,6182],{},[5371,6460,6461],{},"Enforces APCA (WCAG 3 draft) Lc targets: 75 body text, 60 fluent text, 45 non-text UI.",[5353,6463,6464,6468,6470],{},[5371,6465,6466],{},[18,6467,1600],{},[5371,6469,6182],{},[5371,6471,6472,6473,6476],{},"Simulates protanopia\u002Fdeuteranopia\u002Ftritanopia\u002Fachromatopsia against published thresholds; advisory by default, auto-corrects when ",[18,6474,6475],{},"input.contrast.cvdCorrect"," is true.",[23,6478,6480],{"id":6479},"studnickyiridis-image",[18,6481,6482],{},"@studnicky\u002Firidis-image",[5347,6484,6485,6495],{},[5350,6486,6487],{},[5353,6488,6489,6491,6493],{},[5356,6490,5361],{},[5356,6492,6168],{},[5356,6494,6171],{},[5366,6496,6497,6509,6521,6544],{},[5353,6498,6499,6504,6506],{},[5371,6500,6501],{},[18,6502,6503],{},"gallery:histogram",[5371,6505,6182],{},[5371,6507,6508],{},"Quantizes pixels into a 5-bit-per-channel histogram; emits weighted records keyed by bin centroid.",[5353,6510,6511,6516,6518],{},[5371,6512,6513],{},[18,6514,6515],{},"gallery:extract",[5371,6517,6182],{},[5371,6519,6520],{},"Reduces input records to K dominant colors via median-cut (weighted) or deltaE-merge clustering.",[5353,6522,6523,6528,6530],{},[5371,6524,6525],{},[18,6526,6527],{},"gallery:assignRoles",[5371,6529,6182],{},[5371,6531,6532,6533,343,6535,343,6538,343,6540,343,6542,316],{},"Assigns dominant colors to gallery roles: ",[18,6534,1702],{},[18,6536,6537],{},"frame",[18,6539,1698],{},[18,6541,4316],{},[18,6543,265],{},[5353,6545,6546,6551,6553],{},[5371,6547,6548],{},[18,6549,6550],{},"gallery:harmonize",[5371,6552,6182],{},[5371,6554,6555,6556,6559],{},"Shifts accent hue by 30° when its ",[18,6557,6558],{},"deltaE2000"," distance to the frame color is under 10.",[23,6561,6563],{"id":6562},"studnickyiridis-vscode",[18,6564,3043],{},[5347,6566,6567,6577],{},[5350,6568,6569],{},[5353,6570,6571,6573,6575],{},[5356,6572,5361],{},[5356,6574,6168],{},[5356,6576,6171],{},[5366,6578,6579,6590,6603,6617,6628],{},[5353,6580,6581,6585,6587],{},[5371,6582,6583],{},[18,6584,5320],{},[5371,6586,6182],{},[5371,6588,6589],{},"Derives 23 VS Code base token colors from the 16 resolved roles.",[5353,6591,6592,6596,6600],{},[5371,6593,6594],{},[18,6595,5324],{},[5371,6597,6598],{},[18,6599,5320],{},[5371,6601,6602],{},"Applies 10 color modifiers to base tokens, producing 253 semantic-token rules with re-enforced contrast.",[5353,6604,6605,6609,6613],{},[5371,6606,6607],{},[18,6608,5417],{},[5371,6610,6611],{},[18,6612,5324],{},[5371,6614,5420,6615,316],{},[18,6616,5423],{},[5353,6618,6619,6623,6625],{},[5371,6620,6621],{},[18,6622,5442],{},[5371,6624,6182],{},[5371,6626,6627],{},"Derives 100+ VS Code workbench colors from the 16-role palette.",[5353,6629,6630,6634,6640],{},[5371,6631,6632],{},[18,6633,5468],{},[5371,6635,6636,343,6638],{},[18,6637,5417],{},[18,6639,5442],{},[5371,6641,6642,6643,1689,6645,316],{},"Assembles the complete ",[18,6644,5297],{},[18,6646,5477],{},[23,6648,6650],{"id":6649},"studnickyiridis-stylesheet",[18,6651,358],{},[5347,6653,6654,6664],{},[5350,6655,6656],{},[5353,6657,6658,6660,6662],{},[5356,6659,5361],{},[5356,6661,6168],{},[5356,6663,6171],{},[5366,6665,6666,6677],{},[5353,6667,6668,6672,6674],{},[5371,6669,6670],{},[18,6671,354],{},[5371,6673,6182],{},[5371,6675,6676],{},"Emits CSS custom property blocks from resolved roles and variants.",[5353,6678,6679,6684,6686],{},[5371,6680,6681],{},[18,6682,6683],{},"emit:cssVarsScoped",[5371,6685,6182],{},[5371,6687,6688],{},"Emits per-category scoped CSS custom property blocks for Vue\u002FCapacitor use cases.",[23,6690,6692],{"id":6691},"studnickyiridis-tailwind",[18,6693,2996],{},[5347,6695,6696,6706],{},[5350,6697,6698],{},[5353,6699,6700,6702,6704],{},[5356,6701,5361],{},[5356,6703,6168],{},[5356,6705,6171],{},[5366,6707,6708],{},[5353,6709,6710,6715,6717],{},[5371,6711,6712],{},[18,6713,6714],{},"emit:tailwindTheme",[5371,6716,6182],{},[5371,6718,6719,6720,6723],{},"Emits a Tailwind ",[18,6721,6722],{},"theme.colors"," object and config module from resolved roles.",[23,6725,6727],{"id":6726},"studnickyiridis-shadcn",[18,6728,878],{},[5347,6730,6731,6741],{},[5350,6732,6733],{},[5353,6734,6735,6737,6739],{},[5356,6736,5361],{},[5356,6738,6168],{},[5356,6740,6171],{},[5366,6742,6743],{},[5353,6744,6745,6750,6752],{},[5371,6746,6747],{},[18,6748,6749],{},"emit:shadcnTheme",[5371,6751,6182],{},[5371,6753,6754],{},"Emits a shadcn\u002Fui-compatible CSS custom-property theme (OKLCH, Tailwind v4 convention) from resolved roles.",[23,6756,6758],{"id":6757},"studnickyiridis-mui",[18,6759,3018],{},[5347,6761,6762,6772],{},[5350,6763,6764],{},[5353,6765,6766,6768,6770],{},[5356,6767,5361],{},[5356,6769,6168],{},[5356,6771,6171],{},[5366,6773,6774],{},[5353,6775,6776,6781,6783],{},[5371,6777,6778],{},[18,6779,6780],{},"emit:muiTheme",[5371,6782,6182],{},[5371,6784,6785,6786,6788],{},"Emits an MUI ",[18,6787,3022],{}," palette object from resolved roles and shade variants.",[23,6790,6792],{"id":6791},"studnickyiridis-chakra",[18,6793,3028],{},[5347,6795,6796,6806],{},[5350,6797,6798],{},[5353,6799,6800,6802,6804],{},[5356,6801,5361],{},[5356,6803,6168],{},[5356,6805,6171],{},[5366,6807,6808],{},[5353,6809,6810,6815,6817],{},[5371,6811,6812],{},[18,6813,6814],{},"emit:chakraTheme",[5371,6816,6182],{},[5371,6818,6819,6820,6822],{},"Emits a Chakra UI ",[18,6821,3032],{}," color-token scale (100\u002F500\u002F900 per family) from resolved roles and dark\u002Flight variants.",[23,6824,6826],{"id":6825},"studnickyiridis-panda",[18,6827,3037],{},[5347,6829,6830,6840],{},[5350,6831,6832],{},[5353,6833,6834,6836,6838],{},[5356,6835,5361],{},[5356,6837,6168],{},[5356,6839,6171],{},[5366,6841,6842],{},[5353,6843,6844,6849,6851],{},[5371,6845,6846],{},[18,6847,6848],{},"emit:pandaTheme",[5371,6850,6182],{},[5371,6852,6853],{},"Emits Panda CSS token config and a UnoCSS-compatible theme object from the same resolved-role color map.",[23,6855,6857],{"id":6856},"studnickyiridis-capacitor",[18,6858,3056],{},[5347,6860,6861,6871],{},[5350,6862,6863],{},[5353,6864,6865,6867,6869],{},[5356,6866,5361],{},[5356,6868,6168],{},[5356,6870,6171],{},[5366,6872,6873,6892,6910,6921],{},[5353,6874,6875,6879,6881],{},[5371,6876,6877],{},[18,6878,1631],{},[5371,6880,6182],{},[5371,6882,6883,6884,6886,6887,2835,6889,6891],{},"Emits Capacitor ",[18,6885,1330],{}," configuration from the ",[18,6888,1705],{},[18,6890,2838],{}," role.",[5353,6893,6894,6899,6901],{},[5371,6895,6896],{},[18,6897,6898],{},"emit:capacitorSplashScreen",[5371,6900,6182],{},[5371,6902,6903,6904,6906,6907,316],{},"Emits Capacitor splash screen configuration from ",[18,6905,1705],{}," or an input-specified ",[18,6908,6909],{},"splashRole",[5353,6911,6912,6916,6918],{},[5371,6913,6914],{},[18,6915,1642],{},[5371,6917,6182],{},[5371,6919,6920],{},"Emits a flat Capacitor theme map from resolved roles for native preference storage.",[5353,6922,6923,6928,6930],{},[5371,6924,6925],{},[18,6926,6927],{},"emit:androidThemeXml",[5371,6929,6182],{},[5371,6931,6932,6933,6936],{},"Emits an Android ",[18,6934,6935],{},"themes.xml"," fragment for the Capacitor splash screen and status bar.",[23,6938,6940],{"id":6939},"studnickyiridis-rdf",[18,6941,3066],{},[5347,6943,6944,6954],{},[5350,6945,6946],{},[5353,6947,6948,6950,6952],{},[5356,6949,5361],{},[5356,6951,6168],{},[5356,6953,6171],{},[5366,6955,6956,6972],{},[5353,6957,6958,6963,6965],{},[5371,6959,6960],{},[18,6961,6962],{},"reason:annotate",[5371,6964,6182],{},[5371,6966,6967,6968,6971],{},"Annotates the palette with RDF triples via an ",[18,6969,6970],{},"n3"," Store.",[5353,6973,6974,6979,6981],{},[5371,6975,6976],{},[18,6977,6978],{},"reason:serialize",[5371,6980,6182],{},[5371,6982,6983,6984,6987],{},"Serializes ",[18,6985,6986],{},"rdf:reasoningGraph"," to Turtle \u002F TriG \u002F N-Quads \u002F JSON-LD.",{"title":36,"searchDepth":50,"depth":50,"links":6989},[6990,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001,7002],{"id":6154,"depth":50,"text":6991},"Core (@studnicky\u002Firidis)",{"id":6411,"depth":50,"text":6414},{"id":6479,"depth":50,"text":6482},{"id":6562,"depth":50,"text":3043},{"id":6649,"depth":50,"text":358},{"id":6691,"depth":50,"text":2996},{"id":6726,"depth":50,"text":878},{"id":6757,"depth":50,"text":3018},{"id":6791,"depth":50,"text":3028},{"id":6825,"depth":50,"text":3037},{"id":6856,"depth":50,"text":3056},{"id":6939,"depth":50,"text":3066},"Every task registered by the core engine and each official plugin, grouped by plugin.",{},"\u002F09-task-registry-reference",{"title":6135,"description":7003},"09-task-registry-reference","Ao4llvZ5fqwspk-2WWRFiX6xI2f00o5aADqYV2psqQI",{"id":7010,"title":7011,"body":7012,"description":11177,"extension":246,"meta":11178,"navigation":67,"path":11179,"seo":11180,"stem":11181,"__hash__":11182},"docs\u002F10-math-primitives-reference.md","10. Math Primitives Reference",{"type":8,"value":7013,"toc":11168},[7014,7024,7123,7126,7130,7133,7139,7399,7412,7700,7706,10629,10633,10820,10824,10926,10930,11022,11026,11096,11100,11165],[11,7015,7016,7017,7020,7021,7023],{},"iridis exports every internal colour-math primitive as a singleton class (",[18,7018,7019],{},"packages\u002Fcore\u002Fsrc\u002Fmath\u002F","). Each has a single ",[18,7022,2858],{}," method — no shared base class, no state. If you only need one calculation, import the singleton directly without touching the pipeline:",[31,7025,7027],{"className":127,"code":7026,"language":129,"meta":36,"style":36},"import { luminance, contrastWcag21, oklchToRgb } from '@studnicky\u002Firidis';\n\nconst ratio = contrastWcag21.apply(foreground, background);\nconst rgb = oklchToRgb.apply(0.62, 0.18, 290);\n",[18,7028,7029,7060,7064,7089],{"__ignoreMap":36},[40,7030,7031,7033,7035,7038,7040,7043,7045,7048,7050,7052,7054,7056,7058],{"class":42,"line":43},[40,7032,137],{"class":136},[40,7034,141],{"class":140},[40,7036,7037],{"class":87}," luminance",[40,7039,196],{"class":140},[40,7041,7042],{"class":87}," contrastWcag21",[40,7044,196],{"class":140},[40,7046,7047],{"class":87}," oklchToRgb",[40,7049,147],{"class":140},[40,7051,150],{"class":136},[40,7053,153],{"class":140},[40,7055,20],{"class":57},[40,7057,158],{"class":140},[40,7059,161],{"class":140},[40,7061,7062],{"class":42,"line":50},[40,7063,68],{"emptyLinePlaceholder":67},[40,7065,7066,7068,7071,7073,7075,7077,7079,7082,7084,7087],{"class":42,"line":64},[40,7067,171],{"class":170},[40,7069,7070],{"class":87}," ratio ",[40,7072,177],{"class":140},[40,7074,7042],{"class":87},[40,7076,316],{"class":140},[40,7078,1774],{"class":183},[40,7080,7081],{"class":87},"(foreground",[40,7083,196],{"class":140},[40,7085,7086],{"class":87}," background)",[40,7088,161],{"class":140},[40,7090,7091,7093,7096,7098,7100,7102,7104,7106,7109,7111,7114,7116,7119,7121],{"class":42,"line":71},[40,7092,171],{"class":170},[40,7094,7095],{"class":87}," rgb ",[40,7097,177],{"class":140},[40,7099,7047],{"class":87},[40,7101,316],{"class":140},[40,7103,1774],{"class":183},[40,7105,526],{"class":87},[40,7107,7108],{"class":3248},"0.62",[40,7110,196],{"class":140},[40,7112,7113],{"class":3248}," 0.18",[40,7115,196],{"class":140},[40,7117,7118],{"class":3248}," 290",[40,7120,118],{"class":87},[40,7122,161],{"class":140},[11,7124,7125],{},"The full-formula walkthroughs for WCAG 2.1 and APCA contrast math live in the live demo cards on this site (see the contrast and color-space explorer components), not duplicated here — the table below documents the callable surface only.",[23,7127,7129],{"id":7128},"real-implementations","Real implementations",[11,7131,7132],{},"Three of the more interesting primitives, straight from source:",[11,7134,7135,7138],{},[18,7136,7137],{},"luminance"," is the WCAG 2.1 relative-luminance calculation that every contrast primitive builds on:",[31,7140,7142],{"className":127,"code":7141,"language":129,"meta":36,"style":36},"import type { ColorRecordInterfaceType } from '..\u002Ftypes\u002Findex.ts';\n\nimport { srgbToLinear } from '.\u002FSrgbToLinear.ts';\n\nclass Luminance {\n  readonly 'name' = 'luminance';\n\n  apply(color: ColorRecordInterfaceType): number {\n    const lin = srgbToLinear.apply(color.rgb.r, color.rgb.g, color.rgb.b);\n    return 0.2126 * lin.r + 0.7152 * lin.g + 0.0722 * lin.b;\n  }\n}\n\n\u002F** Singleton instance registered as the `luminance` math primitive. *\u002F\nexport const luminance = new Luminance();\n",[18,7143,7144,7169,7173,7195,7199,7209,7229,7233,7255,7315,7361,7365,7369,7373,7378],{"__ignoreMap":36},[40,7145,7146,7148,7151,7153,7156,7158,7160,7162,7165,7167],{"class":42,"line":43},[40,7147,137],{"class":136},[40,7149,7150],{"class":136}," type",[40,7152,141],{"class":140},[40,7154,7155],{"class":87}," ColorRecordInterfaceType",[40,7157,147],{"class":140},[40,7159,150],{"class":136},[40,7161,153],{"class":140},[40,7163,7164],{"class":57},"..\u002Ftypes\u002Findex.ts",[40,7166,158],{"class":140},[40,7168,161],{"class":140},[40,7170,7171],{"class":42,"line":50},[40,7172,68],{"emptyLinePlaceholder":67},[40,7174,7175,7177,7179,7182,7184,7186,7188,7191,7193],{"class":42,"line":64},[40,7176,137],{"class":136},[40,7178,141],{"class":140},[40,7180,7181],{"class":87}," srgbToLinear",[40,7183,147],{"class":140},[40,7185,150],{"class":136},[40,7187,153],{"class":140},[40,7189,7190],{"class":57},".\u002FSrgbToLinear.ts",[40,7192,158],{"class":140},[40,7194,161],{"class":140},[40,7196,7197],{"class":42,"line":71},[40,7198,68],{"emptyLinePlaceholder":67},[40,7200,7201,7204,7207],{"class":42,"line":77},[40,7202,7203],{"class":170},"class",[40,7205,7206],{"class":53}," Luminance",[40,7208,401],{"class":140},[40,7210,7211,7213,7215,7217,7219,7221,7223,7225,7227],{"class":42,"line":91},[40,7212,1793],{"class":170},[40,7214,153],{"class":140},[40,7216,3804],{"class":57},[40,7218,158],{"class":140},[40,7220,1376],{"class":140},[40,7222,153],{"class":140},[40,7224,7137],{"class":57},[40,7226,158],{"class":140},[40,7228,161],{"class":140},[40,7230,7231],{"class":42,"line":99},[40,7232,68],{"emptyLinePlaceholder":67},[40,7234,7235,7238,7240,7243,7245,7247,7250,7253],{"class":42,"line":107},[40,7236,7237],{"class":406},"  apply",[40,7239,526],{"class":140},[40,7241,7242],{"class":2178},"color",[40,7244,410],{"class":140},[40,7246,7155],{"class":53},[40,7248,7249],{"class":140},"):",[40,7251,7252],{"class":53}," number",[40,7254,401],{"class":140},[40,7256,7257,7260,7263,7265,7267,7269,7271,7273,7275,7277,7280,7282,7285,7287,7289,7291,7293,7295,7298,7300,7302,7304,7306,7308,7311,7313],{"class":42,"line":489},[40,7258,7259],{"class":170},"    const",[40,7261,7262],{"class":87}," lin",[40,7264,1376],{"class":140},[40,7266,7181],{"class":87},[40,7268,316],{"class":140},[40,7270,1774],{"class":183},[40,7272,526],{"class":406},[40,7274,7242],{"class":87},[40,7276,316],{"class":140},[40,7278,7279],{"class":87},"rgb",[40,7281,316],{"class":140},[40,7283,7284],{"class":87},"r",[40,7286,196],{"class":140},[40,7288,2741],{"class":87},[40,7290,316],{"class":140},[40,7292,7279],{"class":87},[40,7294,316],{"class":140},[40,7296,7297],{"class":87},"g",[40,7299,196],{"class":140},[40,7301,2741],{"class":87},[40,7303,316],{"class":140},[40,7305,7279],{"class":87},[40,7307,316],{"class":140},[40,7309,7310],{"class":87},"b",[40,7312,118],{"class":406},[40,7314,161],{"class":140},[40,7316,7317,7320,7323,7326,7328,7330,7332,7335,7338,7340,7342,7344,7346,7348,7351,7353,7355,7357,7359],{"class":42,"line":495},[40,7318,7319],{"class":136},"    return",[40,7321,7322],{"class":3248}," 0.2126",[40,7324,7325],{"class":140}," *",[40,7327,7262],{"class":87},[40,7329,316],{"class":140},[40,7331,7284],{"class":87},[40,7333,7334],{"class":140}," +",[40,7336,7337],{"class":3248}," 0.7152",[40,7339,7325],{"class":140},[40,7341,7262],{"class":87},[40,7343,316],{"class":140},[40,7345,7297],{"class":87},[40,7347,7334],{"class":140},[40,7349,7350],{"class":3248}," 0.0722",[40,7352,7325],{"class":140},[40,7354,7262],{"class":87},[40,7356,316],{"class":140},[40,7358,7310],{"class":87},[40,7360,161],{"class":140},[40,7362,7363],{"class":42,"line":500},[40,7364,1435],{"class":140},[40,7366,7367],{"class":42,"line":506},[40,7368,773],{"class":140},[40,7370,7371],{"class":42,"line":532},[40,7372,68],{"emptyLinePlaceholder":67},[40,7374,7375],{"class":42,"line":564},[40,7376,7377],{"class":46},"\u002F** Singleton instance registered as the `luminance` math primitive. *\u002F\n",[40,7379,7380,7383,7386,7389,7391,7393,7395,7397],{"class":42,"line":574},[40,7381,7382],{"class":136},"export",[40,7384,7385],{"class":170}," const",[40,7387,7388],{"class":87}," luminance ",[40,7390,177],{"class":140},[40,7392,898],{"class":140},[40,7394,7206],{"class":183},[40,7396,903],{"class":87},[40,7398,161],{"class":140},[11,7400,7401,7404,7405,7407,7408,7411],{},[18,7402,7403],{},"contrastWcag21"," composes ",[18,7406,7137],{}," into the standard ",[18,7409,7410],{},"(lighter + 0.05) \u002F (darker + 0.05)"," ratio:",[31,7413,7415],{"className":127,"code":7414,"language":129,"meta":36,"style":36},"import type { ColorRecordInterfaceType } from '..\u002Ftypes\u002Findex.ts';\n\nimport { luminance } from '.\u002FLuminance.ts';\n\nclass ContrastWcag21 {\n  readonly 'name' = 'contrastWcag21';\n\n  apply(a: ColorRecordInterfaceType, b: ColorRecordInterfaceType): number {\n    const l1 = luminance.apply(a);\n    const l2 = luminance.apply(b);\n    const lighter = Math.max(l1, l2);\n    const darker  = Math.min(l1, l2);\n    return (lighter + 0.05) \u002F (darker + 0.05);\n  }\n}\n\n\u002F** Singleton instance registered as the `contrastWcag21` math primitive. *\u002F\nexport const contrastWcag21 = new ContrastWcag21();\n",[18,7416,7417,7439,7443,7464,7468,7477,7497,7501,7528,7551,7574,7604,7633,7664,7668,7672,7676,7681],{"__ignoreMap":36},[40,7418,7419,7421,7423,7425,7427,7429,7431,7433,7435,7437],{"class":42,"line":43},[40,7420,137],{"class":136},[40,7422,7150],{"class":136},[40,7424,141],{"class":140},[40,7426,7155],{"class":87},[40,7428,147],{"class":140},[40,7430,150],{"class":136},[40,7432,153],{"class":140},[40,7434,7164],{"class":57},[40,7436,158],{"class":140},[40,7438,161],{"class":140},[40,7440,7441],{"class":42,"line":50},[40,7442,68],{"emptyLinePlaceholder":67},[40,7444,7445,7447,7449,7451,7453,7455,7457,7460,7462],{"class":42,"line":64},[40,7446,137],{"class":136},[40,7448,141],{"class":140},[40,7450,7037],{"class":87},[40,7452,147],{"class":140},[40,7454,150],{"class":136},[40,7456,153],{"class":140},[40,7458,7459],{"class":57},".\u002FLuminance.ts",[40,7461,158],{"class":140},[40,7463,161],{"class":140},[40,7465,7466],{"class":42,"line":71},[40,7467,68],{"emptyLinePlaceholder":67},[40,7469,7470,7472,7475],{"class":42,"line":77},[40,7471,7203],{"class":170},[40,7473,7474],{"class":53}," ContrastWcag21",[40,7476,401],{"class":140},[40,7478,7479,7481,7483,7485,7487,7489,7491,7493,7495],{"class":42,"line":91},[40,7480,1793],{"class":170},[40,7482,153],{"class":140},[40,7484,3804],{"class":57},[40,7486,158],{"class":140},[40,7488,1376],{"class":140},[40,7490,153],{"class":140},[40,7492,7403],{"class":57},[40,7494,158],{"class":140},[40,7496,161],{"class":140},[40,7498,7499],{"class":42,"line":99},[40,7500,68],{"emptyLinePlaceholder":67},[40,7502,7503,7505,7507,7509,7511,7513,7515,7518,7520,7522,7524,7526],{"class":42,"line":107},[40,7504,7237],{"class":406},[40,7506,526],{"class":140},[40,7508,1296],{"class":2178},[40,7510,410],{"class":140},[40,7512,7155],{"class":53},[40,7514,196],{"class":140},[40,7516,7517],{"class":2178}," b",[40,7519,410],{"class":140},[40,7521,7155],{"class":53},[40,7523,7249],{"class":140},[40,7525,7252],{"class":53},[40,7527,401],{"class":140},[40,7529,7530,7532,7535,7537,7539,7541,7543,7545,7547,7549],{"class":42,"line":489},[40,7531,7259],{"class":170},[40,7533,7534],{"class":87}," l1",[40,7536,1376],{"class":140},[40,7538,7037],{"class":87},[40,7540,316],{"class":140},[40,7542,1774],{"class":183},[40,7544,526],{"class":406},[40,7546,1296],{"class":87},[40,7548,118],{"class":406},[40,7550,161],{"class":140},[40,7552,7553,7555,7558,7560,7562,7564,7566,7568,7570,7572],{"class":42,"line":495},[40,7554,7259],{"class":170},[40,7556,7557],{"class":87}," l2",[40,7559,1376],{"class":140},[40,7561,7037],{"class":87},[40,7563,316],{"class":140},[40,7565,1774],{"class":183},[40,7567,526],{"class":406},[40,7569,7310],{"class":87},[40,7571,118],{"class":406},[40,7573,161],{"class":140},[40,7575,7576,7578,7581,7583,7586,7588,7591,7593,7596,7598,7600,7602],{"class":42,"line":500},[40,7577,7259],{"class":170},[40,7579,7580],{"class":87}," lighter",[40,7582,1376],{"class":140},[40,7584,7585],{"class":87}," Math",[40,7587,316],{"class":140},[40,7589,7590],{"class":183},"max",[40,7592,526],{"class":406},[40,7594,7595],{"class":87},"l1",[40,7597,196],{"class":140},[40,7599,7557],{"class":87},[40,7601,118],{"class":406},[40,7603,161],{"class":140},[40,7605,7606,7608,7611,7614,7616,7618,7621,7623,7625,7627,7629,7631],{"class":42,"line":506},[40,7607,7259],{"class":170},[40,7609,7610],{"class":87}," darker",[40,7612,7613],{"class":140},"  =",[40,7615,7585],{"class":87},[40,7617,316],{"class":140},[40,7619,7620],{"class":183},"min",[40,7622,526],{"class":406},[40,7624,7595],{"class":87},[40,7626,196],{"class":140},[40,7628,7557],{"class":87},[40,7630,118],{"class":406},[40,7632,161],{"class":140},[40,7634,7635,7637,7639,7642,7644,7647,7649,7651,7653,7656,7658,7660,7662],{"class":42,"line":532},[40,7636,7319],{"class":136},[40,7638,918],{"class":406},[40,7640,7641],{"class":87},"lighter",[40,7643,7334],{"class":140},[40,7645,7646],{"class":3248}," 0.05",[40,7648,1404],{"class":406},[40,7650,2835],{"class":140},[40,7652,918],{"class":406},[40,7654,7655],{"class":87},"darker",[40,7657,7334],{"class":140},[40,7659,7646],{"class":3248},[40,7661,118],{"class":406},[40,7663,161],{"class":140},[40,7665,7666],{"class":42,"line":564},[40,7667,1435],{"class":140},[40,7669,7670],{"class":42,"line":574},[40,7671,773],{"class":140},[40,7673,7674],{"class":42,"line":584},[40,7675,68],{"emptyLinePlaceholder":67},[40,7677,7678],{"class":42,"line":589},[40,7679,7680],{"class":46},"\u002F** Singleton instance registered as the `contrastWcag21` math primitive. *\u002F\n",[40,7682,7683,7685,7687,7690,7692,7694,7696,7698],{"class":42,"line":595},[40,7684,7382],{"class":136},[40,7686,7385],{"class":170},[40,7688,7689],{"class":87}," contrastWcag21 ",[40,7691,177],{"class":140},[40,7693,898],{"class":140},[40,7695,7474],{"class":183},[40,7697,903],{"class":87},[40,7699,161],{"class":140},[11,7701,7702,7705],{},[18,7703,7704],{},"ensureContrast"," is the least trivial of the set — it walks OKLCH lightness in a bounded loop until a foreground clears a target ratio against a background, preserving the color's original gamut (sRGB vs. wide-gamut) on the way back out:",[31,7707,7709],{"className":127,"code":7708,"language":129,"meta":36,"style":36},"import type { ColorRecordInterfaceType, ContrastAlgorithmType, RgbInterfaceType, SourceFormatType } from '..\u002Ftypes\u002Findex.ts';\n\nimport { clamp01 } from '.\u002FClamp01.ts';\nimport { colorRecordFactory } from '.\u002FColorRecordFactory.ts';\nimport { oklchToRgbRaw } from '.\u002FOklchToRgbRaw.ts';\nimport { srgbToLinear } from '.\u002FSrgbToLinear.ts';\n\nconst APCA_NORM_BG  = 0.56;\nconst APCA_NORM_TXT = 0.57;\nconst APCA_CLAMP    = 0.022;\nconst APCA_CLAMP_P  = 1.414;\nconst APCA_SCALE    = 1.14;\nconst APCA_LOW_CLIP = 0.001;\nconst APCA_OFFSET   = 0.027;\n\n\u002F** sRGB-family source formats. When the original foreground was sourced from\n *  one of these, the adjusted record must remain sRGB (no displayP3 slot).   *\u002F\nconst SRGB_FORMATS: ReadonlySet\u003CSourceFormatType> = new Set([\n  'hex', 'hsl', 'imagePixel', 'lab', 'named', 'rgb'\n]);\n\n\u002F** WCAG 2.1 relative luminance from a gamma-encoded sRGB triple in 0..1.\n *  Equivalent to `luminance.apply({rgb: {r, g, b}, ...})` without the\n *  record allocation.                                                    *\u002F\nfunction rgbLuminance(r: number, g: number, b: number): number {\n  const lin = srgbToLinear.apply(r, g, b);\n  return 0.2126 * lin.r + 0.7152 * lin.g + 0.0722 * lin.b;\n}\n\n\u002F** WCAG 2.1 contrast ratio between two precomputed luminances. *\u002F\nfunction wcagRatio(la: number, lb: number): number {\n  const lighter = Math.max(la, lb);\n  const darker  = Math.min(la, lb);\n  return (lighter + 0.05) \u002F (darker + 0.05);\n}\n\n\u002F** APCA Lc foreground luminance (text exponent). *\u002F\nfunction apcaFg(r: number, g: number, b: number): number {\n  const lin = srgbToLinear.apply(r, g, b);\n  return 0.2126729 * Math.pow(lin.r, 0.56)\n       + 0.7151522 * Math.pow(lin.g, 0.56)\n       + 0.0721750 * Math.pow(lin.b, 0.56);\n}\n\n\u002F** APCA Lc background luminance (background exponent). *\u002F\nfunction apcaBg(r: number, g: number, b: number): number {\n  const lin = srgbToLinear.apply(r, g, b);\n  return 0.2126729 * Math.pow(lin.r, 0.65)\n       + 0.7151522 * Math.pow(lin.g, 0.65)\n       + 0.0721750 * Math.pow(lin.b, 0.65);\n}\n\n\u002F** APCA Lc absolute value between text and background, computed from\n *  the text's foreground-luminance and the precomputed background. *\u002F\nfunction apcaLcFromYtxt(Ytxt: number, Ybg: number): number {\n  const txtClamp = Ytxt \u003C APCA_CLAMP ? Ytxt + Math.pow(APCA_CLAMP - Ytxt, APCA_CLAMP_P) : Ytxt;\n  const bgClamp  = Ybg  \u003C APCA_CLAMP ? Ybg  + Math.pow(APCA_CLAMP - Ybg,  APCA_CLAMP_P) : Ybg;\n\n  let Lc = 0;\n  if (bgClamp > txtClamp) {\n    Lc = (Math.pow(bgClamp, APCA_NORM_BG) - Math.pow(txtClamp, APCA_NORM_TXT)) * APCA_SCALE;\n    if (Lc \u003C APCA_LOW_CLIP) {return 0;}\n    Lc = Lc - APCA_OFFSET;\n  } else {\n    Lc = (Math.pow(bgClamp, 0.62) - Math.pow(txtClamp, 0.65)) * APCA_SCALE;\n    if (Lc > -APCA_LOW_CLIP) {return 0;}\n    Lc = Lc + APCA_OFFSET;\n  }\n  return Math.abs(Lc * 100);\n}\n\nclass EnsureContrast {\n  readonly 'name' = 'ensureContrast';\n\n  \u002F**\n   * Adjusts `foreground` along the OKLCH L axis until its contrast against\n   * `background` meets `minRatio` for the given `algorithm`. The inner\n   * loop operates on a scalar `L` value; no `ColorRecord` is allocated\n   * per iteration. The background's luminance is computed once. A single\n   * `ColorRecord` is materialised at return via `colorRecordFactory`.\n   *\n   * Gamut preservation: the adjusted record inherits `foreground.sourceFormat`.\n   * When that format is an sRGB-family format (`hex`, `rgb`, `hsl`, `lab`,\n   * `named`, `imagePixel`), the record is built via `fromRgb` using the\n   * sRGB-clamped coordinates computed during the loop — preventing a\n   * spurious `displayP3` slot from appearing on a colour that was never\n   * wide-gamut. When the source is `displayP3` or `oklch`, `fromOklch` is\n   * used so the wide-gamut `displayP3` slot is re-derived as expected.\n   *\u002F\n  apply(\n    foreground: ColorRecordInterfaceType,\n    background: ColorRecordInterfaceType,\n    minRatio: number,\n    algorithm: ContrastAlgorithmType = 'wcag21'\n  ): ColorRecordInterfaceType {\n    \u002F\u002F Precompute background luminance once; it never changes during the loop.\n    const bgRgb: RgbInterfaceType = background.rgb;\n    const Ybg = algorithm === 'wcag21'\n      ? rgbLuminance(bgRgb.r, bgRgb.g, bgRgb.b)\n      : apcaBg(bgRgb.r, bgRgb.g, bgRgb.b);\n\n    \u002F\u002F Compute initial foreground contrast from its existing rgb.\n    const fgRgb: RgbInterfaceType = foreground.rgb;\n    const initialContrast = algorithm === 'wcag21'\n      ? wcagRatio(rgbLuminance(fgRgb.r, fgRgb.g, fgRgb.b), Ybg)\n      : apcaLcFromYtxt(apcaFg(fgRgb.r, fgRgb.g, fgRgb.b), Ybg);\n\n    if (initialContrast >= minRatio) {\n      return foreground;\n    }\n\n    const fgL    = foreground.oklch.l;\n    const c      = foreground.oklch.c;\n    const h      = foreground.oklch.h;\n    const a      = foreground.alpha;\n    const fmt    = foreground.sourceFormat;\n    const hints  = foreground.hints;\n    const isSrgb = SRGB_FORMATS.has(fmt);\n    const step   = fgL \u003C background.oklch.l ? -0.02 : 0.02;\n\n    let currentL = fgL;\n    let lastL    = currentL;\n    let lastRgb: RgbInterfaceType = fgRgb;\n\n    for (let i = 0; i \u003C 50; i++) {\n      const newL = clamp01.apply(currentL + step);\n      const rgb  = oklchToRgbRaw.apply(newL, c, h);\n\n      const ratio = algorithm === 'wcag21'\n        ? wcagRatio(rgbLuminance(rgb.r, rgb.g, rgb.b), Ybg)\n        : apcaLcFromYtxt(apcaFg(rgb.r, rgb.g, rgb.b), Ybg);\n\n      lastL   = newL;\n      lastRgb = rgb;\n\n      if (ratio >= minRatio) {\n        return isSrgb\n          ? colorRecordFactory.fromRgb(rgb.r, rgb.g, rgb.b, { 'alpha': a, 'hints': hints, 'sourceFormat': fmt })\n          : colorRecordFactory.fromOklch(newL, c, h, { 'alpha': a, 'hints': hints, 'sourceFormat': fmt });\n      }\n\n      if (newL === 0 || newL === 1) {\n        return isSrgb\n          ? colorRecordFactory.fromRgb(rgb.r, rgb.g, rgb.b, { 'alpha': a, 'hints': hints, 'sourceFormat': fmt })\n          : colorRecordFactory.fromOklch(newL, c, h, { 'alpha': a, 'hints': hints, 'sourceFormat': fmt });\n      }\n\n      currentL = newL;\n    }\n\n    return isSrgb\n      ? colorRecordFactory.fromRgb(lastRgb.r, lastRgb.g, lastRgb.b, { 'alpha': a, 'hints': hints, 'sourceFormat': fmt })\n      : colorRecordFactory.fromOklch(lastL, c, h, { 'alpha': a, 'hints': hints, 'sourceFormat': fmt });\n  }\n}\n\n\u002F** Singleton instance registered as the `ensureContrast` math primitive. *\u002F\nexport const ensureContrast = new EnsureContrast();\n",[18,7710,7711,7748,7752,7774,7796,7818,7838,7842,7856,7870,7884,7898,7912,7926,7940,7944,7949,7954,7983,8036,8042,8046,8051,8056,8061,8100,8130,8171,8175,8179,8184,8215,8241,8267,8295,8299,8303,8308,8345,8375,8406,8436,8467,8471,8475,8480,8517,8547,8575,8603,8633,8637,8641,8646,8651,8682,8735,8784,8788,8803,8821,8877,8904,8919,8928,8977,9002,9016,9020,9044,9048,9052,9061,9081,9085,9090,9095,9100,9105,9110,9115,9120,9125,9130,9135,9140,9145,9150,9155,9160,9167,9178,9189,9200,9218,9228,9234,9257,9277,9312,9348,9353,9359,9382,9402,9447,9493,9498,9518,9528,9533,9538,9563,9587,9610,9629,9648,9667,9693,9732,9737,9752,9766,9784,9789,9827,9857,9890,9895,9915,9959,10005,10010,10022,10034,10039,10058,10067,10146,10215,10220,10225,10252,10259,10336,10403,10408,10413,10425,10430,10435,10442,10520,10588,10593,10598,10603,10609],{"__ignoreMap":36},[40,7712,7713,7715,7717,7719,7721,7723,7726,7728,7731,7733,7736,7738,7740,7742,7744,7746],{"class":42,"line":43},[40,7714,137],{"class":136},[40,7716,7150],{"class":136},[40,7718,141],{"class":140},[40,7720,7155],{"class":87},[40,7722,196],{"class":140},[40,7724,7725],{"class":87}," ContrastAlgorithmType",[40,7727,196],{"class":140},[40,7729,7730],{"class":87}," RgbInterfaceType",[40,7732,196],{"class":140},[40,7734,7735],{"class":87}," SourceFormatType",[40,7737,147],{"class":140},[40,7739,150],{"class":136},[40,7741,153],{"class":140},[40,7743,7164],{"class":57},[40,7745,158],{"class":140},[40,7747,161],{"class":140},[40,7749,7750],{"class":42,"line":50},[40,7751,68],{"emptyLinePlaceholder":67},[40,7753,7754,7756,7758,7761,7763,7765,7767,7770,7772],{"class":42,"line":64},[40,7755,137],{"class":136},[40,7757,141],{"class":140},[40,7759,7760],{"class":87}," clamp01",[40,7762,147],{"class":140},[40,7764,150],{"class":136},[40,7766,153],{"class":140},[40,7768,7769],{"class":57},".\u002FClamp01.ts",[40,7771,158],{"class":140},[40,7773,161],{"class":140},[40,7775,7776,7778,7780,7783,7785,7787,7789,7792,7794],{"class":42,"line":71},[40,7777,137],{"class":136},[40,7779,141],{"class":140},[40,7781,7782],{"class":87}," colorRecordFactory",[40,7784,147],{"class":140},[40,7786,150],{"class":136},[40,7788,153],{"class":140},[40,7790,7791],{"class":57},".\u002FColorRecordFactory.ts",[40,7793,158],{"class":140},[40,7795,161],{"class":140},[40,7797,7798,7800,7802,7805,7807,7809,7811,7814,7816],{"class":42,"line":77},[40,7799,137],{"class":136},[40,7801,141],{"class":140},[40,7803,7804],{"class":87}," oklchToRgbRaw",[40,7806,147],{"class":140},[40,7808,150],{"class":136},[40,7810,153],{"class":140},[40,7812,7813],{"class":57},".\u002FOklchToRgbRaw.ts",[40,7815,158],{"class":140},[40,7817,161],{"class":140},[40,7819,7820,7822,7824,7826,7828,7830,7832,7834,7836],{"class":42,"line":91},[40,7821,137],{"class":136},[40,7823,141],{"class":140},[40,7825,7181],{"class":87},[40,7827,147],{"class":140},[40,7829,150],{"class":136},[40,7831,153],{"class":140},[40,7833,7190],{"class":57},[40,7835,158],{"class":140},[40,7837,161],{"class":140},[40,7839,7840],{"class":42,"line":99},[40,7841,68],{"emptyLinePlaceholder":67},[40,7843,7844,7846,7849,7851,7854],{"class":42,"line":107},[40,7845,171],{"class":170},[40,7847,7848],{"class":87}," APCA_NORM_BG  ",[40,7850,177],{"class":140},[40,7852,7853],{"class":3248}," 0.56",[40,7855,161],{"class":140},[40,7857,7858,7860,7863,7865,7868],{"class":42,"line":489},[40,7859,171],{"class":170},[40,7861,7862],{"class":87}," APCA_NORM_TXT ",[40,7864,177],{"class":140},[40,7866,7867],{"class":3248}," 0.57",[40,7869,161],{"class":140},[40,7871,7872,7874,7877,7879,7882],{"class":42,"line":495},[40,7873,171],{"class":170},[40,7875,7876],{"class":87}," APCA_CLAMP    ",[40,7878,177],{"class":140},[40,7880,7881],{"class":3248}," 0.022",[40,7883,161],{"class":140},[40,7885,7886,7888,7891,7893,7896],{"class":42,"line":500},[40,7887,171],{"class":170},[40,7889,7890],{"class":87}," APCA_CLAMP_P  ",[40,7892,177],{"class":140},[40,7894,7895],{"class":3248}," 1.414",[40,7897,161],{"class":140},[40,7899,7900,7902,7905,7907,7910],{"class":42,"line":506},[40,7901,171],{"class":170},[40,7903,7904],{"class":87}," APCA_SCALE    ",[40,7906,177],{"class":140},[40,7908,7909],{"class":3248}," 1.14",[40,7911,161],{"class":140},[40,7913,7914,7916,7919,7921,7924],{"class":42,"line":532},[40,7915,171],{"class":170},[40,7917,7918],{"class":87}," APCA_LOW_CLIP ",[40,7920,177],{"class":140},[40,7922,7923],{"class":3248}," 0.001",[40,7925,161],{"class":140},[40,7927,7928,7930,7933,7935,7938],{"class":42,"line":564},[40,7929,171],{"class":170},[40,7931,7932],{"class":87}," APCA_OFFSET   ",[40,7934,177],{"class":140},[40,7936,7937],{"class":3248}," 0.027",[40,7939,161],{"class":140},[40,7941,7942],{"class":42,"line":574},[40,7943,68],{"emptyLinePlaceholder":67},[40,7945,7946],{"class":42,"line":584},[40,7947,7948],{"class":46},"\u002F** sRGB-family source formats. When the original foreground was sourced from\n",[40,7950,7951],{"class":42,"line":589},[40,7952,7953],{"class":46}," *  one of these, the adjusted record must remain sRGB (no displayP3 slot).   *\u002F\n",[40,7955,7956,7958,7961,7963,7966,7968,7971,7974,7976,7978,7981],{"class":42,"line":595},[40,7957,171],{"class":170},[40,7959,7960],{"class":87}," SRGB_FORMATS",[40,7962,410],{"class":140},[40,7964,7965],{"class":53}," ReadonlySet",[40,7967,2439],{"class":140},[40,7969,7970],{"class":53},"SourceFormatType",[40,7972,7973],{"class":140},">",[40,7975,1376],{"class":140},[40,7977,898],{"class":140},[40,7979,7980],{"class":183}," Set",[40,7982,1002],{"class":87},[40,7984,7985,7987,7990,7992,7994,7996,7999,8001,8003,8005,8008,8010,8012,8014,8017,8019,8021,8023,8026,8028,8030,8032,8034],{"class":42,"line":601},[40,7986,1007],{"class":140},[40,7988,7989],{"class":57},"hex",[40,7991,158],{"class":140},[40,7993,196],{"class":140},[40,7995,153],{"class":140},[40,7997,7998],{"class":57},"hsl",[40,8000,158],{"class":140},[40,8002,196],{"class":140},[40,8004,153],{"class":140},[40,8006,8007],{"class":57},"imagePixel",[40,8009,158],{"class":140},[40,8011,196],{"class":140},[40,8013,153],{"class":140},[40,8015,8016],{"class":57},"lab",[40,8018,158],{"class":140},[40,8020,196],{"class":140},[40,8022,153],{"class":140},[40,8024,8025],{"class":57},"named",[40,8027,158],{"class":140},[40,8029,196],{"class":140},[40,8031,153],{"class":140},[40,8033,7279],{"class":57},[40,8035,1078],{"class":140},[40,8037,8038,8040],{"class":42,"line":607},[40,8039,1083],{"class":87},[40,8041,161],{"class":140},[40,8043,8044],{"class":42,"line":613},[40,8045,68],{"emptyLinePlaceholder":67},[40,8047,8048],{"class":42,"line":619},[40,8049,8050],{"class":46},"\u002F** WCAG 2.1 relative luminance from a gamma-encoded sRGB triple in 0..1.\n",[40,8052,8053],{"class":42,"line":1088},[40,8054,8055],{"class":46}," *  Equivalent to `luminance.apply({rgb: {r, g, b}, ...})` without the\n",[40,8057,8058],{"class":42,"line":1093},[40,8059,8060],{"class":46}," *  record allocation.                                                    *\u002F\n",[40,8062,8063,8066,8069,8071,8073,8075,8077,8079,8082,8084,8086,8088,8090,8092,8094,8096,8098],{"class":42,"line":1099},[40,8064,8065],{"class":170},"function",[40,8067,8068],{"class":183}," rgbLuminance",[40,8070,526],{"class":140},[40,8072,7284],{"class":2178},[40,8074,410],{"class":140},[40,8076,7252],{"class":53},[40,8078,196],{"class":140},[40,8080,8081],{"class":2178}," g",[40,8083,410],{"class":140},[40,8085,7252],{"class":53},[40,8087,196],{"class":140},[40,8089,7517],{"class":2178},[40,8091,410],{"class":140},[40,8093,7252],{"class":53},[40,8095,7249],{"class":140},[40,8097,7252],{"class":53},[40,8099,401],{"class":140},[40,8101,8102,8104,8106,8108,8110,8112,8114,8116,8118,8120,8122,8124,8126,8128],{"class":42,"line":1120},[40,8103,2694],{"class":170},[40,8105,7262],{"class":87},[40,8107,1376],{"class":140},[40,8109,7181],{"class":87},[40,8111,316],{"class":140},[40,8113,1774],{"class":183},[40,8115,526],{"class":406},[40,8117,7284],{"class":87},[40,8119,196],{"class":140},[40,8121,8081],{"class":87},[40,8123,196],{"class":140},[40,8125,7517],{"class":87},[40,8127,118],{"class":406},[40,8129,161],{"class":140},[40,8131,8132,8135,8137,8139,8141,8143,8145,8147,8149,8151,8153,8155,8157,8159,8161,8163,8165,8167,8169],{"class":42,"line":1140},[40,8133,8134],{"class":136},"  return",[40,8136,7322],{"class":3248},[40,8138,7325],{"class":140},[40,8140,7262],{"class":87},[40,8142,316],{"class":140},[40,8144,7284],{"class":87},[40,8146,7334],{"class":140},[40,8148,7337],{"class":3248},[40,8150,7325],{"class":140},[40,8152,7262],{"class":87},[40,8154,316],{"class":140},[40,8156,7297],{"class":87},[40,8158,7334],{"class":140},[40,8160,7350],{"class":3248},[40,8162,7325],{"class":140},[40,8164,7262],{"class":87},[40,8166,316],{"class":140},[40,8168,7310],{"class":87},[40,8170,161],{"class":140},[40,8172,8173],{"class":42,"line":1152},[40,8174,773],{"class":140},[40,8176,8177],{"class":42,"line":1176},[40,8178,68],{"emptyLinePlaceholder":67},[40,8180,8181],{"class":42,"line":1185},[40,8182,8183],{"class":46},"\u002F** WCAG 2.1 contrast ratio between two precomputed luminances. *\u002F\n",[40,8185,8186,8188,8191,8193,8196,8198,8200,8202,8205,8207,8209,8211,8213],{"class":42,"line":1190},[40,8187,8065],{"class":170},[40,8189,8190],{"class":183}," wcagRatio",[40,8192,526],{"class":140},[40,8194,8195],{"class":2178},"la",[40,8197,410],{"class":140},[40,8199,7252],{"class":53},[40,8201,196],{"class":140},[40,8203,8204],{"class":2178}," lb",[40,8206,410],{"class":140},[40,8208,7252],{"class":53},[40,8210,7249],{"class":140},[40,8212,7252],{"class":53},[40,8214,401],{"class":140},[40,8216,8217,8219,8221,8223,8225,8227,8229,8231,8233,8235,8237,8239],{"class":42,"line":1196},[40,8218,2694],{"class":170},[40,8220,7580],{"class":87},[40,8222,1376],{"class":140},[40,8224,7585],{"class":87},[40,8226,316],{"class":140},[40,8228,7590],{"class":183},[40,8230,526],{"class":406},[40,8232,8195],{"class":87},[40,8234,196],{"class":140},[40,8236,8204],{"class":87},[40,8238,118],{"class":406},[40,8240,161],{"class":140},[40,8242,8243,8245,8247,8249,8251,8253,8255,8257,8259,8261,8263,8265],{"class":42,"line":4096},[40,8244,2694],{"class":170},[40,8246,7610],{"class":87},[40,8248,7613],{"class":140},[40,8250,7585],{"class":87},[40,8252,316],{"class":140},[40,8254,7620],{"class":183},[40,8256,526],{"class":406},[40,8258,8195],{"class":87},[40,8260,196],{"class":140},[40,8262,8204],{"class":87},[40,8264,118],{"class":406},[40,8266,161],{"class":140},[40,8268,8269,8271,8273,8275,8277,8279,8281,8283,8285,8287,8289,8291,8293],{"class":42,"line":4115},[40,8270,8134],{"class":136},[40,8272,918],{"class":406},[40,8274,7641],{"class":87},[40,8276,7334],{"class":140},[40,8278,7646],{"class":3248},[40,8280,1404],{"class":406},[40,8282,2835],{"class":140},[40,8284,918],{"class":406},[40,8286,7655],{"class":87},[40,8288,7334],{"class":140},[40,8290,7646],{"class":3248},[40,8292,118],{"class":406},[40,8294,161],{"class":140},[40,8296,8297],{"class":42,"line":4129},[40,8298,773],{"class":140},[40,8300,8301],{"class":42,"line":4134},[40,8302,68],{"emptyLinePlaceholder":67},[40,8304,8305],{"class":42,"line":4139},[40,8306,8307],{"class":46},"\u002F** APCA Lc foreground luminance (text exponent). *\u002F\n",[40,8309,8310,8312,8315,8317,8319,8321,8323,8325,8327,8329,8331,8333,8335,8337,8339,8341,8343],{"class":42,"line":4159},[40,8311,8065],{"class":170},[40,8313,8314],{"class":183}," apcaFg",[40,8316,526],{"class":140},[40,8318,7284],{"class":2178},[40,8320,410],{"class":140},[40,8322,7252],{"class":53},[40,8324,196],{"class":140},[40,8326,8081],{"class":2178},[40,8328,410],{"class":140},[40,8330,7252],{"class":53},[40,8332,196],{"class":140},[40,8334,7517],{"class":2178},[40,8336,410],{"class":140},[40,8338,7252],{"class":53},[40,8340,7249],{"class":140},[40,8342,7252],{"class":53},[40,8344,401],{"class":140},[40,8346,8347,8349,8351,8353,8355,8357,8359,8361,8363,8365,8367,8369,8371,8373],{"class":42,"line":4179},[40,8348,2694],{"class":170},[40,8350,7262],{"class":87},[40,8352,1376],{"class":140},[40,8354,7181],{"class":87},[40,8356,316],{"class":140},[40,8358,1774],{"class":183},[40,8360,526],{"class":406},[40,8362,7284],{"class":87},[40,8364,196],{"class":140},[40,8366,8081],{"class":87},[40,8368,196],{"class":140},[40,8370,7517],{"class":87},[40,8372,118],{"class":406},[40,8374,161],{"class":140},[40,8376,8377,8379,8382,8384,8386,8388,8391,8393,8396,8398,8400,8402,8404],{"class":42,"line":4198},[40,8378,8134],{"class":136},[40,8380,8381],{"class":3248}," 0.2126729",[40,8383,7325],{"class":140},[40,8385,7585],{"class":87},[40,8387,316],{"class":140},[40,8389,8390],{"class":183},"pow",[40,8392,526],{"class":406},[40,8394,8395],{"class":87},"lin",[40,8397,316],{"class":140},[40,8399,7284],{"class":87},[40,8401,196],{"class":140},[40,8403,7853],{"class":3248},[40,8405,2359],{"class":406},[40,8407,8408,8411,8414,8416,8418,8420,8422,8424,8426,8428,8430,8432,8434],{"class":42,"line":4211},[40,8409,8410],{"class":140},"       +",[40,8412,8413],{"class":3248}," 0.7151522",[40,8415,7325],{"class":140},[40,8417,7585],{"class":87},[40,8419,316],{"class":140},[40,8421,8390],{"class":183},[40,8423,526],{"class":406},[40,8425,8395],{"class":87},[40,8427,316],{"class":140},[40,8429,7297],{"class":87},[40,8431,196],{"class":140},[40,8433,7853],{"class":3248},[40,8435,2359],{"class":406},[40,8437,8438,8440,8443,8445,8447,8449,8451,8453,8455,8457,8459,8461,8463,8465],{"class":42,"line":4231},[40,8439,8410],{"class":140},[40,8441,8442],{"class":3248}," 0.0721750",[40,8444,7325],{"class":140},[40,8446,7585],{"class":87},[40,8448,316],{"class":140},[40,8450,8390],{"class":183},[40,8452,526],{"class":406},[40,8454,8395],{"class":87},[40,8456,316],{"class":140},[40,8458,7310],{"class":87},[40,8460,196],{"class":140},[40,8462,7853],{"class":3248},[40,8464,118],{"class":406},[40,8466,161],{"class":140},[40,8468,8469],{"class":42,"line":4253},[40,8470,773],{"class":140},[40,8472,8473],{"class":42,"line":4258},[40,8474,68],{"emptyLinePlaceholder":67},[40,8476,8477],{"class":42,"line":4263},[40,8478,8479],{"class":46},"\u002F** APCA Lc background luminance (background exponent). *\u002F\n",[40,8481,8482,8484,8487,8489,8491,8493,8495,8497,8499,8501,8503,8505,8507,8509,8511,8513,8515],{"class":42,"line":4283},[40,8483,8065],{"class":170},[40,8485,8486],{"class":183}," apcaBg",[40,8488,526],{"class":140},[40,8490,7284],{"class":2178},[40,8492,410],{"class":140},[40,8494,7252],{"class":53},[40,8496,196],{"class":140},[40,8498,8081],{"class":2178},[40,8500,410],{"class":140},[40,8502,7252],{"class":53},[40,8504,196],{"class":140},[40,8506,7517],{"class":2178},[40,8508,410],{"class":140},[40,8510,7252],{"class":53},[40,8512,7249],{"class":140},[40,8514,7252],{"class":53},[40,8516,401],{"class":140},[40,8518,8519,8521,8523,8525,8527,8529,8531,8533,8535,8537,8539,8541,8543,8545],{"class":42,"line":4303},[40,8520,2694],{"class":170},[40,8522,7262],{"class":87},[40,8524,1376],{"class":140},[40,8526,7181],{"class":87},[40,8528,316],{"class":140},[40,8530,1774],{"class":183},[40,8532,526],{"class":406},[40,8534,7284],{"class":87},[40,8536,196],{"class":140},[40,8538,8081],{"class":87},[40,8540,196],{"class":140},[40,8542,7517],{"class":87},[40,8544,118],{"class":406},[40,8546,161],{"class":140},[40,8548,8549,8551,8553,8555,8557,8559,8561,8563,8565,8567,8569,8571,8573],{"class":42,"line":4323},[40,8550,8134],{"class":136},[40,8552,8381],{"class":3248},[40,8554,7325],{"class":140},[40,8556,7585],{"class":87},[40,8558,316],{"class":140},[40,8560,8390],{"class":183},[40,8562,526],{"class":406},[40,8564,8395],{"class":87},[40,8566,316],{"class":140},[40,8568,7284],{"class":87},[40,8570,196],{"class":140},[40,8572,4432],{"class":3248},[40,8574,2359],{"class":406},[40,8576,8577,8579,8581,8583,8585,8587,8589,8591,8593,8595,8597,8599,8601],{"class":42,"line":4346},[40,8578,8410],{"class":140},[40,8580,8413],{"class":3248},[40,8582,7325],{"class":140},[40,8584,7585],{"class":87},[40,8586,316],{"class":140},[40,8588,8390],{"class":183},[40,8590,526],{"class":406},[40,8592,8395],{"class":87},[40,8594,316],{"class":140},[40,8596,7297],{"class":87},[40,8598,196],{"class":140},[40,8600,4432],{"class":3248},[40,8602,2359],{"class":406},[40,8604,8605,8607,8609,8611,8613,8615,8617,8619,8621,8623,8625,8627,8629,8631],{"class":42,"line":4351},[40,8606,8410],{"class":140},[40,8608,8442],{"class":3248},[40,8610,7325],{"class":140},[40,8612,7585],{"class":87},[40,8614,316],{"class":140},[40,8616,8390],{"class":183},[40,8618,526],{"class":406},[40,8620,8395],{"class":87},[40,8622,316],{"class":140},[40,8624,7310],{"class":87},[40,8626,196],{"class":140},[40,8628,4432],{"class":3248},[40,8630,118],{"class":406},[40,8632,161],{"class":140},[40,8634,8635],{"class":42,"line":4356},[40,8636,773],{"class":140},[40,8638,8639],{"class":42,"line":4375},[40,8640,68],{"emptyLinePlaceholder":67},[40,8642,8643],{"class":42,"line":4395},[40,8644,8645],{"class":46},"\u002F** APCA Lc absolute value between text and background, computed from\n",[40,8647,8648],{"class":42,"line":4414},[40,8649,8650],{"class":46}," *  the text's foreground-luminance and the precomputed background. *\u002F\n",[40,8652,8653,8655,8658,8660,8663,8665,8667,8669,8672,8674,8676,8678,8680],{"class":42,"line":4437},[40,8654,8065],{"class":170},[40,8656,8657],{"class":183}," apcaLcFromYtxt",[40,8659,526],{"class":140},[40,8661,8662],{"class":2178},"Ytxt",[40,8664,410],{"class":140},[40,8666,7252],{"class":53},[40,8668,196],{"class":140},[40,8670,8671],{"class":2178}," Ybg",[40,8673,410],{"class":140},[40,8675,7252],{"class":53},[40,8677,7249],{"class":140},[40,8679,7252],{"class":53},[40,8681,401],{"class":140},[40,8683,8684,8686,8689,8691,8694,8697,8700,8702,8704,8706,8708,8710,8712,8714,8717,8720,8722,8724,8727,8729,8731,8733],{"class":42,"line":4442},[40,8685,2694],{"class":170},[40,8687,8688],{"class":87}," txtClamp",[40,8690,1376],{"class":140},[40,8692,8693],{"class":87}," Ytxt",[40,8695,8696],{"class":140}," \u003C",[40,8698,8699],{"class":87}," APCA_CLAMP",[40,8701,2795],{"class":140},[40,8703,8693],{"class":87},[40,8705,7334],{"class":140},[40,8707,7585],{"class":87},[40,8709,316],{"class":140},[40,8711,8390],{"class":183},[40,8713,526],{"class":406},[40,8715,8716],{"class":87},"APCA_CLAMP",[40,8718,8719],{"class":140}," -",[40,8721,8693],{"class":87},[40,8723,196],{"class":140},[40,8725,8726],{"class":87}," APCA_CLAMP_P",[40,8728,1404],{"class":406},[40,8730,410],{"class":140},[40,8732,8693],{"class":87},[40,8734,161],{"class":140},[40,8736,8737,8739,8742,8744,8746,8748,8750,8752,8754,8757,8759,8761,8763,8765,8767,8769,8771,8773,8776,8778,8780,8782],{"class":42,"line":4447},[40,8738,2694],{"class":170},[40,8740,8741],{"class":87}," bgClamp",[40,8743,7613],{"class":140},[40,8745,8671],{"class":87},[40,8747,2450],{"class":140},[40,8749,8699],{"class":87},[40,8751,2795],{"class":140},[40,8753,8671],{"class":87},[40,8755,8756],{"class":140},"  +",[40,8758,7585],{"class":87},[40,8760,316],{"class":140},[40,8762,8390],{"class":183},[40,8764,526],{"class":406},[40,8766,8716],{"class":87},[40,8768,8719],{"class":140},[40,8770,8671],{"class":87},[40,8772,196],{"class":140},[40,8774,8775],{"class":87},"  APCA_CLAMP_P",[40,8777,1404],{"class":406},[40,8779,410],{"class":140},[40,8781,8671],{"class":87},[40,8783,161],{"class":140},[40,8785,8786],{"class":42,"line":4466},[40,8787,68],{"emptyLinePlaceholder":67},[40,8789,8790,8793,8796,8798,8801],{"class":42,"line":4486},[40,8791,8792],{"class":170},"  let",[40,8794,8795],{"class":87}," Lc",[40,8797,1376],{"class":140},[40,8799,8800],{"class":3248}," 0",[40,8802,161],{"class":140},[40,8804,8805,8807,8809,8812,8815,8817,8819],{"class":42,"line":4505},[40,8806,2170],{"class":136},[40,8808,918],{"class":406},[40,8810,8811],{"class":87},"bgClamp",[40,8813,8814],{"class":140}," >",[40,8816,8688],{"class":87},[40,8818,1404],{"class":406},[40,8820,529],{"class":140},[40,8822,8823,8826,8828,8830,8833,8835,8837,8839,8841,8843,8846,8848,8850,8852,8854,8856,8858,8861,8863,8866,8869,8872,8875],{"class":42,"line":4518},[40,8824,8825],{"class":87},"    Lc",[40,8827,1376],{"class":140},[40,8829,918],{"class":406},[40,8831,8832],{"class":87},"Math",[40,8834,316],{"class":140},[40,8836,8390],{"class":183},[40,8838,526],{"class":406},[40,8840,8811],{"class":87},[40,8842,196],{"class":140},[40,8844,8845],{"class":87}," APCA_NORM_BG",[40,8847,1404],{"class":406},[40,8849,5193],{"class":140},[40,8851,7585],{"class":87},[40,8853,316],{"class":140},[40,8855,8390],{"class":183},[40,8857,526],{"class":406},[40,8859,8860],{"class":87},"txtClamp",[40,8862,196],{"class":140},[40,8864,8865],{"class":87}," APCA_NORM_TXT",[40,8867,8868],{"class":406},")) ",[40,8870,8871],{"class":140},"*",[40,8873,8874],{"class":87}," APCA_SCALE",[40,8876,161],{"class":140},[40,8878,8879,8882,8884,8887,8889,8892,8894,8896,8899,8901],{"class":42,"line":4541},[40,8880,8881],{"class":136},"    if",[40,8883,918],{"class":406},[40,8885,8886],{"class":87},"Lc",[40,8888,8696],{"class":140},[40,8890,8891],{"class":87}," APCA_LOW_CLIP",[40,8893,1404],{"class":406},[40,8895,2383],{"class":140},[40,8897,8898],{"class":136},"return",[40,8900,8800],{"class":3248},[40,8902,8903],{"class":140},";}\n",[40,8905,8906,8908,8910,8912,8914,8917],{"class":42,"line":4547},[40,8907,8825],{"class":87},[40,8909,1376],{"class":140},[40,8911,8795],{"class":87},[40,8913,8719],{"class":140},[40,8915,8916],{"class":87}," APCA_OFFSET",[40,8918,161],{"class":140},[40,8920,8921,8923,8926],{"class":42,"line":4553},[40,8922,2041],{"class":140},[40,8924,8925],{"class":136}," else",[40,8927,401],{"class":140},[40,8929,8930,8932,8934,8936,8938,8940,8942,8944,8946,8948,8951,8953,8955,8957,8959,8961,8963,8965,8967,8969,8971,8973,8975],{"class":42,"line":4567},[40,8931,8825],{"class":87},[40,8933,1376],{"class":140},[40,8935,918],{"class":406},[40,8937,8832],{"class":87},[40,8939,316],{"class":140},[40,8941,8390],{"class":183},[40,8943,526],{"class":406},[40,8945,8811],{"class":87},[40,8947,196],{"class":140},[40,8949,8950],{"class":3248}," 0.62",[40,8952,1404],{"class":406},[40,8954,5193],{"class":140},[40,8956,7585],{"class":87},[40,8958,316],{"class":140},[40,8960,8390],{"class":183},[40,8962,526],{"class":406},[40,8964,8860],{"class":87},[40,8966,196],{"class":140},[40,8968,4432],{"class":3248},[40,8970,8868],{"class":406},[40,8972,8871],{"class":140},[40,8974,8874],{"class":87},[40,8976,161],{"class":140},[40,8978,8979,8981,8983,8985,8987,8989,8992,8994,8996,8998,9000],{"class":42,"line":4636},[40,8980,8881],{"class":136},[40,8982,918],{"class":406},[40,8984,8886],{"class":87},[40,8986,8814],{"class":140},[40,8988,8719],{"class":140},[40,8990,8991],{"class":87},"APCA_LOW_CLIP",[40,8993,1404],{"class":406},[40,8995,2383],{"class":140},[40,8997,8898],{"class":136},[40,8999,8800],{"class":3248},[40,9001,8903],{"class":140},[40,9003,9004,9006,9008,9010,9012,9014],{"class":42,"line":4701},[40,9005,8825],{"class":87},[40,9007,1376],{"class":140},[40,9009,8795],{"class":87},[40,9011,7334],{"class":140},[40,9013,8916],{"class":87},[40,9015,161],{"class":140},[40,9017,9018],{"class":42,"line":4766},[40,9019,1435],{"class":140},[40,9021,9022,9024,9026,9028,9031,9033,9035,9037,9040,9042],{"class":42,"line":4833},[40,9023,8134],{"class":136},[40,9025,7585],{"class":87},[40,9027,316],{"class":140},[40,9029,9030],{"class":183},"abs",[40,9032,526],{"class":406},[40,9034,8886],{"class":87},[40,9036,7325],{"class":140},[40,9038,9039],{"class":3248}," 100",[40,9041,118],{"class":406},[40,9043,161],{"class":140},[40,9045,9046],{"class":42,"line":4839},[40,9047,773],{"class":140},[40,9049,9050],{"class":42,"line":4844},[40,9051,68],{"emptyLinePlaceholder":67},[40,9053,9054,9056,9059],{"class":42,"line":4849},[40,9055,7203],{"class":170},[40,9057,9058],{"class":53}," EnsureContrast",[40,9060,401],{"class":140},[40,9062,9063,9065,9067,9069,9071,9073,9075,9077,9079],{"class":42,"line":4862},[40,9064,1793],{"class":170},[40,9066,153],{"class":140},[40,9068,3804],{"class":57},[40,9070,158],{"class":140},[40,9072,1376],{"class":140},[40,9074,153],{"class":140},[40,9076,7704],{"class":57},[40,9078,158],{"class":140},[40,9080,161],{"class":140},[40,9082,9083],{"class":42,"line":4875},[40,9084,68],{"emptyLinePlaceholder":67},[40,9086,9087],{"class":42,"line":4889},[40,9088,9089],{"class":46},"  \u002F**\n",[40,9091,9092],{"class":42,"line":4902},[40,9093,9094],{"class":46},"   * Adjusts `foreground` along the OKLCH L axis until its contrast against\n",[40,9096,9097],{"class":42,"line":4913},[40,9098,9099],{"class":46},"   * `background` meets `minRatio` for the given `algorithm`. The inner\n",[40,9101,9102],{"class":42,"line":4924},[40,9103,9104],{"class":46},"   * loop operates on a scalar `L` value; no `ColorRecord` is allocated\n",[40,9106,9107],{"class":42,"line":4935},[40,9108,9109],{"class":46},"   * per iteration. The background's luminance is computed once. A single\n",[40,9111,9112],{"class":42,"line":4946},[40,9113,9114],{"class":46},"   * `ColorRecord` is materialised at return via `colorRecordFactory`.\n",[40,9116,9117],{"class":42,"line":4957},[40,9118,9119],{"class":46},"   *\n",[40,9121,9122],{"class":42,"line":4968},[40,9123,9124],{"class":46},"   * Gamut preservation: the adjusted record inherits `foreground.sourceFormat`.\n",[40,9126,9127],{"class":42,"line":4979},[40,9128,9129],{"class":46},"   * When that format is an sRGB-family format (`hex`, `rgb`, `hsl`, `lab`,\n",[40,9131,9132],{"class":42,"line":4988},[40,9133,9134],{"class":46},"   * `named`, `imagePixel`), the record is built via `fromRgb` using the\n",[40,9136,9137],{"class":42,"line":4993},[40,9138,9139],{"class":46},"   * sRGB-clamped coordinates computed during the loop — preventing a\n",[40,9141,9142],{"class":42,"line":5006},[40,9143,9144],{"class":46},"   * spurious `displayP3` slot from appearing on a colour that was never\n",[40,9146,9147],{"class":42,"line":5025},[40,9148,9149],{"class":46},"   * wide-gamut. When the source is `displayP3` or `oklch`, `fromOklch` is\n",[40,9151,9152],{"class":42,"line":5038},[40,9153,9154],{"class":46},"   * used so the wide-gamut `displayP3` slot is re-derived as expected.\n",[40,9156,9157],{"class":42,"line":5058},[40,9158,9159],{"class":46},"   *\u002F\n",[40,9161,9162,9164],{"class":42,"line":5078},[40,9163,7237],{"class":406},[40,9165,9166],{"class":140},"(\n",[40,9168,9169,9172,9174,9176],{"class":42,"line":5097},[40,9170,9171],{"class":2178},"    foreground",[40,9173,410],{"class":140},[40,9175,7155],{"class":53},[40,9177,561],{"class":140},[40,9179,9180,9183,9185,9187],{"class":42,"line":5102},[40,9181,9182],{"class":2178},"    background",[40,9184,410],{"class":140},[40,9186,7155],{"class":53},[40,9188,561],{"class":140},[40,9190,9191,9194,9196,9198],{"class":42,"line":5107},[40,9192,9193],{"class":2178},"    minRatio",[40,9195,410],{"class":140},[40,9197,7252],{"class":53},[40,9199,561],{"class":140},[40,9201,9203,9206,9208,9210,9212,9214,9216],{"class":42,"line":9202},94,[40,9204,9205],{"class":2178},"    algorithm",[40,9207,410],{"class":140},[40,9209,7725],{"class":53},[40,9211,1376],{"class":140},[40,9213,153],{"class":140},[40,9215,1922],{"class":57},[40,9217,1078],{"class":140},[40,9219,9221,9224,9226],{"class":42,"line":9220},95,[40,9222,9223],{"class":140},"  ):",[40,9225,7155],{"class":53},[40,9227,401],{"class":140},[40,9229,9231],{"class":42,"line":9230},96,[40,9232,9233],{"class":46},"    \u002F\u002F Precompute background luminance once; it never changes during the loop.\n",[40,9235,9237,9239,9242,9244,9246,9248,9251,9253,9255],{"class":42,"line":9236},97,[40,9238,7259],{"class":170},[40,9240,9241],{"class":87}," bgRgb",[40,9243,410],{"class":140},[40,9245,7730],{"class":53},[40,9247,1376],{"class":140},[40,9249,9250],{"class":87}," background",[40,9252,316],{"class":140},[40,9254,7279],{"class":87},[40,9256,161],{"class":140},[40,9258,9260,9262,9264,9266,9269,9271,9273,9275],{"class":42,"line":9259},98,[40,9261,7259],{"class":170},[40,9263,8671],{"class":87},[40,9265,1376],{"class":140},[40,9267,9268],{"class":87}," algorithm",[40,9270,2785],{"class":140},[40,9272,153],{"class":140},[40,9274,1922],{"class":57},[40,9276,1078],{"class":140},[40,9278,9280,9283,9285,9287,9290,9292,9294,9296,9298,9300,9302,9304,9306,9308,9310],{"class":42,"line":9279},99,[40,9281,9282],{"class":140},"      ?",[40,9284,8068],{"class":183},[40,9286,526],{"class":406},[40,9288,9289],{"class":87},"bgRgb",[40,9291,316],{"class":140},[40,9293,7284],{"class":87},[40,9295,196],{"class":140},[40,9297,9241],{"class":87},[40,9299,316],{"class":140},[40,9301,7297],{"class":87},[40,9303,196],{"class":140},[40,9305,9241],{"class":87},[40,9307,316],{"class":140},[40,9309,7310],{"class":87},[40,9311,2359],{"class":406},[40,9313,9315,9318,9320,9322,9324,9326,9328,9330,9332,9334,9336,9338,9340,9342,9344,9346],{"class":42,"line":9314},100,[40,9316,9317],{"class":140},"      :",[40,9319,8486],{"class":183},[40,9321,526],{"class":406},[40,9323,9289],{"class":87},[40,9325,316],{"class":140},[40,9327,7284],{"class":87},[40,9329,196],{"class":140},[40,9331,9241],{"class":87},[40,9333,316],{"class":140},[40,9335,7297],{"class":87},[40,9337,196],{"class":140},[40,9339,9241],{"class":87},[40,9341,316],{"class":140},[40,9343,7310],{"class":87},[40,9345,118],{"class":406},[40,9347,161],{"class":140},[40,9349,9351],{"class":42,"line":9350},101,[40,9352,68],{"emptyLinePlaceholder":67},[40,9354,9356],{"class":42,"line":9355},102,[40,9357,9358],{"class":46},"    \u002F\u002F Compute initial foreground contrast from its existing rgb.\n",[40,9360,9362,9364,9367,9369,9371,9373,9376,9378,9380],{"class":42,"line":9361},103,[40,9363,7259],{"class":170},[40,9365,9366],{"class":87}," fgRgb",[40,9368,410],{"class":140},[40,9370,7730],{"class":53},[40,9372,1376],{"class":140},[40,9374,9375],{"class":87}," foreground",[40,9377,316],{"class":140},[40,9379,7279],{"class":87},[40,9381,161],{"class":140},[40,9383,9385,9387,9390,9392,9394,9396,9398,9400],{"class":42,"line":9384},104,[40,9386,7259],{"class":170},[40,9388,9389],{"class":87}," initialContrast",[40,9391,1376],{"class":140},[40,9393,9268],{"class":87},[40,9395,2785],{"class":140},[40,9397,153],{"class":140},[40,9399,1922],{"class":57},[40,9401,1078],{"class":140},[40,9403,9405,9407,9409,9411,9414,9416,9419,9421,9423,9425,9427,9429,9431,9433,9435,9437,9439,9441,9443,9445],{"class":42,"line":9404},105,[40,9406,9282],{"class":140},[40,9408,8190],{"class":183},[40,9410,526],{"class":406},[40,9412,9413],{"class":183},"rgbLuminance",[40,9415,526],{"class":406},[40,9417,9418],{"class":87},"fgRgb",[40,9420,316],{"class":140},[40,9422,7284],{"class":87},[40,9424,196],{"class":140},[40,9426,9366],{"class":87},[40,9428,316],{"class":140},[40,9430,7297],{"class":87},[40,9432,196],{"class":140},[40,9434,9366],{"class":87},[40,9436,316],{"class":140},[40,9438,7310],{"class":87},[40,9440,118],{"class":406},[40,9442,196],{"class":140},[40,9444,8671],{"class":87},[40,9446,2359],{"class":406},[40,9448,9450,9452,9454,9456,9459,9461,9463,9465,9467,9469,9471,9473,9475,9477,9479,9481,9483,9485,9487,9489,9491],{"class":42,"line":9449},106,[40,9451,9317],{"class":140},[40,9453,8657],{"class":183},[40,9455,526],{"class":406},[40,9457,9458],{"class":183},"apcaFg",[40,9460,526],{"class":406},[40,9462,9418],{"class":87},[40,9464,316],{"class":140},[40,9466,7284],{"class":87},[40,9468,196],{"class":140},[40,9470,9366],{"class":87},[40,9472,316],{"class":140},[40,9474,7297],{"class":87},[40,9476,196],{"class":140},[40,9478,9366],{"class":87},[40,9480,316],{"class":140},[40,9482,7310],{"class":87},[40,9484,118],{"class":406},[40,9486,196],{"class":140},[40,9488,8671],{"class":87},[40,9490,118],{"class":406},[40,9492,161],{"class":140},[40,9494,9496],{"class":42,"line":9495},107,[40,9497,68],{"emptyLinePlaceholder":67},[40,9499,9501,9503,9505,9508,9511,9514,9516],{"class":42,"line":9500},108,[40,9502,8881],{"class":136},[40,9504,918],{"class":406},[40,9506,9507],{"class":87},"initialContrast",[40,9509,9510],{"class":140}," >=",[40,9512,9513],{"class":87}," minRatio",[40,9515,1404],{"class":406},[40,9517,529],{"class":140},[40,9519,9521,9524,9526],{"class":42,"line":9520},109,[40,9522,9523],{"class":136},"      return",[40,9525,9375],{"class":87},[40,9527,161],{"class":140},[40,9529,9531],{"class":42,"line":9530},110,[40,9532,3568],{"class":140},[40,9534,9536],{"class":42,"line":9535},111,[40,9537,68],{"emptyLinePlaceholder":67},[40,9539,9541,9543,9546,9549,9551,9553,9556,9558,9561],{"class":42,"line":9540},112,[40,9542,7259],{"class":170},[40,9544,9545],{"class":87}," fgL",[40,9547,9548],{"class":140},"    =",[40,9550,9375],{"class":87},[40,9552,316],{"class":140},[40,9554,9555],{"class":87},"oklch",[40,9557,316],{"class":140},[40,9559,9560],{"class":87},"l",[40,9562,161],{"class":140},[40,9564,9566,9568,9571,9574,9576,9578,9580,9582,9585],{"class":42,"line":9565},113,[40,9567,7259],{"class":170},[40,9569,9570],{"class":87}," c",[40,9572,9573],{"class":140},"      =",[40,9575,9375],{"class":87},[40,9577,316],{"class":140},[40,9579,9555],{"class":87},[40,9581,316],{"class":140},[40,9583,9584],{"class":87},"c",[40,9586,161],{"class":140},[40,9588,9590,9592,9595,9597,9599,9601,9603,9605,9608],{"class":42,"line":9589},114,[40,9591,7259],{"class":170},[40,9593,9594],{"class":87}," h",[40,9596,9573],{"class":140},[40,9598,9375],{"class":87},[40,9600,316],{"class":140},[40,9602,9555],{"class":87},[40,9604,316],{"class":140},[40,9606,9607],{"class":87},"h",[40,9609,161],{"class":140},[40,9611,9613,9615,9618,9620,9622,9624,9627],{"class":42,"line":9612},115,[40,9614,7259],{"class":170},[40,9616,9617],{"class":87}," a",[40,9619,9573],{"class":140},[40,9621,9375],{"class":87},[40,9623,316],{"class":140},[40,9625,9626],{"class":87},"alpha",[40,9628,161],{"class":140},[40,9630,9632,9634,9637,9639,9641,9643,9646],{"class":42,"line":9631},116,[40,9633,7259],{"class":170},[40,9635,9636],{"class":87}," fmt",[40,9638,9548],{"class":140},[40,9640,9375],{"class":87},[40,9642,316],{"class":140},[40,9644,9645],{"class":87},"sourceFormat",[40,9647,161],{"class":140},[40,9649,9651,9653,9656,9658,9660,9662,9665],{"class":42,"line":9650},117,[40,9652,7259],{"class":170},[40,9654,9655],{"class":87}," hints",[40,9657,7613],{"class":140},[40,9659,9375],{"class":87},[40,9661,316],{"class":140},[40,9663,9664],{"class":87},"hints",[40,9666,161],{"class":140},[40,9668,9670,9672,9675,9677,9679,9681,9684,9686,9689,9691],{"class":42,"line":9669},118,[40,9671,7259],{"class":170},[40,9673,9674],{"class":87}," isSrgb",[40,9676,1376],{"class":140},[40,9678,7960],{"class":87},[40,9680,316],{"class":140},[40,9682,9683],{"class":183},"has",[40,9685,526],{"class":406},[40,9687,9688],{"class":87},"fmt",[40,9690,118],{"class":406},[40,9692,161],{"class":140},[40,9694,9696,9698,9701,9704,9706,9708,9710,9712,9714,9716,9718,9720,9722,9725,9727,9730],{"class":42,"line":9695},119,[40,9697,7259],{"class":170},[40,9699,9700],{"class":87}," step",[40,9702,9703],{"class":140},"   =",[40,9705,9545],{"class":87},[40,9707,8696],{"class":140},[40,9709,9250],{"class":87},[40,9711,316],{"class":140},[40,9713,9555],{"class":87},[40,9715,316],{"class":140},[40,9717,9560],{"class":87},[40,9719,2795],{"class":140},[40,9721,8719],{"class":140},[40,9723,9724],{"class":3248},"0.02",[40,9726,2806],{"class":140},[40,9728,9729],{"class":3248}," 0.02",[40,9731,161],{"class":140},[40,9733,9735],{"class":42,"line":9734},120,[40,9736,68],{"emptyLinePlaceholder":67},[40,9738,9740,9743,9746,9748,9750],{"class":42,"line":9739},121,[40,9741,9742],{"class":170},"    let",[40,9744,9745],{"class":87}," currentL",[40,9747,1376],{"class":140},[40,9749,9545],{"class":87},[40,9751,161],{"class":140},[40,9753,9755,9757,9760,9762,9764],{"class":42,"line":9754},122,[40,9756,9742],{"class":170},[40,9758,9759],{"class":87}," lastL",[40,9761,9548],{"class":140},[40,9763,9745],{"class":87},[40,9765,161],{"class":140},[40,9767,9769,9771,9774,9776,9778,9780,9782],{"class":42,"line":9768},123,[40,9770,9742],{"class":170},[40,9772,9773],{"class":87}," lastRgb",[40,9775,410],{"class":140},[40,9777,7730],{"class":53},[40,9779,1376],{"class":140},[40,9781,9366],{"class":87},[40,9783,161],{"class":140},[40,9785,9787],{"class":42,"line":9786},124,[40,9788,68],{"emptyLinePlaceholder":67},[40,9790,9792,9795,9797,9800,9803,9805,9807,9809,9811,9813,9816,9818,9820,9823,9825],{"class":42,"line":9791},125,[40,9793,9794],{"class":136},"    for",[40,9796,918],{"class":406},[40,9798,9799],{"class":170},"let",[40,9801,9802],{"class":87}," i",[40,9804,1376],{"class":140},[40,9806,8800],{"class":3248},[40,9808,2339],{"class":140},[40,9810,9802],{"class":87},[40,9812,8696],{"class":140},[40,9814,9815],{"class":3248}," 50",[40,9817,2339],{"class":140},[40,9819,9802],{"class":87},[40,9821,9822],{"class":140},"++",[40,9824,1404],{"class":406},[40,9826,529],{"class":140},[40,9828,9830,9833,9836,9838,9840,9842,9844,9846,9849,9851,9853,9855],{"class":42,"line":9829},126,[40,9831,9832],{"class":170},"      const",[40,9834,9835],{"class":87}," newL",[40,9837,1376],{"class":140},[40,9839,7760],{"class":87},[40,9841,316],{"class":140},[40,9843,1774],{"class":183},[40,9845,526],{"class":406},[40,9847,9848],{"class":87},"currentL",[40,9850,7334],{"class":140},[40,9852,9700],{"class":87},[40,9854,118],{"class":406},[40,9856,161],{"class":140},[40,9858,9860,9862,9865,9867,9869,9871,9873,9875,9878,9880,9882,9884,9886,9888],{"class":42,"line":9859},127,[40,9861,9832],{"class":170},[40,9863,9864],{"class":87}," rgb",[40,9866,7613],{"class":140},[40,9868,7804],{"class":87},[40,9870,316],{"class":140},[40,9872,1774],{"class":183},[40,9874,526],{"class":406},[40,9876,9877],{"class":87},"newL",[40,9879,196],{"class":140},[40,9881,9570],{"class":87},[40,9883,196],{"class":140},[40,9885,9594],{"class":87},[40,9887,118],{"class":406},[40,9889,161],{"class":140},[40,9891,9893],{"class":42,"line":9892},128,[40,9894,68],{"emptyLinePlaceholder":67},[40,9896,9898,9900,9903,9905,9907,9909,9911,9913],{"class":42,"line":9897},129,[40,9899,9832],{"class":170},[40,9901,9902],{"class":87}," ratio",[40,9904,1376],{"class":140},[40,9906,9268],{"class":87},[40,9908,2785],{"class":140},[40,9910,153],{"class":140},[40,9912,1922],{"class":57},[40,9914,1078],{"class":140},[40,9916,9918,9921,9923,9925,9927,9929,9931,9933,9935,9937,9939,9941,9943,9945,9947,9949,9951,9953,9955,9957],{"class":42,"line":9917},130,[40,9919,9920],{"class":140},"        ?",[40,9922,8190],{"class":183},[40,9924,526],{"class":406},[40,9926,9413],{"class":183},[40,9928,526],{"class":406},[40,9930,7279],{"class":87},[40,9932,316],{"class":140},[40,9934,7284],{"class":87},[40,9936,196],{"class":140},[40,9938,9864],{"class":87},[40,9940,316],{"class":140},[40,9942,7297],{"class":87},[40,9944,196],{"class":140},[40,9946,9864],{"class":87},[40,9948,316],{"class":140},[40,9950,7310],{"class":87},[40,9952,118],{"class":406},[40,9954,196],{"class":140},[40,9956,8671],{"class":87},[40,9958,2359],{"class":406},[40,9960,9962,9965,9967,9969,9971,9973,9975,9977,9979,9981,9983,9985,9987,9989,9991,9993,9995,9997,9999,10001,10003],{"class":42,"line":9961},131,[40,9963,9964],{"class":140},"        :",[40,9966,8657],{"class":183},[40,9968,526],{"class":406},[40,9970,9458],{"class":183},[40,9972,526],{"class":406},[40,9974,7279],{"class":87},[40,9976,316],{"class":140},[40,9978,7284],{"class":87},[40,9980,196],{"class":140},[40,9982,9864],{"class":87},[40,9984,316],{"class":140},[40,9986,7297],{"class":87},[40,9988,196],{"class":140},[40,9990,9864],{"class":87},[40,9992,316],{"class":140},[40,9994,7310],{"class":87},[40,9996,118],{"class":406},[40,9998,196],{"class":140},[40,10000,8671],{"class":87},[40,10002,118],{"class":406},[40,10004,161],{"class":140},[40,10006,10008],{"class":42,"line":10007},132,[40,10009,68],{"emptyLinePlaceholder":67},[40,10011,10013,10016,10018,10020],{"class":42,"line":10012},133,[40,10014,10015],{"class":87},"      lastL",[40,10017,9703],{"class":140},[40,10019,9835],{"class":87},[40,10021,161],{"class":140},[40,10023,10025,10028,10030,10032],{"class":42,"line":10024},134,[40,10026,10027],{"class":87},"      lastRgb",[40,10029,1376],{"class":140},[40,10031,9864],{"class":87},[40,10033,161],{"class":140},[40,10035,10037],{"class":42,"line":10036},135,[40,10038,68],{"emptyLinePlaceholder":67},[40,10040,10042,10045,10047,10050,10052,10054,10056],{"class":42,"line":10041},136,[40,10043,10044],{"class":136},"      if",[40,10046,918],{"class":406},[40,10048,10049],{"class":87},"ratio",[40,10051,9510],{"class":140},[40,10053,9513],{"class":87},[40,10055,1404],{"class":406},[40,10057,529],{"class":140},[40,10059,10061,10064],{"class":42,"line":10060},137,[40,10062,10063],{"class":136},"        return",[40,10065,10066],{"class":87}," isSrgb\n",[40,10068,10070,10073,10075,10077,10080,10082,10084,10086,10088,10090,10092,10094,10096,10098,10100,10102,10104,10106,10108,10110,10112,10114,10116,10118,10120,10122,10124,10126,10128,10130,10132,10134,10136,10138,10140,10142,10144],{"class":42,"line":10069},138,[40,10071,10072],{"class":140},"          ?",[40,10074,7782],{"class":87},[40,10076,316],{"class":140},[40,10078,10079],{"class":183},"fromRgb",[40,10081,526],{"class":406},[40,10083,7279],{"class":87},[40,10085,316],{"class":140},[40,10087,7284],{"class":87},[40,10089,196],{"class":140},[40,10091,9864],{"class":87},[40,10093,316],{"class":140},[40,10095,7297],{"class":87},[40,10097,196],{"class":140},[40,10099,9864],{"class":87},[40,10101,316],{"class":140},[40,10103,7310],{"class":87},[40,10105,196],{"class":140},[40,10107,141],{"class":140},[40,10109,153],{"class":140},[40,10111,9626],{"class":406},[40,10113,158],{"class":140},[40,10115,410],{"class":140},[40,10117,9617],{"class":87},[40,10119,196],{"class":140},[40,10121,153],{"class":140},[40,10123,9664],{"class":406},[40,10125,158],{"class":140},[40,10127,410],{"class":140},[40,10129,9655],{"class":87},[40,10131,196],{"class":140},[40,10133,153],{"class":140},[40,10135,9645],{"class":406},[40,10137,158],{"class":140},[40,10139,410],{"class":140},[40,10141,9636],{"class":87},[40,10143,147],{"class":140},[40,10145,2359],{"class":406},[40,10147,10149,10152,10154,10156,10159,10161,10163,10165,10167,10169,10171,10173,10175,10177,10179,10181,10183,10185,10187,10189,10191,10193,10195,10197,10199,10201,10203,10205,10207,10209,10211,10213],{"class":42,"line":10148},139,[40,10150,10151],{"class":140},"          :",[40,10153,7782],{"class":87},[40,10155,316],{"class":140},[40,10157,10158],{"class":183},"fromOklch",[40,10160,526],{"class":406},[40,10162,9877],{"class":87},[40,10164,196],{"class":140},[40,10166,9570],{"class":87},[40,10168,196],{"class":140},[40,10170,9594],{"class":87},[40,10172,196],{"class":140},[40,10174,141],{"class":140},[40,10176,153],{"class":140},[40,10178,9626],{"class":406},[40,10180,158],{"class":140},[40,10182,410],{"class":140},[40,10184,9617],{"class":87},[40,10186,196],{"class":140},[40,10188,153],{"class":140},[40,10190,9664],{"class":406},[40,10192,158],{"class":140},[40,10194,410],{"class":140},[40,10196,9655],{"class":87},[40,10198,196],{"class":140},[40,10200,153],{"class":140},[40,10202,9645],{"class":406},[40,10204,158],{"class":140},[40,10206,410],{"class":140},[40,10208,9636],{"class":87},[40,10210,147],{"class":140},[40,10212,118],{"class":406},[40,10214,161],{"class":140},[40,10216,10218],{"class":42,"line":10217},140,[40,10219,6087],{"class":140},[40,10221,10223],{"class":42,"line":10222},141,[40,10224,68],{"emptyLinePlaceholder":67},[40,10226,10228,10230,10232,10234,10236,10238,10241,10243,10245,10248,10250],{"class":42,"line":10227},142,[40,10229,10044],{"class":136},[40,10231,918],{"class":406},[40,10233,9877],{"class":87},[40,10235,2785],{"class":140},[40,10237,8800],{"class":3248},[40,10239,10240],{"class":140}," ||",[40,10242,9835],{"class":87},[40,10244,2785],{"class":140},[40,10246,10247],{"class":3248}," 1",[40,10249,1404],{"class":406},[40,10251,529],{"class":140},[40,10253,10255,10257],{"class":42,"line":10254},143,[40,10256,10063],{"class":136},[40,10258,10066],{"class":87},[40,10260,10262,10264,10266,10268,10270,10272,10274,10276,10278,10280,10282,10284,10286,10288,10290,10292,10294,10296,10298,10300,10302,10304,10306,10308,10310,10312,10314,10316,10318,10320,10322,10324,10326,10328,10330,10332,10334],{"class":42,"line":10261},144,[40,10263,10072],{"class":140},[40,10265,7782],{"class":87},[40,10267,316],{"class":140},[40,10269,10079],{"class":183},[40,10271,526],{"class":406},[40,10273,7279],{"class":87},[40,10275,316],{"class":140},[40,10277,7284],{"class":87},[40,10279,196],{"class":140},[40,10281,9864],{"class":87},[40,10283,316],{"class":140},[40,10285,7297],{"class":87},[40,10287,196],{"class":140},[40,10289,9864],{"class":87},[40,10291,316],{"class":140},[40,10293,7310],{"class":87},[40,10295,196],{"class":140},[40,10297,141],{"class":140},[40,10299,153],{"class":140},[40,10301,9626],{"class":406},[40,10303,158],{"class":140},[40,10305,410],{"class":140},[40,10307,9617],{"class":87},[40,10309,196],{"class":140},[40,10311,153],{"class":140},[40,10313,9664],{"class":406},[40,10315,158],{"class":140},[40,10317,410],{"class":140},[40,10319,9655],{"class":87},[40,10321,196],{"class":140},[40,10323,153],{"class":140},[40,10325,9645],{"class":406},[40,10327,158],{"class":140},[40,10329,410],{"class":140},[40,10331,9636],{"class":87},[40,10333,147],{"class":140},[40,10335,2359],{"class":406},[40,10337,10339,10341,10343,10345,10347,10349,10351,10353,10355,10357,10359,10361,10363,10365,10367,10369,10371,10373,10375,10377,10379,10381,10383,10385,10387,10389,10391,10393,10395,10397,10399,10401],{"class":42,"line":10338},145,[40,10340,10151],{"class":140},[40,10342,7782],{"class":87},[40,10344,316],{"class":140},[40,10346,10158],{"class":183},[40,10348,526],{"class":406},[40,10350,9877],{"class":87},[40,10352,196],{"class":140},[40,10354,9570],{"class":87},[40,10356,196],{"class":140},[40,10358,9594],{"class":87},[40,10360,196],{"class":140},[40,10362,141],{"class":140},[40,10364,153],{"class":140},[40,10366,9626],{"class":406},[40,10368,158],{"class":140},[40,10370,410],{"class":140},[40,10372,9617],{"class":87},[40,10374,196],{"class":140},[40,10376,153],{"class":140},[40,10378,9664],{"class":406},[40,10380,158],{"class":140},[40,10382,410],{"class":140},[40,10384,9655],{"class":87},[40,10386,196],{"class":140},[40,10388,153],{"class":140},[40,10390,9645],{"class":406},[40,10392,158],{"class":140},[40,10394,410],{"class":140},[40,10396,9636],{"class":87},[40,10398,147],{"class":140},[40,10400,118],{"class":406},[40,10402,161],{"class":140},[40,10404,10406],{"class":42,"line":10405},146,[40,10407,6087],{"class":140},[40,10409,10411],{"class":42,"line":10410},147,[40,10412,68],{"emptyLinePlaceholder":67},[40,10414,10416,10419,10421,10423],{"class":42,"line":10415},148,[40,10417,10418],{"class":87},"      currentL",[40,10420,1376],{"class":140},[40,10422,9835],{"class":87},[40,10424,161],{"class":140},[40,10426,10428],{"class":42,"line":10427},149,[40,10429,3568],{"class":140},[40,10431,10433],{"class":42,"line":10432},150,[40,10434,68],{"emptyLinePlaceholder":67},[40,10436,10438,10440],{"class":42,"line":10437},151,[40,10439,7319],{"class":136},[40,10441,10066],{"class":87},[40,10443,10445,10447,10449,10451,10453,10455,10458,10460,10462,10464,10466,10468,10470,10472,10474,10476,10478,10480,10482,10484,10486,10488,10490,10492,10494,10496,10498,10500,10502,10504,10506,10508,10510,10512,10514,10516,10518],{"class":42,"line":10444},152,[40,10446,9282],{"class":140},[40,10448,7782],{"class":87},[40,10450,316],{"class":140},[40,10452,10079],{"class":183},[40,10454,526],{"class":406},[40,10456,10457],{"class":87},"lastRgb",[40,10459,316],{"class":140},[40,10461,7284],{"class":87},[40,10463,196],{"class":140},[40,10465,9773],{"class":87},[40,10467,316],{"class":140},[40,10469,7297],{"class":87},[40,10471,196],{"class":140},[40,10473,9773],{"class":87},[40,10475,316],{"class":140},[40,10477,7310],{"class":87},[40,10479,196],{"class":140},[40,10481,141],{"class":140},[40,10483,153],{"class":140},[40,10485,9626],{"class":406},[40,10487,158],{"class":140},[40,10489,410],{"class":140},[40,10491,9617],{"class":87},[40,10493,196],{"class":140},[40,10495,153],{"class":140},[40,10497,9664],{"class":406},[40,10499,158],{"class":140},[40,10501,410],{"class":140},[40,10503,9655],{"class":87},[40,10505,196],{"class":140},[40,10507,153],{"class":140},[40,10509,9645],{"class":406},[40,10511,158],{"class":140},[40,10513,410],{"class":140},[40,10515,9636],{"class":87},[40,10517,147],{"class":140},[40,10519,2359],{"class":406},[40,10521,10523,10525,10527,10529,10531,10533,10536,10538,10540,10542,10544,10546,10548,10550,10552,10554,10556,10558,10560,10562,10564,10566,10568,10570,10572,10574,10576,10578,10580,10582,10584,10586],{"class":42,"line":10522},153,[40,10524,9317],{"class":140},[40,10526,7782],{"class":87},[40,10528,316],{"class":140},[40,10530,10158],{"class":183},[40,10532,526],{"class":406},[40,10534,10535],{"class":87},"lastL",[40,10537,196],{"class":140},[40,10539,9570],{"class":87},[40,10541,196],{"class":140},[40,10543,9594],{"class":87},[40,10545,196],{"class":140},[40,10547,141],{"class":140},[40,10549,153],{"class":140},[40,10551,9626],{"class":406},[40,10553,158],{"class":140},[40,10555,410],{"class":140},[40,10557,9617],{"class":87},[40,10559,196],{"class":140},[40,10561,153],{"class":140},[40,10563,9664],{"class":406},[40,10565,158],{"class":140},[40,10567,410],{"class":140},[40,10569,9655],{"class":87},[40,10571,196],{"class":140},[40,10573,153],{"class":140},[40,10575,9645],{"class":406},[40,10577,158],{"class":140},[40,10579,410],{"class":140},[40,10581,9636],{"class":87},[40,10583,147],{"class":140},[40,10585,118],{"class":406},[40,10587,161],{"class":140},[40,10589,10591],{"class":42,"line":10590},154,[40,10592,1435],{"class":140},[40,10594,10596],{"class":42,"line":10595},155,[40,10597,773],{"class":140},[40,10599,10601],{"class":42,"line":10600},156,[40,10602,68],{"emptyLinePlaceholder":67},[40,10604,10606],{"class":42,"line":10605},157,[40,10607,10608],{"class":46},"\u002F** Singleton instance registered as the `ensureContrast` math primitive. *\u002F\n",[40,10610,10612,10614,10616,10619,10621,10623,10625,10627],{"class":42,"line":10611},158,[40,10613,7382],{"class":136},[40,10615,7385],{"class":170},[40,10617,10618],{"class":87}," ensureContrast ",[40,10620,177],{"class":140},[40,10622,898],{"class":140},[40,10624,9058],{"class":183},[40,10626,903],{"class":87},[40,10628,161],{"class":140},[333,10630,10632],{"id":10631},"color-space-conversion","Color-space conversion",[5347,10634,10635,10647],{},[5350,10636,10637],{},[5353,10638,10639,10642,10645],{},[5356,10640,10641],{},"Primitive",[5356,10643,10644],{},"Signature",[5356,10646,6171],{},[5366,10648,10649,10673,10690,10705,10722,10737,10754,10772,10786,10805],{},[5353,10650,10651,10656,10661],{},[5371,10652,10653],{},[18,10654,10655],{},"hexToRgb",[5371,10657,10658],{},[18,10659,10660],{},"apply(hex: string): ColorRecord",[5371,10662,10663,10664,2835,10666,10669,10670,316],{},"Parses a ",[18,10665,5503],{},[18,10667,10668],{},"#rgb"," string into a full ",[18,10671,10672],{},"ColorRecord",[5353,10674,10675,10680,10685],{},[5371,10676,10677],{},[18,10678,10679],{},"rgbToHex",[5371,10681,10682],{},[18,10683,10684],{},"apply(r, g, b): string",[5371,10686,10687,10688,316],{},"Encodes 0..1 RGB channels back to ",[18,10689,5503],{},[5353,10691,10692,10697,10702],{},[5371,10693,10694],{},[18,10695,10696],{},"rgbToHsl",[5371,10698,10699],{},[18,10700,10701],{},"apply(r, g, b, alpha?): HslResult",[5371,10703,10704],{},"Converts sRGB to HSL.",[5353,10706,10707,10712,10717],{},[5371,10708,10709],{},[18,10710,10711],{},"hslToRgb",[5371,10713,10714],{},[18,10715,10716],{},"apply(h, s, l, alpha?): ColorRecord",[5371,10718,10719,10720,316],{},"Converts HSL back to a ",[18,10721,10672],{},[5353,10723,10724,10729,10734],{},[5371,10725,10726],{},[18,10727,10728],{},"rgbToOklch",[5371,10730,10731],{},[18,10732,10733],{},"apply(r, g, b, alpha?): ColorRecord",[5371,10735,10736],{},"Converts sRGB to OKLCH via linear-light space.",[5353,10738,10739,10744,10749],{},[5371,10740,10741],{},[18,10742,10743],{},"oklchToRgb",[5371,10745,10746],{},[18,10747,10748],{},"apply(l, c, h, alpha?): ColorRecord",[5371,10750,10751,10752,316],{},"Converts OKLCH to a gamut-mapped sRGB ",[18,10753,10672],{},[5353,10755,10756,10761,10766],{},[5371,10757,10758],{},[18,10759,10760],{},"oklchToRgbRaw",[5371,10762,10763],{},[18,10764,10765],{},"apply(l, c, h): Rgb",[5371,10767,10768,10769,10771],{},"Same conversion without gamut mapping or ",[18,10770,10672],{}," wrapping.",[5353,10773,10774,10779,10783],{},[5371,10775,10776],{},[18,10777,10778],{},"oklchToDisplayP3",[5371,10780,10781],{},[18,10782,10765],{},[5371,10784,10785],{},"Converts OKLCH into Display P3 primaries for wide-gamut output.",[5353,10787,10788,10797,10802],{},[5371,10789,10790,10793,10794],{},[18,10791,10792],{},"srgbToLinear"," \u002F ",[18,10795,10796],{},"linearToSrgb",[5371,10798,10799],{},[18,10800,10801],{},"apply(r, g, b): Rgb",[5371,10803,10804],{},"sRGB companding transfer functions in each direction.",[5353,10806,10807,10812,10817],{},[5371,10808,10809],{},[18,10810,10811],{},"gamutMapSrgb",[5371,10813,10814],{},[18,10815,10816],{},"apply(l, c, h): GamutMapResult",[5371,10818,10819],{},"Reduces OKLCH chroma along a hue line until the color fits the sRGB gamut.",[333,10821,10823],{"id":10822},"contrast-accessibility","Contrast & accessibility",[5347,10825,10826,10836],{},[5350,10827,10828],{},[5353,10829,10830,10832,10834],{},[5356,10831,10641],{},[5356,10833,10644],{},[5356,10835,6171],{},[5366,10837,10838,10852,10866,10881,10896,10913],{},[5353,10839,10840,10844,10849],{},[5371,10841,10842],{},[18,10843,7137],{},[5371,10845,10846],{},[18,10847,10848],{},"apply(color: ColorRecord): number",[5371,10850,10851],{},"Relative luminance per WCAG 2.1.",[5353,10853,10854,10858,10863],{},[5371,10855,10856],{},[18,10857,7403],{},[5371,10859,10860],{},[18,10861,10862],{},"apply(a, b: ColorRecord): number",[5371,10864,10865],{},"WCAG 2.1 contrast ratio between two colors.",[5353,10867,10868,10873,10878],{},[5371,10869,10870],{},[18,10871,10872],{},"contrastApca",[5371,10874,10875],{},[18,10876,10877],{},"apply(text, background: ColorRecord): number",[5371,10879,10880],{},"APCA (WCAG 3 draft) perceptual contrast (Lc).",[5353,10882,10883,10888,10893],{},[5371,10884,10885],{},[18,10886,10887],{},"contrastText",[5371,10889,10890],{},[18,10891,10892],{},"apply(background: ColorRecord, threshold = 0.179): ColorRecord",[5371,10894,10895],{},"Picks black or white text for a given background by luminance threshold.",[5353,10897,10898,10902,10907],{},[5371,10899,10900],{},[18,10901,7704],{},[5371,10903,10904],{},[18,10905,10906],{},"apply(...)",[5371,10908,10909,10910,10912],{},"Iteratively nudges a foreground color's OKLCH lightness until it clears a target contrast ratio against a background. Backs ",[18,10911,1043],{}," and the VS Code modifier pass.",[5353,10914,10915,10919,10923],{},[5371,10916,10917],{},[18,10918,6558],{},[5371,10920,10921],{},[18,10922,10862],{},[5371,10924,10925],{},"CIEDE2000 perceptual color-difference metric.",[333,10927,10929],{"id":10928},"mixing-adjustment","Mixing & adjustment",[5347,10931,10932,10942],{},[5350,10933,10934],{},[5353,10935,10936,10938,10940],{},[5356,10937,10641],{},[5356,10939,10644],{},[5356,10941,6171],{},[5366,10943,10944,10965,10986,11007],{},[5353,10945,10946,10957,10962],{},[5371,10947,10948,10793,10951,10793,10954],{},[18,10949,10950],{},"mixOklch",[18,10952,10953],{},"mixSrgb",[18,10955,10956],{},"mixHsl",[5371,10958,10959],{},[18,10960,10961],{},"apply(a, b: ColorRecord, t: number): ColorRecord",[5371,10963,10964],{},"Linear-interpolate two colors in the named color space.",[5353,10966,10967,10975,10980],{},[5371,10968,10969,10793,10972],{},[18,10970,10971],{},"lighten",[18,10973,10974],{},"darken",[5371,10976,10977],{},[18,10978,10979],{},"apply(color: ColorRecord, deltaL: number): ColorRecord",[5371,10981,10982,10983,316],{},"Shifts OKLCH lightness by a delta, clamped to ",[18,10984,10985],{},"[0, 1]",[5353,10987,10988,10996,11001],{},[5371,10989,10990,10793,10993],{},[18,10991,10992],{},"saturate",[18,10994,10995],{},"desaturate",[5371,10997,10998],{},[18,10999,11000],{},"apply(color: ColorRecord, deltaC: number): ColorRecord",[5371,11002,11003,11004,316],{},"Shifts OKLCH chroma by a delta, clamped to ",[18,11005,11006],{},"[0, 0.5]",[5353,11008,11009,11014,11019],{},[5371,11010,11011],{},[18,11012,11013],{},"hueShift",[5371,11015,11016],{},[18,11017,11018],{},"apply(color: ColorRecord, degrees: number): ColorRecord",[5371,11020,11021],{},"Rotates OKLCH hue by the given degrees.",[333,11023,11025],{"id":11024},"clustering","Clustering",[5347,11027,11028,11038],{},[5350,11029,11030],{},[5353,11031,11032,11034,11036],{},[5356,11033,10641],{},[5356,11035,10644],{},[5356,11037,6171],{},[5366,11039,11040,11058,11076],{},[5353,11041,11042,11047,11052],{},[5371,11043,11044],{},[18,11045,11046],{},"clusterMedianCut",[5371,11048,11049],{},[18,11050,11051],{},"apply(colors, k: number): ColorRecord[]",[5371,11053,11054,11055,11057],{},"Reduces a color set to ",[18,11056,2308],{}," representative colors via unweighted median-cut.",[5353,11059,11060,11065,11069],{},[5371,11061,11062],{},[18,11063,11064],{},"clusterMedianCutWeighted",[5371,11066,11067],{},[18,11068,11051],{},[5371,11070,11071,11072,5321,11074,316],{},"Median-cut variant that weights bins by pixel\u002Fsample frequency; backs ",[18,11073,6515],{},[18,11075,6329],{},[5353,11077,11078,11083,11087],{},[5371,11079,11080],{},[18,11081,11082],{},"clusterDeltaEMerge",[5371,11084,11085],{},[18,11086,11051],{},[5371,11088,11089,11090,11092,11093,11095],{},"Merges colors within a perceptual (",[18,11091,6558],{},") distance threshold down to ",[18,11094,2308],{}," clusters.",[333,11097,11099],{"id":11098},"utility","Utility",[5347,11101,11102,11112],{},[5350,11103,11104],{},[5353,11105,11106,11108,11110],{},[5356,11107,10641],{},[5356,11109,10644],{},[5356,11111,6171],{},[5366,11113,11114,11129,11147],{},[5353,11115,11116,11121,11126],{},[5371,11117,11118],{},[18,11119,11120],{},"clamp",[5371,11122,11123],{},[18,11124,11125],{},"apply(min, max, v: number): number",[5371,11127,11128],{},"Generic numeric clamp.",[5353,11130,11131,11136,11141],{},[5371,11132,11133],{},[18,11134,11135],{},"clamp01",[5371,11137,11138],{},[18,11139,11140],{},"apply(v: number): number",[5371,11142,11143,11144,11146],{},"Clamps to ",[18,11145,10985],{},", used throughout the channel\u002Flightness\u002Fchroma math.",[5353,11148,11149,11154,11156],{},[5371,11150,11151],{},[18,11152,11153],{},"colorRecordFactory",[5371,11155,6182],{},[5371,11157,11158,11159,11161,11162,11164],{},"Builds a fully-populated ",[18,11160,10672],{}," (rgb, oklch, hex, and optional ",[18,11163,5495],{},") from any single representation.",[237,11166,11167],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":36,"searchDepth":50,"depth":50,"links":11169},[11170],{"id":7128,"depth":50,"text":7129,"children":11171},[11172,11173,11174,11175,11176],{"id":10631,"depth":64,"text":10632},{"id":10822,"depth":64,"text":10823},{"id":10928,"depth":64,"text":10929},{"id":11024,"depth":64,"text":11025},{"id":11098,"depth":64,"text":11099},"Every internal colour-math primitive, callable directly as a singleton, outside of the pipeline.",{},"\u002F10-math-primitives-reference",{"title":7011,"description":11177},"10-math-primitives-reference","KnZv14BGD63vER-AlNYVyUDPrxefHAf03KXjKqdsByQ",{"id":11184,"title":11185,"body":11186,"description":12912,"extension":246,"meta":12913,"navigation":67,"path":12914,"seo":12915,"stem":12916,"__hash__":12917},"docs\u002F11-architecture-internals.md","11. Architecture Internals",{"type":8,"value":11187,"toc":12908},[11188,11192,11207,11292,11308,11322,12338,12342,12349,12368,12464,12481,12487,12905],[23,11189,11191],{"id":11190},"the-task-registry","The Task Registry",[11,11193,1660,11194,11196,11197,11200,11201,11203,11204,2991],{},[18,11195,1674],{}," is the spine of the engine. It acts as a map of ",[18,11198,11199],{},"TaskInterface"," objects. Every task has a string ",[18,11202,3804],{}," (e.g., ",[18,11205,11206],{},"'intake:any'",[31,11208,11210],{"className":127,"code":11209,"language":129,"meta":36,"style":36},"import { TaskRegistry } from '@studnicky\u002Firidis';\n\nconst registry = new TaskRegistry();\nregistry.register(myCustomTask);\nregistry.has('my:custom');          \u002F\u002F true\n",[18,11211,11212,11233,11237,11254,11268],{"__ignoreMap":36},[40,11213,11214,11216,11218,11221,11223,11225,11227,11229,11231],{"class":42,"line":43},[40,11215,137],{"class":136},[40,11217,141],{"class":140},[40,11219,11220],{"class":87}," TaskRegistry",[40,11222,147],{"class":140},[40,11224,150],{"class":136},[40,11226,153],{"class":140},[40,11228,20],{"class":57},[40,11230,158],{"class":140},[40,11232,161],{"class":140},[40,11234,11235],{"class":42,"line":50},[40,11236,68],{"emptyLinePlaceholder":67},[40,11238,11239,11241,11244,11246,11248,11250,11252],{"class":42,"line":64},[40,11240,171],{"class":170},[40,11242,11243],{"class":87}," registry ",[40,11245,177],{"class":140},[40,11247,898],{"class":140},[40,11249,11220],{"class":183},[40,11251,903],{"class":87},[40,11253,161],{"class":140},[40,11255,11256,11259,11261,11263,11266],{"class":42,"line":71},[40,11257,11258],{"class":87},"registry",[40,11260,316],{"class":140},[40,11262,939],{"class":183},[40,11264,11265],{"class":87},"(myCustomTask)",[40,11267,161],{"class":140},[40,11269,11270,11272,11274,11276,11278,11280,11283,11285,11287,11289],{"class":42,"line":77},[40,11271,11258],{"class":87},[40,11273,316],{"class":140},[40,11275,9683],{"class":183},[40,11277,526],{"class":87},[40,11279,158],{"class":140},[40,11281,11282],{"class":57},"my:custom",[40,11284,158],{"class":140},[40,11286,118],{"class":87},[40,11288,2339],{"class":140},[40,11290,11291],{"class":46},"          \u002F\u002F true\n",[11,11293,1660,11294,11296,11297,11299,11300,11303,11304,11307],{},[18,11295,805],{}," owns one ",[18,11298,1674],{}," instance (",[18,11301,11302],{},"engine.tasks","). When you call ",[18,11305,11306],{},"engine.pipeline(['intake:any', 'resolve:roles', ...])",", the engine validates that every name is registered before storing the execution sequence.",[11,11309,11310,11311,11314,11315,343,11318,11321],{},"Its real implementation is small: a name-keyed ",[18,11312,11313],{},"Map",", plus two lifecycle queues (",[18,11316,11317],{},"onRunStart",[18,11319,11320],{},"onRunEnd",") that hooked tasks additionally join.",[31,11323,11325],{"className":127,"code":11324,"language":129,"meta":36,"style":36},"import { ModuleError, ValidationError } from '@studnicky\u002Ferrors';\n\nimport type {\n  LifecyclePhaseType,\n  TaskInterface,\n  TaskManifestInterfaceType,\n  TaskRegistryInterface\n} from '..\u002Ftypes\u002Findex.ts';\n\n\u002F**\n * Holds the mutable set of pipeline tasks an `Engine` will run. Tasks\n * are addressed by name, so registering a task with an existing name is\n * a deliberate override (used by plugins to swap built-ins).\n *\n * Hook tasks live in the same name table as ordered tasks but additionally\n * reside in per-phase queues fired by the engine before\u002Fafter the main\n * sequence. The phase a task was hooked into is the phase it fires in;\n * the same task may not currently be hooked into multiple phases.\n *\u002F\nexport class TaskRegistry implements TaskRegistryInterface {\n  private readonly entries = new Map\u003Cstring, TaskInterface>();\n\n  private readonly onRunStart: TaskInterface[] = [];\n\n  private readonly onRunEnd:   TaskInterface[] = [];\n\n  register(task: TaskInterface): void {\n    if (task.name === '') {\n      throw ValidationError.create({ 'message': 'task.name is required', 'path': 'TaskRegistry.register' });\n    }\n    this.entries.set(task.name, task);\n  }\n\n  hook(phase: LifecyclePhaseType, task: TaskInterface): void {\n    if (task.name === '') {\n      throw ValidationError.create({ 'message': 'task.name is required', 'path': 'TaskRegistry.hook' });\n    }\n    this.entries.set(task.name, task);\n    if (phase === 'onRunStart') {\n      this.onRunStart.push(task);\n\n      return;\n    }\n    this.onRunEnd.push(task);\n  }\n\n  resolve(name: string): TaskInterface {\n    const task = this.entries.get(name);\n\n    if (task === undefined) {\n      throw ModuleError.create(`TaskRegistry.resolve: no task registered with name '${name}'`, {\n        'context':  { 'taskName': name },\n        'scenario': 'NOT_FOUND'\n      });\n    }\n\n    return task;\n  }\n\n  has(name: string): boolean {\n    const result = this.entries.has(name);\n    return result;\n  }\n\n  list(): readonly TaskManifestInterfaceType[] {\n    const out: TaskManifestInterfaceType[] = [];\n\n    for (const task of this.entries.values()) {\n      out.push(task.manifest ?? { 'name': task.name });\n    }\n\n    return out;\n  }\n\n  hooks(phase: LifecyclePhaseType): readonly TaskInterface[] {\n    return phase === 'onRunStart' ? this.onRunStart : this.onRunEnd;\n  }\n}\n",[18,11326,11327,11354,11358,11366,11373,11380,11387,11392,11406,11410,11415,11420,11425,11430,11435,11440,11445,11450,11455,11460,11476,11508,11512,11535,11539,11561,11565,11585,11606,11661,11665,11692,11696,11700,11729,11749,11800,11804,11830,11850,11870,11874,11880,11884,11902,11906,11910,11929,11954,11958,11975,12006,12034,12052,12061,12065,12069,12077,12081,12085,12105,12130,12138,12142,12146,12162,12181,12185,12211,12254,12258,12262,12270,12274,12278,12301,12330,12334],{"__ignoreMap":36},[40,11328,11329,11331,11333,11336,11338,11341,11343,11345,11347,11350,11352],{"class":42,"line":43},[40,11330,137],{"class":136},[40,11332,141],{"class":140},[40,11334,11335],{"class":87}," ModuleError",[40,11337,196],{"class":140},[40,11339,11340],{"class":87}," ValidationError",[40,11342,147],{"class":140},[40,11344,150],{"class":136},[40,11346,153],{"class":140},[40,11348,11349],{"class":57},"@studnicky\u002Ferrors",[40,11351,158],{"class":140},[40,11353,161],{"class":140},[40,11355,11356],{"class":42,"line":50},[40,11357,68],{"emptyLinePlaceholder":67},[40,11359,11360,11362,11364],{"class":42,"line":64},[40,11361,137],{"class":136},[40,11363,7150],{"class":136},[40,11365,401],{"class":140},[40,11367,11368,11371],{"class":42,"line":71},[40,11369,11370],{"class":87},"  LifecyclePhaseType",[40,11372,561],{"class":140},[40,11374,11375,11378],{"class":42,"line":77},[40,11376,11377],{"class":87},"  TaskInterface",[40,11379,561],{"class":140},[40,11381,11382,11385],{"class":42,"line":91},[40,11383,11384],{"class":87},"  TaskManifestInterfaceType",[40,11386,561],{"class":140},[40,11388,11389],{"class":42,"line":99},[40,11390,11391],{"class":87},"  TaskRegistryInterface\n",[40,11393,11394,11396,11398,11400,11402,11404],{"class":42,"line":107},[40,11395,577],{"class":140},[40,11397,150],{"class":136},[40,11399,153],{"class":140},[40,11401,7164],{"class":57},[40,11403,158],{"class":140},[40,11405,161],{"class":140},[40,11407,11408],{"class":42,"line":489},[40,11409,68],{"emptyLinePlaceholder":67},[40,11411,11412],{"class":42,"line":495},[40,11413,11414],{"class":46},"\u002F**\n",[40,11416,11417],{"class":42,"line":500},[40,11418,11419],{"class":46}," * Holds the mutable set of pipeline tasks an `Engine` will run. Tasks\n",[40,11421,11422],{"class":42,"line":506},[40,11423,11424],{"class":46}," * are addressed by name, so registering a task with an existing name is\n",[40,11426,11427],{"class":42,"line":532},[40,11428,11429],{"class":46}," * a deliberate override (used by plugins to swap built-ins).\n",[40,11431,11432],{"class":42,"line":564},[40,11433,11434],{"class":46}," *\n",[40,11436,11437],{"class":42,"line":574},[40,11438,11439],{"class":46}," * Hook tasks live in the same name table as ordered tasks but additionally\n",[40,11441,11442],{"class":42,"line":584},[40,11443,11444],{"class":46}," * reside in per-phase queues fired by the engine before\u002Fafter the main\n",[40,11446,11447],{"class":42,"line":589},[40,11448,11449],{"class":46}," * sequence. The phase a task was hooked into is the phase it fires in;\n",[40,11451,11452],{"class":42,"line":595},[40,11453,11454],{"class":46}," * the same task may not currently be hooked into multiple phases.\n",[40,11456,11457],{"class":42,"line":601},[40,11458,11459],{"class":46}," *\u002F\n",[40,11461,11462,11464,11466,11468,11471,11474],{"class":42,"line":607},[40,11463,7382],{"class":136},[40,11465,2469],{"class":170},[40,11467,11220],{"class":53},[40,11469,11470],{"class":170}," implements",[40,11472,11473],{"class":53}," TaskRegistryInterface",[40,11475,401],{"class":140},[40,11477,11478,11481,11483,11486,11488,11490,11493,11495,11498,11500,11502,11504,11506],{"class":42,"line":613},[40,11479,11480],{"class":170},"  private",[40,11482,2945],{"class":170},[40,11484,11485],{"class":406}," entries",[40,11487,1376],{"class":140},[40,11489,898],{"class":140},[40,11491,11492],{"class":406}," Map",[40,11494,2439],{"class":140},[40,11496,11497],{"class":53},"string",[40,11499,196],{"class":140},[40,11501,2948],{"class":53},[40,11503,7973],{"class":140},[40,11505,903],{"class":87},[40,11507,161],{"class":140},[40,11509,11510],{"class":42,"line":619},[40,11511,68],{"emptyLinePlaceholder":67},[40,11513,11514,11516,11518,11521,11523,11525,11528,11530,11533],{"class":42,"line":1088},[40,11515,11480],{"class":170},[40,11517,2945],{"class":170},[40,11519,11520],{"class":406}," onRunStart",[40,11522,410],{"class":140},[40,11524,2948],{"class":53},[40,11526,11527],{"class":87},"[] ",[40,11529,177],{"class":140},[40,11531,11532],{"class":87}," []",[40,11534,161],{"class":140},[40,11536,11537],{"class":42,"line":1093},[40,11538,68],{"emptyLinePlaceholder":67},[40,11540,11541,11543,11545,11548,11550,11553,11555,11557,11559],{"class":42,"line":1099},[40,11542,11480],{"class":170},[40,11544,2945],{"class":170},[40,11546,11547],{"class":406}," onRunEnd",[40,11549,410],{"class":140},[40,11551,11552],{"class":53},"   TaskInterface",[40,11554,11527],{"class":87},[40,11556,177],{"class":140},[40,11558,11532],{"class":87},[40,11560,161],{"class":140},[40,11562,11563],{"class":42,"line":1120},[40,11564,68],{"emptyLinePlaceholder":67},[40,11566,11567,11570,11572,11574,11576,11578,11580,11583],{"class":42,"line":1140},[40,11568,11569],{"class":406},"  register",[40,11571,526],{"class":140},[40,11573,1426],{"class":2178},[40,11575,410],{"class":140},[40,11577,2948],{"class":53},[40,11579,7249],{"class":140},[40,11581,11582],{"class":53}," void",[40,11584,401],{"class":140},[40,11586,11587,11589,11591,11593,11595,11597,11599,11602,11604],{"class":42,"line":1152},[40,11588,8881],{"class":136},[40,11590,918],{"class":406},[40,11592,1426],{"class":87},[40,11594,316],{"class":140},[40,11596,3804],{"class":87},[40,11598,2785],{"class":140},[40,11600,11601],{"class":140}," ''",[40,11603,1404],{"class":406},[40,11605,529],{"class":140},[40,11607,11608,11611,11613,11615,11618,11620,11622,11624,11627,11629,11631,11633,11636,11638,11640,11642,11644,11646,11648,11650,11653,11655,11657,11659],{"class":42,"line":1176},[40,11609,11610],{"class":136},"      throw",[40,11612,11340],{"class":87},[40,11614,316],{"class":140},[40,11616,11617],{"class":183},"create",[40,11619,526],{"class":406},[40,11621,2383],{"class":140},[40,11623,153],{"class":140},[40,11625,11626],{"class":406},"message",[40,11628,158],{"class":140},[40,11630,410],{"class":140},[40,11632,153],{"class":140},[40,11634,11635],{"class":57},"task.name is required",[40,11637,158],{"class":140},[40,11639,196],{"class":140},[40,11641,153],{"class":140},[40,11643,6071],{"class":406},[40,11645,158],{"class":140},[40,11647,410],{"class":140},[40,11649,153],{"class":140},[40,11651,11652],{"class":57},"TaskRegistry.register",[40,11654,158],{"class":140},[40,11656,147],{"class":140},[40,11658,118],{"class":406},[40,11660,161],{"class":140},[40,11662,11663],{"class":42,"line":1185},[40,11664,3568],{"class":140},[40,11666,11667,11669,11671,11673,11676,11678,11680,11682,11684,11686,11688,11690],{"class":42,"line":1190},[40,11668,1411],{"class":140},[40,11670,2289],{"class":87},[40,11672,316],{"class":140},[40,11674,11675],{"class":183},"set",[40,11677,526],{"class":406},[40,11679,1426],{"class":87},[40,11681,316],{"class":140},[40,11683,3804],{"class":87},[40,11685,196],{"class":140},[40,11687,1396],{"class":87},[40,11689,118],{"class":406},[40,11691,161],{"class":140},[40,11693,11694],{"class":42,"line":1196},[40,11695,1435],{"class":140},[40,11697,11698],{"class":42,"line":4096},[40,11699,68],{"emptyLinePlaceholder":67},[40,11701,11702,11705,11707,11710,11712,11715,11717,11719,11721,11723,11725,11727],{"class":42,"line":4115},[40,11703,11704],{"class":406},"  hook",[40,11706,526],{"class":140},[40,11708,11709],{"class":2178},"phase",[40,11711,410],{"class":140},[40,11713,11714],{"class":53}," LifecyclePhaseType",[40,11716,196],{"class":140},[40,11718,1396],{"class":2178},[40,11720,410],{"class":140},[40,11722,2948],{"class":53},[40,11724,7249],{"class":140},[40,11726,11582],{"class":53},[40,11728,401],{"class":140},[40,11730,11731,11733,11735,11737,11739,11741,11743,11745,11747],{"class":42,"line":4129},[40,11732,8881],{"class":136},[40,11734,918],{"class":406},[40,11736,1426],{"class":87},[40,11738,316],{"class":140},[40,11740,3804],{"class":87},[40,11742,2785],{"class":140},[40,11744,11601],{"class":140},[40,11746,1404],{"class":406},[40,11748,529],{"class":140},[40,11750,11751,11753,11755,11757,11759,11761,11763,11765,11767,11769,11771,11773,11775,11777,11779,11781,11783,11785,11787,11789,11792,11794,11796,11798],{"class":42,"line":4134},[40,11752,11610],{"class":136},[40,11754,11340],{"class":87},[40,11756,316],{"class":140},[40,11758,11617],{"class":183},[40,11760,526],{"class":406},[40,11762,2383],{"class":140},[40,11764,153],{"class":140},[40,11766,11626],{"class":406},[40,11768,158],{"class":140},[40,11770,410],{"class":140},[40,11772,153],{"class":140},[40,11774,11635],{"class":57},[40,11776,158],{"class":140},[40,11778,196],{"class":140},[40,11780,153],{"class":140},[40,11782,6071],{"class":406},[40,11784,158],{"class":140},[40,11786,410],{"class":140},[40,11788,153],{"class":140},[40,11790,11791],{"class":57},"TaskRegistry.hook",[40,11793,158],{"class":140},[40,11795,147],{"class":140},[40,11797,118],{"class":406},[40,11799,161],{"class":140},[40,11801,11802],{"class":42,"line":4139},[40,11803,3568],{"class":140},[40,11805,11806,11808,11810,11812,11814,11816,11818,11820,11822,11824,11826,11828],{"class":42,"line":4159},[40,11807,1411],{"class":140},[40,11809,2289],{"class":87},[40,11811,316],{"class":140},[40,11813,11675],{"class":183},[40,11815,526],{"class":406},[40,11817,1426],{"class":87},[40,11819,316],{"class":140},[40,11821,3804],{"class":87},[40,11823,196],{"class":140},[40,11825,1396],{"class":87},[40,11827,118],{"class":406},[40,11829,161],{"class":140},[40,11831,11832,11834,11836,11838,11840,11842,11844,11846,11848],{"class":42,"line":4179},[40,11833,8881],{"class":136},[40,11835,918],{"class":406},[40,11837,11709],{"class":87},[40,11839,2785],{"class":140},[40,11841,153],{"class":140},[40,11843,11317],{"class":57},[40,11845,158],{"class":140},[40,11847,1404],{"class":406},[40,11849,529],{"class":140},[40,11851,11852,11855,11857,11859,11862,11864,11866,11868],{"class":42,"line":4198},[40,11853,11854],{"class":140},"      this.",[40,11856,11317],{"class":87},[40,11858,316],{"class":140},[40,11860,11861],{"class":183},"push",[40,11863,526],{"class":406},[40,11865,1426],{"class":87},[40,11867,118],{"class":406},[40,11869,161],{"class":140},[40,11871,11872],{"class":42,"line":4211},[40,11873,68],{"emptyLinePlaceholder":67},[40,11875,11876,11878],{"class":42,"line":4231},[40,11877,9523],{"class":136},[40,11879,161],{"class":140},[40,11881,11882],{"class":42,"line":4253},[40,11883,3568],{"class":140},[40,11885,11886,11888,11890,11892,11894,11896,11898,11900],{"class":42,"line":4258},[40,11887,1411],{"class":140},[40,11889,11320],{"class":87},[40,11891,316],{"class":140},[40,11893,11861],{"class":183},[40,11895,526],{"class":406},[40,11897,1426],{"class":87},[40,11899,118],{"class":406},[40,11901,161],{"class":140},[40,11903,11904],{"class":42,"line":4263},[40,11905,1435],{"class":140},[40,11907,11908],{"class":42,"line":4283},[40,11909,68],{"emptyLinePlaceholder":67},[40,11911,11912,11915,11917,11919,11921,11923,11925,11927],{"class":42,"line":4303},[40,11913,11914],{"class":406},"  resolve",[40,11916,526],{"class":140},[40,11918,3804],{"class":2178},[40,11920,410],{"class":140},[40,11922,2676],{"class":53},[40,11924,7249],{"class":140},[40,11926,2948],{"class":53},[40,11928,401],{"class":140},[40,11930,11931,11933,11935,11937,11939,11941,11943,11946,11948,11950,11952],{"class":42,"line":4323},[40,11932,7259],{"class":170},[40,11934,1396],{"class":87},[40,11936,1376],{"class":140},[40,11938,1836],{"class":140},[40,11940,2289],{"class":87},[40,11942,316],{"class":140},[40,11944,11945],{"class":183},"get",[40,11947,526],{"class":406},[40,11949,3804],{"class":87},[40,11951,118],{"class":406},[40,11953,161],{"class":140},[40,11955,11956],{"class":42,"line":4346},[40,11957,68],{"emptyLinePlaceholder":67},[40,11959,11960,11962,11964,11966,11968,11971,11973],{"class":42,"line":4351},[40,11961,8881],{"class":136},[40,11963,918],{"class":406},[40,11965,1426],{"class":87},[40,11967,2785],{"class":140},[40,11969,11970],{"class":140}," undefined",[40,11972,1404],{"class":406},[40,11974,529],{"class":140},[40,11976,11977,11979,11981,11983,11985,11987,11989,11992,11994,11996,11998,12000,12002,12004],{"class":42,"line":4356},[40,11978,11610],{"class":136},[40,11980,11335],{"class":87},[40,11982,316],{"class":140},[40,11984,11617],{"class":183},[40,11986,526],{"class":406},[40,11988,2128],{"class":140},[40,11990,11991],{"class":57},"TaskRegistry.resolve: no task registered with name '",[40,11993,2118],{"class":140},[40,11995,3804],{"class":87},[40,11997,577],{"class":140},[40,11999,158],{"class":57},[40,12001,2128],{"class":140},[40,12003,196],{"class":140},[40,12005,401],{"class":140},[40,12007,12008,12011,12014,12016,12018,12021,12023,12026,12028,12030,12032],{"class":42,"line":4375},[40,12009,12010],{"class":140},"        '",[40,12012,12013],{"class":406},"context",[40,12015,158],{"class":140},[40,12017,410],{"class":140},[40,12019,12020],{"class":140},"  {",[40,12022,153],{"class":140},[40,12024,12025],{"class":406},"taskName",[40,12027,158],{"class":140},[40,12029,410],{"class":140},[40,12031,421],{"class":87},[40,12033,438],{"class":140},[40,12035,12036,12038,12041,12043,12045,12047,12050],{"class":42,"line":4395},[40,12037,12010],{"class":140},[40,12039,12040],{"class":406},"scenario",[40,12042,158],{"class":140},[40,12044,410],{"class":140},[40,12046,153],{"class":140},[40,12048,12049],{"class":57},"NOT_FOUND",[40,12051,1078],{"class":140},[40,12053,12054,12057,12059],{"class":42,"line":4414},[40,12055,12056],{"class":140},"      }",[40,12058,118],{"class":406},[40,12060,161],{"class":140},[40,12062,12063],{"class":42,"line":4437},[40,12064,3568],{"class":140},[40,12066,12067],{"class":42,"line":4442},[40,12068,68],{"emptyLinePlaceholder":67},[40,12070,12071,12073,12075],{"class":42,"line":4447},[40,12072,7319],{"class":136},[40,12074,1396],{"class":87},[40,12076,161],{"class":140},[40,12078,12079],{"class":42,"line":4466},[40,12080,1435],{"class":140},[40,12082,12083],{"class":42,"line":4486},[40,12084,68],{"emptyLinePlaceholder":67},[40,12086,12087,12090,12092,12094,12096,12098,12100,12103],{"class":42,"line":4505},[40,12088,12089],{"class":406},"  has",[40,12091,526],{"class":140},[40,12093,3804],{"class":2178},[40,12095,410],{"class":140},[40,12097,2676],{"class":53},[40,12099,7249],{"class":140},[40,12101,12102],{"class":53}," boolean",[40,12104,401],{"class":140},[40,12106,12107,12109,12112,12114,12116,12118,12120,12122,12124,12126,12128],{"class":42,"line":4518},[40,12108,7259],{"class":170},[40,12110,12111],{"class":87}," result",[40,12113,1376],{"class":140},[40,12115,1836],{"class":140},[40,12117,2289],{"class":87},[40,12119,316],{"class":140},[40,12121,9683],{"class":183},[40,12123,526],{"class":406},[40,12125,3804],{"class":87},[40,12127,118],{"class":406},[40,12129,161],{"class":140},[40,12131,12132,12134,12136],{"class":42,"line":4541},[40,12133,7319],{"class":136},[40,12135,12111],{"class":87},[40,12137,161],{"class":140},[40,12139,12140],{"class":42,"line":4547},[40,12141,1435],{"class":140},[40,12143,12144],{"class":42,"line":4553},[40,12145,68],{"emptyLinePlaceholder":67},[40,12147,12148,12151,12153,12155,12158,12160],{"class":42,"line":4567},[40,12149,12150],{"class":406},"  list",[40,12152,2942],{"class":140},[40,12154,2945],{"class":170},[40,12156,12157],{"class":53}," TaskManifestInterfaceType",[40,12159,11527],{"class":87},[40,12161,529],{"class":140},[40,12163,12164,12166,12169,12171,12173,12175,12177,12179],{"class":42,"line":4636},[40,12165,7259],{"class":170},[40,12167,12168],{"class":87}," out",[40,12170,410],{"class":140},[40,12172,12157],{"class":53},[40,12174,11527],{"class":406},[40,12176,177],{"class":140},[40,12178,11532],{"class":406},[40,12180,161],{"class":140},[40,12182,12183],{"class":42,"line":4701},[40,12184,68],{"emptyLinePlaceholder":67},[40,12186,12187,12189,12191,12193,12195,12197,12199,12201,12203,12206,12209],{"class":42,"line":4766},[40,12188,9794],{"class":136},[40,12190,918],{"class":406},[40,12192,171],{"class":170},[40,12194,1396],{"class":87},[40,12196,1399],{"class":140},[40,12198,1836],{"class":140},[40,12200,2289],{"class":87},[40,12202,316],{"class":140},[40,12204,12205],{"class":183},"values",[40,12207,12208],{"class":406},"()) ",[40,12210,529],{"class":140},[40,12212,12213,12216,12218,12220,12222,12224,12226,12229,12232,12234,12236,12238,12240,12242,12244,12246,12248,12250,12252],{"class":42,"line":4833},[40,12214,12215],{"class":87},"      out",[40,12217,316],{"class":140},[40,12219,11861],{"class":183},[40,12221,526],{"class":406},[40,12223,1426],{"class":87},[40,12225,316],{"class":140},[40,12227,12228],{"class":87},"manifest",[40,12230,12231],{"class":140}," ??",[40,12233,141],{"class":140},[40,12235,153],{"class":140},[40,12237,3804],{"class":406},[40,12239,158],{"class":140},[40,12241,410],{"class":140},[40,12243,1396],{"class":87},[40,12245,316],{"class":140},[40,12247,3804],{"class":87},[40,12249,147],{"class":140},[40,12251,118],{"class":406},[40,12253,161],{"class":140},[40,12255,12256],{"class":42,"line":4839},[40,12257,3568],{"class":140},[40,12259,12260],{"class":42,"line":4844},[40,12261,68],{"emptyLinePlaceholder":67},[40,12263,12264,12266,12268],{"class":42,"line":4849},[40,12265,7319],{"class":136},[40,12267,12168],{"class":87},[40,12269,161],{"class":140},[40,12271,12272],{"class":42,"line":4862},[40,12273,1435],{"class":140},[40,12275,12276],{"class":42,"line":4875},[40,12277,68],{"emptyLinePlaceholder":67},[40,12279,12280,12283,12285,12287,12289,12291,12293,12295,12297,12299],{"class":42,"line":4889},[40,12281,12282],{"class":406},"  hooks",[40,12284,526],{"class":140},[40,12286,11709],{"class":2178},[40,12288,410],{"class":140},[40,12290,11714],{"class":53},[40,12292,7249],{"class":140},[40,12294,2945],{"class":170},[40,12296,2948],{"class":53},[40,12298,11527],{"class":87},[40,12300,529],{"class":140},[40,12302,12303,12305,12308,12310,12312,12314,12316,12318,12320,12322,12324,12326,12328],{"class":42,"line":4902},[40,12304,7319],{"class":136},[40,12306,12307],{"class":87}," phase",[40,12309,2785],{"class":140},[40,12311,153],{"class":140},[40,12313,11317],{"class":57},[40,12315,158],{"class":140},[40,12317,2795],{"class":140},[40,12319,1836],{"class":140},[40,12321,11317],{"class":87},[40,12323,2806],{"class":140},[40,12325,1836],{"class":140},[40,12327,11320],{"class":87},[40,12329,161],{"class":140},[40,12331,12332],{"class":42,"line":4913},[40,12333,1435],{"class":140},[40,12335,12336],{"class":42,"line":4924},[40,12337,773],{"class":140},[23,12339,12341],{"id":12340},"shared-state","Shared State",[11,12343,12344,12345,12348],{},"Every task receives the same mutable ",[18,12346,12347],{},"PaletteStateInterface"," object during execution. Tasks read from and write to named slots on this state.",[11,12350,12351,12352,5321,12355,12358,12359,12362,12363,12367],{},"A task's dependencies are documented via the ",[18,12353,12354],{},"reads",[18,12356,12357],{},"writes"," arrays in its manifest (which you can see visualized in the ",[324,12360,12361],{},"Pipeline"," accordion on the ",[1296,12364,12366],{"href":12365},"#02-the-four-stages","The Four Stages"," card).",[31,12369,12371],{"className":127,"code":12370,"language":129,"meta":36,"style":36},"readonly manifest: TaskManifestInterface = {\n  name:    'resolve:roles',\n  reads:   ['colors', 'input.roles'],\n  writes:  ['roles', 'metadata'],\n};\n",[18,12372,12373,12389,12404,12432,12460],{"__ignoreMap":36},[40,12374,12375,12378,12380,12382,12385,12387],{"class":42,"line":43},[40,12376,12377],{"class":87},"readonly ",[40,12379,12228],{"class":53},[40,12381,410],{"class":140},[40,12383,12384],{"class":87}," TaskManifestInterface ",[40,12386,177],{"class":140},[40,12388,401],{"class":140},[40,12390,12391,12394,12396,12398,12400,12402],{"class":42,"line":50},[40,12392,12393],{"class":406},"  name",[40,12395,410],{"class":140},[40,12397,1534],{"class":140},[40,12399,1032],{"class":57},[40,12401,158],{"class":140},[40,12403,561],{"class":140},[40,12405,12406,12409,12411,12413,12415,12417,12419,12421,12423,12426,12428,12430],{"class":42,"line":64},[40,12407,12408],{"class":406},"  reads",[40,12410,410],{"class":140},[40,12412,3221],{"class":87},[40,12414,158],{"class":140},[40,12416,1853],{"class":57},[40,12418,158],{"class":140},[40,12420,196],{"class":140},[40,12422,153],{"class":140},[40,12424,12425],{"class":57},"input.roles",[40,12427,158],{"class":140},[40,12429,206],{"class":87},[40,12431,561],{"class":140},[40,12433,12434,12437,12439,12442,12444,12446,12448,12450,12452,12454,12456,12458],{"class":42,"line":71},[40,12435,12436],{"class":406},"  writes",[40,12438,410],{"class":140},[40,12440,12441],{"class":87},"  [",[40,12443,158],{"class":140},[40,12445,1869],{"class":57},[40,12447,158],{"class":140},[40,12449,196],{"class":140},[40,12451,153],{"class":140},[40,12453,1933],{"class":57},[40,12455,158],{"class":140},[40,12457,206],{"class":87},[40,12459,561],{"class":140},[40,12461,12462],{"class":42,"line":77},[40,12463,492],{"class":140},[11,12465,12466,12467,12470,12471,12474,12475,12477,12478,12480],{},"The engine ",[324,12468,12469],{},"does not"," enforce dependency ordering at runtime—that is your responsibility via the pipeline array. If a task writes ",[18,12472,12473],{},"state.roles"," and a later task reads ",[18,12476,12473],{},", your ",[18,12479,3591],{}," array must reflect that execution order.",[11,12482,12483,12484,12486],{},"The manifest shape itself, along with the ",[18,12485,11199],{}," every task implements:",[31,12488,12490],{"className":127,"code":12489,"language":129,"meta":36,"style":36},"import type { LoggerInterface } from '@studnicky\u002Flogger\u002Finterfaces';\n\nimport type { EngineInterface } from '.\u002Fengine.ts';\nimport type { TaskRegistryInterface } from '.\u002Fregistry.ts';\nimport type { PaletteStateInterface } from '.\u002Fstate.ts';\n\nexport type LifecyclePhaseType = 'onRunStart' | 'onRunEnd';\n\nexport interface PipelineContextInterface {\n  readonly 'engine':    EngineInterface;\n  readonly 'logger':    LoggerInterface;\n  readonly 'startedAt': number;\n  readonly 'tasks':     TaskRegistryInterface;\n}\n\nexport type TaskManifestInterfaceType = {\n  'description'?:   string;\n  'name':           string;\n  'phase'?:         LifecyclePhaseType;\n  'reads'?:         string[];\n  'requires'?:      string[];\n  'writes'?:        string[];\n};\n\nexport interface TaskInterface {\n  readonly 'manifest'?: TaskManifestInterfaceType;\n  readonly 'name':      string;\n  run(state: PaletteStateInterface, ctx: PipelineContextInterface): void;\n}\n",[18,12491,12492,12516,12520,12544,12567,12591,12595,12621,12625,12637,12654,12672,12689,12706,12710,12714,12726,12742,12757,12772,12789,12806,12823,12827,12831,12841,12857,12873,12901],{"__ignoreMap":36},[40,12493,12494,12496,12498,12500,12503,12505,12507,12509,12512,12514],{"class":42,"line":43},[40,12495,137],{"class":136},[40,12497,7150],{"class":136},[40,12499,141],{"class":140},[40,12501,12502],{"class":87}," LoggerInterface",[40,12504,147],{"class":140},[40,12506,150],{"class":136},[40,12508,153],{"class":140},[40,12510,12511],{"class":57},"@studnicky\u002Flogger\u002Finterfaces",[40,12513,158],{"class":140},[40,12515,161],{"class":140},[40,12517,12518],{"class":42,"line":50},[40,12519,68],{"emptyLinePlaceholder":67},[40,12521,12522,12524,12526,12528,12531,12533,12535,12537,12540,12542],{"class":42,"line":64},[40,12523,137],{"class":136},[40,12525,7150],{"class":136},[40,12527,141],{"class":140},[40,12529,12530],{"class":87}," EngineInterface",[40,12532,147],{"class":140},[40,12534,150],{"class":136},[40,12536,153],{"class":140},[40,12538,12539],{"class":57},".\u002Fengine.ts",[40,12541,158],{"class":140},[40,12543,161],{"class":140},[40,12545,12546,12548,12550,12552,12554,12556,12558,12560,12563,12565],{"class":42,"line":71},[40,12547,137],{"class":136},[40,12549,7150],{"class":136},[40,12551,141],{"class":140},[40,12553,11473],{"class":87},[40,12555,147],{"class":140},[40,12557,150],{"class":136},[40,12559,153],{"class":140},[40,12561,12562],{"class":57},".\u002Fregistry.ts",[40,12564,158],{"class":140},[40,12566,161],{"class":140},[40,12568,12569,12571,12573,12575,12578,12580,12582,12584,12587,12589],{"class":42,"line":77},[40,12570,137],{"class":136},[40,12572,7150],{"class":136},[40,12574,141],{"class":140},[40,12576,12577],{"class":87}," PaletteStateInterface",[40,12579,147],{"class":140},[40,12581,150],{"class":136},[40,12583,153],{"class":140},[40,12585,12586],{"class":57},".\u002Fstate.ts",[40,12588,158],{"class":140},[40,12590,161],{"class":140},[40,12592,12593],{"class":42,"line":91},[40,12594,68],{"emptyLinePlaceholder":67},[40,12596,12597,12599,12601,12603,12605,12607,12609,12611,12613,12615,12617,12619],{"class":42,"line":99},[40,12598,7382],{"class":136},[40,12600,7150],{"class":170},[40,12602,11714],{"class":53},[40,12604,1376],{"class":140},[40,12606,153],{"class":140},[40,12608,11317],{"class":57},[40,12610,158],{"class":140},[40,12612,2156],{"class":140},[40,12614,153],{"class":140},[40,12616,11320],{"class":57},[40,12618,158],{"class":140},[40,12620,161],{"class":140},[40,12622,12623],{"class":42,"line":107},[40,12624,68],{"emptyLinePlaceholder":67},[40,12626,12627,12629,12632,12635],{"class":42,"line":489},[40,12628,7382],{"class":136},[40,12630,12631],{"class":170}," interface",[40,12633,12634],{"class":53}," PipelineContextInterface",[40,12636,401],{"class":140},[40,12638,12639,12641,12643,12645,12647,12649,12652],{"class":42,"line":495},[40,12640,1793],{"class":170},[40,12642,153],{"class":140},[40,12644,958],{"class":57},[40,12646,158],{"class":140},[40,12648,410],{"class":140},[40,12650,12651],{"class":53},"    EngineInterface",[40,12653,161],{"class":140},[40,12655,12656,12658,12660,12663,12665,12667,12670],{"class":42,"line":500},[40,12657,1793],{"class":170},[40,12659,153],{"class":140},[40,12661,12662],{"class":57},"logger",[40,12664,158],{"class":140},[40,12666,410],{"class":140},[40,12668,12669],{"class":53},"    LoggerInterface",[40,12671,161],{"class":140},[40,12673,12674,12676,12678,12681,12683,12685,12687],{"class":42,"line":506},[40,12675,1793],{"class":170},[40,12677,153],{"class":140},[40,12679,12680],{"class":57},"startedAt",[40,12682,158],{"class":140},[40,12684,410],{"class":140},[40,12686,7252],{"class":53},[40,12688,161],{"class":140},[40,12690,12691,12693,12695,12697,12699,12701,12704],{"class":42,"line":532},[40,12692,1793],{"class":170},[40,12694,153],{"class":140},[40,12696,934],{"class":57},[40,12698,158],{"class":140},[40,12700,410],{"class":140},[40,12702,12703],{"class":53},"     TaskRegistryInterface",[40,12705,161],{"class":140},[40,12707,12708],{"class":42,"line":564},[40,12709,773],{"class":140},[40,12711,12712],{"class":42,"line":574},[40,12713,68],{"emptyLinePlaceholder":67},[40,12715,12716,12718,12720,12722,12724],{"class":42,"line":584},[40,12717,7382],{"class":136},[40,12719,7150],{"class":170},[40,12721,12157],{"class":53},[40,12723,1376],{"class":140},[40,12725,401],{"class":140},[40,12727,12728,12730,12732,12734,12737,12740],{"class":42,"line":589},[40,12729,1007],{"class":140},[40,12731,3824],{"class":57},[40,12733,158],{"class":140},[40,12735,12736],{"class":140},"?:",[40,12738,12739],{"class":53},"   string",[40,12741,161],{"class":140},[40,12743,12744,12746,12748,12750,12752,12755],{"class":42,"line":595},[40,12745,1007],{"class":140},[40,12747,3804],{"class":57},[40,12749,158],{"class":140},[40,12751,410],{"class":140},[40,12753,12754],{"class":53},"           string",[40,12756,161],{"class":140},[40,12758,12759,12761,12763,12765,12767,12770],{"class":42,"line":601},[40,12760,1007],{"class":140},[40,12762,11709],{"class":57},[40,12764,158],{"class":140},[40,12766,12736],{"class":140},[40,12768,12769],{"class":53},"         LifecyclePhaseType",[40,12771,161],{"class":140},[40,12773,12774,12776,12778,12780,12782,12785,12787],{"class":42,"line":607},[40,12775,1007],{"class":140},[40,12777,12354],{"class":57},[40,12779,158],{"class":140},[40,12781,12736],{"class":140},[40,12783,12784],{"class":53},"         string",[40,12786,2951],{"class":87},[40,12788,161],{"class":140},[40,12790,12791,12793,12795,12797,12799,12802,12804],{"class":42,"line":613},[40,12792,1007],{"class":140},[40,12794,6150],{"class":57},[40,12796,158],{"class":140},[40,12798,12736],{"class":140},[40,12800,12801],{"class":53},"      string",[40,12803,2951],{"class":87},[40,12805,161],{"class":140},[40,12807,12808,12810,12812,12814,12816,12819,12821],{"class":42,"line":619},[40,12809,1007],{"class":140},[40,12811,12357],{"class":57},[40,12813,158],{"class":140},[40,12815,12736],{"class":140},[40,12817,12818],{"class":53},"        string",[40,12820,2951],{"class":87},[40,12822,161],{"class":140},[40,12824,12825],{"class":42,"line":1088},[40,12826,492],{"class":140},[40,12828,12829],{"class":42,"line":1093},[40,12830,68],{"emptyLinePlaceholder":67},[40,12832,12833,12835,12837,12839],{"class":42,"line":1099},[40,12834,7382],{"class":136},[40,12836,12631],{"class":170},[40,12838,2948],{"class":53},[40,12840,401],{"class":140},[40,12842,12843,12845,12847,12849,12851,12853,12855],{"class":42,"line":1120},[40,12844,1793],{"class":170},[40,12846,153],{"class":140},[40,12848,12228],{"class":57},[40,12850,158],{"class":140},[40,12852,12736],{"class":140},[40,12854,12157],{"class":53},[40,12856,161],{"class":140},[40,12858,12859,12861,12863,12865,12867,12869,12871],{"class":42,"line":1140},[40,12860,1793],{"class":170},[40,12862,153],{"class":140},[40,12864,3804],{"class":57},[40,12866,158],{"class":140},[40,12868,410],{"class":140},[40,12870,12801],{"class":53},[40,12872,161],{"class":140},[40,12874,12875,12877,12879,12882,12884,12886,12888,12891,12893,12895,12897,12899],{"class":42,"line":1152},[40,12876,5205],{"class":406},[40,12878,526],{"class":140},[40,12880,12881],{"class":2178},"state",[40,12883,410],{"class":140},[40,12885,12577],{"class":53},[40,12887,196],{"class":140},[40,12889,12890],{"class":2178}," ctx",[40,12892,410],{"class":140},[40,12894,12634],{"class":53},[40,12896,7249],{"class":140},[40,12898,11582],{"class":53},[40,12900,161],{"class":140},[40,12902,12903],{"class":42,"line":1176},[40,12904,773],{"class":140},[237,12906,12907],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":36,"searchDepth":50,"depth":50,"links":12909},[12910,12911],{"id":11190,"depth":50,"text":11191},{"id":12340,"depth":50,"text":12341},"The TaskRegistry class and the shared PaletteState that every task reads and writes.",{},"\u002F11-architecture-internals",{"title":11185,"description":12912},"11-architecture-internals","O0FlvqsC4CFO8orJz2FvDv7PYeWdINH8LbRJdHqw4u0",{"id":12919,"title":12920,"body":12921,"description":13067,"extension":246,"meta":13068,"navigation":67,"path":13069,"seo":13070,"stem":13071,"__hash__":13072},"docs\u002F12-roadmap-living-color.md","12. Roadmap: Living Color",{"type":8,"value":12922,"toc":13061},[12923,12927,12935,12938,12944,12951,12957,12961,12964,13033,13036,13040,13054],[23,12924,12926],{"id":12925},"roadmap-living-color","Roadmap: living color",[11,12928,12929,12930,12934],{},"The architecture described in ",[1296,12931,12933],{"href":12932},"#11-architecture-internals","Architecture Internals"," derives one point. The v2 thesis is that the same engine can animate between points and continue to enforce the same constraints, WCAG, role schemas, palette algebra, on every frame.",[11,12936,12937],{},"A palette of N roles is a vector in OKLCH × N-roles space, length 3·N:",[31,12939,12942],{"className":12940,"code":12941,"language":265},[263],"[L₁, C₁, h₁,  L₂, C₂, h₂,  ...,  Lₙ, Cₙ, hₙ]\n",[18,12943,12941],{"__ignoreMap":36},[11,12945,12946,12947,12950],{},"A static theme is a frozen point in that space. A living palette is a path through it, the way a chameleon or a cephalopod chromatophore does not pick a color but animates along a trajectory while preserving constraints (visibility, contrast, biological viability). Animation is a parameterised curve ",[18,12948,12949],{},"t ∈ [0, 1] → palette(t)"," that moves continuously from one point to another. Easings shape the curve: linear, cubic-bezier, spring, or chromatic detour (a path that visits a third point so a warm-to-cool transition passes through green rather than brown). Hue wraparound has its own degree of freedom, clockwise, counter-clockwise, or shortest-arc.",[11,12952,12953,12954,12956],{},"The constraint stack runs per frame. A full pipeline derivation is well under a millisecond budget for a 12-role schema, which leaves room for ",[18,12955,1043],{}," to keep WCAG ratios satisfied at every intermediate point on the curve.",[333,12958,12960],{"id":12959},"palette-algebra","Palette algebra",[11,12962,12963],{},"Vector framing makes a small algebra fall out for free:",[5347,12965,12966,12976],{},[5350,12967,12968],{},[5353,12969,12970,12973],{},[5356,12971,12972],{},"Operation",[5356,12974,12975],{},"Meaning",[5366,12977,12978,12993,13003,13013,13023],{},[5353,12979,12980,12985],{},[5371,12981,12982],{},[18,12983,12984],{},"lerp(a, b, 0.3)",[5371,12986,12987,12988,12990,12991],{},"thirty percent of the way from ",[18,12989,1296],{}," toward ",[18,12992,7310],{},[5353,12994,12995,13000],{},[5371,12996,12997],{},[18,12998,12999],{},"a − b",[5371,13001,13002],{},"per-role OKLCH delta vector",[5353,13004,13005,13010],{},[5371,13006,13007],{},[18,13008,13009],{},"nearest(a, corpus)",[5371,13011,13012],{},"closest preset to a custom palette under a perceptual metric",[5353,13014,13015,13020],{},[5371,13016,13017],{},[18,13018,13019],{},"drift(current, derived) > θ",[5371,13021,13022],{},"\"the user adjusted accent past tolerance, re-derive?\"",[5353,13024,13025,13030],{},[5371,13026,13027],{},[18,13028,13029],{},"perpendicular(a, axis)",[5371,13031,13032],{},"move orthogonally on the chroma plane while holding L and h",[11,13034,13035],{},"These are not separate features. They are consequences of treating the palette as a vector and the pipeline as a function from vector to vector.",[333,13037,13039],{"id":13038},"reactive-bindings","Reactive bindings",[11,13041,13042,13043,13046,13047,13050,13051,13053],{},"Once the engine produces ",[18,13044,13045],{},"palette(t)",", the parameter ",[18,13048,13049],{},"t"," can come from anywhere: a clock, an audio FFT bin, scroll position, focus state, ambient light, weather data, a finite-state machine over user mood. The engine does not need to know the source. A binding layer reads a signal, maps it to ",[18,13052,13049],{},", and asks the engine for the palette at that point.",[11,13055,13056,13057,13060],{},"A static palette answers \"what colors\". A living palette answers \"what colors right now, given what is happening\". The wedge is the combination: vector palettes plus role schemas plus contrast enforcement plus animation plus reactive signals, in one engine, with the constraints holding on every frame. The planned ",[18,13058,13059],{},"iridis-anima"," plugin will carry this forward from v1's single-point derivation.",{"title":36,"searchDepth":50,"depth":50,"links":13062},[13063],{"id":12925,"depth":50,"text":12926,"children":13064},[13065,13066],{"id":12959,"depth":64,"text":12960},{"id":13038,"depth":64,"text":13039},"The v2 thesis — animating between palette points while every constraint keeps holding on each frame.",{},"\u002F12-roadmap-living-color",{"title":12920,"description":13067},"12-roadmap-living-color","R4opSa1-98WPwh583nvwc9J-qFBHNxtAqqtDquLn0UA",1783790048559]