@apollion-dsi/tokens 7.2.0 → 7.4.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 +6 -0
- package/lib/build.cjs +13 -11
- package/lib/build.esm.js +13 -11
- package/lib/cli.mjs +14 -12
- package/lib/config-loader.cjs +2 -2
- package/lib/config-loader.esm.js +3 -3
- package/lib/config-schema.cjs +1 -1
- package/lib/config-schema.esm.js +1 -1
- package/package.json +2 -2
- package/src/build.ts +18 -8
- package/src/builders/layout.ts +13 -4
- package/src/config-schema-runtime.ts +10 -1
- package/src/config-schema.ts +26 -0
- package/src/ir.ts +38 -19
- package/src/renderers/css.ts +58 -1
- package/src/renderers/resolver.ts +39 -14
- package/src/set-plan.ts +38 -14
package/lib/cli.mjs
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var io=Object.defineProperty;var i=(e,n)=>io(e,"name",{value:n,configurable:!0}),so=(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 $t}from"node:fs/promises";import{resolve as Oe}from"node:path";import{mkdir as Zn,mkdtemp as ht,readFile as Xn,rename as yt,rm as Yn,writeFile as Qn}from"node:fs/promises";import{tmpdir as bt}from"node:os";import{dirname as eo,join as q}from"node:path";import{converter as Co,parse as Vo}from"culori";import{defaultInputBorder as ee}from"@apollion-dsi/core/themes/border";import{createReadableTextLayer as po}from"@apollion-dsi/core/themes/colors";import{createDeth as fo,levelValues as mo}from"@apollion-dsi/core/themes/depth";import{createFont as go,defaultInputFont as L}from"@apollion-dsi/core/themes/font";import{defaultInputSpacing as Be}from"@apollion-dsi/core/themes/spacing";import{converter as ho,formatHex as yo,parse as bo}from"culori";import{defaultInputBreakpoints as ao}from"@apollion-dsi/core/themes/breakpoints";function Le(e=ao){return Object.entries(e.values).map(([n,o])=>[n,`${o}px`])}i(Le,"breakpointEntries");import{defaultInputContainerSizes as co,defaultInputLayout as lo}from"@apollion-dsi/core/themes/layout";function Ge(e=co){return Object.entries(e.values).map(([n,o])=>[n,`${o}px`])}i(Ge,"containerSizeEntries");function je(e=lo){return[["page-max-width",`${e.pageMaxWidth}px`]]}i(je,"layoutEntries");import{createMotion as X,defaultInputMotion as Y}from"@apollion-dsi/core/themes/motion";function Pe(e=Y){let n=X(e);return Object.keys(e.duration).map(o=>[o,{ms:e.duration[o],css:n.duration[o]}])}i(Pe,"motionDurationEntries");function Ne(e=Y){let n=X(e);return Object.keys(e.easing).map(o=>[o,{points:e.easing[o],css:n.easing[o]}])}i(Ne,"motionEasingEntries");function Fe(e=Y){let n=X(e);return Object.keys(e.indicator).map(o=>[o,{ms:e.indicator[o],css:n.indicator[o]}])}i(Fe,"motionIndicatorEntries");function _e(e=Y){let n=X(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(_e,"motionIntentEntries");import{DIMENSION_MULTIPLIERS as uo}from"@apollion-dsi/core/themes/dimension";function Z({multiplier:e=.25,alias:n},o){let t=o!==void 0?uo[o]:e;return(...r)=>r.map(s=>{let a=typeof s=="string"?n[s]:s;return`${t*a}rem`}).join(" ")}i(Z,"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 ye(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(ye,"assertTokenMetaResolves");var Ro=ho("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 ze(e){return e.split(".").map(x).join(".")}i(ze,"kebabPath");function V(e){return e.kind==="ref"?e.resolved.raw:e.raw}i(V,"rawValue");function Q(e,n){return Number(e.toFixed(n))||0}i(Q,"round");function be(e){let n=Ro(bo(e));if(!n)return{kind:"color",raw:e,components:[0,0,0],hex:"#000000"};let o=[Q(n.l,4),Q(n.c,4),Q(n.h??0,2)],t=yo(n)??"#000000";return n.alpha!==void 0&&n.alpha!==1?{kind:"color",raw:e,components:o,alpha:Q(n.alpha,4),hex:t}:{kind:"color",raw:e,components:o,hex:t}}i(be,"toColorValue");var He=/^(-?(?:\d+\.?\d*|\.\d+))(px|rem)$/;function $(e){let n=He.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:be(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 Ke(e){let n=po(e),o={};for(let[t,r]of Object.entries(n.palettes))o[t]=I(r);return o.neutral=G(n.neutral),o}i(Ke,"buildReadableTextGroup");var ko=["main","opposite","complementary","primary","secondary","tertiary","success","danger","warning","information"];function We(e){let n={};for(let o of ko){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(We,"buildColorPrimitives");function Je(e){let n=Z(Be,e),o={};for(let t of Object.keys(Be.alias))o[t]={type:"dimension",value:$(n(t))};return o}i(Je,"buildSpacePrimitives");function qe(){let e={};for(let[n,o]of Object.entries(ee.borderWidth))e[n]={type:"dimension",value:$(o)};return e}i(qe,"buildBorderWidthPrimitives");function Io(e,n){return{color:We(e),space:Je(n),borderWidth:qe()}}i(Io,"buildPrimitives");var Ue={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"},Xe={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"},Ye={hairline:"color.edge.hairline",border:"color.edge.border",strong:"color.edge.strong"};function xo(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(xo,"lookupPrimitive");function F(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=o[r],c=a?xo(n,a):void 0;t[r]=a&&c===s?{type:"color",value:{kind:"ref",path:a,resolved:be(s)}}:I(s)}return t}i(F,"colorRefGroup");var Ze={xs:"space.xs",sm:"space.small",md:"space.medium",lg:"space.large",xl:"space.xl",xxl:"space.xxl"},So={none:"border-width.none",thin:"border-width.thin",regular:"border-width.regular",great:"border-width.great",bold:"border-width.bold"};function wo(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(wo,"lookupDimensionPrimitive");function Re(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=o[r],c=a?wo(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(Re,"dimensionRefGroup");function Qe(e){let n={},o={};for(let[s,a]of Object.entries(ee.borderRadius))He.test(a)?n[s]={type:"dimension",value:$(a)}:o[s]=a;let t=Re(ee.borderWidth,e,So),r={};for(let[s,a]of Object.entries(ee.borderStyle))r[s]={type:"strokeStyle",value:{kind:"strokeStyle",raw:a,style:a}};return{group:{radius:n,width:t,style:r},extensions:o}}i(Qe,"buildBorder");function en(e){let n=go(L,e),o={};for(let[c,l]of Object.entries(L.fontFamily)){let f=l.replace(/;\s*$/,"").trim();o[c]={type:"fontFamily",value:{kind:"fontFamily",raw:f,family:f}}}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(en,"buildFont");var vo=/rgba?\([^)]*\)|#[0-9a-fA-F]+|[a-zA-Z]+$/;function Do(e){let n=e.trim(),o=n.startsWith("inset");o&&(n=n.slice(5).trim());let t=n.match(vo),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:be(r),offsetX:c(0),offsetY:c(1),blur:c(2),spread:c(3),inset:o}}}i(Do,"parseShadow");function nn(e){let n=fo(e),o={};for(let t of Object.keys(mo))o[t]={type:"shadow",value:Do(n(t))};return o}i(nn,"buildShadow");function ne(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]=ne(s,a,o)}return t}i(ne,"decorateGroup");function To(e){let n=new Set,o=ne(e.primitives,"",n),t=ne(e.groups,"",n);return ye(n),{...e,primitives:o,groups:t}}i(To,"decorateMeta");function oe(e,n){return ne(e,"",n)}i(oe,"decorateSlice");function on(e,n,o){for(let[t,r]of Object.entries(e)){let s=n?`${n}.${x(t)}`:x(t);b(r)?o.add(s):on(r,s,o)}}i(on,"collectPaths");function tn(e){let n=new Set;for(let o of e)on(o.groups,"",n);ye(n)}i(tn,"assertSlicesMetaComplete");function rn(){let e={};for(let[n,o]of Le())e[n]={type:"dimension",value:$(o)};return e}i(rn,"buildBreakpoints");function sn(){let e={};for(let[n,o]of Ge())e[n]={type:"dimension",value:$(o)};return e}i(sn,"buildContainerSizes");function an(){let e={};for(let[n,o]of je())e[n]={type:"dimension",value:$(o)};return e}i(an,"buildLayoutConstants");function cn(){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 Pe())o[a]=e(c);let t={};for(let[a,c]of Ne())t[a]=n(c);let r={};for(let[a,c]of Fe())r[a]=e(c);let s={};for(let[a,c]of _e()){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(cn,"buildMotion");var ln={unit:"px",interval:"half-open [value, next) \u2014 min-width sets, ascending",cssVarsUsage:"informational only \u2014 var() is invalid inside a @media prelude"};function un(){let e=qe(),o=Qe({borderWidth:e}),t={"com.apollion.breakpoint":ln};Object.keys(o.extensions).length>0&&(t["com.apollion.border"]={radius:o.extensions});let r=new Set;return{groups:oe({"border-width":e,border:o.group,breakpoint:rn(),"container-size":sn(),layout:an(),motion:cn()},r),extensions:t}}i(un,"buildBaseIR");function dn(e){let n=en(e),o=new Set;return{groups:oe({font:n.group},o),extensions:{"com.apollion.font":n.extensions}}}i(dn,"buildFontIR");function pn(e,n){let o=We(n),t=new Set;return{groups:oe({color:o,bg:F(e.bg,n,Ue),text:F(e.text,n,Xe),edge:F(e.edge,n,Ye),tx:Ke(n),shadow:nn(n)},t),extensions:{}}}i(pn,"buildColorIR");function fn(e,n){let o=Je(n),t={space:o},r=new Set;return{groups:oe({space:o,spacing:Re(e.spacing,t,Ze)},r),extensions:{}}}i(fn,"buildSpacingIR");function $o(e,n,o){let t={brand:o.brand,mode:o.mode,surface:o.surface,dimension:o.dimension},r=Io(n,o.dimension),s=Qe(r),a=en(o.dimension),c={"com.apollion.variant":t,"com.apollion.font":a.extensions,"com.apollion.breakpoint":ln};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:F(e.bg,n,Ue),text:F(e.text,n,Xe),edge:F(e.edge,n,Ye),tx:Ke(n),spacing:Re(e.spacing,r,Ze),border:s.group,breakpoint:rn(),"container-size":sn(),layout:an(),motion:cn(),font:a.group,shadow:nn(n)},extensions:c};return To(l)}i($o,"buildIR");var _=$o;var Mo=Co("rgb"),mn="// Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs.";function ke(e){if(e.value.kind==="color")return e.value;if(e.value.kind==="ref"&&e.value.resolved.kind==="color")return e.value.resolved}i(ke,"colorPayload");function Ie(e){return e.alpha===void 0}i(Ie,"isOpaqueColor");function gn(e){let n=Mo(Vo(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(gn,"rgbTriplet");function z(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 z(r,s))o.set(a,c)}return o}i(z,"flatTokens");function h(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(h,"groupAt");function hn(e){let n=[];for(let o of["bg","text","edge","tx"])for(let[t,r]of z(h(e.groups,o),[o])){let s=ke(r);s&&n.push({key:t,cssVar:`--apollion-${t}`,opaque:Ie(s)})}return n}i(hn,"colorEntries");function C(e,n){return[...z(e)].map(([o])=>[o,`var(--apollion-${[...n,o].join("-")})`])}i(C,"varEntries");function D(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(D,"pushScale");function yn(e){let n=[mn,"// Tailwind preset over the Apollion foundation tokens \u2014 requires dist/css/ vars in scope.","","const preset = {"," theme: {"," extend: {"],o=hn(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(" },"),D(n,"screens",[...z(h(e.groups,"breakpoint"))].filter(([t])=>t!=="xs").map(([t,r])=>[t,V(r.value)])),D(n,"spacing",C(h(e.groups,"spacing"),["spacing"])),D(n,"borderRadius",C(h(e.groups,"border","radius"),["border","radius"])),D(n,"borderWidth",C(h(e.groups,"border","width"),["border","width"])),D(n,"fontFamily",C(h(e.groups,"font","family"),["font","family"])),D(n,"fontSize",C(h(e.groups,"font","size"),["font","size"])),D(n,"fontWeight",C(h(e.groups,"font","weight"),["font","weight"])),D(n,"lineHeight",C(h(e.groups,"font","lineHeight"),["font","line-height"])),D(n,"boxShadow",C(h(e.groups,"shadow"),["shadow"])),D(n,"transitionDuration",C(h(e.groups,"motion","duration"),["motion","duration"])),D(n,"transitionTimingFunction",C(h(e.groups,"motion","easing"),["motion","easing"])),n.push(" },"," },","};","","export default preset;",""),n.join(`
|
|
3
|
-
`)}i(
|
|
4
|
-
`)}i(
|
|
5
|
-
`)}i(
|
|
6
|
-
`)}i(
|
|
2
|
+
var lo=Object.defineProperty;var i=(e,n)=>lo(e,"name",{value:n,configurable:!0}),uo=(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 zt}from"node:fs/promises";import{resolve as je}from"node:path";import{mkdir as oo,mkdtemp as $t,readFile as eo,rename as Ct,rm as no,writeFile as to}from"node:fs/promises";import{tmpdir as Et}from"node:os";import{dirname as ro,join as Z}from"node:path";import{DEFAULT_TEXT_SIZE as Po,TEXT_SIZE_ATTRIBUTE as _o}from"@apollion-dsi/core/themes/text-size";import{converter as Lo,parse as Go}from"culori";import{defaultInputBorder as te}from"@apollion-dsi/core/themes/border";import{createReadableTextLayer as ho}from"@apollion-dsi/core/themes/colors";import{createDeth as bo,levelValues as Ro}from"@apollion-dsi/core/themes/depth";import{createFont as ko,defaultInputFont as L}from"@apollion-dsi/core/themes/font";import{defaultInputSpacing as We}from"@apollion-dsi/core/themes/spacing";import{DEFAULT_TEXT_SIZE as Io}from"@apollion-dsi/core/themes/text-size";import{converter as xo,formatHex as So,parse as vo}from"culori";import{defaultInputBreakpoints as po}from"@apollion-dsi/core/themes/breakpoints";function Pe(e=po){return Object.entries(e.values).map(([n,o])=>[n,`${o}px`])}i(Pe,"breakpointEntries");import{defaultInputContainerSizes as fo,defaultInputLayout as mo,defaultInputZIndex as go}from"@apollion-dsi/core/themes/layout";function _e(e=fo){return Object.entries(e.values).map(([n,o])=>[n,`${o}px`])}i(_e,"containerSizeEntries");function ze(e=mo){return[["page-max-width",`${e.pageMaxWidth}px`]]}i(ze,"layoutEntries");function Fe(e=go){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 yo}from"@apollion-dsi/core/themes/dimension";function ne({multiplier:e=.25,alias:n},o){let t=o!==void 0?yo[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 wo=xo("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=wo(vo(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=So(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=ho(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 To=["main","opposite","complementary","primary","secondary","tertiary","success","danger","warning","information"];function qe(e){let n={};for(let o of To){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 Do(e,n){return{color:qe(e),space:Ze(n),borderWidth:Ye()}}i(Do,"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 $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 z(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: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"},Co={none:"border-width.none",thin:"border-width.thin",regular:"border-width.regular",great:"border-width.great",bold:"border-width.bold"};function Eo(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(Eo,"lookupDimensionPrimitive");function ke(e,n,o){let t={};for(let[r,s]of Object.entries(e)){let a=o[r],c=a?Eo(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,Co),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=ko(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 Ao=/rgba?\([^)]*\)|#[0-9a-fA-F]+|[a-zA-Z]+$/;function Mo(e){let n=e.trim(),o=n.startsWith("inset");o&&(n=n.slice(5).trim());let t=n.match(Ao),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(Mo,"parseShadow");function sn(e){let n=bo(e),o={};for(let t of Object.keys(Ro))o[t]={type:"shadow",value:Mo(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 Vo(e){let n=new Set,o=re(e.primitives,"",n),t=re(e.groups,"",n);return be(n),{...e,primitives:o,groups:t}}i(Vo,"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 Oo(e,n,o){let t={brand:o.brand,mode:o.mode,surface:o.surface,dimension:o.dimension},r=Do(n,o.dimension),s=tn(r),a=rn(Io),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 Vo(l)}i(Oo,"buildIR");var F=Oo;var jo=Lo("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=jo(Go(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(In,"renderTailwindPreset");function xn(e){let n=i(r=>[...B(r).keys()],"keys"),o=i(r=>`[${r.map(s=>JSON.stringify(s)).join(", ")}]`,"list");return[bn,"// tailwind-merge extension for the generated preset \u2014 pass to extendTailwindMerge().","","export const twMergeExtension = {"," extend: {"," theme: {",` colors: ${o(kn(e).map(r=>r.key))},`,` spacing: ${o(n(y(e.groups,"spacing")))},`,` borderRadius: ${o(n(y(e.groups,"border","radius")))},`,` borderWidth: ${o(n(y(e.groups,"border","width")))},`," },"," classGroups: {",` 'font-family': [{ font: ${o(n(y(e.groups,"font","family")))} }],`,` 'font-size': [{ text: ${o(n(y(e.groups,"font","size")))} }],`,` 'font-weight': [{ font: ${o(n(y(e.groups,"font","weight")))} }],`,` leading: [{ leading: ${o(n(y(e.groups,"font","lineHeight")))} }],`,` shadow: [{ shadow: ${o(n(y(e.groups,"shadow")))} }],`," },"," },","};",""].join(`
|
|
4
|
+
`)}i(xn,"renderTwMergeExtension");var ve="/* Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs. */";function H(e,n,o){for(let[t,r]of Object.entries(e)){let s=[...n,x(t)];b(r)?o.push(` --apollion-${s.join("-")}: ${E(r.value)};`):H(r,s,o)}}i(H,"emitVars");function se(e,n,o){for(let[t,r]of Object.entries(e)){let s=[...n,x(t)];if(!b(r)){se(r,s,o);continue}let a=xe(r);a&&Se(a)&&o.push(` --apollion-${s.join("-")}-rgb: ${Rn(a)};`)}}i(se,"emitRgbVars");function we(e,n,o){for(let[t,r]of Object.entries(e)){let s=[...n,x(t)];b(r)?r.type==="color"&&o.push(` @property --apollion-${s.join("-")} { syntax: '<color>'; inherits: true; initial-value: ${E(r.value)}; }`):we(r,s,o)}}i(we,"emitProperties");function Sn(e,n={}){let{brand:o,mode:t,surface:r,dimension:s}=e.meta,a=[ve,""];return a.push(`/* Variant: brand=${o} mode=${t} surface=${r} dimension=${s} */`,"",":root {"),H(e.groups,[],a),n.rgbCompanions&&(a.push(""," /* -rgb channel triplets \u2014 Tailwind <alpha-value> companions (opaque colour tokens only). */"),se(e.groups,[],a)),a.push("}",""),a.push("@supports (background: paint(squircle)) or (color: oklch(0% 0 0)) {"),we(e.groups,[],a),a.push("}",""),a.join(`
|
|
5
|
+
`)}i(Sn,"renderCss");function vn(e,n,o={}){let{attribute:t="data-apollion-mode",rgbCompanions:r}=o,{brand:s,surface:a,dimension:c}=e.meta,l=[ve,""],p=i((v,u,d)=>{l.push(`${v} {`,` color-scheme: ${d};`),H(u.groups,[],l),r&&se(u.groups,[],l),l.push("}","")},"block");l.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"),l.push("@media (prefers-color-scheme: dark) {"),l.push(` html:not([${t}]) {`," color-scheme: dark;");let R=[];H(n.groups,[],R),r&&se(n.groups,[],R);for(let v of R)l.push(` ${v}`);return l.push(" }","}",""),l.push("@supports (background: paint(squircle)) or (color: oklch(0% 0 0)) {"),we(e.groups,[],l),l.push("}",""),l.join(`
|
|
6
|
+
`)}i(vn,"renderCssModes");function wn(e,n={}){let{attribute:o=_o,defaultLevel:t=Po}=n,r=[ve,""];r.push(`/* Text size (ADR-030): levels=${e.map(([c])=>c).join("+")} default=${t} (attribute ${o}) */`,"");let s=i((c,l)=>{r.push(`${c} {`);let p=l.groups.font;H(p.size,["font","size"],r),r.push("}","")},"block"),a=e.find(([c])=>c===t);a&&s(":root",a[1]);for(let[c,l]of e)s(`:root[${o}="${c}"],
|
|
7
|
+
[${o}="${c}"]`,l);return r.join(`
|
|
8
|
+
`)}i(wn,"renderCssTextSize");var zo="<!-- Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs. -->";function Te(e,n,o){for(let[t,r]of Object.entries(e)){let s=n?`${n}.${t}`:t;b(r)?o.push([s,E(r.value)]):Te(r,s,o)}}i(Te,"flatten");function Fo(e){return typeof e=="number"?String(e):`'${String(e).replace(/'/g,"''")}'`}i(Fo,"yamlEscape");function No(e){let{mode:n,surface:o,dimension:t}=e.meta;return`${n}.${o}.${t}`}i(No,"variantKey");function Tn(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=[];Te(r.groups,"",s),o.push(` ${No(r)}:`);for(let[a,c]of s)o.push(` ${a}: ${Fo(c)}`)}o.push("---");let t=["",zo,"",`# 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 l=[];Te(r.groups,"",l);let p=new Map;for(let[R,v]of l){let u=R.split(".")[0]??R,d=p.get(u)??[];d.push([R,v]),p.set(u,d)}for(let[R,v]of p){t.push(`### ${R}`,"","| Token | Value |","| --- | --- |");for(let[u,d]of v)t.push(`| \`${u}\` | \`${d}\` |`);t.push("")}}return`${o.join(`
|
|
7
9
|
`)}
|
|
8
10
|
${t.join(`
|
|
9
|
-
`)}`}i(
|
|
10
|
-
`}i(
|
|
11
|
-
`}i(
|
|
12
|
-
`)}i(
|
|
13
|
-
`}i(On,"serializeManifest");var Wo="json/sets",Ln="json/resolver.json";function ce(e){return`${Wo}/${e}.json`}i(ce,"setFile");function Jo(e,n,o){return`${e}.color.${n}.${o}`}i(Jo,"colorSetName");function qo(e){return`spacing.${e}`}i(qo,"spacingSetName");function Uo(e){return`font.${e}`}i(Uo,"fontSetName");function le(e,n){e.includes(n)||e.push(n)}i(le,"pushUnique");function Gn(e){let n=se(e),o=[],t=[],r=[],s=[],a=new Set,c=[],l=new Set,f=[],R=new Set,w=[];for(let u of n){le(o,u.brand),le(t,u.mode),le(r,u.surface),le(s,u.dimension);let d=Jo(u.brand,u.mode,u.surface);a.has(d)||(a.add(d),c.push({kind:"color",name:d,file:ce(d),brand:u.brand,mode:u.mode,surface:u.surface}));let y=qo(u.dimension);l.has(y)||(l.add(y),f.push({kind:"spacing",name:y,file:ce(y),dimension:u.dimension}));let m=Uo(u.dimension);R.has(m)||(R.add(m),w.push({kind:"font",name:m,file:ce(m),dimension:u.dimension}))}return{base:{kind:"base",name:"base",file:ce("base")},spacing:f,font:w,color:c,modifiers:{brand:o,mode:t,surface:r,dimension:s}}}i(Gn,"planSets");import{toDarkColors as dt}from"@apollion-dsi/core/themes/colors";import{createFoundation as Un}from"@apollion-dsi/core/themes/foundation";import{createSemantic as pt}from"@apollion-dsi/core/themes/semantic";import{defaultInputSpacing as ft}from"@apollion-dsi/core/themes/spacing";import{invertForSurface as mt}from"@apollion-dsi/core/themes/surface";import{converter as _n,formatHex as j,interpolate as Xo,parse as S,wcagContrast as Bn}from"culori";var J=_n("oklch"),Yo=_n("rgb");function p(e,n,o){let t=S(e),r=S(n);if(!t||!r)return e;let s=Xo([t,r],"oklch");return j(s(o))??e}i(p,"mixOklch");function Zo(e){return e?typeof e=="string"?e:e.base:"#000"}i(Zo,"coerceToHex");var ue=1.3,Qo=.05,jn=.04,A=i((e,n)=>{let o=S(e),t=S(n);return!o||!t?1:Bn(o,t)},"contrastRatio"),K=i(e=>{let n=J(S(e));return n?n.l??0:null},"oklchLightness"),et=4.5;function W(e,n,o=et){let t=S(n),r=J(S(e));if(!t||!r)return e;let s=A("#fff",n)>=A("#000",n)?.04:-.04;for(let a=0;a<25;a+=1){let c=j(r)??e,l=S(c);if(l&&Bn(l,t)>=o)return c;let f=Math.min(1,Math.max(0,(r.l??0)+s));if(f===(r.l??0))break;r={...r,l:f}}return j(r)??e}i(W,"readableColor");var Pn=i((e,n)=>{if(A(e,n)>=ue)return!0;let o=K(e),t=K(n);return o!==null&&t!==null&&Math.abs(o-t)>=Qo},"isPerceptibleState"),Te=i(e=>e?A("#fff",e)>A("#000",e):!1,"isDarkSurface");function Nn(e,n,o){let t=J(S(e));if(!t)return null;let r={...t,l:o??t.l??0},s=n?jn:-jn;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&&A(e,l)>=ue)return l}return j(r)??null}i(Nn,"derivePerceptibleState");function Fn(e,n,o){let t=Nn(e,n,o);if(t&&A(e,t)>=ue)return t;let r=Nn(e,!n);return r&&A(e,r)>=ue?r:t??r}i(Fn,"perceptibleStateFor");function T(e,n){let o=typeof e=="object"&&e!==null?e:void 0,t=Zo(e),r=n.deepDark,s=n.deepLight,a={base:t,dark:p(t,r,.6),action:p(t,r,.2),active:p(t,s,.6),light:p(t,s,.9),onLight:t};if(S(t)){let c=Te(n.baseLight),l=Pn(t,a.action);if(l||(a.action=Fn(t,c)??a.action),!Pn(t,a.active)){let f=l?void 0:K(a.action)??void 0;a.active=Fn(t,c,f)??a.active}}if(a.onLight=W(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??W(c,l)}}return a}i(T,"mountSingleColor");function zn(e){let n=e.deepLight,o=e.deepDark;return{0:n,5:p(n,o,.05),10:p(n,o,.1),20:p(n,o,.2),30:p(n,o,.3),40:p(n,o,.4),50:p(n,o,.5),60:p(n,o,.6),70:p(n,o,.7),80:p(n,o,.8),90:p(n,o,.9),100:p(n,o,1)}}i(zn,"mountGreyscaleColors");function Hn(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=p(t,o,.5);return{0:p(s,n,r(18)),5:p(s,n,r(17.5)),10:p(s,n,r(17)),20:p(s,n,r(16)),30:p(s,n,r(15)),40:p(s,n,r(14)),50:p(s,n,r(13)),60:p(s,n,r(12)),70:p(s,n,r(11)),80:p(s,n,r(10)),90:p(s,n,r(9)),100:p(s,n,r(8)),110:p(s,n,r(7)),120:p(s,n,r(6)),130:p(s,n,r(5)),140:p(s,n,r(4)),150:p(s,n,r(3)),160:p(s,n,r(2)),170:s,180:p(s,o,.25)}}i(Hn,"mountNeutralColors");function B(e,n){let o=J(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(B,"shiftLightness");function de(e,n){let o=J(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(de,"clampLightness");function P(e,n){let o=Yo(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 pe,DARK_BOOST_TAPER_MAX_L as $e,DARK_ELEVATION_BOOST as nt,EDGE_ALPHA as Ce,HALATION_FLOORS as fe,INK_APCA_MIN as Ve,INK_MIX as Me,LADDER_DELTAS as Kn,MIN_CONTRAST_AA as Wn,WASH_ALPHA as ot}from"@apollion-dsi/core/themes/colors";var tt="#FFFFFF",Ee="#000000";function rt(e){return Te(e.baseLight)?"dark":"light"}i(rt,"resolvePolarity");function it(e){let n=fe.CANVAS_MIN_L;return e<=n?1:e>=$e?0:($e-e)/($e-n)}i(it,"darkElevationBoostFactor");function Jn(e,n,o){if(Math.abs(pe(e,n))>=o)return e;let t=Math.abs(pe("#ffffff",n))>=Math.abs(pe("#000000",n)),r=e;for(let s=0;s<40;s+=1){let a=B(r,t?.02:-.02);if(a===r||(r=a,Math.abs(pe(r,n))>=o))break}return r}i(Jn,"ensureApca");function st(e,n){let o=e.baseLight??tt,t=n==="dark",r=t?de(o,{min:fe.CANVAS_MIN_L}):o,s=B(r,Kn.sunken),a=t?it(K(r)??0):0,c=i(l=>Kn[l]+a*nt[l],"delta");return{canvas:r,sunken:t?de(s,{min:fe.CANVAS_MIN_L}):s,paper:B(r,c("paper")),raised:B(r,c("raised")),overlay:B(r,c("overlay")),scrim:t?e.deepLight??Ee:e.neutral?.["180"]??e.baseDark??Ee}}i(st,"deriveSurface");function at(e,n){let o=e.baseDark??Ee,t=de(Jn(W(o,n.paper,Wn),n.paper,Ve.primary),{max:fe.INK_MAX_L}),r=i((s,a)=>Jn(W(p(t,n.canvas,s),n.paper,Wn),n.paper,a),"tier");return{primary:t,secondary:r(Me.secondary,Ve.secondary),muted:r(Me.muted,Ve.muted),disabled:p(t,n.canvas,Me.disabled)}}i(at,"deriveInk");function ct(e){return{hairline:P(e.primary,Ce.hairline),border:P(e.primary,Ce.border),strong:P(e.primary,Ce.strong)}}i(ct,"deriveEdge");function lt(e,n){let o=ot[n];return{hover:P(e.primary,o.hover),pressed:P(e.primary,o.pressed),selected:P(e.primary,o.selected)}}i(lt,"deriveWash");function ut(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(ut,"applyOverride");function qn(e,n){let o=rt(e),t=st(e,o),r=at(e,t),s={surface:t,ink:r,edge:ct(r),wash:lt(r,o)};return ut(s,n?.[o])}i(qn,"resolveSurfaceLadder");function gt(e){let n=Hn(e);return{baseDark:e.baseDark,baseLight:e.baseLight,deepDark:e.deepDark,deepLight:e.deepLight,transparent:e.transparent??"transparent",neutral:n,grayscale:zn(e),...qn({...e,neutral:n},e.ladder),main:T(e.main,e),opposite:T(e.opposite,e),complementary:T(e.complementary,e),danger:T(e.danger,e),information:T(e.information,e),success:T(e.success,e),warning:T(e.warning,e),primary:T(e.primary,e),secondary:T(e.secondary,e),tertiary:T(e.tertiary,e)}}i(gt,"composeColors");function O(e,n=ft){let o=e.mode==="dark"?dt(e.colors):e.colors,t=gt(o),r=Z(n,e.dimension),s=pt({colors:t,spacing:r}),a=Un(s);return e.surface==="negative"&&(a=Un(mt({semantic:s,colors:t},"negative").semantic)),{foundation:a,colors:t}}i(O,"buildVariantThemes");async function no(e){let{config:n,outDir:o,cwd:t=process.cwd(),verbose:r=!1}=e,s=se(n),a=n.output??{};if(s.length===0)throw new Error("apollion-tokens build: no variants (config.brands is empty)");let c=await ht(q(bt(),"apollion-tokens-"));try{let l=[],f=i(async(u,d)=>{await Rt(c,u,d),l.push({path:u,sha256:ae(d)}),r&&console.log(` \u2713 ${u}`)},"emit");if(a.json){let u=Gn(n),d=[],y=un();d.push(y),await f(u.base.file,wn(y));for(let m of u.spacing){let k=s.find(U=>U.dimension===m.dimension),{foundation:M}=O(k),E=fn(M,m.dimension);d.push(E),await f(m.file,Dn(E,m.dimension))}for(let m of u.font){let k=dn(m.dimension);d.push(k),await f(m.file,Tn(k,m.dimension))}for(let m of u.color){let k=s.find(ge=>ge.brand===m.brand&&ge.mode===m.mode&&ge.surface===m.surface),{foundation:M,colors:E}=O(k),U=pn(M,E);d.push(U),await f(m.file,vn(U,m.brand,m.mode,m.surface))}tn(d),await f(Ln,$n(n,u))}if(a.css||a.ts)for(let u of s){let{foundation:d,colors:y}=O(u),m=_(d,y,u),k=Mn(u);a.css&&await f(`css/${k}.css`,kn(m,{rgbCompanions:a.tailwind})),a.ts&&await f(`ts/${k}.d.ts`,Vn(m))}if(a.cssModes){let u=new Map;for(let d of s){let y=`${d.brand}.${d.surface}.${d.dimension}`,m=u.get(y)??{};m[d.mode]=d,u.set(y,m)}for(let[d,{light:y,dark:m}]of u){if(!y||!m)throw new Error(`apollion-tokens build: output.cssModes needs both modes for ${d} (config.modes)`);let k=O(y),M=O(m),E=In(_(k.foundation,k.colors,y),_(M.foundation,M.colors,m),{rgbCompanions:a.tailwind});await f(`css/${d}.modes.css`,E)}}if(a.tailwind){let u=s[0],{foundation:d,colors:y}=O(u),m=_(d,y,u);await f("tailwind/preset.mjs",yn(m)),await f("tailwind/tw-merge.mjs",bn(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:M,colors:E}=O(k);return _(M,E,k)});await f(`design/${d}.design.md`,xn(d,m))}}let R={configHash:De(n),files:l,gitCommit:En(t),buildEnv:An()},w=On(R);return await Qn(q(c,"manifest.json"),w),await Yn(o,{recursive:!0,force:!0}),await Zn(eo(o),{recursive:!0}),await yt(c,o),r&&console.log(`\u2713 ${l.length} files \u2192 ${o}`),{manifest:R,outDir:o}}catch(l){throw await Yn(c,{recursive:!0,force:!0}).catch(()=>{}),l}}i(no,"build");async function oo(e){let{config:n,outDir:o}=e,t;try{t=JSON.parse(await Xn(q(o,"manifest.json"),"utf8"))}catch{return!1}if(t.configHash!==De(n))return!1;for(let r of t.files){let s;try{s=await Xn(q(o,r.path))}catch{return!1}if(ae(s)!==r.sha256)return!1}return!0}i(oo,"check");async function Rt(e,n,o){let t=q(e,n);await Zn(eo(t),{recursive:!0}),await Qn(t,o)}i(Rt,"writeAt");import{readFile as It}from"node:fs/promises";import{resolve as xt}from"node:path";import{createContext as St,Script as wt}from"node:vm";import{z as g}from"zod";var v=g.string().regex(/^#([0-9a-fA-F]{3}){1,2}$|^transparent$|^rgb\(.*\)$|^oklch\(.*\)$/,{message:'Must be hex, rgb(), oklch(), or "transparent"'}),kt=g.object({baseDark:g.string().optional(),baseLight:g.string().optional(),deepDark:v,deepLight:v,transparent:g.string().optional(),main:v.optional(),opposite:v.optional(),complementary:v.optional(),information:v.optional(),success:v.optional(),danger:v.optional(),warning:v.optional(),primary:v.optional(),secondary:v.optional(),tertiary:v.optional()}).passthrough(),to=g.object({brands:g.record(g.string(),kt).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(),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 vt=[/\brequire\s*\(/,/\bimport\s*\(/,/^\s*import\s+/m],Dt=1e3;var Ae=class Ae extends Error{constructor(o,t){super(o);this.configPath=t;this.name="ConfigLoadError"}};i(Ae,"ConfigLoadError");var N=Ae;async function ro(e){let n=xt(e.configPath),o=await It(n,"utf8");for(let l of vt)if(l.test(o))throw new N(`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,f)=>`${f}__apollion_config_export = `);if(t===o)throw new N("apollion.config: missing `export default <object>;` \u2014 config must export a default object literal.",n);let r={__apollion_config_export:void 0,console:Tt(),Symbol,Number,String,Boolean,Array,Object,JSON,Math,defineConfig:i(l=>l,"defineConfig")},s=St(r);try{new wt(t,{filename:n}).runInContext(s,{timeout:Dt})}catch(l){throw new N(`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 N("apollion.config: `export default` produced undefined.",n);let c=to.safeParse(a);if(!c.success){let l=c.error.issues.map(f=>` ${f.path.join(".")||"(root)"}: ${f.message}`).join(`
|
|
14
|
-
`);throw new
|
|
15
|
-
${l}`,n)}return c.data}i(
|
|
11
|
+
`)}`}i(Tn,"renderDesignMd");import{DEFAULT_TEXT_SIZE as Jo}from"@apollion-dsi/core/themes/text-size";function Dn(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(Dn,"colorValue");function K(e){return{value:e.value,unit:e.unit}}i(K,"dimensionValue");function Bo(e){return{value:e.value,unit:e.unit}}i(Bo,"durationValue");function Ho(e){return[...e.points]}i(Ho,"cubicBezierValue");function Ko(e){let n=e.shadow,o={color:Dn(n.color),offsetX:K(n.offsetX),offsetY:K(n.offsetY),blur:K(n.blur),spread:K(n.spread)};return n.inset&&(o.inset=!0),o}i(Ko,"shadowValue");function Wo(e){switch(e.kind){case"ref":return`{${Ue(e.path)}}`;case"color":return Dn(e);case"dimension":return K(e);case"fontFamily":return e.family;case"fontWeight":return e.weight;case"number":return e.number;case"strokeStyle":return e.style;case"shadow":return Ko(e);case"duration":return Bo(e);case"cubicBezier":return Ho(e)}}i(Wo,"projectValue");function Uo(e){let n={$value:Wo(e.value),$type:e.type};return e.description!==void 0&&(n.$description=e.description),e.deprecated!==void 0&&(n.$deprecated=e.deprecated),n}i(Uo,"projectToken");function De(e){let n={};for(let[o,t]of Object.entries(e))n[x(o)]=b(t)?Uo(t):De(t);return n}i(De,"projectGroup");function W(e,n,o){let t=De(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 $n(e){return W(e,"Apollion DS \u2014 base set (axis-invariant: border, breakpoints, container sizes, layout, motion). DTCG 2025.10.")}i($n,"renderBaseSet");function Cn(e,n,o,t){return W(e,`Apollion DS \u2014 colour set. brand=${n} mode=${o} surface=${t}. DTCG 2025.10.`)}i(Cn,"renderColorSet");function En(e,n){return W(e,`Apollion DS \u2014 spacing set. dimension=${n}. DTCG 2025.10.`)}i(En,"renderSpacingSet");function An(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(An,"renderFontSet");function Mn(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:Jo}],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(Mn,"renderResolver");var Xo="// Generated by apollion-tokens build \u2014 DO NOT EDIT. See apollion.config.mjs.";function qo(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(qo,"emitDoc");function Vn(e,n,o){let t=" ".repeat(n);for(let[r,s]of Object.entries(e))b(s)?(qo(s,t,o),o.push(`${t}${JSON.stringify(r)}: ${JSON.stringify(E(s.value))},`)):(o.push(`${t}${r}: {`),Vn(s,n+1,o),o.push(`${t}},`))}i(Vn,"emitGroup");function On(e){let{brand:n,mode:o,surface:t,dimension:r}=e.meta,s=[Xo,`// Variant: brand=${n} mode=${o} surface=${t} dimension=${r}`,"","export const tokens = {"];return Vn(e.groups,1,s),s.push("} as const;","","export type Tokens = typeof tokens;",""),s.join(`
|
|
14
|
+
`)}i(On,"renderTs");var Zo=["light","dark"],Yo=["positive","negative"],Qo=["compact","normal","spacious"],et=["smaller","default","larger","largest"];function ae(e){let n=[...new Set(e.textSizes??et)];if(!n.includes("default"))throw new Error(`apollion-tokens: textSizes must include 'default' (got [${n.join(", ")}])`);return n}i(ae,"resolveTextSizes");function ce(e){let n=e.modes??Zo,o=e.surfaces??Yo,t=e.dimensions??Qo,r=Object.entries(e.brands).sort(([a],[c])=>a.localeCompare(c)),s=[];for(let[a,c]of r)for(let l of n)for(let p of o)for(let R of t)s.push({brand:a,colors:c,mode:l,surface:p,dimension:R});return s}i(ce,"expandVariants");function Ln(e){return`${e.brand}.${e.mode}.${e.surface}.${e.dimension}`}i(Ln,"variantName");import{createHash as nt}from"node:crypto";function le(e){return nt("sha256").update(e).digest("hex")}i(le,"sha256");function Ce(e){return le($e(e))}i(Ce,"hashConfig");function $e(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map($e).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${$e(e[t])}`).join(",")}}`}i($e,"stableStringify");function Gn(e){try{let{execSync:n}=uo("node:child_process");return n("git rev-parse --short HEAD",{cwd:e,stdio:["ignore","pipe","ignore"],encoding:"utf8"}).trim()}catch{return""}}i(Gn,"detectGitCommit");function jn(){return{node:process.version,platform:`${process.platform}-${process.arch}`}}i(jn,"buildEnv");function Pn(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)}
|
|
15
|
+
`}i(Pn,"serializeManifest");import{DEFAULT_TEXT_SIZE as ot}from"@apollion-dsi/core/themes/text-size";var tt="json/sets",_n="json/resolver.json";function U(e){return`${tt}/${e}.json`}i(U,"setFile");function rt(e,n,o){return`${e}.color.${n}.${o}`}i(rt,"colorSetName");function it(e){return`spacing.${e}`}i(it,"spacingSetName");function st(e){return`font.${e}`}i(st,"fontSetName");function at(e){return`font.${e}`}i(at,"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=st(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=rt(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=it(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=at(u);v.push({kind:"font",name:d,file:U(d),textSize:ot,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{toDarkColors as St}from"@apollion-dsi/core/themes/colors";import{createFoundation as Qn}from"@apollion-dsi/core/themes/foundation";import{createSemantic as vt}from"@apollion-dsi/core/themes/semantic";import{defaultInputSpacing as wt}from"@apollion-dsi/core/themes/spacing";import{invertForSurface as Tt}from"@apollion-dsi/core/themes/surface";import{converter as Kn,formatHex as j,interpolate as ct,parse as S,wcagContrast as Wn}from"culori";var q=Kn("oklch"),lt=Kn("rgb");function f(e,n,o){let t=S(e),r=S(n);if(!t||!r)return e;let s=ct([t,r],"oklch");return j(s(o))??e}i(f,"mixOklch");function ut(e){return e?typeof e=="string"?e:e.base:"#000"}i(ut,"coerceToHex");var de=1.3,dt=.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"),pt=4.5;function X(e,n,o=pt){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)>=dt},"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=ut(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=lt(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 ft,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 mt}from"@apollion-dsi/core/themes/colors";var gt="#FFFFFF",Le="#000000";function yt(e){return Ee(e.baseLight)?"dark":"light"}i(yt,"resolvePolarity");function ht(e){let n=me.CANVAS_MIN_L;return e<=n?1:e>=Ae?0:(Ae-e)/(Ae-n)}i(ht,"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 bt(e,n){let o=e.baseLight??gt,t=n==="dark",r=t?pe(o,{min:me.CANVAS_MIN_L}):o,s=N(r,Xn.sunken),a=t?ht(J(r)??0):0,c=i(l=>Xn[l]+a*ft[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(bt,"deriveSurface");function Rt(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(Rt,"deriveInk");function kt(e){return{hairline:P(e.primary,Me.hairline),border:P(e.primary,Me.border),strong:P(e.primary,Me.strong)}}i(kt,"deriveEdge");function It(e,n){let o=mt[n];return{hover:P(e.primary,o.hover),pressed:P(e.primary,o.pressed),selected:P(e.primary,o.selected)}}i(It,"deriveWash");function xt(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(xt,"applyOverride");function Yn(e,n){let o=yt(e),t=bt(e,o),r=Rt(e,t),s={surface:t,ink:r,edge:kt(r),wash:It(r,o)};return xt(s,n?.[o])}i(Yn,"resolveSurfaceLadder");function Dt(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(Dt,"composeColors");function O(e,n=wt){let o=e.mode==="dark"?St(e.colors):e.colors,t=Dt(o),r=ne(n,e.dimension),s=vt({colors:t,spacing:r}),a=Qn(s);return e.surface==="negative"&&(a=Qn(Tt({semantic:s,colors:t},"negative").semantic)),{foundation:a,colors:t}}i(O,"buildVariantThemes");async function io(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 $t(Z(Et(),"apollion-tokens-"));try{let l=[],p=i(async(u,d)=>{await At(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 to(Z(c,"manifest.json"),v),await no(o,{recursive:!0,force:!0}),await oo(ro(o),{recursive:!0}),await Ct(c,o),r&&console.log(`\u2713 ${l.length} files \u2192 ${o}`),{manifest:R,outDir:o}}catch(l){throw await no(c,{recursive:!0,force:!0}).catch(()=>{}),l}}i(io,"build");async function so(e){let{config:n,outDir:o}=e,t;try{t=JSON.parse(await eo(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 eo(Z(o,r.path))}catch{return!1}if(le(s)!==r.sha256)return!1}return!0}i(so,"check");async function At(e,n,o){let t=Z(e,n);await oo(ro(t),{recursive:!0}),await to(t,o)}i(At,"writeAt");import{readFile as Vt}from"node:fs/promises";import{resolve as Ot}from"node:path";import{createContext as Lt,Script as Gt}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"'}),Mt=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(),ao=g.object({brands:g.record(g.string(),Mt).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 jt=[/\brequire\s*\(/,/\bimport\s*\(/,/^\s*import\s+/m],Pt=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 co(e){let n=Ot(e.configPath),o=await Vt(n,"utf8");for(let l of jt)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:_t(),Symbol,Number,String,Boolean,Array,Object,JSON,Math,defineConfig:i(l=>l,"defineConfig")},s=Lt(r);try{new Gt(t,{filename:n}).runInContext(s,{timeout:Pt})}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=ao.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
|
+
${l}`,n)}return c.data}i(co,"loadConfig");function _t(){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(_t,"makeReadOnlyConsole");function Ft(e){let n=e.slice(2),o=n[0];o!=="build"&&ge(`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 l=n[c];switch(l){case"--config":t=n[++c]??ge("--config needs a path");break;case"--out":r=n[++c]??ge("--out needs a path");break;case"--check":s=!0;break;case"--verbose":a=!0;break;default:ge(`Unknown flag "${l}"`)}}return{command:o,configPath:t,outDir:r,check:s,verbose:a}}i(Ft,"parseArgs");function ge(e){console.error(`apollion-tokens: ${e}`),process.exit(2)}i(ge,"fail");async function Nt(e){let n=je(e);if(n.endsWith(".json")){let o=await zt(n,"utf8");return JSON.parse(o)}return co({configPath:n})}i(Nt,"loadConfigFromPath");async function Bt(){let e=Ft(process.argv),n=await Nt(e.configPath);if(e.check){await so({config:n,outDir:je(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 io({config:n,outDir:je(e.outDir),verbose:e.verbose});console.log(`apollion-tokens: wrote ${o.files.length} file(s) \u2014 configHash=${o.configHash.slice(0,12)}\u2026`)}i(Bt,"main");Bt().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
|
|
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})},j=(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 k=o=>j(f({},"__esModule",{value:!0}),o);var T={};_(T,{ConfigLoadError:()=>l,defineConfig:()=>P,loadConfig:()=>z});module.exports=k(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()}).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
|
|
2
|
-
`);throw new
|
|
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:j(),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
|
+
`);throw new r(`apollion.config: schema validation failed \u2014
|
|
3
|
+
${e}`,i)}return c.data}a(v,"loadConfig");function j(){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(j,"makeReadOnlyConsole");export{r as ConfigLoadError,T as defineConfig,v as loadConfig};
|
package/lib/config-schema.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var r=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var i=(o,e)=>r(o,"name",{value:e,configurable:!0});var x=(o,e)=>{for(var t in e)r(o,t,{get:e[t],enumerable:!0})},b=(o,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of f(e))!S.call(o,n)&&n!==t&&r(o,n,{get:()=>e[n],enumerable:!(s=m(e,n))||s.enumerable});return o};var g=o=>b(r({},"__esModule",{value:!0}),o);var M={};x(M,{expandVariants:()=>z,resolveTextSizes:()=>D,variantName:()=>C});module.exports=g(M);var E=["light","dark"],T=["positive","negative"],y=["compact","normal","spacious"],A=["smaller","default","larger","largest"];function D(o){let e=[...new Set(o.textSizes??A)];if(!e.includes("default"))throw new Error(`apollion-tokens: textSizes must include 'default' (got [${e.join(", ")}])`);return e}i(D,"resolveTextSizes");function z(o){let e=o.modes??E,t=o.surfaces??T,s=o.dimensions??y,n=Object.entries(o.brands).sort(([a],[l])=>a.localeCompare(l)),d=[];for(let[a,l]of n)for(let c of e)for(let p of t)for(let u of s)d.push({brand:a,colors:l,mode:c,surface:p,dimension:u});return d}i(z,"expandVariants");function C(o){return`${o.brand}.${o.mode}.${o.surface}.${o.dimension}`}i(C,"variantName");0&&(module.exports={expandVariants,resolveTextSizes,variantName});
|
package/lib/config-schema.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var u=Object.defineProperty;var n=(o,e)=>u(o,"name",{value:e,configurable:!0});var m=["light","dark"],f=["positive","negative"],S=["compact","normal","spacious"],x=["smaller","default","larger","largest"];function g(o){let e=[...new Set(o.textSizes??x)];if(!e.includes("default"))throw new Error(`apollion-tokens: textSizes must include 'default' (got [${e.join(", ")}])`);return e}n(g,"resolveTextSizes");function E(o){let e=o.modes??m,i=o.surfaces??f,a=o.dimensions??S,l=Object.entries(o.brands).sort(([t],[s])=>t.localeCompare(s)),r=[];for(let[t,s]of l)for(let d of e)for(let c of i)for(let p of a)r.push({brand:t,colors:s,mode:d,surface:c,dimension:p});return r}n(E,"expandVariants");function T(o){return`${o.brand}.${o.mode}.${o.surface}.${o.dimension}`}n(T,"variantName");export{E as expandVariants,g as resolveTextSizes,T as variantName};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apollion-dsi/tokens",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.4.0",
|
|
4
4
|
"description": "Apollion Design System — Framework-agnostic design tokens",
|
|
5
5
|
"homepage": "https://www.apollion.com.br",
|
|
6
6
|
"license": "MIT",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"prepack": "node ../../scripts/release-preflight.js && yarn build"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
|
-
"@apollion-dsi/core": ">=4.0
|
|
62
|
+
"@apollion-dsi/core": ">=7.4.0"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"culori": "4.0.2",
|
package/src/build.ts
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
*
|
|
10
10
|
* **Output surfaces (R5):**
|
|
11
11
|
* - `dist/json/` — DTCG **Resolver**: `resolver.json` + reference-closed
|
|
12
|
-
* `sets/{base, spacing.<dimension>, font.<
|
|
12
|
+
* `sets/{base, spacing.<dimension>, font.<textSize>, <brand>.color.<mode>.<surface>}.json`
|
|
13
|
+
* (+ deprecated `font.<dimension>` aliases of `font.default`, ADR-030).
|
|
13
14
|
* Hard cutover from the old per-variant JSON (pre-4.0 GA — no consumer reads
|
|
14
15
|
* `dist/json/*` yet). One manifest + O(b·m·s + 2·d + 1) sets, not b·m·s·d docs.
|
|
15
16
|
* - `dist/css/` + `dist/ts/` — per-variant, fully resolved (unchanged).
|
|
@@ -33,13 +34,13 @@ import { mkdir, mkdtemp, readFile, rename, rm, writeFile } from 'node:fs/promise
|
|
|
33
34
|
import { tmpdir } from 'node:os';
|
|
34
35
|
import { dirname, join } from 'node:path';
|
|
35
36
|
|
|
36
|
-
import { renderCss, renderCssModes } from './renderers/css';
|
|
37
|
+
import { renderCss, renderCssModes, renderCssTextSize } from './renderers/css';
|
|
37
38
|
import { renderDesignMd } from './renderers/design-md';
|
|
38
39
|
import { renderBaseSet, renderColorSet, renderFontSet, renderResolver, renderSpacingSet } from './renderers/resolver';
|
|
39
40
|
import { renderTailwindPreset, renderTwMergeExtension } from './renderers/tailwind';
|
|
40
41
|
import { renderTs } from './renderers/ts';
|
|
41
42
|
import type { ApollionConfig, Variant } from './config-schema';
|
|
42
|
-
import { expandVariants, variantName } from './config-schema';
|
|
43
|
+
import { expandVariants, resolveTextSizes, variantName } from './config-schema';
|
|
43
44
|
import type { IRSlice } from './ir';
|
|
44
45
|
import { assertSlicesMetaComplete, buildBaseIR, buildColorIR, buildFontIR, buildFullIR, buildSpacingIR } from './ir';
|
|
45
46
|
import type { BuildManifest, ManifestFileEntry } from './manifest';
|
|
@@ -81,7 +82,8 @@ export async function build(opts: BuildOptions): Promise<BuildResult> {
|
|
|
81
82
|
|
|
82
83
|
// ── JSON surface (R5): Resolver manifest + reference-closed sets ─────────
|
|
83
84
|
// Hard cutover — no per-variant JSON. The base set is axis-invariant; colour
|
|
84
|
-
// sets vary by (brand × mode × surface); spacing
|
|
85
|
+
// sets vary by (brand × mode × surface); spacing sets by dimension; font sets
|
|
86
|
+
// by text-size level (ADR-030).
|
|
85
87
|
// bg/text are dimension-invariant and spacing is brand/surface-invariant, so
|
|
86
88
|
// a single representative variant resolves each set's foundation.
|
|
87
89
|
if (output.json) {
|
|
@@ -100,12 +102,13 @@ export async function build(opts: BuildOptions): Promise<BuildResult> {
|
|
|
100
102
|
await emit(set.file, renderSpacingSet(slice, set.dimension));
|
|
101
103
|
}
|
|
102
104
|
|
|
103
|
-
// Font sets are
|
|
104
|
-
// self-contained (no foundation refs), so the slice needs only the
|
|
105
|
+
// Font sets are keyed by text-size level (ADR-030); the scale is
|
|
106
|
+
// self-contained (no foundation refs), so the slice needs only the level.
|
|
107
|
+
// Deprecated `font.<dimension>` aliases carry `textSize: 'default'`.
|
|
105
108
|
for (const set of plan.font) {
|
|
106
|
-
const slice = buildFontIR(set.
|
|
109
|
+
const slice = buildFontIR(set.textSize);
|
|
107
110
|
slices.push(slice);
|
|
108
|
-
await emit(set.file, renderFontSet(slice, set
|
|
111
|
+
await emit(set.file, renderFontSet(slice, set));
|
|
109
112
|
}
|
|
110
113
|
|
|
111
114
|
for (const set of plan.color) {
|
|
@@ -137,6 +140,13 @@ export async function build(opts: BuildOptions): Promise<BuildResult> {
|
|
|
137
140
|
}
|
|
138
141
|
}
|
|
139
142
|
|
|
143
|
+
// ── Text-size CSS (ADR-030): one `font.css` carrying every level, scoped
|
|
144
|
+
// by `data-apollion-text-size`. Per-variant files keep the `default` block. ────
|
|
145
|
+
if (output.css || output.cssModes) {
|
|
146
|
+
const levels = resolveTextSizes(config).map((level) => [level, buildFontIR(level)] as const);
|
|
147
|
+
await emit('css/font.css', renderCssTextSize(levels));
|
|
148
|
+
}
|
|
149
|
+
|
|
140
150
|
// ── Mode-scoped CSS (ADR-024): one file per (brand × surface × dimension)
|
|
141
151
|
// carrying both modes, scoped by the mode-engine attribute ─────────────────
|
|
142
152
|
if (output.cssModes) {
|
package/src/builders/layout.ts
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
* `@apollion-dsi/core/themes/layout` (ADR-025 invariant 5).
|
|
4
4
|
*
|
|
5
5
|
* Mirrors the container-size scale (the `cq` channel thresholds — px, slot
|
|
6
|
-
* widths, NOT viewport breakpoints)
|
|
7
|
-
* (`pageMaxWidth`)
|
|
6
|
+
* widths, NOT viewport breakpoints), the page-layout constants
|
|
7
|
+
* (`pageMaxWidth`), and the cross-component `z-index` stacking scale
|
|
8
|
+
* (`sticky`/`dropdown`/`toast`/`modal`, APOLLION-ZINDEX-TOKENS). Axis-invariant.
|
|
8
9
|
*
|
|
9
10
|
* @see ./colors.ts (Strangler Fig contract notes)
|
|
10
11
|
*/
|
|
11
|
-
import type { ContainerSizesInput, LayoutInput } from '@apollion-dsi/core/themes/layout';
|
|
12
|
-
import { defaultInputContainerSizes, defaultInputLayout } from '@apollion-dsi/core/themes/layout';
|
|
12
|
+
import type { ContainerSizesInput, LayoutInput, ZIndexInput } from '@apollion-dsi/core/themes/layout';
|
|
13
|
+
import { defaultInputContainerSizes, defaultInputLayout, defaultInputZIndex } from '@apollion-dsi/core/themes/layout';
|
|
13
14
|
|
|
14
15
|
/** Resolved `[key, '<value>px']` pairs of the container-size scale, ascending. */
|
|
15
16
|
export function containerSizeEntries(
|
|
@@ -22,3 +23,11 @@ export function containerSizeEntries(
|
|
|
22
23
|
export function layoutEntries(input: LayoutInput = defaultInputLayout): ReadonlyArray<readonly [string, string]> {
|
|
23
24
|
return [['page-max-width', `${input.pageMaxWidth}px`] as const];
|
|
24
25
|
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Resolved `[key, value]` pairs of the `z-index` scale (APOLLION-ZINDEX-TOKENS,
|
|
29
|
+
* plan §5) — raw numbers, no unit (`z-index` is unitless by spec).
|
|
30
|
+
*/
|
|
31
|
+
export function zIndexEntries(input: ZIndexInput = defaultInputZIndex): ReadonlyArray<readonly [string, number]> {
|
|
32
|
+
return Object.entries(input) as ReadonlyArray<readonly [string, number]>;
|
|
33
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* **Validation surface (intentional, opinionated):**
|
|
9
9
|
* - `brands`: Record<string, ColorsInput> — at least 1 entry; each ColorsInput
|
|
10
10
|
* requires `deepDark` + `deepLight` (used by mixOklch).
|
|
11
|
-
* - `modes`, `surfaces`, `dimensions`: optional arrays; if provided, each entry
|
|
11
|
+
* - `modes`, `surfaces`, `dimensions`, `textSizes`: optional arrays; if provided, each entry
|
|
12
12
|
* matches one of the literal sets.
|
|
13
13
|
* - `output`: optional flags object; unknown keys allowed (forward-compat).
|
|
14
14
|
*
|
|
@@ -51,6 +51,15 @@ export const ApollionConfigSchema = z
|
|
|
51
51
|
modes: z.array(z.enum(['light', 'dark'])).optional(),
|
|
52
52
|
surfaces: z.array(z.enum(['positive', 'negative'])).optional(),
|
|
53
53
|
dimensions: z.array(z.enum(['compact', 'normal', 'spacious'])).optional(),
|
|
54
|
+
textSizes: z
|
|
55
|
+
.array(z.enum(['smaller', 'default', 'larger', 'largest']))
|
|
56
|
+
.refine((levels) => levels.includes('default'), {
|
|
57
|
+
message: "apollion.config.mjs: textSizes must include 'default'",
|
|
58
|
+
})
|
|
59
|
+
.refine((levels) => new Set(levels).size === levels.length, {
|
|
60
|
+
message: 'apollion.config.mjs: textSizes must not repeat a level',
|
|
61
|
+
})
|
|
62
|
+
.optional(),
|
|
54
63
|
output: z
|
|
55
64
|
.object({
|
|
56
65
|
runtime: z.boolean().optional(),
|
package/src/config-schema.ts
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import type { ColorsInput } from '@apollion-dsi/core/themes/colors';
|
|
17
17
|
import type { Dimension } from '@apollion-dsi/core/themes/dimension';
|
|
18
|
+
import type { TextSize } from '@apollion-dsi/core/themes/text-size';
|
|
18
19
|
|
|
19
20
|
export type Mode = 'light' | 'dark';
|
|
20
21
|
export type Surface = 'positive' | 'negative';
|
|
@@ -70,6 +71,16 @@ export interface ApollionConfig {
|
|
|
70
71
|
modes?: Mode[];
|
|
71
72
|
surfaces?: Surface[];
|
|
72
73
|
dimensions?: Dimension[];
|
|
74
|
+
/**
|
|
75
|
+
* Text-size levels to emit (ADR-030) — `font.<textSize>` sets and the
|
|
76
|
+
* `css/font.css` overrides. Independent of `dimensions` (not a variant axis:
|
|
77
|
+
* per-variant CSS/TS carry `default`). Must include `default` (the
|
|
78
|
+
* per-variant level and the target of the deprecated `font.<dimension>`
|
|
79
|
+
* aliases); duplicates are ignored.
|
|
80
|
+
*
|
|
81
|
+
* @default ['smaller', 'default', 'larger', 'largest']
|
|
82
|
+
*/
|
|
83
|
+
textSizes?: TextSize[];
|
|
73
84
|
output?: ApollionOutputFlags;
|
|
74
85
|
}
|
|
75
86
|
|
|
@@ -88,6 +99,21 @@ export interface Variant {
|
|
|
88
99
|
const DEFAULT_MODES: readonly Mode[] = ['light', 'dark'];
|
|
89
100
|
const DEFAULT_SURFACES: readonly Surface[] = ['positive', 'negative'];
|
|
90
101
|
const DEFAULT_DIMENSIONS: readonly Dimension[] = ['compact', 'normal', 'spacious'];
|
|
102
|
+
const DEFAULT_TEXT_SIZES: readonly TextSize[] = ['smaller', 'default', 'larger', 'largest'];
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The text-size levels a config emits — declaration order, duplicates dropped,
|
|
106
|
+
* default all four. Throws when the list is empty or lacks `default`: the
|
|
107
|
+
* per-variant files, the `font.css` `:root` block and the deprecated
|
|
108
|
+
* `font.<dimension>` aliases all resolve to `default`, so it must exist.
|
|
109
|
+
*/
|
|
110
|
+
export function resolveTextSizes(config: ApollionConfig): readonly TextSize[] {
|
|
111
|
+
const levels = [...new Set(config.textSizes ?? DEFAULT_TEXT_SIZES)];
|
|
112
|
+
if (!levels.includes('default')) {
|
|
113
|
+
throw new Error(`apollion-tokens: textSizes must include 'default' (got [${levels.join(', ')}])`);
|
|
114
|
+
}
|
|
115
|
+
return levels;
|
|
116
|
+
}
|
|
91
117
|
|
|
92
118
|
/**
|
|
93
119
|
* Expand config to all (brand × mode × surface × dimension) tuples.
|