@razorwind/tamagui 0.0.55 → 0.0.56

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/dist/index.cjs CHANGED
@@ -1,14 +1,14 @@
1
1
  Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});let e=require("@razorwind/core/plugin"),t=require("@razorwind/core/utils"),n=require("node:path"),r=require("@razorwind/core/lib/fonts");function i(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
- `,`\\n`).replaceAll(`\r`,`\\r`)}function a(e){return typeof e==`string`?`"${i(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function o(e,n){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if((0,t.isObject)(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return(0,t.formatTokenValue)(e,n)}const s=/^(?:font-size|fontSize)(?:\.|$)/i,c=/^(?:font-weight|fontWeight)(?:\.|$)/i,l=/^shadow(?:\.|$)/i,u=/^inset-shadow(?:\.|$)/i,d=/^drop-shadow(?:\.|$)/i,f=/^text-shadow(?:\.|$)/i,p=/^(?:blur|blur-?radius)(?:\.|$)/i,m=new Set([`color`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`]),h=[{prefix:/^(?:color|colours?|palette)(?:\.|$)/i,category:`color`},{prefix:s,category:`fontSize`},{prefix:c,category:`fontWeight`},{prefix:d,category:`dropShadow`},{prefix:u,category:`insetShadow`},{prefix:f,category:`textShadow`},{prefix:l,category:`shadow`},{prefix:p,category:`blur`},{prefix:/^(?:space|spacing|gap)(?:\.|$)/i,category:`space`},{prefix:/^inset(?:\.|$)/i,category:`space`},{prefix:/^(?:size|sizing)(?:\.|$)/i,category:`size`},{prefix:/^(?:radius|rounded|radii)(?:\.|$)/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)(?:\.|$)/i,category:`zIndex`}];function g(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function _(e){return e===!0||e===`true`||e===1}function v(e){return _(e.palette)||_(e.$palette)?!0:T(e)===`palette`}function ee(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function y(e){return e===!0||e===`true`||e===1}function b(e){return y(e.primitive)||y(e.$primitive)?!0:T(e)===`primitive`}function x(e,t){return(e===`primitive`||e===`$primitive`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function S(e,t){return(e===`theme`||e===`$theme`)&&typeof t==`string`}function C(e){if(typeof e.theme==`string`&&e.theme.length>0)return e.theme;if(typeof e.$theme==`string`&&e.$theme.length>0)return e.$theme}function w(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function T(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function E(e){if(`$value`in e)return e.$value;if(`value`in e)return e.value;if(typeof e.$ref==`string`)return e.$ref;if(typeof e.ref==`string`)return e.ref}function te(e,t){for(let{prefix:t,category:n}of h)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`shadow`)return u.test(e)?`insetShadow`:d.test(e)?`dropShadow`:f.test(e)?`textShadow`:`shadow`;if(t===`dimension`){if(s.test(e))return`fontSize`;if(p.test(e))return`blur`;if(/(?:^|\.)(?:space|spacing|gap)(?:\.|$)/i.test(e)||/(?:^|\.)inset(?:\.|$)/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/(?:^|\.)(?:size|sizing)(?:\.|$)/i.test(e)||/(?:^|\.)(?:width|height)(?:\.|$)/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`;if(t===`fontWeight`||c.test(e))return`fontWeight`}function D(e){return e.flatMap(e=>e.split(/[-_\s]+/)).filter(Boolean).map((e,t)=>{if(/^\d/.test(e))return e;let n=e.toLowerCase();return t===0?n:`${n.charAt(0).toUpperCase()}${n.slice(1)}`}).join(``)}function ne(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|primitive|space|spacing|gap|inset|shadow|inset-shadow|drop-shadow|text-shadow|font-size|fontSize|font-weight|fontWeight|size|sizing|radius|rounded|radii|z-?index|zindex|elevation|blur)$/i.test(n)&&t.shift();let r=t.length>0?t:e.split(`.`).slice(-1);return r.length===1&&/^(?:DEFAULT|default)$/i.test(r[0]??``)?`true`:D(r)}function O(e,n,r,i,a,s,c){if(!(0,t.isObject)(e))return;let l=a||b(e)||v(e),u=T(e,r),d=C(e)??s;if(g(e)){let r=E(e),a=n.join(`.`),s=te(a,u)??(l||u===`primitive`||u===`palette`?`color`:void 0),f=(0,t.formatTokenValue)(r,u),p=s&&m.has(s)||u===`color`||u===`palette`||u===`primitive`||u===`shadow`?f:o(r,u);c.push({path:a,type:u===`palette`||u===`primitive`?`color`:u,value:r,cssValue:f,tamaguiValue:p,category:s,tokenKey:s?ne(a):void 0,description:w(e),theme:i,...d?{childTheme:d}:{},...l?{primitive:!0}:{}});return}for(let[t,r]of Object.entries(e))t.startsWith(`$`)&&t!==`$palette`&&t!==`$primitive`||ee(t,r)||x(t,r)||S(t,r)||O(r,[...n,t],u,i,l,d,c)}function re(e,n={}){let r=n.includeTypes?new Set(n.includeTypes):void 0,i=[];for(let n of(0,t.resolveTokenSets)(e)){let e=n.id==="default"?void 0:n.id;O(n.tokens,[],void 0,e,!1,void 0,i)}return r?i.filter(e=>!e.type||r.has(e.type)):i}const ie=/^\{([^{}]+)\}$/,ae=/^(?:typography|type|text)$/i,oe=/^(?:font|fonts|font-family|fontFamily)$/i,se=/^(?:font-size|fontSize)$/i,ce=/^(?:font-weight|fontWeight)$/i,le=/^(?:line-height|lineHeight|leading)$/i,ue=/^(?:letter-spacing|letterSpacing|tracking)$/i,de=/^(?:[a-z]{2}(?:-[A-Z]{2})?|cn|zh|jp|ja|kr|ko|ar|he|th|hi|ru|french|mandarin|chinese|japanese|korean|arabic|hebrew)$/i,fe=[`fontFamily`,`font-family`,`family`],pe=[`fontSize`,`font-size`,`size`],me=[`fontWeight`,`font-weight`,`weight`],he=[`lineHeight`,`line-height`,`leading`],ge=[`letterSpacing`,`letter-spacing`,`tracking`],_e={1:12,2:14,3:16,4:18,5:20,6:24,7:28,8:32,9:40,10:48};function k(e){if(typeof e==`string`)return ie.exec(e.trim())?.[1]?.trim()}function A(e,t){let n=k(e);if(!n)return e;let r=t.get(n),i=new Set([n]);for(let e=0;e<8&&r;e++){let e=k(r.value);if(!e||i.has(e))return r.value;i.add(e),r=t.get(e)}return r?.value??e}function j(e,t){for(let n of t)if(e[n]!==void 0&&e[n]!==null)return e[n]}function ve(e){return(e.split(`,`)[0]?.trim()??e).replaceAll(/^["']|["']$/g,``)}function M(e){if(typeof e==`string`){let t=e.trim();return t.length===0||k(t)?void 0:t}if(Array.isArray(e)&&e.every(e=>typeof e==`string`)){let t=e.map(e=>e.trim()).filter(Boolean);return t.length>0?t.join(`, `):void 0}}function ye(e){return Number.isInteger(e)?e:Math.round(e*1e3)/1e3}function N(e){if(e==null)return;let t=o(e);if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=/^(-?\d+(?:\.\d+)?)%$/.exec(t.trim());if(e)return Number.parseFloat(e[1])/100}}function be(e){if(typeof e==`number`&&Number.isFinite(e))return String(e);if(typeof e==`string`){let t=e.trim();if(t.length===0||k(t))return;let n=Number(t);return Number.isNaN(n)?t:String(n)}let t=o(e);if(typeof t==`number`&&Number.isFinite(t))return String(t);if(typeof t==`string`&&t.length>0)return t}function xe(e,t){let n=N(e);if(n!=null)return ye(t!=null&&n>0&&n<=4?n*t:n)}function P(e,t){return t.test(e.split(`.`)[0]??``)}function Se(e){return e.split(`.`).filter(Boolean).at(-1)??e}function F(e,t){let n=e.split(`.`).filter(Boolean);return n[0]&&t.test(n[0])&&n.shift(),n}function I(e){let t=e.flatMap(e=>e.split(`-`)).filter(Boolean);return t.length===0?`body`:t.map((e,t)=>t===0?`${e.charAt(0).toLowerCase()}${e.slice(1)}`:`${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(``)}function L(e){switch(e.toLowerCase()){case`sans`:case`body`:case`serif`:return`body`;case`monospace`:case`mono`:return`mono`;default:return I([e])}}function Ce(e){return e.role?L(e.role):L(e.name)}function we(e){let t=F(e,ae);if(t.length===0)return`body`;let n=t.at(-1);return n&&t.length>=2&&de.test(n)&&!n.includes(`_`)?`${t.slice(0,-1).join(`-`)}_${n}`:t.join(`-`)}function Te(e){return L(F(e,oe)[0]??Se(e))}function Ee(e,t){let n=F(e,t);return n.length===0||n.length===1&&/^(?:DEFAULT|default)$/i.test(n[0])?`true`:I(n)}function De(e){return e.type===`typography`&&(0,t.isObject)(e.value)}function Oe(e){return e.category===`fontSize`||e.category===`fontWeight`||ke(e)||Ae(e)||je(e)||Me(e)?!1:e.type===`fontFamily`||P(e.path,oe)}function ke(e){return e.category===`fontSize`||P(e.path,se)}function Ae(e){return e.category===`fontWeight`||e.type===`fontWeight`||P(e.path,ce)}function je(e){return P(e.path,le)}function Me(e){return P(e.path,ue)}function Ne(e,t){if(!e.has(t))return t;let n=2,r=`${t}${n}`;for(;e.has(r);)n++,r=`${t}${n}`;return r}function Pe(e){let t=new Map;for(let n of Object.values(e)){let e=Ce(n);t.has(e)&&(e=Ne(t,I([n.name]))),t.set(e,n)}return t}function Fe(e,t,n){if(!e)return;let i=Object.values(e);if(i.length===0)return;if(n){let e=n.split(`.`).filter(Boolean).at(-1);if(e){let t=i.find(t=>t.role===e||t.name.toLowerCase()===e.toLowerCase());if(t)return t}}if(!t)return;let a=ve(t).toLowerCase();return i.find(e=>(0,r.fontFamilyName)(e).toLowerCase()===a||e.title.toLowerCase()===a||e.name.toLowerCase()===a)}function Ie(e){let t=new Map;for(let r of e.files){let e=String(r.weight??400),i=(0,n.basename)(r.path).replace(/\.[^.]+$/,``),a=t.get(e)??{};r.style===`italic`||r.style===`oblique`?a.italic=i:a.normal=i,t.set(e,a)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${a(t.normal)}`),t.italic&&n.push(`italic: ${a(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
3
- `)}\n }`}function R(e,t){return{...e,webFamily:(0,r.cssFontFamily)(t),nativeFamily:(0,r.fontFamilyName)(t),face:t.source===`local`?Ie(t):e.face}}function z(e){return{key:e,webFamily:`system-ui, sans-serif`,nativeFamily:`system-ui`,size:{},lineHeight:{},weight:{},letterSpacing:{}}}function Le(e,t){return{...e,webFamily:t,nativeFamily:ve(t)}}const Re=/^(?:font-size|fontSize|font-weight|fontWeight|line-height|lineHeight|leading|letter-spacing|letterSpacing|tracking)$/i;function B(e,t){let n={true:e},r=k(t);if(!r)return n;let i=Ee(r,Re);return i&&i!==`true`&&(n[i]=e),n}function ze(e){return Object.keys(e.size).length>0?e:{...e,size:{..._e}}}function Be(e,n,r,i){if(!(0,t.isObject)(n.value))return e;let a=j(n.value,fe),o=k(a),s=M(A(a,r)),c=Fe(i,s,o),l=e;c?l=R(l,c):s&&(l=Le(l,s));let u=j(n.value,pe),d=N(A(u,r));d!=null&&(l={...l,size:B(d,u)});let f=j(n.value,me),p=be(A(f,r));p&&(l={...l,weight:B(p,f)});let m=j(n.value,ge),h=N(A(m,r));h!=null&&(l={...l,letterSpacing:B(h,m)});let g=j(n.value,he),_=xe(A(g,r),l.size.true??d);return _!=null&&(l={...l,lineHeight:B(_,g)}),Ve(l)}function Ve(e){let t=Object.keys(e.size);if(t.length===0)return e;let n=e=>{let n=e.true??Object.values(e)[0];if(n==null)return e;let r={...e};for(let e of t)r[e]??=n;return r};return{...e,lineHeight:Object.keys(e.lineHeight).length>0?n(e.lineHeight):e.lineHeight,weight:Object.keys(e.weight).length>0?n(e.weight):e.weight,letterSpacing:Object.keys(e.letterSpacing).length>0?n(e.letterSpacing):e.letterSpacing}}function V(e,t){let n=new Map(e.map(e=>[e.path,e])),r=new Map,i=e=>{r.set(e.key,e)};if(t)for(let[e,n]of Pe(t))i(R(z(e),n));for(let a of e){if(!Oe(a)||De(a))continue;let e=Te(a.path),o=M(A(a.value,n)),s=r.get(e)??z(e),c=Fe(t,o,a.path),l=s;c?l=R(l,c):(o&&s.webFamily===z(e).webFamily||o&&!r.has(e))&&(l=Le(l,o)),i(l)}for(let a of e){if(!De(a))continue;let e=we(a.path);i(Be(r.get(e)??z(e),a,n,t))}return[...r.values()].map(ze).toSorted((e,t)=>e.key.localeCompare(t.key))}function He(e){return/^\d+$/.test(e)||/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}function H(e,t=4){let n=` `.repeat(t),r=` `.repeat(Math.max(t-2,0)),i=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return i.length===0?`{}`:`{\n${i.map(([e,t])=>`${n}${He(e)}: ${a(t)}`).join(`,
4
- `)}\n${r}}`}function U(e,t){let n=`${e.split(`-`).filter(Boolean).map((e,t)=>t===0?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(``).replaceAll(/[^\w$]/g,``)||`font${t}`}Font`;return/^[A-Z_$]/i.test(n)?n:`font${t}`}function Ue(e,t){let n=a(e.webFamily),r=a(e.nativeFamily),i=[n===r?` family: ${n}`:` family: isWeb ? ${n} : ${r}`,` size: ${H(e.size)}`];return Object.keys(e.lineHeight).length>0&&i.push(` lineHeight: ${H(e.lineHeight)}`),Object.keys(e.weight).length>0&&i.push(` weight: ${H(e.weight)}`),Object.keys(e.letterSpacing).length>0&&i.push(` letterSpacing: ${H(e.letterSpacing)}`),e.face&&i.push(` face: ${e.face}`),`const ${t} = createFont({\n${i.join(`,
5
- `)}\n});`}function W(e){return`# Installing Tamagui Config
2
+ `,`\\n`).replaceAll(`\r`,`\\r`)}function a(e){return typeof e==`string`?`"${i(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function o(e,n){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if((0,t.isObject)(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return(0,t.formatTokenValue)(e,n)}const s=/^(?:font-size|fontSize)(?:\.|$)/i,c=/^(?:font-weight|fontWeight)(?:\.|$)/i,l=/^shadow(?:\.|$)/i,u=/^inset-shadow(?:\.|$)/i,d=/^drop-shadow(?:\.|$)/i,f=/^text-shadow(?:\.|$)/i,p=/^(?:blur|blur-?radius)(?:\.|$)/i,m=new Set([`color`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`]),h=[{prefix:/^(?:color|colours?|palette)(?:\.|$)/i,category:`color`},{prefix:s,category:`fontSize`},{prefix:c,category:`fontWeight`},{prefix:d,category:`dropShadow`},{prefix:u,category:`insetShadow`},{prefix:f,category:`textShadow`},{prefix:l,category:`shadow`},{prefix:p,category:`blur`},{prefix:/^(?:space|spacing|gap)(?:\.|$)/i,category:`space`},{prefix:/^inset(?:\.|$)/i,category:`space`},{prefix:/^(?:size|sizing)(?:\.|$)/i,category:`size`},{prefix:/^(?:radius|rounded|radii)(?:\.|$)/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)(?:\.|$)/i,category:`zIndex`}];function g(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function _(e){return e===!0||e===`true`||e===1}function v(e){return _(e.palette)||_(e.$palette)?!0:T(e)===`palette`}function ee(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function y(e){return e===!0||e===`true`||e===1}function b(e){return y(e.primitive)||y(e.$primitive)?!0:T(e)===`primitive`}function x(e,t){return(e===`primitive`||e===`$primitive`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function S(e,t){return(e===`theme`||e===`$theme`)&&typeof t==`string`}function C(e){if(typeof e.theme==`string`&&e.theme.length>0)return e.theme;if(typeof e.$theme==`string`&&e.$theme.length>0)return e.$theme}function w(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function T(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function E(e){if(`$value`in e)return e.$value;if(`value`in e)return e.value;if(typeof e.$ref==`string`)return e.$ref;if(typeof e.ref==`string`)return e.ref}function te(e,t){for(let{prefix:t,category:n}of h)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`shadow`)return u.test(e)?`insetShadow`:d.test(e)?`dropShadow`:f.test(e)?`textShadow`:`shadow`;if(t===`dimension`){if(s.test(e))return`fontSize`;if(p.test(e))return`blur`;if(/(?:^|\.)(?:space|spacing|gap)(?:\.|$)/i.test(e)||/(?:^|\.)inset(?:\.|$)/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/(?:^|\.)(?:size|sizing)(?:\.|$)/i.test(e)||/(?:^|\.)(?:width|height)(?:\.|$)/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`;if(t===`fontWeight`||c.test(e))return`fontWeight`}function D(e){return e.flatMap(e=>e.split(/[-_\s]+/)).filter(Boolean).map((e,t)=>{if(/^\d/.test(e))return e;let n=e.toLowerCase();return t===0?n:`${n.charAt(0).toUpperCase()}${n.slice(1)}`}).join(``)}function ne(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|primitive|space|spacing|gap|inset|shadow|inset-shadow|drop-shadow|text-shadow|font-size|fontSize|font-weight|fontWeight|size|sizing|radius|rounded|radii|z-?index|zindex|elevation|blur)$/i.test(n)&&t.shift();let r=t.length>0?t:e.split(`.`).slice(-1);return r.length===1&&/^(?:DEFAULT|default)$/i.test(r[0]??``)?`true`:D(r)}function O(e,n,r,i,a,s,c){if(!(0,t.isObject)(e))return;let l=a||b(e)||v(e),u=T(e,r),d=C(e)??s;if(g(e)){let r=E(e),a=n.join(`.`),s=te(a,u)??(l||u===`primitive`||u===`palette`?`color`:void 0),f=(0,t.formatTokenValue)(r,u),p=s&&m.has(s)||u===`color`||u===`palette`||u===`primitive`||u===`shadow`?f:o(r,u);c.push({path:a,type:u===`palette`||u===`primitive`?`color`:u,value:r,cssValue:f,tamaguiValue:p,category:s,tokenKey:s?ne(a):void 0,description:w(e),theme:i,...d?{childTheme:d}:{},...l?{primitive:!0}:{}});return}for(let[t,r]of Object.entries(e))t.startsWith(`$`)&&t!==`$palette`&&t!==`$primitive`||ee(t,r)||x(t,r)||S(t,r)||O(r,[...n,t],u,i,l,d,c)}function k(e,n={}){let r=n.includeTypes?new Set(n.includeTypes):void 0,i=[];for(let n of(0,t.resolveTokenSets)(e)){let e=n.id==="default"?void 0:n.id;O(n.tokens,[],void 0,e,!1,void 0,i)}return r?i.filter(e=>!e.type||r.has(e.type)):i}const re=/^\{([^{}]+)\}$/,ie=/^(?:typography|type|text)$/i,A=/^(?:font|fonts|font-family|fontFamily)$/i,ae=/^(?:font-size|fontSize)$/i,oe=/^(?:font-weight|fontWeight)$/i,se=/^(?:line-height|lineHeight|leading)$/i,ce=/^(?:letter-spacing|letterSpacing|tracking)$/i,le=/^(?:[a-z]{2}(?:-[A-Z]{2})?|cn|zh|jp|ja|kr|ko|ar|he|th|hi|ru|french|mandarin|chinese|japanese|korean|arabic|hebrew)$/i,ue=[`fontFamily`,`font-family`,`family`],de=[`fontSize`,`font-size`,`size`],fe=[`fontWeight`,`font-weight`,`weight`],pe=[`lineHeight`,`line-height`,`leading`],me=[`letterSpacing`,`letter-spacing`,`tracking`],he={1:12,2:14,3:16,4:18,5:20,6:24,7:28,8:32,9:40,10:48};function j(e){if(typeof e==`string`)return re.exec(e.trim())?.[1]?.trim()}function M(e,t){let n=j(e);if(!n)return e;let r=t.get(n),i=new Set([n]);for(let e=0;e<8&&r;e++){let e=j(r.value);if(!e||i.has(e))return r.value;i.add(e),r=t.get(e)}return r?.value??e}function N(e,t){for(let n of t)if(e[n]!==void 0&&e[n]!==null)return e[n]}function ge(e){return(e.split(`,`)[0]?.trim()??e).replaceAll(/^["']|["']$/g,``)}function _e(e){if(typeof e==`string`){let t=e.trim();return t.length===0||j(t)?void 0:t}if(Array.isArray(e)&&e.every(e=>typeof e==`string`)){let t=e.map(e=>e.trim()).filter(Boolean);return t.length>0?t.join(`, `):void 0}}function ve(e){return Number.isInteger(e)?e:Math.round(e*1e3)/1e3}function P(e){if(e==null)return;let t=o(e);if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=/^(-?\d+(?:\.\d+)?)%$/.exec(t.trim());if(e)return Number.parseFloat(e[1])/100}}function ye(e){if(typeof e==`number`&&Number.isFinite(e))return String(e);if(typeof e==`string`){let t=e.trim();if(t.length===0||j(t))return;let n=Number(t);return Number.isNaN(n)?t:String(n)}let t=o(e);if(typeof t==`number`&&Number.isFinite(t))return String(t);if(typeof t==`string`&&t.length>0)return t}function be(e,t){let n=P(e);if(n!=null)return ve(t!=null&&n>0&&n<=4?n*t:n)}function F(e,t){return t.test(e.split(`.`)[0]??``)}function xe(e){return e.split(`.`).filter(Boolean).at(-1)??e}function I(e,t){let n=e.split(`.`).filter(Boolean);return n[0]&&t.test(n[0])&&n.shift(),n}function L(e){let t=e.flatMap(e=>e.split(`-`)).filter(Boolean);return t.length===0?`body`:t.map((e,t)=>t===0?`${e.charAt(0).toLowerCase()}${e.slice(1)}`:`${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(``)}function R(e){switch(e.toLowerCase()){case`sans`:case`body`:case`serif`:return`body`;case`monospace`:case`mono`:return`mono`;default:return L([e])}}function Se(e){return e.role?R(e.role):R(e.name)}function Ce(e){let t=I(e,ie);if(t.length===0)return`body`;let n=t.at(-1);return n&&t.length>=2&&le.test(n)&&!n.includes(`_`)?`${t.slice(0,-1).join(`-`)}_${n}`:t.join(`-`)}function we(e){return R(I(e,A)[0]??xe(e))}function Te(e,t){let n=I(e,t);return n.length===0||n.length===1&&/^(?:DEFAULT|default)$/i.test(n[0])?`true`:L(n)}function Ee(e){return e.type===`typography`&&(0,t.isObject)(e.value)}function De(e){return e.category===`fontSize`||e.category===`fontWeight`||Oe(e)||ke(e)||Ae(e)||je(e)?!1:e.type===`fontFamily`||F(e.path,A)}function Oe(e){return e.category===`fontSize`||F(e.path,ae)}function ke(e){return e.category===`fontWeight`||e.type===`fontWeight`||F(e.path,oe)}function Ae(e){return F(e.path,se)}function je(e){return F(e.path,ce)}function Me(e,t){if(!e.has(t))return t;let n=2,r=`${t}${n}`;for(;e.has(r);)n++,r=`${t}${n}`;return r}function Ne(e){let t=new Map;for(let n of Object.values(e)){let e=Se(n);t.has(e)&&(e=Me(t,L([n.name]))),t.set(e,n)}return t}function Pe(e,t,n){if(!e)return;let i=Object.values(e);if(i.length===0)return;if(n){let e=n.split(`.`).filter(Boolean).at(-1);if(e){let t=i.find(t=>t.role===e||t.name.toLowerCase()===e.toLowerCase());if(t)return t}}if(!t)return;let a=ge(t).toLowerCase();return i.find(e=>(0,r.fontFamilyName)(e).toLowerCase()===a||e.title.toLowerCase()===a||e.name.toLowerCase()===a)}function Fe(e){let t=new Map;for(let r of e.files){let e=String(r.weight??400),i=(0,n.basename)(r.path).replace(/\.[^.]+$/,``),a=t.get(e)??{};r.style===`italic`||r.style===`oblique`?a.italic=i:a.normal=i,t.set(e,a)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${a(t.normal)}`),t.italic&&n.push(`italic: ${a(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
3
+ `)}\n }`}function z(e,t){return{...e,webFamily:(0,r.cssFontFamily)(t),nativeFamily:(0,r.fontFamilyName)(t),face:t.source===`local`?Fe(t):e.face}}function B(e){return{key:e,webFamily:`system-ui, sans-serif`,nativeFamily:`system-ui`,size:{},lineHeight:{},weight:{},letterSpacing:{}}}function Ie(e,t){return{...e,webFamily:t,nativeFamily:ge(t)}}const Le=/^(?:font-size|fontSize|font-weight|fontWeight|line-height|lineHeight|leading|letter-spacing|letterSpacing|tracking)$/i;function V(e,t){let n={true:e},r=j(t);if(!r)return n;let i=Te(r,Le);return i&&i!==`true`&&(n[i]=e),n}function Re(e){return Object.keys(e.size).length>0?e:{...e,size:{...he}}}function ze(e,n,r,i){if(!(0,t.isObject)(n.value))return e;let a=N(n.value,ue),o=j(a),s=_e(M(a,r)),c=Pe(i,s,o),l=e;c?l=z(l,c):s&&(l=Ie(l,s));let u=N(n.value,de),d=P(M(u,r));d!=null&&(l={...l,size:V(d,u)});let f=N(n.value,fe),p=ye(M(f,r));p&&(l={...l,weight:V(p,f)});let m=N(n.value,me),h=P(M(m,r));h!=null&&(l={...l,letterSpacing:V(h,m)});let g=N(n.value,pe),_=be(M(g,r),l.size.true??d);return _!=null&&(l={...l,lineHeight:V(_,g)}),Be(l)}function Be(e){let t=Object.keys(e.size);if(t.length===0)return e;let n=e=>{let n=e.true??Object.values(e)[0];if(n==null)return e;let r={...e};for(let e of t)r[e]??=n;return r};return{...e,lineHeight:Object.keys(e.lineHeight).length>0?n(e.lineHeight):e.lineHeight,weight:Object.keys(e.weight).length>0?n(e.weight):e.weight,letterSpacing:Object.keys(e.letterSpacing).length>0?n(e.letterSpacing):e.letterSpacing}}function Ve(e,t){let n=new Map(e.map(e=>[e.path,e])),r=new Map,i=e=>{r.set(e.key,e)};if(t)for(let[e,n]of Ne(t))i(z(B(e),n));for(let a of e){if(!De(a)||Ee(a))continue;let e=we(a.path),o=_e(M(a.value,n)),s=r.get(e)??B(e),c=Pe(t,o,a.path),l=s;c?l=z(l,c):(o&&s.webFamily===B(e).webFamily||o&&!r.has(e))&&(l=Ie(l,o)),i(l)}for(let a of e){if(!Ee(a))continue;let e=Ce(a.path);i(ze(r.get(e)??B(e),a,n,t))}return[...r.values()].map(Re).toSorted((e,t)=>e.key.localeCompare(t.key))}function He(e){return/^\d+$/.test(e)||/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}function H(e,t=4){let n=` `.repeat(t),r=` `.repeat(Math.max(t-2,0)),i=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return i.length===0?`{}`:`{\n${i.map(([e,t])=>`${n}${He(e)}: ${a(t)}`).join(`,
4
+ `)}\n${r}}`}function Ue(e,t){let n=`${e.split(`-`).filter(Boolean).map((e,t)=>t===0?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(``).replaceAll(/[^\w$]/g,``)||`font${t}`}Font`;return/^[A-Z_$]/i.test(n)?n:`font${t}`}function We(e,t){let n=a(e.webFamily),r=a(e.nativeFamily),i=[n===r?` family: ${n}`:` family: isWeb ? ${n} : ${r}`,` size: ${H(e.size)}`];return Object.keys(e.lineHeight).length>0&&i.push(` lineHeight: ${H(e.lineHeight)}`),Object.keys(e.weight).length>0&&i.push(` weight: ${H(e.weight)}`),Object.keys(e.letterSpacing).length>0&&i.push(` letterSpacing: ${H(e.letterSpacing)}`),e.face&&i.push(` face: ${e.face}`),`const ${t} = createFont({\n${i.join(`,
5
+ `)}\n});`}function Ge(e){return`# Installing Tamagui Config
6
6
 
7
7
  Generated by \`@razorwind/tamagui\`.
8
8
 
9
9
  ## Files
10
10
 
11
- - \`${e.outputPath}\` — Tamagui config (\`createTamagui\` + \`createTheme\` with light, dark, and nested semantic themes)
11
+ - \`${e.outputPath}\` — Tamagui config (\`createTamagui\` + \`createThemes\` with light, dark, and nested semantic themes)
12
12
 
13
13
  ## Setup
14
14
 
@@ -48,11 +48,39 @@ export function App() {
48
48
  ## Regenerate
49
49
 
50
50
  Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligned with your design system.
51
- `}const We=new Set([`default`,`light`,`theme`]),Ge=/^base(?:[A-Z]\w*|[._-].+)?$/i,Ke=/^ring(?:\.|$)/i,qe={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function Je(e){return We.has(e)}function Ye(e){return e===`dark`}function G(e,t){let n=new Map,r=t===`dark`?Ye:Je;for(let t of e){let e=t.theme?.toLowerCase();(!e||Ge.test(e))&&n.set(t.path,t)}for(let t of e){let e=t.theme?.toLowerCase();e&&r(e)&&n.set(t.path,t)}return[...n.values()]}function Xe(e){return Ke.test(e.path)&&e.category===`shadow`}const Ze=new Set([`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`]);function Qe(e){return!e.primitive&&!!e.tokenKey&&(e.type===`shadow`||e.category!=null&&Ze.has(e.category))}const $e=new Set([`fontSize`,`blur`]),et=[`space`,`size`,`radius`,`zIndex`,`blur`,`fontSize`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`,`fontWeight`];function tt(e){return/^px\(-?\d/.test(e)}function nt(e){if(e.category===`radius`&&e.tokenKey?.startsWith(`borderRadius`)){let t=e.tokenKey.replace(/^borderRadius/,``);return t?D([t]):e.tokenKey}return e.tokenKey??``}function rt(e,t){let n=$(e,t.byPath,t.byCssVar).tamaguiValue;if(e.category&&$e.has(e.category)&&typeof n==`number`)return`px(${n})`;if(typeof n==`string`){let r=Q(n,t);return e.category===`dropShadow`?it(r):r}return n}function it(e){return e.includes(`drop-shadow(`)?e:e.split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.replace(/^inset\s+/i,``).split(/\s+/);if(t.length>=5){let[e,n,r]=t;return`drop-shadow(${e} ${n} ${r} ${t.slice(4).join(` `)})`}return`drop-shadow(${e.replace(/^inset\s+/i,``)})`}).join(` `)}function at(e){let t={},n=pt(e);for(let r of e){if(!r.category||r.category===`color`||!r.tokenKey||Xe(r))continue;let e=nt(r);if(!e)continue;let i=rt(r,n);if(typeof i==`string`&&gt(i))continue;let a=t[r.category]??{};a[e]=i,t[r.category]=a}return t}function K(e){let t=e.path.replace(/^color\./i,``).replaceAll(`.`,``);return e.theme?`${e.theme}${t[0]?.toUpperCase()??``}${t.slice(1)}`:t}function q(e){return`tokens.color.${e}.val`}function ot(e,t){let n={},r=(e,t)=>{let r=t.cssValue;typeof r!=`string`||r.length===0||ht(r)||r===`[object Object]`||(n[e]=r)};for(let t of e)t.tokenKey&&(t.primitive?r(K(t),t):r(t.tokenKey,t));for(let e of t)!e.tokenKey||!e.primitive||r(K(e),e);return n}function J(e,t,n,r){let i=n[r];if(typeof i!=`string`)return!1;let a=Z(e,t);return a!=null&&a===i}function st(e,t,n){if(e.tokenKey&&J(e,t,n,e.tokenKey))return q(e.tokenKey);let r=$(e,t.byPath,t.byCssVar);if(r.tokenKey&&J(e,t,n,r.tokenKey))return q(r.tokenKey);if(r.primitive){let i=K(r);if(J(e,t,n,i))return q(i)}let i=Z(e,t);if(i)return a(i)}function Y(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=typeof t==`string`&&tt(t)?t:a(t);return`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: ${r}`}).join(`,
52
- `)}\n${` `.repeat(Math.max(t-2,0))}}`}function ct(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: ${t}`).join(`,
53
- `)}\n${` `.repeat(Math.max(t-2,0))}}`}const lt=/^\{([^{}]+)\}$/,ut=/\{([^{}]+)\}/g,dt=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/,ft=/var\((--[^),\s]+)(?:\s*,[^)]*)?\)/g;function pt(e){return{byPath:new Map(e.map(e=>[e.path,e])),byCssVar:new Map(e.map(e=>[(0,t.toThemeCssVar)(e.path),e]))}}function mt(e){if(typeof e==`string`)return lt.exec(e.trim())?.[1]?.trim()}function X(e){if(typeof e==`string`)return dt.exec(e.trim())?.[1]}function ht(e){return mt(e)!=null||X(e)!=null}function gt(e){return/var\(|\{[^{}]+\}/.test(e)}function Z(e,t){let n=$(e,t.byPath,t.byCssVar);if(n.category!=null&&n.category!==`color`)return;let r=[n.cssValue,n.tamaguiValue];for(let e of r)if(typeof e==`string`&&e.length>0&&!ht(e))return e}function Q(e,t){return e.replace(ut,(e,n)=>{let r=t.byPath.get(n.trim());return r?Z(r,t)??e:e}).replace(ft,(e,n)=>{let r=t.byCssVar.get(n);return r?Z(r,t)??e:e})}function $(e,t,n){let r=e,i=new Set;for(let e=0;e<8;e++){if(i.has(r.path))return r;i.add(r.path);let e=mt(r.value);if(e){let n=t.get(e);if(!n||n.path===r.path)return r;r=n;continue}let a=X(r.value)??X(r.cssValue)??X(r.tamaguiValue);if(a){let e=n.get(a);if(!e||e.path===r.path)return r;r=e;continue}return r}return r}function _t(e,t){let n=t.toLowerCase(),r=e.split(/(?=[A-Z])/).filter(Boolean).filter(e=>e.toLowerCase()!==n);if(r.length!==0)return D(r)}function vt(e){return e.category===`color`&&!e.primitive&&!!e.tokenKey}function yt(e){return Qe(e)&&D(e.path.split(`.`).filter(Boolean))||e.tokenKey}function bt(e){let t=e.toLowerCase();return Je(t)||Ye(t)}function xt(e,t,n){let r=yt(t);if(!r)return;let i=t.childTheme?.trim();if(!i||bt(i)){e.base[r]=n;return}let a=D([i]),o=_t(r,a);if(!o)return;let s=e.children[a]??{};s[o]=n,e.children[a]=s}function St(e,t){let n=typeof e.tamaguiValue==`string`?e.tamaguiValue:e.cssValue;if(typeof n!=`string`||n.length===0)return;let r=Q(n,t);return r.length===0||gt(r)?void 0:a(e.category===`dropShadow`?it(r):r)}function Ct(e,t){let n=pt(e),r={base:{},children:{}};for(let i of e){if(vt(i)){let e=st(i,n,t);e&&xt(r,i,e);continue}if(!Qe(i))continue;let e=St(i,n);if(!e)continue;let a=i.childTheme?.trim();(a&&!bt(a)||Xe(i))&&xt(r,i,e)}return r}function wt(e){let t=new Set;for(let n of e){for(let e of Object.keys(n.base))t.add(e);for(let e of Object.values(n.children))for(let n of Object.keys(e))t.add(n)}return[...t].toSorted((e,t)=>e.localeCompare(t,void 0,{numeric:!0}))}function Tt(e){return` ${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: string;`}function Et(e,t){if(e.length!==0)return[`/**`,` * Theme values available on \`useTheme()\` and \`$\` style props for the ${t.specName||`design system`}.`,` *`," * Derived from semantic color tokens mapped by `createTheme`. Nested"," * themes (`light_primary`, `dark_danger`, …) come from each token's"," * `theme` / `$theme` property.",` *`,` * @see https://tamagui.dev/docs/intro/themes`,` */`,`export interface AppTheme {`,...e.map(Tt),`}`,``]}function Dt(e,t){return`${e}_${t}`}function Ot(e){return Object.keys(e).length>0}function kt(e,t){return`const ${e} = createTheme(${ct(t,2)});`}function At(e,t,n){let r=[],i=[],o=(e,t,n=!1)=>{if(!n&&!Ot(t))return;r.push(kt(e,t));let o=/^[A-Z_$][\w$]*$/i.test(e)?e:a(e);i.push(o===e?` ${e}`:` ${o}: ${e}`)},s=[...new Set([...Object.keys(e.children),...Object.keys(t.children)])].toSorted((e,t)=>e.localeCompare(t));o(`light`,e.base,s.length>0),n&&o(`dark`,t.base,s.length>0);for(let r of s){let i=e.children[r]??t.children[r]??{};if(o(Dt(`light`,r),i),n){let n=t.children[r]??e.children[r]??{};o(Dt(`dark`,r),n)}}return i.length===0?{statements:[],hasThemes:!1}:(r.push(``,`const themes = {\n${i.join(`,
54
- `)}\n};`),{statements:r,hasThemes:!0})}function jt(e,t,n={}){let r=e.fonts??{},i=n.useDefaultConfig===!0,o=n.animations??`css`,s=n.includeTypeAugmentation!==!1,c=t.filter(e=>e.category===`color`),l=G(c,`light`),u=G(c,`dark`),d=u.length>0,f=ot(l,u),p=G(t,`light`),m=d?G(t,`dark`):p,h=Ct(p,f),g=Ct(m,f),{statements:_,hasThemes:v}=At(h,g,d),ee=Et(wt(d?[h,g]:[h]),{specName:e.name}),y=at(p),b=[];Object.keys(f).length>0&&b.push(` color: ${Y(f,4)}`);for(let e of et){let t=y[e];t&&Object.keys(t).length>0&&b.push(` ${e}: ${Y(t,4)}`)}let x=[`import { isWeb } from '@tamagui/constants';`];i&&x.push(`import { defaultConfig } from "@tamagui/config/v5";`),o!==!1&&x.push(`import { animations } from "${qe[o]}";`),n.importConfig&&x.push(`import userConfig from "${n.importConfig}";`);let S=[`createTamagui`,`px`];b.length>0&&S.push(`createTokens`),v&&S.push(`createTheme`);let C=V(t,r);C.length>0&&S.push(`createFont`),x.push(`import { ${S.join(`, `)} } from "@tamagui/core";`);let w=[`/* eslint-disable */`,``,`/*`,` * Generated by @razorwind/tamagui — Do not edit by hand.`,` * `,` * @see https://tamagui.dev/docs/core/configuration`,` * @see https://tamagui.dev/docs/intro/themes`,` */`,``,...x,``];b.length>0&&w.push(`const tokens = createTokens({`,b.join(`,
55
- `),`});`,``),_.length>0&&w.push(..._,``);let T=new Map;if(C.length>0)for(let[e,t]of C.entries()){let n=U(t.key,e);T.set(t.key,n),w.push(Ue(t,n),``)}let E=[];if(i&&E.push(` ...defaultConfig`),o!==!1&&E.push(` animations`),b.length>0&&(i?E.push(` tokens: {
51
+ `}const Ke=new Set([`default`,`light`,`theme`]),qe=/^base(?:[A-Z]\w*|[._-].+)?$/i,Je=/^ring(?:\.|$)/i,Ye={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function Xe(e){return Ke.has(e)}function Ze(e){return e===`dark`}function U(e,t){let n=new Map,r=t===`dark`?Ze:Xe;for(let t of e){let e=t.theme?.toLowerCase();(!e||qe.test(e))&&n.set(t.path,t)}for(let t of e){let e=t.theme?.toLowerCase();e&&r(e)&&n.set(t.path,t)}return[...n.values()]}function Qe(e){return Je.test(e.path)&&e.category===`shadow`}const $e=new Set([`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`]);function et(e){return!e.primitive&&!!e.tokenKey&&(e.type===`shadow`||e.category!=null&&$e.has(e.category))}const tt=new Set([`fontSize`,`blur`]),nt=[`space`,`size`,`radius`,`zIndex`,`blur`,`fontSize`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`,`fontWeight`];function rt(e){return/^px\(-?\d/.test(e)}function it(e){if(e.category===`radius`&&e.tokenKey?.startsWith(`borderRadius`)){let t=e.tokenKey.replace(/^borderRadius/,``);return t?D([t]):e.tokenKey}return e.tokenKey??``}function at(e,t){let n=Q(e,t.byPath,t.byCssVar).tamaguiValue;if(e.category&&tt.has(e.category)&&typeof n==`number`)return`px(${n})`;if(typeof n==`string`){let r=Et(n,t);return e.category===`dropShadow`?ot(r):r}return n}function ot(e){return e.includes(`drop-shadow(`)?e:e.split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.replace(/^inset\s+/i,``).split(/\s+/);if(t.length>=5){let[e,n,r]=t;return`drop-shadow(${e} ${n} ${r} ${t.slice(4).join(` `)})`}return`drop-shadow(${e.replace(/^inset\s+/i,``)})`}).join(` `)}function st(e){let t={},n=St(e);for(let r of e){if(!r.category||r.category===`color`||!r.tokenKey||Qe(r))continue;let e=it(r);if(!e)continue;let i=at(r,n);if(typeof i==`string`&&Tt(i))continue;let a=t[r.category]??{};a[e]=i,t[r.category]=a}return t}function W(e){let t=e.path.replace(/^color\./i,``).replaceAll(`.`,``);return e.theme?`${e.theme}${t[0]?.toUpperCase()??``}${t.slice(1)}`:t}function G(e){return`tokens.color.${e}.val`}const ct=[`base`,`gray`,`grey`,`neutral`],lt=[`accent`,`brand`],ut=[`"#ffffff"`,`"#000000"`],dt=[`"#000000"`,`"#ffffff"`];function ft(e){if(e.category!==`color`||!e.primitive)return;let t=e.path.replace(/^color\./i,``).split(`.`).filter(Boolean),n=t.at(-1);if(!n||t.length<2)return;let r=Number(n);if(Number.isFinite(r))return{name:t.slice(0,-1).join(`.`).toLowerCase(),step:r}}function pt(e,t){let n=W(e);if(n in t)return G(n);let r=typeof e.cssValue==`string`&&e.cssValue.length>0?e.cssValue:typeof e.tamaguiValue==`string`?e.tamaguiValue:void 0;return r?a(r):`"#000000"`}function mt(e,t,n){let r=new Map;for(let t of e){let e=ft(t);if(!e)continue;let i=r.get(e.name)??[];i.push({step:e.step,expression:pt(t,n)}),r.set(e.name,i)}for(let e of t){let t=r.get(e);if(!t||t.length===0)continue;let n=new Map;for(let e of t.toSorted((e,t)=>e.step-t.step))n.set(e.step,e.expression);return[...n.values()]}}function K(e,t){return e.length>=2?e:e.length===1?[e[0],t[1]??`"#000000"`]:[...t]}function ht(e,t,n,r,i,a){let o=mt(e,n,r),s=mt(t,n,r);if(o&&s)return{light:K(o,i),dark:K(s,a)};if(o){let e=K(o,i);return{light:e,dark:[...e].toReversed()}}if(s){let e=K(s,a);return{light:[...e].toReversed(),dark:e}}return{light:[...i],dark:[...a]}}function gt(e,t){let n={},r=(e,t)=>{let r=t.cssValue;typeof r!=`string`||r.length===0||wt(r)||r===`[object Object]`||(n[e]=r)};for(let t of e)t.tokenKey&&(t.primitive?r(W(t),t):r(t.tokenKey,t));for(let e of t)!e.tokenKey||!e.primitive||r(W(e),e);return n}function q(e,t,n,r){let i=n[r];if(typeof i!=`string`)return!1;let a=Z(e,t);return a!=null&&a===i}function _t(e,t,n){if(e.tokenKey&&q(e,t,n,e.tokenKey))return G(e.tokenKey);let r=Q(e,t.byPath,t.byCssVar);if(r.tokenKey&&q(e,t,n,r.tokenKey))return G(r.tokenKey);if(r.primitive){let i=W(r);if(q(e,t,n,i))return G(i)}let i=Z(e,t);if(i)return a(i)}function J(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=typeof t==`string`&&rt(t)?t:a(t);return`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: ${r}`}).join(`,
52
+ `)}\n${` `.repeat(Math.max(t-2,0))}}`}function Y(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: ${t}`).join(`,
53
+ `)}\n${` `.repeat(Math.max(t-2,0))}}`}const vt=/^\{([^{}]+)\}$/,yt=/\{([^{}]+)\}/g,bt=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/,xt=/var\((--[^),\s]+)(?:\s*,[^)]*)?\)/g;function St(e){return{byPath:new Map(e.map(e=>[e.path,e])),byCssVar:new Map(e.map(e=>[(0,t.toThemeCssVar)(e.path),e]))}}function Ct(e){if(typeof e==`string`)return vt.exec(e.trim())?.[1]?.trim()}function X(e){if(typeof e==`string`)return bt.exec(e.trim())?.[1]}function wt(e){return Ct(e)!=null||X(e)!=null}function Tt(e){return/var\(|\{[^{}]+\}/.test(e)}function Z(e,t){let n=Q(e,t.byPath,t.byCssVar);if(n.category!=null&&n.category!==`color`)return;let r=[n.cssValue,n.tamaguiValue];for(let e of r)if(typeof e==`string`&&e.length>0&&!wt(e))return e}function Et(e,t){return e.replace(yt,(e,n)=>{let r=t.byPath.get(n.trim());return r?Z(r,t)??e:e}).replace(xt,(e,n)=>{let r=t.byCssVar.get(n);return r?Z(r,t)??e:e})}function Q(e,t,n){let r=e,i=new Set;for(let e=0;e<8;e++){if(i.has(r.path))return r;i.add(r.path);let e=Ct(r.value);if(e){let n=t.get(e);if(!n||n.path===r.path)return r;r=n;continue}let a=X(r.value)??X(r.cssValue)??X(r.tamaguiValue);if(a){let e=n.get(a);if(!e||e.path===r.path)return r;r=e;continue}return r}return r}function Dt(e,t){let n=t.toLowerCase(),r=e.split(/(?=[A-Z])/).filter(Boolean).filter(e=>e.toLowerCase()!==n);if(r.length!==0)return D(r)}function Ot(e){return e.category===`color`&&!e.primitive&&!!e.tokenKey}function kt(e){return et(e)&&D(e.path.split(`.`).filter(Boolean))||e.tokenKey}function At(e){let t=e.toLowerCase();return Xe(t)||Ze(t)}function jt(e,t,n){let r=kt(t);if(!r)return;let i=t.childTheme?.trim();if(!i||At(i)){e.base[r]=n;return}let a=D([i]),o=Dt(r,a);if(!o)return;let s=e.children[a]??{};s[o]=n,e.children[a]=s}function Mt(e,t){let n=typeof e.tamaguiValue==`string`?e.tamaguiValue:e.cssValue;if(typeof n!=`string`||n.length===0)return;let r=Et(n,t);return r.length===0||Tt(r)?void 0:a(e.category===`dropShadow`?ot(r):r)}function Nt(e,t){let n=St(e),r={base:{},children:{}};for(let i of e){if(Ot(i)){let e=_t(i,n,t);e&&jt(r,i,e);continue}if(!et(i))continue;let e=Mt(i,n);if(!e)continue;let a=i.childTheme?.trim();(a&&!At(a)||Qe(i))&&jt(r,i,e)}return r}function Pt(e){let t=new Set;for(let n of e){for(let e of Object.keys(n.base))t.add(e);for(let e of Object.values(n.children))for(let n of Object.keys(e))t.add(n)}return[...t].toSorted((e,t)=>e.localeCompare(t,void 0,{numeric:!0}))}function Ft(e){return` ${/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}: string;`}function It(e,t){if(e.length!==0)return[`/**`,` * Theme values available on \`useTheme()\` and \`$\` style props for the ${t.specName||`design system`}.`,` *`," * Derived from semantic color tokens mapped by `createThemes`. Nested"," * themes (`light_primary`, `dark_danger`, …) come from each token's"," * `theme` / `$theme` property.",` *`,` * @see https://tamagui.dev/docs/intro/themes`,` */`,`export interface AppTheme {`,...e.map(Ft),`}`,``]}function Lt(e){return Object.keys(e).length>0}function Rt(e){return/^[A-Z_$][\w$]*$/i.test(e)?e:a(e)}function zt(e,t){let n=` `.repeat(t),r=` `.repeat(Math.max(t-2,0));return`[\n${e.map(e=>`${n}${e}`).join(`,
54
+ `)}\n${r}]`}function $(e,t,n){let r=` `.repeat(n),i=` `.repeat(Math.max(n-2,0)),a=n+2;return`{
55
+ ${r}light: ${zt(e,a)},
56
+ ${r}dark: ${zt(t,a)}
57
+ ${i}}`}function Bt(e,t,n){let r=` `.repeat(n),i=` `.repeat(Math.max(n-2,0)),a=n+2;return`{
58
+ ${r}light: ${Y(e,a)},
59
+ ${r}dark: ${Y(t,a)}
60
+ ${i}}`}function Vt(e,t){let n=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));if(n.length===0)return`{}`;let r=` `.repeat(t),i=` `.repeat(Math.max(t-2,0)),a=t+2;return`{\n${n.map(([e,t])=>`${r}${Rt(e)}: ${Y(t,a)}`).join(`,
61
+ `)}\n${i}}`}function Ht(e,t){let n=` `.repeat(t),r=` `.repeat(Math.max(t-2,0));return`{\n${e.map(e=>`${n}${Rt(e)}: {}`).join(`,
62
+ `)}\n${r}}`}function Ut(e,t){return`const childThemeExtras: {
63
+ light: Record<string, Record<string, string>>;
64
+ dark: Record<string, Record<string, string>>;
65
+ } = {
66
+ light: ${Vt(e,4)},
67
+ dark: ${Vt(t,4)}
68
+ };`}function Wt(e,t,n){return Object.fromEntries(n.map(n=>[n,e.children[n]??t.children[n]??{}]))}function Gt(e,t,n,r,i){let a=[...new Set([...Object.keys(e.children),...Object.keys(t.children)])].toSorted((e,t)=>e.localeCompare(t)),o=a.includes(`accent`),s=a.filter(e=>e!==`accent`),c=Lt(e.base)||Lt(t.base);if(!c&&a.length===0)return{statements:[],hasThemes:!1};let l=ht(r,i,ct,n,ut,dt),u=ht(r,i,lt,n,l.light,l.dark),d=[],f=[` componentThemes: false`],p=[` palette: ${$(l.light,l.dark,6)}`];if(c&&p.push(` extra: ${Bt(e.base,t.base,6)}`),f.push(` base: {\n${p.join(`,
69
+ `)}\n }`),o){let n=e.children.accent??t.children.accent??{},r=t.children.accent??e.children.accent??{};f.push(` accent: {
70
+ palette: ${$(u.light,u.dark,6)},
71
+ extra: ${Bt(n,r,6)}
72
+ }`)}if(s.length>0){let n=Wt(e,t,s),r=Wt(t,e,s);d.push(Ut(n,r),``),f.push(` childrenThemes: ${Ht(s,4)}`);let i=o?` || child === "accent"`:``;f.push(` getTheme: ({ name, theme, scheme }) => {
73
+ const child = name.replace(/^(?:light|dark)_/, "");
74
+ if (child === name${i}) {
75
+ return theme;
76
+ }
77
+
78
+ const extras = childThemeExtras[scheme ?? "light"][child];
79
+
80
+ return extras ? { ...theme, ...extras } : theme;
81
+ }`)}return d.push(`const themes = createThemes({\n${f.join(`,
82
+ `)}\n});`),{statements:d,hasThemes:!0}}function Kt(e,t,n={}){let r=e.fonts??{},i=n.useDefaultConfig===!0,o=n.animations??`css`,s=n.includeTypeAugmentation!==!1,c=t.filter(e=>e.category===`color`),l=U(c,`light`),u=U(c,`dark`),d=u.length>0,f=gt(l,u),p=U(t,`light`),m=d?U(t,`dark`):p,h=Nt(p,f),g=Nt(m,f),{statements:_,hasThemes:v}=Gt(h,g,f,l,u),ee=It(Pt(d?[h,g]:[h]),{specName:e.name}),y=st(p),b=[];Object.keys(f).length>0&&b.push(` color: ${J(f,4)}`);for(let e of nt){let t=y[e];t&&Object.keys(t).length>0&&b.push(` ${e}: ${J(t,4)}`)}let x=[`import { isWeb } from '@tamagui/constants';`];i&&x.push(`import { defaultConfig } from "@tamagui/config/v5";`),o!==!1&&x.push(`import { animations } from "${Ye[o]}";`),n.importConfig&&x.push(`import userConfig from "${n.importConfig}";`),v&&x.push(`import { createThemes } from "@tamagui/theme-builder";`);let S=[`createTamagui`,`px`];b.length>0&&S.push(`createTokens`);let C=Ve(t,r);C.length>0&&S.push(`createFont`),x.push(`import { ${S.join(`, `)} } from "@tamagui/core";`);let w=[`/* eslint-disable */`,``,`/*`,` * Generated by @razorwind/tamagui — Do not edit by hand.`,` * `,` * @see https://tamagui.dev/docs/core/configuration`,` * @see https://tamagui.dev/docs/intro/themes`,` * @see https://tamagui.dev/docs/guides/theme-builder`,` */`,``,...x,``];b.length>0&&w.push(`const tokens = createTokens({`,b.join(`,
83
+ `),`});`,``),_.length>0&&w.push(..._,``);let T=new Map;if(C.length>0)for(let[e,t]of C.entries()){let n=Ue(t.key,e);T.set(t.key,n),w.push(We(t,n),``)}let E=[];if(i&&E.push(` ...defaultConfig`),o!==!1&&E.push(` animations`),b.length>0&&(i?E.push(` tokens: {
56
84
  ...defaultConfig.tokens,
57
85
  ...tokens,
58
86
  space: {
@@ -78,11 +106,11 @@ Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligne
78
106
  }`):E.push(` fonts: {
79
107
  ${e.join(`,
80
108
  `)}
81
- }`)}return n.shorthands&&E.push(` shorthands: ${Y(n.shorthands,4)}`),n.media&&E.push(` media: ${a(n.media)}`),n.defaultFont&&E.push(` defaultFont: ${a(n.defaultFont)}`),w.push(``,...ee??[],`/**
109
+ }`)}return n.shorthands&&E.push(` shorthands: ${J(n.shorthands,4)}`),n.media&&E.push(` media: ${a(n.media)}`),n.defaultFont&&E.push(` defaultFont: ${a(n.defaultFont)}`),w.push(``,...ee??[],`/**
82
110
  * The Tamagui config for the ${e.name||`design system`}.
83
111
  *
84
112
  * @see https://tamagui.dev/docs/core/configuration
85
113
  */
86
114
  export const config = createTamagui({`,E.join(`,
87
115
  `),n.importConfig?`, ...userConfig `:``,`});`,``,`export type AppConfig = typeof config;`,``),s&&w.push(`declare module "@tamagui/core" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),w.push(`export default config;`,``),w.join(`
88
- `)}function Mt(e,r={}){let i=e.tokens&&Object.keys(e.tokens).length>0,a=e.fonts&&Object.keys(e.fonts).length>0;if(!i&&!a)return{};let o=i?re(e.tokens,r):[];if(o.length===0&&!a)return{};let s=r.outputPath??`tamagui.config.ts`,c=jt(e,o,r),l=r.installGuide??W({outputPath:s}),u=(0,n.join)((0,n.dirname)(s),`INSTALL.md`);return{[s]:(0,t.createDocument)(s,c,{name:`razorwind-tamagui`},!1,`typescript`),[u]:(0,t.createDocument)(u,l,{name:`razorwind-tamagui`},!1,`markdown`)}}var Nt=(0,e.definePlugin)(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>Mt(t,e??{})}));exports.collectTamaguiFonts=V,exports.default=Nt,exports.flattenTokens=re,exports.fontVarName=U,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return t.formatTokenValue}}),exports.generateTamaguiConfig=Mt,exports.isPaletteGroup=v,exports.renderInstallMd=W,exports.renderTamaguiConfig=jt,exports.resolveTokenCategory=te,exports.resolveTokenSets=t.resolveTokenSets,exports.tamaguiFontKeyFromRole=L,exports.toCamelCaseKey=D,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return t.toCssVar}}),exports.toTamaguiValue=o,exports.toTokenKey=ne,exports.typographyFontKey=we;
116
+ `)}function qt(e,r={}){let i=e.tokens&&Object.keys(e.tokens).length>0,a=e.fonts&&Object.keys(e.fonts).length>0;if(!i&&!a)return{};let o=i?k(e.tokens,r):[];if(o.length===0&&!a)return{};let s=r.outputPath??`tamagui.config.ts`,c=Kt(e,o,r),l=r.installGuide??Ge({outputPath:s}),u=(0,n.join)((0,n.dirname)(s),`INSTALL.md`);return{[s]:(0,t.createDocument)(s,c,{name:`razorwind-tamagui`},!1,`typescript`),[u]:(0,t.createDocument)(u,l,{name:`razorwind-tamagui`},!1,`markdown`)}}var Jt=(0,e.definePlugin)(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>qt(t,e??{})}));exports.collectTamaguiFonts=Ve,exports.default=Jt,exports.flattenTokens=k,exports.fontVarName=Ue,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return t.formatTokenValue}}),exports.generateTamaguiConfig=qt,exports.isPaletteGroup=v,exports.renderInstallMd=Ge,exports.renderTamaguiConfig=Kt,exports.resolveTokenCategory=te,exports.resolveTokenSets=t.resolveTokenSets,exports.tamaguiFontKeyFromRole=R,exports.toCamelCaseKey=D,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return t.toCssVar}}),exports.toTamaguiValue=o,exports.toTokenKey=ne,exports.typographyFontKey=Ce;
package/dist/index.d.cts CHANGED
@@ -22,7 +22,7 @@ interface TamaguiPluginOptions {
22
22
  * Output path written relative to the execution cwd.
23
23
  *
24
24
  * Light and dark schemes are always written to this single file — Tamagui
25
- * `createTheme` encodes both as `light` / `dark` plus nested children.
25
+ * `createThemes` encodes both as `light` / `dark` plus nested children.
26
26
  *
27
27
  * @defaultValue `"tamagui.config.ts"`
28
28
  */
@@ -108,7 +108,7 @@ interface FlatToken {
108
108
  */
109
109
  childTheme?: string;
110
110
  /**
111
- * True when an ancestor group is marked as a primitive (`primitive: true` or `$type: "primitive"` or `$type: "palette"`). Those scales feed `createTokens({ color })` and are skipped when building semantic `createTheme` objects.
111
+ * True when an ancestor group is marked as a primitive (`primitive: true` or `$type: "primitive"` or `$type: "palette"`). Those scales feed `createTokens({ color })` and `createThemes` palettes, and are skipped when building semantic extras.
112
112
  */
113
113
  primitive?: boolean;
114
114
  }
@@ -219,7 +219,7 @@ declare function renderInstallMd(options: {
219
219
  /**
220
220
  * Render a Tamagui config module from flattened design tokens.
221
221
  *
222
- * Light and dark token sets become `createTheme` objects. Semantic colors with
222
+ * Light and dark token sets become `createThemes` extra maps. Semantic colors with
223
223
  * a `theme` / `$theme` property are nested as `light_<name>` / `dark_<name>`,
224
224
  * with the theme name stripped from the token key. Each typography token is
225
225
  * emitted as its own `createFont` entry with that token's size, line height,
@@ -238,15 +238,16 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
238
238
  //#region src/index.d.ts
239
239
  /**
240
240
  * Razorwind plugin that turns design tokens into a Tamagui config
241
- * (`createTamagui` + `createTokens` + `createTheme` + `createFont`).
241
+ * (`createTamagui` + `createTokens` + `createThemes` + `createFont`).
242
242
  *
243
243
  * Light and dark token sets are emitted as a single config. Semantic colors
244
244
  * and shadows (not marked `palette` / `primitive`) that declare `theme` /
245
- * `$theme` become nested Tamagui themes (`light_primary`, `dark_danger`, …),
246
- * with the theme name stripped from the token key (`backgroundPrimarySubtle` +
247
- * `theme: "primary"` `backgroundSubtle`; `ringPrimarySubtle` `ringSubtle`
248
- * on `primary`). Untagged semantic colors land on the `light` / `dark` base
249
- * themes. Primitive palettes stay on `createTokens({ color })`.
245
+ * `$theme` become nested Tamagui themes via `createThemes` from
246
+ * `@tamagui/theme-builder` (`light_primary`, `dark_danger`, …), with the theme
247
+ * name stripped from the token key (`backgroundPrimarySubtle` + `theme: "primary"`
248
+ * `backgroundSubtle`; `ringPrimarySubtle` `ringSubtle` on `primary`).
249
+ * Untagged semantic colors land on `base.extra`. Primitive palettes stay on
250
+ * `createTokens({ color })` and feed `base.palette` / `accent.palette`.
250
251
  *
251
252
  * Typography tokens (`$type: "typography"`) each emit their own Tamagui
252
253
  * `createFont` entry with that token's size, line height, and weight. Font
@@ -255,6 +256,7 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
255
256
  *
256
257
  * @see https://tamagui.dev/docs/core/configuration
257
258
  * @see https://tamagui.dev/docs/intro/themes
259
+ * @see https://tamagui.dev/docs/guides/theme-builder
258
260
  * @see https://tamagui.dev/docs/core/font-language#font-tokens
259
261
  *
260
262
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/flatten.ts","../src/fonts.ts","../src/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":";;;;;;;;;;;KA0BY;;;;KAMA;;;;UAkBK;;;;;;;;;EASf;;;;;;;EAQA,aAAa;;;;;;EAOb,aAAa;;;;;;EAOb,QAAQ;;;;EAKR;;;;EAKA;;;;;;;;EASA;;;;;EAMA,eAAe;;;;;;;EAQf;;;;;EAMA;;;;;UAMe;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;;;;EAKA;;;;EAIA;;;;;;;;;iBChEc,eAAe,MAAM;;;;iBAyGrB,qBACd,cACA,gBACC;;;;;;;iBAoEa,eAAe;;;;;;;;iBA0Bf,WAAW;;;;iBA2GX,cACd,QAAQ,SAAS,eAAe,SAChC,UAAS,KAAK,wCACb;;;;;;;;;UCrUc;;EAEf;;EAEA;;EAEA;EACA,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,eAAe;;EAEf;;;;;;;;;iBA4Lc,uBAAuB;;;;;;;;;iBAiCvB,kBAAkB;;;;;;;iBA2WlB,oBACd,QAAQ,aACR,QAAQ,QACP;;;;;;iBAsFa,YAAY,aAAa;;;;;;;;;iBC/rBzB,eAAe,gBAAgB;;;;;;;;iBCnC/B,gBAAgB;EAAW;;;;;;;;;;;;;;;;;iBCi0B3B,oBACd,MAAM,QACN,QAAQ,aACR,UAAS;;;;iBA4NK,sBACd,MAAM,QACN,UAAS,uBACR,wBAAwB,QAAQ"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/flatten.ts","../src/fonts.ts","../src/format.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":";;;;;;;;;;;KA0BY;;;;KAMA;;;;UAkBK;;;;;;;;;EASf;;;;;;;EAQA,aAAa;;;;;;EAOb,aAAa;;;;;;EAOb,QAAQ;;;;EAKR;;;;EAKA;;;;;;;;EASA;;;;;EAMA,eAAe;;;;;;;EAQf;;;;;EAMA;;;;;UAMe;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA,WAAW;;EAEX;;EAEA;;EAEA;;;;;EAKA;;;;EAIA;;;;;;;;;iBChEc,eAAe,MAAM;;;;iBAyGrB,qBACd,cACA,gBACC;;;;;;;iBAoEa,eAAe;;;;;;;;iBA0Bf,WAAW;;;;iBA2GX,cACd,QAAQ,SAAS,eAAe,SAChC,UAAS,KAAK,wCACb;;;;;;;;;UCrUc;;EAEf;;EAEA;;EAEA;EACA,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,eAAe;;EAEf;;;;;;;;;iBA4Lc,uBAAuB;;;;;;;;;iBAiCvB,kBAAkB;;;;;;;iBA2WlB,oBACd,QAAQ,aACR,QAAQ,QACP;;;;;;iBAsFa,YAAY,aAAa;;;;;;;;;iBC/rBzB,eAAe,gBAAgB;;;;;;;;iBCnC/B,gBAAgB;EAAW;;;;;;;;;;;;;;;;;iBC6kC3B,oBACd,MAAM,QACN,QAAQ,aACR,UAAS;;;;iBAgOK,sBACd,MAAM,QACN,UAAS,uBACR,wBAAwB,QAAQ"}
package/dist/index.d.mts CHANGED
@@ -22,7 +22,7 @@ interface TamaguiPluginOptions {
22
22
  * Output path written relative to the execution cwd.
23
23
  *
24
24
  * Light and dark schemes are always written to this single file — Tamagui
25
- * `createTheme` encodes both as `light` / `dark` plus nested children.
25
+ * `createThemes` encodes both as `light` / `dark` plus nested children.
26
26
  *
27
27
  * @defaultValue `"tamagui.config.ts"`
28
28
  */
@@ -108,7 +108,7 @@ interface FlatToken {
108
108
  */
109
109
  childTheme?: string;
110
110
  /**
111
- * True when an ancestor group is marked as a primitive (`primitive: true` or `$type: "primitive"` or `$type: "palette"`). Those scales feed `createTokens({ color })` and are skipped when building semantic `createTheme` objects.
111
+ * True when an ancestor group is marked as a primitive (`primitive: true` or `$type: "primitive"` or `$type: "palette"`). Those scales feed `createTokens({ color })` and `createThemes` palettes, and are skipped when building semantic extras.
112
112
  */
113
113
  primitive?: boolean;
114
114
  }
@@ -219,7 +219,7 @@ declare function renderInstallMd(options: {
219
219
  /**
220
220
  * Render a Tamagui config module from flattened design tokens.
221
221
  *
222
- * Light and dark token sets become `createTheme` objects. Semantic colors with
222
+ * Light and dark token sets become `createThemes` extra maps. Semantic colors with
223
223
  * a `theme` / `$theme` property are nested as `light_<name>` / `dark_<name>`,
224
224
  * with the theme name stripped from the token key. Each typography token is
225
225
  * emitted as its own `createFont` entry with that token's size, line height,
@@ -238,15 +238,16 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
238
238
  //#region src/index.d.ts
239
239
  /**
240
240
  * Razorwind plugin that turns design tokens into a Tamagui config
241
- * (`createTamagui` + `createTokens` + `createTheme` + `createFont`).
241
+ * (`createTamagui` + `createTokens` + `createThemes` + `createFont`).
242
242
  *
243
243
  * Light and dark token sets are emitted as a single config. Semantic colors
244
244
  * and shadows (not marked `palette` / `primitive`) that declare `theme` /
245
- * `$theme` become nested Tamagui themes (`light_primary`, `dark_danger`, …),
246
- * with the theme name stripped from the token key (`backgroundPrimarySubtle` +
247
- * `theme: "primary"` `backgroundSubtle`; `ringPrimarySubtle` `ringSubtle`
248
- * on `primary`). Untagged semantic colors land on the `light` / `dark` base
249
- * themes. Primitive palettes stay on `createTokens({ color })`.
245
+ * `$theme` become nested Tamagui themes via `createThemes` from
246
+ * `@tamagui/theme-builder` (`light_primary`, `dark_danger`, …), with the theme
247
+ * name stripped from the token key (`backgroundPrimarySubtle` + `theme: "primary"`
248
+ * `backgroundSubtle`; `ringPrimarySubtle` `ringSubtle` on `primary`).
249
+ * Untagged semantic colors land on `base.extra`. Primitive palettes stay on
250
+ * `createTokens({ color })` and feed `base.palette` / `accent.palette`.
250
251
  *
251
252
  * Typography tokens (`$type: "typography"`) each emit their own Tamagui
252
253
  * `createFont` entry with that token's size, line height, and weight. Font
@@ -255,6 +256,7 @@ declare function generateTamaguiConfig(spec: Schema, options?: TamaguiPluginOpti
255
256
  *
256
257
  * @see https://tamagui.dev/docs/core/configuration
257
258
  * @see https://tamagui.dev/docs/intro/themes
259
+ * @see https://tamagui.dev/docs/guides/theme-builder
258
260
  * @see https://tamagui.dev/docs/core/font-language#font-tokens
259
261
  *
260
262
  * @example
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import{definePlugin as e}from"@razorwind/core/plugin";import{createDocument as t,formatTokenValue as n,formatTokenValue as r,isObject as i,resolveTokenSets as a,toCssVar as o,toThemeCssVar as s}from"@razorwind/core/utils";import{basename as c,dirname as l,join as u}from"node:path";import{cssFontFamily as d,fontFamilyName as f}from"@razorwind/core/lib/fonts";function p(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
- `,`\\n`).replaceAll(`\r`,`\\r`)}function m(e){return typeof e==`string`?`"${p(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function h(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if(i(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return r(e,t)}const g=/^(?:font-size|fontSize)(?:\.|$)/i,_=/^(?:font-weight|fontWeight)(?:\.|$)/i,v=/^shadow(?:\.|$)/i,y=/^inset-shadow(?:\.|$)/i,b=/^drop-shadow(?:\.|$)/i,x=/^text-shadow(?:\.|$)/i,S=/^(?:blur|blur-?radius)(?:\.|$)/i,C=new Set([`color`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`]),w=[{prefix:/^(?:color|colours?|palette)(?:\.|$)/i,category:`color`},{prefix:g,category:`fontSize`},{prefix:_,category:`fontWeight`},{prefix:b,category:`dropShadow`},{prefix:y,category:`insetShadow`},{prefix:x,category:`textShadow`},{prefix:v,category:`shadow`},{prefix:S,category:`blur`},{prefix:/^(?:space|spacing|gap)(?:\.|$)/i,category:`space`},{prefix:/^inset(?:\.|$)/i,category:`space`},{prefix:/^(?:size|sizing)(?:\.|$)/i,category:`size`},{prefix:/^(?:radius|rounded|radii)(?:\.|$)/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)(?:\.|$)/i,category:`zIndex`}];function T(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function E(e){return e===!0||e===`true`||e===1}function D(e){return E(e.palette)||E(e.$palette)?!0:O(e)===`palette`}function ee(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function te(e){return e===!0||e===`true`||e===1}function ne(e){return te(e.primitive)||te(e.$primitive)?!0:O(e)===`primitive`}function re(e,t){return(e===`primitive`||e===`$primitive`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function ie(e,t){return(e===`theme`||e===`$theme`)&&typeof t==`string`}function ae(e){if(typeof e.theme==`string`&&e.theme.length>0)return e.theme;if(typeof e.$theme==`string`&&e.$theme.length>0)return e.$theme}function oe(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function O(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function se(e){if(`$value`in e)return e.$value;if(`value`in e)return e.value;if(typeof e.$ref==`string`)return e.$ref;if(typeof e.ref==`string`)return e.ref}function ce(e,t){for(let{prefix:t,category:n}of w)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`shadow`)return y.test(e)?`insetShadow`:b.test(e)?`dropShadow`:x.test(e)?`textShadow`:`shadow`;if(t===`dimension`){if(g.test(e))return`fontSize`;if(S.test(e))return`blur`;if(/(?:^|\.)(?:space|spacing|gap)(?:\.|$)/i.test(e)||/(?:^|\.)inset(?:\.|$)/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/(?:^|\.)(?:size|sizing)(?:\.|$)/i.test(e)||/(?:^|\.)(?:width|height)(?:\.|$)/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`;if(t===`fontWeight`||_.test(e))return`fontWeight`}function k(e){return e.flatMap(e=>e.split(/[-_\s]+/)).filter(Boolean).map((e,t)=>{if(/^\d/.test(e))return e;let n=e.toLowerCase();return t===0?n:`${n.charAt(0).toUpperCase()}${n.slice(1)}`}).join(``)}function le(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|primitive|space|spacing|gap|inset|shadow|inset-shadow|drop-shadow|text-shadow|font-size|fontSize|font-weight|fontWeight|size|sizing|radius|rounded|radii|z-?index|zindex|elevation|blur)$/i.test(n)&&t.shift();let r=t.length>0?t:e.split(`.`).slice(-1);return r.length===1&&/^(?:DEFAULT|default)$/i.test(r[0]??``)?`true`:k(r)}function ue(e,t,r,a,o,s,c){if(!i(e))return;let l=o||ne(e)||D(e),u=O(e,r),d=ae(e)??s;if(T(e)){let r=se(e),i=t.join(`.`),o=ce(i,u)??(l||u===`primitive`||u===`palette`?`color`:void 0),s=n(r,u),f=o&&C.has(o)||u===`color`||u===`palette`||u===`primitive`||u===`shadow`?s:h(r,u);c.push({path:i,type:u===`palette`||u===`primitive`?`color`:u,value:r,cssValue:s,tamaguiValue:f,category:o,tokenKey:o?le(i):void 0,description:oe(e),theme:a,...d?{childTheme:d}:{},...l?{primitive:!0}:{}});return}for(let[n,r]of Object.entries(e))n.startsWith(`$`)&&n!==`$palette`&&n!==`$primitive`||ee(n,r)||re(n,r)||ie(n,r)||ue(r,[...t,n],u,a,l,d,c)}function de(e,t={}){let n=t.includeTypes?new Set(t.includeTypes):void 0,r=[];for(let t of a(e)){let e=t.id==="default"?void 0:t.id;ue(t.tokens,[],void 0,e,!1,void 0,r)}return n?r.filter(e=>!e.type||n.has(e.type)):r}const fe=/^\{([^{}]+)\}$/,pe=/^(?:typography|type|text)$/i,me=/^(?:font|fonts|font-family|fontFamily)$/i,he=/^(?:font-size|fontSize)$/i,ge=/^(?:font-weight|fontWeight)$/i,_e=/^(?:line-height|lineHeight|leading)$/i,ve=/^(?:letter-spacing|letterSpacing|tracking)$/i,ye=/^(?:[a-z]{2}(?:-[A-Z]{2})?|cn|zh|jp|ja|kr|ko|ar|he|th|hi|ru|french|mandarin|chinese|japanese|korean|arabic|hebrew)$/i,be=[`fontFamily`,`font-family`,`family`],xe=[`fontSize`,`font-size`,`size`],Se=[`fontWeight`,`font-weight`,`weight`],Ce=[`lineHeight`,`line-height`,`leading`],we=[`letterSpacing`,`letter-spacing`,`tracking`],Te={1:12,2:14,3:16,4:18,5:20,6:24,7:28,8:32,9:40,10:48};function A(e){if(typeof e==`string`)return fe.exec(e.trim())?.[1]?.trim()}function j(e,t){let n=A(e);if(!n)return e;let r=t.get(n),i=new Set([n]);for(let e=0;e<8&&r;e++){let e=A(r.value);if(!e||i.has(e))return r.value;i.add(e),r=t.get(e)}return r?.value??e}function M(e,t){for(let n of t)if(e[n]!==void 0&&e[n]!==null)return e[n]}function N(e){return(e.split(`,`)[0]?.trim()??e).replaceAll(/^["']|["']$/g,``)}function P(e){if(typeof e==`string`){let t=e.trim();return t.length===0||A(t)?void 0:t}if(Array.isArray(e)&&e.every(e=>typeof e==`string`)){let t=e.map(e=>e.trim()).filter(Boolean);return t.length>0?t.join(`, `):void 0}}function Ee(e){return Number.isInteger(e)?e:Math.round(e*1e3)/1e3}function F(e){if(e==null)return;let t=h(e);if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=/^(-?\d+(?:\.\d+)?)%$/.exec(t.trim());if(e)return Number.parseFloat(e[1])/100}}function De(e){if(typeof e==`number`&&Number.isFinite(e))return String(e);if(typeof e==`string`){let t=e.trim();if(t.length===0||A(t))return;let n=Number(t);return Number.isNaN(n)?t:String(n)}let t=h(e);if(typeof t==`number`&&Number.isFinite(t))return String(t);if(typeof t==`string`&&t.length>0)return t}function Oe(e,t){let n=F(e);if(n!=null)return Ee(t!=null&&n>0&&n<=4?n*t:n)}function I(e,t){return t.test(e.split(`.`)[0]??``)}function ke(e){return e.split(`.`).filter(Boolean).at(-1)??e}function L(e,t){let n=e.split(`.`).filter(Boolean);return n[0]&&t.test(n[0])&&n.shift(),n}function R(e){let t=e.flatMap(e=>e.split(`-`)).filter(Boolean);return t.length===0?`body`:t.map((e,t)=>t===0?`${e.charAt(0).toLowerCase()}${e.slice(1)}`:`${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(``)}function z(e){switch(e.toLowerCase()){case`sans`:case`body`:case`serif`:return`body`;case`monospace`:case`mono`:return`mono`;default:return R([e])}}function Ae(e){return e.role?z(e.role):z(e.name)}function je(e){let t=L(e,pe);if(t.length===0)return`body`;let n=t.at(-1);return n&&t.length>=2&&ye.test(n)&&!n.includes(`_`)?`${t.slice(0,-1).join(`-`)}_${n}`:t.join(`-`)}function Me(e){return z(L(e,me)[0]??ke(e))}function Ne(e,t){let n=L(e,t);return n.length===0||n.length===1&&/^(?:DEFAULT|default)$/i.test(n[0])?`true`:R(n)}function Pe(e){return e.type===`typography`&&i(e.value)}function Fe(e){return e.category===`fontSize`||e.category===`fontWeight`||Ie(e)||Le(e)||Re(e)||ze(e)?!1:e.type===`fontFamily`||I(e.path,me)}function Ie(e){return e.category===`fontSize`||I(e.path,he)}function Le(e){return e.category===`fontWeight`||e.type===`fontWeight`||I(e.path,ge)}function Re(e){return I(e.path,_e)}function ze(e){return I(e.path,ve)}function Be(e,t){if(!e.has(t))return t;let n=2,r=`${t}${n}`;for(;e.has(r);)n++,r=`${t}${n}`;return r}function Ve(e){let t=new Map;for(let n of Object.values(e)){let e=Ae(n);t.has(e)&&(e=Be(t,R([n.name]))),t.set(e,n)}return t}function He(e,t,n){if(!e)return;let r=Object.values(e);if(r.length===0)return;if(n){let e=n.split(`.`).filter(Boolean).at(-1);if(e){let t=r.find(t=>t.role===e||t.name.toLowerCase()===e.toLowerCase());if(t)return t}}if(!t)return;let i=N(t).toLowerCase();return r.find(e=>f(e).toLowerCase()===i||e.title.toLowerCase()===i||e.name.toLowerCase()===i)}function Ue(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),r=c(n.path).replace(/\.[^.]+$/,``),i=t.get(e)??{};n.style===`italic`||n.style===`oblique`?i.italic=r:i.normal=r,t.set(e,i)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${m(t.normal)}`),t.italic&&n.push(`italic: ${m(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
3
- `)}\n }`}function B(e,t){return{...e,webFamily:d(t),nativeFamily:f(t),face:t.source===`local`?Ue(t):e.face}}function V(e){return{key:e,webFamily:`system-ui, sans-serif`,nativeFamily:`system-ui`,size:{},lineHeight:{},weight:{},letterSpacing:{}}}function We(e,t){return{...e,webFamily:t,nativeFamily:N(t)}}const Ge=/^(?:font-size|fontSize|font-weight|fontWeight|line-height|lineHeight|leading|letter-spacing|letterSpacing|tracking)$/i;function H(e,t){let n={true:e},r=A(t);if(!r)return n;let i=Ne(r,Ge);return i&&i!==`true`&&(n[i]=e),n}function Ke(e){return Object.keys(e.size).length>0?e:{...e,size:{...Te}}}function qe(e,t,n,r){if(!i(t.value))return e;let a=M(t.value,be),o=A(a),s=P(j(a,n)),c=He(r,s,o),l=e;c?l=B(l,c):s&&(l=We(l,s));let u=M(t.value,xe),d=F(j(u,n));d!=null&&(l={...l,size:H(d,u)});let f=M(t.value,Se),p=De(j(f,n));p&&(l={...l,weight:H(p,f)});let m=M(t.value,we),h=F(j(m,n));h!=null&&(l={...l,letterSpacing:H(h,m)});let g=M(t.value,Ce),_=Oe(j(g,n),l.size.true??d);return _!=null&&(l={...l,lineHeight:H(_,g)}),Je(l)}function Je(e){let t=Object.keys(e.size);if(t.length===0)return e;let n=e=>{let n=e.true??Object.values(e)[0];if(n==null)return e;let r={...e};for(let e of t)r[e]??=n;return r};return{...e,lineHeight:Object.keys(e.lineHeight).length>0?n(e.lineHeight):e.lineHeight,weight:Object.keys(e.weight).length>0?n(e.weight):e.weight,letterSpacing:Object.keys(e.letterSpacing).length>0?n(e.letterSpacing):e.letterSpacing}}function Ye(e,t){let n=new Map(e.map(e=>[e.path,e])),r=new Map,i=e=>{r.set(e.key,e)};if(t)for(let[e,n]of Ve(t))i(B(V(e),n));for(let a of e){if(!Fe(a)||Pe(a))continue;let e=Me(a.path),o=P(j(a.value,n)),s=r.get(e)??V(e),c=He(t,o,a.path),l=s;c?l=B(l,c):(o&&s.webFamily===V(e).webFamily||o&&!r.has(e))&&(l=We(l,o)),i(l)}for(let a of e){if(!Pe(a))continue;let e=je(a.path);i(qe(r.get(e)??V(e),a,n,t))}return[...r.values()].map(Ke).toSorted((e,t)=>e.key.localeCompare(t.key))}function Xe(e){return/^\d+$/.test(e)||/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}function U(e,t=4){let n=` `.repeat(t),r=` `.repeat(Math.max(t-2,0)),i=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return i.length===0?`{}`:`{\n${i.map(([e,t])=>`${n}${Xe(e)}: ${m(t)}`).join(`,
2
+ `,`\\n`).replaceAll(`\r`,`\\r`)}function m(e){return typeof e==`string`?`"${p(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function h(e,t){if(typeof e==`number`)return e;if(typeof e==`boolean`)return Number(e);if(i(e)&&typeof e.value==`number`&&typeof e.unit==`string`){let t=e.unit.toLowerCase();return t===`px`||t===``?e.value:t===`rem`?e.value*16:`${e.value}${e.unit}`}if(typeof e==`string`){let t=/^(-?\d+(?:\.\d+)?)px$/i.exec(e.trim());if(t)return Number(t[1]);let n=/^(-?\d+(?:\.\d+)?)rem$/i.exec(e.trim());if(n)return Number(n[1])*16;let r=Number(e);return!Number.isNaN(r)&&e.trim()!==``?r:e}return r(e,t)}const g=/^(?:font-size|fontSize)(?:\.|$)/i,_=/^(?:font-weight|fontWeight)(?:\.|$)/i,v=/^shadow(?:\.|$)/i,y=/^inset-shadow(?:\.|$)/i,b=/^drop-shadow(?:\.|$)/i,x=/^text-shadow(?:\.|$)/i,S=/^(?:blur|blur-?radius)(?:\.|$)/i,C=new Set([`color`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`]),w=[{prefix:/^(?:color|colours?|palette)(?:\.|$)/i,category:`color`},{prefix:g,category:`fontSize`},{prefix:_,category:`fontWeight`},{prefix:b,category:`dropShadow`},{prefix:y,category:`insetShadow`},{prefix:x,category:`textShadow`},{prefix:v,category:`shadow`},{prefix:S,category:`blur`},{prefix:/^(?:space|spacing|gap)(?:\.|$)/i,category:`space`},{prefix:/^inset(?:\.|$)/i,category:`space`},{prefix:/^(?:size|sizing)(?:\.|$)/i,category:`size`},{prefix:/^(?:radius|rounded|radii)(?:\.|$)/i,category:`radius`},{prefix:/^(?:z-?index|zindex|elevation)(?:\.|$)/i,category:`zIndex`}];function T(e){return`$value`in e||`value`in e||`$ref`in e||`ref`in e}function E(e){return e===!0||e===`true`||e===1}function D(e){return E(e.palette)||E(e.$palette)?!0:k(e)===`palette`}function ee(e,t){return(e===`palette`||e===`$palette`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function O(e){return e===!0||e===`true`||e===1}function te(e){return O(e.primitive)||O(e.$primitive)?!0:k(e)===`primitive`}function ne(e,t){return(e===`primitive`||e===`$primitive`)&&(typeof t==`boolean`||typeof t==`number`||typeof t==`string`)}function re(e,t){return(e===`theme`||e===`$theme`)&&typeof t==`string`}function ie(e){if(typeof e.theme==`string`&&e.theme.length>0)return e.theme;if(typeof e.$theme==`string`&&e.$theme.length>0)return e.$theme}function ae(e){if(typeof e.$description==`string`)return e.$description;if(typeof e.description==`string`)return e.description}function k(e,t){return typeof e.$type==`string`?e.$type:typeof e.type==`string`?e.type:t}function oe(e){if(`$value`in e)return e.$value;if(`value`in e)return e.value;if(typeof e.$ref==`string`)return e.$ref;if(typeof e.ref==`string`)return e.ref}function se(e,t){for(let{prefix:t,category:n}of w)if(t.test(e))return n;if(t===`color`||t===`palette`)return`color`;if(t===`shadow`)return y.test(e)?`insetShadow`:b.test(e)?`dropShadow`:x.test(e)?`textShadow`:`shadow`;if(t===`dimension`){if(g.test(e))return`fontSize`;if(S.test(e))return`blur`;if(/(?:^|\.)(?:space|spacing|gap)(?:\.|$)/i.test(e)||/(?:^|\.)inset(?:\.|$)/i.test(e))return`space`;if(/radius|rounded/i.test(e))return`radius`;if(/z-?index|elevation/i.test(e))return`zIndex`;if(/(?:^|\.)(?:size|sizing)(?:\.|$)/i.test(e)||/(?:^|\.)(?:width|height)(?:\.|$)/i.test(e))return`size`}if(t===`number`&&/z-?index|elevation/i.test(e))return`zIndex`;if(t===`fontWeight`||_.test(e))return`fontWeight`}function A(e){return e.flatMap(e=>e.split(/[-_\s]+/)).filter(Boolean).map((e,t)=>{if(/^\d/.test(e))return e;let n=e.toLowerCase();return t===0?n:`${n.charAt(0).toUpperCase()}${n.slice(1)}`}).join(``)}function ce(e){let t=e.split(`.`).filter(Boolean),n=t[0];n&&/^(?:color|colours?|palette|primitive|space|spacing|gap|inset|shadow|inset-shadow|drop-shadow|text-shadow|font-size|fontSize|font-weight|fontWeight|size|sizing|radius|rounded|radii|z-?index|zindex|elevation|blur)$/i.test(n)&&t.shift();let r=t.length>0?t:e.split(`.`).slice(-1);return r.length===1&&/^(?:DEFAULT|default)$/i.test(r[0]??``)?`true`:A(r)}function le(e,t,r,a,o,s,c){if(!i(e))return;let l=o||te(e)||D(e),u=k(e,r),d=ie(e)??s;if(T(e)){let r=oe(e),i=t.join(`.`),o=se(i,u)??(l||u===`primitive`||u===`palette`?`color`:void 0),s=n(r,u),f=o&&C.has(o)||u===`color`||u===`palette`||u===`primitive`||u===`shadow`?s:h(r,u);c.push({path:i,type:u===`palette`||u===`primitive`?`color`:u,value:r,cssValue:s,tamaguiValue:f,category:o,tokenKey:o?ce(i):void 0,description:ae(e),theme:a,...d?{childTheme:d}:{},...l?{primitive:!0}:{}});return}for(let[n,r]of Object.entries(e))n.startsWith(`$`)&&n!==`$palette`&&n!==`$primitive`||ee(n,r)||ne(n,r)||re(n,r)||le(r,[...t,n],u,a,l,d,c)}function ue(e,t={}){let n=t.includeTypes?new Set(t.includeTypes):void 0,r=[];for(let t of a(e)){let e=t.id==="default"?void 0:t.id;le(t.tokens,[],void 0,e,!1,void 0,r)}return n?r.filter(e=>!e.type||n.has(e.type)):r}const de=/^\{([^{}]+)\}$/,fe=/^(?:typography|type|text)$/i,pe=/^(?:font|fonts|font-family|fontFamily)$/i,me=/^(?:font-size|fontSize)$/i,he=/^(?:font-weight|fontWeight)$/i,ge=/^(?:line-height|lineHeight|leading)$/i,_e=/^(?:letter-spacing|letterSpacing|tracking)$/i,ve=/^(?:[a-z]{2}(?:-[A-Z]{2})?|cn|zh|jp|ja|kr|ko|ar|he|th|hi|ru|french|mandarin|chinese|japanese|korean|arabic|hebrew)$/i,ye=[`fontFamily`,`font-family`,`family`],be=[`fontSize`,`font-size`,`size`],xe=[`fontWeight`,`font-weight`,`weight`],Se=[`lineHeight`,`line-height`,`leading`],Ce=[`letterSpacing`,`letter-spacing`,`tracking`],we={1:12,2:14,3:16,4:18,5:20,6:24,7:28,8:32,9:40,10:48};function j(e){if(typeof e==`string`)return de.exec(e.trim())?.[1]?.trim()}function M(e,t){let n=j(e);if(!n)return e;let r=t.get(n),i=new Set([n]);for(let e=0;e<8&&r;e++){let e=j(r.value);if(!e||i.has(e))return r.value;i.add(e),r=t.get(e)}return r?.value??e}function N(e,t){for(let n of t)if(e[n]!==void 0&&e[n]!==null)return e[n]}function P(e){return(e.split(`,`)[0]?.trim()??e).replaceAll(/^["']|["']$/g,``)}function Te(e){if(typeof e==`string`){let t=e.trim();return t.length===0||j(t)?void 0:t}if(Array.isArray(e)&&e.every(e=>typeof e==`string`)){let t=e.map(e=>e.trim()).filter(Boolean);return t.length>0?t.join(`, `):void 0}}function Ee(e){return Number.isInteger(e)?e:Math.round(e*1e3)/1e3}function F(e){if(e==null)return;let t=h(e);if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=/^(-?\d+(?:\.\d+)?)%$/.exec(t.trim());if(e)return Number.parseFloat(e[1])/100}}function De(e){if(typeof e==`number`&&Number.isFinite(e))return String(e);if(typeof e==`string`){let t=e.trim();if(t.length===0||j(t))return;let n=Number(t);return Number.isNaN(n)?t:String(n)}let t=h(e);if(typeof t==`number`&&Number.isFinite(t))return String(t);if(typeof t==`string`&&t.length>0)return t}function Oe(e,t){let n=F(e);if(n!=null)return Ee(t!=null&&n>0&&n<=4?n*t:n)}function I(e,t){return t.test(e.split(`.`)[0]??``)}function ke(e){return e.split(`.`).filter(Boolean).at(-1)??e}function L(e,t){let n=e.split(`.`).filter(Boolean);return n[0]&&t.test(n[0])&&n.shift(),n}function R(e){let t=e.flatMap(e=>e.split(`-`)).filter(Boolean);return t.length===0?`body`:t.map((e,t)=>t===0?`${e.charAt(0).toLowerCase()}${e.slice(1)}`:`${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(``)}function z(e){switch(e.toLowerCase()){case`sans`:case`body`:case`serif`:return`body`;case`monospace`:case`mono`:return`mono`;default:return R([e])}}function Ae(e){return e.role?z(e.role):z(e.name)}function je(e){let t=L(e,fe);if(t.length===0)return`body`;let n=t.at(-1);return n&&t.length>=2&&ve.test(n)&&!n.includes(`_`)?`${t.slice(0,-1).join(`-`)}_${n}`:t.join(`-`)}function Me(e){return z(L(e,pe)[0]??ke(e))}function Ne(e,t){let n=L(e,t);return n.length===0||n.length===1&&/^(?:DEFAULT|default)$/i.test(n[0])?`true`:R(n)}function Pe(e){return e.type===`typography`&&i(e.value)}function Fe(e){return e.category===`fontSize`||e.category===`fontWeight`||Ie(e)||Le(e)||Re(e)||ze(e)?!1:e.type===`fontFamily`||I(e.path,pe)}function Ie(e){return e.category===`fontSize`||I(e.path,me)}function Le(e){return e.category===`fontWeight`||e.type===`fontWeight`||I(e.path,he)}function Re(e){return I(e.path,ge)}function ze(e){return I(e.path,_e)}function Be(e,t){if(!e.has(t))return t;let n=2,r=`${t}${n}`;for(;e.has(r);)n++,r=`${t}${n}`;return r}function Ve(e){let t=new Map;for(let n of Object.values(e)){let e=Ae(n);t.has(e)&&(e=Be(t,R([n.name]))),t.set(e,n)}return t}function He(e,t,n){if(!e)return;let r=Object.values(e);if(r.length===0)return;if(n){let e=n.split(`.`).filter(Boolean).at(-1);if(e){let t=r.find(t=>t.role===e||t.name.toLowerCase()===e.toLowerCase());if(t)return t}}if(!t)return;let i=P(t).toLowerCase();return r.find(e=>f(e).toLowerCase()===i||e.title.toLowerCase()===i||e.name.toLowerCase()===i)}function Ue(e){let t=new Map;for(let n of e.files){let e=String(n.weight??400),r=c(n.path).replace(/\.[^.]+$/,``),i=t.get(e)??{};n.style===`italic`||n.style===`oblique`?i.italic=r:i.normal=r,t.set(e,i)}if(t.size!==0)return`{\n${[...t.entries()].toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0})).map(([e,t])=>{let n=[];return t.normal&&n.push(`normal: ${m(t.normal)}`),t.italic&&n.push(`italic: ${m(t.italic)}`),` ${e}: { ${n.join(`, `)} }`}).join(`,
3
+ `)}\n }`}function B(e,t){return{...e,webFamily:d(t),nativeFamily:f(t),face:t.source===`local`?Ue(t):e.face}}function V(e){return{key:e,webFamily:`system-ui, sans-serif`,nativeFamily:`system-ui`,size:{},lineHeight:{},weight:{},letterSpacing:{}}}function We(e,t){return{...e,webFamily:t,nativeFamily:P(t)}}const Ge=/^(?:font-size|fontSize|font-weight|fontWeight|line-height|lineHeight|leading|letter-spacing|letterSpacing|tracking)$/i;function H(e,t){let n={true:e},r=j(t);if(!r)return n;let i=Ne(r,Ge);return i&&i!==`true`&&(n[i]=e),n}function Ke(e){return Object.keys(e.size).length>0?e:{...e,size:{...we}}}function qe(e,t,n,r){if(!i(t.value))return e;let a=N(t.value,ye),o=j(a),s=Te(M(a,n)),c=He(r,s,o),l=e;c?l=B(l,c):s&&(l=We(l,s));let u=N(t.value,be),d=F(M(u,n));d!=null&&(l={...l,size:H(d,u)});let f=N(t.value,xe),p=De(M(f,n));p&&(l={...l,weight:H(p,f)});let m=N(t.value,Ce),h=F(M(m,n));h!=null&&(l={...l,letterSpacing:H(h,m)});let g=N(t.value,Se),_=Oe(M(g,n),l.size.true??d);return _!=null&&(l={...l,lineHeight:H(_,g)}),Je(l)}function Je(e){let t=Object.keys(e.size);if(t.length===0)return e;let n=e=>{let n=e.true??Object.values(e)[0];if(n==null)return e;let r={...e};for(let e of t)r[e]??=n;return r};return{...e,lineHeight:Object.keys(e.lineHeight).length>0?n(e.lineHeight):e.lineHeight,weight:Object.keys(e.weight).length>0?n(e.weight):e.weight,letterSpacing:Object.keys(e.letterSpacing).length>0?n(e.letterSpacing):e.letterSpacing}}function Ye(e,t){let n=new Map(e.map(e=>[e.path,e])),r=new Map,i=e=>{r.set(e.key,e)};if(t)for(let[e,n]of Ve(t))i(B(V(e),n));for(let a of e){if(!Fe(a)||Pe(a))continue;let e=Me(a.path),o=Te(M(a.value,n)),s=r.get(e)??V(e),c=He(t,o,a.path),l=s;c?l=B(l,c):(o&&s.webFamily===V(e).webFamily||o&&!r.has(e))&&(l=We(l,o)),i(l)}for(let a of e){if(!Pe(a))continue;let e=je(a.path);i(qe(r.get(e)??V(e),a,n,t))}return[...r.values()].map(Ke).toSorted((e,t)=>e.key.localeCompare(t.key))}function Xe(e){return/^\d+$/.test(e)||/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}function U(e,t=4){let n=` `.repeat(t),r=` `.repeat(Math.max(t-2,0)),i=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return i.length===0?`{}`:`{\n${i.map(([e,t])=>`${n}${Xe(e)}: ${m(t)}`).join(`,
4
4
  `)}\n${r}}`}function Ze(e,t){let n=`${e.split(`-`).filter(Boolean).map((e,t)=>t===0?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(``).replaceAll(/[^\w$]/g,``)||`font${t}`}Font`;return/^[A-Z_$]/i.test(n)?n:`font${t}`}function Qe(e,t){let n=m(e.webFamily),r=m(e.nativeFamily),i=[n===r?` family: ${n}`:` family: isWeb ? ${n} : ${r}`,` size: ${U(e.size)}`];return Object.keys(e.lineHeight).length>0&&i.push(` lineHeight: ${U(e.lineHeight)}`),Object.keys(e.weight).length>0&&i.push(` weight: ${U(e.weight)}`),Object.keys(e.letterSpacing).length>0&&i.push(` letterSpacing: ${U(e.letterSpacing)}`),e.face&&i.push(` face: ${e.face}`),`const ${t} = createFont({\n${i.join(`,
5
5
  `)}\n});`}function $e(e){return`# Installing Tamagui Config
6
6
 
@@ -8,7 +8,7 @@ Generated by \`@razorwind/tamagui\`.
8
8
 
9
9
  ## Files
10
10
 
11
- - \`${e.outputPath}\` — Tamagui config (\`createTamagui\` + \`createTheme\` with light, dark, and nested semantic themes)
11
+ - \`${e.outputPath}\` — Tamagui config (\`createTamagui\` + \`createThemes\` with light, dark, and nested semantic themes)
12
12
 
13
13
  ## Setup
14
14
 
@@ -48,10 +48,38 @@ export function App() {
48
48
  ## Regenerate
49
49
 
50
50
  Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligned with your design system.
51
- `}const et=new Set([`default`,`light`,`theme`]),tt=/^base(?:[A-Z]\w*|[._-].+)?$/i,nt=/^ring(?:\.|$)/i,rt={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function it(e){return et.has(e)}function at(e){return e===`dark`}function W(e,t){let n=new Map,r=t===`dark`?at:it;for(let t of e){let e=t.theme?.toLowerCase();(!e||tt.test(e))&&n.set(t.path,t)}for(let t of e){let e=t.theme?.toLowerCase();e&&r(e)&&n.set(t.path,t)}return[...n.values()]}function ot(e){return nt.test(e.path)&&e.category===`shadow`}const st=new Set([`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`]);function ct(e){return!e.primitive&&!!e.tokenKey&&(e.type===`shadow`||e.category!=null&&st.has(e.category))}const lt=new Set([`fontSize`,`blur`]),ut=[`space`,`size`,`radius`,`zIndex`,`blur`,`fontSize`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`,`fontWeight`];function dt(e){return/^px\(-?\d/.test(e)}function ft(e){if(e.category===`radius`&&e.tokenKey?.startsWith(`borderRadius`)){let t=e.tokenKey.replace(/^borderRadius/,``);return t?k([t]):e.tokenKey}return e.tokenKey??``}function pt(e,t){let n=Q(e,t.byPath,t.byCssVar).tamaguiValue;if(e.category&&lt.has(e.category)&&typeof n==`number`)return`px(${n})`;if(typeof n==`string`){let r=Et(n,t);return e.category===`dropShadow`?mt(r):r}return n}function mt(e){return e.includes(`drop-shadow(`)?e:e.split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.replace(/^inset\s+/i,``).split(/\s+/);if(t.length>=5){let[e,n,r]=t;return`drop-shadow(${e} ${n} ${r} ${t.slice(4).join(` `)})`}return`drop-shadow(${e.replace(/^inset\s+/i,``)})`}).join(` `)}function ht(e){let t={},n=Y(e);for(let r of e){if(!r.category||r.category===`color`||!r.tokenKey||ot(r))continue;let e=ft(r);if(!e)continue;let i=pt(r,n);if(typeof i==`string`&&Tt(i))continue;let a=t[r.category]??{};a[e]=i,t[r.category]=a}return t}function G(e){let t=e.path.replace(/^color\./i,``).replaceAll(`.`,``);return e.theme?`${e.theme}${t[0]?.toUpperCase()??``}${t.slice(1)}`:t}function K(e){return`tokens.color.${e}.val`}function gt(e,t){let n={},r=(e,t)=>{let r=t.cssValue;typeof r!=`string`||r.length===0||wt(r)||r===`[object Object]`||(n[e]=r)};for(let t of e)t.tokenKey&&(t.primitive?r(G(t),t):r(t.tokenKey,t));for(let e of t)!e.tokenKey||!e.primitive||r(G(e),e);return n}function q(e,t,n,r){let i=n[r];if(typeof i!=`string`)return!1;let a=Z(e,t);return a!=null&&a===i}function _t(e,t,n){if(e.tokenKey&&q(e,t,n,e.tokenKey))return K(e.tokenKey);let r=Q(e,t.byPath,t.byCssVar);if(r.tokenKey&&q(e,t,n,r.tokenKey))return K(r.tokenKey);if(r.primitive){let i=G(r);if(q(e,t,n,i))return K(i)}let i=Z(e,t);if(i)return m(i)}function J(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=typeof t==`string`&&dt(t)?t:m(t);return`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${r}`}).join(`,
52
- `)}\n${` `.repeat(Math.max(t-2,0))}}`}function vt(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${t}`).join(`,
53
- `)}\n${` `.repeat(Math.max(t-2,0))}}`}const yt=/^\{([^{}]+)\}$/,bt=/\{([^{}]+)\}/g,xt=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/,St=/var\((--[^),\s]+)(?:\s*,[^)]*)?\)/g;function Y(e){return{byPath:new Map(e.map(e=>[e.path,e])),byCssVar:new Map(e.map(e=>[s(e.path),e]))}}function Ct(e){if(typeof e==`string`)return yt.exec(e.trim())?.[1]?.trim()}function X(e){if(typeof e==`string`)return xt.exec(e.trim())?.[1]}function wt(e){return Ct(e)!=null||X(e)!=null}function Tt(e){return/var\(|\{[^{}]+\}/.test(e)}function Z(e,t){let n=Q(e,t.byPath,t.byCssVar);if(n.category!=null&&n.category!==`color`)return;let r=[n.cssValue,n.tamaguiValue];for(let e of r)if(typeof e==`string`&&e.length>0&&!wt(e))return e}function Et(e,t){return e.replace(bt,(e,n)=>{let r=t.byPath.get(n.trim());return r?Z(r,t)??e:e}).replace(St,(e,n)=>{let r=t.byCssVar.get(n);return r?Z(r,t)??e:e})}function Q(e,t,n){let r=e,i=new Set;for(let e=0;e<8;e++){if(i.has(r.path))return r;i.add(r.path);let e=Ct(r.value);if(e){let n=t.get(e);if(!n||n.path===r.path)return r;r=n;continue}let a=X(r.value)??X(r.cssValue)??X(r.tamaguiValue);if(a){let e=n.get(a);if(!e||e.path===r.path)return r;r=e;continue}return r}return r}function Dt(e,t){let n=t.toLowerCase(),r=e.split(/(?=[A-Z])/).filter(Boolean).filter(e=>e.toLowerCase()!==n);if(r.length!==0)return k(r)}function Ot(e){return e.category===`color`&&!e.primitive&&!!e.tokenKey}function kt(e){return ct(e)&&k(e.path.split(`.`).filter(Boolean))||e.tokenKey}function At(e){let t=e.toLowerCase();return it(t)||at(t)}function jt(e,t,n){let r=kt(t);if(!r)return;let i=t.childTheme?.trim();if(!i||At(i)){e.base[r]=n;return}let a=k([i]),o=Dt(r,a);if(!o)return;let s=e.children[a]??{};s[o]=n,e.children[a]=s}function Mt(e,t){let n=typeof e.tamaguiValue==`string`?e.tamaguiValue:e.cssValue;if(typeof n!=`string`||n.length===0)return;let r=Et(n,t);return r.length===0||Tt(r)?void 0:m(e.category===`dropShadow`?mt(r):r)}function Nt(e,t){let n=Y(e),r={base:{},children:{}};for(let i of e){if(Ot(i)){let e=_t(i,n,t);e&&jt(r,i,e);continue}if(!ct(i))continue;let e=Mt(i,n);if(!e)continue;let a=i.childTheme?.trim();(a&&!At(a)||ot(i))&&jt(r,i,e)}return r}function Pt(e){let t=new Set;for(let n of e){for(let e of Object.keys(n.base))t.add(e);for(let e of Object.values(n.children))for(let n of Object.keys(e))t.add(n)}return[...t].toSorted((e,t)=>e.localeCompare(t,void 0,{numeric:!0}))}function Ft(e){return` ${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: string;`}function It(e,t){if(e.length!==0)return[`/**`,` * Theme values available on \`useTheme()\` and \`$\` style props for the ${t.specName||`design system`}.`,` *`," * Derived from semantic color tokens mapped by `createTheme`. Nested"," * themes (`light_primary`, `dark_danger`, …) come from each token's"," * `theme` / `$theme` property.",` *`,` * @see https://tamagui.dev/docs/intro/themes`,` */`,`export interface AppTheme {`,...e.map(Ft),`}`,``]}function Lt(e,t){return`${e}_${t}`}function Rt(e){return Object.keys(e).length>0}function zt(e,t){return`const ${e} = createTheme(${vt(t,2)});`}function Bt(e,t,n){let r=[],i=[],a=(e,t,n=!1)=>{if(!n&&!Rt(t))return;r.push(zt(e,t));let a=/^[A-Z_$][\w$]*$/i.test(e)?e:m(e);i.push(a===e?` ${e}`:` ${a}: ${e}`)},o=[...new Set([...Object.keys(e.children),...Object.keys(t.children)])].toSorted((e,t)=>e.localeCompare(t));a(`light`,e.base,o.length>0),n&&a(`dark`,t.base,o.length>0);for(let r of o){let i=e.children[r]??t.children[r]??{};if(a(Lt(`light`,r),i),n){let n=t.children[r]??e.children[r]??{};a(Lt(`dark`,r),n)}}return i.length===0?{statements:[],hasThemes:!1}:(r.push(``,`const themes = {\n${i.join(`,
54
- `)}\n};`),{statements:r,hasThemes:!0})}function Vt(e,t,n={}){let r=e.fonts??{},i=n.useDefaultConfig===!0,a=n.animations??`css`,o=n.includeTypeAugmentation!==!1,s=t.filter(e=>e.category===`color`),c=W(s,`light`),l=W(s,`dark`),u=l.length>0,d=gt(c,l),f=W(t,`light`),p=u?W(t,`dark`):f,h=Nt(f,d),g=Nt(p,d),{statements:_,hasThemes:v}=Bt(h,g,u),y=It(Pt(u?[h,g]:[h]),{specName:e.name}),b=ht(f),x=[];Object.keys(d).length>0&&x.push(` color: ${J(d,4)}`);for(let e of ut){let t=b[e];t&&Object.keys(t).length>0&&x.push(` ${e}: ${J(t,4)}`)}let S=[`import { isWeb } from '@tamagui/constants';`];i&&S.push(`import { defaultConfig } from "@tamagui/config/v5";`),a!==!1&&S.push(`import { animations } from "${rt[a]}";`),n.importConfig&&S.push(`import userConfig from "${n.importConfig}";`);let C=[`createTamagui`,`px`];x.length>0&&C.push(`createTokens`),v&&C.push(`createTheme`);let w=Ye(t,r);w.length>0&&C.push(`createFont`),S.push(`import { ${C.join(`, `)} } from "@tamagui/core";`);let T=[`/* eslint-disable */`,``,`/*`,` * Generated by @razorwind/tamagui — Do not edit by hand.`,` * `,` * @see https://tamagui.dev/docs/core/configuration`,` * @see https://tamagui.dev/docs/intro/themes`,` */`,``,...S,``];x.length>0&&T.push(`const tokens = createTokens({`,x.join(`,
51
+ `}const et=new Set([`default`,`light`,`theme`]),tt=/^base(?:[A-Z]\w*|[._-].+)?$/i,nt=/^ring(?:\.|$)/i,rt={css:`@tamagui/config/v5-css`,rn:`@tamagui/config/v5-rn`,reanimated:`@tamagui/config/v5-reanimated`,motion:`@tamagui/config/v5-motion`};function it(e){return et.has(e)}function at(e){return e===`dark`}function W(e,t){let n=new Map,r=t===`dark`?at:it;for(let t of e){let e=t.theme?.toLowerCase();(!e||tt.test(e))&&n.set(t.path,t)}for(let t of e){let e=t.theme?.toLowerCase();e&&r(e)&&n.set(t.path,t)}return[...n.values()]}function ot(e){return nt.test(e.path)&&e.category===`shadow`}const st=new Set([`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`]);function ct(e){return!e.primitive&&!!e.tokenKey&&(e.type===`shadow`||e.category!=null&&st.has(e.category))}const lt=new Set([`fontSize`,`blur`]),ut=[`space`,`size`,`radius`,`zIndex`,`blur`,`fontSize`,`shadow`,`insetShadow`,`dropShadow`,`textShadow`,`boxShadow`,`fontWeight`];function dt(e){return/^px\(-?\d/.test(e)}function ft(e){if(e.category===`radius`&&e.tokenKey?.startsWith(`borderRadius`)){let t=e.tokenKey.replace(/^borderRadius/,``);return t?A([t]):e.tokenKey}return e.tokenKey??``}function pt(e,t){let n=$(e,t.byPath,t.byCssVar).tamaguiValue;if(e.category&&lt.has(e.category)&&typeof n==`number`)return`px(${n})`;if(typeof n==`string`){let r=Pt(n,t);return e.category===`dropShadow`?mt(r):r}return n}function mt(e){return e.includes(`drop-shadow(`)?e:e.split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.replace(/^inset\s+/i,``).split(/\s+/);if(t.length>=5){let[e,n,r]=t;return`drop-shadow(${e} ${n} ${r} ${t.slice(4).join(` `)})`}return`drop-shadow(${e.replace(/^inset\s+/i,``)})`}).join(` `)}function ht(e){let t={},n=At(e);for(let r of e){if(!r.category||r.category===`color`||!r.tokenKey||ot(r))continue;let e=ft(r);if(!e)continue;let i=pt(r,n);if(typeof i==`string`&&Nt(i))continue;let a=t[r.category]??{};a[e]=i,t[r.category]=a}return t}function G(e){let t=e.path.replace(/^color\./i,``).replaceAll(`.`,``);return e.theme?`${e.theme}${t[0]?.toUpperCase()??``}${t.slice(1)}`:t}function K(e){return`tokens.color.${e}.val`}const gt=[`base`,`gray`,`grey`,`neutral`],_t=[`accent`,`brand`],vt=[`"#ffffff"`,`"#000000"`],yt=[`"#000000"`,`"#ffffff"`];function bt(e){if(e.category!==`color`||!e.primitive)return;let t=e.path.replace(/^color\./i,``).split(`.`).filter(Boolean),n=t.at(-1);if(!n||t.length<2)return;let r=Number(n);if(Number.isFinite(r))return{name:t.slice(0,-1).join(`.`).toLowerCase(),step:r}}function xt(e,t){let n=G(e);if(n in t)return K(n);let r=typeof e.cssValue==`string`&&e.cssValue.length>0?e.cssValue:typeof e.tamaguiValue==`string`?e.tamaguiValue:void 0;return r?m(r):`"#000000"`}function St(e,t,n){let r=new Map;for(let t of e){let e=bt(t);if(!e)continue;let i=r.get(e.name)??[];i.push({step:e.step,expression:xt(t,n)}),r.set(e.name,i)}for(let e of t){let t=r.get(e);if(!t||t.length===0)continue;let n=new Map;for(let e of t.toSorted((e,t)=>e.step-t.step))n.set(e.step,e.expression);return[...n.values()]}}function q(e,t){return e.length>=2?e:e.length===1?[e[0],t[1]??`"#000000"`]:[...t]}function Ct(e,t,n,r,i,a){let o=St(e,n,r),s=St(t,n,r);if(o&&s)return{light:q(o,i),dark:q(s,a)};if(o){let e=q(o,i);return{light:e,dark:[...e].toReversed()}}if(s){let e=q(s,a);return{light:[...e].toReversed(),dark:e}}return{light:[...i],dark:[...a]}}function wt(e,t){let n={},r=(e,t)=>{let r=t.cssValue;typeof r!=`string`||r.length===0||Mt(r)||r===`[object Object]`||(n[e]=r)};for(let t of e)t.tokenKey&&(t.primitive?r(G(t),t):r(t.tokenKey,t));for(let e of t)!e.tokenKey||!e.primitive||r(G(e),e);return n}function J(e,t,n,r){let i=n[r];if(typeof i!=`string`)return!1;let a=Q(e,t);return a!=null&&a===i}function Tt(e,t,n){if(e.tokenKey&&J(e,t,n,e.tokenKey))return K(e.tokenKey);let r=$(e,t.byPath,t.byCssVar);if(r.tokenKey&&J(e,t,n,r.tokenKey))return K(r.tokenKey);if(r.primitive){let i=G(r);if(J(e,t,n,i))return K(i)}let i=Q(e,t);if(i)return m(i)}function Y(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>{let r=typeof t==`string`&&dt(t)?t:m(t);return`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${r}`}).join(`,
52
+ `)}\n${` `.repeat(Math.max(t-2,0))}}`}function X(e,t=2){let n=` `.repeat(t),r=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t,void 0,{numeric:!0}));return r.length===0?`{}`:`{\n${r.map(([e,t])=>`${n}${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: ${t}`).join(`,
53
+ `)}\n${` `.repeat(Math.max(t-2,0))}}`}const Et=/^\{([^{}]+)\}$/,Dt=/\{([^{}]+)\}/g,Ot=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/,kt=/var\((--[^),\s]+)(?:\s*,[^)]*)?\)/g;function At(e){return{byPath:new Map(e.map(e=>[e.path,e])),byCssVar:new Map(e.map(e=>[s(e.path),e]))}}function jt(e){if(typeof e==`string`)return Et.exec(e.trim())?.[1]?.trim()}function Z(e){if(typeof e==`string`)return Ot.exec(e.trim())?.[1]}function Mt(e){return jt(e)!=null||Z(e)!=null}function Nt(e){return/var\(|\{[^{}]+\}/.test(e)}function Q(e,t){let n=$(e,t.byPath,t.byCssVar);if(n.category!=null&&n.category!==`color`)return;let r=[n.cssValue,n.tamaguiValue];for(let e of r)if(typeof e==`string`&&e.length>0&&!Mt(e))return e}function Pt(e,t){return e.replace(Dt,(e,n)=>{let r=t.byPath.get(n.trim());return r?Q(r,t)??e:e}).replace(kt,(e,n)=>{let r=t.byCssVar.get(n);return r?Q(r,t)??e:e})}function $(e,t,n){let r=e,i=new Set;for(let e=0;e<8;e++){if(i.has(r.path))return r;i.add(r.path);let e=jt(r.value);if(e){let n=t.get(e);if(!n||n.path===r.path)return r;r=n;continue}let a=Z(r.value)??Z(r.cssValue)??Z(r.tamaguiValue);if(a){let e=n.get(a);if(!e||e.path===r.path)return r;r=e;continue}return r}return r}function Ft(e,t){let n=t.toLowerCase(),r=e.split(/(?=[A-Z])/).filter(Boolean).filter(e=>e.toLowerCase()!==n);if(r.length!==0)return A(r)}function It(e){return e.category===`color`&&!e.primitive&&!!e.tokenKey}function Lt(e){return ct(e)&&A(e.path.split(`.`).filter(Boolean))||e.tokenKey}function Rt(e){let t=e.toLowerCase();return it(t)||at(t)}function zt(e,t,n){let r=Lt(t);if(!r)return;let i=t.childTheme?.trim();if(!i||Rt(i)){e.base[r]=n;return}let a=A([i]),o=Ft(r,a);if(!o)return;let s=e.children[a]??{};s[o]=n,e.children[a]=s}function Bt(e,t){let n=typeof e.tamaguiValue==`string`?e.tamaguiValue:e.cssValue;if(typeof n!=`string`||n.length===0)return;let r=Pt(n,t);return r.length===0||Nt(r)?void 0:m(e.category===`dropShadow`?mt(r):r)}function Vt(e,t){let n=At(e),r={base:{},children:{}};for(let i of e){if(It(i)){let e=Tt(i,n,t);e&&zt(r,i,e);continue}if(!ct(i))continue;let e=Bt(i,n);if(!e)continue;let a=i.childTheme?.trim();(a&&!Rt(a)||ot(i))&&zt(r,i,e)}return r}function Ht(e){let t=new Set;for(let n of e){for(let e of Object.keys(n.base))t.add(e);for(let e of Object.values(n.children))for(let n of Object.keys(e))t.add(n)}return[...t].toSorted((e,t)=>e.localeCompare(t,void 0,{numeric:!0}))}function Ut(e){return` ${/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}: string;`}function Wt(e,t){if(e.length!==0)return[`/**`,` * Theme values available on \`useTheme()\` and \`$\` style props for the ${t.specName||`design system`}.`,` *`," * Derived from semantic color tokens mapped by `createThemes`. Nested"," * themes (`light_primary`, `dark_danger`, …) come from each token's"," * `theme` / `$theme` property.",` *`,` * @see https://tamagui.dev/docs/intro/themes`,` */`,`export interface AppTheme {`,...e.map(Ut),`}`,``]}function Gt(e){return Object.keys(e).length>0}function Kt(e){return/^[A-Z_$][\w$]*$/i.test(e)?e:m(e)}function qt(e,t){let n=` `.repeat(t),r=` `.repeat(Math.max(t-2,0));return`[\n${e.map(e=>`${n}${e}`).join(`,
54
+ `)}\n${r}]`}function Jt(e,t,n){let r=` `.repeat(n),i=` `.repeat(Math.max(n-2,0)),a=n+2;return`{
55
+ ${r}light: ${qt(e,a)},
56
+ ${r}dark: ${qt(t,a)}
57
+ ${i}}`}function Yt(e,t,n){let r=` `.repeat(n),i=` `.repeat(Math.max(n-2,0)),a=n+2;return`{
58
+ ${r}light: ${X(e,a)},
59
+ ${r}dark: ${X(t,a)}
60
+ ${i}}`}function Xt(e,t){let n=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));if(n.length===0)return`{}`;let r=` `.repeat(t),i=` `.repeat(Math.max(t-2,0)),a=t+2;return`{\n${n.map(([e,t])=>`${r}${Kt(e)}: ${X(t,a)}`).join(`,
61
+ `)}\n${i}}`}function Zt(e,t){let n=` `.repeat(t),r=` `.repeat(Math.max(t-2,0));return`{\n${e.map(e=>`${n}${Kt(e)}: {}`).join(`,
62
+ `)}\n${r}}`}function Qt(e,t){return`const childThemeExtras: {
63
+ light: Record<string, Record<string, string>>;
64
+ dark: Record<string, Record<string, string>>;
65
+ } = {
66
+ light: ${Xt(e,4)},
67
+ dark: ${Xt(t,4)}
68
+ };`}function $t(e,t,n){return Object.fromEntries(n.map(n=>[n,e.children[n]??t.children[n]??{}]))}function en(e,t,n,r,i){let a=[...new Set([...Object.keys(e.children),...Object.keys(t.children)])].toSorted((e,t)=>e.localeCompare(t)),o=a.includes(`accent`),s=a.filter(e=>e!==`accent`),c=Gt(e.base)||Gt(t.base);if(!c&&a.length===0)return{statements:[],hasThemes:!1};let l=Ct(r,i,gt,n,vt,yt),u=Ct(r,i,_t,n,l.light,l.dark),d=[],f=[` componentThemes: false`],p=[` palette: ${Jt(l.light,l.dark,6)}`];if(c&&p.push(` extra: ${Yt(e.base,t.base,6)}`),f.push(` base: {\n${p.join(`,
69
+ `)}\n }`),o){let n=e.children.accent??t.children.accent??{},r=t.children.accent??e.children.accent??{};f.push(` accent: {
70
+ palette: ${Jt(u.light,u.dark,6)},
71
+ extra: ${Yt(n,r,6)}
72
+ }`)}if(s.length>0){let n=$t(e,t,s),r=$t(t,e,s);d.push(Qt(n,r),``),f.push(` childrenThemes: ${Zt(s,4)}`);let i=o?` || child === "accent"`:``;f.push(` getTheme: ({ name, theme, scheme }) => {
73
+ const child = name.replace(/^(?:light|dark)_/, "");
74
+ if (child === name${i}) {
75
+ return theme;
76
+ }
77
+
78
+ const extras = childThemeExtras[scheme ?? "light"][child];
79
+
80
+ return extras ? { ...theme, ...extras } : theme;
81
+ }`)}return d.push(`const themes = createThemes({\n${f.join(`,
82
+ `)}\n});`),{statements:d,hasThemes:!0}}function tn(e,t,n={}){let r=e.fonts??{},i=n.useDefaultConfig===!0,a=n.animations??`css`,o=n.includeTypeAugmentation!==!1,s=t.filter(e=>e.category===`color`),c=W(s,`light`),l=W(s,`dark`),u=l.length>0,d=wt(c,l),f=W(t,`light`),p=u?W(t,`dark`):f,h=Vt(f,d),g=Vt(p,d),{statements:_,hasThemes:v}=en(h,g,d,c,l),y=Wt(Ht(u?[h,g]:[h]),{specName:e.name}),b=ht(f),x=[];Object.keys(d).length>0&&x.push(` color: ${Y(d,4)}`);for(let e of ut){let t=b[e];t&&Object.keys(t).length>0&&x.push(` ${e}: ${Y(t,4)}`)}let S=[`import { isWeb } from '@tamagui/constants';`];i&&S.push(`import { defaultConfig } from "@tamagui/config/v5";`),a!==!1&&S.push(`import { animations } from "${rt[a]}";`),n.importConfig&&S.push(`import userConfig from "${n.importConfig}";`),v&&S.push(`import { createThemes } from "@tamagui/theme-builder";`);let C=[`createTamagui`,`px`];x.length>0&&C.push(`createTokens`);let w=Ye(t,r);w.length>0&&C.push(`createFont`),S.push(`import { ${C.join(`, `)} } from "@tamagui/core";`);let T=[`/* eslint-disable */`,``,`/*`,` * Generated by @razorwind/tamagui — Do not edit by hand.`,` * `,` * @see https://tamagui.dev/docs/core/configuration`,` * @see https://tamagui.dev/docs/intro/themes`,` * @see https://tamagui.dev/docs/guides/theme-builder`,` */`,``,...S,``];x.length>0&&T.push(`const tokens = createTokens({`,x.join(`,
55
83
  `),`});`,``),_.length>0&&T.push(..._,``);let E=new Map;if(w.length>0)for(let[e,t]of w.entries()){let n=Ze(t.key,e);E.set(t.key,n),T.push(Qe(t,n),``)}let D=[];if(i&&D.push(` ...defaultConfig`),a!==!1&&D.push(` animations`),x.length>0&&(i?D.push(` tokens: {
56
84
  ...defaultConfig.tokens,
57
85
  ...tokens,
@@ -78,12 +106,12 @@ Re-run Razorwind generate when tokens change so \`${e.outputPath}\` stays aligne
78
106
  }`):D.push(` fonts: {
79
107
  ${e.join(`,
80
108
  `)}
81
- }`)}return n.shorthands&&D.push(` shorthands: ${J(n.shorthands,4)}`),n.media&&D.push(` media: ${m(n.media)}`),n.defaultFont&&D.push(` defaultFont: ${m(n.defaultFont)}`),T.push(``,...y??[],`/**
109
+ }`)}return n.shorthands&&D.push(` shorthands: ${Y(n.shorthands,4)}`),n.media&&D.push(` media: ${m(n.media)}`),n.defaultFont&&D.push(` defaultFont: ${m(n.defaultFont)}`),T.push(``,...y??[],`/**
82
110
  * The Tamagui config for the ${e.name||`design system`}.
83
111
  *
84
112
  * @see https://tamagui.dev/docs/core/configuration
85
113
  */
86
114
  export const config = createTamagui({`,D.join(`,
87
115
  `),n.importConfig?`, ...userConfig `:``,`});`,``,`export type AppConfig = typeof config;`,``),o&&T.push(`declare module "@tamagui/core" {`,` // eslint-disable-next-line @typescript-eslint/no-empty-object-type`,` interface TamaguiCustomConfig extends AppConfig {}`,`}`,``),T.push(`export default config;`,``),T.join(`
88
- `)}function $(e,n={}){let r=e.tokens&&Object.keys(e.tokens).length>0,i=e.fonts&&Object.keys(e.fonts).length>0;if(!r&&!i)return{};let a=r?de(e.tokens,n):[];if(a.length===0&&!i)return{};let o=n.outputPath??`tamagui.config.ts`,s=Vt(e,a,n),c=n.installGuide??$e({outputPath:o}),d=u(l(o),`INSTALL.md`);return{[o]:t(o,s,{name:`razorwind-tamagui`},!1,`typescript`),[d]:t(d,c,{name:`razorwind-tamagui`},!1,`markdown`)}}var Ht=e(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>$(t,e??{})}));export{Ye as collectTamaguiFonts,Ht as default,de as flattenTokens,Ze as fontVarName,n as formatTokenValue,$ as generateTamaguiConfig,D as isPaletteGroup,$e as renderInstallMd,Vt as renderTamaguiConfig,ce as resolveTokenCategory,a as resolveTokenSets,z as tamaguiFontKeyFromRole,k as toCamelCaseKey,o as toCssVar,h as toTamaguiValue,le as toTokenKey,je as typographyFontKey};
116
+ `)}function nn(e,n={}){let r=e.tokens&&Object.keys(e.tokens).length>0,i=e.fonts&&Object.keys(e.fonts).length>0;if(!r&&!i)return{};let a=r?ue(e.tokens,n):[];if(a.length===0&&!i)return{};let o=n.outputPath??`tamagui.config.ts`,s=tn(e,a,n),c=n.installGuide??$e({outputPath:o}),d=u(l(o),`INSTALL.md`);return{[o]:t(o,s,{name:`razorwind-tamagui`},!1,`typescript`),[d]:t(d,c,{name:`razorwind-tamagui`},!1,`markdown`)}}var rn=e(e=>({name:`tamagui`,themeGeneration:`combined`,generate:async t=>nn(t,e??{})}));export{Ye as collectTamaguiFonts,rn as default,ue as flattenTokens,Ze as fontVarName,n as formatTokenValue,nn as generateTamaguiConfig,D as isPaletteGroup,$e as renderInstallMd,tn as renderTamaguiConfig,se as resolveTokenCategory,a as resolveTokenSets,z as tamaguiFontKeyFromRole,A as toCamelCaseKey,o as toCssVar,h as toTamaguiValue,ce as toTokenKey,je as typographyFontKey};
89
117
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@razorwind/tamagui",
3
- "version": "0.0.55",
3
+ "version": "0.0.56",
4
4
  "type": "module",
5
5
  "description": "Razorwind plugin that creates Tamagui theme tokens from Razorwind design tokens.",
6
6
  "repository": {
@@ -85,18 +85,20 @@
85
85
  "dependencies": {
86
86
  "@power-plant/core": "^0.0.91",
87
87
  "@power-plant/dtcg-schema": "^0.0.1",
88
- "@razorwind/core": "^0.0.58",
88
+ "@razorwind/core": "^0.0.59",
89
89
  "@stryke/type-checks": "^0.6.44",
90
90
  "@stryke/helpers": "^0.10.51",
91
91
  "@stryke/string-format": "^0.17.53"
92
92
  },
93
93
  "peerDependencies": {
94
94
  "@tamagui/config": ">=1.120.0",
95
+ "@tamagui/theme-builder": ">=1.120.0",
95
96
  "react": ">=18",
96
97
  "tamagui": ">=1.120.0"
97
98
  },
98
99
  "peerDependenciesMeta": {
99
100
  "@tamagui/config": { "optional": true },
101
+ "@tamagui/theme-builder": { "optional": true },
100
102
  "react": { "optional": true },
101
103
  "tamagui": { "optional": true }
102
104
  },
@@ -106,5 +108,5 @@
106
108
  "typescript": "^6.0.3"
107
109
  },
108
110
  "publishConfig": { "access": "public" },
109
- "gitHead": "26304e8c6d927befb4b9ffdb28ae1cc7f88e45ca"
111
+ "gitHead": "43b57170fcf1f25a7e928100915a6fcb58330db5"
110
112
  }