@apollion-dsi/tokens 7.9.0 → 7.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/lib/build.cjs +12 -11
- package/lib/build.esm.js +12 -11
- package/lib/cli.mjs +15 -14
- package/lib/config-loader.cjs +1 -1
- package/lib/config-loader.esm.js +2 -2
- package/package.json +1 -1
- package/src/build.ts +64 -35
- package/src/config-schema-runtime.ts +1 -0
- package/src/config-schema.ts +6 -0
- package/src/renderers/tokens-studio.ts +264 -0
package/lib/cli.mjs
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var uo=Object.defineProperty;var i=(e,n)=>uo(e,"name",{value:n,configurable:!0}),po=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,o)=>(typeof require<"u"?require:n)[o]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{readFile as Nt}from"node:fs/promises";import{resolve as je}from"node:path";import{mkdir as to,mkdtemp as Et,readFile as no,rename as At,rm as oo,writeFile as ro}from"node:fs/promises";import{tmpdir as Mt}from"node:os";import{dirname as io,join as Z}from"node:path";import{DEFAULT_TEXT_SIZE as _o,TEXT_SIZE_ATTRIBUTE as zo}from"@apollion-dsi/core/themes/text-size";import{converter as Go,parse as jo}from"culori";import{defaultInputBorder as te}from"@apollion-dsi/core/themes/border";import{createReadableTextLayer as bo}from"@apollion-dsi/core/themes/colors";import{createDeth as Ro,levelValues as ko}from"@apollion-dsi/core/themes/depth";import{createFont as Io,defaultInputFont as L}from"@apollion-dsi/core/themes/font";import{defaultInputSpacing as We}from"@apollion-dsi/core/themes/spacing";import{DEFAULT_TEXT_SIZE as xo}from"@apollion-dsi/core/themes/text-size";import{converter as So,formatHex as vo,parse as wo}from"culori";import{defaultInputBreakpoints as fo}from"@apollion-dsi/core/themes/breakpoints";function Pe(e=fo){return Object.entries(e.values).map(([n,o])=>[n,`${o}px`])}i(Pe,"breakpointEntries");import{defaultInputContainerSizes as mo,defaultInputLayout as go,defaultInputZIndex as yo}from"@apollion-dsi/core/themes/layout";function _e(e=mo){return Object.entries(e.values).map(([n,o])=>[n,`${o}px`])}i(_e,"containerSizeEntries");function ze(e=go){return[["page-max-width",`${e.pageMaxWidth}px`]]}i(ze,"layoutEntries");function Fe(e=yo){return Object.entries(e)}i(Fe,"zIndexEntries");import{createMotion as Q,defaultInputMotion as ee}from"@apollion-dsi/core/themes/motion";function Ne(e=ee){let n=Q(e);return Object.keys(e.duration).map(o=>[o,{ms:e.duration[o],css:n.duration[o]}])}i(Ne,"motionDurationEntries");function Be(e=ee){let n=Q(e);return Object.keys(e.easing).map(o=>[o,{points:e.easing[o],css:n.easing[o]}])}i(Be,"motionEasingEntries");function He(e=ee){let n=Q(e);return Object.keys(e.indicator).map(o=>[o,{ms:e.indicator[o],css:n.indicator[o]}])}i(He,"motionIndicatorEntries");function Ke(e=ee){let n=Q(e);return Object.keys(e.intent).map(o=>{let t=e.intent[o],r=typeof t.duration=="number"?null:t.duration,s=typeof t.duration=="number"?t.duration:e.duration[t.duration];return[o,{durationRef:r,duration:{ms:s,css:n.intent[o].duration},easingRef:t.easing,easing:{points:e.easing[t.easing],css:n.intent[o].easing}}]})}i(Ke,"motionIntentEntries");import{DIMENSION_MULTIPLIERS as ho}from"@apollion-dsi/core/themes/dimension";function ne({multiplier:e=.25,alias:n},o){let t=o!==void 0?ho[o]:e;return(...r)=>r.map(s=>{let a=typeof s=="string"?n[s]:s;return`${t*a}rem`}).join(" ")}i(ne,"createSpacing");var he={"bg.primary":{description:"Primary action surface \u2014 the brand\u2019s dominant call-to-action background."},"bg.secondary":{description:"Secondary action surface \u2014 supporting actions paired with the primary."},"bg.danger":{description:"Destructive / error surface \u2014 irreversible or failing actions."},"bg.success":{description:"Positive confirmation surface \u2014 completed or healthy states."},"bg.info":{description:"Informational surface \u2014 neutral, non-blocking notices.",deprecated:"Use bg.information once the foundation role is renamed (tracked for S6)."},"bg.canvas":{description:"Page ground \u2014 the theme canvas (never pure black in dark)."},"bg.paper":{description:"Component ground (cards, inputs, tables) \u2014 lighter than the canvas in both modes; the dark step is widened for near-black grounds so cards stay separated on LCD/SDR panels (ADR-026)."},"bg.overlay":{description:"Top of the elevation ladder \u2014 modal / dialog panels."},"text.primary":{description:"Primary neutral ink \u2014 AA + APCA Lc \u2265 75 over bg.paper and bg.canvas."},"text.muted":{description:"Muted neutral ink \u2014 AA + APCA Lc \u2265 45 over bg.paper."},"edge.border":{description:"Default control outline \u2014 primary ink at 20 % alpha, legible on any ground."},"edge.hairline":{description:"Dividers and card outlines \u2014 primary ink at 10 % alpha."},"text.on-primary":{description:"Text/icon colour with guaranteed contrast over bg.primary."},"text.on-danger":{description:"Text/icon colour with guaranteed contrast over bg.danger."},"space.medium":{description:"Base spacing step (1rem at normal density) \u2014 the layout rhythm unit."},"space.large":{description:"Comfortable spacing step \u2014 section padding and card gutters."},"spacing.md":{description:"Medium foundation spacing alias \u2014 references the space.medium primitive."},"spacing.lg":{description:"Large foundation spacing alias \u2014 references the space.large primitive."},"border.radius.md":{description:"Default card corner radius."},"border.width.thin":{description:"Hairline border \u2014 dividers and default input outlines."},"border.width.regular":{description:"Standard emphasis border \u2014 focused/active controls."}};function be(e){let n=Object.keys(he).filter(o=>!e.has(o));if(n.length>0)throw new Error(`token-meta: ${n.length} stale TOKEN_META key(s) resolve to no IR node: ${n.join(", ")}. Update src/token-meta.ts to match the current IR paths.`)}i(be,"assertTokenMetaResolves");var To=So("oklch");function b(e){return typeof e.type=="string"&&"value"in e}i(b,"isToken");function x(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}i(x,"kebab");function Ue(e){return e.split(".").map(x).join(".")}i(Ue,"kebabPath");function E(e){return e.kind==="ref"?e.resolved.raw:e.raw}i(E,"rawValue");function oe(e,n){return Number(e.toFixed(n))||0}i(oe,"round");function Re(e){let n=To(wo(e));if(!n)return{kind:"color",raw:e,components:[0,0,0],hex:"#000000"};let o=[oe(n.l,4),oe(n.c,4),oe(n.h??0,2)],t=vo(n)??"#000000";return n.alpha!==void 0&&n.alpha!==1?{kind:"color",raw:e,components:o,alpha:oe(n.alpha,4),hex:t}:{kind:"color",raw:e,components:o,hex:t}}i(Re,"toColorValue");var Je=/^(-?(?:\d+\.?\d*|\.\d+))(px|rem)$/;function $(e){let n=Je.exec(e.trim());if(n)return{kind:"dimension",raw:e,value:Number(n[1]),unit:n[2]};let o=Number.parseFloat(e);return{kind:"dimension",raw:e,value:Number.isFinite(o)?o:0,unit:"rem"}}i($,"toDimensionValue");function I(e){return{type:"color",value:Re(e)}}i(I,"colorToken");function G(e){let n={};for(let[o,t]of Object.entries(e))n[o]=I(t);return n}i(G,"recordColorGroup");function Xe(e){let n=bo(e),o={};for(let[t,r]of Object.entries(n.palettes))o[t]=I(r);return o.neutral=G(n.neutral),o}i(Xe,"buildReadableTextGroup");var Do=["main","opposite","complementary","primary","secondary","tertiary","success","danger","warning","information"];function qe(e){let n={};for(let o of Do){let t=e[o];n[o]={base:I(t.base),dark:I(t.dark),action:I(t.action),active:I(t.active),light:I(t.light),onLight:I(t.onLight)}}return n.grayscale=G(e.grayscale),n.neutral=G(e.neutral),n.surface=G(e.surface),n.ink=G(e.ink),n.edge=G(e.edge),n.wash=G(e.wash),n.baseDark=I(e.baseDark??"#000000"),n.baseLight=I(e.baseLight??"#ffffff"),n.deepDark=I(e.deepDark??"#000000"),n.deepLight=I(e.deepLight??"#ffffff"),n}i(qe,"buildColorPrimitives");function Ze(e){let n=ne(We,e),o={};for(let t of Object.keys(We.alias))o[t]={type:"dimension",value:$(n(t))};return o}i(Ze,"buildSpacePrimitives");function Ye(){let e={};for(let[n,o]of Object.entries(te.borderWidth))e[n]={type:"dimension",value:$(o)};return e}i(Ye,"buildBorderWidthPrimitives");function $o(e,n){return{color:qe(e),space:Ze(n),borderWidth:Ye()}}i($o,"buildPrimitives");var Qe={primary:"color.primary.base",secondary:"color.secondary.base",tertiary:"color.tertiary.base",success:"color.success.base",danger:"color.danger.base",warning:"color.warning.base",info:"color.information.base",canvas:"color.surface.canvas",sunken:"color.surface.sunken",paper:"color.surface.paper",raised:"color.surface.raised",overlay:"color.surface.overlay"},en={onPrimary:"color.baseLight",onSecondary:"color.baseLight",onTertiary:"color.baseDark",onSuccess:"color.baseLight",onDanger:"color.baseLight",onWarning:"color.baseDark",onInfo:"color.baseLight",primary:"color.ink.primary",secondary:"color.ink.secondary",muted:"color.ink.muted",disabled:"color.ink.disabled"},nn={hairline:"color.edge.hairline",border:"color.edge.border",strong:"color.edge.strong"};function Co(e,n){let o=e;for(let t of n.split(".").slice(1))if(o&&typeof o=="object"&&t in o)o=o[t];else return;return typeof o=="string"?o:void 0}i(Co,"lookupPrimitive");function z(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=o[r],c=a?Co(n,a):void 0;t[r]=a&&c===s?{type:"color",value:{kind:"ref",path:a,resolved:Re(s)}}:I(s)}return t}i(z,"colorRefGroup");var on={xs:"space.xs",sm:"space.small",md:"space.medium",lg:"space.large",xl:"space.xl",xxl:"space.xxl"},Eo={none:"border-width.none",thin:"border-width.thin",regular:"border-width.regular",great:"border-width.great",bold:"border-width.bold"};function Ao(e,n){let o=n.split("."),t=o[0]==="border-width"?"borderWidth":o[0],r=e[t];for(let s of o.slice(1))if(r&&!b(r)&&s in r)r=r[s];else return;return r&&b(r)&&r.value.kind==="dimension"?r.value.raw:void 0}i(Ao,"lookupDimensionPrimitive");function ke(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=o[r],c=a?Ao(n,a):void 0;t[r]=a&&c===s?{type:"dimension",value:{kind:"ref",path:a,resolved:$(s)}}:{type:"dimension",value:$(s)}}return t}i(ke,"dimensionRefGroup");function tn(e){let n={},o={};for(let[s,a]of Object.entries(te.borderRadius))Je.test(a)?n[s]={type:"dimension",value:$(a)}:o[s]=a;let t=ke(te.borderWidth,e,Eo),r={};for(let[s,a]of Object.entries(te.borderStyle))r[s]={type:"strokeStyle",value:{kind:"strokeStyle",raw:a,style:a}};return{group:{radius:n,width:t,style:r},extensions:o}}i(tn,"buildBorder");function rn(e){let n=Io(L,{textSize:e}),o={};for(let[c,l]of Object.entries(L.fontFamily)){let p=l.replace(/;\s*$/,"").trim();o[c]={type:"fontFamily",value:{kind:"fontFamily",raw:p,family:p}}}let t={};for(let[c,l]of Object.entries(n.fontSize))t[c]={type:"dimension",value:$(l)};let r={};for(let[c,l]of Object.entries(L.fontWeight))r[c]={type:"fontWeight",value:{kind:"fontWeight",raw:`${l}`,weight:l}};let s={};for(let[c,l]of Object.entries(L.lineHeight))s[c]={type:"number",value:{kind:"number",raw:`${l}`,number:l}};let a={letterSpacing:L.letterSpacing,textTransform:L.textTransform,fontStyle:L.fontStyle};return{group:{family:o,size:t,weight:r,lineHeight:s},extensions:a}}i(rn,"buildFont");var Mo=/rgba?\([^)]*\)|#[0-9a-fA-F]+|[a-zA-Z]+$/;function Vo(e){let n=e.trim(),o=n.startsWith("inset");o&&(n=n.slice(5).trim());let t=n.match(Mo),r=t?t[0]:"#000000",a=(t?n.slice(0,t.index).trim():n).split(/\s+/).filter(Boolean),c=i(l=>$(a[l]??"0px"),"dim");return{kind:"shadow",raw:e,shadow:{color:Re(r),offsetX:c(0),offsetY:c(1),blur:c(2),spread:c(3),inset:o}}}i(Vo,"parseShadow");function sn(e){let n=Ro(e),o={};for(let t of Object.keys(ko))o[t]={type:"shadow",value:Vo(n(t))};return o}i(sn,"buildShadow");function re(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=n?`${n}.${x(r)}`:x(r);if(b(s)){o.add(a);let c=he[a];t[r]=c&&(c.description!==void 0||c.deprecated!==void 0)?{...s,...c.description!==void 0?{description:c.description}:{},...c.deprecated!==void 0?{deprecated:c.deprecated}:{}}:s}else t[r]=re(s,a,o)}return t}i(re,"decorateGroup");function Oo(e){let n=new Set,o=re(e.primitives,"",n),t=re(e.groups,"",n);return be(n),{...e,primitives:o,groups:t}}i(Oo,"decorateMeta");function ie(e,n){return re(e,"",n)}i(ie,"decorateSlice");function an(e,n,o){for(let[t,r]of Object.entries(e)){let s=n?`${n}.${x(t)}`:x(t);b(r)?o.add(s):an(r,s,o)}}i(an,"collectPaths");function cn(e){let n=new Set;for(let o of e)an(o.groups,"",n);be(n)}i(cn,"assertSlicesMetaComplete");function ln(){let e={};for(let[n,o]of Pe())e[n]={type:"dimension",value:$(o)};return e}i(ln,"buildBreakpoints");function un(){let e={};for(let[n,o]of _e())e[n]={type:"dimension",value:$(o)};return e}i(un,"buildContainerSizes");function dn(){let e={};for(let[n,o]of ze())e[n]={type:"dimension",value:$(o)};return e}i(dn,"buildLayoutConstants");function pn(){let e={};for(let[n,o]of Fe())e[n]={type:"number",value:{kind:"number",raw:`${o}`,number:o}};return e}i(pn,"buildZIndex");function fn(){let e=i(a=>({type:"duration",value:{kind:"duration",raw:a.css,value:a.ms,unit:"ms"}}),"durationToken"),n=i(a=>({type:"cubicBezier",value:{kind:"cubicBezier",raw:a.css,points:a.points}}),"easingToken"),o={};for(let[a,c]of Ne())o[a]=e(c);let t={};for(let[a,c]of Be())t[a]=n(c);let r={};for(let[a,c]of He())r[a]=e(c);let s={};for(let[a,c]of Ke()){let l=e(c.duration).value;s[a]={duration:c.durationRef?{type:"duration",value:{kind:"ref",path:`motion.duration.${c.durationRef}`,resolved:l}}:e(c.duration),easing:{type:"cubicBezier",value:{kind:"ref",path:`motion.easing.${c.easingRef}`,resolved:n(c.easing).value}}}}return{duration:o,easing:t,indicator:r,intent:s}}i(fn,"buildMotion");var mn={unit:"px",interval:"half-open [value, next) \u2014 min-width sets, ascending",cssVarsUsage:"informational only \u2014 var() is invalid inside a @media prelude"};function gn(){let e=Ye(),o=tn({borderWidth:e}),t={"com.apollion.breakpoint":mn};Object.keys(o.extensions).length>0&&(t["com.apollion.border"]={radius:o.extensions});let r=new Set;return{groups:ie({"border-width":e,border:o.group,breakpoint:ln(),"container-size":un(),layout:dn(),"z-index":pn(),motion:fn()},r),extensions:t}}i(gn,"buildBaseIR");function Ie(e){let n=rn(e),o=new Set;return{groups:ie({font:n.group},o),extensions:{"com.apollion.font":n.extensions}}}i(Ie,"buildFontIR");function yn(e,n){let o=qe(n),t=new Set;return{groups:ie({color:o,bg:z(e.bg,n,Qe),text:z(e.text,n,en),edge:z(e.edge,n,nn),tx:Xe(n),shadow:sn(n)},t),extensions:{}}}i(yn,"buildColorIR");function hn(e,n){let o=Ze(n),t={space:o},r=new Set;return{groups:ie({space:o,spacing:ke(e.spacing,t,on)},r),extensions:{}}}i(hn,"buildSpacingIR");function Lo(e,n,o){let t={brand:o.brand,mode:o.mode,surface:o.surface,dimension:o.dimension},r=$o(n,o.dimension),s=tn(r),a=rn(xo),c={"com.apollion.variant":t,"com.apollion.font":a.extensions,"com.apollion.breakpoint":mn};Object.keys(s.extensions).length>0&&(c["com.apollion.border"]={radius:s.extensions});let l={description:`Apollion DS tokens \u2014 DTCG 2025.10. Variant: ${t.brand}/${t.mode}/${t.surface}/${t.dimension}.`,meta:t,primitives:r,groups:{bg:z(e.bg,n,Qe),text:z(e.text,n,en),edge:z(e.edge,n,nn),tx:Xe(n),spacing:ke(e.spacing,r,on),border:s.group,breakpoint:ln(),"container-size":un(),layout:dn(),"z-index":pn(),motion:fn(),font:a.group,shadow:sn(n)},extensions:c};return Oo(l)}i(Lo,"buildIR");var F=Lo;var Po=Go("rgb"),bn="// Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs.";function xe(e){if(e.value.kind==="color")return e.value;if(e.value.kind==="ref"&&e.value.resolved.kind==="color")return e.value.resolved}i(xe,"colorPayload");function Se(e){return e.alpha===void 0}i(Se,"isOpaqueColor");function Rn(e){let n=Po(jo(e.hex));if(!n)return"0 0 0";let o=i(t=>Math.min(255,Math.max(0,Math.round(t*255))),"channel");return`${o(n.r)} ${o(n.g)} ${o(n.b)}`}i(Rn,"rgbTriplet");function B(e,n=[]){let o=new Map;for(let[t,r]of Object.entries(e)){let s=[...n,x(t)];if(b(r))o.set(s.join("-"),r);else for(let[a,c]of B(r,s))o.set(a,c)}return o}i(B,"flatTokens");function y(e,...n){let o=e[n[0]];for(let t of n.slice(1)){if(!o||b(o))return{};o=o[t]}return o&&!b(o)?o:{}}i(y,"groupAt");function kn(e){let n=[];for(let o of["bg","text","edge","tx"])for(let[t,r]of B(y(e.groups,o),[o])){let s=xe(r);s&&n.push({key:t,cssVar:`--apollion-${t}`,opaque:Se(s)})}return n}i(kn,"colorEntries");function C(e,n){return[...B(e)].map(([o])=>[o,`var(--apollion-${[...n,o].join("-")})`])}i(C,"varEntries");function T(e,n,o){if(o.length!==0){e.push(` ${n}: {`);for(let[t,r]of o)e.push(` ${JSON.stringify(t)}: ${JSON.stringify(r)},`);e.push(" },")}}i(T,"pushScale");function In(e){let n=[bn,"// Tailwind preset over the Apollion foundation tokens \u2014 requires dist/css/ vars in scope.","","const preset = {"," theme: {"," extend: {"],o=kn(e);n.push(" colors: {");for(let{key:t,cssVar:r,opaque:s}of o)s?n.push(` ${JSON.stringify(t)}: ${JSON.stringify(`rgb(var(${r}-rgb) / <alpha-value>)`)},`):(n.push(` // ${t} carries its own alpha \u2014 excluded from the <alpha-value> modifier form.`),n.push(` ${JSON.stringify(t)}: ${JSON.stringify(`var(${r})`)},`));return n.push(" },"),T(n,"screens",[...B(y(e.groups,"breakpoint"))].filter(([t])=>t!=="xs").map(([t,r])=>[t,E(r.value)])),T(n,"spacing",C(y(e.groups,"spacing"),["spacing"])),T(n,"borderRadius",C(y(e.groups,"border","radius"),["border","radius"])),T(n,"borderWidth",C(y(e.groups,"border","width"),["border","width"])),T(n,"fontFamily",C(y(e.groups,"font","family"),["font","family"])),T(n,"fontSize",C(y(e.groups,"font","size"),["font","size"])),T(n,"fontWeight",C(y(e.groups,"font","weight"),["font","weight"])),T(n,"lineHeight",C(y(e.groups,"font","lineHeight"),["font","line-height"])),T(n,"boxShadow",C(y(e.groups,"shadow"),["shadow"])),T(n,"transitionDuration",C(y(e.groups,"motion","duration"),["motion","duration"])),T(n,"transitionTimingFunction",C(y(e.groups,"motion","easing"),["motion","easing"])),n.push(" },"," },","};","","export default preset;",""),n.join(`
|
|
3
|
-
`)}i(
|
|
4
|
-
`)}i(
|
|
5
|
-
`)}i(
|
|
6
|
-
`)}i(
|
|
7
|
-
[${o}="${c}"]`,
|
|
8
|
-
`)}i(
|
|
2
|
+
var xo=Object.defineProperty;var i=(e,n)=>xo(e,"name",{value:n,configurable:!0}),To=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,o)=>(typeof require<"u"?require:n)[o]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{readFile as ur}from"node:fs/promises";import{resolve as He}from"node:path";import{mkdir as ho,mkdtemp as qt,readFile as mo,rename as Zt,rm as go,writeFile as yo}from"node:fs/promises";import{tmpdir as Yt}from"node:os";import{dirname as bo,join as Q}from"node:path";import{DEFAULT_TEXT_SIZE as Zo,TEXT_SIZE_ATTRIBUTE as Yo}from"@apollion-dsi/core/themes/text-size";import{converter as Jo,parse as Xo}from"culori";import{defaultInputBorder as ie}from"@apollion-dsi/core/themes/border";import{createReadableTextLayer as Eo}from"@apollion-dsi/core/themes/colors";import{createDeth as Vo,levelValues as Ao}from"@apollion-dsi/core/themes/depth";import{createFont as Mo,defaultInputFont as M}from"@apollion-dsi/core/themes/font";import{defaultInputSpacing as Qe}from"@apollion-dsi/core/themes/spacing";import{DEFAULT_TEXT_SIZE as Oo}from"@apollion-dsi/core/themes/text-size";import{converter as Lo,formatHex as Go,parse as jo}from"culori";import{defaultInputBreakpoints as wo}from"@apollion-dsi/core/themes/breakpoints";function We(e=wo){return Object.entries(e.values).map(([n,o])=>[n,`${o}px`])}i(We,"breakpointEntries");import{defaultInputContainerSizes as Do,defaultInputLayout as $o,defaultInputZIndex as vo}from"@apollion-dsi/core/themes/layout";function Ke(e=Do){return Object.entries(e.values).map(([n,o])=>[n,`${o}px`])}i(Ke,"containerSizeEntries");function Ue(e=$o){return[["page-max-width",`${e.pageMaxWidth}px`]]}i(Ue,"layoutEntries");function Je(e=vo){return Object.entries(e)}i(Je,"zIndexEntries");import{createMotion as ne,defaultInputMotion as oe}from"@apollion-dsi/core/themes/motion";function Xe(e=oe){let n=ne(e);return Object.keys(e.duration).map(o=>[o,{ms:e.duration[o],css:n.duration[o]}])}i(Xe,"motionDurationEntries");function qe(e=oe){let n=ne(e);return Object.keys(e.easing).map(o=>[o,{points:e.easing[o],css:n.easing[o]}])}i(qe,"motionEasingEntries");function Ze(e=oe){let n=ne(e);return Object.keys(e.indicator).map(o=>[o,{ms:e.indicator[o],css:n.indicator[o]}])}i(Ze,"motionIndicatorEntries");function Ye(e=oe){let n=ne(e);return Object.keys(e.intent).map(o=>{let t=e.intent[o],r=typeof t.duration=="number"?null:t.duration,s=typeof t.duration=="number"?t.duration:e.duration[t.duration];return[o,{durationRef:r,duration:{ms:s,css:n.intent[o].duration},easingRef:t.easing,easing:{points:e.easing[t.easing],css:n.intent[o].easing}}]})}i(Ye,"motionIntentEntries");import{DIMENSION_MULTIPLIERS as Co}from"@apollion-dsi/core/themes/dimension";function te({multiplier:e=.25,alias:n},o){let t=o!==void 0?Co[o]:e;return(...r)=>r.map(s=>{let a=typeof s=="string"?n[s]:s;return`${t*a}rem`}).join(" ")}i(te,"createSpacing");var Ie={"bg.primary":{description:"Primary action surface \u2014 the brand\u2019s dominant call-to-action background."},"bg.secondary":{description:"Secondary action surface \u2014 supporting actions paired with the primary."},"bg.danger":{description:"Destructive / error surface \u2014 irreversible or failing actions."},"bg.success":{description:"Positive confirmation surface \u2014 completed or healthy states."},"bg.info":{description:"Informational surface \u2014 neutral, non-blocking notices.",deprecated:"Use bg.information once the foundation role is renamed (tracked for S6)."},"bg.canvas":{description:"Page ground \u2014 the theme canvas (never pure black in dark)."},"bg.paper":{description:"Component ground (cards, inputs, tables) \u2014 lighter than the canvas in both modes; the dark step is widened for near-black grounds so cards stay separated on LCD/SDR panels (ADR-026)."},"bg.overlay":{description:"Top of the elevation ladder \u2014 modal / dialog panels."},"text.primary":{description:"Primary neutral ink \u2014 AA + APCA Lc \u2265 75 over bg.paper and bg.canvas."},"text.muted":{description:"Muted neutral ink \u2014 AA + APCA Lc \u2265 45 over bg.paper."},"edge.border":{description:"Default control outline \u2014 primary ink at 20 % alpha, legible on any ground."},"edge.hairline":{description:"Dividers and card outlines \u2014 primary ink at 10 % alpha."},"text.on-primary":{description:"Text/icon colour with guaranteed contrast over bg.primary."},"text.on-danger":{description:"Text/icon colour with guaranteed contrast over bg.danger."},"space.medium":{description:"Base spacing step (1rem at normal density) \u2014 the layout rhythm unit."},"space.large":{description:"Comfortable spacing step \u2014 section padding and card gutters."},"spacing.md":{description:"Medium foundation spacing alias \u2014 references the space.medium primitive."},"spacing.lg":{description:"Large foundation spacing alias \u2014 references the space.large primitive."},"border.radius.md":{description:"Default card corner radius."},"border.width.thin":{description:"Hairline border \u2014 dividers and default input outlines."},"border.width.regular":{description:"Standard emphasis border \u2014 focused/active controls."}};function xe(e){let n=Object.keys(Ie).filter(o=>!e.has(o));if(n.length>0)throw new Error(`token-meta: ${n.length} stale TOKEN_META key(s) resolve to no IR node: ${n.join(", ")}. Update src/token-meta.ts to match the current IR paths.`)}i(xe,"assertTokenMetaResolves");var Po=Lo("oklch");function y(e){return typeof e.type=="string"&&"value"in e}i(y,"isToken");function R(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}i(R,"kebab");function ae(e){return e.split(".").map(R).join(".")}i(ae,"kebabPath");function E(e){return e.kind==="ref"?e.resolved.raw:e.raw}i(E,"rawValue");function re(e,n){return Number(e.toFixed(n))||0}i(re,"round");function Te(e){let n=Po(jo(e));if(!n)return{kind:"color",raw:e,components:[0,0,0],hex:"#000000"};let o=[re(n.l,4),re(n.c,4),re(n.h??0,2)],t=Go(n)??"#000000";return n.alpha!==void 0&&n.alpha!==1?{kind:"color",raw:e,components:o,alpha:re(n.alpha,4),hex:t}:{kind:"color",raw:e,components:o,hex:t}}i(Te,"toColorValue");var en=/^(-?(?:\d+\.?\d*|\.\d+))(px|rem)$/;function v(e){let n=en.exec(e.trim());if(n)return{kind:"dimension",raw:e,value:Number(n[1]),unit:n[2]};let o=Number.parseFloat(e);return{kind:"dimension",raw:e,value:Number.isFinite(o)?o:0,unit:"rem"}}i(v,"toDimensionValue");function S(e){return{type:"color",value:Te(e)}}i(S,"colorToken");function O(e){let n={};for(let[o,t]of Object.entries(e))n[o]=S(t);return n}i(O,"recordColorGroup");function nn(e){let n=Eo(e),o={};for(let[t,r]of Object.entries(n.palettes))o[t]=S(r);return o.neutral=O(n.neutral),o}i(nn,"buildReadableTextGroup");var Fo=["main","opposite","complementary","primary","secondary","tertiary","success","danger","warning","information"];function on(e){let n={};for(let o of Fo){let t=e[o];n[o]={base:S(t.base),dark:S(t.dark),action:S(t.action),active:S(t.active),light:S(t.light),onLight:S(t.onLight)}}return n.grayscale=O(e.grayscale),n.neutral=O(e.neutral),n.surface=O(e.surface),n.ink=O(e.ink),n.edge=O(e.edge),n.wash=O(e.wash),n.baseDark=S(e.baseDark??"#000000"),n.baseLight=S(e.baseLight??"#ffffff"),n.deepDark=S(e.deepDark??"#000000"),n.deepLight=S(e.deepLight??"#ffffff"),n}i(on,"buildColorPrimitives");function tn(e){let n=te(Qe,e),o={};for(let t of Object.keys(Qe.alias))o[t]={type:"dimension",value:v(n(t))};return o}i(tn,"buildSpacePrimitives");function rn(){let e={};for(let[n,o]of Object.entries(ie.borderWidth))e[n]={type:"dimension",value:v(o)};return e}i(rn,"buildBorderWidthPrimitives");function zo(e,n){return{color:on(e),space:tn(n),borderWidth:rn()}}i(zo,"buildPrimitives");var sn={primary:"color.primary.base",secondary:"color.secondary.base",tertiary:"color.tertiary.base",success:"color.success.base",danger:"color.danger.base",warning:"color.warning.base",info:"color.information.base",canvas:"color.surface.canvas",sunken:"color.surface.sunken",paper:"color.surface.paper",raised:"color.surface.raised",overlay:"color.surface.overlay"},an={onPrimary:"color.baseLight",onSecondary:"color.baseLight",onTertiary:"color.baseDark",onSuccess:"color.baseLight",onDanger:"color.baseLight",onWarning:"color.baseDark",onInfo:"color.baseLight",primary:"color.ink.primary",secondary:"color.ink.secondary",muted:"color.ink.muted",disabled:"color.ink.disabled"},cn={hairline:"color.edge.hairline",border:"color.edge.border",strong:"color.edge.strong"};function _o(e,n){let o=e;for(let t of n.split(".").slice(1))if(o&&typeof o=="object"&&t in o)o=o[t];else return;return typeof o=="string"?o:void 0}i(_o,"lookupPrimitive");function P(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=o[r],c=a?_o(n,a):void 0;t[r]=a&&c===s?{type:"color",value:{kind:"ref",path:a,resolved:Te(s)}}:S(s)}return t}i(P,"colorRefGroup");var un={xs:"space.xs",sm:"space.small",md:"space.medium",lg:"space.large",xl:"space.xl",xxl:"space.xxl"},No={none:"border-width.none",thin:"border-width.thin",regular:"border-width.regular",great:"border-width.great",bold:"border-width.bold"};function Bo(e,n){let o=n.split("."),t=o[0]==="border-width"?"borderWidth":o[0],r=e[t];for(let s of o.slice(1))if(r&&!y(r)&&s in r)r=r[s];else return;return r&&y(r)&&r.value.kind==="dimension"?r.value.raw:void 0}i(Bo,"lookupDimensionPrimitive");function we(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=o[r],c=a?Bo(n,a):void 0;t[r]=a&&c===s?{type:"dimension",value:{kind:"ref",path:a,resolved:v(s)}}:{type:"dimension",value:v(s)}}return t}i(we,"dimensionRefGroup");function ln(e){let n={},o={};for(let[s,a]of Object.entries(ie.borderRadius))en.test(a)?n[s]={type:"dimension",value:v(a)}:o[s]=a;let t=we(ie.borderWidth,e,No),r={};for(let[s,a]of Object.entries(ie.borderStyle))r[s]={type:"strokeStyle",value:{kind:"strokeStyle",raw:a,style:a}};return{group:{radius:n,width:t,style:r},extensions:o}}i(ln,"buildBorder");function dn(e){let n=Mo(M,{textSize:e}),o={};for(let[c,u]of Object.entries(M.fontFamily)){let p=u.replace(/;\s*$/,"").trim();o[c]={type:"fontFamily",value:{kind:"fontFamily",raw:p,family:p}}}let t={};for(let[c,u]of Object.entries(n.fontSize))t[c]={type:"dimension",value:v(u)};let r={};for(let[c,u]of Object.entries(M.fontWeight))r[c]={type:"fontWeight",value:{kind:"fontWeight",raw:`${u}`,weight:u}};let s={};for(let[c,u]of Object.entries(M.lineHeight))s[c]={type:"number",value:{kind:"number",raw:`${u}`,number:u}};let a={letterSpacing:M.letterSpacing,textTransform:M.textTransform,fontStyle:M.fontStyle};return{group:{family:o,size:t,weight:r,lineHeight:s},extensions:a}}i(dn,"buildFont");var Ho=/rgba?\([^)]*\)|#[0-9a-fA-F]+|[a-zA-Z]+$/;function Wo(e){let n=e.trim(),o=n.startsWith("inset");o&&(n=n.slice(5).trim());let t=n.match(Ho),r=t?t[0]:"#000000",a=(t?n.slice(0,t.index).trim():n).split(/\s+/).filter(Boolean),c=i(u=>v(a[u]??"0px"),"dim");return{kind:"shadow",raw:e,shadow:{color:Te(r),offsetX:c(0),offsetY:c(1),blur:c(2),spread:c(3),inset:o}}}i(Wo,"parseShadow");function pn(e){let n=Vo(e),o={};for(let t of Object.keys(Ao))o[t]={type:"shadow",value:Wo(n(t))};return o}i(pn,"buildShadow");function se(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=n?`${n}.${R(r)}`:R(r);if(y(s)){o.add(a);let c=Ie[a];t[r]=c&&(c.description!==void 0||c.deprecated!==void 0)?{...s,...c.description!==void 0?{description:c.description}:{},...c.deprecated!==void 0?{deprecated:c.deprecated}:{}}:s}else t[r]=se(s,a,o)}return t}i(se,"decorateGroup");function Ko(e){let n=new Set,o=se(e.primitives,"",n),t=se(e.groups,"",n);return xe(n),{...e,primitives:o,groups:t}}i(Ko,"decorateMeta");function ce(e,n){return se(e,"",n)}i(ce,"decorateSlice");function fn(e,n,o){for(let[t,r]of Object.entries(e)){let s=n?`${n}.${R(t)}`:R(t);y(r)?o.add(s):fn(r,s,o)}}i(fn,"collectPaths");function mn(e){let n=new Set;for(let o of e)fn(o.groups,"",n);xe(n)}i(mn,"assertSlicesMetaComplete");function gn(){let e={};for(let[n,o]of We())e[n]={type:"dimension",value:v(o)};return e}i(gn,"buildBreakpoints");function hn(){let e={};for(let[n,o]of Ke())e[n]={type:"dimension",value:v(o)};return e}i(hn,"buildContainerSizes");function yn(){let e={};for(let[n,o]of Ue())e[n]={type:"dimension",value:v(o)};return e}i(yn,"buildLayoutConstants");function bn(){let e={};for(let[n,o]of Je())e[n]={type:"number",value:{kind:"number",raw:`${o}`,number:o}};return e}i(bn,"buildZIndex");function kn(){let e=i(a=>({type:"duration",value:{kind:"duration",raw:a.css,value:a.ms,unit:"ms"}}),"durationToken"),n=i(a=>({type:"cubicBezier",value:{kind:"cubicBezier",raw:a.css,points:a.points}}),"easingToken"),o={};for(let[a,c]of Xe())o[a]=e(c);let t={};for(let[a,c]of qe())t[a]=n(c);let r={};for(let[a,c]of Ze())r[a]=e(c);let s={};for(let[a,c]of Ye()){let u=e(c.duration).value;s[a]={duration:c.durationRef?{type:"duration",value:{kind:"ref",path:`motion.duration.${c.durationRef}`,resolved:u}}:e(c.duration),easing:{type:"cubicBezier",value:{kind:"ref",path:`motion.easing.${c.easingRef}`,resolved:n(c.easing).value}}}}return{duration:o,easing:t,indicator:r,intent:s}}i(kn,"buildMotion");var Rn={unit:"px",interval:"half-open [value, next) \u2014 min-width sets, ascending",cssVarsUsage:"informational only \u2014 var() is invalid inside a @media prelude"};function Sn(){let e=rn(),o=ln({borderWidth:e}),t={"com.apollion.breakpoint":Rn};Object.keys(o.extensions).length>0&&(t["com.apollion.border"]={radius:o.extensions});let r=new Set;return{groups:ce({"border-width":e,border:o.group,breakpoint:gn(),"container-size":hn(),layout:yn(),"z-index":bn(),motion:kn()},r),extensions:t}}i(Sn,"buildBaseIR");function De(e){let n=dn(e),o=new Set;return{groups:ce({font:n.group},o),extensions:{"com.apollion.font":n.extensions}}}i(De,"buildFontIR");function In(e,n){let o=on(n),t=new Set;return{groups:ce({color:o,bg:P(e.bg,n,sn),text:P(e.text,n,an),edge:P(e.edge,n,cn),tx:nn(n),shadow:pn(n)},t),extensions:{}}}i(In,"buildColorIR");function xn(e,n){let o=tn(n),t={space:o},r=new Set;return{groups:ce({space:o,spacing:we(e.spacing,t,un)},r),extensions:{}}}i(xn,"buildSpacingIR");function Uo(e,n,o){let t={brand:o.brand,mode:o.mode,surface:o.surface,dimension:o.dimension},r=zo(n,o.dimension),s=ln(r),a=dn(Oo),c={"com.apollion.variant":t,"com.apollion.font":a.extensions,"com.apollion.breakpoint":Rn};Object.keys(s.extensions).length>0&&(c["com.apollion.border"]={radius:s.extensions});let u={description:`Apollion DS tokens \u2014 DTCG 2025.10. Variant: ${t.brand}/${t.mode}/${t.surface}/${t.dimension}.`,meta:t,primitives:r,groups:{bg:P(e.bg,n,sn),text:P(e.text,n,an),edge:P(e.edge,n,cn),tx:nn(n),spacing:we(e.spacing,r,un),border:s.group,breakpoint:gn(),"container-size":hn(),layout:yn(),"z-index":bn(),motion:kn(),font:a.group,shadow:pn(n)},extensions:c};return Ko(u)}i(Uo,"buildIR");var F=Uo;var qo=Jo("rgb"),Tn="// Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs.";function $e(e){if(e.value.kind==="color")return e.value;if(e.value.kind==="ref"&&e.value.resolved.kind==="color")return e.value.resolved}i($e,"colorPayload");function ve(e){return e.alpha===void 0}i(ve,"isOpaqueColor");function wn(e){let n=qo(Xo(e.hex));if(!n)return"0 0 0";let o=i(t=>Math.min(255,Math.max(0,Math.round(t*255))),"channel");return`${o(n.r)} ${o(n.g)} ${o(n.b)}`}i(wn,"rgbTriplet");function N(e,n=[]){let o=new Map;for(let[t,r]of Object.entries(e)){let s=[...n,R(t)];if(y(r))o.set(s.join("-"),r);else for(let[a,c]of N(r,s))o.set(a,c)}return o}i(N,"flatTokens");function b(e,...n){let o=e[n[0]];for(let t of n.slice(1)){if(!o||y(o))return{};o=o[t]}return o&&!y(o)?o:{}}i(b,"groupAt");function Dn(e){let n=[];for(let o of["bg","text","edge","tx"])for(let[t,r]of N(b(e.groups,o),[o])){let s=$e(r);s&&n.push({key:t,cssVar:`--apollion-${t}`,opaque:ve(s)})}return n}i(Dn,"colorEntries");function C(e,n){return[...N(e)].map(([o])=>[o,`var(--apollion-${[...n,o].join("-")})`])}i(C,"varEntries");function w(e,n,o){if(o.length!==0){e.push(` ${n}: {`);for(let[t,r]of o)e.push(` ${JSON.stringify(t)}: ${JSON.stringify(r)},`);e.push(" },")}}i(w,"pushScale");function $n(e){let n=[Tn,"// Tailwind preset over the Apollion foundation tokens \u2014 requires dist/css/ vars in scope.","","const preset = {"," theme: {"," extend: {"],o=Dn(e);n.push(" colors: {");for(let{key:t,cssVar:r,opaque:s}of o)s?n.push(` ${JSON.stringify(t)}: ${JSON.stringify(`rgb(var(${r}-rgb) / <alpha-value>)`)},`):(n.push(` // ${t} carries its own alpha \u2014 excluded from the <alpha-value> modifier form.`),n.push(` ${JSON.stringify(t)}: ${JSON.stringify(`var(${r})`)},`));return n.push(" },"),w(n,"screens",[...N(b(e.groups,"breakpoint"))].filter(([t])=>t!=="xs").map(([t,r])=>[t,E(r.value)])),w(n,"spacing",C(b(e.groups,"spacing"),["spacing"])),w(n,"borderRadius",C(b(e.groups,"border","radius"),["border","radius"])),w(n,"borderWidth",C(b(e.groups,"border","width"),["border","width"])),w(n,"fontFamily",C(b(e.groups,"font","family"),["font","family"])),w(n,"fontSize",C(b(e.groups,"font","size"),["font","size"])),w(n,"fontWeight",C(b(e.groups,"font","weight"),["font","weight"])),w(n,"lineHeight",C(b(e.groups,"font","lineHeight"),["font","line-height"])),w(n,"boxShadow",C(b(e.groups,"shadow"),["shadow"])),w(n,"transitionDuration",C(b(e.groups,"motion","duration"),["motion","duration"])),w(n,"transitionTimingFunction",C(b(e.groups,"motion","easing"),["motion","easing"])),n.push(" },"," },","};","","export default preset;",""),n.join(`
|
|
3
|
+
`)}i($n,"renderTailwindPreset");function vn(e){let n=i(r=>[...N(r).keys()],"keys"),o=i(r=>`[${r.map(s=>JSON.stringify(s)).join(", ")}]`,"list");return[Tn,"// tailwind-merge extension for the generated preset \u2014 pass to extendTailwindMerge().","","export const twMergeExtension = {"," extend: {"," theme: {",` colors: ${o(Dn(e).map(r=>r.key))},`,` spacing: ${o(n(b(e.groups,"spacing")))},`,` borderRadius: ${o(n(b(e.groups,"border","radius")))},`,` borderWidth: ${o(n(b(e.groups,"border","width")))},`," },"," classGroups: {",` 'font-family': [{ font: ${o(n(b(e.groups,"font","family")))} }],`,` 'font-size': [{ text: ${o(n(b(e.groups,"font","size")))} }],`,` 'font-weight': [{ font: ${o(n(b(e.groups,"font","weight")))} }],`,` leading: [{ leading: ${o(n(b(e.groups,"font","lineHeight")))} }],`,` shadow: [{ shadow: ${o(n(b(e.groups,"shadow")))} }],`," },"," },","};",""].join(`
|
|
4
|
+
`)}i(vn,"renderTwMergeExtension");var Ce="/* Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs. */";function B(e,n,o){for(let[t,r]of Object.entries(e)){let s=[...n,R(t)];y(r)?o.push(` --apollion-${s.join("-")}: ${E(r.value)};`):B(r,s,o)}}i(B,"emitVars");function ue(e,n,o){for(let[t,r]of Object.entries(e)){let s=[...n,R(t)];if(!y(r)){ue(r,s,o);continue}let a=$e(r);a&&ve(a)&&o.push(` --apollion-${s.join("-")}-rgb: ${wn(a)};`)}}i(ue,"emitRgbVars");function Ee(e,n,o){for(let[t,r]of Object.entries(e)){let s=[...n,R(t)];y(r)?r.type==="color"&&o.push(` @property --apollion-${s.join("-")} { syntax: '<color>'; inherits: true; initial-value: ${E(r.value)}; }`):Ee(r,s,o)}}i(Ee,"emitProperties");function Cn(e,n={}){let{brand:o,mode:t,surface:r,dimension:s}=e.meta,a=[Ce,""];return a.push(`/* Variant: brand=${o} mode=${t} surface=${r} dimension=${s} */`,"",":root {"),B(e.groups,[],a),n.rgbCompanions&&(a.push(""," /* -rgb channel triplets \u2014 Tailwind <alpha-value> companions (opaque colour tokens only). */"),ue(e.groups,[],a)),a.push("}",""),a.push("@supports (background: paint(squircle)) or (color: oklch(0% 0 0)) {"),Ee(e.groups,[],a),a.push("}",""),a.join(`
|
|
5
|
+
`)}i(Cn,"renderCss");function En(e,n,o={}){let{attribute:t="data-apollion-mode",rgbCompanions:r}=o,{brand:s,surface:a,dimension:c}=e.meta,u=[Ce,""],p=i((x,l,d)=>{u.push(`${x} {`,` color-scheme: ${d};`),B(l.groups,[],u),r&&ue(l.groups,[],u),u.push("}","")},"block");u.push(`/* Variant: brand=${s} surface=${a} dimension=${c} modes=light+dark (attribute ${t}) */`,""),p(`:root, html[${t}="light"]`,e,"light"),p(`html[${t}="dark"]`,n,"dark"),u.push("@media (prefers-color-scheme: dark) {"),u.push(` html:not([${t}]) {`," color-scheme: dark;");let k=[];B(n.groups,[],k),r&&ue(n.groups,[],k);for(let x of k)u.push(` ${x}`);return u.push(" }","}",""),u.push("@supports (background: paint(squircle)) or (color: oklch(0% 0 0)) {"),Ee(e.groups,[],u),u.push("}",""),u.join(`
|
|
6
|
+
`)}i(En,"renderCssModes");function Vn(e,n={}){let{attribute:o=Yo,defaultLevel:t=Zo}=n,r=[Ce,""];r.push(`/* Text size (ADR-030): levels=${e.map(([c])=>c).join("+")} default=${t} (attribute ${o}) */`,"");let s=i((c,u)=>{r.push(`${c} {`);let p=u.groups.font;B(p.size,["font","size"],r),r.push("}","")},"block"),a=e.find(([c])=>c===t);a&&s(":root",a[1]);for(let[c,u]of e)s(`:root[${o}="${c}"],
|
|
7
|
+
[${o}="${c}"]`,u);return r.join(`
|
|
8
|
+
`)}i(Vn,"renderCssTextSize");var Qo="<!-- Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs. -->";function Ve(e,n,o){for(let[t,r]of Object.entries(e)){let s=n?`${n}.${t}`:t;y(r)?o.push([s,E(r.value)]):Ve(r,s,o)}}i(Ve,"flatten");function et(e){return typeof e=="number"?String(e):`'${String(e).replace(/'/g,"''")}'`}i(et,"yamlEscape");function nt(e){let{mode:n,surface:o,dimension:t}=e.meta;return`${n}.${o}.${t}`}i(nt,"variantKey");function An(e,n){if(n.length===0)throw new Error(`renderDesignMd: no variants for brand "${e}"`);let o=["---",`brand: '${e}'`,"generator: apollion-tokens","variants:"];for(let r of n){let s=[];Ve(r.groups,"",s),o.push(` ${nt(r)}:`);for(let[a,c]of s)o.push(` ${a}: ${et(c)}`)}o.push("---");let t=["",Qo,"",`# Design.md \u2014 ${e}`,"","Resolved design-token values for this brand, one section per variant.","Consumption rules (which token to reach for, layer boundaries) live in the","package `llms.txt`; this file carries the values those rules reference.","Regenerate with `apollion-tokens build` \u2014 never edit.",""];for(let r of n){let{mode:s,surface:a,dimension:c}=r.meta;t.push(`## Variant \`${s} \xB7 ${a} \xB7 ${c}\``,"");let u=[];Ve(r.groups,"",u);let p=new Map;for(let[k,x]of u){let l=k.split(".")[0]??k,d=p.get(l)??[];d.push([k,x]),p.set(l,d)}for(let[k,x]of p){t.push(`### ${k}`,"","| Token | Value |","| --- | --- |");for(let[l,d]of x)t.push(`| \`${l}\` | \`${d}\` |`);t.push("")}}return`${o.join(`
|
|
9
9
|
`)}
|
|
10
10
|
${t.join(`
|
|
11
|
-
`)}`}i(
|
|
12
|
-
`}i(W,"renderSet");function
|
|
13
|
-
`}i(
|
|
14
|
-
`)}i(
|
|
15
|
-
`}i(Pn,"serializeManifest");import{DEFAULT_TEXT_SIZE as tt}from"@apollion-dsi/core/themes/text-size";var rt="json/sets",_n="json/resolver.json";function U(e){return`${rt}/${e}.json`}i(U,"setFile");function it(e,n,o){return`${e}.color.${n}.${o}`}i(it,"colorSetName");function st(e){return`spacing.${e}`}i(st,"spacingSetName");function at(e){return`font.${e}`}i(at,"fontSetName");function ct(e){return`font.${e}`}i(ct,"legacyFontSetName");function ue(e,n){e.includes(n)||e.push(n)}i(ue,"pushUnique");function zn(e){let n=ce(e),o=[],t=[],r=[],s=[],a=new Set,c=[],l=new Set,p=[],R=[...ae(e)],v=R.map(u=>{let d=at(u);return{kind:"font",name:d,file:U(d),textSize:u}});for(let u of n){ue(o,u.brand),ue(t,u.mode),ue(r,u.surface),ue(s,u.dimension);let d=it(u.brand,u.mode,u.surface);a.has(d)||(a.add(d),c.push({kind:"color",name:d,file:U(d),brand:u.brand,mode:u.mode,surface:u.surface}));let h=st(u.dimension);l.has(h)||(l.add(h),p.push({kind:"spacing",name:h,file:U(h),dimension:u.dimension}))}for(let u of s){let d=ct(u);v.push({kind:"font",name:d,file:U(d),textSize:tt,deprecatedDimension:u})}return{base:{kind:"base",name:"base",file:U("base")},spacing:p,font:v,color:c,modifiers:{brand:o,mode:t,surface:r,dimension:s,textSize:R}}}i(zn,"planSets");import{defaultInputColors as Qn,toDarkColors as vt}from"@apollion-dsi/core/themes/colors";import{createFoundation as eo}from"@apollion-dsi/core/themes/foundation";import{createSemantic as wt}from"@apollion-dsi/core/themes/semantic";import{defaultInputSpacing as Tt}from"@apollion-dsi/core/themes/spacing";import{invertForSurface as Dt}from"@apollion-dsi/core/themes/surface";import{converter as Kn,formatHex as j,interpolate as lt,parse as S,wcagContrast as Wn}from"culori";var q=Kn("oklch"),ut=Kn("rgb");function f(e,n,o){let t=S(e),r=S(n);if(!t||!r)return e;let s=lt([t,r],"oklch");return j(s(o))??e}i(f,"mixOklch");function dt(e){return e?typeof e=="string"?e:e.base:"#000"}i(dt,"coerceToHex");var de=1.3,pt=.05,Fn=.04,V=i((e,n)=>{let o=S(e),t=S(n);return!o||!t?1:Wn(o,t)},"contrastRatio"),J=i(e=>{let n=q(S(e));return n?n.l??0:null},"oklchLightness"),ft=4.5;function X(e,n,o=ft){let t=S(n),r=q(S(e));if(!t||!r)return e;let s=V("#fff",n)>=V("#000",n)?.04:-.04;for(let a=0;a<25;a+=1){let c=j(r)??e,l=S(c);if(l&&Wn(l,t)>=o)return c;let p=Math.min(1,Math.max(0,(r.l??0)+s));if(p===(r.l??0))break;r={...r,l:p}}return j(r)??e}i(X,"readableColor");var Nn=i((e,n)=>{if(V(e,n)>=de)return!0;let o=J(e),t=J(n);return o!==null&&t!==null&&Math.abs(o-t)>=pt},"isPerceptibleState"),Ee=i(e=>e?V("#fff",e)>V("#000",e):!1,"isDarkSurface");function Bn(e,n,o){let t=q(S(e));if(!t)return null;let r={...t,l:o??t.l??0},s=n?Fn:-Fn;for(let a=0;a<25;a+=1){let c=Math.min(1,Math.max(0,(r.l??0)+s));if(c===(r.l??0))break;r={...r,l:c};let l=j(r);if(l&&V(e,l)>=de)return l}return j(r)??null}i(Bn,"derivePerceptibleState");function Hn(e,n,o){let t=Bn(e,n,o);if(t&&V(e,t)>=de)return t;let r=Bn(e,!n);return r&&V(e,r)>=de?r:t??r}i(Hn,"perceptibleStateFor");function D(e,n){let o=typeof e=="object"&&e!==null?e:void 0,t=dt(e),r=n.deepDark,s=n.deepLight,a={base:t,dark:f(t,r,.6),action:f(t,r,.2),active:f(t,s,.6),light:f(t,s,.9),onLight:t};if(S(t)){let c=Ee(n.baseLight),l=Nn(t,a.action);if(l||(a.action=Hn(t,c)??a.action),!Nn(t,a.active)){let p=l?void 0:J(a.action)??void 0;a.active=Hn(t,c,p)??a.active}}if(a.onLight=X(a.action,a.light),o){let c=o.action??a.action,l=o.light??a.light;return{base:t,dark:o.dark??a.dark,action:c,active:o.active??a.active,light:l,onLight:o.onLight??X(c,l)}}return a}i(D,"mountSingleColor");function Un(e){let n=e.deepLight,o=e.deepDark;return{0:n,5:f(n,o,.05),10:f(n,o,.1),20:f(n,o,.2),30:f(n,o,.3),40:f(n,o,.4),50:f(n,o,.5),60:f(n,o,.6),70:f(n,o,.7),80:f(n,o,.8),90:f(n,o,.9),100:f(n,o,1)}}i(Un,"mountGreyscaleColors");function Jn(e){let n=e.deepLight,o=e.deepDark,t=typeof e.primary=="object"&&e.primary?e.primary.base:e.primary,r=i(a=>1/17*(a-1),"interpolation"),s=f(t,o,.5);return{0:f(s,n,r(18)),5:f(s,n,r(17.5)),10:f(s,n,r(17)),20:f(s,n,r(16)),30:f(s,n,r(15)),40:f(s,n,r(14)),50:f(s,n,r(13)),60:f(s,n,r(12)),70:f(s,n,r(11)),80:f(s,n,r(10)),90:f(s,n,r(9)),100:f(s,n,r(8)),110:f(s,n,r(7)),120:f(s,n,r(6)),130:f(s,n,r(5)),140:f(s,n,r(4)),150:f(s,n,r(3)),160:f(s,n,r(2)),170:s,180:f(s,o,.25)}}i(Jn,"mountNeutralColors");function N(e,n){let o=q(S(e));if(!o)return e;let t=Math.min(1,Math.max(0,(o.l??0)+n));return j({...o,l:t})??e}i(N,"shiftLightness");function pe(e,n){let o=q(S(e));if(!o)return e;let t=o.l??0,r=n.min??0,s=n.max??1;return t>=r&&t<=s?e:j({...o,l:Math.min(s,Math.max(r,t))})??e}i(pe,"clampLightness");function P(e,n){let o=ut(S(e));if(!o)return e;let t=Math.min(1,Math.max(0,n)),r=i(s=>Math.round((s??0)*255),"channel");return`rgba(${r(o.r)}, ${r(o.g)}, ${r(o.b)}, ${t})`}i(P,"toRgbaString");import{apcaContrast as fe,DARK_BOOST_TAPER_MAX_L as Ae,DARK_ELEVATION_BOOST as mt,EDGE_ALPHA as Me,HALATION_FLOORS as me,INK_APCA_MIN as Ve,INK_MIX as Oe,LADDER_DELTAS as Xn,MIN_CONTRAST_AA as qn,WASH_ALPHA as gt}from"@apollion-dsi/core/themes/colors";var yt="#FFFFFF",Le="#000000";function ht(e){return Ee(e.baseLight)?"dark":"light"}i(ht,"resolvePolarity");function bt(e){let n=me.CANVAS_MIN_L;return e<=n?1:e>=Ae?0:(Ae-e)/(Ae-n)}i(bt,"darkElevationBoostFactor");function Zn(e,n,o){if(Math.abs(fe(e,n))>=o)return e;let t=Math.abs(fe("#ffffff",n))>=Math.abs(fe("#000000",n)),r=e;for(let s=0;s<40;s+=1){let a=N(r,t?.02:-.02);if(a===r||(r=a,Math.abs(fe(r,n))>=o))break}return r}i(Zn,"ensureApca");function Rt(e,n){let o=e.baseLight??yt,t=n==="dark",r=t?pe(o,{min:me.CANVAS_MIN_L}):o,s=N(r,Xn.sunken),a=t?bt(J(r)??0):0,c=i(l=>Xn[l]+a*mt[l],"delta");return{canvas:r,sunken:t?pe(s,{min:me.CANVAS_MIN_L}):s,paper:N(r,c("paper")),raised:N(r,c("raised")),overlay:N(r,c("overlay")),scrim:t?e.deepLight??Le:e.neutral?.["180"]??e.baseDark??Le}}i(Rt,"deriveSurface");function kt(e,n){let o=e.baseDark??Le,t=pe(Zn(X(o,n.paper,qn),n.paper,Ve.primary),{max:me.INK_MAX_L}),r=i((s,a)=>Zn(X(f(t,n.canvas,s),n.paper,qn),n.paper,a),"tier");return{primary:t,secondary:r(Oe.secondary,Ve.secondary),muted:r(Oe.muted,Ve.muted),disabled:f(t,n.canvas,Oe.disabled)}}i(kt,"deriveInk");function It(e){return{hairline:P(e.primary,Me.hairline),border:P(e.primary,Me.border),strong:P(e.primary,Me.strong)}}i(It,"deriveEdge");function xt(e,n){let o=gt[n];return{hover:P(e.primary,o.hover),pressed:P(e.primary,o.pressed),selected:P(e.primary,o.selected)}}i(xt,"deriveWash");function St(e,n){return n?{surface:{...e.surface,...n.surface},ink:{...e.ink,...n.ink},edge:{...e.edge,...n.edge},wash:{...e.wash,...n.wash}}:e}i(St,"applyOverride");function Yn(e,n){let o=ht(e),t=Rt(e,o),r=kt(e,t),s={surface:t,ink:r,edge:It(r),wash:xt(r,o)};return St(s,n?.[o])}i(Yn,"resolveSurfaceLadder");function $t(e){let n=Jn(e);return{baseDark:e.baseDark,baseLight:e.baseLight,deepDark:e.deepDark,deepLight:e.deepLight,transparent:e.transparent??"transparent",neutral:n,grayscale:Un(e),...Yn({...e,neutral:n},e.ladder),main:D(e.main,e),opposite:D(e.opposite,e),complementary:D(e.complementary,e),danger:D(e.danger,e),information:D(e.information,e),success:D(e.success,e),warning:D(e.warning,e),primary:D(e.primary,e),secondary:D(e.secondary,e),tertiary:D(e.tertiary,e)}}i($t,"composeColors");function Ct(e){return{...e,baseLight:e.baseLight??Qn.baseLight,baseDark:e.baseDark??Qn.baseDark}}i(Ct,"withContrastDefaults");function O(e,n=Tt){let o=Ct(e.colors),t=e.mode==="dark"?vt(o):o,r=$t(t),s=ne(n,e.dimension),a=wt({colors:r,spacing:s}),c=eo(a);return e.surface==="negative"&&(c=eo(Dt({semantic:a,colors:r},"negative").semantic)),{foundation:c,colors:r}}i(O,"buildVariantThemes");async function so(e){let{config:n,outDir:o,cwd:t=process.cwd(),verbose:r=!1}=e,s=ce(n),a=n.output??{};if(s.length===0)throw new Error("apollion-tokens build: no variants (config.brands is empty)");let c=await Et(Z(Mt(),"apollion-tokens-"));try{let l=[],p=i(async(u,d)=>{await Vt(c,u,d),l.push({path:u,sha256:le(d)}),r&&console.log(` \u2713 ${u}`)},"emit");if(a.json){let u=zn(n),d=[],h=gn();d.push(h),await p(u.base.file,$n(h));for(let m of u.spacing){let k=s.find(Y=>Y.dimension===m.dimension),{foundation:A}=O(k),M=hn(A,m.dimension);d.push(M),await p(m.file,En(M,m.dimension))}for(let m of u.font){let k=Ie(m.textSize);d.push(k),await p(m.file,An(k,m))}for(let m of u.color){let k=s.find(ye=>ye.brand===m.brand&&ye.mode===m.mode&&ye.surface===m.surface),{foundation:A,colors:M}=O(k),Y=yn(A,M);d.push(Y),await p(m.file,Cn(Y,m.brand,m.mode,m.surface))}cn(d),await p(_n,Mn(n,u))}if(a.css||a.ts)for(let u of s){let{foundation:d,colors:h}=O(u),m=F(d,h,u),k=Ln(u);a.css&&await p(`css/${k}.css`,Sn(m,{rgbCompanions:a.tailwind})),a.ts&&await p(`ts/${k}.d.ts`,On(m))}if(a.css||a.cssModes){let u=ae(n).map(d=>[d,Ie(d)]);await p("css/font.css",wn(u))}if(a.cssModes){let u=new Map;for(let d of s){let h=`${d.brand}.${d.surface}.${d.dimension}`,m=u.get(h)??{};m[d.mode]=d,u.set(h,m)}for(let[d,{light:h,dark:m}]of u){if(!h||!m)throw new Error(`apollion-tokens build: output.cssModes needs both modes for ${d} (config.modes)`);let k=O(h),A=O(m),M=vn(F(k.foundation,k.colors,h),F(A.foundation,A.colors,m),{rgbCompanions:a.tailwind});await p(`css/${d}.modes.css`,M)}}if(a.tailwind){let u=s[0],{foundation:d,colors:h}=O(u),m=F(d,h,u);await p("tailwind/preset.mjs",In(m)),await p("tailwind/tw-merge.mjs",xn(m))}if(a.designMd){let u=[...new Set(s.map(d=>d.brand))];for(let d of u){let m=s.filter(k=>k.brand===d).map(k=>{let{foundation:A,colors:M}=O(k);return F(A,M,k)});await p(`design/${d}.design.md`,Tn(d,m))}}let R={configHash:Ce(n),files:l,gitCommit:Gn(t),buildEnv:jn()},v=Pn(R);return await ro(Z(c,"manifest.json"),v),await oo(o,{recursive:!0,force:!0}),await to(io(o),{recursive:!0}),await At(c,o),r&&console.log(`\u2713 ${l.length} files \u2192 ${o}`),{manifest:R,outDir:o}}catch(l){throw await oo(c,{recursive:!0,force:!0}).catch(()=>{}),l}}i(so,"build");async function ao(e){let{config:n,outDir:o}=e,t;try{t=JSON.parse(await no(Z(o,"manifest.json"),"utf8"))}catch{return!1}if(t.configHash!==Ce(n))return!1;for(let r of t.files){let s;try{s=await no(Z(o,r.path))}catch{return!1}if(le(s)!==r.sha256)return!1}return!0}i(ao,"check");async function Vt(e,n,o){let t=Z(e,n);await to(io(t),{recursive:!0}),await ro(t,o)}i(Vt,"writeAt");import{readFile as Lt}from"node:fs/promises";import{resolve as Gt}from"node:path";import{createContext as jt,Script as Pt}from"node:vm";import{z as g}from"zod";var w=g.string().regex(/^#([0-9a-fA-F]{3}){1,2}$|^transparent$|^rgb\(.*\)$|^oklch\(.*\)$/,{message:'Must be hex, rgb(), oklch(), or "transparent"'}),Ot=g.object({baseDark:g.string().optional(),baseLight:g.string().optional(),deepDark:w,deepLight:w,transparent:g.string().optional(),main:w.optional(),opposite:w.optional(),complementary:w.optional(),information:w.optional(),success:w.optional(),danger:w.optional(),warning:w.optional(),primary:w.optional(),secondary:w.optional(),tertiary:w.optional()}).passthrough(),co=g.object({brands:g.record(g.string(),Ot).refine(e=>Object.keys(e).length>0,{message:"apollion.config.mjs: brands must contain at least 1 entry"}),modes:g.array(g.enum(["light","dark"])).optional(),surfaces:g.array(g.enum(["positive","negative"])).optional(),dimensions:g.array(g.enum(["compact","normal","spacious"])).optional(),textSizes:g.array(g.enum(["smaller","default","larger","largest"])).refine(e=>e.includes("default"),{message:"apollion.config.mjs: textSizes must include 'default'"}).refine(e=>new Set(e).size===e.length,{message:"apollion.config.mjs: textSizes must not repeat a level"}).optional(),output:g.object({runtime:g.boolean().optional(),css:g.boolean().optional(),json:g.boolean().optional(),ts:g.boolean().optional(),designMd:g.boolean().optional(),tailwind:g.boolean().optional(),cssModes:g.boolean().optional()}).passthrough().optional()}).passthrough();var _t=[/\brequire\s*\(/,/\bimport\s*\(/,/^\s*import\s+/m],zt=1e3;var Ge=class Ge extends Error{constructor(o,t){super(o);this.configPath=t;this.name="ConfigLoadError"}};i(Ge,"ConfigLoadError");var _=Ge;async function lo(e){let n=Gt(e.configPath),o=await Lt(n,"utf8");for(let l of _t)if(l.test(o))throw new _(`apollion.config: dynamic require/import not allowed (matched ${l}). Declarative config only \u2014 see ADR-006 \xA73.8 B3.`,n);let t=o.replace(/(^|\n)\s*export\s+default\s+/,(l,p)=>`${p}__apollion_config_export = `);if(t===o)throw new _("apollion.config: missing `export default <object>;` \u2014 config must export a default object literal.",n);let r={__apollion_config_export:void 0,console:Ft(),Symbol,Number,String,Boolean,Array,Object,JSON,Math,defineConfig:i(l=>l,"defineConfig")},s=jt(r);try{new Pt(t,{filename:n}).runInContext(s,{timeout:zt})}catch(l){throw new _(`apollion.config: evaluation failed \u2014 ${l instanceof Error?l.message:String(l)}`,n)}let a=r.__apollion_config_export;if(a===void 0)throw new _("apollion.config: `export default` produced undefined.",n);let c=co.safeParse(a);if(!c.success){let l=c.error.issues.map(p=>` ${p.path.join(".")||"(root)"}: ${p.message}`).join(`
|
|
16
|
-
`);throw new _(`apollion.config: schema validation failed \u2014
|
|
17
|
-
|
|
11
|
+
`)}`}i(An,"renderDesignMd");import{DEFAULT_TEXT_SIZE as at}from"@apollion-dsi/core/themes/text-size";function Mn(e){return e.alpha!==void 0?{colorSpace:"oklch",components:[...e.components],alpha:e.alpha,hex:e.hex}:{colorSpace:"oklch",components:[...e.components],hex:e.hex}}i(Mn,"colorValue");function H(e){return{value:e.value,unit:e.unit}}i(H,"dimensionValue");function ot(e){return{value:e.value,unit:e.unit}}i(ot,"durationValue");function tt(e){return[...e.points]}i(tt,"cubicBezierValue");function rt(e){let n=e.shadow,o={color:Mn(n.color),offsetX:H(n.offsetX),offsetY:H(n.offsetY),blur:H(n.blur),spread:H(n.spread)};return n.inset&&(o.inset=!0),o}i(rt,"shadowValue");function it(e){switch(e.kind){case"ref":return`{${ae(e.path)}}`;case"color":return Mn(e);case"dimension":return H(e);case"fontFamily":return e.family;case"fontWeight":return e.weight;case"number":return e.number;case"strokeStyle":return e.style;case"shadow":return rt(e);case"duration":return ot(e);case"cubicBezier":return tt(e)}}i(it,"projectValue");function st(e){let n={$value:it(e.value),$type:e.type};return e.description!==void 0&&(n.$description=e.description),e.deprecated!==void 0&&(n.$deprecated=e.deprecated),n}i(st,"projectToken");function Ae(e){let n={};for(let[o,t]of Object.entries(e))n[R(o)]=y(t)?st(t):Ae(t);return n}i(Ae,"projectGroup");function W(e,n,o){let t=Ae(e.groups);if(o)for(let s of Object.keys(t))t[s]={$deprecated:o,...t[s]};let r={$description:n,...t};return Object.keys(e.extensions).length>0&&(r.$extensions=e.extensions),`${JSON.stringify(r,null,2)}
|
|
12
|
+
`}i(W,"renderSet");function On(e){return W(e,"Apollion DS \u2014 base set (axis-invariant: border, breakpoints, container sizes, layout, motion). DTCG 2025.10.")}i(On,"renderBaseSet");function Ln(e,n,o,t){return W(e,`Apollion DS \u2014 colour set. brand=${n} mode=${o} surface=${t}. DTCG 2025.10.`)}i(Ln,"renderColorSet");function Gn(e,n){return W(e,`Apollion DS \u2014 spacing set. dimension=${n}. DTCG 2025.10.`)}i(Gn,"renderSpacingSet");function jn(e,n){return n.deprecatedDimension?W(e,`Apollion DS \u2014 font set. DEPRECATED alias of font.${n.textSize} (dimension=${n.deprecatedDimension} no longer scales type, ADR-030; removed at the next major). DTCG 2025.10.`,`Alias of font.${n.textSize} \u2014 dimension no longer scales type (ADR-030). Use font.<textSize>.`):W(e,`Apollion DS \u2014 font set. textSize=${n.textSize}. DTCG 2025.10.`)}i(jn,"renderFontSet");function Pn(e,n){let{modifiers:o}=n,t=[{name:"brand",values:[...o.brand],default:o.brand[0]},{name:"mode",values:[...o.mode],default:o.mode[0]},{name:"surface",values:[...o.surface],default:o.surface[0]},{name:"dimension",values:[...o.dimension],default:o.dimension[0]},{name:"textSize",values:[...o.textSize],default:at}],r=n.font.filter(c=>c.deprecatedDimension),a={name:"apollion-tokens",description:"Apollion DS token resolver \u2014 DTCG 2025.10. Compose the base set with the colour set for the chosen brand/mode/surface, the spacing set for the chosen dimension and the font set for the chosen textSize. NOTE: mode is a topology placeholder in this release (dark resolves identically to light until S6).",sets:[{name:n.base.name,source:n.base.file},...n.spacing.map(c=>({name:c.name,source:c.file})),...n.font.map(c=>({name:c.name,source:c.file})),...n.color.map(c=>({name:c.name,source:c.file}))],modifiers:t,$extensions:{"com.apollion.resolver":{composition:{always:[n.base.name],byModifier:{color:"${brand}.color.${mode}.${surface}",spacing:"spacing.${dimension}",font:"font.${textSize}"}},deprecatedSets:Object.fromEntries(r.map(c=>[c.name,`font.${c.textSize}`])),modeIsPlaceholder:!0}}};return`${JSON.stringify(a,null,2)}
|
|
13
|
+
`}i(Pn,"renderResolver");var de="tokens-studio",Me=i(e=>`${JSON.stringify(e,null,2)}
|
|
14
|
+
`,"json"),K=i(e=>`${Number(e.toFixed(4))}`,"num"),ct=i(e=>Math.round(Math.min(1,Math.max(0,e))*255).toString(16).padStart(2,"0"),"hexByte");function Fn(e){return e.alpha!==void 0&&e.alpha<1?`${e.hex}${ct(e.alpha)}`:e.hex}i(Fn,"color");function zn(e){return`${K(e.value)}${e.unit}`}i(zn,"dimension");function le(e){return e.unit==="px"?K(e.value):zn(e)}i(le,"shadowLength");function ut(e){let{shadow:n}=e;return{x:le(n.offsetX),y:le(n.offsetY),blur:le(n.blur),spread:le(n.spread),color:Fn(n.color),type:n.inset?"innerShadow":"dropShadow"}}i(ut,"shadow");var z=i((e,...n)=>n.some(o=>e===o||e.startsWith(`${o}.`)),"startsWith");function lt(e,n){switch(e.type){case"color":return"color";case"dimension":return z(n,"font.size")?"fontSizes":z(n,"border-width","border.width")?"borderWidth":z(n,"border.radius")?"borderRadius":z(n,"space","spacing")?"spacing":z(n,"breakpoint","container-size","layout")?"sizing":"dimension";case"fontFamily":return"fontFamilies";case"fontWeight":return"fontWeights";case"number":return z(n,"font.line-height")?"lineHeights":"number";case"shadow":return"boxShadow";default:return"other"}}i(lt,"tokensStudioType");function dt(e,n){switch(e.kind){case"ref":return`{${ae(e.path)}}`;case"color":return Fn(e);case"dimension":return zn(e);case"fontFamily":return e.family;case"fontWeight":return e.weight;case"number":return n==="lineHeights"?`${K(e.number*100)}%`:e.number;case"shadow":return ut(e);case"strokeStyle":return e.style;default:return e.raw}}i(dt,"tokensStudioValue");function pt(e){if(e.deprecated===void 0||e.deprecated===!1)return e.description;let n=typeof e.deprecated=="string"?`Deprecated: ${e.deprecated}`:"Deprecated.";return e.description?`${e.description} ${n}`:n}i(pt,"description");function ft(e,n){let o=lt(e,n),t={value:dt(e.value,o),type:o},r=pt(e);return r!==void 0&&(t.description=r),t}i(ft,"projectToken");function _n(e,n=""){let o={};for(let[t,r]of Object.entries(e)){let s=R(t),a=n?`${n}.${s}`:s;o[s]=y(r)?ft(r,a):_n(r,a)}return o}i(_n,"projectTokensStudioGroup");function mt(e){if(typeof e=="number")return`${K(e*100)}%`;let n=/^(-?[\d.]+)em$/.exec(e.trim());return n?`${K(Number(n[1])*100)}%`:e}i(mt,"letterSpacing");function gt(e){let n={};return e.letterSpacing&&(n["letter-spacing"]=Object.fromEntries(Object.entries(e.letterSpacing).map(([o,t])=>[R(o),{value:mt(t),type:"letterSpacing"}]))),e.textTransform&&(n["text-case"]=Object.fromEntries(Object.entries(e.textTransform).map(([o,t])=>[R(o),{value:t,type:"textCase"}]))),n}i(gt,"fontExtensionTokens");function U(e){let n=_n(e.groups),o=e.extensions["com.apollion.font"];return o&&n.font&&(n.font={...n.font,...gt(o)}),Me(n)}i(U,"renderTokensStudioSet");function Oe(e){return`color/${e.brand}/${e.mode}/${e.surface}`}i(Oe,"tokensStudioColorSetName");function Nn(e){return[{name:"base",group:"base",theme:"base"},...e.spacing.map(n=>({name:`spacing/${n.dimension}`,group:"dimension",theme:n.dimension})),...e.font.filter(n=>!n.deprecatedDimension).map(n=>({name:`font/${n.textSize}`,group:"textSize",theme:n.textSize})),...e.color.map(n=>({name:Oe(n),group:"color",theme:`${n.brand} / ${n.mode} / ${n.surface}`}))]}i(Nn,"planTokensStudioSets");function J(e){return`${de}/${e}.json`}i(J,"tokensStudioSetFile");function Bn(e){let n=Nn(e).map(o=>({id:o.name.replace(/\//g,"-"),name:o.theme,group:o.group,selectedTokenSets:{[o.name]:"enabled"}}));return Me(n)}i(Bn,"renderTokensStudioThemes");function Hn(e){return Me({tokenSetOrder:Nn(e).map(n=>n.name)})}i(Hn,"renderTokensStudioMetadata");var ht="// Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs.";function yt(e,n,o){let t=[];if(e.description!==void 0&&t.push(e.description),e.deprecated===!0?t.push("@deprecated"):typeof e.deprecated=="string"&&t.push(`@deprecated ${e.deprecated}`),t.length!==0){o.push(`${n}/**`);for(let r of t)o.push(`${n} * ${r.replace(/\*\//g,"*\\/")}`);o.push(`${n} */`)}}i(yt,"emitDoc");function Wn(e,n,o){let t=" ".repeat(n);for(let[r,s]of Object.entries(e))y(s)?(yt(s,t,o),o.push(`${t}${JSON.stringify(r)}: ${JSON.stringify(E(s.value))},`)):(o.push(`${t}${r}: {`),Wn(s,n+1,o),o.push(`${t}},`))}i(Wn,"emitGroup");function Kn(e){let{brand:n,mode:o,surface:t,dimension:r}=e.meta,s=[ht,`// Variant: brand=${n} mode=${o} surface=${t} dimension=${r}`,"","export const tokens = {"];return Wn(e.groups,1,s),s.push("} as const;","","export type Tokens = typeof tokens;",""),s.join(`
|
|
15
|
+
`)}i(Kn,"renderTs");var bt=["light","dark"],kt=["positive","negative"],Rt=["compact","normal","spacious"],St=["smaller","default","larger","largest"];function pe(e){let n=[...new Set(e.textSizes??St)];if(!n.includes("default"))throw new Error(`apollion-tokens: textSizes must include 'default' (got [${n.join(", ")}])`);return n}i(pe,"resolveTextSizes");function fe(e){let n=e.modes??bt,o=e.surfaces??kt,t=e.dimensions??Rt,r=Object.entries(e.brands).sort(([a],[c])=>a.localeCompare(c)),s=[];for(let[a,c]of r)for(let u of n)for(let p of o)for(let k of t)s.push({brand:a,colors:c,mode:u,surface:p,dimension:k});return s}i(fe,"expandVariants");function Un(e){return`${e.brand}.${e.mode}.${e.surface}.${e.dimension}`}i(Un,"variantName");import{createHash as It}from"node:crypto";function me(e){return It("sha256").update(e).digest("hex")}i(me,"sha256");function Ge(e){return me(Le(e))}i(Ge,"hashConfig");function Le(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Le).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Le(e[t])}`).join(",")}}`}i(Le,"stableStringify");function Jn(e){try{let{execSync:n}=To("node:child_process");return n("git rev-parse --short HEAD",{cwd:e,stdio:["ignore","pipe","ignore"],encoding:"utf8"}).trim()}catch{return""}}i(Jn,"detectGitCommit");function Xn(){return{node:process.version,platform:`${process.platform}-${process.arch}`}}i(Xn,"buildEnv");function qn(e){let n=[...e.files].sort((t,r)=>t.path.localeCompare(r.path)),o={configHash:e.configHash,files:n,gitCommit:e.gitCommit,buildEnv:e.buildEnv};return`${JSON.stringify(o,null,2)}
|
|
16
|
+
`}i(qn,"serializeManifest");import{DEFAULT_TEXT_SIZE as xt}from"@apollion-dsi/core/themes/text-size";var Tt="json/sets",Zn="json/resolver.json";function X(e){return`${Tt}/${e}.json`}i(X,"setFile");function wt(e,n,o){return`${e}.color.${n}.${o}`}i(wt,"colorSetName");function Dt(e){return`spacing.${e}`}i(Dt,"spacingSetName");function $t(e){return`font.${e}`}i($t,"fontSetName");function vt(e){return`font.${e}`}i(vt,"legacyFontSetName");function ge(e,n){e.includes(n)||e.push(n)}i(ge,"pushUnique");function Yn(e){let n=fe(e),o=[],t=[],r=[],s=[],a=new Set,c=[],u=new Set,p=[],k=[...pe(e)],x=k.map(l=>{let d=$t(l);return{kind:"font",name:d,file:X(d),textSize:l}});for(let l of n){ge(o,l.brand),ge(t,l.mode),ge(r,l.surface),ge(s,l.dimension);let d=wt(l.brand,l.mode,l.surface);a.has(d)||(a.add(d),c.push({kind:"color",name:d,file:X(d),brand:l.brand,mode:l.mode,surface:l.surface}));let g=Dt(l.dimension);u.has(g)||(u.add(g),p.push({kind:"spacing",name:g,file:X(g),dimension:l.dimension}))}for(let l of s){let d=vt(l);x.push({kind:"font",name:d,file:X(d),textSize:xt,deprecatedDimension:l})}return{base:{kind:"base",name:"base",file:X("base")},spacing:p,font:x,color:c,modifiers:{brand:o,mode:t,surface:r,dimension:s,textSize:k}}}i(Yn,"planSets");import{defaultInputColors as po,toDarkColors as Ht}from"@apollion-dsi/core/themes/colors";import{createFoundation as fo}from"@apollion-dsi/core/themes/foundation";import{createSemantic as Wt}from"@apollion-dsi/core/themes/semantic";import{defaultInputSpacing as Kt}from"@apollion-dsi/core/themes/spacing";import{invertForSurface as Ut}from"@apollion-dsi/core/themes/surface";import{converter as to,formatHex as L,interpolate as Ct,parse as I,wcagContrast as ro}from"culori";var Y=to("oklch"),Et=to("rgb");function f(e,n,o){let t=I(e),r=I(n);if(!t||!r)return e;let s=Ct([t,r],"oklch");return L(s(o))??e}i(f,"mixOklch");function Vt(e){return e?typeof e=="string"?e:e.base:"#000"}i(Vt,"coerceToHex");var he=1.3,At=.05,Qn=.04,V=i((e,n)=>{let o=I(e),t=I(n);return!o||!t?1:ro(o,t)},"contrastRatio"),q=i(e=>{let n=Y(I(e));return n?n.l??0:null},"oklchLightness"),Mt=4.5;function Z(e,n,o=Mt){let t=I(n),r=Y(I(e));if(!t||!r)return e;let s=V("#fff",n)>=V("#000",n)?.04:-.04;for(let a=0;a<25;a+=1){let c=L(r)??e,u=I(c);if(u&&ro(u,t)>=o)return c;let p=Math.min(1,Math.max(0,(r.l??0)+s));if(p===(r.l??0))break;r={...r,l:p}}return L(r)??e}i(Z,"readableColor");var eo=i((e,n)=>{if(V(e,n)>=he)return!0;let o=q(e),t=q(n);return o!==null&&t!==null&&Math.abs(o-t)>=At},"isPerceptibleState"),je=i(e=>e?V("#fff",e)>V("#000",e):!1,"isDarkSurface");function no(e,n,o){let t=Y(I(e));if(!t)return null;let r={...t,l:o??t.l??0},s=n?Qn:-Qn;for(let a=0;a<25;a+=1){let c=Math.min(1,Math.max(0,(r.l??0)+s));if(c===(r.l??0))break;r={...r,l:c};let u=L(r);if(u&&V(e,u)>=he)return u}return L(r)??null}i(no,"derivePerceptibleState");function oo(e,n,o){let t=no(e,n,o);if(t&&V(e,t)>=he)return t;let r=no(e,!n);return r&&V(e,r)>=he?r:t??r}i(oo,"perceptibleStateFor");function D(e,n){let o=typeof e=="object"&&e!==null?e:void 0,t=Vt(e),r=n.deepDark,s=n.deepLight,a={base:t,dark:f(t,r,.6),action:f(t,r,.2),active:f(t,s,.6),light:f(t,s,.9),onLight:t};if(I(t)){let c=je(n.baseLight),u=eo(t,a.action);if(u||(a.action=oo(t,c)??a.action),!eo(t,a.active)){let p=u?void 0:q(a.action)??void 0;a.active=oo(t,c,p)??a.active}}if(a.onLight=Z(a.action,a.light),o){let c=o.action??a.action,u=o.light??a.light;return{base:t,dark:o.dark??a.dark,action:c,active:o.active??a.active,light:u,onLight:o.onLight??Z(c,u)}}return a}i(D,"mountSingleColor");function io(e){let n=e.deepLight,o=e.deepDark;return{0:n,5:f(n,o,.05),10:f(n,o,.1),20:f(n,o,.2),30:f(n,o,.3),40:f(n,o,.4),50:f(n,o,.5),60:f(n,o,.6),70:f(n,o,.7),80:f(n,o,.8),90:f(n,o,.9),100:f(n,o,1)}}i(io,"mountGreyscaleColors");function so(e){let n=e.deepLight,o=e.deepDark,t=typeof e.primary=="object"&&e.primary?e.primary.base:e.primary,r=i(a=>1/17*(a-1),"interpolation"),s=f(t,o,.5);return{0:f(s,n,r(18)),5:f(s,n,r(17.5)),10:f(s,n,r(17)),20:f(s,n,r(16)),30:f(s,n,r(15)),40:f(s,n,r(14)),50:f(s,n,r(13)),60:f(s,n,r(12)),70:f(s,n,r(11)),80:f(s,n,r(10)),90:f(s,n,r(9)),100:f(s,n,r(8)),110:f(s,n,r(7)),120:f(s,n,r(6)),130:f(s,n,r(5)),140:f(s,n,r(4)),150:f(s,n,r(3)),160:f(s,n,r(2)),170:s,180:f(s,o,.25)}}i(so,"mountNeutralColors");function _(e,n){let o=Y(I(e));if(!o)return e;let t=Math.min(1,Math.max(0,(o.l??0)+n));return L({...o,l:t})??e}i(_,"shiftLightness");function ye(e,n){let o=Y(I(e));if(!o)return e;let t=o.l??0,r=n.min??0,s=n.max??1;return t>=r&&t<=s?e:L({...o,l:Math.min(s,Math.max(r,t))})??e}i(ye,"clampLightness");function G(e,n){let o=Et(I(e));if(!o)return e;let t=Math.min(1,Math.max(0,n)),r=i(s=>Math.round((s??0)*255),"channel");return`rgba(${r(o.r)}, ${r(o.g)}, ${r(o.b)}, ${t})`}i(G,"toRgbaString");import{apcaContrast as be,DARK_BOOST_TAPER_MAX_L as Pe,DARK_ELEVATION_BOOST as Ot,EDGE_ALPHA as Fe,HALATION_FLOORS as ke,INK_APCA_MIN as ze,INK_MIX as _e,LADDER_DELTAS as ao,MIN_CONTRAST_AA as co,WASH_ALPHA as Lt}from"@apollion-dsi/core/themes/colors";var Gt="#FFFFFF",Ne="#000000";function jt(e){return je(e.baseLight)?"dark":"light"}i(jt,"resolvePolarity");function Pt(e){let n=ke.CANVAS_MIN_L;return e<=n?1:e>=Pe?0:(Pe-e)/(Pe-n)}i(Pt,"darkElevationBoostFactor");function uo(e,n,o){if(Math.abs(be(e,n))>=o)return e;let t=Math.abs(be("#ffffff",n))>=Math.abs(be("#000000",n)),r=e;for(let s=0;s<40;s+=1){let a=_(r,t?.02:-.02);if(a===r||(r=a,Math.abs(be(r,n))>=o))break}return r}i(uo,"ensureApca");function Ft(e,n){let o=e.baseLight??Gt,t=n==="dark",r=t?ye(o,{min:ke.CANVAS_MIN_L}):o,s=_(r,ao.sunken),a=t?Pt(q(r)??0):0,c=i(u=>ao[u]+a*Ot[u],"delta");return{canvas:r,sunken:t?ye(s,{min:ke.CANVAS_MIN_L}):s,paper:_(r,c("paper")),raised:_(r,c("raised")),overlay:_(r,c("overlay")),scrim:t?e.deepLight??Ne:e.neutral?.["180"]??e.baseDark??Ne}}i(Ft,"deriveSurface");function zt(e,n){let o=e.baseDark??Ne,t=ye(uo(Z(o,n.paper,co),n.paper,ze.primary),{max:ke.INK_MAX_L}),r=i((s,a)=>uo(Z(f(t,n.canvas,s),n.paper,co),n.paper,a),"tier");return{primary:t,secondary:r(_e.secondary,ze.secondary),muted:r(_e.muted,ze.muted),disabled:f(t,n.canvas,_e.disabled)}}i(zt,"deriveInk");function _t(e){return{hairline:G(e.primary,Fe.hairline),border:G(e.primary,Fe.border),strong:G(e.primary,Fe.strong)}}i(_t,"deriveEdge");function Nt(e,n){let o=Lt[n];return{hover:G(e.primary,o.hover),pressed:G(e.primary,o.pressed),selected:G(e.primary,o.selected)}}i(Nt,"deriveWash");function Bt(e,n){return n?{surface:{...e.surface,...n.surface},ink:{...e.ink,...n.ink},edge:{...e.edge,...n.edge},wash:{...e.wash,...n.wash}}:e}i(Bt,"applyOverride");function lo(e,n){let o=jt(e),t=Ft(e,o),r=zt(e,t),s={surface:t,ink:r,edge:_t(r),wash:Nt(r,o)};return Bt(s,n?.[o])}i(lo,"resolveSurfaceLadder");function Jt(e){let n=so(e);return{baseDark:e.baseDark,baseLight:e.baseLight,deepDark:e.deepDark,deepLight:e.deepLight,transparent:e.transparent??"transparent",neutral:n,grayscale:io(e),...lo({...e,neutral:n},e.ladder),main:D(e.main,e),opposite:D(e.opposite,e),complementary:D(e.complementary,e),danger:D(e.danger,e),information:D(e.information,e),success:D(e.success,e),warning:D(e.warning,e),primary:D(e.primary,e),secondary:D(e.secondary,e),tertiary:D(e.tertiary,e)}}i(Jt,"composeColors");function Xt(e){return{...e,baseLight:e.baseLight??po.baseLight,baseDark:e.baseDark??po.baseDark}}i(Xt,"withContrastDefaults");function A(e,n=Kt){let o=Xt(e.colors),t=e.mode==="dark"?Ht(o):o,r=Jt(t),s=te(n,e.dimension),a=Wt({colors:r,spacing:s}),c=fo(a);return e.surface==="negative"&&(c=fo(Ut({semantic:a,colors:r},"negative").semantic)),{foundation:c,colors:r}}i(A,"buildVariantThemes");async function ko(e){let{config:n,outDir:o,cwd:t=process.cwd(),verbose:r=!1}=e,s=fe(n),a=n.output??{};if(s.length===0)throw new Error("apollion-tokens build: no variants (config.brands is empty)");let c=await qt(Q(Yt(),"apollion-tokens-"));try{let u=[],p=i(async(l,d)=>{await er(c,l,d),u.push({path:l,sha256:me(d)}),r&&console.log(` \u2713 ${l}`)},"emit");if(a.json||a.tokensStudio){let l=Yn(n),d=Qt(l,s);if(mn([d.base,...d.spacing,...d.font,...d.color]),a.json){await p(l.base.file,On(d.base));for(let[g,m]of l.spacing.entries())await p(m.file,Gn(d.spacing[g],m.dimension));for(let[g,m]of l.font.entries())await p(m.file,jn(d.font[g],m));for(let[g,m]of l.color.entries())await p(m.file,Ln(d.color[g],m.brand,m.mode,m.surface));await p(Zn,Pn(n,l))}if(a.tokensStudio){await p(J("base"),U(d.base));for(let[g,m]of l.spacing.entries())await p(J(`spacing/${m.dimension}`),U(d.spacing[g]));for(let[g,m]of l.font.entries())m.deprecatedDimension||await p(J(`font/${m.textSize}`),U(d.font[g]));for(let[g,m]of l.color.entries())await p(J(Oe(m)),U(d.color[g]));await p(`${de}/$themes.json`,Bn(l)),await p(`${de}/$metadata.json`,Hn(l))}}if(a.css||a.ts)for(let l of s){let{foundation:d,colors:g}=A(l),m=F(d,g,l),$=Un(l);a.css&&await p(`css/${$}.css`,Cn(m,{rgbCompanions:a.tailwind})),a.ts&&await p(`ts/${$}.d.ts`,Kn(m))}if(a.css||a.cssModes){let l=pe(n).map(d=>[d,De(d)]);await p("css/font.css",Vn(l))}if(a.cssModes){let l=new Map;for(let d of s){let g=`${d.brand}.${d.surface}.${d.dimension}`,m=l.get(g)??{};m[d.mode]=d,l.set(g,m)}for(let[d,{light:g,dark:m}]of l){if(!g||!m)throw new Error(`apollion-tokens build: output.cssModes needs both modes for ${d} (config.modes)`);let $=A(g),ee=A(m),Se=En(F($.foundation,$.colors,g),F(ee.foundation,ee.colors,m),{rgbCompanions:a.tailwind});await p(`css/${d}.modes.css`,Se)}}if(a.tailwind){let l=s[0],{foundation:d,colors:g}=A(l),m=F(d,g,l);await p("tailwind/preset.mjs",$n(m)),await p("tailwind/tw-merge.mjs",vn(m))}if(a.designMd){let l=[...new Set(s.map(d=>d.brand))];for(let d of l){let m=s.filter($=>$.brand===d).map($=>{let{foundation:ee,colors:Se}=A($);return F(ee,Se,$)});await p(`design/${d}.design.md`,An(d,m))}}let k={configHash:Ge(n),files:u,gitCommit:Jn(t),buildEnv:Xn()},x=qn(k);return await yo(Q(c,"manifest.json"),x),await go(o,{recursive:!0,force:!0}),await ho(bo(o),{recursive:!0}),await Zt(c,o),r&&console.log(`\u2713 ${u.length} files \u2192 ${o}`),{manifest:k,outDir:o}}catch(u){throw await go(c,{recursive:!0,force:!0}).catch(()=>{}),u}}i(ko,"build");async function Ro(e){let{config:n,outDir:o}=e,t;try{t=JSON.parse(await mo(Q(o,"manifest.json"),"utf8"))}catch{return!1}if(t.configHash!==Ge(n))return!1;for(let r of t.files){let s;try{s=await mo(Q(o,r.path))}catch{return!1}if(me(s)!==r.sha256)return!1}return!0}i(Ro,"check");function Qt(e,n){let o=e.spacing.map(s=>{let a=n.find(c=>c.dimension===s.dimension);return xn(A(a).foundation,s.dimension)}),t=e.font.map(s=>De(s.textSize)),r=e.color.map(s=>{let a=n.find(p=>p.brand===s.brand&&p.mode===s.mode&&p.surface===s.surface),{foundation:c,colors:u}=A(a);return In(c,u)});return{base:Sn(),spacing:o,font:t,color:r}}i(Qt,"buildSetSlices");async function er(e,n,o){let t=Q(e,n);await ho(bo(t),{recursive:!0}),await yo(t,o)}i(er,"writeAt");import{readFile as or}from"node:fs/promises";import{resolve as tr}from"node:path";import{createContext as rr,Script as ir}from"node:vm";import{z as h}from"zod";var T=h.string().regex(/^#([0-9a-fA-F]{3}){1,2}$|^transparent$|^rgb\(.*\)$|^oklch\(.*\)$/,{message:'Must be hex, rgb(), oklch(), or "transparent"'}),nr=h.object({baseDark:h.string().optional(),baseLight:h.string().optional(),deepDark:T,deepLight:T,transparent:h.string().optional(),main:T.optional(),opposite:T.optional(),complementary:T.optional(),information:T.optional(),success:T.optional(),danger:T.optional(),warning:T.optional(),primary:T.optional(),secondary:T.optional(),tertiary:T.optional()}).passthrough(),So=h.object({brands:h.record(h.string(),nr).refine(e=>Object.keys(e).length>0,{message:"apollion.config.mjs: brands must contain at least 1 entry"}),modes:h.array(h.enum(["light","dark"])).optional(),surfaces:h.array(h.enum(["positive","negative"])).optional(),dimensions:h.array(h.enum(["compact","normal","spacious"])).optional(),textSizes:h.array(h.enum(["smaller","default","larger","largest"])).refine(e=>e.includes("default"),{message:"apollion.config.mjs: textSizes must include 'default'"}).refine(e=>new Set(e).size===e.length,{message:"apollion.config.mjs: textSizes must not repeat a level"}).optional(),output:h.object({runtime:h.boolean().optional(),css:h.boolean().optional(),json:h.boolean().optional(),ts:h.boolean().optional(),designMd:h.boolean().optional(),tailwind:h.boolean().optional(),cssModes:h.boolean().optional(),tokensStudio:h.boolean().optional()}).passthrough().optional()}).passthrough();var sr=[/\brequire\s*\(/,/\bimport\s*\(/,/^\s*import\s+/m],ar=1e3;var Be=class Be extends Error{constructor(o,t){super(o);this.configPath=t;this.name="ConfigLoadError"}};i(Be,"ConfigLoadError");var j=Be;async function Io(e){let n=tr(e.configPath),o=await or(n,"utf8");for(let u of sr)if(u.test(o))throw new j(`apollion.config: dynamic require/import not allowed (matched ${u}). Declarative config only \u2014 see ADR-006 \xA73.8 B3.`,n);let t=o.replace(/(^|\n)\s*export\s+default\s+/,(u,p)=>`${p}__apollion_config_export = `);if(t===o)throw new j("apollion.config: missing `export default <object>;` \u2014 config must export a default object literal.",n);let r={__apollion_config_export:void 0,console:cr(),Symbol,Number,String,Boolean,Array,Object,JSON,Math,defineConfig:i(u=>u,"defineConfig")},s=rr(r);try{new ir(t,{filename:n}).runInContext(s,{timeout:ar})}catch(u){throw new j(`apollion.config: evaluation failed \u2014 ${u instanceof Error?u.message:String(u)}`,n)}let a=r.__apollion_config_export;if(a===void 0)throw new j("apollion.config: `export default` produced undefined.",n);let c=So.safeParse(a);if(!c.success){let u=c.error.issues.map(p=>` ${p.path.join(".")||"(root)"}: ${p.message}`).join(`
|
|
17
|
+
`);throw new j(`apollion.config: schema validation failed \u2014
|
|
18
|
+
${u}`,n)}return c.data}i(Io,"loadConfig");function cr(){return{log:i((...e)=>console.log("[apollion.config]",...e),"log"),warn:i((...e)=>console.warn("[apollion.config]",...e),"warn"),error:i((...e)=>console.error("[apollion.config]",...e),"error")}}i(cr,"makeReadOnlyConsole");function lr(e){let n=e.slice(2),o=n[0];o!=="build"&&Re(`Unknown command "${o??""}". Usage: apollion-tokens build [--check] [--verbose] --config <path> [--out <dir>]`);let t="apollion.config.mjs",r="dist",s=!1,a=!1;for(let c=1;c<n.length;c++){let u=n[c];switch(u){case"--config":t=n[++c]??Re("--config needs a path");break;case"--out":r=n[++c]??Re("--out needs a path");break;case"--check":s=!0;break;case"--verbose":a=!0;break;default:Re(`Unknown flag "${u}"`)}}return{command:o,configPath:t,outDir:r,check:s,verbose:a}}i(lr,"parseArgs");function Re(e){console.error(`apollion-tokens: ${e}`),process.exit(2)}i(Re,"fail");async function dr(e){let n=He(e);if(n.endsWith(".json")){let o=await ur(n,"utf8");return JSON.parse(o)}return Io({configPath:n})}i(dr,"loadConfigFromPath");async function pr(){let e=lr(process.argv),n=await dr(e.configPath);if(e.check){await Ro({config:n,outDir:He(e.outDir)})||(console.error("apollion-tokens: dist/ is stale, missing, or has drifted from its manifest. Re-run `apollion-tokens build` without --check."),process.exit(1)),console.log("apollion-tokens: dist/ is up-to-date with config.");return}let{manifest:o}=await ko({config:n,outDir:He(e.outDir),verbose:e.verbose});console.log(`apollion-tokens: wrote ${o.files.length} file(s) \u2014 configHash=${o.configHash.slice(0,12)}\u2026`)}i(pr,"main");pr().catch(e=>{console.error(`apollion-tokens: ${e instanceof Error?e.message:String(e)}`),process.exit(1)});
|
package/lib/config-loader.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var f=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var r=(o,e)=>f(o,"name",{value:e,configurable:!0});var _=(o,e)=>{for(var a in e)f(o,a,{get:e[a],enumerable:!0})},
|
|
1
|
+
"use strict";var f=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var r=(o,e)=>f(o,"name",{value:e,configurable:!0});var _=(o,e)=>{for(var a in e)f(o,a,{get:e[a],enumerable:!0})},k=(o,e,a,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of C(e))!S.call(o,s)&&s!==a&&f(o,s,{get:()=>e[s],enumerable:!(p=y(e,s))||p.enumerable});return o};var j=o=>k(f({},"__esModule",{value:!0}),o);var T={};_(T,{ConfigLoadError:()=>l,defineConfig:()=>P,loadConfig:()=>z});module.exports=j(T);var b=require("node:fs/promises"),x=require("node:path"),g=require("node:vm");var n=require("zod"),i=n.z.string().regex(/^#([0-9a-fA-F]{3}){1,2}$|^transparent$|^rgb\(.*\)$|^oklch\(.*\)$/,{message:'Must be hex, rgb(), oklch(), or "transparent"'}),A=n.z.object({baseDark:n.z.string().optional(),baseLight:n.z.string().optional(),deepDark:i,deepLight:i,transparent:n.z.string().optional(),main:i.optional(),opposite:i.optional(),complementary:i.optional(),information:i.optional(),success:i.optional(),danger:i.optional(),warning:i.optional(),primary:i.optional(),secondary:i.optional(),tertiary:i.optional()}).passthrough(),h=n.z.object({brands:n.z.record(n.z.string(),A).refine(o=>Object.keys(o).length>0,{message:"apollion.config.mjs: brands must contain at least 1 entry"}),modes:n.z.array(n.z.enum(["light","dark"])).optional(),surfaces:n.z.array(n.z.enum(["positive","negative"])).optional(),dimensions:n.z.array(n.z.enum(["compact","normal","spacious"])).optional(),textSizes:n.z.array(n.z.enum(["smaller","default","larger","largest"])).refine(o=>o.includes("default"),{message:"apollion.config.mjs: textSizes must include 'default'"}).refine(o=>new Set(o).size===o.length,{message:"apollion.config.mjs: textSizes must not repeat a level"}).optional(),output:n.z.object({runtime:n.z.boolean().optional(),css:n.z.boolean().optional(),json:n.z.boolean().optional(),ts:n.z.boolean().optional(),designMd:n.z.boolean().optional(),tailwind:n.z.boolean().optional(),cssModes:n.z.boolean().optional(),tokensStudio:n.z.boolean().optional()}).passthrough().optional()}).passthrough();var $=[/\brequire\s*\(/,/\bimport\s*\(/,/^\s*import\s+/m],O=1e3;function P(o){return o}r(P,"defineConfig");var u=class u extends Error{constructor(a,p){super(a);this.configPath=p;this.name="ConfigLoadError"}};r(u,"ConfigLoadError");var l=u;async function z(o){let e=(0,x.resolve)(o.configPath),a=await(0,b.readFile)(e,"utf8");for(let t of $)if(t.test(a))throw new l(`apollion.config: dynamic require/import not allowed (matched ${t}). Declarative config only \u2014 see ADR-006 \xA73.8 B3.`,e);let p=a.replace(/(^|\n)\s*export\s+default\s+/,(t,c)=>`${c}__apollion_config_export = `);if(p===a)throw new l("apollion.config: missing `export default <object>;` \u2014 config must export a default object literal.",e);let s={__apollion_config_export:void 0,console:D(),Symbol,Number,String,Boolean,Array,Object,JSON,Math,defineConfig:r(t=>t,"defineConfig")},w=(0,g.createContext)(s);try{new g.Script(p,{filename:e}).runInContext(w,{timeout:O})}catch(t){throw new l(`apollion.config: evaluation failed \u2014 ${t instanceof Error?t.message:String(t)}`,e)}let d=s.__apollion_config_export;if(d===void 0)throw new l("apollion.config: `export default` produced undefined.",e);let m=h.safeParse(d);if(!m.success){let t=m.error.issues.map(c=>` ${c.path.join(".")||"(root)"}: ${c.message}`).join(`
|
|
2
2
|
`);throw new l(`apollion.config: schema validation failed \u2014
|
|
3
3
|
${t}`,e)}return m.data}r(z,"loadConfig");function D(){return{log:r((...o)=>console.log("[apollion.config]",...o),"log"),warn:r((...o)=>console.warn("[apollion.config]",...o),"warn"),error:r((...o)=>console.error("[apollion.config]",...o),"error")}}r(D,"makeReadOnlyConsole");0&&(module.exports={ConfigLoadError,defineConfig,loadConfig});
|
package/lib/config-loader.esm.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var h=Object.defineProperty;var a=(n,i)=>h(n,"name",{value:i,configurable:!0});import{readFile as x}from"node:fs/promises";import{resolve as w}from"node:path";import{createContext as y,Script as C}from"node:vm";import{z as o}from"zod";var t=o.string().regex(/^#([0-9a-fA-F]{3}){1,2}$|^transparent$|^rgb\(.*\)$|^oklch\(.*\)$/,{message:'Must be hex, rgb(), oklch(), or "transparent"'}),b=o.object({baseDark:o.string().optional(),baseLight:o.string().optional(),deepDark:t,deepLight:t,transparent:o.string().optional(),main:t.optional(),opposite:t.optional(),complementary:t.optional(),information:t.optional(),success:t.optional(),danger:t.optional(),warning:t.optional(),primary:t.optional(),secondary:t.optional(),tertiary:t.optional()}).passthrough(),u=o.object({brands:o.record(o.string(),b).refine(n=>Object.keys(n).length>0,{message:"apollion.config.mjs: brands must contain at least 1 entry"}),modes:o.array(o.enum(["light","dark"])).optional(),surfaces:o.array(o.enum(["positive","negative"])).optional(),dimensions:o.array(o.enum(["compact","normal","spacious"])).optional(),textSizes:o.array(o.enum(["smaller","default","larger","largest"])).refine(n=>n.includes("default"),{message:"apollion.config.mjs: textSizes must include 'default'"}).refine(n=>new Set(n).size===n.length,{message:"apollion.config.mjs: textSizes must not repeat a level"}).optional(),output:o.object({runtime:o.boolean().optional(),css:o.boolean().optional(),json:o.boolean().optional(),ts:o.boolean().optional(),designMd:o.boolean().optional(),tailwind:o.boolean().optional(),cssModes:o.boolean().optional()}).passthrough().optional()}).passthrough();var S=[/\brequire\s*\(/,/\bimport\s*\(/,/^\s*import\s+/m],_=1e3;function T(n){return n}a(T,"defineConfig");var f=class f extends Error{constructor(s,p){super(s);this.configPath=p;this.name="ConfigLoadError"}};a(f,"ConfigLoadError");var r=f;async function v(n){let i=w(n.configPath),s=await x(i,"utf8");for(let e of S)if(e.test(s))throw new r(`apollion.config: dynamic require/import not allowed (matched ${e}). Declarative config only \u2014 see ADR-006 \xA73.8 B3.`,i);let p=s.replace(/(^|\n)\s*export\s+default\s+/,(e,l)=>`${l}__apollion_config_export = `);if(p===s)throw new r("apollion.config: missing `export default <object>;` \u2014 config must export a default object literal.",i);let g={__apollion_config_export:void 0,console:
|
|
1
|
+
var h=Object.defineProperty;var a=(n,i)=>h(n,"name",{value:i,configurable:!0});import{readFile as x}from"node:fs/promises";import{resolve as w}from"node:path";import{createContext as y,Script as C}from"node:vm";import{z as o}from"zod";var t=o.string().regex(/^#([0-9a-fA-F]{3}){1,2}$|^transparent$|^rgb\(.*\)$|^oklch\(.*\)$/,{message:'Must be hex, rgb(), oklch(), or "transparent"'}),b=o.object({baseDark:o.string().optional(),baseLight:o.string().optional(),deepDark:t,deepLight:t,transparent:o.string().optional(),main:t.optional(),opposite:t.optional(),complementary:t.optional(),information:t.optional(),success:t.optional(),danger:t.optional(),warning:t.optional(),primary:t.optional(),secondary:t.optional(),tertiary:t.optional()}).passthrough(),u=o.object({brands:o.record(o.string(),b).refine(n=>Object.keys(n).length>0,{message:"apollion.config.mjs: brands must contain at least 1 entry"}),modes:o.array(o.enum(["light","dark"])).optional(),surfaces:o.array(o.enum(["positive","negative"])).optional(),dimensions:o.array(o.enum(["compact","normal","spacious"])).optional(),textSizes:o.array(o.enum(["smaller","default","larger","largest"])).refine(n=>n.includes("default"),{message:"apollion.config.mjs: textSizes must include 'default'"}).refine(n=>new Set(n).size===n.length,{message:"apollion.config.mjs: textSizes must not repeat a level"}).optional(),output:o.object({runtime:o.boolean().optional(),css:o.boolean().optional(),json:o.boolean().optional(),ts:o.boolean().optional(),designMd:o.boolean().optional(),tailwind:o.boolean().optional(),cssModes:o.boolean().optional(),tokensStudio:o.boolean().optional()}).passthrough().optional()}).passthrough();var S=[/\brequire\s*\(/,/\bimport\s*\(/,/^\s*import\s+/m],_=1e3;function T(n){return n}a(T,"defineConfig");var f=class f extends Error{constructor(s,p){super(s);this.configPath=p;this.name="ConfigLoadError"}};a(f,"ConfigLoadError");var r=f;async function v(n){let i=w(n.configPath),s=await x(i,"utf8");for(let e of S)if(e.test(s))throw new r(`apollion.config: dynamic require/import not allowed (matched ${e}). Declarative config only \u2014 see ADR-006 \xA73.8 B3.`,i);let p=s.replace(/(^|\n)\s*export\s+default\s+/,(e,l)=>`${l}__apollion_config_export = `);if(p===s)throw new r("apollion.config: missing `export default <object>;` \u2014 config must export a default object literal.",i);let g={__apollion_config_export:void 0,console:k(),Symbol,Number,String,Boolean,Array,Object,JSON,Math,defineConfig:a(e=>e,"defineConfig")},d=y(g);try{new C(p,{filename:i}).runInContext(d,{timeout:_})}catch(e){throw new r(`apollion.config: evaluation failed \u2014 ${e instanceof Error?e.message:String(e)}`,i)}let m=g.__apollion_config_export;if(m===void 0)throw new r("apollion.config: `export default` produced undefined.",i);let c=u.safeParse(m);if(!c.success){let e=c.error.issues.map(l=>` ${l.path.join(".")||"(root)"}: ${l.message}`).join(`
|
|
2
2
|
`);throw new r(`apollion.config: schema validation failed \u2014
|
|
3
|
-
${e}`,i)}return c.data}a(v,"loadConfig");function
|
|
3
|
+
${e}`,i)}return c.data}a(v,"loadConfig");function k(){return{log:a((...n)=>console.log("[apollion.config]",...n),"log"),warn:a((...n)=>console.warn("[apollion.config]",...n),"warn"),error:a((...n)=>console.error("[apollion.config]",...n),"error")}}a(k,"makeReadOnlyConsole");export{r as ConfigLoadError,T as defineConfig,v as loadConfig};
|
package/package.json
CHANGED
package/src/build.ts
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
* Hard cutover from the old per-variant JSON (pre-4.0 GA — no consumer reads
|
|
15
15
|
* `dist/json/*` yet). One manifest + O(b·m·s + 2·d + 1) sets, not b·m·s·d docs.
|
|
16
16
|
* - `dist/css/` + `dist/ts/` — per-variant, fully resolved (unchanged).
|
|
17
|
+
* - `dist/tokens-studio/` — the same sets in the Tokens Studio for Figma dialect
|
|
18
|
+
* + `$themes.json`/`$metadata.json` (`output.tokensStudio`, APOLLION-FIGMA-EXPORT).
|
|
17
19
|
*
|
|
18
20
|
* **Idempotency contract:** rerunning with the same `(config, gitHead,
|
|
19
21
|
* nodeVersion, platform)` produces byte-identical `dist/` + `manifest.json`.
|
|
@@ -38,13 +40,21 @@ import { renderCss, renderCssModes, renderCssTextSize } from './renderers/css';
|
|
|
38
40
|
import { renderDesignMd } from './renderers/design-md';
|
|
39
41
|
import { renderBaseSet, renderColorSet, renderFontSet, renderResolver, renderSpacingSet } from './renderers/resolver';
|
|
40
42
|
import { renderTailwindPreset, renderTwMergeExtension } from './renderers/tailwind';
|
|
43
|
+
import {
|
|
44
|
+
renderTokensStudioMetadata,
|
|
45
|
+
renderTokensStudioSet,
|
|
46
|
+
renderTokensStudioThemes,
|
|
47
|
+
TOKENS_STUDIO_DIR,
|
|
48
|
+
tokensStudioColorSetName,
|
|
49
|
+
tokensStudioSetFile,
|
|
50
|
+
} from './renderers/tokens-studio';
|
|
41
51
|
import { renderTs } from './renderers/ts';
|
|
42
52
|
import type { ApollionConfig, Variant } from './config-schema';
|
|
43
53
|
import { expandVariants, resolveTextSizes, variantName } from './config-schema';
|
|
44
|
-
import type { IRSlice } from './ir';
|
|
45
54
|
import { assertSlicesMetaComplete, buildBaseIR, buildColorIR, buildFontIR, buildFullIR, buildSpacingIR } from './ir';
|
|
46
55
|
import type { BuildManifest, ManifestFileEntry } from './manifest';
|
|
47
56
|
import { buildEnv, detectGitCommit, hashConfig, serializeManifest, sha256 } from './manifest';
|
|
57
|
+
import type { SetPlan } from './set-plan';
|
|
48
58
|
import { planSets, RESOLVER_PATH } from './set-plan';
|
|
49
59
|
import { buildVariantThemes } from './theme-factory';
|
|
50
60
|
|
|
@@ -86,46 +96,44 @@ export async function build(opts: BuildOptions): Promise<BuildResult> {
|
|
|
86
96
|
// by text-size level (ADR-030).
|
|
87
97
|
// bg/text are dimension-invariant and spacing is brand/surface-invariant, so
|
|
88
98
|
// a single representative variant resolves each set's foundation.
|
|
89
|
-
|
|
99
|
+
// The Tokens Studio tree (APOLLION-FIGMA-EXPORT) projects the same slices.
|
|
100
|
+
if (output.json || output.tokensStudio) {
|
|
90
101
|
const plan = planSets(config);
|
|
91
|
-
const
|
|
102
|
+
const sets = buildSetSlices(plan, variants);
|
|
92
103
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
for (const set of plan.spacing) {
|
|
98
|
-
const variant = variants.find((v) => v.dimension === set.dimension)!;
|
|
99
|
-
const { foundation } = buildVariantThemes(variant);
|
|
100
|
-
const slice = buildSpacingIR(foundation, set.dimension);
|
|
101
|
-
slices.push(slice);
|
|
102
|
-
await emit(set.file, renderSpacingSet(slice, set.dimension));
|
|
103
|
-
}
|
|
104
|
+
// Stale-key guard runs over the UNION of every emitted set (a single set
|
|
105
|
+
// is intentionally partial). Throws → atomic build aborts, dist untouched.
|
|
106
|
+
assertSlicesMetaComplete([sets.base, ...sets.spacing, ...sets.font, ...sets.color]);
|
|
104
107
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
if (output.json) {
|
|
109
|
+
await emit(plan.base.file, renderBaseSet(sets.base));
|
|
110
|
+
for (const [index, set] of plan.spacing.entries()) {
|
|
111
|
+
await emit(set.file, renderSpacingSet(sets.spacing[index], set.dimension));
|
|
112
|
+
}
|
|
113
|
+
for (const [index, set] of plan.font.entries()) {
|
|
114
|
+
await emit(set.file, renderFontSet(sets.font[index], set));
|
|
115
|
+
}
|
|
116
|
+
for (const [index, set] of plan.color.entries()) {
|
|
117
|
+
await emit(set.file, renderColorSet(sets.color[index], set.brand, set.mode, set.surface));
|
|
118
|
+
}
|
|
119
|
+
await emit(RESOLVER_PATH, renderResolver(config, plan));
|
|
112
120
|
}
|
|
113
121
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
+
if (output.tokensStudio) {
|
|
123
|
+
await emit(tokensStudioSetFile('base'), renderTokensStudioSet(sets.base));
|
|
124
|
+
for (const [index, set] of plan.spacing.entries()) {
|
|
125
|
+
await emit(tokensStudioSetFile(`spacing/${set.dimension}`), renderTokensStudioSet(sets.spacing[index]));
|
|
126
|
+
}
|
|
127
|
+
for (const [index, set] of plan.font.entries()) {
|
|
128
|
+
if (set.deprecatedDimension) continue;
|
|
129
|
+
await emit(tokensStudioSetFile(`font/${set.textSize}`), renderTokensStudioSet(sets.font[index]));
|
|
130
|
+
}
|
|
131
|
+
for (const [index, set] of plan.color.entries()) {
|
|
132
|
+
await emit(tokensStudioSetFile(tokensStudioColorSetName(set)), renderTokensStudioSet(sets.color[index]));
|
|
133
|
+
}
|
|
134
|
+
await emit(`${TOKENS_STUDIO_DIR}/$themes.json`, renderTokensStudioThemes(plan));
|
|
135
|
+
await emit(`${TOKENS_STUDIO_DIR}/$metadata.json`, renderTokensStudioMetadata(plan));
|
|
122
136
|
}
|
|
123
|
-
|
|
124
|
-
// Stale-key guard runs over the UNION of every emitted set (a single set
|
|
125
|
-
// is intentionally partial). Throws → atomic build aborts, dist untouched.
|
|
126
|
-
assertSlicesMetaComplete(slices);
|
|
127
|
-
|
|
128
|
-
await emit(RESOLVER_PATH, renderResolver(config, plan));
|
|
129
137
|
}
|
|
130
138
|
|
|
131
139
|
// ── CSS + TS surfaces: per-variant, fully resolved (unchanged) ───────────
|
|
@@ -256,6 +264,27 @@ export async function check(opts: { config: ApollionConfig; outDir: string }): P
|
|
|
256
264
|
return true;
|
|
257
265
|
}
|
|
258
266
|
|
|
267
|
+
/**
|
|
268
|
+
* One IR slice per planned Resolver set, index-aligned with `plan`. bg/text are
|
|
269
|
+
* dimension-invariant and spacing is brand/surface-invariant, so a single
|
|
270
|
+
* representative variant resolves each set's foundation. Font sets are keyed by
|
|
271
|
+
* text-size level (ADR-030) and need only the level; the deprecated
|
|
272
|
+
* `font.<dimension>` aliases carry `textSize: 'default'`.
|
|
273
|
+
*/
|
|
274
|
+
function buildSetSlices(plan: SetPlan, variants: Variant[]) {
|
|
275
|
+
const spacing = plan.spacing.map((set) => {
|
|
276
|
+
const variant = variants.find((v) => v.dimension === set.dimension)!;
|
|
277
|
+
return buildSpacingIR(buildVariantThemes(variant).foundation, set.dimension);
|
|
278
|
+
});
|
|
279
|
+
const font = plan.font.map((set) => buildFontIR(set.textSize));
|
|
280
|
+
const color = plan.color.map((set) => {
|
|
281
|
+
const variant = variants.find((v) => v.brand === set.brand && v.mode === set.mode && v.surface === set.surface)!;
|
|
282
|
+
const { foundation, colors } = buildVariantThemes(variant);
|
|
283
|
+
return buildColorIR(foundation, colors);
|
|
284
|
+
});
|
|
285
|
+
return { base: buildBaseIR(), spacing, font, color };
|
|
286
|
+
}
|
|
287
|
+
|
|
259
288
|
async function writeAt(root: string, relativePath: string, content: string): Promise<void> {
|
|
260
289
|
const full = join(root, relativePath);
|
|
261
290
|
await mkdir(dirname(full), { recursive: true });
|
package/src/config-schema.ts
CHANGED
|
@@ -51,6 +51,12 @@ export interface ApollionOutputFlags {
|
|
|
51
51
|
* way the core mode engine scopes them (ADR-024). Requires `modes` to include
|
|
52
52
|
* both `light` and `dark`. See `renderers/css.ts` (`renderCssModes`). */
|
|
53
53
|
cssModes?: boolean;
|
|
54
|
+
/** `dist/tokens-studio/` — the Resolver sets in the Tokens Studio for Figma
|
|
55
|
+
* dialect (`base`, `spacing/<dimension>`, `font/<textSize>`,
|
|
56
|
+
* `color/<brand>/<mode>/<surface>`) plus `$themes.json` (one theme group per
|
|
57
|
+
* axis) and `$metadata.json`, ready for Tokens Studio's folder sync. See
|
|
58
|
+
* `renderers/tokens-studio.ts`. */
|
|
59
|
+
tokensStudio?: boolean;
|
|
54
60
|
}
|
|
55
61
|
|
|
56
62
|
export interface ApollionConfig {
|